编译原理-求文法G的预测分析表

前言

  • 为什么求预测分析表:为了消除回溯,前面做了许多准备。其中关键是FIRST集合和FOLLOW集合,它们两个组合,达到了预测候选式的目的。为了使计算机比较好处理,把它们的预测结果统计成一张二维表,这就是求预测分析表的原因
  • 定义:M[A][a] 是一个二维数组,其中行A表示的是栈顶符号,a表示的读头下的符号(A为非终结符,a为终结符),它们存放的是当前状态下所使用的候选式(或存放出错标志,指出A不该面临a的输入)
    微信公众号:JavaWeb架构师

预测分析程序的算法(栈顶为X,读入头下为a)

  • 1)X = a = ‘#’:识别成功,推出分析程序(X为终结符)
  • 2)X = a ≠ ‘#’:进行匹配,弹出X,读头后移(X为终结符)
  • 3)X ≠ a:进行error处理(X是终结符)
  • 4)若X是非终结符,则查询预测分析表M,若M[X,a]中有关于X的产生式,则弹出X,将产生式入栈;如果M[X,a]中是出错标志,则error处理

预测分析表求法

  • 步骤

    • 1)求出所有非终结符的FIRST集合,FOLLOW集合
    • 2)求出所有产生式的SELECT集合
    • 3)按规则填预测分析表
  • 填表规则

    • 根据FIRST集合,看该位置是填候选式还是出错标志(输入符号不存在于FIRST集合中,就是出错标志)
    • 若要填候选式,根据SELECT集合的元素对应填写候选式

例子

  • 题目:表达式文法为,E是开始符
E  →  E+T | T
TT*F | F
F  →  i | (E)

解:

  • 前期准备
    1)消除P → P,ε
    2)消除左递归,得到文法(点击查看如何消除左递归)
1.E  →  TE'
2.E'  →  +TE' | ε
3.T  →  FT'
4.T'  →  *FT' | ε
5.F  →  i | (E)

  • 正式开始求预测分析表
    1)求出所有非终结符的FIRST集合,FOLLOW集合
非终结符:E、TFT'、E'

---------------FIRST(E)、FIRST(T)、FIRST(F)---------------
FIRST(E) = FIRST(T) = FIRST(F) = {i,(};     //  1. 3. 5.

---------------FIRST(T')---------------
FIRST(T') = {*, ε} ;      // 4.

---------------FIRST(E')---------------
FIRST(E') = {+, ε} ;      // 2.
非终结符:E、TFT'、E'
---------------FOLLOW(E)---------------
FOLLOW(E) = {#, )};    // 5.

---------------FOLLOW(T)---------------
A = FIRST(E') - {ε} = {+};    // 1.
B = FOLLOW(E) = {#, )};    // 1.
C = FOLLOW(E') = {#, )};

∴ FOLLOW(T) = A ∪ B ∪ C = {#, ), +};

---------------FOLLOW(F)---------------
A = FIRST(T') - {ε} = {*}
B = FOLLOW(T') = {#, ), +};
C = FOLLOW(T) = {#, ), +};

∴ FOLLOW(F) = A ∪ B ∪ C = {#, ), +, *};

---------------FOLLOW(T')---------------
FOLLOW(T') = FOLLOW(T) =  {#, ), +};

---------------FOLLOW(E')---------------
FOLLOW(E') = FOLLOW(E) = {#, )};

2)求出所有产生式的SELECT集合

SELECT(E  →  TE') = FIRST(T) = {i,(};
SELECT(E'  →  +TE') = { + };
SELECT(E'  →  ε) = FOLLOW(E') = {#, )};    // | 连接的,分开出来
SELECT(T  →  FT') = FIRST(F) = {i,(};
SELECT(T'  →  *FT') = {*}
SELECT(T'  →  ε) = FOLLOW(T') =  {#, ), +};
SELECT(F  →  i) = {i}
SELECT(F  →  (E) ) = {(} 

3)按规则填预测分析表

i+*()#
EE → TE’E → TE’
TT → FT’T → FT’
FF → iF → (E)
T’T’ → εT’ → *FT’T’ → ε
E’E’ → +TE’E’ → ε

其它

课件下载:

关注下方微信公众号,
回复:
预测分析表.code

完整教程PDF版本下载

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值