JavaScript: fix handling of various missing semicolons in loops
This commit is contained in:
parent
3ff01aeeb3
commit
35e8fbbe28
@ -709,7 +709,7 @@ static void parseSwitch (tokenInfo *const token)
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void parseLoop (tokenInfo *const token)
|
static boolean parseLoop (tokenInfo *const token)
|
||||||
{
|
{
|
||||||
/*
|
/*
|
||||||
* Handles these statements
|
* Handles these statements
|
||||||
@ -732,6 +732,7 @@ static void parseLoop (tokenInfo *const token)
|
|||||||
* }
|
* }
|
||||||
* while (number<5);
|
* while (number<5);
|
||||||
*/
|
*/
|
||||||
|
boolean is_terminated = TRUE;
|
||||||
|
|
||||||
if (isKeyword (token, KEYWORD_for) || isKeyword (token, KEYWORD_while))
|
if (isKeyword (token, KEYWORD_for) || isKeyword (token, KEYWORD_while))
|
||||||
{
|
{
|
||||||
@ -758,7 +759,7 @@ static void parseLoop (tokenInfo *const token)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
parseLine(token, FALSE);
|
is_terminated = parseLine(token, FALSE);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (isKeyword (token, KEYWORD_do))
|
else if (isKeyword (token, KEYWORD_do))
|
||||||
@ -777,10 +778,11 @@ static void parseLoop (tokenInfo *const token)
|
|||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
parseLine(token, FALSE);
|
is_terminated = parseLine(token, FALSE);
|
||||||
}
|
}
|
||||||
|
|
||||||
readToken(token);
|
if (is_terminated)
|
||||||
|
readToken(token);
|
||||||
|
|
||||||
if (isKeyword (token, KEYWORD_while))
|
if (isKeyword (token, KEYWORD_while))
|
||||||
{
|
{
|
||||||
@ -794,8 +796,12 @@ static void parseLoop (tokenInfo *const token)
|
|||||||
*/
|
*/
|
||||||
skipArgumentList(token);
|
skipArgumentList(token);
|
||||||
}
|
}
|
||||||
|
if (! isType (token, TOKEN_SEMICOLON))
|
||||||
|
is_terminated = FALSE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
return is_terminated;
|
||||||
}
|
}
|
||||||
|
|
||||||
static boolean parseIf (tokenInfo *const token)
|
static boolean parseIf (tokenInfo *const token)
|
||||||
@ -1654,7 +1660,7 @@ static boolean parseLine (tokenInfo *const token, boolean is_inside_class)
|
|||||||
case KEYWORD_for:
|
case KEYWORD_for:
|
||||||
case KEYWORD_while:
|
case KEYWORD_while:
|
||||||
case KEYWORD_do:
|
case KEYWORD_do:
|
||||||
parseLoop (token);
|
is_terminated = parseLoop (token);
|
||||||
break;
|
break;
|
||||||
case KEYWORD_if:
|
case KEYWORD_if:
|
||||||
case KEYWORD_else:
|
case KEYWORD_else:
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
|
|
||||||
// All these examples contain various forms of IF statements
|
// All these examples contain various forms of statements
|
||||||
// with missing semicolons. Each of these are valid and must
|
// with missing semicolons. Each of these are valid and must
|
||||||
// be accommodated.
|
// be accommodated.
|
||||||
//
|
//
|
||||||
@ -7,6 +7,9 @@
|
|||||||
// The following tags should be generated:
|
// The following tags should be generated:
|
||||||
// functions
|
// functions
|
||||||
// a
|
// a
|
||||||
|
// aa
|
||||||
|
// aa_sub1 [aa]
|
||||||
|
// aa_sub2 [aa]
|
||||||
// b
|
// b
|
||||||
// baz [f]
|
// baz [f]
|
||||||
// c
|
// c
|
||||||
@ -32,6 +35,15 @@
|
|||||||
// w
|
// w
|
||||||
// w_sub1 [w]
|
// w_sub1 [w]
|
||||||
// w_sub2 [w]
|
// w_sub2 [w]
|
||||||
|
// x
|
||||||
|
// x_sub1 [x]
|
||||||
|
// x_sub2 [x]
|
||||||
|
// y
|
||||||
|
// y_sub1 [y]
|
||||||
|
// y_sub2 [y]
|
||||||
|
// z
|
||||||
|
// z_sub1 [z]
|
||||||
|
// z_sub2 [z]
|
||||||
// classes
|
// classes
|
||||||
// MyClass
|
// MyClass
|
||||||
// methods
|
// methods
|
||||||
@ -189,3 +201,42 @@ MyClass = {
|
|||||||
var dummy5 = 42;
|
var dummy5 = 42;
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
function x(){
|
||||||
|
function x_sub1(){
|
||||||
|
while (1)
|
||||||
|
x_sub2()
|
||||||
|
}
|
||||||
|
function x_sub2(){
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function y(){
|
||||||
|
function y_sub1(){
|
||||||
|
while (1) {
|
||||||
|
y_sub2()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function y_sub2(){
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function z(){
|
||||||
|
function z_sub1(){
|
||||||
|
do {
|
||||||
|
z_sub2()
|
||||||
|
} while (0)
|
||||||
|
}
|
||||||
|
function z_sub2(){
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function aa(){
|
||||||
|
function aa_sub1(){
|
||||||
|
do
|
||||||
|
aa_sub2()
|
||||||
|
while (0)
|
||||||
|
}
|
||||||
|
function aa_sub2(){
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@ -3,6 +3,9 @@ MyClass
|
|||||||
MyClass_sub1フ128ホMyClassヨ0
|
MyClass_sub1フ128ホMyClassヨ0
|
||||||
MyClass_sub2フ128ホMyClassヨ0
|
MyClass_sub2フ128ホMyClassヨ0
|
||||||
aフ16ヨ0
|
aフ16ヨ0
|
||||||
|
aa<EFBFBD>16<EFBFBD>0
|
||||||
|
aa_sub1<EFBFBD>16<EFBFBD>aa<EFBFBD>0
|
||||||
|
aa_sub2<EFBFBD>16<EFBFBD>aa<EFBFBD>0
|
||||||
bフ16ヨ0
|
bフ16ヨ0
|
||||||
bazフ16ホfヨ0
|
bazフ16ホfヨ0
|
||||||
cフ16ヨ0
|
cフ16ヨ0
|
||||||
@ -28,3 +31,12 @@ v
|
|||||||
wフ16ヨ0
|
wフ16ヨ0
|
||||||
w_sub1フ16ホwヨ0
|
w_sub1フ16ホwヨ0
|
||||||
w_sub2フ16ホwヨ0
|
w_sub2フ16ホwヨ0
|
||||||
|
x<EFBFBD>16<EFBFBD>0
|
||||||
|
x_sub1<EFBFBD>16<EFBFBD>x<EFBFBD>0
|
||||||
|
x_sub2<EFBFBD>16<EFBFBD>x<EFBFBD>0
|
||||||
|
y<EFBFBD>16<EFBFBD>0
|
||||||
|
y_sub1<EFBFBD>16<EFBFBD>y<EFBFBD>0
|
||||||
|
y_sub2<EFBFBD>16<EFBFBD>y<EFBFBD>0
|
||||||
|
z<EFBFBD>16<EFBFBD>0
|
||||||
|
z_sub1<EFBFBD>16<EFBFBD>z<EFBFBD>0
|
||||||
|
z_sub2<EFBFBD>16<EFBFBD>z<EFBFBD>0
|
||||||
|
Loading…
x
Reference in New Issue
Block a user