【20200415】编译原理课程课业打卡十五之求解预测分析表&分析输入串是否为文法句子
叮嘟!这里是小啊呜的学习课程资料整理。好记性不如烂笔头,今天也是努力进步的一天。一起加油进阶吧!
一、课业打卡十五之求解预测分析表&分析输入串是否为文法句子
题目描述:
对文法G[S]:
S->a|^|(T)
T->T,S|S
(1)给出 (a,(a,a)) 和 (((a,a), ^ ,(a)), a) 的最左推导。
(2)对文法G进行改写,然后对每个非终结符写出不带回溯的递归子程序。
(3)经改写后的文法是否是LL(1)的?给出它的预测分析表。
(4)给出输入串 (a,a)# 的分析过程,并说明该串是否为G的句子。
题解如下:
(1)给出 (a,(a,a)) 和 (((a,a), ^ ,(a)), a) 的最左推导。
(2)对文法G进行改写,然后对每个非终结符写出不带回溯的递归子程序。
(3)经改写后的文法是否是LL(1)的?给出它的预测分析表。
(4)给出输入串 (a,a)# 的分析过程,并说明该串是否为G的句子。
二、知识巩固
1、上下文无关文法的句型的推导
最左(最右)推导
:在推导的任何一步α=>β,其中α、β是句型,都是对α中的最左(右)非终结符进行替换。
**最右**推导被称为规范推导。
由规范推导所得的句型称为规范句型。
2、分析算法分类
自上而下分析法
:从文法的开始符号出发,反复使用各种产生式,寻找与输入符号匹配的最左推导。
自下而上分析法
:从输入符号串开始,逐步进行归约(最右推导的逆过程),直至归约到文法的开始符号。
3、分析算法伪代码
BEGIN
首先把’#‘然后把文法开始符号推入栈;把第一个输入符号读进a; FLAG:=TRUE;
WHILE FLAG DO
BEGIN
把栈顶符号上托出去并放在X中;
IF X 属于 Vt THEN IF X=a THEN
把下一个输入符号读进a
ELSE ERROR
ELSE IF X=‘#’ THEN
IF X=a THEN FLAG:=FALSE
ELSE ERROR
ELSE IF M[X,a]={X->X1X2..XK}
THEN 把XK,X K-1,..,X1一一推进栈
ELSE ERROR
END OF WHILE;
STOP/*分析成功,过程完毕*/
END
4、预测分析表构造算法
1.对文法G的每个产生式A->q 执行第二步和第三步;
2.对每个终结符a属于FIRST(q),把A->a加 至M[A,a]中,
3.若 空字 属于FIRST(q),则对任何 b属于FOLLOW(A)
把A->q 加至M[A,b]中,
4.把所有无定义的M[A,a]标上“出错标志”。
5、非LL(1)文法的改造
(1) 消除左递归
(2) 提左公因子
将产生式A->aβ|ay 变换为:
A->aB
B ->β|y
实例:
6、分析符号串是否为文法的句子实例
Ending!
更多课程知识学习记录随后再来吧!
就酱,嘎啦!
注:
人生在勤,不索何获。