语法分析时出错
我完全采用 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
回复 1# kallytin
顶一下 你把所分析的各个token中间信息都打出来。看看是什么规则出错了。 本帖最后由 kallytin 于 2010-08-20 18:14 编辑
你把所分析的各个token中间信息都打出来。看看是什么规则出错了。
EricFisher 发表于 2010-08-20 17:42 http://linux.chinaunix.net/bbs/images/common/back.gif
在原来的基础上,作出了一些修改,主要是:
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)的修改综合起来进行编译测试(即进行词法分析和语法分析),发现还是报错,错误跟原来的一样......
/* parse */
int j = 3;
int i;
k = 1;
int j = 3;
int i;
i = 5;
ANSI-C应该是不支持在语句之间的声明。你把k = 1;放到最后试试。 而且,你需要把语句放到函数中。 /* parse */
int j = 3;
int i;
k = 1;
int j = 3;
int i;
i = 5;
ANSI-C应该是不支 ...
EricFisher 发表于 2010-08-20 19:18 http://linux.chinaunix.net/bbs/images/common/back.gif
我的出错信息是在第一句(int j = 3),具体如下:
parse /
int j
^
syntax error
........ 而且,你需要把语句放到函数中。
EricFisher 发表于 2010-08-20 19:36 http://linux.chinaunix.net/bbs/images/common/back.gif
??全局变量是可以放到函数外的:
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
错误还是一样的........ 最好是能把分析的每个token都打印出来,就像使用flex和bison的时候,增加调试选项一样。这样,比较容易查找问题。 最好是能把分析的每个token都打印出来,就像使用flex和bison的时候,增加调试选项一样。这样,比较容易查找 ...
EricFisher 发表于 2010-08-21 09:19 http://linux.chinaunix.net/bbs/images/common/back.gif
我已将每个token都打印出来了(在词法分析时),但语法分析时还是报错 ..........
页:
[1]
2