在 Bison 中实现简单的 while 循环的最佳方法是什么?如果它有所作为,我使用的是 C,但我也可以使用 C++。
1 回答
您要问的内容并不适合 Stack Overflow 的答案。它非常详细,并且已经写了很多书。
基本答案是您没有在 Bison 中实现 while 循环。Bison 不是那种意义上的语言。Bison 从语法和与该语法中的规则相关联的动作构建解析器。
解析器是一个下推自动机,它是一个附加了堆栈的状态机。它采用线性标记序列并检测何时满足语法中的规则(或者是否存在错误)。当满足规则时,解析器将执行附加到该规则的操作。在这里,标记(通常)是与语言中的关键字、标识符和文字相对应的整数值。用 Bison 编写的解析器通常依赖一个单独的例程,称为词法扫描器,将输入文本转换为标记。
该机器中的任何内容都不会直接允许您实现 while 循环。相反,这些操作用于构建可以进一步处理的输入的内部表示。对于复杂到有while循环的语法,这种表示通常采用树的形式,通常称为抽象语法树(AST)。更具体地说,给定输入文本:
while (i < n) { ... }
相应的 AST 可能如下所示:
[while node]
_____/ \_____
_____/ \____
/ \
[operator <] [block subtree]
/ \
/ \
[ID: i] [ID: n]
while 节点需要两个子树:对应于继续条件 ( i < n
) 的表达式子树和对应于块 ( { ... }
) 的块子树。
给定一个适合 while 循环的 AST,通过处理 AST 的节点并结合一些处理标识符和变量值的机制来实现循环是相当简单的。
如果你给 Bison 一个正确的语法(即:适用于 LALR(1) 解析)和构建 AST 的操作,你将获得一个将令牌流转换为 AST 的例程。从该 AST 执行循环超出了 Bison 的范围。