id = ([A-Za-z_][A-Za-z0-9_]*)|([:]+);
intconst = [0-9]+;
+realconst = [0-9]+\.[0-9]*;
ws = [\ \t\012];
-bo = [^<]+;
+bo = [^<\n]+;
%%
-\n => (if isLinCom () then (linComEnd (); YYBEGIN INITIAL) else ();
+<CODE> \n => (if isLinCom () then (linComEnd (); YYBEGIN INITIAL) else ();
lineNum := !lineNum + 1;
linePos := yypos :: ! linePos;
continue ());
+<INITIAL> \n => (lineNum := !lineNum + 1;
+ linePos := yypos :: ! linePos;
+ Tokens.HTML (yytext, yypos, yypos + size yytext));
<INITIAL> {ws}+ => (Tokens.HTML (" ", yypos, yypos + size yytext); lex ());
<CODE> "@" => (Tokens.AT (yypos, yypos + size yytext));
<CODE> "if" => (Tokens.IF (yypos, yypos + 2));
+<CODE> "iff" => (Tokens.IFF (yypos, yypos + 3));
+<CODE> "then" => (Tokens.THEN (yypos, yypos + 4));
<CODE> "else" => (Tokens.ELSE (yypos, yypos + 4));
+<CODE> "elseif" => (Tokens.ELSEIF (yypos, yypos + 6));
<CODE> "foreach" => (Tokens.FOREACH (yypos, yypos + 7));
+<CODE> "for" => (Tokens.FOR (yypos, yypos + 3));
<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> "let" => (Tokens.LET (yypos, yypos + 3));
+<CODE> "in" => (Tokens.IN (yypos, yypos + 2));
<CODE> "::" => (Tokens.CONS (yypos, yypos + 2));
+<CODE> "o" => (Tokens.O (yypos, yypos + 1));
<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));