詞法分析器從語法分析器得到一個由詞法單元組成的串,並驗證串能夠由源語言的文法生成,構造一棵語法分析樹。前端
常見的方法能夠分爲自頂向下和自底向上方法。語法分析器的輸入都是按照從左向右掃描的。正則表達式
語法錯誤的處理有2中策略:算法
程序中可能出現不一樣層次的錯誤模塊化
語法分析器中錯誤處理程序的目標:函數
發現錯誤丟棄輸入中的符號,直到找到同步詞法單元(synchronizing token)。同步詞法單元一般是界限符號,如 } ;設計
對於某錯誤,在餘下的輸入中進行局部校訂,多是將餘下的某個前綴替換成另外一個串,使語法分析器能夠繼續分析。如將逗號替換成分號,添加分號。遞歸
經過預測常見的錯誤,在文法添加中添加一個特殊的產生式,來處理錯誤結構。token
上下文無關文法包含終結符,非終結符,一個開始符號和一組產生式組成。編譯器
經過推導構建語法分析樹。同步
二義性:若是一個文法能夠爲某個句子生成多棵語法分析樹,那麼就有二義性。
加減乘除優先級就是用來實現消二義性規則的。
爲何使用正則表達式來定義一個語言的詞法語法?
理由:
設計文法須要消除二義性。如if else,在then和else以前添加語句,必須是"已匹配的"。
提取左公因子是一種文法轉換方法。經過改寫產生式來退後這個決定,當輸入足夠多的時候,作出選擇。
本質上是爲輸入串構造語法分析樹。從根節點按先序建立各個節點,能夠看作尋找輸入串的最左推導的過程。
對於有些文法,構造一個向前看k個字符的預測分析器,這類文法被稱爲LL(K)文法類,根據FIRST和FOLLOW集合,構造預測分析表。
FIRST和FOLLOW是文法G相關的2個函數,能夠根據下一個輸入符號來選擇應用哪一個產生式。
LL(1)文法,經過構造出預測分析器,既不須要回溯的遞歸降低語法分析器。
第一個L表示從左向右掃描輸入,第二個L表示產生最左推導,1表示每次掃描一個字符
構造一個非遞歸的預測分析器,顯示的維護一個棧結構;遞歸是隱式的維護棧,這樣的語法分析器能夠模擬最左推導的過程。
從葉子節點向上到達根節點,一般方法使用移入-歸約
LR文法類是最大的,能夠構造出相應的移入-歸約語法分析器的文法類。可是手工構造LR語法分析器的工做量特別大。
自底向上語法分析的過程當作將一個串w"歸約"爲文法開始符號的過程。
在歸約過程當中,一個與某產生式體匹配的特定子串被替換成該產生式的非終結符號。
歸約就是推導步驟的反向操做。推導步驟是將句型中非終結符號替換成該符號的產生式的體。
使用一個棧來保存文法符號,用一個輸入緩衝區存放將要進行語法分析的其它符號。
衝突問題:即便知道了棧中全部的內容,和接下來k個輸入符號,仍然沒法判斷是應該移入仍是歸約操做,活着有多個歸約的可能,沒法正確選擇。(如if if than else)
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分析器。
二義性文法:使用二義性文法,添加附加信息,如算數符號的優先級,解決移入和歸約的衝突。