push ac694015ba9a1d7cf8fc6346c6e51d4c35a62962
[wine/hacks.git] / dlls / jscript / parser.y
blob52a31c88a790aff76026958aa710fa7c2e044b94
1 /*
2 * Copyright 2008 Jacek Caban for CodeWeavers
4 * This library is free software; you can redistribute it and/or
5 * modify it under the terms of the GNU Lesser General Public
6 * License as published by the Free Software Foundation; either
7 * version 2.1 of the License, or (at your option) any later version.
9 * This library is distributed in the hope that it will be useful,
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 * Lesser General Public License for more details.
14 * You should have received a copy of the GNU Lesser General Public
15 * License along with this library; if not, write to the Free Software
16 * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
21 #include "jscript.h"
22 #include "engine.h"
24 #define YYLEX_PARAM ctx
25 #define YYPARSE_PARAM ctx
27 static int parser_error(const char*);
28 static BOOL allow_auto_semicolon(parser_ctx_t*);
29 static void program_parsed(parser_ctx_t*,source_elements_t*);
30 static source_elements_t *function_body_parsed(parser_ctx_t*,source_elements_t*);
32 typedef struct _statement_list_t {
33 statement_t *head;
34 statement_t *tail;
35 } statement_list_t;
37 static literal_t *new_string_literal(parser_ctx_t*,const WCHAR*);
38 static literal_t *new_null_literal(parser_ctx_t*);
39 static literal_t *new_undefined_literal(parser_ctx_t*);
40 static literal_t *new_boolean_literal(parser_ctx_t*,VARIANT_BOOL);
42 typedef struct _property_list_t {
43 prop_val_t *head;
44 prop_val_t *tail;
45 } property_list_t;
47 static property_list_t *new_property_list(parser_ctx_t*,literal_t*,expression_t*);
48 static property_list_t *property_list_add(parser_ctx_t*,property_list_t*,literal_t*,expression_t*);
50 typedef struct _element_list_t {
51 array_element_t *head;
52 array_element_t *tail;
53 } element_list_t;
55 static element_list_t *new_element_list(parser_ctx_t*,int,expression_t*);
56 static element_list_t *element_list_add(parser_ctx_t*,element_list_t*,int,expression_t*);
58 typedef struct _argument_list_t {
59 argument_t *head;
60 argument_t *tail;
61 } argument_list_t;
63 static argument_list_t *new_argument_list(parser_ctx_t*,expression_t*);
64 static argument_list_t *argument_list_add(parser_ctx_t*,argument_list_t*,expression_t*);
66 typedef struct _case_list_t {
67 case_clausule_t *head;
68 case_clausule_t *tail;
69 } case_list_t;
71 static catch_block_t *new_catch_block(parser_ctx_t*,const WCHAR*,statement_t*);
72 static case_clausule_t *new_case_clausule(parser_ctx_t*,expression_t*,statement_list_t*);
73 static case_list_t *new_case_list(parser_ctx_t*,case_clausule_t*);
74 static case_list_t *case_list_add(parser_ctx_t*,case_list_t*,case_clausule_t*);
75 static case_clausule_t *new_case_block(parser_ctx_t*,case_list_t*,case_clausule_t*,case_list_t*);
77 typedef struct _variable_list_t {
78 variable_declaration_t *head;
79 variable_declaration_t *tail;
80 } variable_list_t;
82 static variable_declaration_t *new_variable_declaration(parser_ctx_t*,const WCHAR*,expression_t*);
83 static variable_list_t *new_variable_list(parser_ctx_t*,variable_declaration_t*);
84 static variable_list_t *variable_list_add(parser_ctx_t*,variable_list_t*,variable_declaration_t*);
86 static statement_t *new_block_statement(parser_ctx_t*,statement_list_t*);
87 static statement_t *new_var_statement(parser_ctx_t*,variable_list_t*);
88 static statement_t *new_empty_statement(parser_ctx_t*);
89 static statement_t *new_expression_statement(parser_ctx_t*,expression_t*);
90 static statement_t *new_if_statement(parser_ctx_t*,expression_t*,statement_t*,statement_t*);
91 static statement_t *new_while_statement(parser_ctx_t*,BOOL,expression_t*,statement_t*);
92 static statement_t *new_for_statement(parser_ctx_t*,variable_list_t*,expression_t*,expression_t*,
93 expression_t*,statement_t*);
94 static statement_t *new_forin_statement(parser_ctx_t*,variable_declaration_t*,expression_t*,expression_t*,statement_t*);
95 static statement_t *new_continue_statement(parser_ctx_t*,const WCHAR*);
96 static statement_t *new_break_statement(parser_ctx_t*,const WCHAR*);
97 static statement_t *new_return_statement(parser_ctx_t*,expression_t*);
98 static statement_t *new_with_statement(parser_ctx_t*,expression_t*,statement_t*);
99 static statement_t *new_labelled_statement(parser_ctx_t*,const WCHAR*,statement_t*);
100 static statement_t *new_switch_statement(parser_ctx_t*,expression_t*,case_clausule_t*);
101 static statement_t *new_throw_statement(parser_ctx_t*,expression_t*);
102 static statement_t *new_try_statement(parser_ctx_t*,statement_t*,catch_block_t*,statement_t*);
104 struct statement_list_t {
105 statement_t *head;
106 statement_t *tail;
109 static statement_list_t *new_statement_list(parser_ctx_t*,statement_t*);
110 static statement_list_t *statement_list_add(statement_list_t*,statement_t*);
112 typedef struct _parameter_list_t {
113 parameter_t *head;
114 parameter_t *tail;
115 } parameter_list_t;
117 static parameter_list_t *new_parameter_list(parser_ctx_t*,const WCHAR*);
118 static parameter_list_t *parameter_list_add(parser_ctx_t*,parameter_list_t*,const WCHAR*);
120 static void push_func(parser_ctx_t*);
121 static inline void pop_func(parser_ctx_t *ctx)
123 ctx->func_stack = ctx->func_stack->next;
126 static expression_t *new_function_expression(parser_ctx_t*,const WCHAR*,parameter_list_t*,
127 source_elements_t*,const WCHAR*,DWORD);
128 static expression_t *new_binary_expression(parser_ctx_t*,expression_type_t,expression_t*,expression_t*);
129 static expression_t *new_unary_expression(parser_ctx_t*,expression_type_t,expression_t*);
130 static expression_t *new_conditional_expression(parser_ctx_t*,expression_t*,expression_t*,expression_t*);
131 static expression_t *new_array_expression(parser_ctx_t*,expression_t*,expression_t*);
132 static expression_t *new_member_expression(parser_ctx_t*,expression_t*,const WCHAR*);
133 static expression_t *new_new_expression(parser_ctx_t*,expression_t*,argument_list_t*);
134 static expression_t *new_call_expression(parser_ctx_t*,expression_t*,argument_list_t*);
135 static expression_t *new_this_expression(parser_ctx_t*);
136 static expression_t *new_identifier_expression(parser_ctx_t*,const WCHAR*);
137 static expression_t *new_literal_expression(parser_ctx_t*,literal_t*);
138 static expression_t *new_array_literal_expression(parser_ctx_t*,element_list_t*,int);
139 static expression_t *new_prop_and_value_expression(parser_ctx_t*,property_list_t*);
141 static source_elements_t *new_source_elements(parser_ctx_t*);
142 static source_elements_t *source_elements_add_statement(source_elements_t*,statement_t*);
146 %pure_parser
147 %start Program
149 %union {
150 int ival;
151 const WCHAR *srcptr;
152 LPCWSTR wstr;
153 literal_t *literal;
154 struct _argument_list_t *argument_list;
155 case_clausule_t *case_clausule;
156 struct _case_list_t *case_list;
157 catch_block_t *catch_block;
158 struct _element_list_t *element_list;
159 expression_t *expr;
160 const WCHAR *identifier;
161 struct _parameter_list_t *parameter_list;
162 struct _property_list_t *property_list;
163 source_elements_t *source_elements;
164 statement_t *statement;
165 struct _statement_list_t *statement_list;
166 struct _variable_list_t *variable_list;
167 variable_declaration_t *variable_declaration;
170 /* keywords */
171 %token kBREAK kCASE kCATCH kCONTINUE kDEFAULT kDELETE kDO kELSE kIF kFINALLY kFOR kIN
172 %token kINSTANCEOF kNEW kNULL kUNDEFINED kRETURN kSWITCH kTHIS kTHROW kTRUE kFALSE kTRY kTYPEOF kVAR kVOID kWHILE kWITH
173 %token tANDAND tOROR tINC tDEC tHTMLCOMMENT
175 %token <srcptr> kFUNCTION '}'
177 /* tokens */
178 %token <identifier> tIdentifier
179 %token <ival> tAssignOper tEqOper tShiftOper tRelOper
180 %token <literal> tNumericLiteral
181 %token <wstr> tStringLiteral
183 %type <source_elements> SourceElements
184 %type <source_elements> FunctionBody
185 %type <statement> Statement
186 %type <statement> Block
187 %type <statement> VariableStatement
188 %type <statement> EmptyStatement
189 %type <statement> ExpressionStatement
190 %type <statement> IfStatement
191 %type <statement> IterationStatement
192 %type <statement> ContinueStatement
193 %type <statement> BreakStatement
194 %type <statement> ReturnStatement
195 %type <statement> WithStatement
196 %type <statement> LabelledStatement
197 %type <statement> SwitchStatement
198 %type <statement> ThrowStatement
199 %type <statement> TryStatement
200 %type <statement> Finally
201 %type <statement_list> StatementList StatementList_opt
202 %type <parameter_list> FormalParameterList FormalParameterList_opt
203 %type <expr> Expression Expression_opt
204 %type <expr> ExpressionNoIn ExpressionNoIn_opt
205 %type <expr> FunctionExpression
206 %type <expr> AssignmentExpression AssignmentExpressionNoIn
207 %type <expr> ConditionalExpression ConditionalExpressionNoIn
208 %type <expr> LeftHandSideExpression
209 %type <expr> LogicalORExpression LogicalORExpressionNoIn
210 %type <expr> LogicalANDExpression LogicalANDExpressionNoIn
211 %type <expr> BitwiseORExpression BitwiseORExpressionNoIn
212 %type <expr> BitwiseXORExpression BitwiseXORExpressionNoIn
213 %type <expr> BitwiseANDExpression BitwiseANDExpressionNoIn
214 %type <expr> EqualityExpression EqualityExpressionNoIn
215 %type <expr> RelationalExpression RelationalExpressionNoIn
216 %type <expr> ShiftExpression
217 %type <expr> AdditiveExpression
218 %type <expr> MultiplicativeExpression
219 %type <expr> Initialiser_opt Initialiser
220 %type <expr> InitialiserNoIn_opt InitialiserNoIn
221 %type <expr> UnaryExpression
222 %type <expr> PostfixExpression
223 %type <expr> NewExpression
224 %type <expr> CallExpression
225 %type <expr> MemberExpression
226 %type <expr> PrimaryExpression
227 %type <identifier> Identifier_opt
228 %type <variable_list> VariableDeclarationList
229 %type <variable_list> VariableDeclarationListNoIn
230 %type <variable_declaration> VariableDeclaration
231 %type <variable_declaration> VariableDeclarationNoIn
232 %type <case_list> CaseClausules CaseClausules_opt
233 %type <case_clausule> CaseClausule DefaultClausule CaseBlock
234 %type <catch_block> Catch
235 %type <argument_list> Arguments
236 %type <argument_list> ArgumentList
237 %type <literal> Literal
238 %type <expr> ArrayLiteral
239 %type <expr> ObjectLiteral
240 %type <ival> Elision Elision_opt
241 %type <element_list> ElementList
242 %type <property_list> PropertyNameAndValueList
243 %type <literal> PropertyName
244 %type <literal> BooleanLiteral
245 %type <srcptr> KFunction
247 %nonassoc LOWER_THAN_ELSE
248 %nonassoc kELSE
252 /* ECMA-262 3rd Edition 14 */
253 Program
254 : SourceElements HtmlComment
255 { program_parsed(ctx, $1); }
257 HtmlComment
258 : tHTMLCOMMENT {}
259 | /* empty */ {}
261 /* ECMA-262 3rd Edition 14 */
262 SourceElements
263 : /* empty */ { $$ = new_source_elements(ctx); }
264 | SourceElements Statement
265 { $$ = source_elements_add_statement($1, $2); }
267 /* ECMA-262 3rd Edition 13 */
268 FunctionExpression
269 : KFunction Identifier_opt '(' FormalParameterList_opt ')' '{' FunctionBody '}'
270 { $$ = new_function_expression(ctx, $2, $4, $7, $1, $8-$1+1); }
272 KFunction
273 : kFUNCTION { push_func(ctx); $$ = $1; }
275 /* ECMA-262 3rd Edition 13 */
276 FunctionBody
277 : SourceElements { $$ = function_body_parsed(ctx, $1); }
279 /* ECMA-262 3rd Edition 13 */
280 FormalParameterList
281 : tIdentifier { $$ = new_parameter_list(ctx, $1); }
282 | FormalParameterList ',' tIdentifier
283 { $$ = parameter_list_add(ctx, $1, $3); }
285 /* ECMA-262 3rd Edition 13 */
286 FormalParameterList_opt
287 : /* empty */ { $$ = NULL; }
288 | FormalParameterList { $$ = $1; }
290 /* ECMA-262 3rd Edition 12 */
291 Statement
292 : Block { $$ = $1; }
293 | VariableStatement { $$ = $1; }
294 | EmptyStatement { $$ = $1; }
295 | ExpressionStatement { $$ = $1; }
296 | IfStatement { $$ = $1; }
297 | IterationStatement { $$ = $1; }
298 | ContinueStatement { $$ = $1; }
299 | BreakStatement { $$ = $1; }
300 | ReturnStatement { $$ = $1; }
301 | WithStatement { $$ = $1; }
302 | LabelledStatement { $$ = $1; }
303 | SwitchStatement { $$ = $1; }
304 | ThrowStatement { $$ = $1; }
305 | TryStatement { $$ = $1; }
307 /* ECMA-262 3rd Edition 12.2 */
308 StatementList
309 : Statement { $$ = new_statement_list(ctx, $1); }
310 | StatementList Statement
311 { $$ = statement_list_add($1, $2); }
313 /* ECMA-262 3rd Edition 12.2 */
314 StatementList_opt
315 : /* empty */ { $$ = NULL; }
316 | StatementList { $$ = $1; }
318 /* ECMA-262 3rd Edition 12.1 */
319 Block
320 : '{' StatementList '}' { $$ = new_block_statement(ctx, $2); }
321 | '{' '}' { $$ = new_block_statement(ctx, NULL); }
323 /* ECMA-262 3rd Edition 12.2 */
324 VariableStatement
325 : kVAR VariableDeclarationList semicolon_opt
326 { $$ = new_var_statement(ctx, $2); }
328 /* ECMA-262 3rd Edition 12.2 */
329 VariableDeclarationList
330 : VariableDeclaration { $$ = new_variable_list(ctx, $1); }
331 | VariableDeclarationList ',' VariableDeclaration
332 { $$ = variable_list_add(ctx, $1, $3); }
334 /* ECMA-262 3rd Edition 12.2 */
335 VariableDeclarationListNoIn
336 : VariableDeclarationNoIn
337 { $$ = new_variable_list(ctx, $1); }
338 | VariableDeclarationListNoIn ',' VariableDeclarationNoIn
339 { $$ = variable_list_add(ctx, $1, $3); }
341 /* ECMA-262 3rd Edition 12.2 */
342 VariableDeclaration
343 : tIdentifier Initialiser_opt
344 { $$ = new_variable_declaration(ctx, $1, $2); }
346 /* ECMA-262 3rd Edition 12.2 */
347 VariableDeclarationNoIn
348 : tIdentifier InitialiserNoIn_opt
349 { $$ = new_variable_declaration(ctx, $1, $2); }
351 /* ECMA-262 3rd Edition 12.2 */
352 Initialiser_opt
353 : /* empty */ { $$ = NULL; }
354 | Initialiser { $$ = $1; }
356 /* ECMA-262 3rd Edition 12.2 */
357 Initialiser
358 : '=' AssignmentExpression
359 { $$ = $2; }
361 /* ECMA-262 3rd Edition 12.2 */
362 InitialiserNoIn_opt
363 : /* empty */ { $$ = NULL; }
364 | InitialiserNoIn { $$ = $1; }
366 /* ECMA-262 3rd Edition 12.2 */
367 InitialiserNoIn
368 : '=' AssignmentExpressionNoIn
369 { $$ = $2; }
371 /* ECMA-262 3rd Edition 12.3 */
372 EmptyStatement
373 : ';' { $$ = new_empty_statement(ctx); }
375 /* ECMA-262 3rd Edition 12.4 */
376 ExpressionStatement
377 : Expression semicolon_opt
378 { $$ = new_expression_statement(ctx, $1); }
380 /* ECMA-262 3rd Edition 12.5 */
381 IfStatement
382 : kIF '(' Expression ')' Statement kELSE Statement
383 { $$ = new_if_statement(ctx, $3, $5, $7); }
384 | kIF '(' Expression ')' Statement %prec LOWER_THAN_ELSE
385 { $$ = new_if_statement(ctx, $3, $5, NULL); }
387 /* ECMA-262 3rd Edition 12.6 */
388 IterationStatement
389 : kDO Statement kWHILE '(' Expression ')' ';'
390 { $$ = new_while_statement(ctx, TRUE, $5, $2); }
391 | kWHILE '(' Expression ')' Statement
392 { $$ = new_while_statement(ctx, FALSE, $3, $5); }
393 | kFOR '(' ExpressionNoIn_opt ';' Expression_opt ';' Expression_opt ')' Statement
394 { $$ = new_for_statement(ctx, NULL, $3, $5, $7, $9); }
395 | kFOR '(' kVAR VariableDeclarationListNoIn ';' Expression_opt ';' Expression_opt ')' Statement
396 { $$ = new_for_statement(ctx, $4, NULL, $6, $8, $10); }
397 | kFOR '(' LeftHandSideExpression kIN Expression ')' Statement
398 { $$ = new_forin_statement(ctx, NULL, $3, $5, $7); }
399 | kFOR '(' kVAR VariableDeclarationNoIn kIN Expression ')' Statement
400 { $$ = new_forin_statement(ctx, $4, NULL, $6, $8); }
402 /* ECMA-262 3rd Edition 12.7 */
403 ContinueStatement
404 : kCONTINUE /* NONL */ Identifier_opt semicolon_opt
405 { $$ = new_continue_statement(ctx, $2); }
407 /* ECMA-262 3rd Edition 12.8 */
408 BreakStatement
409 : kBREAK /* NONL */ Identifier_opt semicolon_opt
410 { $$ = new_break_statement(ctx, $2); }
412 /* ECMA-262 3rd Edition 12.9 */
413 ReturnStatement
414 : kRETURN /* NONL */ Expression_opt semicolon_opt
415 { $$ = new_return_statement(ctx, $2); }
417 /* ECMA-262 3rd Edition 12.10 */
418 WithStatement
419 : kWITH '(' Expression ')' Statement
420 { $$ = new_with_statement(ctx, $3, $5); }
422 /* ECMA-262 3rd Edition 12.12 */
423 LabelledStatement
424 : tIdentifier ':' Statement
425 { $$ = new_labelled_statement(ctx, $1, $3); }
427 /* ECMA-262 3rd Edition 12.11 */
428 SwitchStatement
429 : kSWITCH '(' Expression ')' CaseBlock
430 { $$ = new_switch_statement(ctx, $3, $5); }
432 /* ECMA-262 3rd Edition 12.11 */
433 CaseBlock
434 : '{' CaseClausules_opt '}'
435 { $$ = new_case_block(ctx, $2, NULL, NULL); }
436 | '{' CaseClausules_opt DefaultClausule CaseClausules_opt '}'
437 { $$ = new_case_block(ctx, $2, $3, $4); }
439 /* ECMA-262 3rd Edition 12.11 */
440 CaseClausules_opt
441 : /* empty */ { $$ = NULL; }
442 | CaseClausules { $$ = $1; }
444 /* ECMA-262 3rd Edition 12.11 */
445 CaseClausules
446 : CaseClausule { $$ = new_case_list(ctx, $1); }
447 | CaseClausules CaseClausule
448 { $$ = case_list_add(ctx, $1, $2); }
450 /* ECMA-262 3rd Edition 12.11 */
451 CaseClausule
452 : kCASE Expression ':' StatementList_opt
453 { $$ = new_case_clausule(ctx, $2, $4); }
455 /* ECMA-262 3rd Edition 12.11 */
456 DefaultClausule
457 : kDEFAULT ':' StatementList_opt
458 { $$ = new_case_clausule(ctx, NULL, $3); }
460 /* ECMA-262 3rd Edition 12.13 */
461 ThrowStatement
462 : kTHROW /* NONL */ Expression semicolon_opt
463 { $$ = new_throw_statement(ctx, $2); }
465 /* ECMA-262 3rd Edition 12.14 */
466 TryStatement
467 : kTRY Block Catch { $$ = new_try_statement(ctx, $2, $3, NULL); }
468 | kTRY Block Finally { $$ = new_try_statement(ctx, $2, NULL, $3); }
469 | kTRY Block Catch Finally
470 { $$ = new_try_statement(ctx, $2, $3, $4); }
472 /* ECMA-262 3rd Edition 12.14 */
473 Catch
474 : kCATCH '(' tIdentifier ')' Block
475 { $$ = new_catch_block(ctx, $3, $5); }
477 /* ECMA-262 3rd Edition 12.14 */
478 Finally
479 : kFINALLY Block { $$ = $2; }
481 /* ECMA-262 3rd Edition 11.14 */
482 Expression_opt
483 : /* empty */ { $$ = NULL; }
484 | Expression { $$ = $1; }
486 /* ECMA-262 3rd Edition 11.14 */
487 Expression
488 : AssignmentExpression { $$ = $1; }
489 | Expression ',' AssignmentExpression
490 { $$ = new_binary_expression(ctx, EXPR_COMMA, $1, $3); }
492 /* ECMA-262 3rd Edition 11.14 */
493 ExpressionNoIn_opt
494 : /* empty */ { $$ = NULL; }
495 | ExpressionNoIn { $$ = $1; }
497 /* ECMA-262 3rd Edition 11.14 */
498 ExpressionNoIn
499 : AssignmentExpressionNoIn
500 { $$ = $1; }
501 | ExpressionNoIn ',' AssignmentExpressionNoIn
502 { $$ = new_binary_expression(ctx, EXPR_COMMA, $1, $3); }
504 /* ECMA-262 3rd Edition 11.13 */
505 AssignmentExpression
506 : ConditionalExpression { $$ = $1; }
507 | LeftHandSideExpression '=' AssignmentExpression
508 { $$ = new_binary_expression(ctx, EXPR_ASSIGN, $1, $3); }
509 | LeftHandSideExpression tAssignOper AssignmentExpression
510 { $$ = new_binary_expression(ctx, $2, $1, $3); }
512 /* ECMA-262 3rd Edition 11.13 */
513 AssignmentExpressionNoIn
514 : ConditionalExpressionNoIn
515 { $$ = $1; }
516 | LeftHandSideExpression '=' AssignmentExpressionNoIn
517 { $$ = new_binary_expression(ctx, EXPR_ASSIGN, $1, $3); }
518 | LeftHandSideExpression tAssignOper AssignmentExpressionNoIn
519 { $$ = new_binary_expression(ctx, $2, $1, $3); }
521 /* ECMA-262 3rd Edition 11.12 */
522 ConditionalExpression
523 : LogicalORExpression { $$ = $1; }
524 | LogicalORExpression '?' AssignmentExpression ':' AssignmentExpression
525 { $$ = new_conditional_expression(ctx, $1, $3, $5); }
527 /* ECMA-262 3rd Edition 11.12 */
528 ConditionalExpressionNoIn
529 : LogicalORExpressionNoIn
530 { $$ = $1; }
531 | LogicalORExpressionNoIn '?' AssignmentExpressionNoIn ':' AssignmentExpressionNoIn
532 { $$ = new_conditional_expression(ctx, $1, $3, $5); }
534 /* ECMA-262 3rd Edition 11.11 */
535 LogicalORExpression
536 : LogicalANDExpression { $$ = $1; }
537 | LogicalORExpression tOROR LogicalANDExpression
538 { $$ = new_binary_expression(ctx, EXPR_OR, $1, $3); }
540 /* ECMA-262 3rd Edition 11.11 */
541 LogicalORExpressionNoIn
542 : LogicalANDExpressionNoIn
543 { $$ = $1; }
544 | LogicalORExpressionNoIn tOROR LogicalANDExpressionNoIn
545 { $$ = new_binary_expression(ctx, EXPR_OR, $1, $3); }
547 /* ECMA-262 3rd Edition 11.11 */
548 LogicalANDExpression
549 : BitwiseORExpression { $$ = $1; }
550 | LogicalANDExpression tANDAND BitwiseORExpression
551 { $$ = new_binary_expression(ctx, EXPR_AND, $1, $3); }
553 /* ECMA-262 3rd Edition 11.11 */
554 LogicalANDExpressionNoIn
555 : BitwiseORExpressionNoIn
556 { $$ = $1; }
557 | LogicalANDExpressionNoIn tANDAND BitwiseORExpressionNoIn
558 { $$ = new_binary_expression(ctx, EXPR_AND, $1, $3); }
560 /* ECMA-262 3rd Edition 11.10 */
561 BitwiseORExpression
562 : BitwiseXORExpression { $$ = $1; }
563 | BitwiseORExpression '|' BitwiseXORExpression
564 { $$ = new_binary_expression(ctx, EXPR_BOR, $1, $3); }
566 /* ECMA-262 3rd Edition 11.10 */
567 BitwiseORExpressionNoIn
568 : BitwiseXORExpressionNoIn
569 { $$ = $1; }
570 | BitwiseORExpressionNoIn '|' BitwiseXORExpressionNoIn
571 { $$ = new_binary_expression(ctx, EXPR_BOR, $1, $3); }
573 /* ECMA-262 3rd Edition 11.10 */
574 BitwiseXORExpression
575 : BitwiseANDExpression { $$ = $1; }
576 | BitwiseXORExpression '^' BitwiseANDExpression
577 { $$ = new_binary_expression(ctx, EXPR_BXOR, $1, $3); }
579 /* ECMA-262 3rd Edition 11.10 */
580 BitwiseXORExpressionNoIn
581 : BitwiseANDExpressionNoIn
582 { $$ = $1; }
583 | BitwiseXORExpressionNoIn '^' BitwiseANDExpressionNoIn
584 { $$ = new_binary_expression(ctx, EXPR_BXOR, $1, $3); }
586 /* ECMA-262 3rd Edition 11.10 */
587 BitwiseANDExpression
588 : EqualityExpression { $$ = $1; }
589 | BitwiseANDExpression '&' EqualityExpression
590 { $$ = new_binary_expression(ctx, EXPR_BAND, $1, $3); }
592 /* ECMA-262 3rd Edition 11.10 */
593 BitwiseANDExpressionNoIn
594 : EqualityExpressionNoIn
595 { $$ = $1; }
596 | BitwiseANDExpressionNoIn '&' EqualityExpressionNoIn
597 { $$ = new_binary_expression(ctx, EXPR_BAND, $1, $3); }
599 /* ECMA-262 3rd Edition 11.9 */
600 EqualityExpression
601 : RelationalExpression { $$ = $1; }
602 | EqualityExpression tEqOper RelationalExpression
603 { $$ = new_binary_expression(ctx, $2, $1, $3); }
605 /* ECMA-262 3rd Edition 11.9 */
606 EqualityExpressionNoIn
607 : RelationalExpressionNoIn { $$ = $1; }
608 | EqualityExpressionNoIn tEqOper RelationalExpressionNoIn
609 { $$ = new_binary_expression(ctx, $2, $1, $3); }
611 /* ECMA-262 3rd Edition 11.8 */
612 RelationalExpression
613 : ShiftExpression { $$ = $1; }
614 | RelationalExpression tRelOper ShiftExpression
615 { $$ = new_binary_expression(ctx, $2, $1, $3); }
616 | RelationalExpression kINSTANCEOF ShiftExpression
617 { $$ = new_binary_expression(ctx, EXPR_INSTANCEOF, $1, $3); }
618 | RelationalExpression kIN ShiftExpression
619 { $$ = new_binary_expression(ctx, EXPR_IN, $1, $3); }
621 /* ECMA-262 3rd Edition 11.8 */
622 RelationalExpressionNoIn
623 : ShiftExpression { $$ = $1; }
624 | RelationalExpressionNoIn tRelOper ShiftExpression
625 { $$ = new_binary_expression(ctx, $2, $1, $3); }
626 | RelationalExpressionNoIn kINSTANCEOF ShiftExpression
627 { $$ = new_binary_expression(ctx, EXPR_INSTANCEOF, $1, $3); }
629 /* ECMA-262 3rd Edition 11.7 */
630 ShiftExpression
631 : AdditiveExpression { $$ = $1; }
632 | ShiftExpression tShiftOper AdditiveExpression
633 { $$ = new_binary_expression(ctx, $2, $1, $3); }
635 /* ECMA-262 3rd Edition 11.6 */
636 AdditiveExpression
637 : MultiplicativeExpression
638 { $$ = $1; }
639 | AdditiveExpression '+' MultiplicativeExpression
640 { $$ = new_binary_expression(ctx, EXPR_ADD, $1, $3); }
641 | AdditiveExpression '-' MultiplicativeExpression
642 { $$ = new_binary_expression(ctx, EXPR_SUB, $1, $3); }
644 /* ECMA-262 3rd Edition 11.5 */
645 MultiplicativeExpression
646 : UnaryExpression { $$ = $1; }
647 | MultiplicativeExpression '*' UnaryExpression
648 { $$ = new_binary_expression(ctx, EXPR_MUL, $1, $3); }
649 | MultiplicativeExpression '/' UnaryExpression
650 { $$ = new_binary_expression(ctx, EXPR_DIV, $1, $3); }
651 | MultiplicativeExpression '%' UnaryExpression
652 { $$ = new_binary_expression(ctx, EXPR_MOD, $1, $3); }
654 /* ECMA-262 3rd Edition 11.4 */
655 UnaryExpression
656 : PostfixExpression { $$ = $1; }
657 | kDELETE UnaryExpression
658 { $$ = new_unary_expression(ctx, EXPR_DELETE, $2); }
659 | kVOID UnaryExpression { $$ = new_unary_expression(ctx, EXPR_VOID, $2); }
660 | kTYPEOF UnaryExpression
661 { $$ = new_unary_expression(ctx, EXPR_TYPEOF, $2); }
662 | tINC UnaryExpression { $$ = new_unary_expression(ctx, EXPR_PREINC, $2); }
663 | tDEC UnaryExpression { $$ = new_unary_expression(ctx, EXPR_PREDEC, $2); }
664 | '+' UnaryExpression { $$ = new_unary_expression(ctx, EXPR_PLUS, $2); }
665 | '-' UnaryExpression { $$ = new_unary_expression(ctx, EXPR_MINUS, $2); }
666 | '~' UnaryExpression { $$ = new_unary_expression(ctx, EXPR_BITNEG, $2); }
667 | '!' UnaryExpression { $$ = new_unary_expression(ctx, EXPR_LOGNEG, $2); }
669 /* ECMA-262 3rd Edition 11.2 */
670 PostfixExpression
671 : LeftHandSideExpression
672 { $$ = $1; }
673 | LeftHandSideExpression /* NONL */ tINC
674 { $$ = new_unary_expression(ctx, EXPR_POSTINC, $1); }
675 | LeftHandSideExpression /* NONL */ tDEC
676 { $$ = new_unary_expression(ctx, EXPR_POSTDEC, $1); }
679 /* ECMA-262 3rd Edition 11.2 */
680 LeftHandSideExpression
681 : NewExpression { $$ = $1; }
682 | CallExpression { $$ = $1; }
684 /* ECMA-262 3rd Edition 11.2 */
685 NewExpression
686 : MemberExpression { $$ = $1; }
687 | kNEW NewExpression { $$ = new_new_expression(ctx, $2, NULL); }
689 /* ECMA-262 3rd Edition 11.2 */
690 MemberExpression
691 : PrimaryExpression { $$ = $1; }
692 | FunctionExpression { $$ = $1; }
693 | MemberExpression '[' Expression ']'
694 { $$ = new_array_expression(ctx, $1, $3); }
695 | MemberExpression '.' tIdentifier
696 { $$ = new_member_expression(ctx, $1, $3); }
697 | kNEW MemberExpression Arguments
698 { $$ = new_new_expression(ctx, $2, $3); }
700 /* ECMA-262 3rd Edition 11.2 */
701 CallExpression
702 : MemberExpression Arguments
703 { $$ = new_call_expression(ctx, $1, $2); }
704 | CallExpression Arguments
705 { $$ = new_call_expression(ctx, $1, $2); }
706 | CallExpression '[' Expression ']'
707 { $$ = new_array_expression(ctx, $1, $3); }
708 | CallExpression '.' tIdentifier
709 { $$ = new_member_expression(ctx, $1, $3); }
711 /* ECMA-262 3rd Edition 11.2 */
712 Arguments
713 : '(' ')' { $$ = NULL; }
714 | '(' ArgumentList ')' { $$ = $2; }
716 /* ECMA-262 3rd Edition 11.2 */
717 ArgumentList
718 : AssignmentExpression { $$ = new_argument_list(ctx, $1); }
719 | ArgumentList ',' AssignmentExpression
720 { $$ = argument_list_add(ctx, $1, $3); }
722 /* ECMA-262 3rd Edition 11.1 */
723 PrimaryExpression
724 : kTHIS { $$ = new_this_expression(ctx); }
725 | tIdentifier { $$ = new_identifier_expression(ctx, $1); }
726 | Literal { $$ = new_literal_expression(ctx, $1); }
727 | ArrayLiteral { $$ = $1; }
728 | ObjectLiteral { $$ = $1; }
729 | '(' Expression ')' { $$ = $2; }
731 /* ECMA-262 3rd Edition 11.1.4 */
732 ArrayLiteral
733 : '[' ']' { $$ = new_array_literal_expression(ctx, NULL, 0); }
734 | '[' Elision ']' { $$ = new_array_literal_expression(ctx, NULL, $2+1); }
735 | '[' ElementList ']' { $$ = new_array_literal_expression(ctx, $2, 0); }
736 | '[' ElementList ',' Elision_opt ']'
737 { $$ = new_array_literal_expression(ctx, $2, $4+1); }
739 /* ECMA-262 3rd Edition 11.1.4 */
740 ElementList
741 : Elision_opt AssignmentExpression
742 { $$ = new_element_list(ctx, $1, $2); }
743 | ElementList ',' Elision_opt AssignmentExpression
744 { $$ = element_list_add(ctx, $1, $3, $4); }
746 /* ECMA-262 3rd Edition 11.1.4 */
747 Elision
748 : ',' { $$ = 1; }
749 | Elision ',' { $$ = $1 + 1; }
751 /* ECMA-262 3rd Edition 11.1.4 */
752 Elision_opt
753 : /* empty */ { $$ = 0; }
754 | Elision { $$ = $1; }
756 /* ECMA-262 3rd Edition 11.1.5 */
757 ObjectLiteral
758 : '{' '}' { $$ = new_prop_and_value_expression(ctx, NULL); }
759 | '{' PropertyNameAndValueList '}'
760 { $$ = new_prop_and_value_expression(ctx, $2); }
762 /* ECMA-262 3rd Edition 11.1.5 */
763 PropertyNameAndValueList
764 : PropertyName ':' AssignmentExpression
765 { $$ = new_property_list(ctx, $1, $3); }
766 | PropertyNameAndValueList ',' PropertyName ':' AssignmentExpression
767 { $$ = property_list_add(ctx, $1, $3, $5); }
769 /* ECMA-262 3rd Edition 11.1.5 */
770 PropertyName
771 : tIdentifier { $$ = new_string_literal(ctx, $1); }
772 | tStringLiteral { $$ = new_string_literal(ctx, $1); }
773 | tNumericLiteral { $$ = $1; }
775 /* ECMA-262 3rd Edition 7.6 */
776 Identifier_opt
777 : /* empty*/ { $$ = NULL; }
778 | tIdentifier { $$ = $1; }
780 /* ECMA-262 3rd Edition 7.8 */
781 Literal
782 : kNULL { $$ = new_null_literal(ctx); }
783 | kUNDEFINED { $$ = new_undefined_literal(ctx); }
784 | BooleanLiteral { $$ = $1; }
785 | tNumericLiteral { $$ = $1; }
786 | tStringLiteral { $$ = new_string_literal(ctx, $1); }
787 | '/' { $$ = parse_regexp(ctx);
788 if(!$$) YYABORT; }
790 /* ECMA-262 3rd Edition 7.8.2 */
791 BooleanLiteral
792 : kTRUE { $$ = new_boolean_literal(ctx, TRUE); }
793 | kFALSE { $$ = new_boolean_literal(ctx, FALSE); }
795 semicolon_opt
796 : ';'
797 | error { if(!allow_auto_semicolon(ctx)) {YYABORT;} }
801 static BOOL allow_auto_semicolon(parser_ctx_t *ctx)
803 return ctx->nl || ctx->ptr == ctx->end || *(ctx->ptr-1) == '}';
806 static literal_t *new_string_literal(parser_ctx_t *ctx, const WCHAR *str)
808 literal_t *ret = parser_alloc(ctx, sizeof(literal_t));
810 ret->vt = VT_BSTR;
811 ret->u.wstr = str;
813 return ret;
816 static literal_t *new_null_literal(parser_ctx_t *ctx)
818 literal_t *ret = parser_alloc(ctx, sizeof(literal_t));
820 ret->vt = VT_NULL;
822 return ret;
825 static literal_t *new_undefined_literal(parser_ctx_t *ctx)
827 literal_t *ret = parser_alloc(ctx, sizeof(literal_t));
829 ret->vt = VT_EMPTY;
831 return ret;
834 static literal_t *new_boolean_literal(parser_ctx_t *ctx, VARIANT_BOOL bval)
836 literal_t *ret = parser_alloc(ctx, sizeof(literal_t));
838 ret->vt = VT_BOOL;
839 ret->u.bval = bval;
841 return ret;
844 static prop_val_t *new_prop_val(parser_ctx_t *ctx, literal_t *name, expression_t *value)
846 prop_val_t *ret = parser_alloc(ctx, sizeof(prop_val_t));
848 ret->name = name;
849 ret->value = value;
850 ret->next = NULL;
852 return ret;
855 static property_list_t *new_property_list(parser_ctx_t *ctx, literal_t *name, expression_t *value)
857 property_list_t *ret = parser_alloc_tmp(ctx, sizeof(property_list_t));
859 ret->head = ret->tail = new_prop_val(ctx, name, value);
861 return ret;
864 static property_list_t *property_list_add(parser_ctx_t *ctx, property_list_t *list, literal_t *name, expression_t *value)
866 list->tail = list->tail->next = new_prop_val(ctx, name, value);
868 return list;
871 static array_element_t *new_array_element(parser_ctx_t *ctx, int elision, expression_t *expr)
873 array_element_t *ret = parser_alloc(ctx, sizeof(array_element_t));
875 ret->elision = elision;
876 ret->expr = expr;
877 ret->next = NULL;
879 return ret;
882 static element_list_t *new_element_list(parser_ctx_t *ctx, int elision, expression_t *expr)
884 element_list_t *ret = parser_alloc_tmp(ctx, sizeof(element_list_t));
886 ret->head = ret->tail = new_array_element(ctx, elision, expr);
888 return ret;
891 static element_list_t *element_list_add(parser_ctx_t *ctx, element_list_t *list, int elision, expression_t *expr)
893 list->tail = list->tail->next = new_array_element(ctx, elision, expr);
895 return list;
898 static argument_t *new_argument(parser_ctx_t *ctx, expression_t *expr)
900 argument_t *ret = parser_alloc(ctx, sizeof(argument_t));
902 ret->expr = expr;
903 ret->next = NULL;
905 return ret;
908 static argument_list_t *new_argument_list(parser_ctx_t *ctx, expression_t *expr)
910 argument_list_t *ret = parser_alloc_tmp(ctx, sizeof(argument_list_t));
912 ret->head = ret->tail = new_argument(ctx, expr);
914 return ret;
917 static argument_list_t *argument_list_add(parser_ctx_t *ctx, argument_list_t *list, expression_t *expr)
919 list->tail = list->tail->next = new_argument(ctx, expr);
921 return list;
924 static catch_block_t *new_catch_block(parser_ctx_t *ctx, const WCHAR *identifier, statement_t *statement)
926 catch_block_t *ret = parser_alloc(ctx, sizeof(catch_block_t));
928 ret->identifier = identifier;
929 ret->statement = statement;
931 return ret;
934 static case_clausule_t *new_case_clausule(parser_ctx_t *ctx, expression_t *expr, statement_list_t *stat_list)
936 case_clausule_t *ret = parser_alloc(ctx, sizeof(case_clausule_t));
938 ret->expr = expr;
939 ret->stat = stat_list ? stat_list->head : NULL;
940 ret->next = NULL;
942 return ret;
945 static case_list_t *new_case_list(parser_ctx_t *ctx, case_clausule_t *case_clausule)
947 case_list_t *ret = parser_alloc_tmp(ctx, sizeof(case_list_t));
949 ret->head = ret->tail = case_clausule;
951 return ret;
954 static case_list_t *case_list_add(parser_ctx_t *ctx, case_list_t *list, case_clausule_t *case_clausule)
956 list->tail = list->tail->next = case_clausule;
958 return list;
961 static case_clausule_t *new_case_block(parser_ctx_t *ctx, case_list_t *case_list1,
962 case_clausule_t *default_clausule, case_list_t *case_list2)
964 case_clausule_t *ret = NULL, *iter = NULL, *iter2;
965 statement_t *stat = NULL;
967 if(case_list1) {
968 ret = case_list1->head;
969 iter = case_list1->tail;
972 if(default_clausule) {
973 if(ret)
974 iter = iter->next = default_clausule;
975 else
976 ret = iter = default_clausule;
979 if(case_list2) {
980 if(ret)
981 iter->next = case_list2->head;
982 else
983 ret = case_list2->head;
986 if(!ret)
987 return NULL;
989 for(iter = ret; iter; iter = iter->next) {
990 for(iter2 = iter; iter2 && !iter2->stat; iter2 = iter2->next);
991 if(!iter2)
992 break;
994 while(iter != iter2) {
995 iter->stat = iter2->stat;
996 iter = iter->next;
999 if(stat) {
1000 while(stat->next)
1001 stat = stat->next;
1002 stat->next = iter->stat;
1003 }else {
1004 stat = iter->stat;
1008 return ret;
1011 static statement_t *new_block_statement(parser_ctx_t *ctx, statement_list_t *list)
1013 block_statement_t *ret = parser_alloc(ctx, sizeof(block_statement_t));
1015 ret->stat.eval = block_statement_eval;
1016 ret->stat.next = NULL;
1017 ret->stat_list = list ? list->head : NULL;
1019 return &ret->stat;
1022 static variable_declaration_t *new_variable_declaration(parser_ctx_t *ctx, const WCHAR *identifier, expression_t *expr)
1024 variable_declaration_t *ret = parser_alloc(ctx, sizeof(variable_declaration_t));
1025 var_list_t *var_list = parser_alloc(ctx, sizeof(var_list_t));
1027 ret->identifier = identifier;
1028 ret->expr = expr;
1029 ret->next = NULL;
1031 var_list->identifier = identifier;
1032 var_list->next = NULL;
1034 if(ctx->func_stack->var_tail)
1035 ctx->func_stack->var_tail = ctx->func_stack->var_tail->next = var_list;
1036 else
1037 ctx->func_stack->var_head = ctx->func_stack->var_tail = var_list;
1039 return ret;
1042 static variable_list_t *new_variable_list(parser_ctx_t *ctx, variable_declaration_t *decl)
1044 variable_list_t *ret = parser_alloc_tmp(ctx, sizeof(variable_list_t));
1046 ret->head = ret->tail = decl;
1048 return ret;
1051 static variable_list_t *variable_list_add(parser_ctx_t *ctx, variable_list_t *list, variable_declaration_t *decl)
1053 list->tail = list->tail->next = decl;
1055 return list;
1058 static statement_t *new_var_statement(parser_ctx_t *ctx, variable_list_t *variable_list)
1060 var_statement_t *ret = parser_alloc(ctx, sizeof(var_statement_t));
1062 ret->stat.eval = var_statement_eval;
1063 ret->stat.next = NULL;
1064 ret->variable_list = variable_list->head;
1066 return &ret->stat;
1069 static statement_t *new_empty_statement(parser_ctx_t *ctx)
1071 statement_t *ret = parser_alloc(ctx, sizeof(statement_t));
1073 ret->eval = empty_statement_eval;
1074 ret->next = NULL;
1076 return ret;
1079 static statement_t *new_expression_statement(parser_ctx_t *ctx, expression_t *expr)
1081 expression_statement_t *ret = parser_alloc(ctx, sizeof(expression_statement_t));
1083 ret->stat.eval = expression_statement_eval;
1084 ret->stat.next = NULL;
1085 ret->expr = expr;
1087 return &ret->stat;
1090 static statement_t *new_if_statement(parser_ctx_t *ctx, expression_t *expr, statement_t *if_stat, statement_t *else_stat)
1092 if_statement_t *ret = parser_alloc(ctx, sizeof(if_statement_t));
1094 ret->stat.eval = if_statement_eval;
1095 ret->stat.next = NULL;
1096 ret->expr = expr;
1097 ret->if_stat = if_stat;
1098 ret->else_stat = else_stat;
1100 return &ret->stat;
1103 static statement_t *new_while_statement(parser_ctx_t *ctx, BOOL dowhile, expression_t *expr, statement_t *stat)
1105 while_statement_t *ret = parser_alloc(ctx, sizeof(while_statement_t));
1107 ret->stat.eval = while_statement_eval;
1108 ret->stat.next = NULL;
1109 ret->do_while = dowhile;
1110 ret->expr = expr;
1111 ret->statement = stat;
1113 return &ret->stat;
1116 static statement_t *new_for_statement(parser_ctx_t *ctx, variable_list_t *variable_list, expression_t *begin_expr,
1117 expression_t *expr, expression_t *end_expr, statement_t *statement)
1119 for_statement_t *ret = parser_alloc(ctx, sizeof(for_statement_t));
1121 ret->stat.eval = for_statement_eval;
1122 ret->stat.next = NULL;
1123 ret->variable_list = variable_list ? variable_list->head : NULL;
1124 ret->begin_expr = begin_expr;
1125 ret->expr = expr;
1126 ret->end_expr = end_expr;
1127 ret->statement = statement;
1129 return &ret->stat;
1132 static statement_t *new_forin_statement(parser_ctx_t *ctx, variable_declaration_t *variable, expression_t *expr,
1133 expression_t *in_expr, statement_t *statement)
1135 forin_statement_t *ret = parser_alloc(ctx, sizeof(forin_statement_t));
1137 ret->stat.eval = forin_statement_eval;
1138 ret->stat.next = NULL;
1139 ret->variable = variable;
1140 ret->expr = expr;
1141 ret->in_expr = in_expr;
1142 ret->statement = statement;
1144 return &ret->stat;
1147 static statement_t *new_continue_statement(parser_ctx_t *ctx, const WCHAR *identifier)
1149 branch_statement_t *ret = parser_alloc(ctx, sizeof(branch_statement_t));
1151 ret->stat.eval = continue_statement_eval;
1152 ret->stat.next = NULL;
1153 ret->identifier = identifier;
1155 return &ret->stat;
1158 static statement_t *new_break_statement(parser_ctx_t *ctx, const WCHAR *identifier)
1160 branch_statement_t *ret = parser_alloc(ctx, sizeof(branch_statement_t));
1162 ret->stat.eval = break_statement_eval;
1163 ret->stat.next = NULL;
1164 ret->identifier = identifier;
1166 return &ret->stat;
1169 static statement_t *new_return_statement(parser_ctx_t *ctx, expression_t *expr)
1171 expression_statement_t *ret = parser_alloc(ctx, sizeof(expression_statement_t));
1173 ret->stat.eval = return_statement_eval;
1174 ret->stat.next = NULL;
1175 ret->expr = expr;
1177 return &ret->stat;
1180 static statement_t *new_with_statement(parser_ctx_t *ctx, expression_t *expr, statement_t *statement)
1182 with_statement_t *ret = parser_alloc(ctx, sizeof(with_statement_t));
1184 ret->stat.eval = with_statement_eval;
1185 ret->stat.next = NULL;
1186 ret->expr = expr;
1187 ret->statement = statement;
1189 return &ret->stat;
1192 static statement_t *new_labelled_statement(parser_ctx_t *ctx, const WCHAR *identifier, statement_t *statement)
1194 labelled_statement_t *ret = parser_alloc(ctx, sizeof(labelled_statement_t));
1196 ret->stat.eval = labelled_statement_eval;
1197 ret->stat.next = NULL;
1198 ret->identifier = identifier;
1199 ret->statement = statement;
1201 return &ret->stat;
1204 static statement_t *new_switch_statement(parser_ctx_t *ctx, expression_t *expr, case_clausule_t *case_list)
1206 switch_statement_t *ret = parser_alloc(ctx, sizeof(switch_statement_t));
1208 ret->stat.eval = switch_statement_eval;
1209 ret->stat.next = NULL;
1210 ret->expr = expr;
1211 ret->case_list = case_list;
1213 return &ret->stat;
1216 static statement_t *new_throw_statement(parser_ctx_t *ctx, expression_t *expr)
1218 expression_statement_t *ret = parser_alloc(ctx, sizeof(expression_statement_t));
1220 ret->stat.eval = throw_statement_eval;
1221 ret->stat.next = NULL;
1222 ret->expr = expr;
1224 return &ret->stat;
1227 static statement_t *new_try_statement(parser_ctx_t *ctx, statement_t *try_statement,
1228 catch_block_t *catch_block, statement_t *finally_statement)
1230 try_statement_t *ret = parser_alloc(ctx, sizeof(try_statement_t));
1232 ret->stat.eval = try_statement_eval;
1233 ret->stat.next = NULL;
1234 ret->try_statement = try_statement;
1235 ret->catch_block = catch_block;
1236 ret->finally_statement = finally_statement;
1238 return &ret->stat;
1241 static parameter_t *new_parameter(parser_ctx_t *ctx, const WCHAR *identifier)
1243 parameter_t *ret = parser_alloc(ctx, sizeof(parameter_t));
1245 ret->identifier = identifier;
1246 ret->next = NULL;
1248 return ret;
1251 static parameter_list_t *new_parameter_list(parser_ctx_t *ctx, const WCHAR *identifier)
1253 parameter_list_t *ret = parser_alloc_tmp(ctx, sizeof(parameter_list_t));
1255 ret->head = ret->tail = new_parameter(ctx, identifier);
1257 return ret;
1260 static parameter_list_t *parameter_list_add(parser_ctx_t *ctx, parameter_list_t *list, const WCHAR *identifier)
1262 list->tail = list->tail->next = new_parameter(ctx, identifier);
1264 return list;
1267 static expression_t *new_function_expression(parser_ctx_t *ctx, const WCHAR *identifier,
1268 parameter_list_t *parameter_list, source_elements_t *source_elements, const WCHAR *src_str, DWORD src_len)
1270 function_expression_t *ret = parser_alloc(ctx, sizeof(function_expression_t));
1272 ret->expr.eval = function_expression_eval;
1273 ret->identifier = identifier;
1274 ret->parameter_list = parameter_list ? parameter_list->head : NULL;
1275 ret->source_elements = source_elements;
1276 ret->src_str = src_str;
1277 ret->src_len = src_len;
1279 if(ret->identifier) {
1280 function_declaration_t *decl = parser_alloc(ctx, sizeof(function_declaration_t));
1282 decl->expr = ret;
1283 decl->next = NULL;
1285 if(ctx->func_stack->func_tail)
1286 ctx->func_stack->func_tail = ctx->func_stack->func_tail->next = decl;
1287 else
1288 ctx->func_stack->func_head = ctx->func_stack->func_tail = decl;
1291 return &ret->expr;
1294 static const expression_eval_t expression_eval_table[] = {
1295 comma_expression_eval,
1296 logical_or_expression_eval,
1297 logical_and_expression_eval,
1298 binary_or_expression_eval,
1299 binary_xor_expression_eval,
1300 binary_and_expression_eval,
1301 instanceof_expression_eval,
1302 in_expression_eval,
1303 add_expression_eval,
1304 sub_expression_eval,
1305 mul_expression_eval,
1306 div_expression_eval,
1307 mod_expression_eval,
1308 delete_expression_eval,
1309 void_expression_eval,
1310 typeof_expression_eval,
1311 minus_expression_eval,
1312 plus_expression_eval,
1313 post_increment_expression_eval,
1314 post_decrement_expression_eval,
1315 pre_increment_expression_eval,
1316 pre_decrement_expression_eval,
1317 equal_expression_eval,
1318 equal2_expression_eval,
1319 not_equal_expression_eval,
1320 not_equal2_expression_eval,
1321 less_expression_eval,
1322 lesseq_expression_eval,
1323 greater_expression_eval,
1324 greatereq_expression_eval,
1325 binary_negation_expression_eval,
1326 logical_negation_expression_eval,
1327 left_shift_expression_eval,
1328 right_shift_expression_eval,
1329 right2_shift_expression_eval,
1330 assign_expression_eval,
1331 assign_lshift_expression_eval,
1332 assign_rshift_expression_eval,
1333 assign_rrshift_expression_eval,
1334 assign_add_expression_eval,
1335 assign_sub_expression_eval,
1336 assign_mul_expression_eval,
1337 assign_div_expression_eval,
1338 assign_mod_expression_eval,
1339 assign_and_expression_eval,
1340 assign_or_expression_eval,
1341 assign_xor_expression_eval,
1344 static expression_t *new_binary_expression(parser_ctx_t *ctx, expression_type_t type,
1345 expression_t *expression1, expression_t *expression2)
1347 binary_expression_t *ret = parser_alloc(ctx, sizeof(binary_expression_t));
1349 ret->expr.eval = expression_eval_table[type];
1350 ret->expression1 = expression1;
1351 ret->expression2 = expression2;
1353 return &ret->expr;
1356 static expression_t *new_unary_expression(parser_ctx_t *ctx, expression_type_t type, expression_t *expression)
1358 unary_expression_t *ret = parser_alloc(ctx, sizeof(unary_expression_t));
1360 ret->expr.eval = expression_eval_table[type];
1361 ret->expression = expression;
1363 return &ret->expr;
1366 static expression_t *new_conditional_expression(parser_ctx_t *ctx, expression_t *expression,
1367 expression_t *true_expression, expression_t *false_expression)
1369 conditional_expression_t *ret = parser_alloc(ctx, sizeof(conditional_expression_t));
1371 ret->expr.eval = conditional_expression_eval;
1372 ret->expression = expression;
1373 ret->true_expression = true_expression;
1374 ret->false_expression = false_expression;
1376 return &ret->expr;
1379 static expression_t *new_array_expression(parser_ctx_t *ctx, expression_t *member_expr, expression_t *expression)
1381 array_expression_t *ret = parser_alloc(ctx, sizeof(array_expression_t));
1383 ret->expr.eval = array_expression_eval;
1384 ret->member_expr = member_expr;
1385 ret->expression = expression;
1387 return &ret->expr;
1390 static expression_t *new_member_expression(parser_ctx_t *ctx, expression_t *expression, const WCHAR *identifier)
1392 member_expression_t *ret = parser_alloc(ctx, sizeof(member_expression_t));
1394 ret->expr.eval = member_expression_eval;
1395 ret->expression = expression;
1396 ret->identifier = identifier;
1398 return &ret->expr;
1401 static expression_t *new_new_expression(parser_ctx_t *ctx, expression_t *expression, argument_list_t *argument_list)
1403 call_expression_t *ret = parser_alloc(ctx, sizeof(call_expression_t));
1405 ret->expr.eval = new_expression_eval;
1406 ret->expression = expression;
1407 ret->argument_list = argument_list ? argument_list->head : NULL;
1409 return &ret->expr;
1412 static expression_t *new_call_expression(parser_ctx_t *ctx, expression_t *expression, argument_list_t *argument_list)
1414 call_expression_t *ret = parser_alloc(ctx, sizeof(call_expression_t));
1416 ret->expr.eval = call_expression_eval;
1417 ret->expression = expression;
1418 ret->argument_list = argument_list ? argument_list->head : NULL;
1420 return &ret->expr;
1423 static expression_t *new_this_expression(parser_ctx_t *ctx)
1425 expression_t *ret = parser_alloc(ctx, sizeof(expression_t));
1427 ret->eval = this_expression_eval;
1429 return ret;
1432 static int parser_error(const char *str)
1434 return 0;
1437 static expression_t *new_identifier_expression(parser_ctx_t *ctx, const WCHAR *identifier)
1439 identifier_expression_t *ret = parser_alloc(ctx, sizeof(identifier_expression_t));
1441 ret->expr.eval = identifier_expression_eval;
1442 ret->identifier = identifier;
1444 return &ret->expr;
1447 static expression_t *new_array_literal_expression(parser_ctx_t *ctx, element_list_t *element_list, int length)
1449 array_literal_expression_t *ret = parser_alloc(ctx, sizeof(array_literal_expression_t));
1451 ret->expr.eval = array_literal_expression_eval;
1452 ret->element_list = element_list ? element_list->head : NULL;
1453 ret->length = length;
1455 return &ret->expr;
1458 static expression_t *new_prop_and_value_expression(parser_ctx_t *ctx, property_list_t *property_list)
1460 property_value_expression_t *ret = parser_alloc(ctx, sizeof(property_value_expression_t));
1462 ret->expr.eval = property_value_expression_eval;
1463 ret->property_list = property_list ? property_list->head : NULL;
1465 return &ret->expr;
1468 static expression_t *new_literal_expression(parser_ctx_t *ctx, literal_t *literal)
1470 literal_expression_t *ret = parser_alloc(ctx, sizeof(literal_expression_t));
1472 ret->expr.eval = literal_expression_eval;
1473 ret->literal = literal;
1475 return &ret->expr;
1478 static source_elements_t *new_source_elements(parser_ctx_t *ctx)
1480 source_elements_t *ret = parser_alloc(ctx, sizeof(source_elements_t));
1482 memset(ret, 0, sizeof(*ret));
1484 return ret;
1487 static source_elements_t *source_elements_add_statement(source_elements_t *source_elements, statement_t *statement)
1489 if(source_elements->statement_tail)
1490 source_elements->statement_tail = source_elements->statement_tail->next = statement;
1491 else
1492 source_elements->statement = source_elements->statement_tail = statement;
1494 return source_elements;
1497 static statement_list_t *new_statement_list(parser_ctx_t *ctx, statement_t *statement)
1499 statement_list_t *ret = parser_alloc_tmp(ctx, sizeof(statement_list_t));
1501 ret->head = ret->tail = statement;
1503 return ret;
1506 static statement_list_t *statement_list_add(statement_list_t *list, statement_t *statement)
1508 list->tail = list->tail->next = statement;
1510 return list;
1513 static void push_func(parser_ctx_t *ctx)
1515 func_stack_t *new_func = parser_alloc_tmp(ctx, sizeof(func_stack_t));
1517 new_func->func_head = new_func->func_tail = NULL;
1518 new_func->var_head = new_func->var_tail = NULL;
1520 new_func->next = ctx->func_stack;
1521 ctx->func_stack = new_func;
1524 static source_elements_t *function_body_parsed(parser_ctx_t *ctx, source_elements_t *source)
1526 source->functions = ctx->func_stack->func_head;
1527 source->variables = ctx->func_stack->var_head;
1528 pop_func(ctx);
1530 return source;
1533 static void program_parsed(parser_ctx_t *ctx, source_elements_t *source)
1535 source->functions = ctx->func_stack->func_head;
1536 source->variables = ctx->func_stack->var_head;
1537 pop_func(ctx);
1539 ctx->source = source;
1540 ctx->hres = S_OK;
1543 void parser_release(parser_ctx_t *ctx)
1545 obj_literal_t *iter;
1547 if(--ctx->ref)
1548 return;
1550 for(iter = ctx->obj_literals; iter; iter = iter->next)
1551 jsdisp_release(iter->obj);
1553 jsheap_free(&ctx->heap);
1554 heap_free(ctx);
1557 HRESULT script_parse(script_ctx_t *ctx, const WCHAR *code, const WCHAR *delimiter,
1558 parser_ctx_t **ret)
1560 parser_ctx_t *parser_ctx;
1561 jsheap_t *mark;
1562 HRESULT hres;
1564 const WCHAR html_tagW[] = {'<','/','s','c','r','i','p','t','>',0};
1566 parser_ctx = heap_alloc_zero(sizeof(parser_ctx_t));
1567 if(!parser_ctx)
1568 return E_OUTOFMEMORY;
1570 parser_ctx->ref = 1;
1571 parser_ctx->hres = E_FAIL;
1572 parser_ctx->is_html = delimiter && !strcmpiW(delimiter, html_tagW);
1574 parser_ctx->begin = parser_ctx->ptr = code;
1575 parser_ctx->end = code + strlenW(code);
1577 script_addref(ctx);
1578 parser_ctx->script = ctx;
1580 mark = jsheap_mark(&ctx->tmp_heap);
1581 jsheap_init(&parser_ctx->heap);
1583 push_func(parser_ctx);
1585 parser_parse(parser_ctx);
1586 jsheap_clear(mark);
1587 if(FAILED(parser_ctx->hres)) {
1588 hres = parser_ctx->hres;
1589 parser_release(parser_ctx);
1590 return hres;
1593 *ret = parser_ctx;
1594 return S_OK;