kallytin 发表于 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

kallytin 发表于 2010-08-20 16:34

回复 1# kallytin

顶一下

EricFisher 发表于 2010-08-20 17:42

你把所分析的各个token中间信息都打出来。看看是什么规则出错了。

kallytin 发表于 2010-08-20 18:12

本帖最后由 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)的修改综合起来进行编译测试(即进行词法分析和语法分析),发现还是报错,错误跟原来的一样......

EricFisher 发表于 2010-08-20 19:18

/* parse */

int j = 3;

int i;

k = 1;

int j = 3;

int i;

i = 5;

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

EricFisher 发表于 2010-08-20 19:36

而且,你需要把语句放到函数中。

kallytin 发表于 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 http://linux.chinaunix.net/bbs/images/common/back.gif

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

parse /

int j
    ^
syntax error


........

kallytin 发表于 2010-08-20 22:05

而且,你需要把语句放到函数中。
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

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

EricFisher 发表于 2010-08-21 09:19

最好是能把分析的每个token都打印出来,就像使用flex和bison的时候,增加调试选项一样。这样,比较容易查找问题。

kallytin 发表于 2010-08-21 10:48

最好是能把分析的每个token都打印出来,就像使用flex和bison的时候,增加调试选项一样。这样,比较容易查找 ...
EricFisher 发表于 2010-08-21 09:19 http://linux.chinaunix.net/bbs/images/common/back.gif


我已将每个token都打印出来了(在词法分析时),但语法分析时还是报错 ..........
页: [1] 2
查看完整版本: 语法分析时出错