-
Notifications
You must be signed in to change notification settings - Fork 4
/
spl.l
103 lines (98 loc) · 6.56 KB
/
spl.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
%{
#include "ast.h"
#include "parser.hpp"
#include <stdio.h>
#include <string>
extern "C" int yywrap() {return 1;}
%}
%%
[ \t\n] { ; }
\'.\' {
yylval.cVal = yytext[1];
return CHAR;
}
"(" { return LP; }
")" { return RP; }
"[" { return LB; }
"]" { return RB; }
".." { return DOTDOT; }
"." { return DOT; }
"," { return COMMA; }
":" { return COLON; }
"*" { return MUL; }
"/" { return DIV; }
"<>" { return UNEQUAL; }
"not" { return NOT; }
"+" { return PLUS; }
"-" { return MINUS; }
">=" { return GE; }
">" { return GT; }
"<=" { return LE; }
"<" { return LT; }
"=" { return EQUAL; }
":=" { return ASSIGN; }
"mod" { return MOD; }
";" { return SEMI; }
"and" { return AND; }
"array" { return ARRAY; }
"begin" { return TOKEN_BEGIN; }
"case" { return CASE; }
"const" { return CONST; }
"div" { return DIV; }
"do" { return DO; }
"downto" { return DOWNTO; }
"else" { return ELSE; }
"end" { return END; }
"for" { return FOR; }
"function" { return FUNCTION; }
"goto" { return GOTO; }
"if" { return IF; }
"of" { return OF; }
"or" { return OR; }
"procedure" { return PROCEDURE; }
"program" { return PROGRAM; }
"record" { return RECORD; }
"repeat" { return REPEAT; }
"then" { return THEN; }
"to" { return TO; }
"type" { return TYPE; }
"until" { return UNTIL; }
"var" { return VAR; }
"while" { return WHILE; }
"boolean"|"char"|"integer"|"real" {
yylval.sVal = new std::string(yytext, yyleng);
return SYS_TYPE;
}
"abs"|"chr"|"odd"|"ord"|"pred"|"sqr"|"sqrt"|"succ" {
yylval.sVal = new std::string(yytext, yyleng);
return SYS_FUNCT;
}
"false"|"maxint"|"true" {
yylval.sVal = new std::string(yytext, yyleng);
return SYS_CON;
}
"write"|"writeln" {
yylval.sVal = new std::string(yytext, yyleng);
return SYS_PROC;
}
"read" {
yylval.sVal = new std::string(yytext, yyleng);
return READ;
}
[a-zA-Z_][a-zA-Z0-9_]* {
yylval.sVal = new std::string(yytext, yyleng);
return IDENTIFIER;
}
[0-9]+\.[0-9]+ {
double dtmp;
sscanf(yytext, "%lf", &dtmp);
yylval.dVal = dtmp;
return REAL;
}
[0-9]+ {
int itmp; double tmp;
sscanf(yytext, "%d", &itmp);
yylval.iVal = itmp;
return INTEGER;
}
%%