Module: wine Branch: master Commit: cf5143554194010e46e377dbdfb817dd2ee806be URL: http://source.winehq.org/git/wine.git/?a=commit;h=cf5143554194010e46e377dbdf...
Author: Jacek Caban jacek@codeweavers.com Date: Wed Nov 13 16:28:55 2013 +0100
vbscript: Added parser support for arrays.
---
dlls/vbscript/compile.c | 6 ++++++ dlls/vbscript/parse.h | 7 +++++++ dlls/vbscript/parser.y | 47 +++++++++++++++++++++++++++++++++++++++-------- 3 files changed, 52 insertions(+), 8 deletions(-)
diff --git a/dlls/vbscript/compile.c b/dlls/vbscript/compile.c index c5f3797..ccf7700 100644 --- a/dlls/vbscript/compile.c +++ b/dlls/vbscript/compile.c @@ -934,6 +934,12 @@ static HRESULT compile_dim_statement(compile_ctx_t *ctx, dim_statement_t *stat) }
ctx->func->var_cnt++; + + if(dim_decl->is_array) { + FIXME("arrays not supported\n"); + return E_NOTIMPL; + } + if(!dim_decl->next) break; dim_decl = dim_decl->next; diff --git a/dlls/vbscript/parse.h b/dlls/vbscript/parse.h index ba1a311..4b97814 100644 --- a/dlls/vbscript/parse.h +++ b/dlls/vbscript/parse.h @@ -138,8 +138,15 @@ typedef struct { expression_t *value_expr; } assign_statement_t;
+typedef struct _dim_list_t { + unsigned val; + struct _dim_list_t *next; +} dim_list_t; + typedef struct _dim_decl_t { const WCHAR *name; + BOOL is_array; + dim_list_t *dims; struct _dim_decl_t *next; } dim_decl_t;
diff --git a/dlls/vbscript/parser.y b/dlls/vbscript/parser.y index 3c54fd8..6e1eb95 100644 --- a/dlls/vbscript/parser.y +++ b/dlls/vbscript/parser.y @@ -57,7 +57,8 @@ static statement_t *new_onerror_statement(parser_ctx_t*,BOOL); static statement_t *new_const_statement(parser_ctx_t*,const_decl_t*); static statement_t *new_select_statement(parser_ctx_t*,expression_t*,case_clausule_t*);
-static dim_decl_t *new_dim_decl(parser_ctx_t*,const WCHAR*,dim_decl_t*); +static dim_decl_t *new_dim_decl(parser_ctx_t*,const WCHAR*,BOOL,dim_list_t*); +static dim_list_t *new_dim(parser_ctx_t*,unsigned,dim_list_t*); static elseif_decl_t *new_elseif_decl(parser_ctx_t*,expression_t*,statement_t*); static function_decl_t *new_function_decl(parser_ctx_t*,const WCHAR*,function_type_t,unsigned,arg_decl_t*,statement_t*); static arg_decl_t *new_argument_decl(parser_ctx_t*,const WCHAR*,BOOL); @@ -91,6 +92,7 @@ static const WCHAR propertyW[] = {'p','r','o','p','e','r','t','y',0}; member_expression_t *member; elseif_decl_t *elseif; dim_decl_t *dim_decl; + dim_list_t *dim_list; function_decl_t *func_decl; arg_decl_t *arg_decl; class_decl_t *class_decl; @@ -132,8 +134,9 @@ static const WCHAR propertyW[] = {'p','r','o','p','e','r','t','y',0}; %type <func_decl> FunctionDecl PropertyDecl %type <elseif> ElseIfs_opt ElseIfs ElseIf %type <class_decl> ClassDeclaration ClassBody -%type <uint> Storage Storage_opt -%type <dim_decl> DimDeclList +%type <uint> Storage Storage_opt IntegerValue +%type <dim_decl> DimDeclList DimDecl +%type <dim_list> DimList %type <const_decl> ConstDecl ConstDeclList %type <string> Identifier %type <case_clausule> CaseClausules @@ -209,9 +212,18 @@ MemberExpression : Identifier { $$ = new_member_expression(ctx, NULL, $1); CHECK_ERROR; } | CallExpression '.' Identifier { $$ = new_member_expression(ctx, $1, $3); CHECK_ERROR; }
-DimDeclList /* FIXME: Support arrays */ - : Identifier { $$ = new_dim_decl(ctx, $1, NULL); CHECK_ERROR; } - | Identifier ',' DimDeclList { $$ = new_dim_decl(ctx, $1, $3); CHECK_ERROR; } +DimDeclList + : DimDecl { $$ = $1; } + | DimDecl ',' DimDeclList { $1->next = $3; $$ = $1; } + +DimDecl + : Identifier { $$ = new_dim_decl(ctx, $1, FALSE, NULL); CHECK_ERROR; } + | Identifier '(' DimList ')' { $$ = new_dim_decl(ctx, $1, TRUE, $3); CHECK_ERROR; } + | Identifier tEMPTYBRACKETS { $$ = new_dim_decl(ctx, $1, TRUE, NULL); CHECK_ERROR; } + +DimList + : IntegerValue { $$ = new_dim(ctx, $1, NULL); } + | IntegerValue ',' DimList { $$ = new_dim(ctx, $1, $3); }
ConstDeclList : ConstDecl { $$ = $1; } @@ -369,6 +381,10 @@ NumericLiteralExpression | tLong { $$ = new_long_expression(ctx, EXPR_ULONG, $1); CHECK_ERROR; } | tDouble { $$ = new_double_expression(ctx, $1); CHECK_ERROR; }
+IntegerValue + : tShort { $$ = $1; } + | '0' { $$ = 0; } + | tLong { $$ = $1; }
PrimaryExpression : '(' Expression ')' { $$ = new_unary_expression(ctx, EXPR_BRACKETS, $2); } @@ -619,7 +635,7 @@ static statement_t *new_set_statement(parser_ctx_t *ctx, member_expression_t *le return &stat->stat; }
-static dim_decl_t *new_dim_decl(parser_ctx_t *ctx, const WCHAR *name, dim_decl_t *next) +static dim_decl_t *new_dim_decl(parser_ctx_t *ctx, const WCHAR *name, BOOL is_array, dim_list_t *dims) { dim_decl_t *decl;
@@ -628,10 +644,25 @@ static dim_decl_t *new_dim_decl(parser_ctx_t *ctx, const WCHAR *name, dim_decl_t return NULL;
decl->name = name; - decl->next = next; + decl->is_array = is_array; + decl->dims = dims; + decl->next = NULL; return decl; }
+static dim_list_t *new_dim(parser_ctx_t *ctx, unsigned val, dim_list_t *next) +{ + dim_list_t *ret; + + ret = parser_alloc(ctx, sizeof(*ret)); + if(!ret) + return NULL; + + ret->val = val; + ret->next = next; + return ret; +} + static statement_t *new_dim_statement(parser_ctx_t *ctx, dim_decl_t *decls) { dim_statement_t *stat;