使用lex和yacc的C解析器

使用lex和yacc的C解析器,c,parsing,yacc,lex,C,Parsing,Yacc,Lex,我正在处理这里和这里给出的ANSIC解析器的代码 不幸的是,代码不起作用-我对其进行了一些修改,使其在成功解析输入程序时打印消息,但消息从未打印,即使输入程序使用C语言且没有语法错误。如果有人能帮我,我会很高兴的 编辑: 我只是想澄清一下,我只是在一个打印“Hello World!”的简单输入C程序上测试了一个公开可用的lex+yacc程序。上面有链接。请打开它们查看代码。看起来Yacc文件只是检查您的输入程序是否正确(如果不正确,则打印错误),但它不做任何其他操作 在规则后面的花括号之间添加一

我正在处理这里和这里给出的ANSIC解析器的代码

不幸的是,代码不起作用-我对其进行了一些修改,使其在成功解析输入程序时打印消息,但消息从未打印,即使输入程序使用C语言且没有语法错误。如果有人能帮我,我会很高兴的

编辑:


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

看起来Yacc文件只是检查您的输入程序是否正确(如果不正确,则打印错误),但它不做任何其他操作

在规则后面的花括号之间添加一些语义操作(匹配规则时要执行的一些代码)。看

当一个规则匹配时,您可以开始打印一些东西,但是如果您想构建一个C编译器,您必须构建一个

编辑

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

void main() {
    yyparse();
 }
在yacc文件的末尾

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

./parser < helloworld.c
/parser
或用于Windows

parser < helloworld.c
parser

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

您可能需要发布一些代码,因为如果没有它,很难判断出什么是错误的。另外,请看一看。请注意,您可以在网上找到的C解析器通常都是。向下投票人:请在评论中给出向下投票的原因。@jpw lex程序和yacc程序在各自的链接中。请打开链接。使用这种语法,您需要添加符号表处理来正确识别类型名称。我确实为链接中给出的yacc程序添加了语义操作。
start
规则是
translation\u unit
,因此我编写了
printf(“语法正确!\n”)在规则后面的大括号中。但当我这样做并执行程序时,它从未为任何输入打印“语法正确!”。这就是我在问题中所说的。打印代码永远不会执行。我不明白为什么。只需将链接中给出的yacc和lex程序复制粘贴到新创建的yacc和lex文件,添加我提到的语义操作,并尝试在语法正确的输入C程序上运行它们。因此,我是否需要运行这些命令
yacc-d grammar.y
mvy.tab.c grammar.c
,然后编译
grammar.c
?它只不过是
解析器