Jacek Caban : vbscript: Better function call parsing.

Alexandre Julliard julliard at winehq.org
Thu Sep 8 14:52:12 CDT 2011


Module: wine
Branch: master
Commit: 69dcc641dfbc14066a9faa55c643e4bf2f6e7758
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=69dcc641dfbc14066a9faa55c643e4bf2f6e7758

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Thu Sep  8 14:55:35 2011 +0200

vbscript: Better function call parsing.

---

 dlls/vbscript/parser.y    |   16 ++++++++++++++--
 dlls/vbscript/tests/run.c |    6 ++++++
 2 files changed, 20 insertions(+), 2 deletions(-)

diff --git a/dlls/vbscript/parser.y b/dlls/vbscript/parser.y
index 5fb6bd2..d5c7d40 100644
--- a/dlls/vbscript/parser.y
+++ b/dlls/vbscript/parser.y
@@ -39,6 +39,8 @@ static member_expression_t *new_member_expression(parser_ctx_t*,expression_t*,co
 
 static statement_t *new_call_statement(parser_ctx_t*,member_expression_t*);
 
+#define CHECK_ERROR if(((parser_ctx_t*)ctx)->hres != S_OK) YYABORT
+
 %}
 
 %pure_parser
@@ -47,6 +49,7 @@ static statement_t *new_call_statement(parser_ctx_t*,member_expression_t*);
 %union {
     const WCHAR *string;
     statement_t *statement;
+    expression_t *expression;
     member_expression_t *member;
 }
 
@@ -55,6 +58,7 @@ static statement_t *new_call_statement(parser_ctx_t*,member_expression_t*);
 
 %type <statement> Statement StatementNl
 %type <member> MemberExpression
+%type <expression> Arguments_opt ArgumentList_opt
 
 %%
 
@@ -69,12 +73,20 @@ StatementNl
     : Statement tNL                 { $$ = $1; }
 
 Statement
-    : MemberExpression /* FIXME: Arguments_opt */   { $$ = new_call_statement(ctx, $1); }
+    : MemberExpression Arguments_opt    { $1->args = $2; $$ = new_call_statement(ctx, $1); CHECK_ERROR; }
 
 MemberExpression
-    : tIdentifier                   { $$ = new_member_expression(ctx, NULL, $1); }
+    : tIdentifier                   { $$ = new_member_expression(ctx, NULL, $1); CHECK_ERROR; }
     /* FIXME: MemberExpressionArgs '.' tIdentifier */
 
+Arguments_opt
+    : /* empty */                   { $$ = NULL; }
+    | '(' ArgumentList_opt ')'      { $$ = $2; }
+
+ArgumentList_opt
+    : /* empty */                   { $$ = NULL; }
+ /* | ArgumentList                  { $$ = $1; } */
+
 %%
 
 static int parser_error(const char *str)
diff --git a/dlls/vbscript/tests/run.c b/dlls/vbscript/tests/run.c
index 4f70224..9b1abd4 100644
--- a/dlls/vbscript/tests/run.c
+++ b/dlls/vbscript/tests/run.c
@@ -469,6 +469,12 @@ static void run_tests(void)
     parse_script_a("reportSuccess");
     CHECK_CALLED(global_success_d);
     CHECK_CALLED(global_success_i);
+
+    SET_EXPECT(global_success_d);
+    SET_EXPECT(global_success_i);
+    parse_script_a("reportSuccess()");
+    CHECK_CALLED(global_success_d);
+    CHECK_CALLED(global_success_i);
 }
 
 static BOOL check_vbscript(void)




More information about the wine-cvs mailing list