语义分析器的构建

Ady*_*ock 2 compiler-construction parsing abstract-syntax-tree semantic-analysis

在学习编译器的过程中,写了一个简单的标记器和解析器(递归下降).解析器构造一个抽象语法树.现在我要进行语义分析.但是我有一些关于语义分析器构造的问题.我是否应该使用树中的递归调用在生成的抽象语法树上语义分析代码,或者我应该构建另一个树(例如使用访问者模式)以进行语义分析.我在网上发现了一个文档,说我应该在解析过程中语义分析代码,但它不符合单一责任规则,并使整个解析器更容易出错.或者我应该将语义分析作为中间表示生成器的一部分?也许我错过了什么,如果有人能为我澄清这件事,我将不胜感激.

Ira*_*ter 6

你在学习.把事情简单化; 解析完成后,构建一个树并在树上运行语义分析器.

如果您决定(某一天)构建一个快速编译器,您可以考虑在解析时实现一些语义分析.这使得构建解析器和语义分析器变得更加困难,因为它们现在正在进行交互(纠结是一个更好的词,阅读为什么大多数C++解析器使用所谓的"lexer hack"实现,如果你想生病).您还会发现有时候您需要的信息不可用("到目前为止定义的goto的目标是什么?"因此您通常无法完成解析运行的完整工作,或者您可能不得不延迟一些语义稍后在解析中进行处理,这很难安排.我不建议在编译器教育的早期添加这种复杂性.

从简单开始,专注于学习语义分析的内容.

您可以在以后明确优化内容以及为什么要这样做时进行优化.