语义分析器的构建

The construction of semantic analyser

在学习编译器的过程中,a 编写了一个简单的分词器和解析器(递归下降)。解析器构造一个抽象语法树。现在我要进行语义分析。但是我有几个关于语义分析器构造的问题。我应该使用通过树的递归调用在生成的抽象语法树上从语义上分析代码,还是应该构建另一棵树(例如使用访问者模式)以进行语义分析。我在网上找到a document说在解析的过程中应该对代码进行语义分析,但是不符合单一职责的规则,使得整个解析器更容易出错。或者我应该将语义分析作为中间表示生成器的一部分吗?也许我遗漏了什么,如果有人能为我澄清一下,我将不胜感激。

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

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

从简单开始,重点学习语义分析的内容。

您可以在清楚要优化的内容和原因后进行优化。