【问题标题】:Parsing a While Loop in Bison在 Bison 中解析 While 循环
【发布时间】:2025-12-08 15:25:02
【问题描述】:

在 Bison 中实现简单的 while 循环的最佳方法是什么?如果有影响的话,我使用的是 C,但我也可以使用 C++。

【问题讨论】:

  • “实现”一个while循环是什么意思?在你给野牛的C源代码中?在野牛生成的语法中?

标签: c while-loop bison


【解决方案1】:

您所问的内容并不适合 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 &lt; n),和一个对应于块的块子树 ({ ... })。

为 while 循环提供适当的 AST,通过处理 AST 的节点以及一些处理标识符和变量值的机制来实现循环相当简单。

如果您给 Bison 一个 proper grammar(即:适用于 LALR(1) 解析)和构建 AST 的操作,您将获得一个将令牌流转换为 AST 的例程。从该 AST 执行循环超出了 Bison 的范围。

【讨论】:

  • 感谢您的回答。我担心会是这样。