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