LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
12
返回列表 发新帖
楼主: rwimn

一个编译问题(用到lex和yacc)有兴趣的进来做做

[复制链接]
发表于 2005-6-23 11:32:28 | 显示全部楼层
me=enac
刚才用enac上不来,又重新注册了一个;
我先做了个简单的计算器,可还是编译通不过:(

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
回复 支持 反对

使用道具 举报

发表于 2005-6-23 11:48:06 | 显示全部楼层
simple.y 末尾的main()去掉!重复定义了
另外,yylval可以重新声明,默认是int吧。
编译simple.y的时候用-d 生成头文件: yacc -d simple.y
回复 支持 反对

使用道具 举报

发表于 2005-6-24 10:38:37 | 显示全部楼层
Post by welans
simple.y 末尾的main()去掉!重复定义了
另外,yylval可以重新声明,默认是int吧。
编译simple.y的时候用-d 生成头文件: yacc -d simple.y

谢谢。
我试了,但是yylval未定义的错误仍然未消除。
我的疑惑是,include是怎么一个关系?在gcc的错误输出中显示simple.l被y.tab.c“ 包含” (是吗),为什么lex没有把yylval定义放在输出文件中?
我想应该文法规则定义没什么问题,是什么地方的问题呢?
回复 支持 反对

使用道具 举报

发表于 2005-6-24 11:40:31 | 显示全部楼层
RTFSC!!
碰到问题不要乱猜,看源代码就知道了。
在y.tab.c中有下面一段:

  1. #ifndef YYSTYPE
  2. typedef int YYSTYPE;
  3. #endif
  4. ...
  5. YYSTYPE yylval;
复制代码

可见你的yylval是l在y.tab.c中声明的;
再看你的y.tab.h(由 yacc -d simple.y生成),里头没有yylval声明,仅仅寥寥数行——我生成的y.tab.h并不是这样的,里头已经声明了yylval。

所以你的问题出在这里,由于yacc的不同,lex.l文件中引用的yylval没有声明(原本是可以在y.tab.h声明的),自然出错了。
解决办法很简单,在lex.l 或者 y.tab.h里头加上

  1. typedef int YYSTYPE;
  2. YYSTYPE yylval;
复制代码

同时删掉y.tab.c里头的
  1. YYSTYPE yylval;
复制代码

应该就可以了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-6-24 12:23:30 | 显示全部楼层
楼上的帮助太及时了,谢谢,这是我们实习的一题,正在完善中,谢谢了~~
回复 支持 反对

使用道具 举报

发表于 2005-6-24 14:39:07 | 显示全部楼层
谢谢.这下我可以专心写文法规则了.
我把y.tab.c文件中的
#ifndef YYSTYPE
typedef int YYSTYPE;
#endif
和 YYSTYPE yylval;
都转移到y.tab.h中就好了.
我现在用的是redhat Enterprsie AS4,用bison也是必须这样手动改写.
请问cgywin是什么系统? 还有其他什么工具或办法可以每次不需要这样麻烦吗?(每次在lex yacc之间传递变量都得修改输出文件?)
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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