使用Bison构建AST
Building an AST using Bison
我正在与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; }
;
在上面的例子中,我希望字段规则返回一个field节点,但我需要在解析过程中传递的修饰符规则的一些属性(即,这些是合成属性)。
我能想出两种方法在不改变语法的情况下做到这一点。
- 使非终端修饰符具有类型Field,在此处创建新的Field,尽我所能填充,并将其传递给Field以填充其余部分
- 让修饰符拥有自己的类型,该类型包含两个布尔值,并在字段规则中创建新字段时向上传递提取数据
在这种情况下,首选的方法是什么?
像其他人建议的那样,首选的方法是使用具有可见性和静态选项的structModifier。但我可能会将其作为一个静态修饰符,因为它不会传递到字段中,而是简单地用于提取值,然后传递到字段。您甚至可以在堆栈中分配它,并重用它以使其更快。
大致如下:
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; }
;
此外,除非您对该语言的未来非常确定,否则您可能需要考虑将可见性作为枚举。你永远不知道在开发语言时,你最终可能会梦想什么样的可见性,至少如果你把它放在枚举中,以后更容易扩展。
享受吧。
相关文章:
- C++为构建时间获取QDateTime的可靠方法
- 无法在 CLion 中构建 C++ 项目
- 函数向量_指针有不同的原型,我可以构建一个吗
- 如何使用ndk-build.cmd构建Android.so文件
- libssh 的函数在构建 libssh 时无法在 Qt 和 cmake 错误中找到
- 如何克服提升精神AST混乱
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- VSCode-有一个红色下划线,但程序构建和运行正确,并且出现配音错误
- 构建可组合有向图(扫描仪生成器的汤普森构造算法)
- 无法使用Qt Creator在Windows中构建yaml-cpp
- 构建一个由C和C++文件组成的库
- llvm构建器向基本块添加终止符
- FLTK 2.0构建和演示,适用于VS2019的2011年左右的代码库
- 如何跨平台将二进制资源构建到程序中?
- 将 OpenCV 与 CMAKE 中的项目一起构建为第三方库的正确方法
- 如何解决 Ninja c++ 构建和执行问题
- 使用 cmake 的 LLVM 构建在 tsan_libdispatch_mac.cc 期间失败; "Error: conflicting types for ..."
- clang 插件:在编译过程中修改 AST
- 以编程方式构建一个叮当作响的AST
- 使用Bison构建AST