為了引入優先順序概念,我們首先來看乙個簡單的表示式,如下
#1+2*3# (#用於開頭和結尾,並作為表示式內容)
常識告訴我們,我們會先算2*3然後計算1+6,但實際上,如果直接從語法角度看,該表示式存在兩種含義:
一種含義就是我們所認為的1+(2*3)
另一種含義則是(1+2)*3
這就是說表示式存在二義性,為了消除二義性,我們必須引入優先順序概念。
我們來定義一種優先順序運算,定義如下: a
a=b a的優先順序等於b
a>b a的優先順序大於b
使用時要注意,在這裡axb存在隱含意義,表明在表示式中,a出現在b之前,且相鄰,例如表示式ab就是滿足條件的。
對於運算子,我們需要注意一下相鄰的概念,這裡的相鄰是指相對相鄰,例如1+2*3中,+和*就是相鄰的。
大家還要注意一點,該種運算不存在傳遞性,例如a
目前的設計,實現了兩種不同的優先順序表,一種是相對相鄰的優先順序表,一種是絕對絕對的優先順序表。
#1+2*3#,+和*是相對相鄰,這種相鄰是運算子棧中的相鄰位置,僅對於運算子有效,不包含數符(也就是數字)。
而1和+則是絕對相鄰,這種相鄰中包含運算子(operator)和數符(operand)。
相對相鄰的優先順序表既可以用於運算單元,也可以用於文法分析,而絕對相鄰的優先順序表僅用於文法分析。
表示式:1*2+3#
步驟運算子棧
數符棧剩餘表示式
當前輸入說明1
#空1*2+3#2#
1*2+3#13
# *1
2+3#
*#<*,把*壓入運算子棧
4# *
1 2+3#25
# *1 23#+
* > + ,對*進行運算,由於*是雙目運算子,
從數符棧彈出兩個數符,從運算子棧彈出*,
最後把運算結果壓入數符棧
6# +
2 3#37
# +2 3空#
+ > # ,對+進行運算,運算步驟同上,8#
5空無結束,數符棧頂的數就是運算結果
要注意的是:對於算符優先演算法,對於#的處理比較特別,一旦發現運算子棧頂是# ,而當前輸入也是 # 時,馬上結束迴圈。
由於顯示原因,這裡就不把該運算器的優先順序表貼出來了,大家可以從
由於該錶並未經過嚴格的驗證,如果覺得優先順序有問題還請指出。
c 實現科學計算器 設計篇之優先順序表設計
為了引入優先順序概念,我們首先來看乙個簡單的表示式,如下 1 2 3 用於開頭和結尾,並作為表示式內容 常識告訴我們,我們會先算2 3然後計算1 6,但實際上,如果直接從語法角度看,該表示式存在兩種含義 一種含義就是我們所認為的1 2 3 另一種含義則是 1 2 3 這就是說表示式存在二義性,為了消...
c 實現科學計算器 實現篇之文法分析器
1.詞法分析器專案 phraseanalyzer 預設被設定為類庫,它編譯出來的phraseanalyzer.dll將被文法分析器專案所引用,如果你 想單獨以應用程式方式編譯執行它,但這樣執行的話,需要在批處理中關閉文法分析器專案 grammeranalyzer 編譯選項 2.詞法分析器的使用說明請...
C 實現科學計算器 實現篇之文法分析器
版本描述 1.文法分析器是第一次發布,屬於alpha版本,還需要大家幫忙測試一下 2.詞法分析器是第二次發布,該版本對字母字串進行了限制,僅允許本計算器使用的字母串運算子獲得識別,它們是cos,sin,tg,ctg,ans,ax,bx,cx,dx,ex,sto,clr,asin,acos,atg,a...