抽象语言语法描述

2024-09-28 15:38:18 发布

您现在位置:Python中文网/ 问答频道 /正文

问题:

什么是zephyrasdl?它与其他编译器技术(如lexer和解析器生成器)有何关联?在

(如果你写得相当完整,我会很感激,但是当它变得相当技术化的时候,请参考其他在线参考资料,因为我对编译器的了解大多来自于使用yacc和flex,用C编写一个简单的maximunch lexer,以及在网上查找和阅读资料)

问题背景:

我一直在读http://docs.python.org/devguide/compiler.html,我遇到了以下一行:

The specification of the AST nodes is specified using the Zephyr Abstract Syntax Definition Language (ASDL).

我根据下面的引文找到: http://www.cs.princeton.edu/research/techreps/TR-554-97。在

我对这篇文章的第一次阅读相当混乱,我希望在再次尝试之前,能够首先更好地理解ASDL的目的(在编译过程中)。在


Tags: thehttp解析器编译器技术flex参考资料lexer
2条回答

当您需要在一个模块中生成一个树,并在另一个模块中输入相同的树(或者几乎相同的树,以某种方式优化)时,可以使用ASDL。在

为此,你需要有构造的功能(最好是用类型检查器),打印树的功能,这样你就可以确定你生成的树是正确的。在

ASDL将一些树作为输入,这些树的语法与代数数据类型(如haskell或ml)的语法几乎相同,或BNF中的语法更为简化,并自动生成所有的构造器,从树的简单描述开始打印函数。在

例如,如果您有一个lexer,它将必须生成具有类型的lexem。您还需要查看词素的输出流(这是线性形式,因此是一个非常简单的树)。与其编写用于打印、构造词素的函数,不如像这样定义它们

   lexeme=
       ID(STRING)
     | INT(num_integer)
     | FLOAT(num_float)
     attributes(int coord_x, int coord_y)
   num_integer:
     ....
   num_float:
     ....

从lexer调用构造函数ID、INT、FLOAT等。ASDL将在您需要的所有函数中转换这个简单语法,或者为AST构造节点,或者打印,或者您需要的任何东西。ASDL不对生成的代码施加限制。在

如果将attributes添加到某个类型,例如令牌的坐标,则此类属性将附加到该类型的每个构造函数的参数中。在

由解析器创建的更复杂的树应该是这样的

^{pr2}$

在本例中,asdl将检查解析器对SUM(\uu)的调用是否会传递给使用expr的一个构造函数创建的SUM节点。num_integer是在外部定义的,可能是由lexer的asdl树定义的。在

请注意,不允许定义包含正则表达式的构造函数,例如number: [0-9]+。ASDL比EBNF简单。在

这些构造函数将被定义为,为了构建您所需要的内容,并且除此之外,它们还会进行类型检查,以确保lexer/parser/code generator输出的树符合asdl定义的语言。在

为了更好地理解ASDL,您需要编写3-4个解析器,看看它们生成的代码中有什么共同之处。这个公共部分实际上是ASDL,因此这是对解析器输出的抽象。在

Lexer和Parser生成器接受词素和语法的描述,并生成实现相应工件的代码。Lex需要正则表达式来描述令牌。解析器生成器采用各种扩展的BNF符号。在

你参考的论文非常清楚:ASDL是一种抽象描述一组树节点(它们的类型和签名)的语言。使用这种语言,我们可以编写一个工具(论文的作者也是这样做的),它将这些描述转换成一组记录类型,您需要这些记录类型来实现与解析器一起使用的树。所以ADSL有点像regex和BNF,因为它的目的是提供给生成编译器一部分的代码生成器。在

一种广泛的观点认为编译器是一种很好理解的技术,人们应该能够从对不同部分的描述中生成它们。Regex/BNF/ADSL是解析阶段的关键。在

理想情况下,你会喜欢目标指令集的描述语言、流分析、从抽象树到目标指令集的转换(你提到过最大munch),以及描述优化的方法。然后,使用针对每一部分的相应工具,您可以从“规范”构建整个编译器。有 实际上在这方面做了很多工作,人们都是分开做的,也一起做的。不出所料,其中一些来自普林斯顿大学的“Zephyr”项目(看起来那里的Zephyr网站现在已经死了),它的目标就是做这种事情。在

无论如何,试着在谷歌学者下寻找“编译器生成器”。在

相关问题 更多 >