通过野牛规则传递变量信息
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 以打印内容。
假设我有以下两个规则:
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 以打印内容。