Jacek Caban : vbscript: Added support for |f a, b, c| call statement.

Alexandre Julliard julliard at winehq.org
Fri Sep 9 10:56:47 CDT 2011


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

Author: Jacek Caban <jacek at codeweavers.com>
Date:   Fri Sep  9 14:46:46 2011 +0200

vbscript: Added support for |f a, b, c| call statement.

---

 dlls/vbscript/lex.c          |   22 +++++++++++++++++++---
 dlls/vbscript/parser.y       |   14 +++++++++-----
 dlls/vbscript/tests/lang.vbs |    1 +
 3 files changed, 29 insertions(+), 8 deletions(-)

diff --git a/dlls/vbscript/lex.c b/dlls/vbscript/lex.c
index 2fd51bc..41f76e9 100644
--- a/dlls/vbscript/lex.c
+++ b/dlls/vbscript/lex.c
@@ -240,12 +240,17 @@ static int parse_string_literal(parser_ctx_t *ctx, const WCHAR **ret)
     return tString;
 }
 
+static void skip_spaces(parser_ctx_t *ctx)
+{
+    while(*ctx->ptr == ' ' || *ctx->ptr == '\t' || *ctx->ptr == '\r')
+        ctx->ptr++;
+}
+
 static int parse_next_token(void *lval, parser_ctx_t *ctx)
 {
     WCHAR c;
 
-    while(*ctx->ptr == ' ' || *ctx->ptr == '\t' || *ctx->ptr == '\r')
-        ctx->ptr++;
+    skip_spaces(ctx);
     if(ctx->ptr == ctx->end)
         return ctx->last_token == tNL ? tEOF : tNL;
 
@@ -269,7 +274,6 @@ static int parse_next_token(void *lval, parser_ctx_t *ctx)
         else
             ctx->ptr = ctx->end;
         return tNL;
-    case '(':
     case ')':
     case ',':
     case '=':
@@ -281,6 +285,18 @@ static int parse_next_token(void *lval, parser_ctx_t *ctx)
     case '\\':
     case '.':
         return *ctx->ptr++;
+    case '(':
+        /* NOTE:
+         * We resolve empty brackets in lexer instead of parser to avoid complex conflicts
+         * in call statement special case |f()| without 'call' keyword
+         */
+        ctx->ptr++;
+        skip_spaces(ctx);
+        if(*ctx->ptr == ')') {
+            ctx->ptr++;
+            return tEMPTYBRACKETS;
+        }
+        return '(';
     case '"':
         return parse_string_literal(ctx, lval);
     default:
diff --git a/dlls/vbscript/parser.y b/dlls/vbscript/parser.y
index 2d50565..72790fa 100644
--- a/dlls/vbscript/parser.y
+++ b/dlls/vbscript/parser.y
@@ -56,7 +56,7 @@ static statement_t *new_call_statement(parser_ctx_t*,member_expression_t*);
     member_expression_t *member;
 }
 
-%token tEOF tNL tREM
+%token tEOF tNL tREM tEMPTYBRACKETS
 %token tTRUE tFALSE
 %token tNOT tAND tOR tXOR tEQV tIMP tNEQ
 %token tIS tLTEQ tGTEQ tMOD
@@ -89,7 +89,7 @@ StatementNl
     : Statement tNL                 { $$ = $1; }
 
 Statement
-    : MemberExpression Arguments_opt        { $1->args = $2; $$ = new_call_statement(ctx, $1); CHECK_ERROR; }
+    : 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
@@ -97,17 +97,21 @@ MemberExpression
     /* FIXME: MemberExpressionArgs '.' tIdentifier */
 
 Arguments_opt
-    : /* empty */                   { $$ = NULL; }
-    | '(' ArgumentList_opt ')'      { $$ = $2; }
+    : EmptyBrackets_opt             { $$ = NULL; }
+    | '(' ArgumentList ')'          { $$ = $2; }
 
 ArgumentList_opt
-    : /* empty */                   { $$ = NULL; }
+    : EmptyBrackets_opt             { $$ = NULL; }
     | ArgumentList                  { $$ = $1; }
 
 ArgumentList
     : Expression                    { $$ = $1; }
     | Expression ',' ArgumentList   { $1->next = $3; $$ = $1; }
 
+EmptyBrackets_opt
+    : /* empty */
+    | tEMPTYBRACKETS
+
 Expression
     : LiteralExpression /* FIXME */ { $$ = $1; }
 
diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs
index 642c2ff..55a8cad 100644
--- a/dlls/vbscript/tests/lang.vbs
+++ b/dlls/vbscript/tests/lang.vbs
@@ -17,5 +17,6 @@
 '
 
 call ok(true, "true is not true?")
+ok true, "true is not true?"
 
 reportSuccess()




More information about the wine-cvs mailing list