Import Upstream version 20180207
[hcoop/debian/mlton.git] / mlyacc / examples / calc / calc.lex
CommitLineData
7f918cf1
CE
1structure Tokens = Tokens
2
3type pos = int
4type svalue = Tokens.svalue
5type ('a,'b) token = ('a,'b) Tokens.token
6type lexresult= (svalue,pos) token
7
8val pos = ref 0
9fun eof () = Tokens.EOF(!pos,!pos)
10fun 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));
16alpha=[A-Za-z];
17digit=[0-9];
18ws = [\ \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());