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

QLanguage 抽象語法樹(AST)設計與解析流程實現

     編輯:關於C語言

AST 節點結構設計

QLanguage 的 AST 採用經典的「左子右兄」表示法,每個節點包含三大核心欄位:

  • 型別(type)與附加值(value):標識節點語義(如 stIf、stDeclare、stExp 等)。
  • 子節點順序表(child):指向第一個子節點的智慧指標串列(List<NAutoPtr<CSyntaxTreeNode>>)。
  • 兄弟節點指標(next):串聯同層級的下一個節點。
class CSyntaxTreeNode {
public:
    CSyntaxTreeNode(int _type, int _value) : type(_type), value(_value) {}
    inline List<NAutoPtr<CSyntaxTreeNode>>& Child() { return child; }
    inline NAutoPtr<CSyntaxTreeNode> Next() { return next; }
    inline int& Type() { return type; }
    inline int& Value() { return value; }
protected:
    int type, value;
    List<NAutoPtr<CSyntaxTreeNode>> child;
    NAutoPtr<CSyntaxTreeNode> next;
};

解析器分析器核心結構

CParserAnalyze 維護一棵語法樹的根節點與一個節點堆疊,支援推入、彈出、取頂、取根四種基本操作,配合遞迴下降或算子優先分析器在歸約時建樹:

class CParserAnalyze {
public:
    inline void Push(NAutoPtr<CSyntaxTreeNode>& node) { SyntaxTreeStack.Push(node); }
    inline NAutoPtr<CSyntaxTreeNode> Pop() { return SyntaxTreeStack.Pop(); }
    inline NAutoPtr<CSyntaxTreeNode> Top() { return SyntaxTreeStack.Top(); }
    inline NAutoPtr<CSyntaxTreeNode> Root() { return SyntaxTreeRoot; }
protected:
    NAutoPtr<CSyntaxTreeNode> SyntaxTreeRoot;
    Stack<NAutoPtr<CSyntaxTreeNode>> SyntaxTreeStack;
};

以 if 語句為例的建樹流程

輸入程式碼:

if a then
    declare b as integer
end if

分析步驟(簡化):

  1. 讀入 if a,a 歸約為 exp 節點壓入堆疊。
  2. if a 歸約產生 stIf 節點,彈出 exp 填充為第一個子節點。
  3. 讀入 then declare b as integer,integer 歸約為 stDeclare 壓堆疊。
  4. declare b as integer 歸約,給 stDeclare 加上識別符 b 子節點。
  5. then ... 歸約,彈出 stmt_list,標記 stIf 值域最低位為 1(表示 then 區塊非空)。
  6. 無 else 子句,整體歸約完成,堆疊頂為含 stExp、stDeclare 兩個子節點的 stIf 根節點。

此過程展示了「移進-歸約」解析器如何利用堆疊輔助構建階層式 AST,為後續語義分析與程式碼生成奠定基礎。

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