1
0
mirror of https://github.com/golang/go synced 2024-11-21 18:34:44 -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 unimportfile(void);
int32 yylex(void);
extern int yylast;
extern int yyprev;
/*
* mparith1.c

View File

@ -515,10 +515,33 @@ switch_body:
}
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;
$$->nbody = $2;
$$->nbody = $3;
}
caseblock_list:

View File

@ -14,6 +14,8 @@
extern int yychar;
int windows;
int yyprev;
int yylast;
static void lexinit(void);
static void lexfini(void);
@ -1140,6 +1142,10 @@ yylex(void)
curio.nlsemi = 0;
break;
}
// Track last two tokens returned by yylex.
yyprev = yylast;
yylast = lx;
return lx;
}