2023年03月30日
課本p24 p226 p259(左側,7-1圖)
1.外部宣告 external-declaration
external int a;
int b;
void f(){}
2.ucc\examples\sc\decl.c
課本p24
declaration -----> int declarator
declarator -----> * declarator | postfixdeclarator
------------>d =
postfixdeclarator ---> directdeclarator | postfixdeclarator [num]
| postfixdeclarator (parameterlist)
------------>pd
parameterlist ---> int | parameterlist , int
directdeclarator -----> id | (declarator)
3.p226"型別表示式"
int --運算元
【運算子】:* --指標型別, --陣列型別,() --函式型別
3.1指標的陣列:int *arr[4]; 陣列的指標:int(*ptr)[4];
typedef int* intpir typedef int array[4]
intpir arr[4]; array[4] *prt;
4.p259
**區靜態區 【編譯時】(全域性變數、static變數、常量)
堆區 【執行時】(new,malloc)
空閒記憶體【執行時】
棧區 【執行時】(區域性,形參)
4.1變參
printf("%d",a);
printf("%d %d",a,b);
printf(const char*fmt, ...);
4.2.13.png(c語言變數布局)
匿名引數
無名引數----->引數提公升
char,short->int
float ->double
stmt.c
2023年03月16日分析器的演算法:(ucc/examples/sc/expr.c)
1.primaryexpression -----> id | num | (expression)
------pe--->-----
| || |
| * /
| |---pe<--
void primaryexpression (void)
else
error("( is missed."); }
2."左結合"
multiplicativeexpression -----> primaryexpression
multiplicativeexpression -----> multiplicativeexpression * primaryexpression
multiplicativeexpression -----> multiplicativeexpression / primaryexpression
void multiplicativeexpression (void)
}3.e =
= t-> t e'
e' -> e
-> +t e'
void e'(void)else
}4.「右結合」
me-> pe me'
me'->e(空)
->*|/ me
void multiplicativeexpression (void)else
}5.visitarithmeticnode()
(a+b)*c
t1* t0 c
+a b
中間**生成:
t0 = a+b;
t1 = t0+c;
6.int(*f(int,int,int))[4]
eg.int (*arr)[4]
typedef int array[4]
array *f(int,int,int)
expr.c
2023年03月22日課本p2411.s->if(b)s1
if(!b)goto label0;
s1label0:
2.if(b)s1 else s2
if(!b)goto label0;
s1 goto label1;
label0:s2
goto label1;
label1:
3.while(b) s1
label0:
if(!b)goto label1;
s1 goto label0;
label1:
4.實驗課自己寫do...while();語句 ?????
5.if語句
kids[0]->label0
kids[1]->label1
expr->expression
thenstmt->then語句
elsestmt->else語句
next
aststmtnode
課本p129
6.visitstatementnode->if(c) a=f;else b=k;
kids[0]->label0
kids[1]->label1
expr->c
thenstmt->a=f;
elsestmt->b=k;
7.expressionstatement(void) -> a=3+5;
kids[0]->a
expr-> +
3 5
8.compund語句
------ ------
| | ->| |
------ ------..........
|next|-- |next|
first(a)首符號的集合
9.linux系統下 make 的結果:
cse@ubuntu:~$ cd src/ucc/examples/sc
cse@ubuntu:~/src/ucc/examples/sc$ make
ucc -o sc lex.c expr.c error.c decl.c stmt.c main.c
cat demo.c
while(c)
} c = c - 1; }}
./sc < demo.c
f is: function(int,int,int) which returns pointer to array[4] of int
fp2 is: pointer to function(int,int,int) which returns pointer to function(int) which returns int
if(!c) goto label_0
a = f
goto label_1
label_0:
b = k
label_1:
label_2:
if(!c) goto label_6
label_3:
if(!d) goto label_5
if(!e) goto label_4
t0 = d - 1
d = t0
label_4:
goto label_3
label_5:
t1 = c - 1
c = t1
goto label_2
label_6:
0311編譯原理上機作業通過情況
pb02011072 4.5pb02011004 4pb01206066 4pb02011107 4pb02011118 4.5pb03000931 4.5pb03011035 4.5pb02011098 5pb02011105 4.5pb03011102 4pb03011022 4.5pb0201...
編譯原理 上下文無關文法
學完了詞法分析,我們知道詞法分析器將正規表示式轉換成詞法單元流,但對於這個記號流我們不知道是否能由正確的文法產生,因此我們需要通過語法分析器來檢測其合法性。語法分析器的輸出是一棵語法分析樹 無論顯性還是隱性 並且進行一些語法糾錯處理。語法分析的整個過程大概就是我們先定義乙個語法,再用相應的演算法來檢...
編譯原理1
1 引論 1.1 什麼叫編譯程式 編譯程式是指能夠把某一種語言程式 稱為源語言程式 轉換成另一種語言程式 稱為目標語言程式 而後者與前者在邏輯上是等價的。1.2 編譯過程概述 1.2.1 詞法分析。對構成源程式的字串進行掃瞄和分解,識別單詞。例 for i 1 to 100 do,分析結果如下 基本...