【编译原理】语法分析总结

本文深入分析了文法G1(E)和G2(E)在自顶向下LL(1)分析和自底向上算符优先、LR分析法的应用。针对文法的左递归问题,提出了消除左递归后的文法,并构造了预测分析表和算符优先分析表。同时,探讨了文法的冲突问题及其在LR分析中的适用性,展示了分析过程和分析表。
摘要由CSDN通过智能技术生成

一、语法分析思维导图

在这里插入图片描述

二、语法分析总结与讨论

文法1 G1(E): E→E+E | EE | (E) | id
文法2 G2(E):
E→E+T|T
T→T
F|F
F→(E)|id

研讨问题一:(自顶向下分析法)

(1)对于文法G1(E)能否采用确定的自顶向下分析法LL(1)进行分析?

答:因为文法G1(E)有左递归,所以文法G1(E)不能采用确定的自顶向下分析法LL(1)进行分析。

(2)对于文法G2(E)能否采用确定的自顶向下分析法LL(1)进行分析?

答:因为文法G2(E)有左递归,所以文法G2(E)不能采用确定的自顶向下分析法LL(1)进行分析。

(3)对于文法G2(E)经过改写后能否采用确定的自顶向下分析法LL(1)进行分析?若能,请构造预测分析表,并对字符串id+id*id#进行分析。

答:消除左递归后的文法为:
E→TE’
E’→+TE’|ε
T→FT’
T’→*FT’|ε
F→(E)|id
则文法 G2 的FIRST集合与FOLLOW集合为
FIRST(E) = { (,id }    FOLLOW(E) = { #,) }
FIRST(E’) = { +,ε }    FOLLOW(E’) = { #,) }
FIRST(T) = { (,id }    FOLLOW(T) = { +,#,) }
FIRST(T’) = { *,ε }   FOLLOW(T’) = { +,#,) }
FIRST(F) = { (,id }   FOLLOW(F) = { *,+,#,) }
预测分析表入下:
在这里插入图片描述
分析过程如下:
在这里插入图片描述
在这里插入图片描述

研讨问题二:(自下而上的分析法——算法优先分析法)

(1)对于文法G1(E)是否是算符文法?能否应用算符优先分析法进行分析?

答:算符文法的定义为:一个文法,若果它的任意产生式的右部都不包含两个相继(并列)的非终结符,则称为算符文法。
因为该文法的任一规则右部都不包含两个相邻的非终结符,所以该文法是算符文法。
算符优先文法的定义:如果一个算符文法G中的任何终结符对(a,b)至多只满足a=b、a<b、a>b这三个关系之一,则称G是一个算符优先文法。
因为 该文法+和*之间存在两种不同的优先关系,所以该文法不是算符优先文法。

(2)对于文法G2(E)能否采用算法优先分析法进行分析?若能,请构造算符优先分析表,并对字符串id+id*id#进行分析

答:G2(E)能采用算符优先分析法进行分析,分析过程如下:
计算得到每个非终结符的FIRSTVT和LASTVT:
在这里插入图片描述

构造G2(E)的算符优先关系表:
在这里插入图片描述

对输入串id+id*id#的分析过程如下:
在这里插入图片描述

研讨问题三:(自下而上的分析法——LR分析法)

(1)对于文法G2(E)能否采用LR(0)、SLR(1)、LR(1)分析法进行分析?若能,请构造相应的分析表,并对字符串id+id*id#进行分析。

答:文法G2(E)的拓广文法为:
0. E’→E
1. E→E+T
2. E→T
3. T→T*F
4. T→F
5. F→(E)
6. F→id
在这里插入图片描述

因为I1,I2,I9项目有移进归约冲突,所以不是LR(0)文法,不能用LR(0)分析法进
FOLLOW(E’)={ $ } ∩ { + }=∅FOLLOW(E)={+,),$ } ∩ { * }=∅所以,可以用SLR(1)方法解决。

SLR(1)分析表入下:
在这里插入图片描述

输入串id+id*id#的分析过程如下:
在这里插入图片描述
在这里插入图片描述

LR(1)项目集如下:
在这里插入图片描述

LR(1)分析表入下:
在这里插入图片描述
在这里插入图片描述

输入串id+id*id#的分析过程如下:
在这里插入图片描述

(2)对于文法G1(E),能否加入某些限制条件,构造LR分析表?这样做,有什么好处?

答:G1(E)文法的LR(0)DFA如图所示:
在这里插入图片描述

可以规定‘*’的优先级高于‘+’的优先级,且它们都服从左结合。
构造的二义性文法分析表如图所示:
在这里插入图片描述

这样构造LR分析表的优点是可以分析二义性文法,减少项目集的数量,提高分析效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值