更改lex文件中的代码时出现“first use”错误

时间:2015-04-25 17:38:12

标签: yacc lex

给出.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 ;

我得到了同样的错误。如何更正代码才能正常工作?

1 个答案:

答案 0 :(得分:0)

您没有添加:

%token WHILE_TOKEN FOR_TOKEN

到语法,所以标题没有包含WHILE_TOKENFOR_TOKEN的定义,因此词法分析器的编译失败。