編譯原理:語法分析

語法分析器概述

語法分析器的作用

  • 利用語法檢查單詞流的語法結構
  • 構造語法分析樹
  • 語法錯誤和修正
  • 識別正確語法
  • 報告錯誤

語法錯誤處理

不同層次的錯誤:

  • 詞法:拼寫錯誤(then->them)
  • 語法:單詞漏掉、順序錯誤(花括號不配對)
  • 語義:類型錯誤(聲明void f()和調用aa = f())
  • 邏輯:無限循環/遞歸調用( ==->= )

LL,LR,可最快速度發現錯誤,由於可行前綴特性(viable-prefix property),一旦一個輸入前綴不是語言中任何符號串前綴就會發生錯誤。

錯誤恢復策略

  • 恐慌模式的恢復
  • 短語層次的恢復
  • 錯誤產生式
  • 全局糾正

上下文無關文法

定義:四元式(Vt,Vn,S,P):終結符,非終結符,開始符號,產生式。

推導,文法,語言,句子和句型。

**語法樹:**推導的圖示,但不體現推導的順序。一顆語法樹可以對應多個推導,但是有唯一的最左推導和最右推導。

**二義性文法:**一個句子對應多個語法樹,最左推導,最右推導。

證明CFG G生成語言L:數學歸納法

  1. G生成的每個符號串都在L中。
  2. L中的每個符號串都可由G生成。

NFA->CFG:

  1. 狀態:非終結符
  2. 初態:開始符號
  3. 終態:推出空串
  4. 狀態n->α->狀態m:An->αAm

爲什麼需要正則表達式:

  • 正則表達式更適合描述標識符,常量,關鍵字……的結構。
  • CFG更適合描述單詞的結構化聯繫,層次化結構,如括號匹配,if-then-else,……

**設計CFG:**設計NFA->NFA to CFG

CFG的修改:

  • 消除二義性:修改文法
    • stmt -> matched_stmt | open_stmt
    • matched_stmt -> if expr then matched_stmt else matched_stmt | other
    • open_stmt -> if expr then stmt | if expr then matched_stmt else open_stmt
  • 消除左遞歸(直接,間接)
  • 消除空產生式:利用產生式進行代入
  • 消除迴路:保證每個產生式都加入終結符(開始符號的空產生式除外)
  • 提取左公因子

上下文無關文法只能描述編程語言的大部分文法,例如檢查標識符必須在使用前定義,檢查函數的形參與實參的數目是否匹配等是CFG無法描述的語言結構。


自頂向下分析方法:遞歸實現、表驅動

自頂向下分析:從開始符號出發推導出句子,確定輸入串的一個最左推導。

遞歸下降分析(recursive-descent parsing)

  • 選擇一個產生式
  • 每個非終結符對應一個處理過程
  • 每個終結符判斷是否與當前輸入一致

缺點

  • 不能處理左遞歸
  • 複雜的回溯技術
  • 回溯導致重複推導
  • 難以報告出錯的確切位置
  • 效率低

消除回溯

  • 提取左因子或消除左遞歸
  • 預測:向前看n個符號

預測分析表的構造

  • 對所有的終結符a ∈ FIRST(α),將 A->α 加入M[A,a]
  • 若ε ∈ FIRST(α),對所有的終結符b ∈ FOLLOW(A),將 A->α 加入M[A,b]
  • 所有未定義的表項設置爲錯誤

LL(1),無回溯

若文法G的預測分析表M中不含有多重定義項,則稱G爲LL(1)文法。

  • L:由左至右掃描輸入;
  • L:構造最左推導;
  • 1:向前搜索一個輸入符號,結合棧中符號,即可確定分析器動作;
  • LL(1)文法一定是無二義性的,二義性文法一定不是LL(1)文法。
  • LL(1)文法一定是沒有左遞歸的。

非遞歸預測分析方法:輸入緩衝,棧,預測分析表,輸出流。

錯誤恢復

恐慌模式恢復策略

  • 同步集-FOLLOW集:略過非終結符A,此時的錯誤爲丟失A。
  • 跳過輸入符號。

短語層次錯誤恢復

  • 預測分析表空位填入錯誤處理函數。

實現方法

  1. 構造文法;
  2. 改造文法:消除二義性,消除左遞歸,消除回溯;
  3. 求每個變量的FIRST集和FOLLOW集,構造預測分析表;
  4. 檢查是不是LL(1)文法;
  5. 對於遞歸的預測分析,爲每一個非終結符編寫一個過程;對於非遞歸的預測分析,實現表驅動的預測分析算法。

自底向上分析方法

自底向上語法分析,是從輸入符號串出發,試圖把它歸約成識別符號。

從圖形上看,自底向上分析過程是以輸入符號串作爲末端結點符號串,向着根結點方向往上構造語法樹,使識別符號正是該語法樹的根結點。

規約:某產生式體相匹配的特定子串被替換爲該產生式頭部的非終結符號。

自底向上分析是一個不斷進行直接歸約的過程。任何自底向上分析方法的關鍵是要找出這種句柄

符號串的“句柄”(Handle):與某個產生式右部匹配的子串,歸約爲產生式左部。

一個句型可有多個不同句柄,非多義性文法的最右句型有唯一句柄。

移入-歸約語法分析技術

  • 定位句柄
  • 確定產生式
  • 一般實現方法——棧:
    1. 將輸入符號“移進”棧,直至在棧頂形成一個句柄;
    2. 將句柄“歸約”爲相應的非終結符;
    3. 不斷重複,直至棧中只剩開始符號,輸入緩衝區爲空——接受輸入串;
    4. 錯誤處理。

基本操作:移進(shift),規約(reduce),接受(accept),錯誤(error)。

LR分析方法

LR分析方法:當前最廣義的無回溯的“移進- 歸約”方法。
LR分析方法:“自左到右掃描和最左歸約(最右推導)”的自底向上的分析方法。

從邏輯上說,一個LR分析器包括兩部分:一個總控程序和一張分析表

LR分析表:(核心)

  • 分析動作表
    • sj:移進動作,下一個狀態sj進棧
    • rj:按第j個產生式進行規約
    • acc:接受
    • error:出錯
  • 狀態轉換表

.

  • 最簡單分析表LR(0):侷限性大,但它是建立其它分析表的基礎。
  • 簡單分析表SLR:比較容易實現,SLR分析表的功能比LR(0)稍強些 。
  • **LR(k)**分析表:分析能力最強,但實現代價高。主要討論LR(1)。
  • LALR分析表:稱爲向前看LR分析表,功能介於SLR(1)和LR(1)之間,適用於大多數程序設計語言的結構,並且可以比較有效地實現。

LR(0)分析表的構造

  1. 可行前綴

規範句型(右句型)的一個前綴,如果它不含句柄後任何符號,則稱它是該規範句型的一個可行前綴。也就是說在可行前綴右邊增添一些終結符號之後,就可以成爲規範句型。

在LR分析過程中的任何時候,棧裏的文法符號X1X2…Xm應該構成可行前綴,把輸入串的剩餘部分配上之後即成爲規範句型(如果整個輸入串確實構成一個句子的話)。

  1. LR(0)項目:移進項目,待約項目,規約項目。
  2. 構造識別可行前綴的有窮自動機
    1. 將一般文法G改寫成增光文法G‘,即增加一個產生式:S’->S。
    2. 寫出增廣文法的全部項目。
    3. 構造DFA:
      1. 求出DFA初態I0的狀態集。
      2. 由初態I0構造其他狀態(實際上,可以直接畫圖畫出DFA)
  3. LR(0)項目集規範族:即爲構成識別一個文法的可行前綴的DFA的項目集(狀態)的全體。
  4. LR(0)文法:
    1. 衝突項目:如果一個項目集中既有移進項目又含有歸約項目,或一個項目集中有兩個以上不同歸約項目,則稱這些項目是衝突項目。
    2. LR(0)文法:如果一個文法的項目規範族的每個項目集不存在任何衝突項目,則稱該文法爲LR(0)文法。
  5. LR(0)分析表的構造:si,ri,acc。

SLR

對於衝突項目,如果移進項目的終結符集合,規約項目的FOLLOW集不相交,則可根據當前符號進行區分,這種解決“移進-規約”衝突的方法稱作SLR方法。

SLR(1)文法:對於給定的文法G,若按上述方法構造的分析表不含多重定義的元素,則稱文法G是SLR(1)文法。這裏SLR(1)中的S代表Simple(簡單)的意思,而數字1代表查看句柄外一個輸入符號,即在分析過程中至多只需要向前查看一個符號。

規範LR

SLR(1)也存在不足,即如果衝突項目的非終結符FOLLOW集與有關集合相交時,就不能用SLR(1)方法解決。

在歸約時,不但要向前看一個符號,而且還要看棧中符號串情況,纔可以知道用某種產生式歸約。

若分析表中不存在多重定義的元素,則稱此分析表爲規範LR(1)分析表。使用這種分析表的分析器叫做規範LR分析器。具有規範LR(1)分析表的文法稱爲一個LR(1)文法。

任何二義性文法都不是LR(k)文法

LALR(Look Ahead LR)

LALR分析法與SLR相類似,但功能比SLR(1)強,比LR(1)弱,LALR分析表比LR表要小得多。對於同一文法,LALR分析表與SLR分析表具有相同數目的狀態(SLR是不區分向前搜索符的)。

合併同心集

如果除去搜索符以外,兩個LR(1)項目集是相同的,則稱爲同心集
同心集合並後不會存在“移進—歸約”衝突,但存在“歸約—歸約”衝突,因爲移進和歸約不同心,所以不會出現“移進—歸約”衝突。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章