1. 程式人生 > >編譯原理學習筆記之自上而下分析Ⅰ

編譯原理學習筆記之自上而下分析Ⅰ

一、自上而下分析法

從根部開始構造語法樹

自上而下分析法不能因為左遞迴存在而陷入死迴圈,不能產生回溯,即每一步推導的產生式必須是唯一的

1.消除左遞迴

左遞迴

形如A->Aa |b ,這種在建立分析樹時一直在左子樹死迴圈,因為推導的結果中最左還是A

或者多個推到式共同作用的間接左遞迴

消除直接左遞迴

如上式最終結果是以b開頭的無數個a的串,因此改寫成

A ->bA‘

  A'-> a A’ | e

再比如

A -> A+B | B

B -> int | (A)

產生的語言是B開頭的,無數個+B的串

因此改寫成

A -> BA’

A’-> +BA|e

B -> int | (A)

對於不涉及的部分直接抄下來就好

消除間接左遞迴

S -> Aa | b

A -> Sd | e

類似於這種,雖然直觀上不存在左遞迴,但是將推導式中的A代入,則出現明顯的左遞迴

對於這種間接左遞迴我們需要先代入推導式轉化為直接左遞迴,然後再消除左遞迴即可

S -> Aa | b

A -> Aad | bd | e

  S -> Aa | b

  A -> bdA' | A'

  A'-> adA' | e

2.提取左因子

有左因子的文法

A ->a

b1 | ab2

可以看出產生式中有共同的部分

提取左因子

  A -> a A'

  A' -> b1 | b2

3.自上而下分析法

基本思想

  • 尋找輸入符號串的最左推導
  • 試圖根據當前輸入單詞確定使用哪個產生式

基本過程

  • 從起始符號S出發,構造輸入串TOKEN的最左推導
  • 從根節點開始,根據最左推導相對應的順序,構造輸入符號串的語法分析樹

二、語言和文法

0型文法

0型文法也稱短語文法

0型文法都是遞迴可列舉的,反之,遞迴可列舉集也必定是一個0型文法

1型文法

1型文法也稱上下文有關文法

這種文法對非終結符的替換必須考慮上下文,並且一般不允許換成空串

2型文法

2型文法就是上下文無關文法

非終結符的替換不必考慮上下文

3型文法

3型文法就是正規式