【第四章】語法分析


第四章.語法分析

詞法分析器的作用

詞法分析器從語法分析器獲得一個由詞法單元組成的串,並驗證串可以由源語言的文法生成,構造一棵語法分析樹。

常見的方法可以分為自頂向下和自底向上方法。語法分析器的輸入都是按照從左向右掃描的。

語法錯誤的處理

語法錯誤的處理有2中策略:

  • 恐慌模式
  • 短語層次恢復

程序中可能出現不同層次的錯誤

  • 詞法錯誤:標識符、關鍵字、運算符拼寫錯誤
  • 語法錯誤:{ },( )等的缺失
  • 語義錯誤:運算符和運算分量不匹配。void類型函數reture了個值
  • 邏輯錯誤:應該用==的時候,用成了=

語法分析器中錯誤處理程序的目標:

  • 發現並報告錯誤
  • 能從錯誤中恢復,繼續后面的檢查
  • 盡可能少的增加正確程序的開銷

錯誤恢復-恐慌恢復模式

發現錯誤丟棄輸入中的符號,直到找到同步詞法單元(synchronizing token)。同步詞法單元通常是界限符號,如 } ;

短詞層次恢復

對於某錯誤,在余下的輸入中進行局部校正,可能是將余下的某個前綴替換成另一個串,使語法分析器可以繼續分析。如將逗號替換成分號,添加分號。

錯誤產生式

通過預測常見的錯誤,在文法添加中添加一個特殊的產生式,來處理錯誤結構。

上下文無關文法

上下文無關文法包含終結符,非終結符,一個開始符號和一組產生式組成。

  • 終結符號是組成串的基本符合,俗稱"詞法單元",如if,else
  • 非終結符號表示串集合,用於定義由文法生成的語言。
  • 某個非終結符被指為開始符號,這個符號表示的串集合就是這個文法生成的語言
  • 產生式描述了將終結符號和非終結符號組成串的方法。

通過推導構建語法分析樹。

二義性:如果一個文法可以為某個句子生成多棵語法分析樹,那么就有二義性。
加減乘除優先級就是用來實現消二義性規則的。

  • 文法是比正則表達式表達能力更強的表示方法。每個可以用正則表達式描述的構造,都可以使用文法描述,反之不成立。

設計文法

為什么使用正則表達式來定義一個語言的詞法語法?

理由:

  • 將一個語言的語法結構分為詞法和非詞法,可以方便編譯器前端模塊化
  • 和文法相比,正則表達式更簡潔更便於理解 表示詞法單元的方法。
  • 正則表達式構造的詞法分析器效率高於任意文法構造的分線器

設計文法需要消除二義性。如if else,在then和else之前添加語句,必須是"已匹配的"。

提取左公因子

提取左公因子是一種文法轉換方法。通過改寫產生式來退后這個決定,當輸入足夠多的時候,做出選擇。

自頂向下的語法分析

本質上是為輸入串構造語法分析樹。從根節點按先序創建各個節點,可以看做尋找輸入串的最左推導的過程。

對於有些文法,構造一個向前看k個字符的預測分析器,這類文法被稱為LL(K)文法類,根據FIRST和FOLLOW集合,構造預測分析表

FIRST和FOLLOW

FIRST和FOLLOW是文法G相關的2個函數,可以根據下一個輸入符號來選擇應用哪個產生式。

  • first(a)定義為可從a推導得到的串的首符號的集合,a為任意的文法符號串。
  • FOLLOW(A)被定義為可能再某些句型中緊跟在A右邊的終結符號的集合。

LL(1)文法

LL(1)文法,通過構造出預測分析器,既不需要回溯的遞歸下降語法分析器。

第一個L表示從左向右掃描輸入,第二個L表示產生最左推導,1表示每次掃描一個字符

非遞歸的預測分析

構造一個非遞歸的預測分析器,顯示的維護一個棧結構;遞歸是隱式的維護棧,這樣的語法分析器可以模擬最左推導的過程。

自底向上的語法分析

從葉子節點向上到達根節點,通常方法使用移入-歸約

LR文法類是最大的,可以構造出相應的移入-歸約語法分析器的文法類。但是手工構造LR語法分析器的工作量特別大。

歸約(reduction)

自底向上語法分析的過程看成將一個串w"歸約"為文法開始符號的過程。

在歸約過程中,一個與某產生式體匹配的特定子串被替換成該產生式的非終結符號。

歸約就是推導步驟的反向操作。推導步驟是將句型中非終結符號替換成該符號的產生式的體。

移入-歸約

使用一個棧來保存文法符號,用一個輸入緩沖區存放將要進行語法分析的其它符號。

沖突問題:即使知道了棧中所有的內容,和接下來k個輸入符號,仍然無法判斷是應該移入還是歸約操作,活着有多個歸約的可能,無法正確選擇。(如if if than else)

LR(k)語法分析技術

L表示從左向右掃描,R表示反向構造一個最右推導序列,k表示語法分析的時候向前看k個輸入符號。

LR語法分析器是表格驅動的。

LR語法分析器包含:一個輸入,一個輸出,一個棧,一個語法分析表。

語法分析表包含:分析動作函數ACTION,和轉換GOTO函數。

分析算法

輸入:一個串w,一個LR語法分析表,這個表描述了文法G的ACTION函數和GOTO函數。

輸出:如果w在L(G)中,輸出w自底向上的語法分析過程中的歸約步驟;否則error

方法:棧中的內容總是一個可行前綴,LR分析器首先構造各個可行前綴的有效項的項集(稱為LR狀態),有效項集合引導語法分析器做出移入-歸約決定。

關鍵字

  • SLR:簡單LR分析器。

  • 規范LR分析器,增加了一個向前看的符號集,可以避免SLR中出現的分析動作的沖突,狀態會比同一文法的SLR狀態更多。

  • LALR:向前看的LR分析器。

  • 二義性文法:使用二義性文法,添加附加信息,如算數符號的優先級,解決移入和歸約的沖突。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2026 CODEPRJ.COM