语义检查与提升精神x3

Semantic checks with boost spirit x3

本文关键字:x3 语义检查      更新时间:2023-10-16

我目前正在尝试使用boost spirit x3编写编译器。我完成了解析器(现在没有语义操作和错误处理,只是解析为ast)。由于我想实现支持作用域和函数调用的语言,我问自己何时检查被调用的函数是否存在?我应该检查一个函数是否存在于当前作用域中,而构建ast(同时解析与语义动作),或者我应该检查这在编译ast ?作用域堆栈也是如此。我应该在解析时建立作用域堆栈,使用语义操作,还是在编译出最后一个?

问题没有明确说明。

这在很大程度上取决于你正在实现的语言的性质(它是如何进行作用域的?你有词法范围吗?闭包?你会有动态堆栈吗?协同程序?变量是动态的还是完全静态的?打字?).

我应该检查一个函数是否存在于当前作用域中,而构建ast(而解析与语义动作),或者我应该检查这个,而编译的ast ?

就像我说的,两个都可以工作。我通常推荐"关注点分离"。在大多数情况下,只进行简单的解析并在AST上(多次)操作要简单得多,并且会产生更清晰、更容易扩展的代码。

根据具体情况(例如,当您希望变量在解析过程中潜在地遮蔽某些关键字或其他上下文感知谓词时),您可能需要在作用域中维护具有已知标识符的符号表。这将——我认为——构成一种设计气味,您应该考虑是否需要这种复杂性。

作用域堆栈也是如此。我应该在解析时建立作用域堆栈,使用语义操作,还是在编译出最后一个?

同样,在编译过程中操作通常要简单得多。