㈠ 學習編譯原理,需要什麼基礎
編譯原理內容包括語言和文法、詞法分析、語法分析、語法制導翻譯、中間代碼生成、存儲管理、代碼優化和目標代碼生成。
主要是講怎麼做程序的編譯器。
需要數學基礎和很強的邏輯思維。
編譯原理里的字元閉包是指有限循環。關於閉包這些名詞解釋,你們的課程應該有離散數學吧?會有對這些概念的解釋。
編譯原理這書啊。得花老大精力去看了。每一行都會是至關重要的。如果你漏看了哪一節,或許接下來看到的新字母就不知道是什麼意思了。
所以要反復看,反復用邏輯思維推敲。做習題,習題類型也就幾種,做熟了就很簡單
㈡ 編譯原理實驗報告
#include<stdio.h>
void main()
{
int m=0,n=0,n1=0,n2=0,n3=0,zg,fzg,flag;
int bz[7]=;/*狀態改變控制,1 表示可以改變狀態zt值,0 表示不可以*/
int zt[7]=;/*狀態值,2表示未定狀態,1表示 是,0表示 否*/
char temp[100]="\0";/*用於求first集*/
char z[7];/*非總結符*/
char z1[7];/*總結符*/
char z2[7]="\0";/*gs[]文法中出現的標記個數的輔助字元 01234*/
char gs[100]="\0";/*文法,按順序排成字元串*/
printf("請依次輸入非終結符(不超過7個):");
gets(z);
while(z[m]!='\0')
fzg=m;//zg是非終結符個數
while(n<m)
//生成01234輔助字元
printf("您輸入了:");
puts(z);
fflush(stdin);
printf("請依次輸入終結符(不超過7個):");
gets(z1);
while(z1[n1]!='\0')
zg=n1;
printf("您輸入了:");
puts(z1);
fflush(stdin);
printf("按照正確格式輸入所有文法(總長度不超過100格式如下):");
printf("如果文法為(字元'k'表示空):\n");
printf("S-->AB S-->bC A-->k A-->b\n");
printf("輸入:0SAB0SbC1Ak1Ab\n");
printf(" (注:數字01234表示第一二三四個非終結符)\n");
gets(gs);
fflush(stdin);
printf("您輸入了:");
puts(gs);
m=0;
//對於輸入文法字元串的轉換,將每個文法式左部去除
while(gs[m]!='\0')
{
n=m;
if(gs[m]>='0'&&gs[m]<='9')
{
m++;
while(gs[m]!='\0')
{
gs[m]=gs[m+1];
m++;
}
//gs[m-1]='\0';
}
m=++n;
}
m=0;
//puts(gs);
/*情況一,直接判定是 形如: (A-->k) */
while(gs[m]!='\0')
{
if(gs[m]=='k')
{
zt[gs[m-1]-48]=1;
bz[gs[m-1]-48]=0;
}
m++;
}
/*情況二,直接判定--否 形如: (D-->aS ,D-->c) */
for(n=0;n<fzg;n++)
{
if(bz[n]==1)
{
m=0;
n2=0;
while(gs[m]!='\0')
{
if(z2[n]==gs[m])
{
if(gs[m+1]>=z1[0]&&gs[m+1]<=z1[n1-1])
zt[n]=0;
else //gs[m+1] 是非終結符n2做標記
}
//跳出循環,無法解決該情況,推到下面情況三
m++;
}
if(n2!=99) //完成所有掃描,未出現非終結符,得出結論zt[n]=0.bz[n]=0不允許再改變zt[n]
}
}
/*情況三,最終判定*/
do
{
flag=0;
for(n=0;n<fzg;n++)
{
if(bz[n]==1) //未得到判定
{ m=0;
while(gs[m]!='\0')
{
if(gs[m]==z2[n]) //判定gs[m]是輔助字元0123
{
m++;
while(gs[m]>='A'&&gs[m]<='Z')
{
n1=0;
for(n2=0;n2<fzg;n2++) //循環查找是gs[m]哪個非終結符
{
if(gs[m]==z[n2])
{
if(zt[n2]==1) //這個非終結符能推出空
zt[n]=1;
else if(bz[n2]==1) //這個非終結符 現在 不能推出空,但它的狀態可改即它最終結果還未判定
else
//設 m1 做標記供下一if參考
break; //找到gs[m]是哪個非終結符,for循環完成任務,可以結束
}
}
if(n1==99) break;
m++;
}
}
m++;
}
if(zt[n]==1) bz[n]=0;
if(bz[n]==0) flag=1;//對應for下的第一個if(zt[n]==2)
}
}
}while(flag);
printf("結果是:\n");
for(m=0;m<5;m++)
{
switch(zt[m])
{
case 0:printf("%c---否\n",z[m]);break;
case 1:printf("%c---是\n",z[m]);break;
case 2:printf("%c---未定\n",z[m]);break;
}
}
/*
puts(gs);
puts(zt);
puts(z);
puts(z1);
puts(z2);
printf("%d,,,%d",fzg,zg);
*/
//下面求first集
//下面求first集
for(n=0;n<fzg;n++)
m=0;n=0;n1=0;n2=0;
while(gs[n]>='0'&&gs[n]<='9')
{
for(;m<fzg;m++)
{
if(n2!=m)
n1=0; //m=n2用於第二次以後的for循環中還原上次m的值
if(gs[n]==z2[m])
{
while(gs[n+1]>'9')
{
if(n1==0)
//如果是第一個直接保存
//不是第一個,先與字元數組中其它字元比較,沒相同的才保存
else if(gs[n]>='a'&&gs[n]<='z'&&gs[n+1]>='A'&&gs[n+1]<='Z') //gs[n]是終結符 且 gs[n+1]是非終結符
;//什麼也不做,程序繼續n++,掃描下一個gs[n]
else
{
for(n3=0;n3<=n1;n3++)
{
if(temp[m*13+n3]==gs[n+1])
break;
}
if(n3>n1) //for循環結束是因為n3而不是break
}
n++;
}
break; //break位於if(gs[n]==z2[m]),對於gs[n]已找到z2[m]完成任務跳出for循環
}
}
n2=m; //存放該for循環中m的值
n++;
}
//進一步處理集除去非終結符
m=0;n=0;n1=0;n2=0;
for(m=0;m<fzg;m++)
{
if(flag!=m)
n1=0; //m=flag用於第二次以後的for循環中還原上次m的值
while(temp[m*13+n1]!='\0')
{
while(temp[m*13+n1]>='A'&&temp[m*13+n1]<='Z') //搜索非終結符
{
for(n=0;n<fzg;n++) //確定是哪個非終結符
{if(temp[m*13+n1]==z[n])
break;
}
while(temp[m*13+n1]!='\0') //從temp[n*13+n1]開始每個字元依次往前移動一
n1--;
while(temp[n*13+n2]!='\0') //把z[n]對應的first加入temp[m*13+n1]這個first中,每個字元依次加在最後
{
for(n3=0;n3<n1;n3++) //循環判定是否有相同的字元
{
if(temp[m*13+n3]==temp[n*13+n2])
break;
}
if(temp[n*13+n2]=='k'&&zt[m]==0) //那些不能推出 空,但是因為要加入 其他非終結符的first集 而可能含有 空
n2++;
else if(n3>=n1) //for循環結束是因為n3而不是break ,即無相同字元
else n2++;
}
n1=0;
n2=0;
}
n1++;
}
flag=m; //存放該for循環中m的值
}
//非終結符的first集輸出
m=0;n1=0;
for(m=0;m<fzg;m++)
{
n1=0;
printf("非終結符 %c 的first集是: ",z[m]);
while(temp[m*13+n1]!='\0')
{
printf("%c",temp[m*13+n1]);
n1++;
}
printf("\n");
}
}
㈢ 學習編譯原理之前,除了需要學習c語言外,還需要學什麼
主要是會數學邏輯,你可以看看離散數學,其實話說回來 主要看你學編譯原理用來干什麼了,如果只學理論 你會發現你學完以後依然不知道怎麼具體運用,只能知道大概的程序編譯過程, 如果你想可以自己也能寫出詞法分析器語法分析器 甚至語義分析 那麼 你最重要的是學好數據結構,我的畢業設計是C語言編譯器 剛開始我覺得自動機什麼的 是難點 可是到後來我才發現 最重要的是要有良好的數據結構的運用能力 數據結構是一切程序的靈魂!沒有合理的存儲結構 程序就像沒有根基的浮萍
㈣ 如何學習編譯原理
編譯原理是本科計算機課程中最難的一門了,因為它實在是太抽象了,而且學過之後很容易忘記,但是它又是非常重要的一門課程,起到了承上啟下的作用。
學習編譯原理,不要死看課本,課本都是翻譯國外的,讀起來有點吃力。結合習題是比較好的,可以理解一些概念。
另外,可以用lex和yacc實現一個詞法分析器和語法分析器,如果這兩個實驗跑通了,對你學習編譯原理的學習非常有幫助。
㈤ 編譯原理實驗求助
1)定義
所有token或者叫單詞的有限自動機。
2)將有限自動機用代碼實現。
3)寫分析程序,利用你定義的有限自動機來識別所有的「單詞」。並將識別出來的單詞的相關信息,如名稱,位置,類別等記錄在相關的數據結構中。
㈥ 編譯原理裡面的flex是什麼東西bison是什麼編譯原理裡面的實驗都是什麼
你說的兩個英文詞是詞法分析和語法分析程序的自動生成工具的軟體名稱。
這些工具的作用是將用正規式和產生式書寫的詞法和語法規則描述代碼轉換成完成分析功能的源程序。
編譯原理里的實驗有兩類,一類是學習使用上述的工具自動生成編譯分析程序,一類是自己手工編寫編譯分析程序。完成這些實驗,可幫助學習者對編譯過程有更多、更深入的了解。
㈦ 學習編譯原理之前需要學哪些知識
1.你要學到什麼水平?是想考試考好還是想實際寫出來一個足夠強度的編譯器?如果是前者,就一句:努力當學霸才是你唯一的出路。
2.對於scanner &parser的話,對於書上所講的演算法的要求是很高的,有很大的依賴性,所以必須理解透徹,即使沒有機會實現也要自己動手畫畫。同時這也是本科階段所學的編譯原理的所有內容。雖然flex和bison很好使,但是強烈不建議使用。
3.對於生成器、連接器或者解釋器的話,那麼你要了解匯編語言、微處理器、微機介面等計算機基礎學科。簡單的說就是從底層學到高級語言的層面。這個要求是很高的,畢竟涉及到二進制代碼優化等很麻煩的。
㈧ 學好「計算機編譯原理」需要具備其他一些知識么
1.你要學到什麼水平?是想考試考好還是想實際寫出來一個足夠強度的編譯器?如果是前者,就一句:努力當學霸才是你唯一的出路。
2.對於scanner &parser的話,對於書上所講的演算法的要求是很高的,有很大的依賴性,所以必須理解透徹,即使沒有機會實現也要自己動手畫畫。同時這也是本科階段所學的編譯原理的所有內容。雖然flex和bison很好使,但是強烈不建議使用。
3.對於生成器、連接器或者解釋器的話,那麼你要了解匯編語言、微處理器、微機介面等計算機基礎學科。簡單的說就是從底層學到高級語言的層面。這個要求是很高的,畢竟涉及到二進制代碼優化等很麻煩的。