-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathscript.l
More file actions
executable file
·149 lines (136 loc) · 3.86 KB
/
script.l
File metadata and controls
executable file
·149 lines (136 loc) · 3.86 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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
%{
#include <ctype.h>
#include <stdio.h>
#include <string.h>
#include "parser.hpp"
using Instruction= Interpreter::Instruction;
#include "script.tab.hpp"
#define YY_DECL int yylex(Interpreter::Parser * parser)
/* 一个功能性函数-都要加 */
extern "C" {
int yywrap(void)
{
return 1;
}
}
%}
%option yylineno
%start COMMENT STRING_LITERAL_STATE
%%
<INITIAL>"func" return FUNCTION;
<INITIAL>"for" return FOR;
<INITIAL>"if" return IF;
<INITIAL>"else if" return ELIF;
<INITIAL>"else" return ELSE;
<INITIAL>"+" return ADD;
<INITIAL>"-" return SUB;
<INITIAL>"*" return MUL;
<INITIAL>"/" return DIV;
<INITIAL>"=" return ASSIGN;
<INITIAL>"==" return EQ;
<INITIAL>"!=" return NE;
<INITIAL>">" return GT;
<INITIAL>">=" return GE;
<INITIAL>"<" return LT;
<INITIAL>"<=" return LE;
<INITIAL>"(" return LP;
<INITIAL>")" return RP;
<INITIAL>"{" return LC;
<INITIAL>"}" return RC;
<INITIAL>";" return SEMICOLON;
<INITIAL>"break" return BREAK;
<INITIAL>"continue" return CONTINUE;
<INITIAL>"return" return RETURN;
<INITIAL>"," return COMMA;
<INITIAL>"var" return VAR;
<INITIAL>"%" return MOD;
<INITIAL>"+=" return ADDASSIGN;
<INITIAL>"-=" return SUBASSIGN;
<INITIAL>"*=" return MULASSIGN;
<INITIAL>"/=" return DIVASSIGN;
<INITIAL>"++" return INC;
<INITIAL>"--" return DEC;
<INITIAL>"!" return NOT;
<INITIAL>"[" return LB;
<INITIAL>"]" return RB;
<INITIAL>":" return COLON;
<INITIAL>"in" return IN;
<INITIAL>"switch" return SWITCH;
<INITIAL>"case" return CASE;
<INITIAL>"default" return DEFAULT;
<INITIAL>"|" return BOR;
<INITIAL>"&" return BAND;
<INITIAL>"^" return BXOR;
<INITIAL>"~" return BNG;
<INITIAL>"<<" return LSHIFT;
<INITIAL>">>" return RSHIFT;
<INITIAL>"|=" return BORASSIGN;
<INITIAL>"&=" return BANDASSIGN;
<INITIAL>"^=" return BXORASSIGN;
<INITIAL>"<<=" return LSHIFTASSIGN;
<INITIAL>">>=" return RSHIFTASSIGN;
<INITIAL>"||" return OR;
<INITIAL>"&&" return AND;
<INITIAL>"." return POINT;
<INITIAL>[A-Za-z_][A-Za-z_0-9]* {
yylval.identifier = parser->CreateString(yytext);
return IDENTIFIER;
}
<INITIAL>([1-9][0-9]*)|"0" {
yylval.value_integer = strtoll(yytext,NULL,10);
return INT_LITERAL;
}
<INITIAL>0[xX][0-9a-fA-F]+ {
yylval.value_integer = strtoll(yytext+2,NULL,16);
return INT_LITERAL;
}
<INITIAL>[0-9]+\.[0-9]+ {
double temp;
sscanf(yytext, "%lf", &temp);
yylval.value_double = temp;
return DOUBLE_LITERAL;
}
<INITIAL>'[a-zA-Z]' {
yylval.value_integer = yytext[1];
return INT_LITERAL;
}
<INITIAL>\" {
parser->StartScanningString();
BEGIN STRING_LITERAL_STATE;
}
<INITIAL>\n ;
<INITIAL>[ \t] ;
<INITIAL># BEGIN COMMENT;
<INITIAL>. {
//error
char buf[1024];
if (isprint(yytext[0])) {
buf[0] = yytext[0];
buf[1] = '\0';
} else {
sprintf(buf, "0x%02x", (unsigned char)yytext[0]);
}
printf("meet:%s %d",buf,yylineno);
abort();
}
<COMMENT>\n {
BEGIN INITIAL;
}
<COMMENT>. ;
<STRING_LITERAL_STATE>\" {
yylval.identifier = parser->FinishScanningString();
BEGIN INITIAL;
return STRING_LITERAL;
}
<STRING_LITERAL_STATE>\n {
parser->AppendToScanningString('\n');
}
<STRING_LITERAL_STATE>\\r {
parser->AppendToScanningString('\r');
}
<STRING_LITERAL_STATE>\\\" parser->AppendToScanningString('"');
<STRING_LITERAL_STATE>\\n parser->AppendToScanningString('\n');
<STRING_LITERAL_STATE>\\t parser->AppendToScanningString('\t');
<STRING_LITERAL_STATE>\\\\ parser->AppendToScanningString('\\');
<STRING_LITERAL_STATE>. parser->AppendToScanningString(yytext[0]);
%%