-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathscanner.l
85 lines (79 loc) · 2.39 KB
/
scanner.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
/* scanner for a toy C language */
%{
/*
flex -o src/scanner.c src/scanner.l
gcc -g -o src/parser src/scanner.c -ll
./src/parser < test/input.c--
*/
#include <stdlib.h>
#include "node.h"
#include "analyzer.tab.h"
void yyerror(char *);
int row_cnt = 0;
int col_cnt = 0;
%}
INTEGER [0-9]+
FLOAT ([1-9][0-9]*)|0|([0-9]+\.[0-9]*)
ID [_|A-Za-z]+(_|[A-Za-z]|[0-9])*
HD #include<*.*>
AT \/\*(.*)\*\/
DM ,|;|\(|\)|\{|\}|\[|\]|\'|\"|<|>
STR \".*?\"|\'.*?\'
%%
[\n] {
row_cnt ++;
}
{HD} {} /* 系统保留字单独定义 */
"main" return FUN;
return INT;
"double" return DOUBLE;
"int" return INT;
"void" return VOID;
"cin" return CIN;
">>" return TO_RIGHT;
"cout" return COUT;
"<<" return TO_LEFT;
">=" return GE;
"<=" return LE;
"==" return EQ;
"!=" return NE;
"&&" return AND;
"||" return OR;
"while" return WHILE;
"if" return IF;
"else" return ELSE;
{ID} {
varNode * vp = searchVarTab(yytext);
if (vp == 0)
vp = insertVarTab(yytext);
yylval.tptr = vp;
return VAR;
} /* 每遇到一个标识符就存入变量表 */
{INTEGER} {
yylval.val = atof(yytext);
return NUM;
}/*...*/
{FLOAT} {
yylval.val = atof(yytext);
return NUM;
}
[()<>=+\-/\*\;\{\}] return *yytext;
[ \t]+ /* eat up whitespace */
. printf( "Unrecognized character: %s\n", yytext );
%%
varNode * insertVarTab (char * var_name)
{
varNode *vp;
vp = (varNode *) malloc (sizeof (varNode));
vp->name = (char *) malloc (strlen (var_name) + 1); strcpy (vp->name, var_name);
// vp->type = VAR;
vp->value = 0; // 所有变量的默认值都是0
/* 头插进变量表 */
vp->next = (struct varNode *)var_table;
var_table = vp;
var_cnt ++;
return vp;
}
int yywrap(void) {
return 1;
}