使用boost spirit x3进行语义检查

时间:2016-08-13 11:41:47

标签: c++ compiler-construction c++14 boost-spirit boost-spirit-x3

我目前正在尝试使用boost spirit x3编写编译器。 我完成了解析器(现在没有语义操作和错误处理,只是解析为ast)。 由于我想实现支持范围和函数调用的语言,我问自己何时检查被调用的函数是否存在? 我应该在构建ast时检查当前作用域中是否存在函数(在使用语义动作进行语法分析时),还是应该在编译ast时检查它? 与范围堆栈相同。我应该在解析时,使用语义动作,还是在编译ast时构建范围堆栈?

1 个答案:

答案 0 :(得分:1)

问题非常严重。

其中大部分在很大程度上取决于您正在实施的语言的性质(它如何确定范围?您是否有词汇范围?闭包?您是否有动态堆栈?协同程序?变量是动态的还是完全静止?打字?)。

  

在构建ast时(在使用语义操作进行语法分析时)是否应该检查当前作用域中是否存在函数,还是应该在编译ast时检查它?

就像我说的,都可以工作。我通常建议分离关注。只需简单地解析并在AST上运行(多次)就可以更容易思考,并在大多数情况下使代码更简洁,更容易扩展。

根据具体情况(例如,当您希望变量可能隐藏某些关键字时,或者在解析过程中某些其他上下文感知谓词时),您可能需要例如维护范围内具有已知标识符的符号表。这将 - IME - 构成一种设计气味,您应该考虑是否需要复杂性。

  

与范围堆栈相同。我应该在解析时,使用语义动作,还是在编译ast时构建范围堆栈?

同样,在编译过程中做一些事情通常要简单得多。