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