《編譯原理》上課筆記1

2022-04-29 09:12:09 字數 3950 閱讀 8897

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日課本p241

1.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,分析結果如下 基本...