LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 707|回复: 6

问lex&yacc入门级问题

[复制链接]
发表于 2004-8-26 17:53:12 | 显示全部楼层 |阅读模式
最近刚开始学习lex&yacc,碰到yacc编译时问题,请兄弟们帮看一下:
这是一个很简单的计算器例子。
temp.l(lex file):

  1. %{
  2. #include "y.tab.h"
  3. extern int yylval;
  4. %}

  5. %%
  6. [0-9]+        { yylval = atoi(yytext); return NUMBER; }
  7. [ \t]        ;                /* ignore white space */
  8. \n        return 0;        /* logical EOF */
  9. .        return yytext[0];
  10. %%
复制代码

----------------------
temp.y(yacc file):

  1. %token NAME NUMBER
  2. %%
  3. statement:        NAME '=' expression
  4.         |        expression                { printf("= %d\n", $1); }
  5.         ;

  6. expression:        expression '+' NUMBER        { $$ = $1 + $3; }
  7.         |        expression '-' NUMBER        { $$ = $1 - $3; }
  8.         |        NUMBER                        { $$ = $1; }
  9.         ;
复制代码

编译过程如下:
lex temp.l
yacc -d temp.y
gcc -o mycal lex.yy.c y.tab.c -ll [-ly]

我想问的问题很简单:
请问:GNU下的yacc(bison)它的库名字是叫做什么?因为在gcc那一行中如果加入[-ly]就会报错;如果不加也会报yyerror未定义,我自已定义一个yyerror后编译通过,但运行后输入任何表达式(如:1+1)不会显示结果。

请指教一下。谢谢!!
发表于 2004-8-27 03:37:32 | 显示全部楼层
我也曾经遇到过这个问题,但是不知道怎么解决,望高手赐教一下,谢谢。
本来我原来是想用一些工具来辅助做个翻译器的,后来因为这个原因,只能手工编码了
发表于 2004-8-27 09:26:15 | 显示全部楼层

回复: 问lex&yacc入门级问题

最初由 Renew 发表

我想问的问题很简单:
请问:GNU下的yacc(bison)它的库名字是叫做什么?因为在gcc那一行中如果加入[-ly]就会报错;如果不加也会报yyerror未定义,我自已定义一个yyerror后编译通过,但运行后输入任何表达式(如:1+1)不会显示结果。

yyerror是需要自己定义的。info bison中有例子,你可以自己看看。
发表于 2004-8-27 10:17:31 | 显示全部楼层
yyerror 是来自于 libfl 是 flex 的东西, 与 bison/yacc 无关
应该是:

gcc -o mycal lex.yy.c y.tab.c -lfl
 楼主| 发表于 2004-8-27 19:31:35 | 显示全部楼层
谢谢:kj501&JerryZhou.

  我按照二位的方法试了一下,比原来有进步,但仍报错如下:

  1. (1)gcc -o mycal lex.yy.c y.tab.c -lfl
  2. 出现:
  3. :In function `yyparse`:
  4. :undefined referencee to `yyerror`  //此行出现三次
  5. collect2:ld returned 1 exit status

  6. (2)自已加入yyerror()在y.tab.c中如下:
  7. void yyerror(char* msg)
  8. {
  9.   printf("%s",msg);
  10. }
复制代码

再次编译,通过。
运行后输入:
1+1(敲入回车后无反映)

从现象上看,似乎还是链接的问题?

注:我的bison是1.875a; lex是2.5.31;系统为:GNU/Debian 2.4.18
发表于 2004-8-29 00:21:20 | 显示全部楼层
你的temp.y文件缺少main函数,当然不会运行。这个连接你参考一下吧:
http://www-900.ibm.com/developer ... sdk/lex/index.shtml
 楼主| 发表于 2004-8-30 10:04:54 | 显示全部楼层
Thanks! This mission accomplished!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表