【发布时间】:2025-12-08 15:25:02
【问题描述】:
在 Bison 中实现简单的 while 循环的最佳方法是什么?如果有影响的话,我使用的是 C,但我也可以使用 C++。
【问题讨论】:
-
“实现”一个while循环是什么意思?在你给野牛的C源代码中?在野牛生成的语法中?
标签: c while-loop bison
在 Bison 中实现简单的 while 循环的最佳方法是什么?如果有影响的话,我使用的是 C,但我也可以使用 C++。
【问题讨论】:
标签: c while-loop bison
您所问的内容并不适合 Stack Overflow 的答案。很详细,很多书都写过。
基本答案是您没有在 Bison 中实现 while 循环。 Bison 不是那种意义上的语言。 Bison 从语法和与该语法中的规则相关联的动作构建解析器。
解析器是pushdown automaton,它是一个带有堆栈的状态机。它采用线性标记序列并检测何时满足语法中的规则(或者是否存在错误)。当满足规则时,解析器将执行附加到该规则的操作。在这里,标记(通常)是与语言中的关键字、标识符和文字相对应的整数值。用 Bison 编写的解析器通常依赖一个单独的例程,称为 lexical scanner,将输入文本转换为标记。
这台机器中没有任何东西可以直接让您实现 while 循环。相反,这些操作用于构建可以进一步处理的输入的内部表示。对于复杂到足以具有 while 循环的语法,这种表示通常采用树的形式,通常称为 abstract syntax tree (AST)。更具体地说,给定输入文本:
while (i < n) { ... }
对应的 AST 可能如下所示:
[while node]
_____/ \_____
_____/ \____
/ \
[operator <] [block subtree]
/ \
/ \
[ID: i] [ID: n]
while 节点需要两个子树:一个对应于继续条件的表达式子树 (i < n),和一个对应于块的块子树 ({ ... })。
为 while 循环提供适当的 AST,通过处理 AST 的节点以及一些处理标识符和变量值的机制来实现循环相当简单。
如果您给 Bison 一个 proper grammar(即:适用于 LALR(1) 解析)和构建 AST 的操作,您将获得一个将令牌流转换为 AST 的例程。从该 AST 执行循环超出了 Bison 的范围。
【讨论】: