学习lex and yacc,例子ch1-05.*
执行命令 如下:
lex ch1-05.l
bison -d ch1-05.y
cc -c lex.y.c ch1-05.tab.c
cc -o ch105 lex.yy.o ch1-05.tab.o -ll
执行 ./ch105提示有”断错误“
gdb调试:
$ cc -g -rdynamic lex.yy.c ch1-05.tab.c -ll
$ gdb ./a.out
一些版本信息。。。。
(gdb) r
Starting program: /home/kevin/kevin/project/test/a.out
Program received signal SIGSEGV, Segmentation fault.
0x009b5e10 in feof () from /lib/libc.so.6
Missing separate debuginfos, use: debuginfo-install glibc-2.9-3.i686
(gdb) bt
#0 0x009b5e10 in feof () from /lib/libc.so.6
#1 0x0804b2c5 in main () at ch1-05.y:30
退出GDB调试,打开 ch1-05.y文件,第30行开始的源码如下
while(!feof(yyin)) {
yyparse();
}
原因:因为feof函数是应先读取然后再判断是否到文件结尾,所以上述循环应该改为
do
{
yyparse();
}
while(!feof(yyin));
重新执行命令:
bison -d ch1-05.y
cc -c lex.y.c ch1-05.tab.c
cc -o ch105 lex.yy.o ch1-05.tab.o -ll
执行 $./ch105
成功。