資源簡介
選擇部分C語言的語法成分(可參考附錄C.5)或選擇附錄C.3的簡單語言,采用遞歸下降的語法制導翻譯技術,設計一個一遍掃描的詞法語法語義分析程序。
注意與實驗1、2的銜接。
?內容:設計并實現一個一遍掃描的詞法語法語義分析程序,將多條簡單賦值語句翻譯成后綴式或三地址代碼,要求有一定的出錯提示和錯誤恢復功能。
實驗報告內容要求:要給出所分析簡單語言語法結構的詞法說明、上下文無關文法描述,單詞的種別編碼方案,詞法分析程序的主要算法思想,以及所采用的語法語義分析方法的算法思想的詳細描述,測試結果與分析,實驗總結等。

代碼片段和文件信息
#include?
#include?
#include?
#define?_KEY_WORD_END?“waiting?for?your?expanding“
typedef?struct
{
int?typenum;
char?*?word;
}WORD;
struct?
{
char?result[8];
char?agl[8];
char?op[8];
char?ag2[8];
}quad[20];
char?input[255];
char?token[255]=““;
int?p_input;
int?p_token;
char?ch;
char?*rwtab[]={“begin““if““then““while““do““end“_KEY_WORD_END};
WORD?*?scaner();
int?syn;
int?kk=0;
int?k=0;
int?sum=0;
WORD?*?oneword=new?WORD;
char*?expression();
void?lrparser();
char*?factor();
char?*newtemp();
void?emit(char?*resultchar?*ag1char?*opchar?*ag2);
/*void?main()
{
int?over=1;
//WORD?*?oneword=new?WORD;
printf(“ENTER?Your?words(end?with?#):“);
scanf(“%[^#]s“input);
p_input=0;
//printf(“Your?words:\n%s\n“input);
/*while(over<1000&&over!=-1)
{
oneword=?scaner();
if(oneword->typenum<999)
printf(“(%d%s)“oneword->typenumoneword->word);
over=oneword->typenum;
}
oneword=scaner();
syn=oneword->typenum;
lrparser();
// printf(“\npress?#?to?exit:“);
// scanf(“%[^#]s“input);
}
*/
void?main()
{
int?over=1;
//WORD?*?oneword=new?WORD;
printf(“ENTER?Your?words(end?with?#):“);
scanf(“%[^#]s“input);
p_input=0;
oneword=scaner();
syn=oneword->typenum;
lrparser();
}
char?m_getch()
{
ch=input[p_input];
p_input=p_input+1;
return(ch);
}
void?getbc()
{
while(ch==‘?‘||ch==10)
{
ch=input[p_input];
p_input=p_input+1;
}
}
void?concat()
{
token[p_token]=ch;
p_token=p_token+1;
token[p_token]=‘\0‘;
}
int?letter()
{
if(ch>=‘a‘&&ch<=‘z‘||ch>=‘A‘&&ch<=‘Z‘)?return?1;
else?return?0;
}
int?digit()
{
if(ch>=‘0‘&&ch<=‘9‘)?return?1;
else?return?0;
}
int?reserve()
{
int?i=0;
while(strcmp(rwtab[i]_KEY_WORD_END))
{
if(!strcmp(rwtab[i]token))
{
return?i+1;
}
i=i+1;
}
return?10;
}
void?retract()
{
p_input?=p_input-1;
}
//數字轉換二進制
char?*?dtb()
{
return?NULL;
}
WORD?*scaner()
{
WORD?*myword=new?WORD;
myword->typenum=10;
myword->word=““;
p_token=0;
m_getch();
getbc();
if(letter())
{
while(letter()||digit())
{
concat();
m_getch();
}
retract();
myword->typenum=reserve();
myword->word=token;
return(myword);
}
else
if(digit())
{
while(digit())
{
concat();
m_getch();
}
retract();
myword->typenum=11;
myword->word=token;
return(myword);
}
else?switch(ch)
{
case?‘=‘:m_getch();
if(ch==‘=‘)
{
myword->typenum=39;
myword->word=“==“;
return(myword);
}
retract();
myword->typenum=25;
myword->word=“=“;
return(myword);
break;
case?‘+‘:
myword->typenum=13;
myword->word=“+“;
return(myword);
break;
case?‘-‘:
myword->typenum=14;
myword->word=“-“;
return(myword);
break;
case?‘*‘:
myword->typenum=15;
myword->word=“*“;
return(myword);
?屬性????????????大小?????日期????時間???名稱
-----------?---------??----------?-----??----
?????文件???????8778??2014-05-10?02:10??編譯原理-語義分析\C3.cpp
?????文件?????200758??2014-05-10?13:04??編譯原理-語義分析\C3.exe
?????文件????????171??2014-05-10?13:48??編譯原理-語義分析\測試數據.txt
?????文件??????68608??2014-05-10?13:37??編譯原理-語義分析\測試文件.doc
?????文件??????81920??2014-05-10?13:36??編譯原理-語義分析\程序運行說明文件.doc
?????目錄??????????0??2014-05-11?16:46??編譯原理-語義分析
-----------?---------??----------?-----??----
???????????????360235????????????????????6
- 上一篇:MTK 源碼分析中文版
- 下一篇:C++麻將胡牌算法
評論
共有 條評論