编译原理实验报告.docx
《编译原理实验报告.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告.docx(5页珍藏版)》请在冰豆网上搜索。
编译原理实验报告
1、实验目的
通过本实验的编程实践,使学生了解词法分析的任务,掌握词法分析程序设计的原理和构造方法,使学生对编译的基本概念、原理和方法有完整的和清楚地理解,并能正确地、熟练地运用。
2、实验内容
要求能将用给定简单语言书写的源程序进行词法分析,通过输入源程序从左到右对字符串进行扫描和分解,依次输出各个单词的内部编码及单词符号自身值,即二元组;若遇到错误则显示“Error:
,同时输出错误单词在源程序中的行位置,即三元组;同时进行标识符登记符号表的管理。
(1)关键字
"begin","end","if","then","else","while","write","read",
"do","call","const","char","until","procedure","repeat"
(2)运算符:
"+","-","*","/","="
(3)界符:
"{","}","[","]",";",",",".","(",")",":
"
(4)其他标记如字符串,表示以字母开头的标识符。
(5)空格、回车、换行符跳过。
在屏幕上显示如下:
(1,无符号整数)
(begin,关键字)
(if,关键字)
(+,运算符)
(;,界符)
(a,普通标识符)
6.2程序调试
文件位置:
I:
bianyi.txt
目标程序如下:
Main()
{inta,b;
6;a;
b=b-1;
}
6.3运行结果
7、程序源代码
#include
#include
usingnamespacestd;
#defineMAX22
charch='';
stringkey[15]={"begin","end","if","then","else","while","write","read",
"do","call","const","char","until","procedure","repeat"};
intIskey(stringc){//关键字判断
inti;
for(i=0;iif(key[i].compare(c)==0)return1;
}
return0;
}
intIsLetter(charc){//判断是否为字母
if(((c<='z')&&(c>='a'))||((c<='Z')&&(c>='A')))return1;
elsereturn0;
}
intIsDigit(charc){//判断是否为数字
if(c>='0'&&c<='9')return1;
elsereturn0;
}
voidanalyse(FILE*fpin){
stringarr="";
while((ch=fgetc(fpin))!
=EOF){
arr="";
if(ch==''||ch=='\t'||ch=='\n'){}
elseif(IsLetter(ch)){
while(IsLetter(ch)||IsDigit(ch)){
if((ch<='Z')&&(ch>='A'))ch=ch+32;
arr=arr+ch;
ch=fgetc(fpin);
}
fseek(fpin,-1L,SEEK_CUR);
if(Iskey(arr)){cout<elsecout<}
elseif(IsDigit(ch)){
while(IsDigit(ch)||ch=='.'&&IsDigit(fgetc(fpin))){
arr=arr+ch;
ch=fgetc(fpin);
}
fseek(fpin,-1L,SEEK_CUR);
cout<}
elseswitch(ch){
case'+':
case'-':
case'*':
case'=':
case'/':
cout<case'(':
case')':
case'[':
case']':
case';':
case'.':
case',':
case'{':
case'}':
cout<case':
':
{ch=fgetc(fpin);
if(ch=='=')cout<<":
="<<"\t$运算符"<else{cout<<"="<<"\t$运算符"<fseek(fpin,-1L,SEEK_CUR);}
}break;
case'>':
{ch=fgetc(fpin);
if(ch=='=')cout<<">="<<"\t$运算符"<if(ch=='>')cout<<">>"<<"\t$输入控制符"<else{cout<<">"<<"\t$运算符"<fseek(fpin,-1L,SEEK_CUR);}
}break;
case'<':
{ch=fgetc(fpin);
if(ch=='=')cout<<"<="<<"\t$运算符"<elseif(ch=='<')cout<<"<<"<<"\t$输出控制符"<elseif(ch=='>')cout<<"<>"<<"\t$运算符"<else{cout<<"<"<<"\t$运算符"<fseek(fpin,-1L,SEEK_CUR);}
}break;
default:
cout<}
}
}
voidmain(){
charin_fn[30];
FILE*fpin;
cout<<"请输入源文件名(包括路径和后缀名):
";
for(;;){
cin>>in_fn;
if((fpin=fopen(in_fn,"r"))!
=NULL)break;
elsecout<<"文件路径错误!
请输入源文件名(包括路径和后缀名):
";
}
cout<<"\n********************分析如下*********************"<analyse(fpin);
fclose(fpin);
}
八、实验心得
此次实验,我增长了调试程序的经验,明白了书写程序的良好习惯,进一步了解了如何去编写一个词法分析程序,加深对词法分析原理的理解;熟悉了构造词法分析程序的相关原理,并使用C语言直接编写此法分析程序。
体会到多动手写程序的必要性