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

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

     編輯:關於C++

帶語義動作的狀態機

為直接構造語法樹,狀態機邊需攜帶語義指令:

  • Create:創建節點類型。
  • Set:設置成員常量值。
  • Assign:將子節點賦給成員。
  • Using:以子節點作為本規則返回值。
  • Shift/Reduce:棧操作。

四則運算文法示例

token NAME = "[a-zA-Z_]\w*";
token NUMBER = "\d+(\.\d+)?";
rule NumberExpression Number = NUMBER : value;
rule FunctionExpression Call = NAME : functionName "(" [ Exp : arguments { "," Exp : arguments } ] ")";
rule Expression Factor = !Number | !Call;
rule Expression Term = !Factor;
    = Term : firstOperand "*" Factor : secondOperand as BinaryExpression with { binaryOperator = "Mul" };
    = Term : firstOperand "/" Factor : secondOperand as BinaryExpression with { binaryOperator = "Div" };
rule Expression Exp = !Term;
    = Exp : firstOperand "+" Term : secondOperand as BinaryExpression with { binaryOperator = "Add" };
    = Exp : firstOperand "-" Term : secondOperand as BinaryExpression with { binaryOperator = "Sub" };

Epsilon NPDA 構造與壓縮

  1. 為每個規則生成帶 $TokenBegin/$TokenFinish 的起始/終結狀態。
  2. 終結狀態不可刪,$ 邊不可帶語義信息(信息前移)。
  3. 合併等價狀態:相同入邊/出邊(含語義)的狀態合併,Create/Set 可前移。

Exp 規則初始 NPDA

壓縮後狀態機

下一篇將講述連接所有規則並處理轉換信息。

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