您的位置:首页 > 其它

编译原理中的语法分析——自顶向下

2016-12-22 20:29 821 查看

语法分析——自顶向下

语法分析在编译原理的:



语法分析分为自顶向下自下而上

自顶向下:(就是从文法的句子可以归约出开始符,简单的说就是从一个语法树的底部推出语法树的根)

自下而上:(就是从文法的开始符推出文法的句子,简单的说就是从一棵语法树的根推出语法树的叶子结点)

现在我们先来讨论自顶向下,自顶向下语法分析的文法应该构造成什么样子呢?

LL(1)文法

那构造LL(1)文法的条件是什么呢?,首先来看看自顶向下会出现的问题

1.产生文法的左递归,左递归会带来什么坏处呢?

陷入死循环

就如



因为建立一个语法树是从左往右建立,这样文法的左部就会一直伸长,二次文法的句子得不到匹配就会陷入死循环。(可怕ヽ(*。>Д<)o゜)。

消除文法的左递归的方法:



修改后的一般格式:



通式:



其中,每个a都不等于空,每个B都不以P开头,修改后的文法形如:



2.文法的回溯,这个又会导致什么问题呢?

这个会影响语法分析程序的效率。我们只需要提取左因子即可:



这样我们得到的文法就是不产生左递归和回溯的文法了,我们要自顶向下语法分析就得产生一个LL(1)文法,那么LL(1)文法怎么定义呢?


首先思考怎么产生first集和follow集呢?

书上其实讲得我头晕脑胀,呵呵,所谓得专家就是挨板砖的家伙,你永远也get不到他要讲什么。所以我就通俗的以我的理解给大家讲讲。



如上文法:

first集

先看E的first集,很明显,如果E的最左边开始就有终结符了,那么这个终结符就是E的first集,如果没有那也没有关系,就看T,就将T推导出的第一个最左终结符视为E的first集,可能这时候有人就会问了如果T为空怎么办呢?那么你就接着看下一个非终结符就行了,将下一个非终结符推导出的最左终结符算作E的first集,如果T和E’都为空怎么办呢?那就直接把E的first集写为空就可以了,E’的first集就可以简单的得出是+和空了,T可以见E同理可得,T’见E’同理可得,F的first集就为(和i

:



follow集(切记follow中永远都没有空)

E->TE’

看E可以将E的follow加入E’的follow,(A->aBb或者A->aB,如果在A->aBb中,b为空,那么A的follow集可以加入B的follow集中,这里我们将a视为T,将E’视为B)。

E的follow也可以加入到T的follow集中E’可以为空,根据第二个产生式所述,我们可以将E视为A,将a视为空,将T视为B,将E’视为b,b这里是空。

因为产生式E->TE’,说明E’在T的后面我们就可以把E’的first集加入到T的follow集中。

E’->+TE’|空

这样我们可以得到E’的follow集可以是E’的follow集(屁话,形式一下)E’的follow集加入到T的follow集,因为E’为空,(左边)E’视为A,+视为a,T视为B,(右边)E’视为b,(A->aBb或者A->aB,如果在A->aBb中,b为空,那么A的follow集可以加入B的follow集中,这里我们将a视为T,将E’视为B)。

因为产生式E’->TE’,说明E’在T的后面我们就可以把E’的first集加入到T的follow集中。

T->FT’ 同E->TE’可得

T’->*FT’|空 同E’->+TE’|空,可得

F->(E)|i

说明E的follow集应该加入)



关于

语法分析程序

有两种

递归下降分析程序



预测分析程序

递归下降分析程序,是体现的计算思维的自动化。

由于语法在定义的时候,文法单位之间的定义是相互的引用甚至可能形成嵌套,子程序之间可能形成相互调用或者递归调用。通过子程序之间的相互调用来实现对输入串的识别,这样的分析程序叫做递归下降分析程序,主要是因为文法分析程序的递归调用。

预测分析程序,是体现的计算思维的知识与控制的分离(好处将来可以自动的产生预测分析程序,只要针对任何一个LL(1)文法自动的产生一个分析表绑上一个通用的总控程序,就可以得到一个LL(1)文法的预测分析程序)。

关于其分析表的建立,是将所有元素的first集和follow集出空以外的元素写在那一横行,每一列写不同的非终结符,这个非终结符的first集就写这个非终结符推导出来的产生式,如果非终结符推导出来了空,就将非终结符产生出来的空写在follow集元素的下面。

自顶向下语法分析大致就是这样的了,我快没有时间了,只能给大家初略的讲讲

此文章是根据听了国防科技大学的老师和我们学校的老师讲课所写
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: