<output id="qn6qe"></output>

    1. <output id="qn6qe"><tt id="qn6qe"></tt></output>
    2. <strike id="qn6qe"></strike>

      亚洲 日本 欧洲 欧美 视频,日韩中文字幕有码av,一本一道av中文字幕无码,国产线播放免费人成视频播放,人妻少妇偷人无码视频,日夜啪啪一区二区三区,国产尤物精品自在拍视频首页,久热这里只有精品12

      仿查詢分析器的C#計(jì)算器——5.計(jì)算求值

      代碼下載https://files.cnblogs.com/conexpress/ConExpress_MyCalculator.rar

      前面幾篇文章介紹了各種分析過程,本篇作為完結(jié)篇,介紹如何調(diào)用之前實(shí)現(xiàn)的代碼,如何實(shí)現(xiàn)多行表達(dá)式或者選擇部分表達(dá)式進(jìn)行運(yùn)算,以及如何定位錯(cuò)誤。

      本程序可以不需要UI界面,獨(dú)立成一個(gè)模塊。如果表達(dá)式分析與計(jì)算功能打包成一個(gè)dll,那入口只有一個(gè),SyntaxAnalyse類。new一個(gè)SyntaxAnalyse類之后,調(diào)用其中的Analyse方法,將要計(jì)算的運(yùn)算表達(dá)式作為參數(shù)傳遞進(jìn)去,返回一個(gè)頂級(jí)TokenRecord對(duì)象,再根據(jù)返回的TokenRecord對(duì)象的值類型取得結(jié)果,整個(gè)計(jì)算過程就完成了,使用起來非常方便。

      Code

      從代碼中可以看出,首先是詞法分析,得到一個(gè)記號(hào)對(duì)象列表List<TokenRecord>,然后進(jìn)行語法分析,調(diào)用SyntaxTreeAnalyse的SnytaxTreeGetTopTokenAnalyse方法,分析出頂級(jí)記號(hào)對(duì)象,這樣一棵樹就出來了。接下來執(zhí)行頂級(jí)節(jié)點(diǎn)的Execute方法,該方法中首先會(huì)執(zhí)行下級(jí)節(jié)點(diǎn)的Execute方法,然后再針對(duì)下級(jí)節(jié)點(diǎn)的值執(zhí)行自身的運(yùn)算。所有的TokenRecord都是這樣的模式,逐級(jí)遞歸調(diào)用,最后得到計(jì)算結(jié)果。TokenRecord基類中包含一個(gè)object類型的Value屬性和一個(gè)Type類型的TokenValueType屬性,通過這兩個(gè)屬性可以得到具體的值及其類型,然后做下一步處理。因?yàn)檫@里不只能執(zhí)行數(shù)學(xué)運(yùn)算,還能做字符串和邏輯值運(yùn)算,所以必須通過TokenValueType來確定值的類型。如果只需要實(shí)現(xiàn)數(shù)學(xué)運(yùn)算,程序會(huì)簡(jiǎn)單一些。

      窗體的調(diào)用也很簡(jiǎn)單,并沒有設(shè)計(jì)漂亮的外觀和高級(jí)設(shè)置等。主要的代碼是“計(jì)算”按鈕的Click事件處理方法,代碼如下:

      Code


      代碼中包含詳細(xì)的注釋,這里做簡(jiǎn)要說明。未選中輸入框中的文本則執(zhí)行全部代碼,否則執(zhí)行選中部分的代碼。將要執(zhí)行的代碼根據(jù)是否計(jì)算多行進(jìn)行分解,存放在一個(gè)字符串?dāng)?shù)組中。然后對(duì)表達(dá)式數(shù)組循環(huán)計(jì)算。如此實(shí)現(xiàn)了選擇部分表達(dá)式計(jì)算以及多行表達(dá)式計(jì)算。另外如何實(shí)現(xiàn)錯(cuò)誤定位,則是通過捕獲錯(cuò)誤。程序中定義了一個(gè)Exception類,但進(jìn)行詞法分析和語法分析的時(shí)候,如果發(fā)生錯(cuò)誤,則會(huì)拋出該異常。通過該異常類中的錯(cuò)誤序號(hào)以及長(zhǎng)度,就可以選中輸入框中的錯(cuò)誤部分。但是這里只能選中第一次發(fā)生的錯(cuò)誤,不能像VS.NET的IDE一樣捕獲所有錯(cuò)誤。Exception類的定義如下:

      Code

      單行多行切換只需要設(shè)置窗體的AcceptButton屬性為“計(jì)算按鈕”即可,這樣在單行狀態(tài)下,用戶回車就相當(dāng)于點(diǎn)擊“計(jì)算按鈕”。而按“F5”鍵執(zhí)行計(jì)算則是通過檢測(cè)輸入框的KeyUp事件,當(dāng)釋放“F5”鍵時(shí)用代碼去執(zhí)行“計(jì)算”按鈕的Click操作實(shí)現(xiàn)計(jì)算。

      另外這里有一個(gè)語法樹分析,是為了顯示語法樹的結(jié)構(gòu),用更直觀的方法來驗(yàn)證分析是否正確。樹節(jié)點(diǎn)的文本是調(diào)用TokenRecord的ToString方法得到的,如果需要顯示為其他信息,也可以自行修改。

      到這里本系列文章就結(jié)束了,其中包含了一些編程的技巧,希望對(duì)看了本系列文章的各位有幫助。
      輸入界面
      語法樹分析
      代碼下載https://files.cnblogs.com/conexpress/ConExpress_MyCalculator.rar

      posted @ 2009-03-30 10:54  Alex Leo  閱讀(3440)  評(píng)論(3)    收藏  舉報(bào)
      主站蜘蛛池模板: 国产亚洲精品AA片在线播放天| 亚洲欧美偷国产日韩| 麻豆精品在线| 亚洲免费成人av一区| 国产精品v片在线观看不卡| 免费国产好深啊好涨好硬视频 | 人妻丝袜无码专区视频网站| 熟妇人妻无码中文字幕老熟妇| 97人妻精品一区二区三区| 亚洲色欲色欲天天天www| 十八禁午夜福利免费网站| 亚洲成av人片乱码色午夜| 秋霞电影网| 久久日产一线二线三线| 亚洲中文字幕亚洲中文精| 少妇人妻偷人精品免费| 国产视频最新| 国产成人不卡一区二区| 亚洲日韩av在线观看| 免费无遮挡无码视频网站| 宾馆人妻4P互换视频| 国内精品久久人妻无码不卡| 麻豆tv入口在线看| 人人妻人人澡人人爽欧美一区双 | 亚洲成人四虎在线播放| 久久精品国产一区二区三区| 最新亚洲人成网站在线影院| 黄又色又污又爽又高潮| 国产精品男女午夜福利片| 久久久成人毛片无码| 国产一区二区日韩经典| 国产一区二区三区在线看| 激情国产一区二区三区四区| 任我爽精品视频在线播放| 国产日韩一区二区四季| 久久er99热精品一区二区| 吉川爱美一区二区三区视频| 无码精品人妻一区二区三李一桐| 丰满爆乳一区二区三区| 蜜臀av一区二区国产在线| 国产视频最新|