導航:首頁 > 源碼編譯 > 編譯原理實驗報告pl0

編譯原理實驗報告pl0

發布時間:2022-02-24 16:18:45

① 0513《編譯原理》作業要求 設計並實現TINYC語言的掃描程序;

你的作業還在不在,能否借我一用,酬謝

② 編譯原理詞法分析 Cannot open include file: 'pl0.h'為什麼

pl0..h
頭文件
位置不對,建議放在cpp同目錄下,你們一般都是從網上拷貝下來的。若用VC++03.net新建工程,添加.cpp和.h即可。

③ 編譯原理 詞法分析 C 版 老師要求由編譯原理課後PL0完整源代碼改編

用LEX和YACC可以自動生成詞法分析和語法分析。
你要分析什麼語法,沒有明確講啊。

④ 一個編譯原理的課程設計,急急急

回答:alkaid_pku
學長
4月14日 06:31 1. 預處理
2. 編譯
3. 匯編
4. 查找庫函數
5. 連接

⑤ 編譯原理PL/0如何將

1、分析原來的IF語句的BNF
<條件語句>::=IF <條件>THEN <語句>

和擴展後的IF語句的BNF

<條件語句>::=IF <條件>THEN <語句>[ELSE <語句>]

在原有的程序上把if----then 擴展為if then else(不是改程序里的if then,而是實現能分析if then else,原有的只能分析if then)

2、pl0的一維數組擴充
分析BNF
<數組變數聲明>::=<標識符> ( <下界>: <上界>)

<數組變數引用>::= <標識符> ( <表達式> )

在實現上的要求

找到應該修改的地方,進行修改和擴充

⑥ 編譯原理PL0c程序運行文件內容時崩潰什麼原因

這種情況是因為程序源碼本身沒有語法錯誤之類的,所以可以編譯通過,但在邏輯上卻有錯誤,導致錯誤,比如內存讀寫錯。舉個例子,如果用scanf("%d",&a);時寫成scanf("%d",a);,編譯時並不會報錯,但運行時卻會因為讀了a的值指向的沒有許可權讀寫的...

⑦ 編譯原理實踐:小型編譯器實現。帶程序設計實驗報告。 謝謝啊。 郵箱:[email protected]!!

11嬸。。。

⑧ 編譯原理詞法分析 Cannot open include file: 'pl0.h'為什麼

pl0..h頭文件位置不對,建議放在cpp同目錄下,你們一般都是從網上拷貝下來的。若用VC++03.net新建工程,添加.cpp和.h即可。

⑨ 編譯原理實驗報告

#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");
}

}

閱讀全文

與編譯原理實驗報告pl0相關的資料

熱點內容
江陰變頻空氣壓縮機品牌 瀏覽:906
家用閑置電腦如何改造為伺服器 瀏覽:402
作業幫加密碼 瀏覽:454
手機怎麼沒有伺服器 瀏覽:67
swift編程軟體 瀏覽:752
php中pathinfo是什麼 瀏覽:71
tsp演算法源代碼 瀏覽:551
程序員鎖死一個游戲 瀏覽:194
小程序免費源碼網站 瀏覽:632
android獲取路由器mac地址 瀏覽:775
單片機龍芯 瀏覽:493
伺服器誤刪文件怎麼找 瀏覽:33
雲伺服器查看mac地址 瀏覽:106
火車高鐵時間下載什麼app 瀏覽:660
專業程序員自學 瀏覽:290
瑞達app干什麼用的 瀏覽:952
ug補異形孔命令 瀏覽:119
加密卡手機復制不了 瀏覽:543
三坐標如何編程 瀏覽:36
unix高級環境編程第三版pdf 瀏覽:404