-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathtokenizer.jflex
More file actions
118 lines (91 loc) · 3.5 KB
/
tokenizer.jflex
File metadata and controls
118 lines (91 loc) · 3.5 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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
import java_cup.runtime.* ;
%%
%class Lexer
%unicode
%cup
%line
%column
%yylexthrow ScanError
%{
StringBuffer readstring = new StringBuffer();
private Symbol symbol( int type ) {
return new Symbol( type, yyline, yycolumn );
}
private Symbol symbol( int type, Object value )
{
return new Symbol( type, yyline, yycolumn, value );
}
%}
LineTerminator = \r|\n|\r\n
WhiteSpace = {LineTerminator} | [ \t\f]
BlockComment = \/\*( (\*)+[^/*] | [^*])*(\*)+\/
QuotedString = \"( [^\"\\] | (\\n) | (\\t) | (\\\\) )* \"
digit = [0-9]
double = [-]?{digit}*({digit}\.?|\.{digit}){digit}*([Ee][-]?{digit}+)?
charconst = \'( [^\'\\] | (\\n) | (\\t) | (\\\\) )\'
%%
"if" { return symbol( sym. IF ); }
"then" { return symbol( sym. THEN ); }
"else" { return symbol( sym. ELSE ); }
"while" { return symbol( sym. WHILE ); }
"do" { return symbol( sym. DO ); }
"return" { return symbol( sym. RETURN ); }
"print" { return symbol( sym. PRINT ); }
"pointer" { return symbol( sym. POINTER ); }
"array" { return symbol( sym. ARRAY ); }
"function" { return symbol( sym. FUNCTION ); }
"structdef" { return symbol( sym. STRUCTDEF ); }
"constant" { return symbol( sym. CONSTANT ); }
"void" { return symbol( sym. VOID ); }
"end" { return symbol( sym. END ); }
"begin" { return symbol( sym. BEGIN ); }
"bool" { return symbol( sym. BOOL ); }
"char" { return symbol( sym. CHAR ); }
"integer" { return symbol( sym. INTEGER ); }
"double" { return symbol( sym. DOUBLE ); }
{charconst} { return symbol( sym. CHARCONST, new ast.Char(yytext( ).charAt(1)) ); }
{QuotedString} { return symbol( sym. STRINGCONST, new ast.String(yytext( ).substring(1, yytext().length()-1)) ); }
"null" { return symbol( sym. POINTERCONST, new ast.Pointer(0) ); }
"true" { return symbol( sym. BOOLCONST, new ast.Bool(true) ); }
"false" { return symbol( sym. BOOLCONST, new ast.Bool(false) );}
"[" { return symbol( sym. LSQPAR ); }
"]" { return symbol( sym. RSQPAR ); }
"(" { return symbol( sym. LPAR ); }
")" { return symbol( sym. RPAR ); }
"," { return symbol( sym. COMMA ); }
"." { return symbol( sym. DOT ); }
";" { return symbol( sym. SEMICOLON ); }
":" { return symbol( sym. COLON ); }
"=" { return symbol( sym. ASSIGN ); }
"?" { return symbol( sym. QUESTION ); }
"+" { return symbol( sym. ADD ); }
"-" { return symbol( sym. SUB ); }
"*" { return symbol( sym. MUL ); }
"/" { return symbol( sym. TRUEDIV ); }
"--" { return symbol( sym. MINUSMINUS ); }
"++" { return symbol( sym. PLUSPLUS ); }
"&" { return symbol( sym. AMPERSAND ); }
"!" { return symbol( sym. NOT ); }
"==" { return symbol( sym. EQ ); }
"!=" { return symbol( sym. NE ); }
"<" { return symbol( sym. LT ); }
">" { return symbol( sym. GT ); }
"<=" { return symbol( sym. LE ); }
">=" { return symbol( sym. GE ); }
"||" { return symbol( sym. OR ); }
"&&" { return symbol( sym. AND ); }
"->" { return symbol( sym. ARROW ); }
[:jletter:]([:jletter:] | [0-9])*
{ return symbol( sym. IDENTIFIER, new ast.Identifier( yytext( ) )); }
"0" | [1-9][0-9]*
{ return symbol( sym.INTEGERCONST,
new ast.Integer( new java.lang.Integer( yytext( ) ))); }
{ double }
{ return symbol( sym.DOUBLECONST,
new ast.Double( new java.lang.Double( yytext( ) ))); }
{WhiteSpace} { }
{BlockComment} { }
"#" { return symbol( sym. EOF ); }
// Error fallback:
[^] { throw new ScanError( "Unrecognized character <" + yytext( ) + ">",
yyline, yycolumn ); }