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

仿查詢分析器的 C# 計算器(四):語法分析與樹構建

     編輯:關於C#

將詞法分析產出的 TokenRecord 列表,依運算子優先級轉換為語法樹。核心演算法採用「高出低入」堆疊原則,配合遞歸處理括號與函數呼叫。

優先級與樹結構對應

運算子優先級越高,在樹中位置越接近葉節點。例如 3*7+56/8-2*5,乘除優先級高於加減,故乘除節點成為加減節點的子節點。

「高出低入」堆疊演算法

  1. 若堆疊頂優先級 高於 當前 Token:彈出頂端節點(高出),加入當前節點的 ChildList,再將當前節點壓入(低入)。若堆疊非空,遞迴比較新頂端與當前節點優先級。
  2. 若堆疊頂優先級 低於 當前 Token:直接壓入當前節點。
  3. 優先級相同視為「高於」,同樣彈出頂端再壓入當前(確保左結合性)。

完整流程追蹤範例

文中以 3*7+56/8-2*5 為例,逐步展示 12 個分析狀態,對應堆疊內容與樹結構演變圖解,極具教學價值。

關鍵程式碼:SyntaxTreeAnalyse

  • SyntaxTreeGetTopTokenAnalyse:主入口,迴圈掃描 Token 列表,遇左括號/函數遞迴處理括號內段落,其他 Token 交給 SyntaxTreeStackAnalyse。
  • SyntaxTreeStackAnalyse:實作「高出低入」邏輯,維護操作符堆疊。
  • SyntaxTreeMethodAnalyse:處理函數參數列表,以逗號分隔遞迴解析各參數段落。
  • SyntaxTreeStackGetTopToken:掃描結束後,將堆疊剩餘節點依序彈出串聯,最後彈出者為根節點。

程式碼雖涉及遞迴與堆疊操作略顯繁複,但邏輯嚴謹,可直接套用於自訂表達式解析器。

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