1. 程式人生 > 其它 >編譯原理筆記 2

編譯原理筆記 2

語法分析 (Syntactic Analysis / Parsing)

識別程式語法結構,構造抽象語法樹(Abstract Syntax Tree)

  1. 自頂向下
  • 遞迴下降演算法(Recursive Descent Parsing)
    • 下降:語法分析的過程中,上級文法巢狀下級文法。
    • 遞迴:上下文無關文法。

算術表示式在簡單情況下,使用類似於詞法分析用到的正則文法可以解析(如 "int a = 1")。
但在複雜情況下("1+2*3""1*2+3" 等),難以窮盡各種組合,需要抽象出一種通用的規則:乘除法 看作 加減法 的子規則,生成 AST 時,乘除法節點就一定是加減法的子節點,從而達到排列優先順序的效果。

function add = multiply | (add + multiply)
function multiply = numericLiteral | (multiply * numericLiteral)

上面的定義方式轉換為演算法時,會出現 左遞迴 的情況(add 遞迴呼叫 add)
將 add 交換到加號右側:

function add = multiply | (multiply + add)
function multiply = numericLiteral | (numericLiteral * multiply)

這樣就能解決無限遞迴的問題了,但此時又會出現 "1+2+3"

優先計算了 2+3 的問題(從右向左計算,改變了加法的結合性)

  1. 自底向上
    回溯的次數較少