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

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

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

      仿查詢分析器的C#計算器——4.語法分析

      相關文章:1.初步分析  2.記號對象  3.詞法分析
      上一篇中介紹通過詞法分析將表達式轉換成TokenRecord對象列表。在第一篇中提到將表達式用樹形結構表示,然后就可以很方便的從下級節點取值計算了。那么如何將列表分析成一棵樹的結構呢?
      還是以例子來說明,比如3*7+56/8-2*5,分析成TokenRecord列表就是

      記號對象

      對應表達式

      TokenValue

      3

      TokenMultiply

      *

      TokenValue

      7

      TokenPlus

      +

      TokenValue

      56

      TokenDivide

      /

      TokenValue

      8

      TokenMinus

      -

      TokenValue

      2

      TokenMultiply

      *

      TokenValue

      5

      分析成樹就是

      根據實際的算術規則,運算符優先級高的要先計算,然后由低優先級的運算符去調用它的運算結果。表現在樹視圖上就是高優先級的節點是低優先級節點的下級,即優先級越高,其位置越靠近樹葉。因為這里采用統一的對象,把所有元素都用TokenRecord表示,所以TokenValue也是有優先級的。而通過對樹視圖的分析,所有的TokenValue都是處在葉子的位置,則TokenValue的優先級最高。

      分析到這里就要用代碼實現了。這里需要用到TokenRecord中的優先級Priority屬性,還要用到堆棧。和詞法分析一樣,也是需要用循環依次分析各個TokenRecord。拿上面的TokenRecord列表進行分析,粗體字代表當前分析的TokenRecord。分析的過程中有一個原則叫“高出低入原則”,需要解釋一下。
      “高出低入原則”是指:
      1.棧頂TokenRecord的優先級高于當前TokenRecord的優先級,則將棧頂TokenRecord彈棧(高出)到臨時變量。
      1.1如果堆棧為空,將臨時變量中的TokenRecord加入當前TokenRecord的ChildList中,然后將當前TokenRecord壓棧(低入)。
      1.2如果堆棧不為空,找出棧頂TokenRecord和當前TokenRecord中優先級高的一個(相同則按棧頂高算),將臨時變量中的TokenRecord加入高優先級TokenRecord的ChildList中。再用高出低入原則處理棧頂和當前TokenRecord。
      2.棧頂TokenRecord的優先級低于當前TokenRecord的優先級,則將當前TokenRecord直接壓棧。
      可能文字表述的并不清晰,其中涉及到循環和遞歸的操作,具體的過程通過下面的例子來講解。

      1.列表分析狀態:

      TokenValue(3)

      TokenMultiplay

      TokenValue(7)

      …...

      堆棧分析:當前堆棧為空,將當前分析的TokenRecord壓棧。

      TokenValue(3)

      棧底

      堆棧對應樹視圖:


      2.列表分析狀態:

      TokenValue(3)

      TokenMultiply

      TokenValue(7)

      …...

      堆棧分析:棧頂為TokenValue,當前TokenRecord為TokenMultiply,TokenValue優先級最高。遵循高出低入原則,將TokenValue彈棧并添加到TokenMultiply的ChildList中,然后將TokenMultiplay壓棧。

      TokenMultiply

      棧底

      堆棧對應樹視圖:


      3.列表分析狀態

      …...

      TokenMultiply

      TokenValue(7)

      TokenPlus

      …...

      堆棧分析:棧頂為TokenMultiplay,當前TokenRecord為TokenValue,TokenMultiply優先級高于TokenValue,則將TokenValue加入TokenMultiplay的ChildList中。

      TokenMultiply

      棧底

      堆棧對應樹視圖:


      4.列表分析狀態

      ……

      TokenValue(7)

      TokenPlus

      TokenValue(56)

      …...

      堆棧分析:棧頂為TokenMultiply,當前TokenRecord為TokenPlus,TokenMultiply優先級高于TokenPlus。遵循高出低入原則,將TokenMultiply彈棧并添加到TokenPlus的ChildList中,然后將TokenPlus壓棧。

      TokenPlus

      棧底

      堆棧對應樹視圖:


      5.列表分析狀態

      ……

      TokenPlus

      TokenValue(56)

      TokenDivide

      …...

      堆棧分析:棧頂為TokenPlus,當前TokenRecord為TokenValue,TokenPlus優先級低于TokenValue。遵循高出低入原則,不需要彈棧,直接將TokenValue壓棧。

      TokenValue(56)

      TokenPlus

      棧底

      堆棧對應樹視圖:


      6.列表分析狀態 

      ……

      TokenValue(56)

      TokenDivide

      TokenValue(8)

      …...

      堆棧分析:棧頂為TokenValue,當前TokenRecord為TokenDivide,TokenValue優先級高于TokenDivide。遵循高出低入原則,將TokenValue彈棧并加入TokenDivide的ChildList中。此時棧頂為TokenPlus,TokenDivide優先級高于TokenPlus,遵循高出低入原則,將TokenDivide壓棧。 

      TokenDivide

      TokenPlus

      棧底

      堆棧對應樹視圖:


      7.列表分析狀態 

      ……

      TokenDivide

      TokenValue(8)

      TokenMinus

      …...

      堆棧分析:棧頂為TokenDivide,當前TokenRecord為TokenValue,TokenDivide優先級高于TokenValue。遵循高出低入原則,將TokenValue加入TokenDivide的ChildList中。 

      TokenDivide

      TokenPlus

      棧底

      堆棧對應樹視圖:


      8列表分析狀態 

      ……

      TokenValue(8)

      TokenMinus

      TokenValue(2)

      ……

      堆棧分析:棧頂為TokenDivide,當前TokenRecord為TokenMinus,TokenDivde優先級高于TokenMinus。遵循高出低入原則,將TokenDivide彈棧到臨時變量。檢測到堆棧不為空,此時棧頂為TokenPlus,TokenPlus優先級和TokenMinus一樣。這里相同優先級的按高優先級處理,遵循高出低入原則,則將臨時變量中的TokenDivide加入高優先級TokenPlus的ChildList中。繼續用高出低入原則,將TokenPlus彈棧并加入TokenMinus的ChildList中,再將TokenMinus壓棧。 

      TokenMinus

      棧底

      堆棧對應樹視圖:


      9.列表分析狀態 

      ……

      TokenMinus

      TokenValue(2)

      TokenMultiply

      …...

      堆棧分析:棧頂是TokenMinus,當前TokenRecord是TokenValue,TokenMinus優先級低于TokenValue。遵循高出低入原則,將TokenValue壓棧。

      TokenValue(2)

      TokenMinus

      棧底

      堆棧對應樹視圖:


      10.列表分析狀態 

      ……

      TokenValue(2)

      TokenMultiply

      TokenValue(5)

      堆棧分析:棧頂是TokenValue,當前TokenRecord是TokenMultiply,TokenValue優先級高于TokenMultiply。遵循高出低入原則,將TokenValue彈棧到臨時變量,檢測堆棧不為空,此時棧頂為TokenMinus,TokenMinus優先級低于TokenMultiply,則將臨時變量中的TokenValue加入TokenMultiplay的ChildList中。遵循高出低入原則,將TokenMultiplay加入到棧頂TokenMinus的ChildList中。 

      TokenMultiply

      TokenMinus

      棧底

      堆棧對應樹視圖:


      11.列表分析狀態

      ……

      TokenValue(2)

      TokenMultiply

      TokenValue(5)

      堆棧分析:棧頂是TokenMultiply,當前是TokenValue,TokenMultiply優先級高于TokenValue。遵循高出低入原則,將TokenValue加入TokenMultiply的ChildList中。

      TokenMultiply

      TokenMinus

      棧底

      堆棧對應樹視圖:


      12.堆棧分析:此時列表分析結束,堆棧不為空,需要對堆棧進行處理。經過上面的堆棧分析,遵循高出低入原則,堆棧中的TokenRecord肯定是棧底優先級最低,棧頂優先級最高。只需要將堆棧中的TokenRecord依次彈棧,然后加入到新棧頂的ChildList中即可。最后彈棧的一個TokenRecord就是整個樹視圖的根節點,也就是返回值。到此,堆棧為空,也得到了預期的樹視圖,返回根節點TokenRecord即可。

      上面是對語法分析整個流程的分析,下面給出具體的代碼。程序中的語法分析放在一個單獨的文件中,SyntaxTreeAnalyse.cs,文件中也只有一個SyntaxTreeAnalyse類,專門用于語法樹的分析。這個類只有一個入口即一個公開方法SyntaxTreeGetTopTokenAnalyse,傳入TokenRecord列表,經過分析后返回一個頂級TokenRecord對象,即樹形結構的根節點。具體代碼如下:
      Code

      代碼中對括號進行了特殊處理,遇到左括號之后需要查找到配對的右括號,然后對這一段調用SyntaxTreeGetTopTokenAnalyse進行遞歸處理,找出括號中的頂級節點。而對于方法也需要特殊處理,方法必須帶括號,而且括號中不止一個根節點。處理過程是以逗號為分隔符,依次找出括號中的幾個節點,然后添加到方法的ChildList中。實際的代碼在SyntaxTreeMethodAnalyse方法中實現。

      這一篇寫的我自己都頭暈了,呵呵,堆棧一個個分析,截圖都挺煩。代碼里方法互相遞歸調用,也是比較讓人容易頭暈的,希望有人能看懂吧。
      代碼下載:https://files.cnblogs.com/conexpress/ConExpress_MyCalculator.rar
      posted @ 2009-03-24 16:50  Alex Leo  閱讀(3437)  評論(2)    收藏  舉報
      主站蜘蛛池模板: 97久久精品人人澡人人爽| 日韩精品福利一区二区三区| 久久高清超碰AV热热久久| 亚洲国产精品一区二区久| 好紧好爽午夜视频| 色综合天天综合天天更新| 国产精品午夜福利资源| 成人午夜在线观看日韩| 性姿势真人免费视频放| 国产成人无码免费看视频软件 | 国产激情电影综合在线看| 精品一二三四区在线观看| 97se亚洲综合自在线| 亚洲精品尤物av在线网站| av明星换脸无码精品区| 国产精品无码av不卡| 免费人成在线观看网站| 国产AV巨作丝袜秘书| 免费黄色大全一区二区三区| 亚洲色最新高清AV网站| 少妇熟女视频一区二区三区| 国产稚嫩高中生呻吟激情在线视频| av在线播放国产一区| 欧美牲交a欧美牲交aⅴ免费真| 无码国产精品一区二区VR老人 | 国产欧美日韩亚洲一区二区三区| 黄色国产精品一区二区三区| mm1313亚洲国产精品| 天堂av资源在线免费| 兴山县| 丰满少妇被猛烈进出69影院| 亚洲欧美日韩久久一区二区| 国产午夜福利视频在线| 深夜福利资源在线观看| 日韩淫片毛片视频免费看| 人妻少妇看a偷人无码| 亚洲精品日韩精品久久| 免费国产精品黄色一区二区| 国产国拍亚洲精品永久软件| 99精品热在线在线观看视| 国偷自产一区二区三区在线视频 |