【问题标题】:Semantic checks with boost spirit x3使用增强精神 x3 进行语义检查
【发布时间】:2016-12-20 07:35:47
【问题描述】:
我目前正在尝试使用 boost spirit x3 编写编译器。
我完成了解析器(现在没有语义操作和错误处理,只是解析成 ast)。
既然我想实现语言来支持作用域和函数调用,我问自己什么时候检查被调用的函数是否存在?
我应该在构建 ast 时检查当前范围内是否存在函数(在使用语义操作进行解析时),还是应该在编译 ast 时检查这个?
范围堆栈也是如此。我应该在解析、使用语义操作还是在编译 ast 时建立范围堆栈?
【问题讨论】:
标签:
c++
compiler-construction
c++14
boost-spirit
boost-spirit-x3
【解决方案1】:
这个问题被严重低估了。
其中大部分在很大程度上取决于您正在实现的语言的性质(它是如何进行范围界定的?你会有词法范围界定吗?闭包?你会有动态堆栈吗?协程?变量是动态的还是完全静态的? ? 打字?)。
我应该在构建 ast 时检查当前范围内是否存在函数(在使用语义操作进行解析时),还是应该在编译 ast 时检查这一点?
就像我说的,两者都可以工作。我通常推荐关注点分离。在大多数情况下,只需简单地解析并在 AST 上(多次)操作就更容易思考,并且在大多数情况下会产生更清晰、更容易扩展的代码。
根据情况(例如,当您希望变量在解析期间隐藏某些关键字或其他一些上下文感知谓词时),您可能需要例如维护一个范围内具有已知标识符的符号表。这会 - IME - 构成设计味道,您应该考虑是否需要复杂性。
作用域栈也是如此。我应该在解析、使用语义操作还是编译 ast 时构建范围堆栈?
同样,在编译过程中做事通常要简单得多。