语义分析器的构建

时间:2018-04-07 19:06:30

标签: parsing compiler-construction abstract-syntax-tree semantic-analysis

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

1 个答案:

答案 0 :(得分:6)

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

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

从简单开始,专注于学习语义分析。

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