上篇構建單規則壓縮狀態機,本篇連接所有規則。核心是交叉鏈接:非終結符跳轉替換為 shift/reduce ε-邊。
對跳轉 S0 --Symbol--> S1:
S0 --shift(S0)--> Symbol_Start。Symbol_End --reduce(S0)--> S1。shift 壓入返回狀態,reduce 彈出並驗證匹配。
消除 ε-邊後狀態數減少但邊信息增多。消除過程中,若發現純 shift ε-環,即為左遞歸。標記對應 reduce 為 left-recursive-reduce,構造語法樹關鍵指令。
生成二維表 [state, token] → transitions,每個轉換含棧匹配條件。附測試軌跡日誌:
StartState: 22[Exp.RootStart] $TokenBegin => 23[Exp.Start] NUMBER[1] => 2[Number.1] ... Shift 23[Exp] Shift 21[Term] Shift 19[Factor] Assign value Create NumberExpression MUL[*] => 5[Term.3] ... Reduce 19[Factor] Using Reduce 21[Term] Using LR-Reduce 21[Term] Assign firstOperand Setter binaryOperator = Mul Create BinaryExpression ...
驗證輸入 1*2+3*4 正確構建語法樹。