【问题标题】:The construction of semantic analyser语义分析器的构建
【发布时间】:2018-09-17 13:20:16
【问题描述】:

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

【问题讨论】:

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


    【解决方案1】:

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

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

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

    当你清楚你必须优化什么以及为什么要优化时,你可以稍后进行优化。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-09
      • 1970-01-01
      • 2012-02-01
      • 2010-11-27
      • 1970-01-01
      • 2012-08-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多