消除左递归和LL(1)文法造表

消除左递归和LL(1)文法造表

1.消除左递归

1.1定义

有A->Aa形式的产生式的文法为直接左递归文法。
类似,若是多步推导得到A->Aa形式的产生式的文法为间接左递归文法。

1.2直接左递归消除($表示空串)

原产生式:
A->Aa|b
消除后:
A->bA’
A’->aA’| E>E+T|TE>TEE>+TE| 原 产 生 式 : E − > E + T | T 消 除 后 : E − > T E ′ E ′ − > + T E ′ |

1.3间接左递归消除

原产生式:
S->Aa|b
A->Ac|Sd| SAA>Ac|Aad|bd| 先 将 S 代 入 A 中 , 发 现 直 接 左 递 归 : A − > A c | A a d | b d |
消除后:
A->bdA’|A’
A’->cA’|adA’|$

1.3联想特殊正规式化简

有些重点的正规式化简需要特殊记忆,如下:
x=rx+t 化简为 x=r*t
x=xr+t化简为 x=tr*
其中,第二条正规式化简公式很类似于左线性文法消除。

2.LL(1)文法

LL(1)是一种无回溯自顶向下分析方法,又叫预测分析法。

2.1 Select集合

Select(A->b)是指可以用该产生式进行推导的对应输入符号的集合。

  1. 如果First(b)中不包含$(空串),则Select(A->b)=First(b)
  2. 如果First(b)中包含$(空串),则Select(A->b)=(First(b)-{$})+Follow(A)

2.1 举例

已知文法G[E]:
E->TE’
E’->ATE’|$
T->FT’
T’->MFT’|$
F->(E)|i
A->+|-
M->*|/
计算First(b)和Follow(A)集合:

产生式FirstFollow
E->TE’{(,i}{),#}
E’->ATE’{+,-}{),#}
E’->${$}{),#}
T->FT’{(,i}{+,-,),#}
T’->MFT’{*,/}{+,-,),#}
T’->${$}{+,-,),#}
F->(E){(}{{+,-,*,/,),#}}
F->i{i}{{+,-,*,/,),#}}
A->+{+}{(,i}
A->-{-}{(,i}
M->*{*}{(,i}
M->/{/}{(,i}

按照Select的规则可以得出最终结果:
这里写图片描述

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值