2 3 5 遞迴規則與文法的遞迴性

2021-10-08 20:31:30 字數 1184 閱讀 8462

1. 遞迴規則

所謂遞迴規則,是指在規則的左部和右部具有相同非終結符的規則。

如果文法中有規則 a → a … 稱為規則左遞迴。

如果文法中有規則 a → … a 稱為規則右遞迴。

如果文法中有規則 a → … a … 稱為規則遞迴

2. 文法的遞迴性

文法的遞迴性是指對文法中任一非終結符,若能建立乙個推導過程,在推導所得的符號串****中又出現了該非終結符本身,則文法是遞迴性的,否則是無遞迴性的

若文法中有推導 a ⇒+ a … 稱文法左遞迴。

若文法中有推導 a ⇒+… a 稱文法右遞迴。

若文法中有推導 a ⇒+… a … 稱文法遞迴

例如,文法中有如下規則:

u → vx

v →uy| z

這三條規則都不是遞迴規則,但有u ⇒+ uyx ,則該文法是左遞迴的

在文法中使用遞迴規則,使得我們能用有限的規則去定義無窮集合的語言。

【例 2.11 】

考慮文法 g [ a ]:

a → ab | bb

b → a | b

由於該文法無遞迴性,由它所描述的語言是有窮的。該文法描述的語言為l ( g [ a ]) =

【例 2.12 】

考慮文法 g [ n 1 ]:

n 1 → n

n → nd | d

d →0|1|2

該文法有直接左遞迴規則 n → nd ,則稱該文法為左遞迴文法或稱文法左遞迴,其定義的語言為+ 。

由於文法中使用了遞迴規則,使得我們可用有限的規則去刻畫無窮集合的語言。若不用遞迴規則來定義文法,要表示無窮集合的語言需要用無窮多條規則。例如,例 2.12 中若不用遞迴規則 n → nd ,則需要用 n → d | dd | ddd | … 即無窮多條規則來定義由數字 0 ,1 , 2 組成的所有無符號整數。

也就是說,當乙個語言是無窮集合時,則定義該語言的文法一定是遞迴的

需要指出的是,程式語言都是無窮集合,因此描述它們的文法必定是遞迴的。

文法的左遞迴性和回溯的消除

1.文法左遞迴的消除 當乙個文法是左遞迴文法時,採用自上而下分析法會使分析過程進入無窮迴圈之中。文法左遞迴是指文法中的某個非終結符 a 存在推導 a a 而自上而下分析法是施行最左推導,即每次替換都是當前句型中的最左非終結符,當試圖用非終結符 a 去匹配輸入串時,結果使當前句型的最左非終結符仍然為 ...

mysql 遞迴 效能 漫談遞迴 遞迴的效率問題

遞迴在解決某些問題的時候使得我們思考的方式得以簡化,也更加精煉,容易閱讀。那麼既然遞迴有這麼多的優點,我們是不是什麼問題都要用遞迴來解決呢?難道遞迴就沒有缺點嗎?今天我們就來討論一下遞迴的不足之處。談到遞迴就不得不面對它的效率問題。為什麼遞迴是低效的 還是拿斐波那契 fibonacci 數列來做例子...

消除文法左遞迴的演算法

1 typedef struct pp 6 typedef struct gg 文法g由多條產生式組成,出現在產生式左部的非終結符,會指向乙個p文法陣列,每乙個陣列元素對應乙個程式的右部,這樣的結構顯然是對文法進行了壓縮的 1 掃瞄文法,先將間接做遞迴轉換成直接左遞迴 2 借助如下公式,消除直接左遞...