我们说我有以下两条规则:
rule1: names INTEGER {*do something1*}
names: ID
| names ID {*do something2*}
如何在做某事2 操作中包含INTEGER信息? 在这个具体示例中,我想在每个ID旁边打印信息INTEGER(来自名称)。
答案 0 :(得分:2)
您无法向该方向传递信息。在*do something2*
执行时,即在读取每个名称之后,解析器甚至还没有看到整数。整数来自在输入中的名称之后,输入从头到尾线性读取 - 前面没有偷看。
因此,如果要将名称与整数一起打印,唯一的方法是在读取整数之后 。
要实现这一点,您可以使*do something1*
将名称存储在数组或其他数据结构中。然后*do something2*
可以迭代*do something1*
生成的数据结构,并将每个名称与整数一起打印。
你甚至可以更进一步,让你的所有动作都返回AST节点,然后只有在整个输入被解析后才能在AST上进行迭代打印。