jscript: Move parser related declarations to separated header.
This commit is contained in:
parent
9550189b4f
commit
615f6a6e8b
|
@ -21,6 +21,7 @@
|
||||||
|
|
||||||
#include "jscript.h"
|
#include "jscript.h"
|
||||||
#include "engine.h"
|
#include "engine.h"
|
||||||
|
#include "parser.h"
|
||||||
|
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,21 @@ struct _except_frame_t {
|
||||||
except_frame_t *next;
|
except_frame_t *next;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
typedef struct {
|
||||||
|
enum {
|
||||||
|
EXPRVAL_JSVAL,
|
||||||
|
EXPRVAL_IDREF,
|
||||||
|
EXPRVAL_INVALID
|
||||||
|
} type;
|
||||||
|
union {
|
||||||
|
jsval_t val;
|
||||||
|
struct {
|
||||||
|
IDispatch *disp;
|
||||||
|
DISPID id;
|
||||||
|
} idref;
|
||||||
|
} u;
|
||||||
|
} exprval_t;
|
||||||
|
|
||||||
static HRESULT stack_push(exec_ctx_t *ctx, jsval_t v)
|
static HRESULT stack_push(exec_ctx_t *ctx, jsval_t v)
|
||||||
{
|
{
|
||||||
if(!ctx->stack_size) {
|
if(!ctx->stack_size) {
|
||||||
|
|
|
@ -16,26 +16,6 @@
|
||||||
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
|
* 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 {
|
|
||||||
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;
|
|
||||||
|
|
||||||
heap_pool_t heap;
|
|
||||||
} parser_ctx_t;
|
|
||||||
|
|
||||||
#define OP_LIST \
|
#define OP_LIST \
|
||||||
X(add, 1, 0,0) \
|
X(add, 1, 0,0) \
|
||||||
X(and, 1, 0,0) \
|
X(and, 1, 0,0) \
|
||||||
|
@ -191,21 +171,6 @@ static inline void bytecode_addref(bytecode_t *code)
|
||||||
code->ref++;
|
code->ref++;
|
||||||
}
|
}
|
||||||
|
|
||||||
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
typedef struct _scope_chain_t {
|
typedef struct _scope_chain_t {
|
||||||
LONG ref;
|
LONG ref;
|
||||||
jsdisp_t *jsobj;
|
jsdisp_t *jsobj;
|
||||||
|
@ -222,11 +187,12 @@ static inline void scope_addref(scope_chain_t *scope)
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct _except_frame_t except_frame_t;
|
typedef struct _except_frame_t except_frame_t;
|
||||||
|
struct _parser_ctx_t;
|
||||||
|
|
||||||
struct _exec_ctx_t {
|
struct _exec_ctx_t {
|
||||||
LONG ref;
|
LONG ref;
|
||||||
|
|
||||||
parser_ctx_t *parser;
|
struct _parser_ctx_t *parser;
|
||||||
bytecode_t *code;
|
bytecode_t *code;
|
||||||
script_ctx_t *script;
|
script_ctx_t *script;
|
||||||
scope_chain_t *scope_chain;
|
scope_chain_t *scope_chain;
|
||||||
|
@ -253,320 +219,3 @@ void exec_release(exec_ctx_t*) DECLSPEC_HIDDEN;
|
||||||
HRESULT create_exec_ctx(script_ctx_t*,IDispatch*,jsdisp_t*,scope_chain_t*,BOOL,exec_ctx_t**) DECLSPEC_HIDDEN;
|
HRESULT create_exec_ctx(script_ctx_t*,IDispatch*,jsdisp_t*,scope_chain_t*,BOOL,exec_ctx_t**) DECLSPEC_HIDDEN;
|
||||||
HRESULT exec_source(exec_ctx_t*,bytecode_t*,function_code_t*,BOOL,jsval_t*) DECLSPEC_HIDDEN;
|
HRESULT exec_source(exec_ctx_t*,bytecode_t*,function_code_t*,BOOL,jsval_t*) DECLSPEC_HIDDEN;
|
||||||
HRESULT create_source_function(script_ctx_t*,bytecode_t*,function_code_t*,scope_chain_t*,jsdisp_t**) DECLSPEC_HIDDEN;
|
HRESULT create_source_function(script_ctx_t*,bytecode_t*,function_code_t*,scope_chain_t*,jsdisp_t**) 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 struct {
|
|
||||||
enum {
|
|
||||||
EXPRVAL_JSVAL,
|
|
||||||
EXPRVAL_IDREF,
|
|
||||||
EXPRVAL_INVALID
|
|
||||||
} type;
|
|
||||||
union {
|
|
||||||
jsval_t val;
|
|
||||||
struct {
|
|
||||||
IDispatch *disp;
|
|
||||||
DISPID id;
|
|
||||||
} idref;
|
|
||||||
} u;
|
|
||||||
} exprval_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;
|
|
||||||
parameter_t *parameter_list;
|
|
||||||
source_elements_t *source_elements;
|
|
||||||
const WCHAR *src_str;
|
|
||||||
DWORD src_len;
|
|
||||||
|
|
||||||
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;
|
|
||||||
|
|
|
@ -25,6 +25,7 @@
|
||||||
#include "activscp.h"
|
#include "activscp.h"
|
||||||
#include "objsafe.h"
|
#include "objsafe.h"
|
||||||
#include "engine.h"
|
#include "engine.h"
|
||||||
|
#include "parser.h"
|
||||||
|
|
||||||
#include "parser.tab.h"
|
#include "parser.tab.h"
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,354 @@
|
||||||
|
/*
|
||||||
|
* 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 _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;
|
||||||
|
|
||||||
|
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);
|
||||||
|
}
|
||||||
|
|
||||||
|
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;
|
||||||
|
parameter_t *parameter_list;
|
||||||
|
source_elements_t *source_elements;
|
||||||
|
const WCHAR *src_str;
|
||||||
|
DWORD src_len;
|
||||||
|
|
||||||
|
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;
|
|
@ -20,6 +20,7 @@
|
||||||
|
|
||||||
#include "jscript.h"
|
#include "jscript.h"
|
||||||
#include "engine.h"
|
#include "engine.h"
|
||||||
|
#include "parser.h"
|
||||||
|
|
||||||
#include "wine/debug.h"
|
#include "wine/debug.h"
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue