编译原理提取左公共因子例题
⑴ 编译原理 设文法G[S] 求答案!
·消除左递归 S→aAS'|∧aAS'
S'→VaAS'|ε对A的产生式提取左因子 A→∧aA' A'→A|ε
· 非终结符合 First Follow
S a∧ #
S’ V ε #
A ∧ #
A‘ ∧ #
Select(S→aAS')=a
Select(S→∧aAS')=∧
Select(S'→VaAS')=V
Select(S'→ε)=#
Select(A→∧aA')=∧
Select(A'→A)=∧
Select(A'→ε)=#
符合LL(1)文法
a ∧ V #
S S→aAS' S→∧aAS'
S' S'→VaAS' S'→ε
A A→∧aA'
A' A'→A A'→ε
⑵ 消除左递归及提取左公因子
如果一个文法中有一个非终禅扮结符号A使得对某个串α存在一个推导A=》Aα,那么这个文法就是左递归的。递归分为立即左递归和非立即左递归。立即左递归单步即可看出来,非立即左递归
举个例子:
消除立即左递归只需要遵循以下规律进行转换就ok。
立即左递归:
非立即左递归:
和数学中的公因子含义相同,就是公共的因子,而左公因子就是最左边的公因子。
例如:
可以看出前n项拥有一个共同的左公因念信子:a,所以仔袭轮可以把他提取出来。
so easy啦
S → aB1|aB2|aB3|aB4|...|aBn|y
可以看出前n项拥有一个共同的左公因子:a,所以可以把他提取出来。
提取规则
so easy啦
S → aS'|y
S'→ B1|B2|B3|...|Bn
⑶ Ab-a=76,A等于多少b等于多少
两个未知数一个方程,有无数解,信升但正整数解是有限的。左边提取公因数a
a(b-1)=76
76=1×76=2×38=4×19
所以有6组盯宏正整数解
a=1,2,4,19,38,76
对应的b=77,39,20,5,3,2
一般把问题化为乘法来做。也可以用一个字母表示另外一个,如a=76/(b-1),b-1是76的因数。结果一样凯坦册的。
⑷ AB-A=76 A= B=
一个有两衫启凯个未知数的方程有无数个解,但正整数或唤解是有限的。左提取公因子AA(B-1)=7676=1×76=2×38=4×因此,存在六组正整数解a=1,2,4,19,38,76,对应于B=77,39,20,5,3,2。通常,该问题通过乘法解决。旁亏一个字母也可以用来表示另一个字母,例如,a=76/(B-1),B-1是76的因子。结果是相同的。
⑸ 编译原理,改造文法使之变为LL(1)文法,怎么提取最左公因式 如题:
S->aAb
A->edA|ε
这样提取,
⑹ 设文法g(s) 判断该文法是否为ll1文法
(1)
G'(S)
S->(L)|aT
T->+S|e
L->L,S|S
提取了 公共左因子
(2)
是LL(1)文法
⑺ 对下面文法先消除左递归,并提取左公共因子,再判断其是否是LL(1)文法。 S->Aa|b A->SB B->ab
消除左递归
S->bS'
S'->BaS'|空
B->ab
提取公共左因子笑晌
没有可提
文法不含左递归
每个非终结符只有一个产生式 候选首符集唯一
FOLLOW(S')=# 与其碰轿锋首符集帆或相交为空
是LL(1)文法
⑻ 编译原理回溯
消除回溯:提取左公因子a,(注:用e代表一补西农符号,就是反三的那个符号,在电脑上不知道怎么打那个符号)
S→aS'|(L)
S'→S|e
消除左递归:
L→SL'
L'→,SL'|e (注意S前面有一个符号“,”)