【第四章】語法分析

第四章.語法分析

詞法分析器的做用

詞法分析器從語法分析器得到一個由詞法單元組成的串,並驗證串能夠由源語言的文法生成,構造一棵語法分析樹。前端

常見的方法能夠分爲自頂向下和自底向上方法。語法分析器的輸入都是按照從左向右掃描的。正則表達式

語法錯誤的處理

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

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

程序中可能出現不一樣層次的錯誤模塊化

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

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

  • 發現並報告錯誤
  • 能從錯誤中恢復,繼續後面的檢查
  • 儘量少的增長正確程序的開銷

錯誤恢復-恐慌恢復模式

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

短詞層次恢復

對於某錯誤,在餘下的輸入中進行局部校訂,多是將餘下的某個前綴替換成另外一個串,使語法分析器能夠繼續分析。如將逗號替換成分號,添加分號。遞歸

錯誤產生式

經過預測常見的錯誤,在文法添加中添加一個特殊的產生式,來處理錯誤結構。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分析器。

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

相關文章
相關標籤/搜索