From 31ef99245ae8cd08b2bb611a2a8803c6206f4d54 Mon Sep 17 00:00:00 2001 From: Dmitry Kislyuk Date: Wed, 1 Nov 2017 15:28:57 -0500 Subject: [PATCH] vbscript: Improve parsing of separators in functions and classes. Signed-off-by: Dmitry Kislyuk Signed-off-by: Jacek Caban Signed-off-by: Alexandre Julliard --- dlls/vbscript/parser.y | 22 +++++++++++----------- dlls/vbscript/tests/lang.vbs | 35 +++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+), 11 deletions(-) diff --git a/dlls/vbscript/parser.y b/dlls/vbscript/parser.y index dcd7b73699d..e8ecf4d1fda 100644 --- a/dlls/vbscript/parser.y +++ b/dlls/vbscript/parser.y @@ -396,29 +396,29 @@ PrimaryExpression | tME { $$ = new_expression(ctx, EXPR_ME, 0); CHECK_ERROR; } ClassDeclaration - : tCLASS Identifier tNL ClassBody tEND tCLASS tNL { $4->name = $2; $$ = $4; } + : tCLASS Identifier StSep ClassBody tEND tCLASS StSep { $4->name = $2; $$ = $4; } ClassBody - : /* empty */ { $$ = new_class_decl(ctx); } - | FunctionDecl tNL ClassBody { $$ = add_class_function(ctx, $3, $1); CHECK_ERROR; } + : /* empty */ { $$ = new_class_decl(ctx); } + | FunctionDecl StSep ClassBody { $$ = add_class_function(ctx, $3, $1); CHECK_ERROR; } /* FIXME: We should use DimDecl here to support arrays, but that conflicts with PropertyDecl. */ - | Storage tIdentifier tNL ClassBody { dim_decl_t *dim_decl = new_dim_decl(ctx, $2, FALSE, NULL); CHECK_ERROR; + | Storage tIdentifier StSep ClassBody { dim_decl_t *dim_decl = new_dim_decl(ctx, $2, FALSE, NULL); CHECK_ERROR; $$ = add_dim_prop(ctx, $4, dim_decl, $1); CHECK_ERROR; } - | tDIM DimDecl tNL ClassBody { $$ = add_dim_prop(ctx, $4, $2, 0); CHECK_ERROR; } - | PropertyDecl tNL ClassBody { $$ = add_class_function(ctx, $3, $1); CHECK_ERROR; } + | tDIM DimDecl StSep ClassBody { $$ = add_dim_prop(ctx, $4, $2, 0); CHECK_ERROR; } + | PropertyDecl StSep ClassBody { $$ = add_class_function(ctx, $3, $1); CHECK_ERROR; } PropertyDecl - : Storage_opt tPROPERTY tGET tIdentifier ArgumentsDecl_opt tNL StatementsNl_opt tEND tPROPERTY + : Storage_opt tPROPERTY tGET tIdentifier ArgumentsDecl_opt StSep StatementsNl_opt tEND tPROPERTY { $$ = new_function_decl(ctx, $4, FUNC_PROPGET, $1, $5, $7); CHECK_ERROR; } - | Storage_opt tPROPERTY tLET tIdentifier '(' ArgumentDecl ')' tNL StatementsNl_opt tEND tPROPERTY + | Storage_opt tPROPERTY tLET tIdentifier '(' ArgumentDecl ')' StSep StatementsNl_opt tEND tPROPERTY { $$ = new_function_decl(ctx, $4, FUNC_PROPLET, $1, $6, $9); CHECK_ERROR; } - | Storage_opt tPROPERTY tSET tIdentifier '(' ArgumentDecl ')' tNL StatementsNl_opt tEND tPROPERTY + | Storage_opt tPROPERTY tSET tIdentifier '(' ArgumentDecl ')' StSep StatementsNl_opt tEND tPROPERTY { $$ = new_function_decl(ctx, $4, FUNC_PROPSET, $1, $6, $9); CHECK_ERROR; } FunctionDecl - : Storage_opt tSUB Identifier ArgumentsDecl_opt tNL StatementsNl_opt tEND tSUB + : Storage_opt tSUB Identifier ArgumentsDecl_opt StSep StatementsNl_opt tEND tSUB { $$ = new_function_decl(ctx, $3, FUNC_SUB, $1, $4, $6); CHECK_ERROR; } - | Storage_opt tFUNCTION Identifier ArgumentsDecl_opt tNL StatementsNl_opt tEND tFUNCTION + | Storage_opt tFUNCTION Identifier ArgumentsDecl_opt StSep StatementsNl_opt tEND tFUNCTION { $$ = new_function_decl(ctx, $3, FUNC_FUNCTION, $1, $4, $6); CHECK_ERROR; } Storage_opt diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs index 8ee92a6eb85..a904f5dafa8 100644 --- a/dlls/vbscript/tests/lang.vbs +++ b/dlls/vbscript/tests/lang.vbs @@ -752,6 +752,11 @@ Private Sub TestPrivateSub End Sub Call TestPrivateSub +Public Sub TestSeparatorSub : : +: +End Sub +Call TestSeparatorSub + if false then Function testfunc x = true @@ -867,6 +872,12 @@ Private Function TestPrivateFunc End Function Call TestPrivateFunc +Public Function TestSepFunc(ByVal a) : : +: TestSepFunc = a +End Function +Call ok(TestSepFunc(1) = 1, "Function did not return 1") + + ' Stop has an effect only in debugging mode Stop @@ -1127,6 +1138,30 @@ Class Property2 End Sub End Class +Class SeparatorTest : : Dim varTest1 +: + Private Sub Class_Initialize : varTest1 = 1 + End Sub :: + + Property Get Test1() : + Test1 = varTest1 + End Property :: +: : + Property Let Test1(a) : + varTest1 = a + End Property : + + Public Function AddToTest1(ByVal a) :: : + varTest1 = varTest1 + a + AddToTest1 = varTest1 + End Function : End Class : :: Set obj = New SeparatorTest + +Call ok(obj.Test1 = 1, "obj.Test1 is not 1") +obj.Test1 = 6 +Call ok(obj.Test1 = 6, "obj.Test1 is not 6") +obj.AddToTest1(5) +Call ok(obj.Test1 = 11, "obj.Test1 is not 11") + ' Array tests Call ok(getVT(arr) = "VT_EMPTY*", "getVT(arr) = " & getVT(arr))