mco*_*ley 5 c++ compiler-construction bison abstract-syntax-tree
我正在与Bison合作,为正在编写的编译器构建AST。在AST中建立节点的最佳方法是什么?我的问题可能通过一个例子更加清楚。
给出以下代码段:
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; }
;
Run Code Online (Sandbox Code Playgroud)
在上面的示例中,我希望字段规则返回“字段”节点,但是我需要修饰符规则的一些属性,这些属性将在解析过程中向上传递(即,这些是合成属性)。
我可以想到两种不改变语法的方法。
在这种情况下,首选的方式是什么?
就像其他人建议的那样,首选方法是使用具有可见性和静态选项的结构修饰符。但我可能会将其设为静态修饰符,因为它不会传递到字段中,而是简单地用于提取值,然后传递到字段中。您甚至可以在堆栈中分配它,并重用它以加快速度。
大致如下:
static struct { boolean vis_opt; boolean static_opt; } mod;
field
: modifier type TOK_IDENT TOK_SEMICOLON
{
$$ = new Field(..., mod.vis_opt, mod.static_opt, ...);
}
;
modifier
: visibility_opt static_opt
{
mod.vis_opt = $1;
mod.static_opt = $2;
}
;
visibility_opt
: /* default */ { $$ = true; }
| TOK_PUBLIC { $$ = true; }
| TOK_PRIVATE { $$ = false; }
;
static_opt
: /* default */ { $$ = false; }
| TOK_STATIC { $$ = true; }
;
Run Code Online (Sandbox Code Playgroud)
另外,除非您非常确定该语言的未来,否则您可能需要考虑将可见性设为枚举。你永远不知道在开发语言时你最终会梦想什么样的可见性,至少如果你把它放在一个枚举中,以后就更容易扩展。
享受。
| 归档时间: |
|
| 查看次数: |
1664 次 |
| 最近记录: |