剖析與文法的應用

編譯器前端(compiler front end)

編譯器像一條把原始碼變成機器能執行之物的翻譯流水線。把它想成分成兩半的工廠生產線。前端是讀懂來源語言的那一半:它弄清楚程式在說什麼、寫得是否合規。後端是產生並最佳化目標碼的那一半。這種乾淨的切分意味著你可以更換目標機器而不必重寫理解的部分,反之亦然。

前端分階段運行,每一階段把輸出交給下一階段。首先掃描器(詞法分析器,lexer)把原始字元組成詞符(token),也就是語言的「單字」:關鍵字、識別字、數字、標點。接著剖析器拿這串詞符,依文法檢查,建出一棵捕捉程式結構的剖析樹或抽象語法樹(abstract syntax tree, AST)。之後是語意分析:名稱解析、型別檢查,以及其他上下文無關文法無法表達的規則。注意這裡的分工:掃描器處理正規語言的部分(詞符形狀),剖析器處理上下文無關的部分(巢狀與結構)。這正是把形式語言理論直接化為軟體架構。

前端之所以重要,是因為它是原始文字變成意義的地方。若前端接受了一個程式,編譯器其餘部分便可信賴它在語法上有效,並在一棵乾淨的樹上工作,而非原始文字。在此攔下的錯誤,少一個分號、括號不對稱、變數未宣告,會以人能懂的方式回報給程式設計師。健全的前端也可重用:語言伺服器、靜態檢查器、格式化工具、重構工具,全都重用同一套掃描與剖析機制。

編譯 x = a + 2:掃描器產生詞符 [id:x, =, id:a, +, num:2],剖析器建出一棵指派樹(左邊 x,右邊運算式 a + 2),語意分析則檢查 a 是否已宣告、型別是否相符。直到此時後端才產出機器碼。

前端各階段:字元 -> 詞符(掃描器)-> 樹(剖析器)-> 意義(語意分析)。

並非每條語言規則都是上下文無關的。「變數要先宣告才能使用」無法用文法強制,因此交給語意分析、而非剖析器。剖析器只保證語法結構。

又稱
front endanalysis phase編譯器前端分析階段