代碼中包含詳細的注釋,這裡做簡要說明。未選中輸入框中的文本則執行全部代碼,否則執行選中部分的代碼。將要執行的代碼根據是否計 算多行進行分解,存放在一個字符串數組中。然後對表達式數組循環計算。如此實現了選擇部分表達式計算以及多行表達式計算。另外如何實 現錯誤定位,則是通過捕獲錯誤。程序中定義了一個Exception類,但進行詞法分析和語法分析的時候,如果發生錯誤,則會拋出該異常。通過 該異常類中的錯誤序號以及長度,就可以選中輸入框中的錯誤部分。但是這裡只能選中第一次發生的錯誤,不能像VS.Net的IDE一樣捕獲所有錯 誤。Exception類的定義如下:
/// <summary>
/// 語法錯誤類,用於發生錯誤時提示用戶並選中錯誤的操作符
/// </summary>
/// <remarks>Author:Alex Leo; Date:2008-5-21;</remarks>
public class SyntaxException : Exception
{
private int m_Index;
/// <summary>
/// 錯誤列號
/// </summary>
/// <remarks>Author:Alex Leo; Date:2008-5-21;</remarks>
public int Index
{
get { return m_Index; }
}
private int m_Length;
/// <summary>
/// 錯誤操作符長度
/// </summary>
/// <remarks>Author:Alex Leo; Date:2008-5-21;</remarks>
public int Length
{
get { return m_Length; }
}
private string m_Message;
/// <summary>
/// 錯誤信息
/// </summary>
public override string Message
{
get { return m_Message; }
}
/// <summary>
/// 構造函數
/// </summary>
/// <param name="Index">錯誤處的列號(用於錯誤時確定錯誤操作符起始位置)</param>
/// <param name="Length">錯誤操作符長度(用於錯誤時選擇錯誤操作符的長度)</param>
/// <param name="ErrorInformation">錯誤信息</param>
public SyntaxException(int Index, int Length, string ErrorInformation)
{
this.m_Index = Index;
this.m_Length = Length;
this.m_Message = ErrorInformation;
}
}
單行多行切換只需要設置窗體的AcceptButton屬性為“計算按鈕”即可,這樣在單行狀態下,用戶回車就相當於點擊“計算按鈕”。而按“ F5”鍵執行計算則是通過檢測輸入框的KeyUp事件,當釋放“F5”鍵時用代碼去執行“計算”按鈕的Click操作實現計算。
另外這裡有一個語法樹分析,是為了顯示語法樹的結構,用更直觀的方法來驗證分析是否正確。樹節點的文本是調用TokenRecord的 ToString方法得到的,如果需要顯示為其他信息,也可以自行修改