bison / yacc中的继承属性

时间:2017-04-07 14:07:47

标签: bison

如何在bison / yacc中使用继承属性?
说,我有这样的语法 -
程序 - > stmts

我想做的是野牛:
program:stmts {$$。next = newLabel(); $ 1.next = $$。下一个; }

接下来是在结构中声明的属性,该类型将添加到union中。

2 个答案:

答案 0 :(得分:3)

你有时可以使用mid-rule actions在自下而上的解析过程中模拟自上而下的遍历,但到目前为止,最简洁和最灵活的方法是在初始解析后填写AST中的属性,使用任何组合树行走似乎是必要的。

答案 1 :(得分:0)

btyacc中,您可以使用:

program: stmts(newLabel()) { $$.next = $1.next; }

stmts($arg) : .... { $$.next = $arg; ... }

做这种事情。这相当于

program: { $<tag>$ = newLabel()); } stmts { $$.next = $1.next; }

stmts: .... { $$.next = $<tag>0; ... }

在野牛(或yacc),但更类型安全。在任何一种情况下,您都需要正确的%union%type声明。