我正在研究Lex和Yacc程序,但我收到的错误是:
/tmp/ccTP9YY1.o:在函数
yylex': lex.yy.c:(.text+0x289): undefined reference to
yylval'中 lex.yy.c :(。text + 0x2a8):对`yylval'的未定义引用 collect2:错误:ld返回1退出状态
我在互联网上搜索了很多像stackoverflow和其他网站,但似乎没有一个能够解决我的问题。我可能错误地实施了这些建议。任何人都可以建议我这个吗? 提前谢谢。
%{
#include <stdlib.h>
#include "y.tab.h"
void yyerror(char *);
%}
%%
[a-z] {
yylval = *yytext - 'a';
return VARIABLE;
}
[0-9]+ {
yylval = atoi(yytext);
return INTEGER;
}
[-+()=/*\n] { return *yytext; }
[ \t] ;
. { yyerror("invalid character"); }
%%
void yyerror(char *s) {
fprintf(stderr, "%s\n", s);
}
int yywrap(void) {
return 1;
}
使用的命令:
rohit@rohit-HP-Pavilion-g4-Notebook-PC:~$ lex echo.l
rohit@rohit-HP-Pavilion-g4-Notebook-PC:~$ yacc -d yaccCalc.y
rohit@rohit-HP-Pavilion-g4-Notebook-PC:~$ gcc lex.yy.c y.tab.h -ll
/tmp/ccTP9YY1.o: In function `yylex':
lex.yy.c:(.text+0x289): undefined reference to `yylval'
lex.yy.c:(.text+0x2a8): undefined reference to `yylval'
collect2: error: ld returned 1 exit status
Yacc文件:
%token INTEGER VARIABLE
%left '+' '-'
%left '*' '/'
%{
void yyerror(char *);
int yylex(void);
int sym[26];
%}
%%
program:
program statement '\n'
|
;
statement:
expr { printf("%d\n", $1); }
| VARIABLE '=' expr { sym[$1] = $3; }
;
expr:
INTEGER
| VARIABLE { $$ = sym[$1]; }
| expr '+' expr { $$ = $1 + $3; }
| expr '-' expr { $$ = $1 - $3; }
| expr '*' expr { $$ = $1 * $3; }
| expr '/' expr { $$ = $1 / $3; }
| '(' expr ')' { $$ = $2; }
;
%%
void yyerror(char *s) {
fprintf(stderr, "%s\n", s);
}
int main(void) {
yyparse();
return 0;
}
答案 0 :(得分:1)
您应该编译.c
文件,而不是.h
文件。下面是编译lex和yacc程序所需的命令:
1. yacc -d yaccCalc.y
2. lex echo.l
3. cc lex.yy.c y.tab.c -ll -ly
答案 1 :(得分:0)
Yacc(和Bison)生成两个文件,即y.tab.h
和y.tab.c
,假设您没有使用选项-o
覆盖输出文件。在源代码中包含y.tab.h
并编译y.tab.c
。所以也许你在编译时弄错了:
gcc lex.yy.c y.tab.c -ll
-------------------^-------- compile y.tab.c, not y.tab.h