目前,我正在尝试使用boost write x3编写一个编译器。我完成了解析器(现在没有语义操作和错误处理,只是将其解析为ast)。因为我想实现支持作用域和函数调用的语言,所以我问自己什么时候应该检查被调用的函数是否存在?在构建ast时,应该检查函数是否存在于当前作用域中(同时使用语义操作进行解析),还是在编译ast时检查这一点?范围堆栈也是如此。在解析、使用语义操作或编译ast时,我应该构建范围堆栈吗?
发布于 2016-08-13 23:03:25
这个问题严重地被低估了。
这在很大程度上取决于您正在实现的语言的性质(它是如何进行范围界定的)?你会进行词汇范围界定吗?关闭?你有动态堆栈吗?科鲁丁?变量是动态的还是完全静态的?打字?)。
在构建ast时,应该检查函数是否存在于当前作用域中(同时使用语义操作进行解析),还是在编译ast时检查这一点?
就像我说的,两者都能起作用。我通常建议把关注点分开。简单地解析,然后对AST (多次)进行操作,考虑起来要简单得多,而且在大多数情况下,代码的扩展更容易。
根据具体情况(例如,当您希望变量在解析期间对某些关键字或其他上下文感知谓词进行隐藏时),您可能需要维护一个具有已知标识符的符号表。这将- IME -构成一种设计气味,你应该考虑你是否需要的复杂性。
范围堆栈也是如此。在解析、使用语义操作或编译ast时,我应该构建范围堆栈吗?
同样,在编译过程中进行操作通常要简单得多。
https://stackoverflow.com/questions/38932341
复制相似问题