Template language overhaul & misc. improvements
[bpt/mlt.git] / src / mlt.lex
index 568c1a3..c64ea0c 100644 (file)
@@ -66,6 +66,7 @@ val strStart = ref 0
 
 id = ([A-Za-z_][A-Za-z0-9_]*)|([:]+);
 intconst = [0-9]+;
+realconst = [0-9]+\.[0-9]*;
 ws = [\ \t\012];
 bo = [^<]+;
 
@@ -143,27 +144,41 @@ bo = [^<]+;
 <CODE> "@"         => (Tokens.AT (yypos, yypos + size yytext));
 
 <CODE> "if"        => (Tokens.IF (yypos, yypos + 2));
+<CODE> "then"      => (Tokens.THEN (yypos, yypos + 4));
 <CODE> "else"      => (Tokens.ELSE (yypos, yypos + 4));
 <CODE> "foreach"   => (Tokens.FOREACH (yypos, yypos + 7));
 <CODE> "in"        => (Tokens.IN (yypos, yypos + 2));
 <CODE> "case"      => (Tokens.CASE (yypos, yypos + 4));
 <CODE> "as"        => (Tokens.AS (yypos, yypos + 2));
+<CODE> "fn"        => (Tokens.FN (yypos, yypos + 2));
 <CODE> "with"      => (Tokens.WITH (yypos, yypos + 4));
 <CODE> "open"      => (Tokens.OPEN (yypos, yypos + 4));
 <CODE> "val"       => (Tokens.VAL (yypos, yypos + 3));
 <CODE> "ref"       => (Tokens.REF (yypos, yypos + 3));
 <CODE> "try"       => (Tokens.TRY (yypos, yypos + 3));
 <CODE> "catch"     => (Tokens.CATCH (yypos, yypos + 5));
-<CODE> "or"        => (Tokens.ORELSE (yypos, yypos + 5));
-<CODE> "and"       => (Tokens.ANDALSO (yypos, yypos + 5));
+<CODE> "or"        => (Tokens.ORELSE (yypos, yypos + 2));
+<CODE> "and"       => (Tokens.ANDALSO (yypos, yypos + 3));
+<CODE> "switch"    => (Tokens.SWITCH (yypos, yypos + 6));
+<CODE> "of"        => (Tokens.OF (yypos, yypos + 2));
+<CODE> "=>"        => (Tokens.ARROW (yypos, yypos + 2));
+<CODE> "|"         => (Tokens.BAR (yypos, yypos + 1));
+<CODE> "do"        => (Tokens.DO (yypos, yypos + 2));
+<CODE> "end"       => (Tokens.END (yypos, yypos + 3));
+<CODE> "raise"     => (Tokens.RAISE (yypos, yypos + 5));
 
 <CODE> "::"        => (Tokens.CONS (yypos, yypos + 2));
 <CODE> {id}        => (Tokens.IDENT (yytext, yypos, yypos + size yytext));
 <CODE> {intconst}  => (case Int.fromString yytext of
-                            SOME (x) => Tokens.INT (x, yypos, yypos + size yytext)
-                          | NONE     => (ErrorMsg.error (SOME (yypos, yypos))
-                                         ("Expected number, received: " ^ yytext);
-                                         continue ()));
+                            SOME x => Tokens.INT (x, yypos, yypos + size yytext)
+                          | NONE   => (ErrorMsg.error (SOME (yypos, yypos))
+                                       ("Expected int, received: " ^ yytext);
+                                       continue ()));
+<CODE> {realconst} => (case Real.fromString yytext of
+                            SOME x => Tokens.REAL (x, yypos, yypos + size yytext)
+                          | NONE   => (ErrorMsg.error (SOME (yypos, yypos))
+                                       ("Expected real, received: " ^ yytext);
+                                       continue ()));
 
 <CODE> "\"" {id} "\"" => (Tokens.STRING (String.substring(yytext, 1, String.size yytext - 2), yypos, yypos + size yytext));