如何在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。它显示的是具有特定输入的解析器的进度。这通常被称为“痕迹”,野牛也可以产生这种痕迹。您需要做两件事:
提供-t
命令行选项(也可以写成--debug
),导致生成跟踪代码
在您的 main()
函数中将全局变量 yydebug
设置为 1
。请注意,除非您执行了第 1 步,否则 yydebug
将不存在。
我不知道如何从 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。它显示的是具有特定输入的解析器的进度。这通常被称为“痕迹”,野牛也可以产生这种痕迹。您需要做两件事:
提供
-t
命令行选项(也可以写成--debug
),导致生成跟踪代码在您的
main()
函数中将全局变量yydebug
设置为1
。请注意,除非您执行了第 1 步,否则yydebug
将不存在。