【编译原理】消除左递归与提取左因子

本文详细介绍了消除左递归和左因子的快速方法,包括原始文法的转换步骤和处理后的文法示例。同时,阐述了FirstSet和FollowSet的概念及其在语法分析中的应用。

消除左递归

快速消除左递归

原文法(保证β\betaβ不含PPP):P→Pα1∣Pα2∣Pα3∣...∣Pαn∣β1∣β2∣β3∣...∣βnP \rightarrow P\alpha_1|P\alpha_2|P\alpha_3|...|P\alpha_n|\beta_1|\beta_2|\beta_3|...|\beta_nPPα1Pα2Pα3...Pαnβ1β2β3...βn

消除后文法:P→β1P′∣β2P∣β3P′∣...∣βnP′P \rightarrow \beta_1P'|\beta_2P |\beta_3P'|...|\beta_nP'Pβ1Pβ2Pβ3P...βnP P′→α1P′∣α2P′∣α3P′∣...∣αnP′∣ϵP' \rightarrow \alpha_1P'|\alpha_2P'|\alpha_3P'|...|\alpha_nP'|\epsilonPα1Pα2Pα3P...αnPϵ

一般方法

example:S→Qc∣cS\rightarrow Qc|cSQcc Q→Rb∣bQ\rightarrow Rb|bQRbb R→Sa∣aR\rightarrow Sa|aRSaa

step1: 把文法右侧换为一个变量(符号)
S→Sabc∣abc∣bc∣cS\rightarrow Sabc|abc|bc|cSSabcabcbcc Q→Sab∣ab∣bQ \rightarrow Sab|ab|bQSababb R→Sa∣aR \rightarrow Sa|aRSaa

step2: 使用快速消除左递归转换带有公共符号的行
S→abcS′∣bcS′∣cS′S\rightarrow abcS'|bcS'|cS'SabcSbcScS S′→abcS′∣ϵS'\rightarrow abcS'|\epsilonSabcSϵ Q→Sab∣ab∣bQ \rightarrow Sab|ab|bQSababb R→Sa∣aR \rightarrow Sa|aRSaa

step3: 去掉无用的变量
S→abcS′∣bcS′∣cS′S\rightarrow abcS'|bcS'|cS'SabcSbcScS S′→abcS′∣ϵS'\rightarrow abcS'|\epsilonSabcSϵ

消除左因子

一般方法

原始文法:A→sα1∣sα2∣...∣sαn∣β1∣β2∣...∣βnA\rightarrow s\alpha_1|s\alpha_2|...|s\alpha_n|\beta_1|\beta_2|...|\beta_nAsα1sα2...sαnβ1β2...βn
处理后文法:A→sA′∣β1∣β2∣...∣βnA\rightarrow sA'|\beta_1|\beta_2|...|\beta_nAsAβ1β2...βn A′→α1∣α2∣...∣αnA' \rightarrow \alpha_1|\alpha_2|...|\alpha_nAα1α2...αn

First Set and Follow Set

First Set

找文法的左面,看右面。右面是终结符就append,不是就append这个非终结符的FirstSet。

Follow Set

找文法的右面谁出现要求的非终结符。看要求的符号右侧是谁,是终结符就append,非终结符append其去空的FirstSet,在末尾就append左边的终结符。(此处因为已经提前去除了左递归因此不会出现问题)

评论 1
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值