如何在bison / yacc中使用继承属性?
说,我有这样的语法 -
程序 - > stmts
我想做的是野牛:
program:stmts {$$。next = newLabel(); $ 1.next = $$。下一个; }
接下来是在结构中声明的属性,该类型将添加到union中。
答案 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
声明。