vbscript: Improve parsing of separators in loops and switches. Signed-off-by: Dmitry Kislyuk <dimaki@rocketmail.com> Signed-off-by: Jacek Caban <jacek@codeweavers.com> Signed-off-by: Alexandre Julliard <julliard@winehq.org>
diff --git a/dlls/vbscript/parser.y b/dlls/vbscript/parser.y index 6b303ee..beb4e4c 100644 --- a/dlls/vbscript/parser.y +++ b/dlls/vbscript/parser.y
@@ -164,7 +164,7 @@ | StatementNl StatementsNl { $$ = link_statements($1, $2); } StatementNl - : Statement tNL { $$ = $1; } + : Statement tNL { $$ = $1; } Statement : ':' { $$ = NULL; } @@ -448,10 +448,12 @@ : tIdentifier { $$ = $1; } | tPROPERTY { $$ = propertyW; } -/* Some statements accept both new line and ':' as a separator */ +/* Most statements accept both new line and ':' as separators */ StSep : tNL | ':' + | tNL StSep + | ':' StSep %%
diff --git a/dlls/vbscript/tests/lang.vbs b/dlls/vbscript/tests/lang.vbs index 23402cd..7f7c835 100644 --- a/dlls/vbscript/tests/lang.vbs +++ b/dlls/vbscript/tests/lang.vbs
@@ -330,6 +330,13 @@ Wend Call ok(x = 3, "x not equal to 3") +z = 2 +while z > -4 : + + +z = z -2 +wend + x = false y = false do while not (x and y) @@ -353,6 +360,12 @@ Loop Call ok(x = 2, "x not equal to 2") +x = 0 +Do While x >= -2 : +x = x - 1 +Loop +Call ok(x = -3, "x not equal to -3") + x = false y = false do until x and y @@ -376,6 +389,14 @@ Loop Until x = 4 Call ok(x = 4, "x not equal to 4") +x = 5 +Do: : + +: x = x * 2 +Loop Until x = 40 +Call ok(x = 40, "x not equal to 40") + + x = false do if x then exit do @@ -495,6 +516,12 @@ Call ok(false, "exit for not escaped the loop?") next +for x = 1 to 5 : +: +: :exit for + Call ok(false, "exit for not escaped the loop?") +next + do while true for x = 1 to 100 exit do @@ -509,6 +536,14 @@ Call collectionObj.reset() y = 0 +for each x in collectionObj : + + :y = y + 3 +next +Call ok(y = 9, "y = " & y) + +Call collectionObj.reset() +y = 0 x = 10 z = 0 for each x in collectionObj : z = z + 2 @@ -611,6 +646,21 @@ end select Call ok(x, "wrong case") +x = False +select case 1 : + + :case 3, 4 : + + + case 5 +: + Call ok(false, "unexpected case") : + Case Else: + + x = True +end select +Call ok(x, "wrong case") + if false then Sub testsub x = true