-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtiger.lex
84 lines (78 loc) · 2.55 KB
/
tiger.lex
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
%{
#include <string.h>
#include <stdlib.h>
#include "util.h"
#include "errormsg.h"
#include "symbol.h"
#include "absyn.h"
#include "y.tab.h"
int charPos=1;
int yywrap(void)
{
charPos=1;
return 1;
}
extern int rowPos;
extern int colPos;
void adjust(void)
{
EM_tokPos=charPos;
charPos+=yyleng;
colPos+=yyleng;
}
%}
%x COMMENT
BLANK ([ \t\r\a]+)
ID ([_a-zA-Z][_a-zA-Z0-9]*)
STRING (\042[^\042\n]*\042)
%%
{BLANK} {adjust(); continue;}
\n {adjust(); EM_newline(); continue;}
"," {adjust(); return COMMA;}
":" {adjust(); return COLON;}
";" {adjust(); return SEMICOLON;}
"(" {adjust(); return LPAREN;}
")" {adjust(); return RPAREN;}
"[" {adjust(); return LBRACK;}
"]" {adjust(); return RBRACK;}
"{" {adjust(); return LBRACE;}
"}" {adjust(); return RBRACE;}
"." {adjust(); return DOT;}
"+" {adjust(); return PLUS;}
"-" {adjust(); return MINUS;}
"*" {adjust(); return TIMES;}
"/" {adjust(); return DIVIDE;}
"=" {adjust(); return EQ;}
"<>" {adjust(); return NEQ;}
"<" {adjust(); return LT;}
"<=" {adjust(); return LE;}
">" {adjust(); return GT;}
">=" {adjust(); return GE;}
"&" {adjust(); return AND;}
"|" {adjust(); return OR;}
":=" {adjust(); return ASSIGN;}
"array" {adjust(); return ARRAY;}
"if" {adjust(); return IF;}
"then" {adjust(); return THEN;}
"else" {adjust(); return ELSE;}
"while" {adjust(); return WHILE;}
"for" {adjust(); return FOR;}
"to" {adjust(); return TO;}
"do" {adjust(); return DO;}
"let" {adjust(); return LET;}
"in" {adjust(); return IN;}
"end" {adjust(); return END;}
"of" {adjust(); return OF;}
"break" {adjust(); return BREAK;}
"nil" {adjust(); return NIL;}
"function" {adjust(); return FUNCTION;}
"var" {adjust(); return VAR;}
"type" {adjust(); return TYPE;}
[0-9]+ {adjust(); yylval.ival=atoi(yytext); return INT;}
{ID} {adjust(); yylval.sval=String(yytext); return ID;}
{STRING} {adjust(); yylval.sval=String(yytext); return STRING;}
<INITIAL>"/**" {adjust(); BEGIN(COMMENT); return CMT;}
<COMMENT>. {adjust();}
<COMMENT>"**/" {adjust(); BEGIN(INITIAL);}
<<EOF>> {return 0;}
. {adjust(); EM_error(EM_tokPos,"illegal token");}