通过野牛规则传递变量信息

Pass variable information through bison rules

假设我有以下两个规则:

rule1: names INTEGER    {*do something1*}

names: ID
     | names ID         {*do something2*}

如何在我的 do something2 操作中包含 INTEGER 信息? 在这个具体示例中,我想在每个 ID(来自名称)旁边打印信息 INTEGER。

你不能向那个方向传递信息。在 *do something2* 执行时,即在读取每个名称后,解析器甚至还没有看到整数。整数在输入中的名称 之后出现,并且输入从头到尾线性读取 - 没有向前看。

因此,如果您想将名称与整数一起打印,唯一的方法是 读取整数后,即在 *do something1*行动。

为此,您可以 *do something2* 将名称存储在数组或其他数据结构中。然后 *do something1* 可以遍历 *do something2* 生成的数据结构并打印每个名称和整数。

您甚至可以更进一步,使所有操作都成为 return AST 节点,然后仅在解析整个输入后迭代 AST 以打印内容。