Module: wine Branch: master Commit: e63c4472281872c363cc17205f4264477b360298 URL: http://source.winehq.org/git/wine.git/?a=commit;h=e63c4472281872c363cc17205f...
Author: Jacek Caban jacek@codeweavers.com Date: Mon Sep 12 12:32:38 2011 +0200
vbscript: Added assign statement parser implementation.
---
dlls/vbscript/parse.h | 7 +++++++ dlls/vbscript/parser.y | 16 ++++++++++++++++ 2 files changed, 23 insertions(+), 0 deletions(-)
diff --git a/dlls/vbscript/parse.h b/dlls/vbscript/parse.h index 188b673..f7b9436 100644 --- a/dlls/vbscript/parse.h +++ b/dlls/vbscript/parse.h @@ -78,6 +78,7 @@ typedef struct { } member_expression_t;
typedef enum { + STAT_ASSIGN, STAT_CALL } statement_type_t;
@@ -92,6 +93,12 @@ typedef struct { } call_statement_t;
typedef struct { + statement_t stat; + member_expression_t *member_expr; + expression_t *value_expr; +} assign_statement_t; + +typedef struct { const WCHAR *code; const WCHAR *ptr; const WCHAR *end; diff --git a/dlls/vbscript/parser.y b/dlls/vbscript/parser.y index ebfbbbc..0d56acd 100644 --- a/dlls/vbscript/parser.y +++ b/dlls/vbscript/parser.y @@ -46,6 +46,7 @@ static expression_t *new_binary_expression(parser_ctx_t*,expression_type_t,expre static member_expression_t *new_member_expression(parser_ctx_t*,expression_t*,const WCHAR*);
static statement_t *new_call_statement(parser_ctx_t*,member_expression_t*); + static statement_t *new_assign_statement(parser_ctx_t*,member_expression_t*,expression_t*);
#define CHECK_ERROR if(((parser_ctx_t*)ctx)->hres != S_OK) YYABORT
@@ -108,6 +109,8 @@ StatementNl Statement : MemberExpression ArgumentList_opt { $1->args = $2; $$ = new_call_statement(ctx, $1); CHECK_ERROR; } | tCALL MemberExpression Arguments_opt { $2->args = $3; $$ = new_call_statement(ctx, $2); CHECK_ERROR; } + | MemberExpression Arguments_opt '=' Expression + { $1->args = $2; $$ = new_assign_statement(ctx, $1, $4); CHECK_ERROR; }
MemberExpression : tIdentifier { $$ = new_member_expression(ctx, NULL, $1); CHECK_ERROR; } @@ -325,6 +328,19 @@ static statement_t *new_call_statement(parser_ctx_t *ctx, member_expression_t *e return &stat->stat; }
+static statement_t *new_assign_statement(parser_ctx_t *ctx, member_expression_t *left, expression_t *right) +{ + assign_statement_t *stat; + + stat = new_statement(ctx, STAT_ASSIGN, sizeof(*stat)); + if(!stat) + return NULL; + + stat->member_expr = left; + stat->value_expr = right; + return &stat->stat; +} + void *parser_alloc(parser_ctx_t *ctx, size_t size) { void *ret;