免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 4780 | 回复: 16
打印 上一主题 下一主题

语法分析时出错 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-08-20 16:33 |只看该作者 |倒序浏览
我完全采用 ANSI-C 的 lex 和 yacc 文件(没改动,只是加了 tokens.h,不然编译不了),但还是出错。
是语法分析的错误(编译、链接没问题)。当分析 int i; 时,提示 i 出错。各位帮我看看。

注:
c_stander_lex.lex :C的 LEX 文件
c_stander_yacc.grm:C的 YACC文件
test.c            :启动文件(main())
test5.sig         :测试示例

driver.c          :忽略(单纯编译LEX的启动文件)

编译后测试命令:
./dcc test5.sig > dump

temp.tar (90 KB, 下载次数: 35)

论坛徽章:
0
2 [报告]
发表于 2010-08-20 16:34 |只看该作者
回复 1# kallytin

顶一下

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
3 [报告]
发表于 2010-08-20 17:42 |只看该作者
你把所分析的各个token中间信息都打出来。看看是什么规则出错了。

论坛徽章:
0
4 [报告]
发表于 2010-08-20 18:12 |只看该作者
本帖最后由 kallytin 于 2010-08-20 18:14 编辑
你把所分析的各个token中间信息都打出来。看看是什么规则出错了。
EricFisher 发表于 2010-08-20 17:42


在原来的基础上,作出了一些修改,主要是:

1)修改了 c_stander_lex.lex , 将原来的 "," 修改为 COMMA(类似的一并修改了)。同时也修改了 tokens.h,增加了 COMMA 等的标识。

2)将 c_stander_yacc.grm 替换为 c_stander_yacc_1.grm,修改的地方为将类似 "," 修改为 COMMA 等。

对 1)的修改单独编译测试(即只进行词法分析,所有记号都可以正确标记,不存在 bak_token)

将 1)和 2)的修改综合起来进行编译测试(即进行词法分析和语法分析),发现还是报错,错误跟原来的一样......

temp1.tar (120 KB, 下载次数: 33)

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
5 [报告]
发表于 2010-08-20 19:18 |只看该作者
/* parse */

int j = 3;

int i;

k = 1;

int j = 3;

int i;

i = 5;

ANSI-C应该是不支持在语句之间的声明。你把k = 1;放到最后试试。

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
6 [报告]
发表于 2010-08-20 19:36 |只看该作者
而且,你需要把语句放到函数中。

论坛徽章:
0
7 [报告]
发表于 2010-08-20 21:57 |只看该作者
/* parse */

int j = 3;

int i;

k = 1;

int j = 3;

int i;

i = 5;

ANSI-C应该是不支 ...
EricFisher 发表于 2010-08-20 19:18


我的出错信息是在第一句(int j = 3),具体如下:

parse /

int j
    ^
syntax error


........

论坛徽章:
0
8 [报告]
发表于 2010-08-20 22:05 |只看该作者
而且,你需要把语句放到函数中。
EricFisher 发表于 2010-08-20 19:36



??全局变量是可以放到函数外的:

translate_unit                :        extern_declaration
                        |        translate_unit extern_declaration
                        ;

extern_declaration        :        funcdef
                        |        declaration
                        ;

declaration                :        decspec SEMICOLON
                        |        decspec initdeclist SEMICOLON
                        ;

declaration  -> decspec -> typespec -> INT           

initdeclist  -> initdec -> dec -> direct_dec -> ID

难道是我搞错了?




另,已修改test5.sig如下:

/* parse */

int abc()
{
        int j = 3;
}

结果:

parse /

int abc
      ^
syntax error

错误还是一样的........

论坛徽章:
2
摩羯座
日期:2013-10-10 14:29:04天蝎座
日期:2014-01-03 09:14:49
9 [报告]
发表于 2010-08-21 09:19 |只看该作者
最好是能把分析的每个token都打印出来,就像使用flex和bison的时候,增加调试选项一样。这样,比较容易查找问题。

论坛徽章:
0
10 [报告]
发表于 2010-08-21 10:48 |只看该作者
最好是能把分析的每个token都打印出来,就像使用flex和bison的时候,增加调试选项一样。这样,比较容易查找 ...
EricFisher 发表于 2010-08-21 09:19



我已将每个token都打印出来了(在词法分析时),但语法分析时还是报错 ..........
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP