我正在使用Bison为我编写的编译器构建AST。如何最好地构建AST中的节点?通过以下示例,我的问题可能更清晰。
给定以下代码片段:
在上面的例子中,我希望field rule返回一个Field节点,但我需要在解析期间传递的某些modifier rule属性(即这些是合成属性)。
我能想到两种方法来实现这一点而不改变语法。
给定以下代码片段:
field
: modifier type TOK_IDENT TOK_SEMICOLON
{
// I want to return a pointer to a node of type Field
// i.e. $$ = new Field(name, isVisible, isStatic, type);
}
;
modifier
: visibility_opt static_opt
{
// Should I make the new Field here and pass it up?
// Or a new type that contains both vis and static options?
}
;
visibility_opt
: /* default */ { $$ = true; }
| TOK_PUBLIC { $$ = true; }
| TOK_PRIVATE { $$ = false; }
;
static_opt
: /* default */ { $$ = false; }
| TOK_STATIC { $$ = true; }
;
在上面的例子中,我希望field rule返回一个Field节点,但我需要在解析期间传递的某些modifier rule属性(即这些是合成属性)。
我能想到两种方法来实现这一点而不改变语法。
- 让非终结符modifier具有类型Field,在此处创建新的Field,填充它可以的部分,并将其传递给field规则以填写其余部分。
- 让modifier具有自己的类型,其中包含两个bool值,并将其传递给field规则,在创建新的Field时提取数据。