C解析器使用lex和yacc

时间:2014-03-20 10:15:48

标签: c parsing yacc lex

我正在摆弄这里给出的ANSI C解析器的代码http://www.lysator.liu.se/c/ANSI-C-grammar-y.htmlhttp://www.lysator.liu.se/c/ANSI-C-grammar-l.html

不幸的是,代码无法正常工作 - 我对它进行了一些修改以使其在成功解析输入程序时打印消息,但是即使输入程序在C中没有语法错误,也不会打印消息。如果有人能帮助我,我会很高兴。

编辑:

只是为了澄清 - 我只是在一个打印“Hello World!”的简单输入C程序上测试一个公开的lex + yacc程序。链接在上面。请打开它们以查看代码。

1 个答案:

答案 0 :(得分:3)

看起来Yacc文件只是检查你的输入程序是否正确(如果没有则打印错误),但它什么也没做。

添加一些语义操作(一些代码在匹配规则时执行),在规则之后的花括号之间。见http://dinosaur.compilertools.net/bison/bison_4.html#SEC11

您可以在匹配规则时开始打印,但如果您想构建C编译器,则必须构建AST

修改

您还需要添加一个调用解析器的main方法。只需添加

void main() {
    yyparse();
 }

在yacc文件的末尾。

解析器将从stdin读取输入。因此,如果您使用的是Linux或MacOSX,则可以输入

./parser < helloworld.c

或Windows

parser < helloworld.c

实际上,如果输入文件正确,解析器会打印输入文件。