導航:首頁 > 源碼編譯 > c編譯原理

c編譯原理

發布時間:2022-01-23 16:16:44

編譯原理課程設計-詞法分析器設計(C語言)

#include"stdio.h"/*定義I/O庫所用的某些宏和變數*/

#include"string.h"/*定義字元串庫函數*/

#include"conio.h"/*提供有關屏幕窗口操作函數*/

#include"ctype.h"/*分類函數*/

charprog[80]={''},

token[8];/*存放構成單詞符號的字元串*/

charch;

intsyn,/*存放單詞字元的種別碼*/

n,

sum,/*存放整數型單詞*/

m,p;/*p是緩沖區prog的指針,m是token的指針*/

char*rwtab[6]={"begin","if","then","while","do","end"};

voidscaner(){

m=0;

sum=0;

for(n=0;n<8;n++)

token[n]='';

ch=prog[p++];

while(ch=='')

ch=prog[p++];

if(isalpha(ch))/*ch為字母字元*/{

while(isalpha(ch)||isdigit(ch))/*ch為字母字元或者數字字元*/{

token[m++]=ch;

ch=prog[p++];}

token[m++]='';

ch=prog[p--];

syn=10;

for(n=0;n<6;n++)

if(strcmp(token,rwtab[n])==0)/*字元串的比較*/{

syn=n+1;

break;}}

else

if(isdigit(ch))/*ch是數字字元*/{

while(isdigit(ch))/*ch是數字字元*/{

sum=sum*10+ch-'0';

ch=prog[p++];}

ch=prog[p--];

syn=11;}

else

switch(ch){

case'<':m=0;token[m++]=ch;ch=prog[p++];

if(ch=='>'){

syn=21;

token[m++]=ch;}

elseif(ch=='='){

syn=22;

token[m++]=ch;}

else{

syn=20;

ch=prog[p--];}

break;

case'>':m=0;token[m++]=ch;ch=prog[p++];

if(ch=='='){

syn=24;

token[m++]=ch;}

else{

syn=23;

ch=prog[p--];}

break;

case':':m=0;token[m++]=ch;ch=prog[p++];

if(ch=='='){

syn=18;

token[m++]=ch;}

else{

syn=17;

ch=prog[p--];}

break;

case'+':syn=13;token[0]=ch;break;

case'-':syn=14;token[0]=ch;break;

case'*':syn=15;token[0]=ch;break;

case'/':syn=16;token[0]=ch;break;

case'=':syn=25;token[0]=ch;break;

case';':syn=26;token[0]=ch;break;

case'(':syn=27;token[0]=ch;break;

case')':syn=28;token[0]=ch;break;

case'#':syn=0;token[0]=ch;break;

default:syn=-1;}}

main()

{

printf(" Thesignificanceofthefigures: "

"1.figures1to6saidKeyword "

"2. "

"3.figures13to28saidOperators ");

p=0;

printf(" pleaseinputstring: ");

do{

ch=getchar();

prog[p++]=ch;

}while(ch!='#');

p=0;

do{

scaner();

switch(syn){

case11:printf("(%d,%d) ",syn,sum);break;

case-1:printf(" ERROR; ");break;

default:printf("(%d,%s) ",syn,token);

}

}while(syn!=0);

getch();

}

程序測試結果

對源程序beginx:=9:ifx>9thenx:=2*x+1/3;end#的源文件,經過詞法分析後輸出如下圖5-1所示:

具體的你在修改修改吧

Ⅱ 編譯原理寫出表達式-a-(b*c/(c-d)+(-b)*a)的前綴式和後綴式。

abcde/+*+ 畫一個運算樹 先算的d/e根為"/",子結點為d,e 然後算c+d/e,根為「+」,左右子結點為e和上面的子樹 b*(c+d/e)根為"*",作子樹為b,右子樹為(c+d/e)的樹 最後a為右結點,"+"為根,左子樹為剛才得到的樹。 該樹後序遍歷即得。

Ⅲ C語言編譯原理是什麼

編譯共分為四個階段:預處理階段、編譯階段、匯編階段、鏈接階段。

1、預處理階段:

主要工作是將頭文件插入到所寫的代碼中,生成擴展名為「.i」的文件替換原來的擴展名為「.c」的文件,但是原來的文件仍然保留,只是執行過程中的實際文件發生了改變。(這里所說的替換並不是指原來的文件被刪除)

2、匯編階段:

插入匯編語言程序,將代碼翻譯成匯編語言。編譯器首先要檢查代碼的規范性、是否有語法錯誤等,以確定代碼的實際要做的工作,在檢查無誤後,編譯器把代碼翻譯成匯編語言,同時將擴展名為「.i」的文件翻譯成擴展名為「.s」的文件。

3、編譯階段:

將匯編語言翻譯成機器語言指令,並將指令打包封存成可重定位目標程序的格式,將擴展名為「.s」的文件翻譯成擴展名為「.o」的二進制文件。

4、鏈接階段:

在示例代碼中,改代碼文件調用了標准庫中printf函數。而printf函數的實際存儲位置是一個單獨編譯的目標文件(編譯的結果也是擴展名為「.o」的文件),所以此時主函數調用的時候,需要將該文件(即printf函數所在的編譯文件)與hello world文件整合到一起,此時鏈接器就可以大顯神通了,將兩個文件合並後生成一個可執行目標文件。

Ⅳ [編譯原理]令a,b和c是任意正規式,證明以下關系成立

A∣A=A
L(A∣A)=L(A)∪L(A)=L(A),所以有A∣A=A。

A*=ε∣A A*
通過證明兩個正規式所表示的語言相同來證明兩個正規式相等。 L(ε∣A A*)=L(ε)∪L(A)L(A*)= L(ε)∪L(A)(L(A) )*
=L(ε)∪L(A)((L(A))0∪(L(A))1∪(L(A))2∪(L(A))3∪?)
=L(ε)∪(L(A))1∪(L(A))2∪(L(A))3∪(L(A))4∪?
=(L(A))*=L(A*)
即:L(ε∣A A*)=L(A*),所以有:A*=ε∣A A*

(AB)*A=A(BA)*
利用正規式的分配率和結合律直接推導。
(AB)*A=((AB)0∣(AB)1∣(AB)2∣(AB)3∣?)A
=εA∣(AB)1A∣(AB)2A∣(AB)3A∣?
=Aε∣A (BA)1∣A (BA)2∣A (BA)3∣?

=A(BA)* 即:(AB)*A=A(BA)*

Ⅳ 學C語言就一定要學編譯原理嗎

C作為入門語言,其原因是C比較接近底層,又有一定的抽象性,雖然將來未必會使用它,但可以更了解計算機原理以及數據結構。可能對於大多數程序員來說沒太大用處,但原理和數據結構能以計算機角度來思考程序問題,寫出更高效的代碼。這算是專業的程序員的一種修為。而且C現在還是主流,作為入門語言是很適合的。C語言是一種計算機程序設計語言,屬高級語言范疇。它既具有高級語言的特點,又具有匯編語言的特點。它可以作為工作系統設計語言,編寫系統應用程序,也可以作為應用程序設計語言,編寫不依賴計算機硬體的應用程序,代碼清晰精簡,十分靈活。

Ⅵ 學過編譯原理的人看c\c++跟沒學過的人比起來,有什麼長處

一般來講...沒學過C\C++就跟編程文盲差不多...C\C++是基礎,在這之上才能看很多.包括數據結構和演算法(用匯編實在難以描述),或者學習其他編程語言.
讓我難以理解的是,學習編譯原理應該需要學習數據結構,但是樓主又沒有學過C\C++,又是怎麼學會數據結構進而理解編譯原理??我很納悶....樓主有無寫過一個簡單的編譯器?純匯編是很難寫編譯器的,在編譯器的詞法分析,語法分析,語義分析,中間代碼等都基本用C\C++寫,只有當要生成特定的CPU匯編指令的時候需要用匯編語言.
學習操作系統基本不需要過多編譯原理的知識,只需要 匯編+C語言+數據結構和演算法基礎,基本就可以了.

附加一段:樓主好像對編譯原理的理解有所偏差.編譯原理主要是講解編譯器的構造,而匯編語言應該屬於一種編程語言,和C\C++一樣可以應用於很多場合.編譯器原理就是如何把高級語言轉換為低級語言的過程.
一般操作系統使用 匯編語言+C語言寫成.(以下是Intel IA-32平台機器的一般開機過程)在計算機啟動時,操作系統從匯編代碼開始運行,因為這時處於實模式狀態,也沒有操作系統,因此首先啟動BIOS程序,然後CPU通過編譯好的匯編代碼從實模式轉入保護模式.接著逐步把PC的控制權交給操作系統內核,當內核啟動後,由於有了操作系統的支持,此時的機器就可以通過高級語言編譯好的代碼(比如C語言)來管理PC的所有資源.因此,學習操作系統必須有匯編語言和C語言基礎.不然例如進程調度和控制等這種核心問題是不可能看的懂的.

Ⅶ C轉義字元及編譯原理

.2f的意思就是控制輸出的精度,指顯示兩位小數
不能加strlen是因為這個是字元串的操作,你要加string.h的頭文件
(Q)這個用法我沒用過,由於現在沒用自己的電腦,看不到stdio.h的具體內容,不知道printf的函數實現,不過你可以打開stdio.h這個文件,就可以看到函數的實現,相信就比較好理解了,當然你要保證(q)這樣的用法是正確的

Ⅷ c編譯器是如何編譯程序的

每種平台都有自己的C編譯器的,例如linux下有 gcc ,windows下有ms vs 系列。c的源程序經過這些編譯器,再與各自平台的連接器就可以生成該平台下對應的二進制執行代碼了。
但由於C語言很多時候會涉及很多硬體級調用的,這個對平台依賴性極大。所以移植性這種東西,我只能說,哈哈!

Ⅸ C/C++ 的預編譯原理是什麼為什麼要用預編譯

為了防止程序在實際應用當中出現錯誤

Ⅹ 初學c語言 有必要看編譯原理和計算機組成原理嗎

這個沒有必要 剛開始不需要了解那麼深入 如果是計算機專業 到大二左右會上的 是專業課 具體與學習C語言 影響不大

閱讀全文

與c編譯原理相關的資料

熱點內容
sql插入數據命令 瀏覽:470
u盤根目錄文件夾是哪個 瀏覽:693
新預演算法預算編制 瀏覽:622
perl怎樣遍歷文件夾 瀏覽:636
安卓手機如何更好的保護隱私 瀏覽:316
程序員書籍知乎 瀏覽:154
王者安卓v區怎麼轉移到蘋果 瀏覽:449
加密區卸載 瀏覽:122
女程序員壓力大想辭職 瀏覽:681
演算法體現在哪裡 瀏覽:219
阿里雲個人伺服器推薦 瀏覽:363
汽車識別視頻文件夾 瀏覽:110
檔案伺服器不可用是什麼意思 瀏覽:525
有什麼app能看到老婆在哪 瀏覽:562
androidpdf源碼 瀏覽:435
方舟怎麼把單機人物上傳到伺服器 瀏覽:964
偏置命令下大小形狀保持不變 瀏覽:988
單片機各功能介面晶元 瀏覽:795
跳轉收費系統源碼 瀏覽:604
python3什麼時候 瀏覽:708