系列完結篇,介紹如何串接詞法、語法分析模組,實現多行/選取區塊運算、語法樹視覺化、錯誤精確定位到輸入框字元位置。
單一靜態方法 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;
}
「計算」按鈕處理:支援「未選取文字執行全部」與「選取文字僅執行選取區塊」;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;
}
AcceptButton 為計算按鈕,Enter 即觸發。KeyUp 事件,F5 執行計算。至此,一個功能完整、可獨立打包成 DLL 的表達式計算引擎告一段落。原始碼已開放下載。