1 structure Tokens = Tokens
3 type svalue = Tokens.svalue
4 type ('a,'b) token = ('a,'b) Tokens.token
5 type lexresult = (svalue,pos) token
10 val eof = fn () => EOF(!lineNum,!lineNum)
13 structure KeyWord : sig
15 (int * int -> (svalue,int) token) option
23 foldl (fn (c,v)=>(v*HashFactor+(ord c)) mod TableSize) 0 (explode s)
26 val HashTable = Array.array(TableSize,nil) :
27 (string * (int * int -> (svalue,int) token)) list Array.array
32 in Array.update(HashTable,i,(s,v) :: (Array.sub(HashTable, i)))
37 fun f ((key,v)::r) = if s=key then SOME v else f r
39 in f (Array.sub(HashTable, i))
58 ("function",YFUNCTION),
71 ("procedure",YPROCEDURE),
89 %header (functor PascalLexFun(structure Tokens : Pascal_TOKENS));
96 exp=(e|E){optsign}{digit}+;
100 <INITIAL>{ws}+ => (lex());
101 <INITIAL>\n+ => (lineNum := (!lineNum) + (String.size yytext); lex());
102 <INITIAL>{alpha}+ => (case find yytext of SOME v => v(!lineNum,!lineNum)
103 | _ => YID(!lineNum,!lineNum));
104 <INITIAL>{alpha}({alpha}|{digit})* => (YID(!lineNum,!lineNum));
105 <INITIAL>{optsign}{integer}({frac}{exp}?|{frac}?{exp}) => (YNUMB(!lineNum,!lineNum));
106 <INITIAL>{optsign}{integer} => (YINT(!lineNum,!lineNum));
107 <INITIAL>{octdigit}+(b|B) => (YBINT(!lineNum,!lineNum));
108 <INITIAL>"'"([^']|"''")*"'" => (YSTRING(!lineNum,!lineNum));
109 <INITIAL>"(*" => (YYBEGIN C; lex());
110 <INITIAL>".." => (YDOTDOT(!lineNum,!lineNum));
111 <INITIAL>"." => (YDOT(!lineNum,!lineNum));
112 <INITIAL>"(" => (YLPAR(!lineNum,!lineNum));
113 <INITIAL>")" => (YRPAR(!lineNum,!lineNum));
114 <INITIAL>";" => (YSEMI(!lineNum,!lineNum));
115 <INITIAL>"," => (YCOMMA(!lineNum,!lineNum));
116 <INITIAL>":" => (YCOLON(!lineNum,!lineNum));
117 <INITIAL>"^" => (YCARET(!lineNum,!lineNum));
118 <INITIAL>"[" => (YLBRA(!lineNum,!lineNum));
119 <INITIAL>"]" => (YRBRA(!lineNum,!lineNum));
120 <INITIAL>"~" => (YTILDE(!lineNum,!lineNum));
121 <INITIAL>"<" => (YLESS(!lineNum,!lineNum));
122 <INITIAL>"=" => (YEQUAL(!lineNum,!lineNum));
123 <INITIAL>">" => (YGREATER(!lineNum,!lineNum));
124 <INITIAL>"+" => (YPLUS(!lineNum,!lineNum));
125 <INITIAL>"-" => (YMINUS(!lineNum,!lineNum));
126 <INITIAL>"|" => (YBAR(!lineNum,!lineNum));
127 <INITIAL>"*" => (YSTAR(!lineNum,!lineNum));
128 <INITIAL>"/" => (YSLASH(!lineNum,!lineNum));
129 <INITIAL>"{" => (YYBEGIN B; lex());
130 <INITIAL>. => (YILLCH(!lineNum,!lineNum));
131 <C>\n+ => (lineNum := (!lineNum) + (String.size yytext); lex());
132 <C>[^()*\n]+ => (lex());
134 <C>"*)" => (YYBEGIN INITIAL; lex());
136 <B>\n+ => (lineNum := (!lineNum) + (String.size yytext); lex());
137 <B>[^{}\n]+ => (lex());
139 <B>"}" => (YYBEGIN INITIAL; lex());