给出.l
这样的文件:
%{
#include "y.tab.h"
%}
%%
[ \t\n]
"if" return IF_TOKEN ;
"while" return ELSE_TOKEN ;
. yyerror("Invalid Character");
%%
int yywrap(void){
return 1;
}
和.y
这样的文件:
%{
#include <stdio.h>
void yyerror(char *);
%}
%token IF_TOKEN ELSE_TOKEN MINUS_TOKEN DIGIT_TOKEN
%%
program :expr {printf("program Accepted!!!");};
expr : IF_TOKEN | DIGIT_TOKEN ;
%%
void yyerror(char *s){
fprintf(stderr, "%s\n", s);
}
int main(){
yyparse();
return 0;
}
我使用这3个命令来编译这两个文件(我的lex文件名为p.l,我的yacc文件名为p.y):
flex p.l
yacc -d p.y
gcc lex.yy.c y.tab.c
编译时没有错误。但当我将“返回ELSE_TOKEN”更改为“返回WHILE_TOKEN”时,我收到此错误并且没有输出文件:
p.l: In function ‘yylex’:
p.l:10:8: error: ‘WHILE_TOKEN’ undeclared (first use in this function)
"while" return WHILE_TOKEN ;
^
p.l:10:8: note: each undeclared identifier is reported only once for each function it appears in
此外,当我将“while”更改为“else”并添加新规则时:
"for" return FOR_TOKEN ;
我得到了同样的错误。如何更正代码才能正常工作?
答案 0 :(得分:0)
您没有添加:
%token WHILE_TOKEN FOR_TOKEN
到语法,所以标题没有包含WHILE_TOKEN
或FOR_TOKEN
的定义,因此词法分析器的编译失败。