编译原理上机实验报告1.docx
《编译原理上机实验报告1.docx》由会员分享,可在线阅读,更多相关《编译原理上机实验报告1.docx(22页珍藏版)》请在冰豆网上搜索。
编译原理上机实验报告1
编译技术上机实验题目
实验一
一、题目
编制C语言子集的词法分析程序
二、目的
通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
三、要求
1.根据具体情况,由同学们自己选取C语言的一个适当大小的子集(可取一类典型单词,也可以尽可能使各种类型的单词都兼顾到),如课本表2.1;在上机前一定要制出相应的表。
2.程序功能
输入:
字符串。
输出:
二元式(种别编码,单词自身)构成的序列。
举例:
输入:
a=$;#
输出:
(6,a)
(12,=)
FOUNDERROR
(13,;)
#include
#include
usingnamespacestd;
stringkey[6]={"begin","if","then","while","do","end"};//关键字
boolisKey(stringstr,int&syn)//判断是否为关键字,若是传回相应关键码的种别名
{
inti;
for(i=0;i<6;i++)
{
if(str==key)
{
syn=i+1;
returntrue;
}
}
returnfalse;
}
boolisLetter(charc)//是否为字母
{
if((c>='A'&&c<='Z')||(c>='a'&&c<='z'))
returntrue;
else
returnfalse;
}
boolisDigit(charc)//是否为数字
{
if(c>='0'&&c<='9')
returntrue;
else
returnfalse;
}
voidanalyse(FILE*fileP)
{
intn;
charc;
stringstr="";
while((c=fgetc(fileP))!
=EOF)
{
if(c==''||c=='\n'||c=='\t')
continue;
elseif(isDigit(c))//数字
{
while(isDigit(c))
{
str+=c;
c=fgetc(fileP);
}
fseek(fileP,-1,SEEK_CUR);
cout<<"(11,"< str="";
}
elseif(isLetter(c))//字母开头的
{
while(isDigit(c)||isLetter(c))
{
str+=c;
c=fgetc(fileP);
}
fseek(fileP,-1,SEEK_CUR);
if(isKey(str,n))
cout<<"("< else
cout<<"(10,"<<"\'"< str="";
}
else//操作符等
{
switch(c)
{
case'+':
cout<<"(13,+)"< break;
case'-':
cout<<"(14,-)"< break;
case'*':
cout<<"(15,*)"< break;
case'/':
cout<<"(16,/)"< break;
case':
':
{
if(c=fgetc(fileP)=='=')
cout<<"(18,:
=)"< else
{
cout<<"(17, 编译技术上机实验题目
实验一
一、题目
编制C语言子集的词法分析程序
二、目的
通过设计、编制、调试一个具体的词法分析程序,加深对词法分析原理的理解,并掌握在对程序设计语言源程序进行扫描过程中将其分解为各类单词的词法分析方法。
三、要求
1.根据具体情况,由同学们自己选取C语言的一个适当大小的子集(可取一类典型单词,也可以尽可能使各种类型的单词都兼顾到),如课本表2.1;在上机前一定要制出相应的表。
2.程序功能
输入:
字符串。
输出:
二元式(种别编码,单词自身)构成的序列。
举例:
输入:
a=$;#
输出:
(6,a)
(12,=)
FOUNDERROR
(13,;)
#include
#include
usingnamespacestd;
stringkey[6]={"begin","if","then","while","do","end"};//关键字
boolisKey(stringstr,int&syn)//判断是否为关键字,若是传回相应关键码的种别名
{
inti;
for(i=0;i<6;i++)
{
if(str==key)
{
syn=i+1;
returntrue;
}
}
returnfalse;
}
boolisLetter(charc)//是否为字母
{
if((c>='A'&&c<='Z')||(c>='a'&&c<='z'))
returntrue;
else
returnfalse;
}
boolisDigit(charc)//是否为数字
{
if(c>='0'&&c<='9')
returntrue;
else
returnfalse;
}
voidanalyse(FILE*fileP)
{
intn;
charc;
stringstr="";
while((c=fgetc(fileP))!
=EOF)
{
if(c==''||c=='\n'||c=='\t')
continue;
elseif(isDigit(c))//数字
{
while(isDigit(c))
{
str+=c;
c=fgetc(fileP);
}
fseek(fileP,-1,SEEK_CUR);
cout<<"(11,"<str="";
}
elseif(isLetter(c))//字母开头的
{
while(isDigit(c)||isLetter(c))
{
str+=c;
c=fgetc(fileP);
}
fseek(fileP,-1,SEEK_CUR);
if(isKey(str,n))
cout<<"("<else
cout<<"(10,"<<"\'"<str="";
}
else//操作符等
{
switch(c)
{
case'+':
cout<<"(13,+)"<break;
case'-':
cout<<"(14,-)"<break;
case'*':
cout<<"(15,*)"<break;
case'/':
cout<<"(16,/)"<break;
case':
':
{
if(c=fgetc(fileP)=='=')
cout<<"(18,:
=)"<else
{
cout<<"(17,"<fseek(fileP,-1,SEEK_CUR);
}
break;
}
case'<':
{
c=fgetc(fileP);
if(c=='=')
cout<<"(22,<=)"<elseif(c=='>')
cout<<"(21,<>)"<else
{
cout<<"(20,<)"<fseek(fileP,-1,SEEK_CUR);
}
break;
}
case'>':
{
c=fgetc(fileP);
if(c=='=')
cout<<"(24,>=)"<else
{
cout<<"(23,>)"<fseek(fileP,-1,SEEK_CUR);
}
break;
}
case'=':
cout<<"(25,=)"<break;
case';':
cout<<"(26,;)"<break;
case'(':
cout<<"(27,()"<break;
case')':
cout<<"(28,))"<break;
case'#':
cout<<"(0,#)"<break;
default:
cout<<"FOUNDERROR!
"<}
}
}
}
intmain()
{
FILE*fileP;
fileP=fopen("test.txt","r");
cout<<"------词法分析如下------"<analyse(fileP);
return0;
}
实验二
/*
一、题目
编制递归下降法的语法分析程序
二、目的
通过设计、编制、调试一个典型的语法分析程序,能识别由加+、乘*、括号()、操作数所组成的算术表达式,其文法如下:
E→TE'
E'→+TE'∣ε
T→FT'
T'→*FT'∣ε
F→(E)∣i
三、要求
1.程序功能(举例)
输入:
#i1*(i2+i3)#
输出:
SUCCESS
输入:
#i1*(i2+i3#
输出:
FOUNDERROR
*/
实验代码:
#include
#include
usingnamespacestd;
FILE*fileP;
chara[100];
voidEe();
voidT();
voidTt();
voidF();
voidE();
inti=0;
intj=0;
intflag=0;
boolisLetter(charc)//是否为字母
{
if((c>='A'&&c<='Z')||(c>='a'&&c<='z'))
returntrue;
else
returnfalse;
}
boolisDigit(charc)//是否为数字
{
if(c>='0'&&c<='9')
returntrue;
else
returnfalse;
}
voidread()
{
if(fgetc(fileP)=='#')
{
charc=fgetc(fileP);
while(c!
='#')
{
a[j++]=c;
c=fgetc(fileP);
}
}
}
voidE()
{
T();
Ee();
}
voidEe()
{
if(a=='+')
{
i++;
T();
Ee();
}
}
voidT()
{
F();
Tt();
}
voidTt()
{
if(a=='*')
{
i++;
F();
Tt();
}
}
voidF()
{
charc=a;
if(isLetter(c))
{
while(isDigit(c)||isLetter(c))
{
i++;
c=a;
}
}
elseif(isDigit(c))
{
while(isDigit(c))
{
i++;
c=a;
}
}
elseif(c=='(')
{
i++;
E();
if(a==')')
{
}
else
flag=1;
}
else
flag=1;
}
voidmain()
{
if((fileP=fopen("test.txt","r"))==NULL)
{
cout<<"请创建test.txt资源文件"<}
else
{
read();
cout<<"------test文件词法分析结果如下------"<E();
if(flag==0)
cout<<"success"<else
cout<<"faild"<cout<<"----------------------------"<}
if((fileP=fopen("test.txt","r"))==NULL)
{
cout<<"请创建test2.txt资源文件"<}
else
{
read();
cout<<"------test2文件词法分析结果如下------"<E();
if(flag==0)
cout<<"success"<else
cout<<"faild"<cout<<"----------------------------"<}
}
请自行新建test.txt
"< fseek(fileP,-1,SEEK_CUR);
}
break;
}
case'<':
{
c=fgetc(fileP);
if(c=='=')
cout<<"(22,<=)"< elseif(c=='>')
cout<<"(21,<>)"< else
{
cout<<"(20,<)"< fseek(fileP,-1,SEEK_CUR);
}
break;
}
case'>':
{
c=fgetc(fileP);
if(c=='=')
cout<<"(24,>=)"< else
{
cout<<"(23,>)"< fseek(fileP,-1,SEEK_CUR);
}
break;
}
case'=':
cout<<"(25,=)"< break;
case';':
cout<<"(26,;)"< break;
case'(':
cout<<"(27,()"< break;
cas