c 實現科學計算器 設計篇之優先順序表設計

2021-04-15 16:02:43 字數 1208 閱讀 1280

為了引入優先順序概念,我們首先來看乙個簡單的表示式,如下

#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...