程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> 關於C語言 >> 仿查詢分析器的C#計算器——4.語法分析(1)

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

編輯:關於C語言

上一篇中介紹通過詞法分析將表達式轉換成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。

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved