字尾式
又稱逆波蘭表示法,把運算量(運算元)寫在前面,把算符寫在後面(字尾)。
如:a+b 寫成 ab+
a+b * c 寫成 abc * +
字尾式要注意的是運算符號優先順序
c語言中運算子優先順序排序如下:
優先順序【高到低】:
分為優先順序15級:
1、圓括號【()】、下標運算子【】、分量運算子的指向結構體成員運算子【->】、結構體成員運算子【.】;
2、邏輯非運算子【!】、按位取反運算子【~】、自增自減運算子【++】【 --】、負號運算子【-】、型別轉換運算子【(型別)】、指標運算子和取位址運算子【*】【&】、長度運算子【sizeof】;
3、乘法運算子【*】、除法運算子【/】、取餘運算子【%】;
4、加法運算子【+】、減法運算子【-】;
5、左移動運算子【<<】、右移動運算子【>>】;
6、關係運算子【< 】【>】【<=】【 >= 】;
7、等於運算子【==】、不等於運算子【!=】;
8、按位與運算子【&】;
9、按位異或運算子【^】;
10、按位或運算子【|】;
11、邏輯與運算子【&&】;
12、邏輯或運算子【||】;
13、條件運算子【?:】;
14、賦值運算子【=】【/=】【*=】【%=】【+=】【-=】【<<=】【>>=】【&=】【^=】【|=】;
三元式帶有三個記錄域:op(操作符),arg1(左運算元),arg2(右運算元)
(op,arg1,arg2)
如:y+1
(+,y,1)
間接三元式
將按運算的先後順序列出有關三元式在三元式表中的位置
如:x[i] :=y
(0) (=[ ],x,i)
(1) (:=,(0),y)
x := y[i]
(0) ( [ ]=,y,i)
(1) (:=,x,(0))
四元式帶有四個記錄域:op,arg1,arg2,result
如:y:=x+1
(1)(+,x,1,t)
(2)(:=,t,-,y)
布林表示式的翻譯
優先順序:not>and>or
a or b : if a then true else b
a and b : if a then b else false
not a : if a then false else true
作為條件控制的布林表示式
if e then s1 else s2,作為轉移條件的布林表示式e,可賦予它兩個出口,乙個為「真」出口,出向s1;乙個為「假」出口,出向s2
(jnz,a,-,p)表示if a goto p
(jrop,x,y,p)表示if x rop y goto p
rop為操作符,例 j-
(j,-,-,p)表示 goto p
例:while (a//a(1)( j< , a , b ,(3))
//判斷語句為false則跳到(8)結束
(2)( j , - , - , (8) )
//c(3)( j< , c , d , (5))
//判斷語句為false則跳到(1)
(4)( j , - , - , (1))
//y,z相加賦值給t
(5)( + , y , z , t )
//t的值賦值給x
(6)( := , t , - , x )
//執行完then後的語句跳轉回while迴圈(1)
(7)( j , - , - , (1))
(8)下一條語句
編譯原理語義分析 編譯原理 語義分析和符號表
本文使用 zhihu on vscode 創作並發布經過詞法分析 語法分析之後,源程式形式上和結構上的正確性基本得到了保證。然而,僅有形式上的正確性,並不能保證源程式就是完全正確的,還要檢查源程式的含義是否正確。諸如符號的使用是否得當,表示式的型別是否相容等,完成這些功能的編譯階段稱為語義分析。語義...
編譯原理之語義分析
見語法制導翻譯篇 語義是指源程式及其組成部分所表述的含義 和語法不同,語法是關於程式及其組成部分的構成規則的描述,是上下文無關的 而語義是關於語法結構的含義及其使用規則的描述,是上下文有關的。語法上正確,其語義不一定正確。語義分析與中間 生成器基於語義規則,對語法樹進行語義分析 變數是否定義,型別是...
編譯原理語義分析(文字輸入)源程式
include include include include include struct quad struct quad quad 30 int count 0 char expression void char prog 200 token 9 function長度為8,加上 0 所以陣列最...