編譯原理筆記 2
阿新 • • 發佈:2021-06-20
語法分析 (Syntactic Analysis / Parsing)
識別程式語法結構,構造抽象語法樹(Abstract Syntax Tree)
- 自頂向下
- 遞迴下降演算法(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"
- 自底向上
回溯的次數較少