資源簡介
附錄c 編譯程序實驗
實驗目的:用c語言對一個簡單語言的子集編制一個一遍掃描的編譯程序,以加深對編譯原理的理解,掌握編譯程序的實現方法和技術。
語法分析
C2.1 實驗目的
編制一個遞歸下降分析程序,實現對詞法分析程序所提供的單詞序列的語法檢查和結構分析.
C2.2 實驗要求
利用C語言編制遞歸下降分析程序,并對簡單語言進行語法分析.
C2.2.1待分析的簡單語言的語法
實驗目的
通過上機實習,加深對語法制導翻譯原理的理解,掌握將語法分析所識別的語法成分變換為中間代碼的語義翻譯方法.
實驗要求
采用遞歸下降語法制導翻譯法,對算術表達式、賦值語句進行語義分析并生成四元式序列。
實驗的輸入和輸出
輸入是語法分析提供的正確的單詞串,輸出為三地址指令形式的四元式序列。
例如:對于語句串
begin a:=2+3*4;x:=(a+b)/c end#
輸出的三地址指令如下:
(1) t1=3*4
(2) t2=2+t1
(3) a=t2
(4) t3=a+b
(5) t4=t3/c
(6) x=t4
算法思想
1設置語義過程
(1) emit(char *result,char *arg1,char *op,char *ag2)
該函數功能是生成一個三地址語句送到四元式表中。
四元式表的結構如下:
struct {char result[8];
char ag1[8];
char op[8];
char ag2[8];
}quad[20];
(2)char *newtemp()
該函數回送一個新的臨時變量名,臨時變量名產生的順序為T1,T2,….
Char *newtemp(void)
{
char *p;
char m[8];
p=(char *)malloc(8);
k++;
itoa(k,m,10);
strcpy(p+1,m);
p[0]=’t’;
return(p);
}
(2)主程序示意圖如圖c.10所示。
(2) 函數lrparser在原來語法分析的基礎上插入相應的語義動作:將輸入串翻譯成四元式序列。在實驗中我們只對表達式、賦值語句進行翻譯。
語義分析程序的C語言程序框架
int lrparser()
{ int schain=0;
kk=0;
if(syn=1)
{ 讀下一個單詞符號;
schain=yucu; /調用語句串分析函數進行分析/
if(syn=6)
{ 讀下一個單詞符號;
if(syn=0 && (kk==0))
輸出(“success”);
}
else { if(kk!=1 ) 輸出 ‘缺end’ 錯誤;kk=1;}
else{輸出’begin’錯誤;kk=1;}
}
return(schain);
int yucu()
{ int schain=0;
schain=statement();/調用語句分析函數進行分析/
while(syn=26)
{讀下一個單詞符號;
schain=statement(); /調用語句分析函數進行分析/
}
return(schain);
}
int statement()
{ char tt[8],eplace[8];
int schain=0;
{switch(syn)
{case 10:
strcpy(tt,token);
scanner();
if(syn=18)
{讀下一個單詞符號;
strcpy(eplace,expression());
emit(tt,eplace,””,””);
schain=0;
}
else {輸出’缺少賦值號’的錯誤;kk=1;
}
return(schain);
break;
}
}
char *expression(void)
{char *tp,*ep2,*eplace,*tt;
tp=(char *)malloc(12);/分配空間/
ep2=(char *)malloc(12);
eplace=(char *)malloc(12);
tt =(char )malloc(12);
strcpy(eplace,term ());/調用term分析產生表達式計算的第一項eplace/
while(syn=13 or 14)
{ 操作符 tt= ‘+’或者‘—’;
讀下一個單詞符號;
strcpy(ep2,term());/調用term分析產生表達式計算的第二項ep2/
strcpy(tp,newtemp());/調用newtemp產生臨時變量tp存儲計算結果/
emit(tp,eplace,tt,ep2);/生成四元式送入四元式表/
strcpy(eplace,tp);
}
return(eplace);
}
char *term(void)/仿照函數expression編寫/
char *factor
代碼片段和文件信息
#include??
#include??
char?prog[80]token[8];?
char?ch;?
int?synpmnsum;?
char?*rwtab[6]={“begin““if““then““while““do““end“};?
void?scaner();?
void?main(){?
p=0;?
printf(“\n?please?input?string;\n“);?
do?{?
scanf(“%c“&ch);?
prog[p++]?=?ch;?
}while?(ch!=‘#‘);?
p=0;?
do{?
scaner();?
switch(syn)?{?
case?11:?printf?(“(syn%d)\n“sum);?break;?
case?-1:printf(“error!\n“);break;?
default:printf(“(%d%s)\n“syntoken);?
}?
}while?(syn!=0);?
}?
void?scaner(){?
for(n=0;n<8;n++)?token[n]=NULL;?
ch?=?prog[p++];?
while(ch==‘?‘)?
ch?=?prog[p++];?
if(ch>=‘a‘&&ch<=‘z‘){?
m?=?0;?
while((ch>=‘a‘&&ch<=‘z‘)||(ch>=‘0‘&&ch<=‘9‘)){?
token[m++]?=?ch;?
ch?=?prog[p++];?
}?
token[m++]=‘\0‘;?
--p;?
syn=10;?
for?(n=0;n<6;n++)?
if(strcmp(tokenrwtab[n])==0){?
syn?=?n+1;?
break;?
}?
}?
else?
if(ch>=‘0‘&&ch<=‘9‘){?
while?(ch>=‘0‘&&ch<=‘9‘){?
sum=sum*10+ch-‘0‘;?
ch?=?prog[p++];?
}?
--p;?
syn=11;?
}?
else?
switch(ch){?
case‘<‘:?
m=0;token[m++]=ch;?
ch?=?prog[p++];?
if(ch==‘>‘){?
syn=21;?
token[m++]=ch;?
}?
else?
if?(ch==‘=‘){?
syn=22;?
token[m++]=ch;?
}?
else{?
syn=20;?
--p;?
}?
break;?
case‘>‘:?
token[m++]?=?ch;?
ch?=?prog[p++];?
if(ch==‘=‘){?
syn?=?24;?
token[m++]?=?ch;?
}?
else?{?
syn?=?23;?
--p;?
}?
break;?
case‘:‘:?
token[m++]?=?ch;?
ch?=?prog[p++];?
if(ch==‘=‘){?
syn?=?18;?
token[m++]?=?ch;?
}?
else?{?
syn?=?17;?
--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;?
}?
}
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????1844??2008-10-27?21:44??編譯原理\詞法分析實驗\1_2\1_2.cpp
?????文件???????3365??2008-10-28?14:20??編譯原理\詞法分析實驗\1_2\1_2.dsp
?????文件????????514??2008-10-28?15:14??編譯原理\詞法分析實驗\1_2\1_2.dsw
?????文件??????41984??2008-10-28?15:14??編譯原理\詞法分析實驗\1_2\1_2.ncb
?????文件??????48640??2008-10-28?15:14??編譯原理\詞法分析實驗\1_2\1_2.opt
?????文件???????1095??2008-10-27?23:31??編譯原理\詞法分析實驗\1_2\1_2.plg
?????文件?????167982??2008-10-27?23:31??編譯原理\詞法分析實驗\1_2\Debug\1_2.exe
?????文件?????186736??2008-10-27?23:31??編譯原理\詞法分析實驗\1_2\Debug\1_2.ilk
?????文件???????9620??2008-10-27?23:31??編譯原理\詞法分析實驗\1_2\Debug\1_2.obj
?????文件?????186924??2008-10-27?23:27??編譯原理\詞法分析實驗\1_2\Debug\1_2.pch
?????文件?????427008??2008-10-27?23:31??編譯原理\詞法分析實驗\1_2\Debug\1_2.pdb
?????文件??????33792??2008-10-28?14:20??編譯原理\詞法分析實驗\1_2\Debug\vc60.idb
?????文件??????45056??2008-10-27?23:31??編譯原理\詞法分析實驗\1_2\Debug\vc60.pdb
????..A..H.???????162??2008-10-27?20:32??編譯原理\詞法分析實驗\~$實驗設計模板.doc
?????文件??????36864??2007-07-25?19:42??編譯原理\詞法分析實驗\詞法分析.doc
?????文件??????60928??2008-10-28?10:58??編譯原理\詞法分析實驗\詞法分析實驗報告.doc
?????文件???????4673??2008-12-14?22:33??編譯原理\語義分析\3_1\1.cpp
?????文件???????3346??2008-12-14?22:42??編譯原理\語義分析\3_1\1.dsp
?????文件????????527??2008-12-14?22:42??編譯原理\語義分析\3_1\1.dsw
?????文件??????33792??2008-12-14?22:42??編譯原理\語義分析\3_1\1.ncb
?????文件??????48640??2008-12-14?22:42??編譯原理\語義分析\3_1\1.opt
?????文件???????1622??2008-12-14?22:41??編譯原理\語義分析\3_1\1.plg
?????文件??????98370??2008-12-14?22:41??編譯原理\語義分析\3_1\Debug\1.exe
?????文件??????51616??2008-12-14?22:41??編譯原理\語義分析\3_1\Debug\1.ilk
?????文件??????19088??2008-12-14?22:41??編譯原理\語義分析\3_1\Debug\1.obj
?????文件?????222996??2008-12-14?22:41??編譯原理\語義分析\3_1\Debug\1.pch
?????文件?????558080??2008-12-14?22:41??編譯原理\語義分析\3_1\Debug\1.pdb
?????文件??????33792??2008-12-14?22:41??編譯原理\語義分析\3_1\Debug\vc60.idb
?????文件??????45056??2008-12-14?22:41??編譯原理\語義分析\3_1\Debug\vc60.pdb
????..A.SH.??????7168??2008-12-14?21:03??編譯原理\語義分析\Thumbs.db
............此處省略40個文件信息
- 上一篇:C語言學生信息管理系統.rar
- 下一篇:簡單的鼠標繪圖程序C語言
評論
共有 條評論