sap*_*Pro 9 language-agnostic compiler-construction syntax
简单来说,任何人都可以解释"语法定向翻译"的含义吗?我开始从龙书中读到这个话题但是无法理解.在维基文章没有帮助.
Chr*_*odd 19
简单来说,"语法定向转换"意味着使用语法识别器(解析器)驱动整个编译(转换)过程.
从概念上讲,编译程序(将其从源代码转换为机器代码)的过程从生成解析树的解析器开始,然后通过一系列树或图转换来转换该解析树,每个转换都很大程度上是独立的,导致最终的简化树或图形遍历以生成机器代码.
这个视图虽然理论上很好,但有一个缺点,即如果你试图直接实现它,就需要足够的内存来保存整个树或图的至少两个副本.回到写龙书的时候(当很多这个理论被淘汰出来的时候),计算机内存的测量单位是千字节,64K就是很多.所以编译大型程序可能会很棘手.
使用语法定向转换,您可以围绕解析器识别解析树的顺序组织所有图形转换.解析器不是生成一个完整的解析树,而是构建它的一小部分,然后将这些位提供给编译器的后续传递,最终生成一小段机器代码,然后继续解析过程以构建下一个解析树.由于在任何时候只存在少量的解析树(或后续图形),因此需要更少的内存.由于语法识别器是控制所有这一切的主序列器(决定事件发生的顺序),因此称为语法定向转换.
由于这是一种减少内存使用的有效方法,人们甚至重新设计了语言以使其更容易实现 - 理想的情况是拥有一个"单通道"编译器,实际上可以完成从解析到机器代码生成的整个过程一次通过.
如今,记忆并不是很重要,因此将所有内容强制一次通过的压力就会减小.相反,您通常只使用语法直接翻译作为前端,解析语法,进行类型检查和其他语义检查,以及一些简单的转换,这些转换都来自解析器并生成一些内部形式(三种地址代码,树或某种类型的dag) )然后具有独立的优化和后端传递(因此不是语法指导).即使在这种情况下,您可能会声称这些后来的传递至少部分是语法指导的,因为编译器可能被组织为对大部分输入(例如整个函数或模块)进行操作,在继续执行之前推送所有传递.下一条输入.
像yacc这样的工具是围绕语法定向翻译的思想设计的 - 该工具生成一个语法识别器,可直接运行代码片段(工具用语中的"动作"),因为生成(解析树的片段)被识别,而无需创建一个真正的'树'.这些操作可以直接调用编译器中逻辑上稍后传递的内容,然后返回继续解析.驱动所有这一切的命令式主循环是解析器的令牌读取状态机.