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

仿查詢分析器的 C# 計算器(五):計算求值與錯誤定位

     編輯:關於C#

系列完結篇,介紹如何串接詞法、語法分析模組,實現多行/選取區塊運算、語法樹視覺化、錯誤精確定位到輸入框字元位置。

核心入口:SyntaxAnalyse 類別

單一靜態方法 Analyse(string Code) 即為計算引擎入口:

public TokenRecord Analyse(string Code)
{
    if (Code.Trim().Equals(string.Empty))
        return new TokenValue(0, 1);

    List<TokenRecord> ListToken = new List<TokenRecord>();
    int intIndex = 0;
    TokenFactory.LexicalAnalysis(ListToken, Code, ref intIndex); // 詞法分析

    TokenRecord TokenTop = SyntaxTreeAnalyse.SyntaxTreeGetTopTokenAnalyse(ListToken, 0, ListToken.Count - 1); // 語法樹
    TokenTop.Execute(); // 遞歸求值
    return TokenTop;
}

WinForm 呼叫邏輯

「計算」按鈕處理:支援「未選取文字執行全部」與「選取文字僅執行選取區塊」;chkAllowMultiLine 決定是否按換行分割多行獨立運算。每行呼叫 myAnalyse.Analyse,結果顯示於輸出框,語法樹載入 TreeView。

錯誤定位機制

自訂 SyntaxException 攜帶錯誤起始索引 Index 與長度 Length。捕獲例外後,若為語法錯誤,設定輸入框焦點並 Select(Index, Length) 高亮錯誤位置:

catch (Exception ex)
{
    rtbOutput.Text += "發生錯誤\n" + ex.Message + "\n";
    if (ex is SyntaxException)
    {
        SyntaxException myException = (SyntaxException)ex;
        this.ActiveControl = rtbInput;
        rtbInput.Select(myException.Index + intTotalIndex, myException.Length);
    }
    return;
}

鍵盤快捷鍵

  • 單行模式:設定 Form AcceptButton 為計算按鈕,Enter 即觸發。
  • 多行模式:偵測 KeyUp 事件,F5 執行計算。

至此,一個功能完整、可獨立打包成 DLL 的表達式計算引擎告一段落。原始碼已開放下載。

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