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

用 C# 從零打造編譯器前端:詞法、語法分析與語法樹自動生成實戰

     編輯:關於C#

專案概覽:完整編譯器前端框架

本專案實作一個教學級編譯器前端,包含:

  • 基礎資料結構與流程框架 (可繼承擴充)
  • 資料結構視覺化控制項
  • 類 YACC 的詞法/語法分析器自動生成工具
  • WinForm 整合應用,支援原始碼輸入、Token 列表、語法樹視覺化
詞法語法分析介面 自動生成工具 語法樹列印
圖 1~3:IDE 主介面、生成器、語法樹輸出

核心概念:從文法到編譯器

範例語言:數學表達式 Expression


// 支援輸入範例
37
19 * 19 - 18 * 18
(19 + 18) * (19 - 18)
a + (a + 1) + (a + 2)

文法定義 (BNF 風格)


 ::=   ;
   ::= "+"  | "-"  | null ;
  ::=   ;
 ::= "*"  | "/"  | null ;
      ::= identifier | "("  ")" | number ;
  • 產生式:左部單一非終結符 `::=` 右部多個推導式 (以 `|` 分隔)。
  • 推導式:右部的每一個選項。
  • 句子:具體輸入字串 (如 `19 * 19 - 18 * 18`)。
  • 初始結點:第一條產生式左部 (``)。

推導過程範例:`19 * 19 - 18 * 18`


⇒  
⇒   "-" 
⇒ number "*"  "-"  
⇒ number "*" number "-" number "*" 
⇒ number "*" number "-" number "*" number

三階段編譯管線

1. 詞法分析:原始碼 → Token 串流


var lexer = new LexicalAnalyzerExpression();
lexer.SetSourceCode("19 * 19 - 18 * 18");
var tokens = lexer.Analyze();

Token 結構:`[值] $[類別] $[行,列] $[是否錯誤] $[描述]`

[19]   $[Number]      $[0,0]  $[False] $[]
[*]    $[Multiply]   $[0,3]  $[False] $[]
[19]   $[Number]      $[0,5]  $[False] $[]
[-]    $[Minus]      $[0,8]  $[False] $[]
[18]   $[Number]      $[0,10] $[False] $[]
[*]    $[Multiply]   $[0,13] $[False] $[]
[18]   $[Number]      $[0,15] $[False] $[]

2. 語法分析:Token 串流 → 語法樹 (AST)


var parser = new SyntaxParserExpression();
parser.SetTokenList(tokens);
var syntaxTree = parser.Parse();

語法樹結構 (縮排表示):


 ├─
 │  ├─ └─number(19)
 │  └─ ├─* └─ └─number(19)
 └─ ├─- └─ ...

3. 語義分析:語法樹 → 執行結果

為各節點賦予語義動作 (遞歸自頂向下):

  • `` / ``:計算左右子節點。
  • `` / `` / ``:扁平化,以子節點取代自己。
  • 運算符 `+ - * /`:對應左右子節點執行運算。
  • `number` / `identifier`:保留值。

偽碼:


SyntaxTree SemanticAnalyze(Node root)
{
    switch(root.Type)
    {
        case Expression: return Calc(SemanticAnalyze(root[0]), SemanticAnalyze(root[1]));
        case PlusOpt: root.Parent.ReplaceChild(root, root.Children); break;
        case Plus: return Calc(SemanticAnalyze(root.Parent[0]), SemanticAnalyze(root.Parent[2]));
        // ...
    }
}

上例最終得結果 **37**。

自動生成器:從文法規格產生分析器

工具支援:

  • 編輯文法規格 (產生式清單)
  • 一鍵生成 LexicalAnalyzer 與 SyntaxParser 原始碼
  • 內建測試輸入,即時驗證生成器正確性
自動列印語法樹
圖 4:自動生成並列印語法樹

系列規劃與原始碼

後續文章將逐步釋出:

  1. 基礎資料結構與框架核心
  2. 詞法分析器實作 (DFA/NFA、正則轉換)
  3. LL(1)/LR(1) 語法分析器生成算法
  4. 語法樹視覺化控制項
  5. 完整 VS2010 方案原始碼

作者:bitzhuwei | 出處:https://www.cnblogs.com/bitzhuwei

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