forked from mandar7-git/Java-x86-Compiler
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlexer.l
229 lines (191 loc) · 10.4 KB
/
lexer.l
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
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
%{
#include <stdio.h>
#include <string.h>
#include "parser.tab.h"
#include "attr.h"
%}
%option yylineno
EndOfLineComment "//".*
Comment "/*"[^*]*"*"+([^*/][^*]*[*]+)*"/"|{EndOfLineComment}
LineTerminator \n|\r|\r\n
WhiteSpace [ \t\f]+|{LineTerminator}
JavaLetter [a-zA-Z$_]
JavaLetterOrDigit [a-zA-Z$_0-9]
Identifier {JavaLetter}{JavaLetterOrDigit}*
ReservedKeyword abstract|continue|for|new|switch|assert|default|if|package|synchronized|boolean|do|goto|private|this|break|double|implements|protected|throw|byte|else|import|public|throws|case|enum|instanceof|return|transient|catch|extends|int|short|try|char|final|interface|static|void|class|finally|long|strictfp|volatile|const|float|native|super|while|_
ContextualKeyword exports|opens|requires|uses|module|permits|sealed|var|non-sealed|provides|to|with|open|record|transitive|yield
Keyword {ReservedKeyword}|{ContextualKeyword}
Underscores _+
NonZeroDigit [1-9]
DigitOrUnderscore {Digit}|"_"
DigitsAndUnderscores {DigitOrUnderscore}{DigitOrUnderscore}*
Digit "0"|{NonZeroDigit}
Digits {Digit}|({Digit}{DigitsAndUnderscores}?{Digit})
DecimalNumeral "0"|({NonZeroDigit}{Digits}?)|({NonZeroDigit}{Underscores}{Digits})
IntegerTypeSuffix [lL]
DecimalIntegerLiteral {DecimalNumeral}{IntegerTypeSuffix}?
HexDigit [0-9a-fA-F]
HexDigitsAndUnderscore {HexDigit}|"_"
HexDigitsAndUnderscores {HexDigitsAndUnderscore}{HexDigitsAndUnderscore}*
HexDigits {HexDigit}|({HexDigit}{HexDigitsAndUnderscores}?{HexDigit})
HexNumeral ("0x"{HexDigits})|("0X"{HexDigits})
HexIntegerLiteral {HexNumeral}{IntegerTypeSuffix}?
OctalDigit [0-7]
OctalDigitOrUnderscore {OctalDigit}|"_"
OctalDigitsAndUnderscores {OctalDigitOrUnderscore}{OctalDigitOrUnderscore}*
OctalDigits {OctalDigit}|({OctalDigit}{OctalDigitsAndUnderscores}?{OctalDigit})
OctalNumeral ("0"{OctalDigits})|("0"{Underscores}{OctalDigits})
OctalIntegerLiteral {OctalNumeral}{IntegerTypeSuffix}?
BinaryDigit [0-1]
BinaryDigitOrUnderscore {BinaryDigit}|"_"
BinaryDigitsAndUnderscores {BinaryDigitOrUnderscore}{BinaryDigitOrUnderscore}*
BinaryDigits {BinaryDigit}|({BinaryDigit}{BinaryDigitsAndUnderscores}?{BinaryDigit})
BinaryNumeral ("0b"{BinaryDigits})|("0B"{BinaryDigits})
BinaryIntegerLiteral {BinaryNumeral}{IntegerTypeSuffix}?
IntegerLiteral {DecimalIntegerLiteral}|{HexIntegerLiteral}|{OctalIntegerLiteral}|{BinaryIntegerLiteral}
FloatTypeSuffix "f"|"F"
DoubleTypeSuffix "D"|"d"
Sign [+-]
SignedInteger {Sign}?{Digits}
ExponentIndicator "e"|"E"
ExponentPart {ExponentIndicator}{SignedInteger}
DecimalFloatingPointLiteral ({Digits}\.{Digits}?{ExponentPart}?{FloatTypeSuffix}?)|(\.{Digits}{ExponentPart}?{FloatTypeSuffix}?)|({Digits}{ExponentPart}{FloatTypeSuffix}?)|({Digits}{ExponentPart}?{FloatTypeSuffix})
DecimalDoublePointLiteral ({Digits}\.{Digits}?{ExponentPart}?{DoubleTypeSuffix}?)|(\.{Digits}{ExponentPart}?{DoubleTypeSuffix}?)|({Digits}{ExponentPart}{DoubleTypeSuffix}?)|({Digits}{ExponentPart}?{DoubleTypeSuffix})
BinaryExponentIndicator "p"|"P"
BinaryExponent {BinaryExponentIndicator}{SignedInteger}
HexSignificand ({HexNumeral}\.?)|("0x"{HexDigits}?\.{HexDigits})
HexadecimalFloatingPointLiteral {HexSignificand}{BinaryExponent}{FloatTypeSuffix}?
HexadecimalDoublePointLiteral {HexSignificand}{BinaryExponent}{DoubleTypeSuffix}?
FloatingPointLiteral {DecimalFloatingPointLiteral}|{HexadecimalFloatingPointLiteral}
DoublePointLiteral {DecimalDoublePointLiteral}|{HexadecimalDoublePointLiteral}
BooleanLiteral "true"|"false"
OctalEscape \{OctalDigit}|\{OctalDigit}{OctalDigit}|\[0-3]{OctalDigit}{OctalDigit}
EscapeSequence \b|\s|\t|\n|\f|\r|{LineTerminator}|\'|\\
/* OctalEscape is not included in EscapeSequence for now */
/* \" is not included in EscapeSequence for now */
InputCharacter [^\n\r]
SingleCharacter [^\n\r\'\\]
CharacterLiteral ("'"{SingleCharacter}"'")|\'\\n\'|(\'\\s\')|(\'\\t\')|(\'\\b\')|(\'\\f\')|(\'\\r\')|(\'\\'\')|(\'\\\\\')|(\'\\r\\n\')
StringCharacter [^\"\\]|{EscapeSequence}
StringLiteral \"{StringCharacter}*\"
TextBlockCharacter [^\"\n\r\\]|{EscapeSequence}|{LineTerminator}
TextBlockWhiteSpace [ \t\f]+
TextBlock1 \"\"\"([^\"]+\"{0,2}[^\"]+)*\"\"\"
TextBlock (\"\"\"{TextBlockWhiteSpace}*{LineTerminator}{TextBlockCharacter}*\"\"\")|{TextBlock1}
NullLiteral "null"
Literal {IntegerLiteral}|{FloatingPointLiteral}|{BooleanLiteral}|{CharacterLiteral}|{StringLiteral}|{TextBlock}|{NullLiteral}
Separator "::"|"..."|[(){};,@]|"["|"]"
%%
{Comment} {continue;}
{LineTerminator} {continue;}
"." {yylval.name=strdup(yytext); return (DOT);}
{IntegerLiteral} {yylval.name=strdup(yytext); return (INTEGERLITERAL);}
{FloatingPointLiteral} {yylval.name=strdup(yytext); return (FLOATINGPOINTLITERAL);}
{DoublePointLiteral} {yylval.name=strdup(yytext); return (DOUBLEPOINTLITERAL);}
{BooleanLiteral} {yylval.name=strdup(yytext); return (BOOLEANLITERAL);}
{CharacterLiteral} {yylval.name=strdup(yytext); return (CHARACTERLITERAL);}
{StringLiteral} {yylval.name=strdup(yytext); return (STRINGLITERAL);}
{NullLiteral} {yylval.name=strdup(yytext); return (NULLLITERAL);}
"byte" {yylval.name=strdup(yytext); return (BYTE);}
"import" {yylval.name=strdup(yytext); return (IMPORT);}
"public" {yylval.name=strdup(yytext); return (PUBLIC);}
"protected" {yylval.name=strdup(yytext); return (PROTECTED);}
"private" {yylval.name=strdup(yytext); return (PRIVATE);}
"static" {yylval.name=strdup(yytext); return (STATIC);}
"abstract" {yylval.name=strdup(yytext); return (ABSTRACT);}
"final" {yylval.name=strdup(yytext); return (FINAL);}
"native" {yylval.name=strdup(yytext); return (NATIVE);}
"synchronized" {yylval.name=strdup(yytext); return (SYNCHRONIZED);}
"transient" {yylval.name=strdup(yytext); return (TRANSIENT);}
"volatile" {yylval.name=strdup(yytext); return (VOLATILE);}
"package" {yylval.name=strdup(yytext); return (PACKAGE);}
"," {yylval.name=strdup(yytext); return (COMMA);}
"=" {yylval.name=strdup(yytext); return (EQUALTO);}
"super" {yylval.name=strdup(yytext); return (SUPER);}
"if" {yylval.name=strdup(yytext); return (IF);}
"else" {yylval.name=strdup(yytext); return (ELSE);}
"switch" {yylval.name=strdup(yytext); return (SWITCH);}
"case" {yylval.name=strdup(yytext); return (CASE);}
"default" {yylval.name=strdup(yytext); return (DEFAULT);}
"while" {yylval.name=strdup(yytext); return (WHILE);}
"do" {yylval.name=strdup(yytext); return (DO);}
"for" {yylval.name=strdup(yytext); return (FOR);}
"break" {yylval.name=strdup(yytext); return (BREAK);}
"throw" {yylval.name=strdup(yytext); return (THROW);}
"try" {yylval.name=strdup(yytext); return (TRY);}
"finally" {yylval.name=strdup(yytext); return (FINALLY);}
"catch" {yylval.name=strdup(yytext); return (CATCH);}
"void" {yylval.name=strdup(yytext); return (VOID);}
"throws" {yylval.name=strdup(yytext); return (THROWS);}
"extends" {yylval.name=strdup(yytext); return (EXTENDS);}
"implements" {yylval.name=strdup(yytext); return (IMPLEMENTS);}
"class" {yylval.name=strdup(yytext); return (CLASS);}
"interface" {yylval.name=strdup(yytext); return (INTERFACE);}
"boolean" {yylval.name=strdup(yytext); return (BOOLEAN);}
"short" {yylval.name=strdup(yytext); return (SHORT);}
"int" {yylval.name=strdup(yytext); return (INT);}
"long" {yylval.name=strdup(yytext); return (LONG);}
"char" {yylval.name=strdup(yytext); return (CHAR);}
"float" {yylval.name=strdup(yytext); return (FLOAT);}
"double" {yylval.name=strdup(yytext); return (DOUBLE);}
"instanceof" {yylval.name=strdup(yytext); return (INSTANCEOF);}
"this" {yylval.name=strdup(yytext); return (THIS);}
"new" {yylval.name=strdup(yytext); return (NEW);}
"continue" {yylval.name=strdup(yytext); return (CONTINUE);}
"return" {yylval.name=strdup(yytext); return (RETURN);}
"{" {yylval.name=strdup(yytext); return (OPCURLY);}
"}" {yylval.name=strdup(yytext); return (CLCURLY);}
"(" {yylval.name=strdup(yytext); return (OPROUND);}
")" {yylval.name=strdup(yytext); return (CLROUND);}
"[" {yylval.name=strdup(yytext); return (OPSQR);}
"]" {yylval.name=strdup(yytext); return (CLSQR);}
"+" {yylval.name=strdup(yytext); return (PLUS);}
"++" {yylval.name=strdup(yytext); return (DPLUS);}
"--" {yylval.name=strdup(yytext); return (DMINUS);}
"-" {yylval.name=strdup(yytext); return (MINUS);}
":" {yylval.name=strdup(yytext); return (COLON);}
";" {yylval.name=strdup(yytext); return (SEMICOLON);}
"~" {yylval.name=strdup(yytext); return (TILDA);}
"!" {yylval.name=strdup(yytext); return (EX);}
"?" {yylval.name=strdup(yytext); return (QUES);}
"*" {yylval.name=strdup(yytext); return (ASTERIX);}
"/" {yylval.name=strdup(yytext); return (FSLASH);}
"%" {yylval.name=strdup(yytext); return (MOD);}
"<<" {yylval.name=strdup(yytext); return (LSHIFT);}
">>" {yylval.name=strdup(yytext); return (RSHIFT);}
">>>" {yylval.name=strdup(yytext); return (URSHIFT);}
"<" {yylval.name=strdup(yytext); return (LT);}
">" {yylval.name=strdup(yytext); return (GT);}
"<=" {yylval.name=strdup(yytext); return (LTE);}
">=" {yylval.name=strdup(yytext); return (GTE);}
"==" {yylval.name=strdup(yytext); return (DOUBLEEQ);}
"!=" {yylval.name=strdup(yytext); return (NOTEQ);}
"&" {yylval.name=strdup(yytext); return (AND);}
"^" {yylval.name=strdup(yytext); return (XOR);}
"|" {yylval.name=strdup(yytext); return (OR);}
"&&" {yylval.name=strdup(yytext); return (DAND);}
"||" {yylval.name=strdup(yytext); return (DOR);}
"*=" {yylval.name=strdup(yytext); return (STAREQUALTO);}
"/=" {yylval.name=strdup(yytext); return (BYEQUALTO);}
"+=" {yylval.name=strdup(yytext); return (PLUSEQUALTO);}
"-=" {yylval.name=strdup(yytext); return (MINUSEQUALTO);}
"<<=" {yylval.name=strdup(yytext); return (TWOLEFTSHIFTEQUALTO);}
">>=" {yylval.name=strdup(yytext); return (TWORIGHTSHIFTEQUALTO);}
">>>=" {yylval.name=strdup(yytext); return (THREERIGHTSHIFTEQUALTO);}
"&=" {yylval.name=strdup(yytext); return (ANDEQUALTO);}
"^=" {yylval.name=strdup(yytext); return (XOREQUALTO);}
"|=" {yylval.name=strdup(yytext); return (BAREQUALTO);}
{Literal} {yylval.name=strdup(yytext); return (LITERAL); }
{Identifier} {yylval.name=strdup(yytext); return (IDENTIFIER);}
{WhiteSpace} { continue;}
. {
printf("Error: Unrecognized character on line %d\n",yylineno);
exit(0);
}
%%
void showError(){
printf("Other input");
}
int yywrap(){
return 1;
}