| /* | |
| * Copyright 2014 Jacek Caban for CodeWeavers | |
| * | |
| * This library is free software; you can redistribute it and/or | |
| * modify it under the terms of the GNU Lesser General Public | |
| * License as published by the Free Software Foundation; either | |
| * version 2.1 of the License, or (at your option) any later version. | |
| * | |
| * This library is distributed in the hope that it will be useful, | |
| * but WITHOUT ANY WARRANTY; without even the implied warranty of | |
| * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | |
| * Lesser General Public License for more details. | |
| * | |
| * You should have received a copy of the GNU Lesser General Public | |
| * License along with this library; if not, write to the Free Software | |
| * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA | |
| */ | |
| typedef struct _source_elements_t source_elements_t; | |
| typedef struct _expression_t expression_t; | |
| typedef struct _statement_t statement_t; | |
| typedef struct { | |
| BOOL is_num; | |
| union { | |
| BOOL b; | |
| double n; | |
| } u; | |
| } ccval_t; | |
| typedef struct _parser_ctx_t { | |
| const WCHAR *begin; | |
| const WCHAR *end; | |
| const WCHAR *ptr; | |
| script_ctx_t *script; | |
| source_elements_t *source; | |
| BOOL nl; | |
| BOOL implicit_nl_semicolon; | |
| BOOL is_html; | |
| BOOL lexer_error; | |
| HRESULT hres; | |
| ccval_t ccval; | |
| unsigned cc_if_depth; | |
| heap_pool_t heap; | |
| } parser_ctx_t; | |
| HRESULT script_parse(script_ctx_t*,const WCHAR*,const WCHAR*,BOOL,parser_ctx_t**) DECLSPEC_HIDDEN; | |
| void parser_release(parser_ctx_t*) DECLSPEC_HIDDEN; | |
| int parser_lex(void*,parser_ctx_t*) DECLSPEC_HIDDEN; | |
| static inline void *parser_alloc(parser_ctx_t *ctx, DWORD size) | |
| { | |
| return heap_pool_alloc(&ctx->heap, size); | |
| } | |
| static inline void *parser_alloc_tmp(parser_ctx_t *ctx, DWORD size) | |
| { | |
| return heap_pool_alloc(&ctx->script->tmp_heap, size); | |
| } | |
| BOOL is_identifier_char(WCHAR) DECLSPEC_HIDDEN; | |
| BOOL unescape(WCHAR*) DECLSPEC_HIDDEN; | |
| HRESULT parse_decimal(const WCHAR**,const WCHAR*,double*) DECLSPEC_HIDDEN; | |
| typedef enum { | |
| LT_DOUBLE, | |
| LT_STRING, | |
| LT_BOOL, | |
| LT_NULL, | |
| LT_REGEXP | |
| }literal_type_t; | |
| typedef struct { | |
| literal_type_t type; | |
| union { | |
| double dval; | |
| const WCHAR *wstr; | |
| BOOL bval; | |
| struct { | |
| const WCHAR *str; | |
| DWORD str_len; | |
| DWORD flags; | |
| } regexp; | |
| } u; | |
| } literal_t; | |
| literal_t *parse_regexp(parser_ctx_t*) DECLSPEC_HIDDEN; | |
| literal_t *new_boolean_literal(parser_ctx_t*,BOOL) DECLSPEC_HIDDEN; | |
| typedef struct _variable_declaration_t { | |
| const WCHAR *identifier; | |
| expression_t *expr; | |
| struct _variable_declaration_t *next; | |
| struct _variable_declaration_t *global_next; /* for compiler */ | |
| } variable_declaration_t; | |
| typedef enum { | |
| STAT_BLOCK, | |
| STAT_BREAK, | |
| STAT_CONTINUE, | |
| STAT_EMPTY, | |
| STAT_EXPR, | |
| STAT_FOR, | |
| STAT_FORIN, | |
| STAT_IF, | |
| STAT_LABEL, | |
| STAT_RETURN, | |
| STAT_SWITCH, | |
| STAT_THROW, | |
| STAT_TRY, | |
| STAT_VAR, | |
| STAT_WHILE, | |
| STAT_WITH | |
| } statement_type_t; | |
| struct _statement_t { | |
| statement_type_t type; | |
| statement_t *next; | |
| }; | |
| typedef struct { | |
| statement_t stat; | |
| statement_t *stat_list; | |
| } block_statement_t; | |
| typedef struct { | |
| statement_t stat; | |
| variable_declaration_t *variable_list; | |
| } var_statement_t; | |
| typedef struct { | |
| statement_t stat; | |
| expression_t *expr; | |
| } expression_statement_t; | |
| typedef struct { | |
| statement_t stat; | |
| expression_t *expr; | |
| statement_t *if_stat; | |
| statement_t *else_stat; | |
| } if_statement_t; | |
| typedef struct { | |
| statement_t stat; | |
| BOOL do_while; | |
| expression_t *expr; | |
| statement_t *statement; | |
| } while_statement_t; | |
| typedef struct { | |
| statement_t stat; | |
| variable_declaration_t *variable_list; | |
| expression_t *begin_expr; | |
| expression_t *expr; | |
| expression_t *end_expr; | |
| statement_t *statement; | |
| } for_statement_t; | |
| typedef struct { | |
| statement_t stat; | |
| variable_declaration_t *variable; | |
| expression_t *expr; | |
| expression_t *in_expr; | |
| statement_t *statement; | |
| } forin_statement_t; | |
| typedef struct { | |
| statement_t stat; | |
| const WCHAR *identifier; | |
| } branch_statement_t; | |
| typedef struct { | |
| statement_t stat; | |
| expression_t *expr; | |
| statement_t *statement; | |
| } with_statement_t; | |
| typedef struct { | |
| statement_t stat; | |
| const WCHAR *identifier; | |
| statement_t *statement; | |
| } labelled_statement_t; | |
| typedef struct _case_clausule_t { | |
| expression_t *expr; | |
| statement_t *stat; | |
| struct _case_clausule_t *next; | |
| } case_clausule_t; | |
| typedef struct { | |
| statement_t stat; | |
| expression_t *expr; | |
| case_clausule_t *case_list; | |
| } switch_statement_t; | |
| typedef struct { | |
| const WCHAR *identifier; | |
| statement_t *statement; | |
| } catch_block_t; | |
| typedef struct { | |
| statement_t stat; | |
| statement_t *try_statement; | |
| catch_block_t *catch_block; | |
| statement_t *finally_statement; | |
| } try_statement_t; | |
| typedef enum { | |
| EXPR_COMMA, | |
| EXPR_OR, | |
| EXPR_AND, | |
| EXPR_BOR, | |
| EXPR_BXOR, | |
| EXPR_BAND, | |
| EXPR_INSTANCEOF, | |
| EXPR_IN, | |
| EXPR_ADD, | |
| EXPR_SUB, | |
| EXPR_MUL, | |
| EXPR_DIV, | |
| EXPR_MOD, | |
| EXPR_DELETE, | |
| EXPR_VOID, | |
| EXPR_TYPEOF, | |
| EXPR_MINUS, | |
| EXPR_PLUS, | |
| EXPR_POSTINC, | |
| EXPR_POSTDEC, | |
| EXPR_PREINC, | |
| EXPR_PREDEC, | |
| EXPR_EQ, | |
| EXPR_EQEQ, | |
| EXPR_NOTEQ, | |
| EXPR_NOTEQEQ, | |
| EXPR_LESS, | |
| EXPR_LESSEQ, | |
| EXPR_GREATER, | |
| EXPR_GREATEREQ, | |
| EXPR_BITNEG, | |
| EXPR_LOGNEG, | |
| EXPR_LSHIFT, | |
| EXPR_RSHIFT, | |
| EXPR_RRSHIFT, | |
| EXPR_ASSIGN, | |
| EXPR_ASSIGNLSHIFT, | |
| EXPR_ASSIGNRSHIFT, | |
| EXPR_ASSIGNRRSHIFT, | |
| EXPR_ASSIGNADD, | |
| EXPR_ASSIGNSUB, | |
| EXPR_ASSIGNMUL, | |
| EXPR_ASSIGNDIV, | |
| EXPR_ASSIGNMOD, | |
| EXPR_ASSIGNAND, | |
| EXPR_ASSIGNOR, | |
| EXPR_ASSIGNXOR, | |
| EXPR_COND, | |
| EXPR_ARRAY, | |
| EXPR_MEMBER, | |
| EXPR_NEW, | |
| EXPR_CALL, | |
| EXPR_THIS, | |
| EXPR_FUNC, | |
| EXPR_IDENT, | |
| EXPR_ARRAYLIT, | |
| EXPR_PROPVAL, | |
| EXPR_LITERAL | |
| } expression_type_t; | |
| struct _expression_t { | |
| expression_type_t type; | |
| }; | |
| typedef struct _parameter_t { | |
| const WCHAR *identifier; | |
| struct _parameter_t *next; | |
| } parameter_t; | |
| struct _source_elements_t { | |
| statement_t *statement; | |
| statement_t *statement_tail; | |
| }; | |
| typedef struct _function_expression_t { | |
| expression_t expr; | |
| const WCHAR *identifier; | |
| const WCHAR *event_target; | |
| parameter_t *parameter_list; | |
| source_elements_t *source_elements; | |
| const WCHAR *src_str; | |
| DWORD src_len; | |
| unsigned func_id; | |
| struct _function_expression_t *next; /* for compiler */ | |
| } function_expression_t; | |
| typedef struct { | |
| expression_t expr; | |
| expression_t *expression1; | |
| expression_t *expression2; | |
| } binary_expression_t; | |
| typedef struct { | |
| expression_t expr; | |
| expression_t *expression; | |
| } unary_expression_t; | |
| typedef struct { | |
| expression_t expr; | |
| expression_t *expression; | |
| expression_t *true_expression; | |
| expression_t *false_expression; | |
| } conditional_expression_t; | |
| typedef struct { | |
| expression_t expr; | |
| expression_t *expression; | |
| const WCHAR *identifier; | |
| } member_expression_t; | |
| typedef struct _argument_t { | |
| expression_t *expr; | |
| struct _argument_t *next; | |
| } argument_t; | |
| typedef struct { | |
| expression_t expr; | |
| expression_t *expression; | |
| argument_t *argument_list; | |
| } call_expression_t; | |
| typedef struct { | |
| expression_t expr; | |
| const WCHAR *identifier; | |
| } identifier_expression_t; | |
| typedef struct { | |
| expression_t expr; | |
| literal_t *literal; | |
| } literal_expression_t; | |
| typedef struct _array_element_t { | |
| int elision; | |
| expression_t *expr; | |
| struct _array_element_t *next; | |
| } array_element_t; | |
| typedef struct { | |
| expression_t expr; | |
| array_element_t *element_list; | |
| int length; | |
| } array_literal_expression_t; | |
| typedef struct _prop_val_t { | |
| literal_t *name; | |
| expression_t *value; | |
| struct _prop_val_t *next; | |
| } prop_val_t; | |
| typedef struct { | |
| expression_t expr; | |
| prop_val_t *property_list; | |
| } property_value_expression_t; | |
| BOOL try_parse_ccval(parser_ctx_t*,ccval_t*) DECLSPEC_HIDDEN; | |
| BOOL parse_cc_expr(parser_ctx_t*) DECLSPEC_HIDDEN; | |
| static inline ccval_t ccval_num(double n) | |
| { | |
| ccval_t r; | |
| r.is_num = TRUE; | |
| r.u.n = n; | |
| return r; | |
| } | |
| static inline ccval_t ccval_bool(BOOL b) | |
| { | |
| ccval_t r; | |
| r.is_num = FALSE; | |
| r.u.b = b; | |
| return r; | |
| } | |
| static inline BOOL get_ccbool(ccval_t v) | |
| { | |
| return v.is_num ? v.u.n != 0 : v.u.b; | |
| } | |
| static inline double get_ccnum(ccval_t v) | |
| { | |
| return v.is_num ? v.u.n : v.u.b; | |
| } |