【问题标题】:C Parser using lex and yacc使用 lex 和 yacc 的 C 解析器
【发布时间】:2014-03-20 10:15:48
【问题描述】:

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

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

编辑:

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

【问题讨论】:

  • 您可能想要发布一些代码,因为如果没有它,很难判断出什么可能是错误的。另外,看看How to Ask
  • 请注意,您可以在网上找到的 C 解析器通常是 not correct
  • 投反对票的人:请给出在 cmets 中投反对票的理由。
  • @jpw lex 程序和 yacc 程序在各自的链接中。请打开链接。
  • 使用该语法,您需要添加符号表处理以正确识别类型名称。

标签: c parsing yacc lex


【解决方案1】:

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

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

您可以先在规则匹配时打印一些内容,但如果您想构建 C 编译器,则必须构建 AST

编辑

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

void main() {
    yyparse();
 }

在 yacc 文件的末尾。

解析器将从标准输入读取输入。所以,如果你使用的是 Linux 或 MacOSX,你可以输入

./parser < helloworld.c

或用于 Windows

parser < helloworld.c

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

【讨论】:

  • 我实际上确实为链接中给出的 yacc 程序添加了语义操作。 start 规则是translation_unit,因此我在规则后面的花括号中写了printf("Syntax Correct!\n");。但是当我这样做并执行程序时,它从未打印出“语法正确!”对于任何输入。这就是我在我的问题中所说的。打印代码永远不会执行。我不明白为什么。
  • 只需将链接中给出的 yacc 和 lex 程序复制粘贴到新创建的 yacc 和 lex 文件,添加我提到的语义操作,然后尝试在您知道语法正确的输入 C 程序上运行它们.
  • 那么,我需要运行这些命令yacc -d grammar.ymv y.tab.c grammar.c然后编译grammar.c吗?这不过是parser
猜你喜欢
  • 1970-01-01
  • 2016-02-24
  • 2015-11-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多