-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathPLXC.flex
More file actions
69 lines (48 loc) · 1.91 KB
/
PLXC.flex
File metadata and controls
69 lines (48 loc) · 1.91 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
import java_cup.runtime.*;
%%
%cup
%line
Number = 0|[1-9][0-9]*
Identifier = [_a-z][_a-z0-9]*
%{
public static int currentLabel = -1;
public static String newLabel(){ return "L" + (++currentLabel); }
%}
%%
// KEYWORDS
"print" { return new Symbol(sym.PRINT); }
"if" { return new Symbol(sym.IF, newLabel()); }
"else" { return new Symbol(sym.ELSE); }
"while" { return new Symbol(sym.WHILE, newLabel()); }
"do" { return new Symbol(sym.DO, newLabel()); }
"for" { return new Symbol(sym.FOR, newLabel()); }
"int" { return new Symbol(sym.INT); }
// PARENTHESIS
"(" { return new Symbol(sym.OP); }
")" { return new Symbol(sym.CP); }
"{" { return new Symbol(sym.OB); }
"}" { return new Symbol(sym.CB); }
// OPERATORS
"+" { return new Symbol(sym.ADD); }
"-" { return new Symbol(sym.SUB); }
"*" { return new Symbol(sym.MUL); }
"/" { return new Symbol(sym.DIV); }
"=" { return new Symbol(sym.ASIG); }
";" { return new Symbol(sym.SC); }
"," { return new Symbol(sym.COMMA); }
// CONDITIONALS
"==" { return new Symbol(sym.DEQ); }
"<=" { return new Symbol(sym.LEQ); }
">=" { return new Symbol(sym.GEQ); }
"<" { return new Symbol(sym.LT); }
">" { return new Symbol(sym.GT); }
"!=" { return new Symbol(sym.NEQ); }
"&&" { return new Symbol(sym.AND); }
"||" { return new Symbol(sym.OR); }
"!" { return new Symbol(sym.NOT); }
// TERMINALS
{Number} { return new Symbol(sym.NUM, yytext()); }
{Identifier} { return new Symbol(sym.ID, yytext()); }
// MISC
[ \t\n\r] { ; }
[^] { System.err.println("Unknown character " + yytext() + " at line " + yyline); }