Skip to content

Commit b92d90e

Browse files
committed
JSIL uses newlines to separate instructions
1 parent 2803ab8 commit b92d90e

File tree

2 files changed

+97
-73
lines changed

2 files changed

+97
-73
lines changed

src/jsil/parser.y

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ extern char *yyjsiltext;
2323
/*** special scanner reports ***/
2424

2525
%token TOK_SCANNER_ERROR /* used by scanner to report errors */
26+
%token TOK_NEWLINE "<newline>"
2627

2728
/*** keywords ***/
2829

@@ -202,11 +203,11 @@ statements: statement
202203
}
203204
;
204205

205-
statement: ';'
206+
statement: TOK_NEWLINE
206207
{
207208
newstack($$)=code_skipt();
208209
}
209-
| instruction ';'
210+
| instruction TOK_NEWLINE
210211
{
211212
$$=$1;
212213
}

src/jsil/scanner.l

Lines changed: 94 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
%option nounput
22
%option noinput
3+
%option stack
34

45
%{
56
#ifdef _WIN32
@@ -60,6 +61,7 @@ string_lit ["]{s_char}*["]
6061
%x COMMENT
6162
%x STRING_LITERAL
6263
%x STRING_LITERAL_COMMENT
64+
%x STATEMENTS
6365

6466
%{
6567
void jsil_scanner_init()
@@ -78,10 +80,16 @@ void jsil_scanner_init()
7880
yyless(0); /* start again with this character */
7981
}
8082

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+
}
8290

8391
<COMMENT>{
84-
"*/" { BEGIN(GRAMMAR); } /* end comment state, back to GRAMMAR */
92+
"*/" { yy_pop_state(); } /* end comment state, back to GRAMMAR */
8593
"/*" { yyjsilerror("Probably nested comments"); }
8694
<<EOF>> { yyjsilerror("Unterminated comment"); return TOK_SCANNER_ERROR; }
8795
[^*/\n]* { } /* ignore every char except '*' and NL (performance!) */
@@ -90,41 +98,101 @@ void jsil_scanner_init()
9098
}
9199

92100
<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 */
94102
"/*" { yyjsilerror("Probably nested comments"); }
95103
<<EOF>> { yyjsilerror("Unterminated comment"); return TOK_SCANNER_ERROR; }
96104
[^*/\n]* { } /* ignore every char except '*' and NL (performance!) */
97105
. { } /* all single characters within comments are ignored */
98106
\n { }
99107
}
100108

101-
<GRAMMAR>{
109+
<STATEMENTS>{
102110
{string_lit} {
103111
PARSER.string_literal.clear();
104112
PARSER.string_literal.append(yytext);
105113
newstack(yyjsillval);
106114
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);
110117
}
111118
}
112119

113120
<STRING_LITERAL>{
114121
{string_lit} { PARSER.string_literal.append(yytext); }
115-
{newline} { } /* ignore */
116122
{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
119125
source_locationt l=stack(yyjsillval).source_location();
120126
stack(yyjsillval)=convert_string_literal(PARSER.string_literal);
121127
stack(yyjsillval).add_source_location().swap(l);
122-
BEGIN(GRAMMAR); // back to normal
128+
yy_pop_state(); // back to normal
123129
yyless(0); // put back
124130
return TOK_STRING;
125131
}
126132
}
127133

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+
128196
<GRAMMAR>{
129197
{newline} { } /* skipped */
130198
{whitespace} { } /* skipped */
@@ -135,6 +203,20 @@ void jsil_scanner_init()
135203
"returns" { loc(); return TOK_RETURNS; }
136204
"to" { loc(); return TOK_TO; }
137205
"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+
138220
"eval" { loc(); return TOK_EVAL; }
139221
"label" { loc(); return TOK_LABEL; }
140222
"goto" { loc(); return TOK_GOTO; }
@@ -246,66 +328,7 @@ void jsil_scanner_init()
246328
"#lap" { make_identifier(); return TOK_BUILTIN_LOC; }
247329
"#ljson" { make_identifier(); return TOK_BUILTIN_LOC; }
248330
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 '}'; }
309332
/* This catches all one-character operators */
310333
. { loc(); return yytext[0]; }
311334
}

0 commit comments

Comments
 (0)