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