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

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

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

      仿查詢分析器的C#計(jì)算器——3.詞法分析

      承接上一篇,這一篇講如何把表達(dá)式轉(zhuǎn)換成記號(hào)對(duì)象,這里就涉及到了編譯原理中的詞法分析。關(guān)于編譯原理我不想多講,畢竟我自己也不怎么熟悉,現(xiàn)在只知道其中有個(gè)有限自動(dòng)機(jī)的概念。不管什么概念,用代碼實(shí)現(xiàn)才是最終目標(biāo)。
      因?yàn)椴磺宄址械降装裁醋址荒芤粋€(gè)個(gè)字符進(jìn)行處理,采用循環(huán)一次次向后取一個(gè)字符進(jìn)行判斷。這里建立一個(gè)TokenFactory記號(hào)“工廠”類,由這個(gè)類負(fù)責(zé)對(duì)表達(dá)式進(jìn)行分析并“生產(chǎn)”出TokenRecord對(duì)象。其中包括兩個(gè)方法,LexicalAnalysis和ProduceToken。LexicalAnalysis用于詞法分析,分析到符合規(guī)則的記號(hào)對(duì)象后調(diào)用ProduceToken方法,“生產(chǎn)”出對(duì)應(yīng)的TokenRecord對(duì)象。這里偷了一點(diǎn)懶,把所有方法全部寫成了static,這樣就不用實(shí)例化多個(gè)子類了。
      從這個(gè)類衍生出多個(gè)子類:
      TokenKeywordFactory:用于處理關(guān)鍵字
      TokenSymbolFactory:用于處理運(yùn)算符
      TokenStringFactory:用于處理字符串
      TokenNumberFactory:用于處理數(shù)字
      類圖如下:

      分析表達(dá)式的入口只有一個(gè),就是TokenFactory中的LexicalAnalysis。TokenFactory類的代碼如下:
      Code
      在LexicalAnalysis方法中,只需要判斷當(dāng)前字符是否符合一定的起始規(guī)則,如果符合起始規(guī)則,就交給對(duì)應(yīng)的工廠類去處理。
      下面用例子來講吧,比如123.3*2-(24+34),分析成記號(hào)對(duì)象如下:

      記號(hào)對(duì)象

      對(duì)應(yīng)表達(dá)式

      TokenValue

      123.3

      TokenMultiply

      *

      TokenValue

      2

      TokenMinus

      -

      TokenLeftBracket

      (

      TokenValue

      24

      TokenPlus

      +

      TokenValue

      34

      TokenRightBracket

      )

      這里的處理過程是
      1.取字符“1”,轉(zhuǎn)到TokenNumberFactory,把分析取到的字符串“123.3”轉(zhuǎn)換為TokenNumber并存到TokenList中
      2.取字符“*”,轉(zhuǎn)到TokenSymbolFactory,把“*”轉(zhuǎn)換成TokenMultiply并存到TokenList中
      3.取字符“2”,轉(zhuǎn)到TokenNumberFactory,把分析取到的字符串“2”轉(zhuǎn)換為TokenNumber并存到TokenList中
      4.取字符“- ”,轉(zhuǎn)到TokenSymbolFactory,把“-”轉(zhuǎn)換成TokenMinus并存到TokenList中
      5.取字符“( ”,轉(zhuǎn)到TokenSymbolFactory,把“(”轉(zhuǎn)換成TokenLeftBracket并存到TokenList中
      6.取字符“2”,轉(zhuǎn)到TokenNumberFactory,把分析取到的字符串“24”轉(zhuǎn)換為TokenNumber并存到TokenList中
      7.取字符“+”,轉(zhuǎn)到TokenSymbolFactory,把“+”轉(zhuǎn)換成TokenPlus并存到TokenList中
      8.取字符“3”,轉(zhuǎn)到TokenNumberFactory,把分析取到的字符串“34”轉(zhuǎn)換為TokenNumber并存到TokenList中
      9.取字符“) ”,轉(zhuǎn)到TokenSymbolFactory,把“)”轉(zhuǎn)換成TokenRightBracket并存到TokenList中
      至于各個(gè)工廠類中怎么分析提取出對(duì)應(yīng)的字符串,則有各自不同的規(guī)則。如果符合規(guī)則就繼續(xù)向后分析,否則代表分析結(jié)束,然后從源字符串中截取開始分析的序號(hào)到結(jié)束分析的序號(hào)之間的字符串即可。這里的Index參數(shù)相當(dāng)于C++中的指針,指示當(dāng)前分析到哪一個(gè)字符。因?yàn)楦鱾€(gè)“工廠”類需要在分析完一個(gè)記號(hào)后將指針后移,這里就將Index設(shè)置為ref類型。

      另一個(gè)方法GetOperateTokenDictionary是用來獲取記號(hào)字典的,字典的Key是運(yùn)算符和關(guān)鍵字,Value是對(duì)應(yīng)的類名稱。在分析中遇到運(yùn)算符和關(guān)鍵字的時(shí)候,通過查詢字典就可以獲取對(duì)應(yīng)的類名稱,然后通過反射生成類的實(shí)例,這樣就可以靈活將操作符和類對(duì)應(yīng)起來。字典的來源是本地的一個(gè)XML文件,當(dāng)新增一個(gè)操作符的時(shí)候,到XML文件里注冊(cè)一下,程序就可以識(shí)別出新操作符了,“工廠”類不需要做任何修改。如果需要修改操作符,可以直接在XML文件里面修改,程序也能識(shí)別,比如把mid改成substring,程序照樣可以運(yùn)行。這就是“依賴注入”的實(shí)際應(yīng)用。
      這里需要使用的XML如下:
      Code

      接下來介紹各個(gè)工廠類。首先是關(guān)鍵字工廠TokenKeywordFactory。當(dāng)TokenFactory分析到英文字母的時(shí)候,把任務(wù)轉(zhuǎn)交給TokenKeywordFactory。該類從分析得到的第一個(gè)英文字母開始向后分析,如果后面還是英文字母或者數(shù)字,則繼續(xù)向后分析,否則結(jié)束分析。在這里關(guān)鍵字允許包含數(shù)字,但第一個(gè)字符必須是英文字母。分析結(jié)束后,截取分析得到的字符串,然后到交給ProduceToken方法產(chǎn)生一個(gè)TokenRecord類的實(shí)例。
      在ProduceToken方法中,首先判斷傳入的字符串是否存在于關(guān)鍵字字典中,如果不存在則報(bào)錯(cuò),如果存在則用反射產(chǎn)生一個(gè)對(duì)應(yīng)類的實(shí)例。其中有些關(guān)鍵字是常量,所以進(jìn)行了特殊處理,需要設(shè)置記號(hào)對(duì)象的值和類型。
      以上工作完成后,調(diào)整分析指針的位置,回到TokenFactory類,執(zhí)行后續(xù)分析。TokenKeywordFactory的代碼如下:
      Code
      TokenSymbolFactory運(yùn)算符工廠類的分析過程和TokenKeywordFactory基本相似。但是運(yùn)算符一般只包含一個(gè)字符或者兩個(gè)字符,就不需要一直向后分析了,只需要判斷運(yùn)算符字典中是否存在對(duì)應(yīng)的項(xiàng)即可。另外有些操作符的第一個(gè)字符是重復(fù)的,比如“>”和“>=”,這時(shí)候就需要判斷“>”之后是否還存在“=”。如果向后再截取一個(gè)字符,在字典中也存在對(duì)應(yīng)項(xiàng),則按雙字符運(yùn)算符處理,否則就是單字符運(yùn)算符。TokenSymbolFactory的代碼如下:
      Code
      TokenStringFactory字符串工廠類的分析是按照VB語法,只有引號(hào)需要轉(zhuǎn)義,用兩個(gè)引號(hào)即可,其他特殊字符不需要轉(zhuǎn)義。而且引號(hào)和JavaScript一樣,可以用大寫或者小寫,只要兩端匹配就可以了。如果在單引號(hào)標(biāo)記的字符串中包含雙引號(hào),則不需要轉(zhuǎn)義,雙引號(hào)標(biāo)記的字符串中出現(xiàn)單引號(hào)也不需要轉(zhuǎn)義。字符串的分析是以引號(hào)作為界定,向后分析的過程中,如果遇到與起始引號(hào)相同的字符,判斷后面是否存在重復(fù)引號(hào),存在則轉(zhuǎn)義,不存在則結(jié)束分析。將兩個(gè)引號(hào)之間的字符串截取,創(chuàng)建一個(gè)TokenValue對(duì)象,結(jié)束分析。TokenStringFactory代碼如下:
      Code
      TokenNumberFactory數(shù)值工廠的分析最簡單,主要是判斷下一個(gè)字符是否是數(shù)字或者小數(shù)點(diǎn)。將分析得到的字符串轉(zhuǎn)換為double類型,然后賦值給創(chuàng)建的TokenValue對(duì)象即可。TokenNumberFactory代碼如下:
      Code
      通過這些“工廠”類就可以完成把表達(dá)式分析成記號(hào)對(duì)象列表,為程序理解表達(dá)式做好了基礎(chǔ)工作。在下一篇中會(huì)介紹如何將記號(hào)對(duì)象分析成樹視圖,進(jìn)而通過樹視圖逐級(jí)求解。
      代碼下載:https://files.cnblogs.com/conexpress/ConExpress_MyCalculator.rar
      posted @ 2009-03-20 12:30  Alex Leo  閱讀(3171)  評(píng)論(6)    收藏  舉報(bào)
      主站蜘蛛池模板: 成人看的污污超级黄网站免费| 国产成人av免费观看| 国产性色的免费视频网站| 97国产成人无码精品久久久| 国产精品一区二区久久精品无码| 亚洲欧洲久久激情久av| 无码国内精品人妻少妇| 中文国产日韩欧美二视频| 国产精品污www在线观看| 亚洲国产精品一二三四区| 婷婷四房播播| 欧美肥老太牲交大战| 亚洲综合欧美在线…| 精品无套挺进少妇内谢| 天天躁夜夜躁狠狠喷水| 亚洲日韩欧洲乱码av夜夜摸| 国产不卡的一区二区三区| 激情五月开心婷婷深爱| 1000部拍拍拍18勿入免费视频| 3d全彩无码啪啪本子全彩| 风韵丰满妇啪啪区老老熟女杏吧| 少妇人妻精品无码专区视频| 法库县| 免费观看欧美猛交视频黑人| 99精品国产一区二区三区不卡| 少妇爽到爆视频网站免费| 欧美牲交a欧美牲交aⅴ图片| 少妇性l交大片| 中文字幕久区久久中文字幕| 中文字幕在线精品国产| 日韩精品人妻av一区二区三区| 久久午夜私人影院| 国产亚洲一二三区精品| 久久国产精品老女人| 亚洲色成人网站www永久男男| 国产亚洲无线码一区二区| 热久在线免费观看视频| 久久国产一区二区三区| 高中女无套中出17p| 国产精品久久久久久人妻精品动漫 | 亚洲成年轻人电影网站WWW|