【问题标题】:How to generate state and action table in YACC/Bison?如何在 YACC/Bison 中生成状态和动作表?
【发布时间】:2022-01-03 01:52:30
【问题描述】:

我对如何从 yacc 程序打印 LALR(1) 解析表一无所知。我知道,在幕后,yacc 将语法转换为解析表,以及其他额外的 C 代码。

我想在控制台上打印状态以及操作(移位、减少和接受),类似于 image。我想出了this。程序打印Valid,如果它遵循语法规则,否则打印Invalid declaration

【问题讨论】:

  • 您是在尝试回答家庭作业问题,还是在寻找可以为任意语法生成紧凑解析器跟踪的工具?
  • @rici 不是作业问题,而是我必须提交的小项目。不用担心,我可以用 trace 管理它,并删除额外的文本。

标签: c parsing yacc lex


【解决方案1】:

我不确定您所说的“解析表”是什么意思。

正如您在第一段中所说,解析表驱动解析器;它列出了每个解析器状态的可能转换。如果您使用命令行选项--report=states,itemsets,Bison 将在前缀为.output 的文件中打印整个状态表。您也可以将其作为 Graphviz 文件获取,尽管这仅对小型语法有用,使用 --graph 选项。

但是,您在第二段中链接的图像没有显示解析表。它显示的是具有特定输入的解析器的进度。这通常被称为“痕迹”,野牛也可以产生这种痕迹。你需要做两件事:

  1. 提供-t 命令行选项(您也可以写成--debug),这会导致生成跟踪代码。

  2. main() 函数中将全局变量 yydebug 设置为 1。请注意yydebug 将不存在,除非您按照第 1 步操作。

【讨论】:

  • 我相信我正在寻找的标志可能是--report=states,itemsets,因为它正在生成状态以及我想要的转换和减少操作。我会做一些修改,应该在帖子中更清楚。
  • @AshvithShetty:好的。报告还有其他选项。输入 bison --help 以获取完整列表。
  • 是否可以将跟踪发送到文件中,并将其转换为表格?有相同的参数吗?
  • 跟踪发送到stderr;您可以轻松地将其重定向到文件。但我不知道有任何工具可以解析和重新格式化输出。生成的代码使用宏,但它并不是真正为重构而设计的。您也许可以对其进行编辑或重新定义宏以使其更易于解析。
猜你喜欢
  • 1970-01-01
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多