消除文法的左遞歸例題 編譯原理,如何消除文法的左遞歸?
編譯原理,如何消除文法的左遞歸?1. A->aa2。A->baB->ab(A和B屬于非終結(jié)符,A和B屬于終結(jié)符)一般來(lái)說(shuō),左遞歸是在情況1中“>”的兩邊包含相同的非終結(jié)符;在情況2中,
編譯原理,如何消除文法的左遞歸?
1. A->aa
2。A->ba
B->ab(A和B屬于非終結(jié)符,A和B屬于終結(jié)符)
一般來(lái)說(shuō),左遞歸是在情況1中“>”的兩邊包含相同的非終結(jié)符;
在情況2中,a->ba中“>”后的B和B->ab中“>”前的B是同一個(gè)非終結(jié)符
這兩種情況稱為左遞歸。
編譯原理的消除左遞歸是怎么回事???
如果像這樣的CFG a-> ABA-> E離開(kāi)了遞歸,那么遞歸下降法和語(yǔ)法分析中的LL(1)就不能處理它,因?yàn)槌绦驎?huì)陷入遞歸,無(wú)法前進(jìn)。Cfga-> BA“a”-> BA“| e與前面的表達(dá)式相同,但所有語(yǔ)法的第一項(xiàng)是終止符,它消除了左遞歸。有消除左遞歸的算法,一般編譯原理書中會(huì)介紹,不是很復(fù)雜。
【編譯原理】自頂向下LL(1)分析中,消除左遞歸和提取左因子的目的是什么?
通常,LL(1)是通過(guò)函數(shù)遞歸實(shí)現(xiàn)的
]例如,語(yǔ)法:a-> a | a
代碼實(shí)現(xiàn)是:[function a()
{
a()
match(”)
term(a)]}
!]這樣就可以看到死循環(huán)了…
消除了左遞歸后的語(yǔ)法
a-> AA“
a”-> AA“
]這個(gè)問(wèn)題可以避免
公因子就是剛剛提出的就像你在樓上說(shuō)的,避免程序回溯,消除歧義