如何在YACC/Bison中生成状态和动作table?

How to generate state and action table in YACC/Bison?

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

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

我不确定“解析 table”是什么意思。

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

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

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

  2. 在您的 main() 函数中将全局变量 yydebug 设置为 1。请注意,除非您执行了第 1 步,否则 yydebug 将不存在。