|
|
1.1 root 1: open C.LexValue
2: type lexresult = V
3:
4: val pcount = ref 0;
5: val commentLevel = ref 0
6: val lineno = C.HDR.lineno
7: val actionstart = ref 0
8: val eof = fn () => (if (!pcount)>0 then
9: error " eof encountered in action beginning here !"
10: (!actionstart)
11: else (); EOF)
12:
13: val text = ref (nil : string list)
14: val Add = fn s => (text := s::(!text))
15: val error = C.HDR.error
16: val inc = fn (i:int ref) => i := (!i) +1
17:
18: fun lookup s =
19: let val dict = [("%prec",PREC_TAG),("%term",Term),
20: ("%nonterm",Nonterm),("%nonassoc",PREC NONASSOC),
21: ("%left",PREC LEFT),("%right",PREC RIGHT),
22: ("%eof",PERCENT_EOF),("%start",START),
23: ("%prefer",PREFER),("%insert_prefer",IPREFER),
24: ("%keyword",KEYWORD),("%structure",STRUCT),
25: ("%verbose",VERBOSE)]
26:
27: fun find ((a,d)::b) = if a=s then d else find(b)
28: | find nil = (UNKNOWN s)
29: in find dict
30: end
31:
32: %%
33: %s A B C D F COMMENT STRING;
34: ws = [\t\ ]*;
35: idchars = [A-Za-z_'0-9];
36: id=[A-Za-z]{idchars}*;
37: tyvar="'"{idchars}*;
38: qualid ={id}".";
39: %%
40: <INITIAL>. => (YYBEGIN C; lineno := 1; text := [yytext]; lex());
41: <INITIAL>\n => (YYBEGIN C; lineno := 2; text := [yytext]; lex());
42: <INITIAL>"%%" => (YYBEGIN D; HEADER "");
43:
44: <C>[^%\n]+ => (Add yytext; lex());
45: <C>"%%" => (YYBEGIN D; HEADER (implode (rev (!text))));
46: <C>\n => (Add yytext; inc lineno; lex());
47: <C>. => (Add yytext; lex());
48:
49: <D>"(" => (LPAREN);
50: <D>")" => (RPAREN);
51:
52: <D,A>of => (OF);
53: <D,A>for => (FOR);
54: <D,A>val => (VAL);
55: <D,A>"=" => (EQUAL);
56: <D,A>"%%" => (YYBEGIN A; DELIMITER);
57: <D,A>{ws}+ => (lex());
58: <D,A>\n+ => (lineno := !lineno + (size yytext); lex());
59: <D,A>":" => (COLON);
60: <D,A>"|" => (BAR);
61: <D,A>"{" => (LBRACE);
62: <D,A>"}" => (RBRACE);
63: <D,A>"," => (COMMA);
64: <D,A>"*" => (ASTERISK);
65: <D,A>"->" => (ARROW);
66: <D,A>"%"[a-z_]+ => (lookup yytext);
67: <D,A>{id} => (ID yytext);
68: <D,A>[0-9]+ => (INT yytext);
69: <D,A>{tyvar} => (TYVAR yytext);
70: <D,A>{qualid} => (IDDOT yytext);
71: <A>"(" => (pcount := 1; actionstart := (!C.HDR.lineno);
72: text := nil; YYBEGIN B; lex());
73: <D,A>. => (UNKNOWN yytext);
74:
75: <B>"(" => (pcount := (!pcount) + 1; Add yytext; lex());
76: <B>")" => (pcount := (!pcount) - 1;
77: if (!pcount = 0) then
78: (YYBEGIN A; PROG (implode (rev (!text))))
79: else (Add yytext; lex()));
80: <B>"\"" => (Add yytext; YYBEGIN STRING; lex());
81: <B>[^()"\n]+ => (Add yytext; lex());
82: <B>\n => (Add yytext; inc lineno; lex());
83: <B>"(*" => (Add yytext; YYBEGIN COMMENT; inc commentLevel; lex());
84:
85: <COMMENT>[(*)] => (Add yytext; lex());
86: <COMMENT>"(*" => (Add yytext; inc commentLevel; lex());
87: <COMMENT>[^*()\n]+ => (Add yytext; lex());
88: <COMMENT>\n => (Add yytext; inc lineno; lex());
89: <COMMENT>"*)" => (Add yytext; dec commentLevel;
90: if !commentLevel=0 then YYBEGIN B else (); lex());
91: <STRING>"\"" => (Add yytext; YYBEGIN B; lex());
92: <STRING>[^"\\\n]+ => (Add yytext; lex());
93: <STRING>\\ => (Add yytext; lex());
94: <STRING>\\\" => (Add yytext; lex());
95: <STRING>\n => (Add yytext; error "unclosed string" (!lineno);
96: inc lineno; YYBEGIN B; lex());
97: <STRING>\\[\ \t\n] => (Add yytext;
98: if substring(yytext,1,1)="\n" then inc lineno else ();
99: YYBEGIN F; lex());
100:
101: <F>\n => (Add yytext; inc lineno; lex());
102: <F>[\ \t]+ => (Add yytext; lex());
103: <F>\\ => (Add yytext; YYBEGIN STRING; lex());
104: <F>. => (Add yytext; error "unclosed string" (!lineno);
105: YYBEGIN B; lex());
106: %%
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.