消除左递归
快速消除左递归
原文法(保证β\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_nP→Pα1∣Pα2∣Pα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|cS→Qc∣c Q→Rb∣bQ\rightarrow Rb|bQ→Rb∣b R→Sa∣aR\rightarrow Sa|aR→Sa∣a
step1: 把文法右侧换为一个变量(符号)
S→Sabc∣abc∣bc∣cS\rightarrow Sabc|abc|bc|cS→Sabc∣abc∣bc∣c Q→Sab∣ab∣bQ \rightarrow Sab|ab|bQ→Sab∣ab∣b R→Sa∣aR \rightarrow Sa|aR→Sa∣a
step2: 使用快速消除左递归转换带有公共符号的行
S→abcS′∣bcS′∣cS′S\rightarrow abcS'|bcS'|cS'S→abcS′∣bcS′∣cS′ S′→abcS′∣ϵS'\rightarrow abcS'|\epsilonS′→abcS′∣ϵ Q→Sab∣ab∣bQ \rightarrow Sab|ab|bQ→Sab∣ab∣b R→Sa∣aR \rightarrow Sa|aR→Sa∣a
step3: 去掉无用的变量
S→abcS′∣bcS′∣cS′S\rightarrow abcS'|bcS'|cS'S→abcS′∣bcS′∣cS′ S′→abcS′∣ϵS'\rightarrow abcS'|\epsilonS′→abcS′∣ϵ
消除左因子
一般方法
原始文法: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_nA→sα1∣sα2∣...∣sαn∣β1∣β2∣...∣βn
处理后文法:A→sA′∣β1∣β2∣...∣βnA\rightarrow sA'|\beta_1|\beta_2|...|\beta_nA→sA′∣β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左边的终结符。(此处因为已经提前去除了左递归因此不会出现问题)
本文详细介绍了消除左递归和左因子的快速方法,包括原始文法的转换步骤和处理后的文法示例。同时,阐述了FirstSet和FollowSet的概念及其在语法分析中的应用。
1914





