編譯原理之算符優先分析的兩個有趣小栗子

2021-08-18 21:43:34 字數 1937 閱讀 1899

今天上編譯原理課時,老師講了些非常有意思的知識,總結一下,也分享給大家~

先丟擲乙個小栗子

大家思考一下,i + i - i * (i + i)這個運算表示式先算哪部分?

此處思考三分鐘。。。。

我相信,大多數人和博主一樣第一感覺先算括號裡面的,但是理智又告訴我,應該先算左邊第乙個加號更合適。但是,博主卻不能清晰的說出原因。。,,ծㅂծ,,

那麼我們先來分析,為什麼第一感覺會是先算括號裡面的呢?

眾同學答道:「括號的優先順序最高,所以先算括號裡面的。」

看著好像。。沒什麼毛病。。

但是,博主很遺憾的宣布,第乙個先運算的是左邊的加號。。

為什麼呢??(・∀・(・∀・(・∀・*)

事實是這樣的:運算子優先順序的比較只在相鄰的op(運算子)之間進行比較,而總所周知,根據自左向右的結合性,我們再來看上面的小栗子i + i - i * (i + i)裡面,首先比較+-的優先順序,是同級運算子對不對,那麼,我們顯然是要從左到右進行運算~ 所以答案和理由就出來咯!o( ̄▽ ̄)ブ

我們再反過來思考一下,為什麼我們的第一反應會是括號裡面的呢?

某同學回答:「小學數學老師教的。。」

眾人大笑~

其實,回想一下,我們小的時候,老師確實讓我們先算括號裡面的,然後再做乘除,最後做加減。。難道是老師錯了?

事實是這樣的,其實,那個時候,我們學的叫速算,我們總認為,先把括號裡面的值算出來之後,整個表示式會變得簡單一點,把乘除做完,整個表示式會變得更簡單一點。。沒毛病吧~

但是我們的計算器,計算機不是這樣計算的,他們只認相鄰op(運算子)的優先級別。

到這裡,我們應該能夠理解正確的運算順序,以及我們錯誤的原因啦。。又解決了乙個問題,o( ̄▽ ̄)ブ

丟擲第二個小栗子

學程式設計基礎的時候,我們接觸過各種各樣的表示式,比如:算數表示式,關係表示式,邏輯表示式等,再細分一下,又有,加法運算表示式,減法運算表示式,賦值運算表示式,逗號運算表示式等。。

栗子來啦~

a = 10 , 5 , 6這個表示式叫什麼名字?

a = (10 , 5 , 6)這個表示式交什麼名字?

思考三分鐘。。

又含有逗號,又含有賦值的表示式叫什麼呢?

答案如下:

a = 10 , 5 , 6這個表示式叫逗號運算表示式。

a = (10 , 5 , 6)這個表示式叫賦值運算表示式。

其實,乙個表示式,他叫什麼名字,是由最後乙個運算子來命名的。。

所以,我們第乙個小栗子i + i - i * (i + i)它叫什麼名字呢?

某同學回答:「數學表示式。」

我發誓,在課堂那麼嚴肅的地方,我沒笑。。

這個表示式叫算術表示式肯定是沒毛病的。。具體一點呢?

其實,它叫減法表示式。為什麼呢??當然是因為減號最後算咯~

運算順序:

1. a = i + i

2. b = (i +i)

3. c = i * b

4. d = b - c

ps:配圖均來自網路,侵刪~

編譯原理(自下而上分析 算符優先分析過程)

我們討論的自下而上分析法是一種 移進 規約 法。大意是 用乙個寄存符號的先進後出的棧,把輸入符號乙個乙個地移進到棧裡,當棧頂形成某個產生式的乙個候選式時,即把棧頂的這一部分替換成 規約成 該產生式的左部符號。例 有文法g s a t t t,s s 給出輸入串 a,a,a 的算符優先分析過程。1 擴...

簡單算符優先文法分析程式(編譯原理)

實現算符優先文法分析程式 完成對以下表示式文法的分析程式。includeint find int a,int b 優先關係表 return table a 1 b 1 int in vt char c 可以根據返回的數值去優先關係表裡面查詢優先關係 return n int judge char p...

編譯原理 八 算符優先分析法 分析過程

算符優先分析法 構造演算法優先關係表 算符優先關係主要用於界定右句型的控制代碼 標記控制代碼的左端 出現在控制代碼的內部 標記控制代碼的右端。發現控制代碼的過程 非終結符的處理 因為非終結符不能影響語法分析,所以不需要區分它們,於是只用乙個佔位符來代替它們 演算法的主體思想 用棧儲存已經看到的輸入符...