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

文章目录

一、语法分析思维导图

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

二、语法分析总结与讨论

文法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分析表的优点是可以分析二义性文法,减少项目集的数量,提高分析效率。

上一篇:freemodbus modbus TCP 学习笔记


下一篇:8、逻辑门电路概述