以前自己做的乙個小編譯器的語法設計

2021-04-08 12:23:27 字數 4080 閱讀 6136

語法和語義的實現過程

1 程式

--->main

2

宣告--->int s; | empty

3 s--->v,s

4 s--->v

5 v-->id

6 v-->id=digit

7

語句集--->

具體語句

語句集| empty

8

語句集--->

具體語句

| empty

9

具體語句

--->

賦值語句

| 選擇語句

| 迴圈語句

| 讀值語句

| 列印語句

10 賦值語句

--->id=e;

11 e--->t+e

12 e--->t-e

13 e--->t

14 t--->id | digit

15

判斷式--->t relop t

16 relop---><= | < | > | >= | == | !=

17

選擇語句

--->m

18

選擇語句

--->m else h

19 m--->if (

判斷式) h

20 h--->

括號1

語句集括號

2

21

括號1---> | empty

23

迴圈語句

--->while (

判斷式) h

24

讀值語句

--->read id ;

25

列印語句

--->print c;

26 c--->b + c

27 c--->b - c

28 c--->b

29 b--->id

first&&follow

表產生式

first

follow

1

程式--->main

2

宣告--->int s; | empty

{} id if while read print }

3 s--->v,s

4 s--->v

5 v-->id

6 v-->id=digit

7

語句集--->

具體語句

語句集| empty

}

8

語句集--->

具體語句

| empty

}

9

具體語句

--->

賦值語句

| 選擇語句

| 迴圈語句

| 讀值語句

| 列印語句

}

10

賦值語句

--->id=e;

}

11 e--->t+e

12 e--->t-e

13 e--->t

14 t--->id | digit

15

判斷式--->t relop t

16 relop---><= | < | > | >= | == | !=

17

選擇語句

--->m

}

18

選擇語句

--->m else h

}

19 m--->if (

判斷式) h

else }

20 h--->

括號1

語句集括號

2

else }

21

括號1--->

}

22

括號2--->} | empty

}

else}

23

迴圈語句

--->while (

判斷式) h

}

24

讀值語句

--->read id ;

}

25

列印語句

--->print c;

}

26 c--->b + c

27 c--->b - c

28 c--->b

29 b--->id

ll(1)

分析表main

intdigit

idif

else

while

read

print

程式程式

->main

宣告宣告

->empty 宣告

->int s; 宣告

->empty 宣告

->empty 宣告

->empty 宣告

->empty 宣告

->empty s

s->v,ss->v

vv->id v->id=digit

語句集語句集

->empty

語句集

->

具體語句

語句集語句集

->

具體語句

語句集->

具體語句

語句集語句集

->

具體語句

語句集->

具體語句

語句集語句集

->

具體語句

語句集->

具體語句

語句集語句集

->

具體語句

語句集->

具體語句

語句集語句集

->

具體語句

具體語句

具體語句

-->

賦值語句

具體語句

-->

選擇語句

具體語句

-->

迴圈語句

具體語句

-->

讀值語句

具體語句

-->

列印語句

賦值語句

賦值語句

->id=e;

ee->t+e e->t-e e->t

e->t+e e->t-e e->t

tt->digit

t->id

判斷式判斷式

->e relop e

判斷式

->e relop e

選擇語句

選擇語句

->m

選擇語句

->m else h m

m->if(

判斷式) h h

h->

括號1

語句集括號

2

h->

括號1

語句集括號2

h->

括號1

語句集括號2

h->

括號1

語句集括號2

h->

括號1

語句集括號2

h->

括號1

語句集括號2

括號1 括號

1->

括號2->empty 括號

2->empty 括號

2->empty 括號

2->empty 括號

2->empty 括號

2->empty 括號

2->empty

迴圈語句

迴圈語句

->while(

判斷式) h

讀值語句

讀值語句

->read id;

列印語句

列印語句

->print c; c

c->b+c c->b-c c->b

bb->id

可以編譯執行以下的範例:

main()//very good!

{int a=5,c,d,e;

int b=7;

c=56;

e=10;

read d;/*讀值語句*/

print d;

if(c

乙個編譯器的小陷阱

有時候在乙個平台執行正確的程式,在另乙個平台就會出問題。在平台移植中,最常見的問題可能就是位元組序和對齊這類問題了。本文記錄的是我以前碰到過的乙個小陷阱。看看這段 的輸出應該是什麼?include stdio.h char do something int p void test1 void int...

乙個手寫語法制導編譯器前端

是指從源程式到中間 這一部分 之後開始涉及適應硬體的部分。當然,要做ide的話還要涉及執行時環境。本科課程設計主要是前端。從原始檔到詞法單元 token 也就是tokenizer。也就是parser。考慮選擇自頂向下的ll,還是自底向上分析的lr。從分析能力上看是這樣的。ll不能解決左遞迴,能勉強搞...

打造自己的編譯器

為了更深入的了解程式設計的底層,就想研究下編譯。找了幾本編譯原理看,什麼正規表示式 自動機把我都搞糊塗了。把複雜的問題弄得更複雜,這不是我希望的。還是自己做個東西模擬下編譯過程。任務 讀入原始碼,輸出彙編。為什麼不直接生成機器碼?彙編可以直接看出編譯是否錯誤。先設定乙個語言模型 只有運算子 識別符號...