在LexicalAnalysis方法中,只需要判斷當前字符是否符合一定的起始規則,如果符合起始規則,就交給對應的工廠類去處理。
下面用例子來講吧,比如123.3*2-(24+34),分析成記號對象如下:
記號對象
對應表達式
TokenValue
123.3
TokenMultiply
*
TokenValue
2
TokenMinus
-
TokenLeftBracket
(
TokenValue
24
TokenPlus
+
TokenValue
34
TokenRightBracket
)
這裡的處理過程是
1.取字符“1”,轉到TokenNumberFactory,把分析取到的字符串“123.3”轉換為TokenNumber並存到TokenList中
2.取字符“*”,轉到TokenSymbolFactory,把“*”轉換成TokenMultiply並存到TokenList中
3.取字符“2”,轉到TokenNumberFactory,把分析取到的字符串“2”轉換為TokenNumber並存到TokenList中
4.取字符“- ”,轉到TokenSymbolFactory,把“-”轉換成TokenMinus並存到TokenList中
5.取字符“( ”,轉到TokenSymbolFactory,把“(”轉換成TokenLeftBracket並存到TokenList中
6.取字符“2”,轉到TokenNumberFactory,把分析取到的字符串“24”轉換為TokenNumber並存到TokenList中
7.取字符“+”,轉到TokenSymbolFactory,把“+”轉換成TokenPlus並存到TokenList中
8.取字符“3”,轉到TokenNumberFactory,把分析取到的字符串“34”轉換為TokenNumber並存到TokenList中
9.取字符“) ”,轉到TokenSymbolFactory,把“)”轉換成TokenRightBracket並存到TokenList中
至於各個工廠類中怎麼分析提取出對應的字符串,則有各自不同的規則。如果符合規則就繼續向後分析,否則代表分析結束,然後從源字符 串中截取開始分析的序號到結束分析的序號之間的字符串即可。這裡的Index參數相當於C++中的指針,指示當前分析到哪一個字符。因為各個 “工廠”類需要在分析完一個記號後將指針後移,這裡就將Index設置為ref類型。
另一個方法GetOperateTokenDictionary是用來獲取記號字典的,字典的Key是運算符和關鍵字,Value是對應的類名稱。在分析中遇到運算 符和關鍵字的時候,通過查詢字典就可以獲取對應的類名稱,然後通過反射生成類的實例,這樣就可以靈活將操作符和類對應起來。字典的來 源是本地的一個XML文件,當新增一個操作符的時候,到XML文件裡注冊一下,程序就可以識別出新操作符了,“工廠”類不需要做 任何修改。如果需要修改操作符,可以直接在XML文件裡面修改,程序也能識別,比如把mid改成substring,程序照樣可以運行。這就是 “依賴注入”的實際應用。