Commit | Line | Data |
---|---|---|
7f918cf1 CE |
1 | structure Tokens = Tokens |
2 | ||
3 | type pos = int | |
4 | type svalue = Tokens.svalue | |
5 | type ('a,'b) token = ('a,'b) Tokens.token | |
6 | type lexresult= (svalue,pos) token | |
7 | ||
8 | val pos = ref 0 | |
9 | fun eof () = Tokens.EOF(!pos,!pos) | |
10 | fun error (e,l : int,_) = TextIO.output (TextIO.stdOut, String.concat[ | |
11 | "line ", (Int.toString l), ": ", e, "\n" | |
12 | ]) | |
13 | ||
14 | %% | |
15 | %header (functor CalcLexFun(structure Tokens: Calc_TOKENS)); | |
16 | alpha=[A-Za-z]; | |
17 | digit=[0-9]; | |
18 | ws = [\ \t]; | |
19 | %% | |
20 | \n => (pos := (!pos) + 1; lex()); | |
21 | {ws}+ => (lex()); | |
22 | {digit}+ => (Tokens.NUM (valOf (Int.fromString yytext), !pos, !pos)); | |
23 | ||
24 | "+" => (Tokens.PLUS(!pos,!pos)); | |
25 | "*" => (Tokens.TIMES(!pos,!pos)); | |
26 | ";" => (Tokens.SEMI(!pos,!pos)); | |
27 | {alpha}+ => (if yytext="print" | |
28 | then Tokens.PRINT(!pos,!pos) | |
29 | else Tokens.ID(yytext,!pos,!pos) | |
30 | ); | |
31 | "-" => (Tokens.SUB(!pos,!pos)); | |
32 | "^" => (Tokens.CARAT(!pos,!pos)); | |
33 | "/" => (Tokens.DIV(!pos,!pos)); | |
34 | "." => (error ("ignoring bad character "^yytext,!pos,!pos); | |
35 | lex()); |