-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathlexer.flex
More file actions
80 lines (66 loc) · 3.02 KB
/
lexer.flex
File metadata and controls
80 lines (66 loc) · 3.02 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
package com;
import java_cup.runtime.*;
import com.ast.mutable.Identifier;
%%
%class Lexer
%unicode
%cup
%line
%column
%{
StringBuffer string = 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
InputCharacter = [^\r\n]
WhiteSpace = {LineTerminator} | [ \t\f]
Comment = {EndOfLineComment}
EndOfLineComment = "//" {InputCharacter}* {LineTerminator}?
Identifier = [a-zA-Z][a-zA-Z0-9]*
DecIntegerLiteral = 0 | [1-9][0-9]*
DoubleLiteral = (0|[1-9][0-9]*)\.[0-9]+
CharLiteral = "'" [a-zA-Z0-9] "'"
BoolLiteral = (true|false)
%%
<YYINITIAL> {
{WhiteSpace} { /* Ignore */ }
{Comment} { /* Ignore */ }
"*" { return symbol(Symbols.TIMES); }
"double" { return symbol(Symbols.DOUBLE_TYPE); }
"char" { return symbol(Symbols.CHARACTER_TYPE); }
"if" { return symbol(Symbols.IF); }
"while" { return symbol(Symbols.WHILE); }
"return" { return symbol(Symbols.RETURN); }
"input" { return symbol(Symbols.INPUT); }
"output" { return symbol(Symbols.OUTPUT); }
";" { return symbol(Symbols.SEMICOLON); }
"+" { return symbol(Symbols.PLUS); }
")" { return symbol(Symbols.RPAREN); }
"%" { return symbol(Symbols.MODULO); }
"(" { return symbol(Symbols.LPAREN); }
"," { return symbol(Symbols.COMMA); }
"int" { return symbol(Symbols.INTEGER_TYPE); }
"/" { return symbol(Symbols.DIVIDE); }
"-" { return symbol(Symbols.MINUS); }
"{" { return symbol(Symbols.LBRACE); }
"}" { return symbol(Symbols.RBRACE); }
"=" { return symbol(Symbols.EQUALS); }
"&&" { return symbol(Symbols.LOG_AND); }
"||" { return symbol(Symbols.LOG_OR); }
"!" { return symbol(Symbols.LOG_NOT); }
"==" { return symbol(Symbols.EQUALS); }
"<" { return symbol(Symbols.LESS_THAN); }
"<=" { return symbol(Symbols.LESS_THAN_EQUALS); }
"!=" { return symbol(Symbols.NOT_EQUALS); }
{DecIntegerLiteral} { return symbol(Symbols.INTEGER_LITERAL, Integer.parseInt(yytext())); }
{DoubleLiteral} { return symbol(Symbols.DOUBLE_LITERAL, Double.parseDouble(yytext())); }
{CharLiteral} { return symbol(Symbols.CHARACTER_LITERAL, yytext().charAt(0)); }
{BoolLiteral} { return symbol(Symbols.BOOLEAN_LITERAL, Boolean.parseBoolean(yytext())); }
{Identifier} { return symbol(Symbols.IDENTIFIER, new Identifier(yyline, yycolumn, yytext())); }
}
[^] { throw new Error("Illegal character <" + yytext() + ">"); }