1
0
mirror of https://github.com/golang/go synced 2024-11-25 03:07:56 -07:00

gc: bug274

R=ken2
CC=golang-dev
https://golang.org/cl/1742044
This commit is contained in:
Russ Cox 2010-07-15 15:05:56 -07:00
parent 17f90c68c6
commit 691d765121
4 changed files with 33 additions and 2 deletions

View File

@ -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

View File

@ -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:

View File

@ -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)
curio.nlsemi = 0; curio.nlsemi = 0;
break; break;
} }
// Track last two tokens returned by yylex.
yyprev = yylast;
yylast = lx;
return lx; return lx;
} }