Module: wine Branch: master Commit: 7e420a475e653f46970650dcbf65e860c1d3fc1d URL: https://source.winehq.org/git/wine.git/?a=commit;h=7e420a475e653f46970650dcb...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Nov 1 17:50:57 2019 +0100
vbscript: Add parser support for redim statement.
Signed-off-by: Jacek Caban jacek@codeweavers.com Signed-off-by: Alexandre Julliard julliard@winehq.org
---
dlls/vbscript/lex.c | 2 ++ dlls/vbscript/parse.h | 8 ++++++++ dlls/vbscript/parser.y | 28 ++++++++++++++++++++++++++-- 3 files changed, 36 insertions(+), 2 deletions(-)
diff --git a/dlls/vbscript/lex.c b/dlls/vbscript/lex.c index d8c5ed3004..f78eee4ff9 100644 --- a/dlls/vbscript/lex.c +++ b/dlls/vbscript/lex.c @@ -72,9 +72,11 @@ static const struct { {L"on", tON}, {L"option", tOPTION}, {L"or", tOR}, + {L"preserve", tPRESERVE}, {L"private", tPRIVATE}, {L"property", tPROPERTY}, {L"public", tPUBLIC}, + {L"redim", tREDIM}, {L"rem", tREM}, {L"resume", tRESUME}, {L"select", tSELECT}, diff --git a/dlls/vbscript/parse.h b/dlls/vbscript/parse.h index f4f8a5e5e2..4bf82cbedb 100644 --- a/dlls/vbscript/parse.h +++ b/dlls/vbscript/parse.h @@ -120,6 +120,7 @@ typedef enum { STAT_FUNC, STAT_IF, STAT_ONERROR, + STAT_REDIM, STAT_SELECT, STAT_SET, STAT_STOP, @@ -165,6 +166,13 @@ typedef struct _dim_statement_t { dim_decl_t *dim_decls; } dim_statement_t;
+typedef struct { + statement_t stat; + const WCHAR *identifier; + BOOL preserve; + expression_t *dims; +} redim_statement_t; + typedef struct _arg_decl_t { const WCHAR *name; BOOL by_ref; diff --git a/dlls/vbscript/parser.y b/dlls/vbscript/parser.y index 8bb99f9f9a..46af0b16be 100644 --- a/dlls/vbscript/parser.y +++ b/dlls/vbscript/parser.y @@ -51,6 +51,7 @@ static statement_t *new_call_statement(parser_ctx_t*,BOOL,expression_t*); static statement_t *new_assign_statement(parser_ctx_t*,expression_t*,expression_t*); static statement_t *new_set_statement(parser_ctx_t*,member_expression_t*,expression_t*,expression_t*); static statement_t *new_dim_statement(parser_ctx_t*,dim_decl_t*); +static statement_t *new_redim_statement(parser_ctx_t*,const WCHAR*,BOOL,expression_t*); static statement_t *new_while_statement(parser_ctx_t*,statement_type_t,expression_t*,statement_t*); static statement_t *new_forto_statement(parser_ctx_t*,const WCHAR*,expression_t*,expression_t*,expression_t*,statement_t*); static statement_t *new_foreach_statement(parser_ctx_t*,const WCHAR*,expression_t*,statement_t*); @@ -112,7 +113,8 @@ static statement_t *link_statements(statement_t*,statement_t*); %token <string> tTRUE tFALSE %token <string> tNOT tAND tOR tXOR tEQV tIMP %token <string> tIS tMOD -%token <string> tCALL tDIM tSUB tFUNCTION tGET tLET tCONST +%token <string> tCALL tSUB tFUNCTION tGET tLET tCONST +%token <string> tDIM tREDIM tPRESERVE %token <string> tIF tELSE tELSEIF tEND tTHEN tEXIT %token <string> tWHILE tWEND tDO tLOOP tUNTIL tFOR tTO tEACH tIN %token <string> tSELECT tCASE tWITH @@ -133,7 +135,7 @@ static statement_t *link_statements(statement_t*,statement_t*); %type <expression> ConstExpression NumericLiteralExpression %type <member> MemberExpression %type <expression> Arguments Arguments_opt ArgumentList ArgumentList_opt Step_opt ExpressionList -%type <boolean> OptionExplicit_opt DoType +%type <boolean> OptionExplicit_opt DoType Preserve_opt %type <arg_decl> ArgumentsDecl_opt ArgumentDeclList ArgumentDecl %type <func_decl> FunctionDecl PropertyDecl %type <elseif> ElseIfs_opt ElseIfs ElseIf @@ -194,6 +196,8 @@ SimpleStatement | CallExpression '=' Expression { $$ = new_assign_statement(ctx, $1, $3); CHECK_ERROR; } | tDIM DimDeclList { $$ = new_dim_statement(ctx, $2); CHECK_ERROR; } + | tREDIM Preserve_opt tIdentifier '(' ArgumentList ')' + { $$ = new_redim_statement(ctx, $3, $2, $5); CHECK_ERROR; } | IfStatement { $$ = $1; } | tWHILE Expression StSep StatementsNl_opt tWEND { $$ = new_while_statement(ctx, STAT_WHILE, $2, $4); CHECK_ERROR; } @@ -231,6 +235,10 @@ MemberExpression | tDOT DotIdentifier { expression_t *dot_expr = new_expression(ctx, EXPR_DOT, sizeof(*dot_expr)); CHECK_ERROR; $$ = new_member_expression(ctx, dot_expr, $2); CHECK_ERROR; }
+Preserve_opt + : /* empty */ { $$ = FALSE; } + | tPRESERVE { $$ = TRUE; } + DimDeclList : DimDecl { $$ = $1; } | DimDecl ',' DimDeclList { $1->next = $3; $$ = $1; } @@ -537,6 +545,8 @@ DotIdentifier | tRESUME { $$ = $1; } | tGOTO { $$ = $1; } | tWITH { $$ = $1; } + | tREDIM { $$ = $1; } + | tPRESERVE { $$ = $1; }
/* Most statements accept both new line and ':' as separators */ StSep @@ -864,6 +874,20 @@ static statement_t *new_dim_statement(parser_ctx_t *ctx, dim_decl_t *decls) return &stat->stat; }
+static statement_t *new_redim_statement(parser_ctx_t *ctx, const WCHAR *identifier, BOOL preserve, expression_t *dims) +{ + redim_statement_t *stat; + + stat = new_statement(ctx, STAT_REDIM, sizeof(*stat)); + if(!stat) + return NULL; + + stat->identifier = identifier; + stat->preserve = preserve; + stat->dims = dims; + return &stat->stat; +} + static elseif_decl_t *new_elseif_decl(parser_ctx_t *ctx, expression_t *expr, statement_t *stat) { elseif_decl_t *decl;