Added support for dynamically allocated arrays.
[repair.git] / Repair / RepairCompiler / MCC / Lexer.lex
1 package MCC;
2 %%
3
4 %implements java_cup.runtime.Scanner
5 %function next_token
6 %type java_cup.runtime.Symbol
7 %class Lexer
8 %char
9 %line
10 %full
11 %state COMMENT
12 %state MLCOMMENT
13 %eofval{
14     return tok(Sym.EOF, null);
15 %eofval}
16
17 %{
18 private java_cup.runtime.Symbol tok(int kind, Object value) {
19     return new Symbol(kind, yychar, yychar + yylength(), value, yyline);
20 }
21 %}
22
23 ALPHA=[A-Za-z_]
24 DIGIT=[0-9]
25 HEX_DIGIT=[0-9a-fA-F]
26 WHITESPACE=[\ \t\b\r\f]
27 CHAR=(\\\"|\\\'|\\\\|\\t|\\n|[\x20-\x21\x23-\x26\x28-\x5B\x5D-\x7E])
28
29 %%
30
31 <YYINITIAL> {WHITESPACE}                {}
32 <YYINITIAL> \n                          { LineCount.addLineBreak(yychar+1); }
33
34 <YYINITIAL> "{"                         { return tok(Sym.OPENBRACE, yytext()); }
35 <YYINITIAL> "}"                         { return tok(Sym.CLOSEBRACE, yytext()); }
36 <YYINITIAL> "("                         { return tok(Sym.OPENPAREN, yytext()); }
37 <YYINITIAL> ")"                         { return tok(Sym.CLOSEPAREN, yytext()); }
38 <YYINITIAL> "["                         { return tok(Sym.OPENBRACKET, yytext()); }
39 <YYINITIAL> "]"                         { return tok(Sym.CLOSEBRACKET, yytext()); }
40
41 <YYINITIAL> "+"                         { return tok(Sym.ADD, yytext()); }
42 <YYINITIAL> "-"                         { return tok(Sym.SUB, yytext()); }
43 <YYINITIAL> "*"                         { return tok(Sym.MULT, yytext()); }
44 <YYINITIAL> "/"                         { return tok(Sym.DIV, yytext()); }
45 <YYINITIAL> sum                         { return tok(Sym.SUM, yytext()); }
46
47
48 <YYINITIAL> "<"                         { return tok(Sym.LT, yytext()); }
49 <YYINITIAL> ">"                         { return tok(Sym.GT, yytext()); }
50 <YYINITIAL> "<="                        { return tok(Sym.LE, yytext()); }
51 <YYINITIAL> ">="                        { return tok(Sym.GE, yytext()); }
52 <YYINITIAL> "="                         { return tok(Sym.EQ, yytext()); }
53 <YYINITIAL> "!="                        { return tok(Sym.NE, yytext()); }
54 <YYINITIAL> "!"                         { return tok(Sym.NOT, yytext()); }
55
56 <YYINITIAL> forall                      { return tok(Sym.FORALL, yytext()); }
57 <YYINITIAL> in\?                        { return tok(Sym.INTEST, yytext()); }
58 <YYINITIAL> in                          { return tok(Sym.IN, yytext()); }
59
60 <YYINITIAL> ","                         { return tok(Sym.COMMA, yytext()); }
61 <YYINITIAL> sizeof                      { return tok(Sym.SIZEOF, yytext()); }
62
63 <YYINITIAL> ".~"                        { return tok(Sym.DOTINV, yytext()); }
64 <YYINITIAL> "."                         { return tok(Sym.DOT, yytext()); }
65
66 <YYINITIAL> "and"                       { return tok(Sym.AND, yytext()); }
67 <YYINITIAL> "or"                        { return tok(Sym.OR, yytext()); }
68
69 <YYINITIAL> literal                     { return tok(Sym.LITERAL, yytext()); }
70 <YYINITIAL> param                       { return tok(Sym.PARAM, yytext()); }
71 <YYINITIAL> "=>"                        { return tok(Sym.IMPLIES, yytext()); }
72 <YYINITIAL> true                        { return tok(Sym.TRUE, yytext()); }
73 <YYINITIAL> false                       { return tok(Sym.FALSE, yytext()); }
74 <YYINITIAL> isvalid                     { return tok(Sym.ISVALID, yytext()); }
75 <YYINITIAL> for                         { return tok(Sym.FOR, yytext()); }
76 <YYINITIAL> to                          { return tok(Sym.TO, yytext()); }
77
78 <YYINITIAL> structure                   { return tok(Sym.STRUCTURE, yytext()); }
79 <YYINITIAL> reserved                    { return tok(Sym.RESERVED, yytext()); }
80 <YYINITIAL> label                       { return tok(Sym.LABEL, yytext()); }
81 <YYINITIAL> int                         { return tok(Sym.INT, yytext()); }
82 <YYINITIAL> bit                         { return tok(Sym.BIT, yytext()); }
83 <YYINITIAL> byte                        { return tok(Sym.BYTE, yytext()); }
84
85 <YYINITIAL> subtype                     { return tok(Sym.SUBTYPE, yytext()); }
86 <YYINITIAL> subclass                    { return tok(Sym.SUBCLASS, yytext()); }
87 <YYINITIAL> of                          { return tok(Sym.OF, yytext()); }
88
89 <YYINITIAL> ";"                         { return tok(Sym.SEMICOLON, yytext()); }
90 <YYINITIAL> ":"                         { return tok(Sym.COLON, yytext()); }
91
92 <YYINITIAL> set                         { return tok(Sym.SET, yytext()); }
93 <YYINITIAL> "->"                        { return tok(Sym.ARROW, yytext()); }
94 <YYINITIAL> many                        { return tok(Sym.MANY, yytext()); }
95 <YYINITIAL> "|"                         { return tok(Sym.BAR, yytext()); }
96
97 <YYINITIAL> partition                   { return tok(Sym.PARTITION, yytext()); }
98 <YYINITIAL> element                     { return tok(Sym.ELEMENT, yytext()); }
99 <YYINITIAL> delay                       { return tok(Sym.DELAY, yytext()); }
100 <YYINITIAL> static                      { return tok(Sym.STATIC, yytext()); }
101
102 <YYINITIAL> cast                        { return tok(Sym.CAST, yytext()); }
103 <YYINITIAL> short                       { return tok(Sym.SHORT, yytext()); }
104 <YYINITIAL> null                        { return tok(Sym.NULL, yytext()); }
105 <YYINITIAL> NULL                        { return tok(Sym.NULL, yytext()); }
106 <YYINITIAL> crash                       { return tok(Sym.CRASH, yytext()); }
107
108 <YYINITIAL> {ALPHA}({ALPHA}|{DIGIT})*   { return tok(Sym.ID, yytext()); }
109 <YYINITIAL> {DIGIT}+                    { return tok(Sym.DECIMAL, yytext()); }
110 <YYINITIAL> \'{CHAR}\'                  { return tok(Sym.CHAR, yytext()); }
111 <YYINITIAL> \"{CHAR}*\"                 { return tok(Sym.STRING, yytext()); }
112
113 <YYINITIAL> .                           { System.err.println("Bad token at line " + (yyline + 1) + ": " + yytext()); return tok(Sym.BAD, yytext()); }
114
115 <YYINITIAL> "//"                        { yybegin(COMMENT); }
116 <COMMENT>   \n                          { yybegin(YYINITIAL); LineCount.addLineBreak(yychar+1); }
117
118 <YYINITIAL> "/*"                        { yybegin(MLCOMMENT); }
119 <MLCOMMENT> "*/"                        { yybegin(YYINITIAL); }
120 <MLCOMMENT> \n                          { LineCount.addLineBreak(yychar+1); }
121 <MLCOMMENT> .                           { }
122
123
124 <COMMENT>   .                           { }