首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

可配置語法分析器開發紀事(五):構造真正可用的狀態機(中)

     編輯:關於C++

多規則狀態機連接

上篇構建單規則壓縮狀態機,本篇連接所有規則。核心是交叉鏈接:非終結符跳轉替換為 shift/reduce ε-邊。

交叉鏈接過程

對跳轉 S0 --Symbol--> S1:

  1. 刪除原邊。
  2. 添加 S0 --shift(S0)--> Symbol_Start。
  3. 添加 Symbol_End --reduce(S0)--> S1。
  4. 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 正確構建語法樹。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved