各种文法比较

各种文法比较

ID:21119809

大小:44.50 KB

页数:4页

时间:2018-10-19

各种文法比较_第1页
各种文法比较_第2页
各种文法比较_第3页
各种文法比较_第4页
资源描述:

《各种文法比较》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、各类文法之间的比较处理文法的语法分析器大体上可以分为三种类型:通用的、自顶向下的、和自底向上的。象Cocke-Younger-Kasami算法和Earley算法这样的通用语法分析方法可以对任意文法进行语法分析。然而,这些通用方法效率很低,不能用于编译器产品。编译器中常用的方法可以分为自顶向下的和自底向上的。正如它们的名字所指出的,自顶向下的方法从语法分析树的顶部(根结点)开始向底部(叶子结点)构造树,而自底向上的方法从叶子结点开始,逐渐向顶部构造。这两种分析方法中,语法分析器的输入总是按照从左向右的方式被扫描,每次扫描一个符

2、号。最高效的自顶向下方法和自底向上方法只能处理某些文法子类,但其中的某些子类,特别是LL和LR文法,的表达能力已经足以描述现代程序设计语言的大部分语法构造了。手工实现的语法分析器通常使用LL文法;比如预测分析方法能够处理LL文法。处理较大的LR文法类的语法分析器常常是由自动化工具构造得到的。自顶向下的文法自顶向下语法分析可以被看作是为输入串构造语法分析树的问题,它从语法分析树的根结点开始,按照先根次序创建这棵语法分析树的各个结点。自顶向下语法分析也可以被等价地看作寻找输入串的最左推导的过程。在一个自顶向下语法分析的每一步上,

3、关键问题是确定对一个非终结符号,比如说A,应用哪个产生式。一旦某个A-产生式被选中,语法分析过程的其余部分负责将相应产生式体中的终结符号和输入相匹配。对于有些文法,我们可以构造出向前看k个输入符号的预测语法分析器。这一类文法有时被称为LL(k)文法类。根据一个文法的FIRST和FOLLOW集合,我们将构造出“预测分析表”,它指明了如何在自顶向下语法分析过程中选择产生式。这些集合也可以被用于自底向上语法分析。对于一类被称为LL(1)的文法,我们可以构造出预测语法分析器,也就是不需要回溯的递归下降语法分析器。LL(1)中的第一个

4、“L”表示从左到右扫描输入,第二个“L”表示产生最左推导,而“1”则表示在每一步中只需要一个向前看符号来决定语法分析动作。LL(1)文法类已经足以描述大部分程序设计语言构造,虽然在为源语言写出适当的文法时需要多加小心。比如,左递归的文法和二义性的文法都不可能是LL(1)的。一个文法G是LL(1)的,当且仅当对于G的任意两个不同的产生式Aàα

5、β,下面的条件一定成立:1、不存在终结符号a使得α和β都能够推导出以a开头的串。2、α和β中最多只有一个可以推导出空串。3、如果βε,那么α不能推导出任何以FOLLOW(A)中的某个终结

6、符号开头的串。类似地,如果αε,那么β不能推导出任何以FOLLOW(A)中的某个终结符号开头的串。前两个条件等价于说FIRST(α)和FIRST(β)是不相交的集合。第三个条件等价于说如果ε在FIRST(β)中,那么FIRST(α)和FOLLOW(A)是不相交的集合,并且当ε在FIRST(α)中时类似结论成立。之所以能够为LL(1)文法构造一个预测分析器,原因是只需要检查当前输入符号就可以决定为一个非终结符号选择哪个正确的产生式。因为有关控制流的各个语言构造带有不同的关键字,它们通常满足LL(1)的约束。比如,如果我们有如下

7、产生式stmtàif(expr)stmtelsestmt

8、while(expr)stmt

9、{stmt_list}那么关键字if,while和符号{告诉我们:如果我们想要在输入中找到一个语句,那么只有选择哪个产生式才可能匹配成功。接下来给出的算法将FIRST和FOLLOW集合中的信息放到一个预测分析表M[A,a]中去。这是一个二维数组,其中A是一个非终结符号而a是一个终结符号或特殊符号$,即输入的结束标记。该算法基于如下的思想:只有当下一个输入符号a在FIRST(α)中时才选择产生式Aàα。只有当α=ε时,或更加一般化的αε时

10、,情况才有些复杂。在这种情况下,如果当前输入符号在FOLLOW(A)中,或者已经到达输入中的$符号、且$在FOLLOW(A)中,我们仍应该选择Aàα。自底向上的文法一个自底向上的语法分析过程对应于为一个输入串构造语法分析树的过程,它从叶子结点(底部)开始逐渐向上到达根结点(顶部)。将语法分析描述为语法分析树的构造过程会比较方便,虽然编译器前端实际上并不构造出显式的语法分析树,而是直接进行翻译。LR语法分析器是表格驱动的,在这一点上它和非递归LL语法分析器很相象。如果我们可以使用本节和下一节中的某个方法为一个文法构造出语法分析

11、表,这个文法就被称为LR文法。直观地讲,只要存在一个从左到右扫描的移入-归约语法分析器,它总是能够在某文法的最右句型的句柄出现在栈顶时识别出这个句柄,这个文法就是LR的。因为诸多原因,LR语法分析技术很有吸引力:对于几乎所有的程序设计语言构造,只要能够写出该构造的上下文无关文法,就能够构造

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。