今天上編譯原理課時,老師講了些非常有意思的知識,總結一下,也分享給大家~
先丟擲乙個小栗子
大家思考一下,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...
編譯原理 八 算符優先分析法 分析過程
算符優先分析法 構造演算法優先關係表 算符優先關係主要用於界定右句型的控制代碼 標記控制代碼的左端 出現在控制代碼的內部 標記控制代碼的右端。發現控制代碼的過程 非終結符的處理 因為非終結符不能影響語法分析,所以不需要區分它們,於是只用乙個佔位符來代替它們 演算法的主體思想 用棧儲存已經看到的輸入符...