Commit 691d7651 authored by Russ Cox's avatar Russ Cox

gc: bug274

R=ken2
CC=golang-dev
https://golang.org/cl/1742044
parent 17f90c68
...@@ -914,6 +914,8 @@ char* lexname(int lex); ...@@ -914,6 +914,8 @@ char* lexname(int lex);
void mkpackage(char* pkgname); void mkpackage(char* pkgname);
void unimportfile(void); void unimportfile(void);
int32 yylex(void); int32 yylex(void);
extern int yylast;
extern int yyprev;
/* /*
* mparith1.c * mparith1.c
......
...@@ -515,10 +515,33 @@ switch_body: ...@@ -515,10 +515,33 @@ switch_body:
} }
caseblock: caseblock:
case stmt_list case
{ {
// If the last token read by the lexer was consumed
// as part of the case, clear it (parser has cleared yychar).
// If the last token read by the lexer was the lookahead
// leave it alone (parser has it cached in yychar).
// This is so that the stmt_list action doesn't look at
// the case tokens if the stmt_list is empty.
yylast = yychar;
}
stmt_list
{
int last;
// This is the only place in the language where a statement
// list is not allowed to drop the final semicolon, because
// it's the only place where a statement list is not followed
// by a closing brace. Handle the error for pedantry.
// Find the final token of the statement list.
// yylast is lookahead; yyprev is last of stmt_list
last = yyprev;
if(last > 0 && last != ';' && yychar != '}')
yyerror("missing statement after label");
$$ = $1; $$ = $1;
$$->nbody = $2; $$->nbody = $3;
} }
caseblock_list: caseblock_list:
......
...@@ -14,6 +14,8 @@ ...@@ -14,6 +14,8 @@
extern int yychar; extern int yychar;
int windows; int windows;
int yyprev;
int yylast;
static void lexinit(void); static void lexinit(void);
static void lexfini(void); static void lexfini(void);
...@@ -1140,6 +1142,10 @@ yylex(void) ...@@ -1140,6 +1142,10 @@ yylex(void)
curio.nlsemi = 0; curio.nlsemi = 0;
break; break;
} }
// Track last two tokens returned by yylex.
yyprev = yylast;
yylast = lx;
return lx; return lx;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment