-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathlex.l
76 lines (67 loc) · 1.92 KB
/
lex.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
%{
#include "parser.tab.h"
#include "string.h"
#include "def.h"
int yycolumn=1;
#define YY_USER_ACTION yylloc.first_line=yylloc.last_line=yylineno; \
yylloc.first_column=yycolumn; yylloc.last_column=yycolumn+yyleng-1; yycolumn+=yyleng;
typedef union {
char type_char;
int type_int;
float type_float;
char type_id[32];
struct node *ptr;
} YYLVAL;
#define YYSTYPE YYLVAL
%}
%option yylineno
id [A-Za-z][A-Za-z0-9]*
int [0-9]+
float ([0-9]*\.[0-9]+)|([0-9]+\.)
char \'[^\n]\'
%%
{int} {yylval.type_int=atoi(yytext);return INT;}
{float} {yylval.type_float=atof(yytext);return FLOAT;}
{char} {yylval.type_char=yytext[1];return CHAR;}
"int" {strcpy(yylval.type_id, yytext);return TYPE;}
"float" {strcpy(yylval.type_id, yytext);return TYPE;}
"char" {strcpy(yylval.type_id, yytext);return TYPE;}
"return" {return RETURN;}
"if" {return IF;}
"else" {return ELSE;}
"while" {return WHILE;}
"for" {return FOR;}
"break" {return BREAK;}
"continue" {return CONTINUE;}
{id} {strcpy(yylval.type_id, yytext);return ID;}/*由于关键字的形式也符合表示符的规则,所以把关键字的处理全部放在标识符的前面,优先识别*/
"//"[^\n]* {}
"/*"([^\*^\/]*|[\*^\/*]*|[^\**\/]*)*"*/" {}
";" {return SEMI;}
"," {return COMMA;}
">"|"<"|">="|"<="|"=="|"!=" {strcpy(yylval.type_id, yytext);return RELOP;}
"+=" {return PLUSEQ;}
"-=" {return MINUSEQ;}
"*=" {return STAREQ;}
"/=" {return DIVEQ;}
"++" {return INC;}
"--" {return DEC;}
"=" {return ASSIGNOP;}
"+" {return PLUS;}
"-" {return MINUS;}
"*" {return STAR;}
"/" {return DIV;}
"&&" {return AND;}
"||" {return OR;}
"!" {return NOT;}
"(" {return LP;}
")" {return RP;}
"{" {return LC;}
"}" {return RC;}
[\n] {yycolumn=1;}
[ \r\t] {}
. {printf("Error type A :Mysterious character \"%s\"\n\t at Line %d\n",yytext,yylineno);}
%%
int yywrap()
{
return 1;
}