第三章学习了词法分析,本章来学习语法分析的其中一种方法,语法分析大体上分为两类,一种是自顶向下分析法,一种是自底向上分析方法。
本章,主要讲解的是自顶向下的分析方法
首先明确:
语法分析的任务:
检查源程序语法上是否正确,识别语法成分,并生成语法树供下一个阶段使用。
出现错误处理要求:
自顶向下的语法分析和自底向上的语法分析的区别:
自顶向下的语法分析:从文法识别符号开始,构造句子的最左推导
自底向上的语法分析:构造句子的最左规约,规约到文法识别符号。
自顶向下分析方面临的问题:
自顶向下语法分析面临的问题-回溯问题,回溯大大降低效率。
自顶向下分析法(不带回溯方法)中的LL(K)分析法和递归下降法不在考察范围之内。
故本节重点放在如何求first集和follow集
不带回溯的分析方法:first集合和follow集合
关于first集和follow集的求法已经放到了另一篇博客中编译原理必考大题:first集和follow集的求法
自底向上也称移进归约法,关键问题在于如何找到当前句柄.
其实就是把一个语法的句柄,一步一步规约.
作为自底向上分析方法的一个重要的方法,需要熟练掌握
LR(k)分析方法:
L:从左到右扫描所给定的输入串.
R:以相反的方向构造该输入串的最右推导
k:做出分析决定需要向前看的输入符号的个数.
练习:给定LR分析表和文法,分析((a))
方法步骤:
本小节,作为必考大题的一部分,为单独撰写在编译原理必考大题:构造项目集规范族
拓广文法
: 使文法只有一个以识别符号作为左部的产生式,从而构造出来的分析器有唯一的接受状态.
活前缀和可归活前缀
:
一个句型的可归活前缀就是句柄,活前缀是句柄从删除一个或若干个符号,保证>=1个.
例如一个句型的句柄是abcd,那么他的活前缀就是a,ab,abc,abcd,可规活前缀就是abcd
当项目集中存在移进-规约冲突和归约-归约冲突,可以避免无法构造出分析表的问题.
从本质上来说:通过向前查看一个输入符号来协助解决冲突,该文法就是SLR(1)文法.
简单来说,就是求非终结符号的follow集,然后在又移进又规约的时候,或者出现多次规约的时候,根据R规约成的非终结符号,确定该非终结符号的follow集,它的follow集合里面有哪些终结符号,就在哪些终结符号的下面写r几,而LR(0)文法是整行去写.
简单来说,SLR(1)和LR(1)在项目集规范族的构造角度上来说一样,只是之后的处理不一样,前者需要求follow集,再构造SLR(1)分析表,后者直接就能写出分析表,
综上就避免了冲突
题目一
证明下列的文法是SLR(1)文法
证明文法是SLR(1)文法,就是写出项目集规范族,之后,发现存在规约与规约之间的冲突或者规约和移进之间的冲突,就说明他不是LR(0)型文法,而是SLR(1)型文法。
简言之,有冲突就是SLR(1)型文法
本节并非重点,重点在于讲述原理。
LR(1)文法能进一步解决SLR(1)文法仍解决不掉的问题。
必须掌握
方法:
例题一
例题二
本节也非重点,但是复习要全面,掌握目的,分析能力,局限性即可。
目的:化简LR(1)分析,减少资源开销
分析能力:高于SLR(1)分析
局限性:合并中不出现归约归约冲突。
YACC源程序是用YACC语言编写的语法说明规则,
Y_tab.c是该语言的语法分析器
YACC生成LALR(1)分析器
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。