1
1
%option nounput
2
2
%option noinput
3
+ %option stack
3
4
4
5
%{
5
6
#ifdef _WIN32
@@ -60,6 +61,7 @@ string_lit ["]{s_char}*["]
60
61
%x COMMENT
61
62
%x STRING_LITERAL
62
63
%x STRING_LITERAL_COMMENT
64
+ %x STATEMENTS
63
65
64
66
%{
65
67
void jsil_scanner_init ()
@@ -78,10 +80,16 @@ void jsil_scanner_init()
78
80
yyless (0 ); /* start again with this character */
79
81
}
80
82
81
- <GRAMMAR >" /*" { BEGIN (COMMENT); } /* begin comment state */
83
+ <GRAMMAR ,STATEMENTS >{
84
+ "/*" {
85
+ yy_push_state(COMMENT); /* begin comment state */
86
+ // make the compiler happy
87
+ (void )yy_top_state();
88
+ }
89
+ }
82
90
83
91
<COMMENT >{
84
- "*/" { BEGIN (GRAMMAR ); } /* end comment state, back to GRAMMAR */
92
+ "*/" { yy_pop_state ( ); } /* end comment state, back to GRAMMAR */
85
93
"/*" { yyjsilerror("Probably nested comments"); }
86
94
<<EOF>> { yyjsilerror("Unterminated comment"); return TOK_SCANNER_ERROR; }
87
95
[^*/ \n]* { } /* ignore every char except '*' and NL (performance!) */
@@ -90,41 +98,101 @@ void jsil_scanner_init()
90
98
}
91
99
92
100
<STRING_LITERAL_COMMENT >{
93
- "*/" { BEGIN (STRING_LITERAL ); } /* end comment state, back to STRING_LITERAL */
101
+ "*/" { yy_pop_state ( ); } /* end comment state, back to STRING_LITERAL */
94
102
"/*" { yyjsilerror("Probably nested comments"); }
95
103
<<EOF>> { yyjsilerror("Unterminated comment"); return TOK_SCANNER_ERROR; }
96
104
[^*/ \n]* { } /* ignore every char except '*' and NL (performance!) */
97
105
. { } /* all single characters within comments are ignored */
98
106
\n { }
99
107
}
100
108
101
- <GRAMMAR >{
109
+ <STATEMENTS >{
102
110
{string_lit} {
103
111
PARSER.string_literal .clear ();
104
112
PARSER.string_literal .append (yytext);
105
113
newstack (yyjsillval);
106
114
PARSER.set_source_location (stack (yyjsillval));
107
- // String literals can be continued in
108
- // the next line
109
- BEGIN (STRING_LITERAL);
115
+ // String literals can be continued
116
+ yy_push_state (STRING_LITERAL);
110
117
}
111
118
}
112
119
113
120
<STRING_LITERAL >{
114
121
{string_lit} { PARSER.string_literal .append (yytext); }
115
- {newline} { } /* ignore */
116
122
{whitespace} { } /* ignore */
117
- "/*" { BEGIN (STRING_LITERAL_COMMENT); } /* C comment, ignore */
118
- . { // anything else: back to normal
123
+ "/*" { yy_push_state (STRING_LITERAL_COMMENT); } /* C comment, ignore */
124
+ {newline}|. { // anything else: back to normal
119
125
source_locationt l=stack (yyjsillval).source_location ();
120
126
stack (yyjsillval)=convert_string_literal (PARSER.string_literal );
121
127
stack (yyjsillval).add_source_location ().swap (l);
122
- BEGIN (GRAMMAR ); // back to normal
128
+ yy_pop_state ( ); // back to normal
123
129
yyless (0 ); // put back
124
130
return TOK_STRING;
125
131
}
126
132
}
127
133
134
+ <GRAMMAR ,STATEMENTS >{
135
+ "#global_is_nan" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
136
+ "#global_is_finite" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
137
+ "#boolean_call" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
138
+ "#boolean_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
139
+ "#boolean_prototype_to_string" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
140
+ "#boolean_prototype_value_of" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
141
+ "#object_call" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
142
+ "#object_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
143
+ "#object_prototype_to_string" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
144
+ "#object_prototype_value_of" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
145
+ "#object_prototype_is_prototype_of" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
146
+ "#object_get_prototype_of" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
147
+ "#number_call" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
148
+ "#number_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
149
+ "#number_prototype_to_string" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
150
+ "#number_prototype_value_of" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
151
+ "#string_call" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
152
+ "#string_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
153
+ "#string_prototype_to_string" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
154
+ "#string_prototype_value_of" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
155
+ "#error_call_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
156
+ "#terror_call_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
157
+ "#rerror_call_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
158
+ "#serror_call_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
159
+ "#evalerror_call_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
160
+ "#rangeerror_call_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
161
+ "#urierror_call_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
162
+ "#function_call" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
163
+ "#function_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
164
+ "#function_protottype_call" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
165
+ "#array_call" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
166
+ "#array_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
167
+
168
+ "#[[GetOwnPropertyDefault]]" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
169
+ "#[[GetOwnPropertyString]]" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
170
+ "#GetValue" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
171
+ "#PutValue" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
172
+ "#[[Get]]" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
173
+ "#[[GetDefault]]" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
174
+ "#[[GetFunction]]" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
175
+ "#[[Put]]" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
176
+ "#[[HasProperty]]" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
177
+ "#[[DefaultValue]]" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
178
+ "#[[DefineOwnPropery]]" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
179
+ "#[[DefineOwnProperyDefault]]" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
180
+ "#[[DefineOwnProperyArray]]" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
181
+ "#ToPrimitive" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
182
+ "#ToBoolean" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
183
+ "#ToNumber" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
184
+ "#ToNumberPrim" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
185
+ "#ToUint32" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
186
+ "#ToString" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
187
+ "#ToStringPrim" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
188
+ "#ToObject" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
189
+ "#CheckObjectCoercible" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
190
+ "#IsCallable" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
191
+ "#AbstractRelation" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
192
+ "#StrictEquality" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
193
+ "#StrictEqualitySameType" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
194
+ }
195
+
128
196
<GRAMMAR >{
129
197
{newline} { } /* skipped */
130
198
{whitespace} { } /* skipped */
@@ -135,6 +203,20 @@ void jsil_scanner_init()
135
203
"returns" { loc (); return TOK_RETURNS; }
136
204
"to" { loc (); return TOK_TO; }
137
205
"throws" { loc (); return TOK_THROWS; }
206
+
207
+ /*** scanner parsed tokens (these have a value!) ***/
208
+
209
+ {identifier} { return make_identifier (); }
210
+
211
+ "{" { loc(); BEGIN(STATEMENTS); return '{'; }
212
+ /* This catches all one-character operators */
213
+ . { loc(); return yytext[0]; }
214
+ }
215
+
216
+ <STATEMENTS>{
217
+ {newline} { loc(); return TOK_NEWLINE; }
218
+ {whitespace} { } /* skipped */
219
+
138
220
" eval" { loc(); return TOK_EVAL; }
139
221
" label" { loc(); return TOK_LABEL; }
140
222
" goto " { loc(); return TOK_GOTO; }
@@ -246,66 +328,7 @@ void jsil_scanner_init()
246
328
" #lap" { make_identifier(); return TOK_BUILTIN_LOC; }
247
329
" #ljson" { make_identifier(); return TOK_BUILTIN_LOC; }
248
330
249
- "#global_is_nan" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
250
- "#global_is_finite" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
251
- "#boolean_call" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
252
- "#boolean_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
253
- "#boolean_prototype_to_string" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
254
- "#boolean_prototype_value_of" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
255
- "#object_call" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
256
- "#object_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
257
- "#object_prototype_to_string" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
258
- "#object_prototype_value_of" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
259
- "#object_prototype_is_prototype_of" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
260
- "#object_get_prototype_of" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
261
- "#number_call" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
262
- "#number_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
263
- "#number_prototype_to_string" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
264
- "#number_prototype_value_of" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
265
- "#string_call" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
266
- "#string_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
267
- "#string_prototype_to_string" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
268
- "#string_prototype_value_of" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
269
- "#error_call_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
270
- "#terror_call_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
271
- "#rerror_call_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
272
- "#serror_call_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
273
- "#evalerror_call_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
274
- "#rangeerror_call_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
275
- "#urierror_call_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
276
- "#function_call" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
277
- "#function_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
278
- "#function_protottype_call" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
279
- "#array_call" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
280
- "#array_construct" { make_identifier (); return TOK_BUILTIN_IDENTIFIER; }
281
-
282
- "#[[GetOwnPropertyDefault]]" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
283
- "#[[GetOwnPropertyString]]" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
284
- "#GetValue" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
285
- "#PutValue" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
286
- "#[[Get]]" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
287
- "#[[GetDefault]]" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
288
- "#[[GetFunction]]" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
289
- "#[[Put]]" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
290
- "#[[HasProperty]]" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
291
- "#[[DefaultValue]]" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
292
- "#[[DefineOwnPropery]]" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
293
- "#[[DefineOwnProperyDefault]]" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
294
- "#[[DefineOwnProperyArray]]" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
295
- "#ToPrimitive" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
296
- "#ToBoolean" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
297
- "#ToNumber" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
298
- "#ToNumberPrim" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
299
- "#ToUint32" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
300
- "#ToString" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
301
- "#ToStringPrim" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
302
- "#ToObject" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
303
- "#CheckObjectCoercible" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
304
- "#IsCallable" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
305
- "#AbstractRelation" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
306
- "#StrictEquality" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
307
- "#StrictEqualitySameType" { make_identifier (); return TOK_SPEC_IDENTIFIER; }
308
-
331
+ " }" { loc (); BEGIN (GRAMMAR); return ' }' ; }
309
332
/* This catches all one-character operators */
310
333
. { loc (); return yytext[0 ]; }
311
334
}
0 commit comments