编译原理实验报告.docx
- 文档编号:8622380
- 上传时间:2023-02-01
- 格式:DOCX
- 页数:5
- 大小:35.19KB
编译原理实验报告.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;i if(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语言直接编写此法分析程序。 体会到多动手写程序的必要性
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译 原理 实验 报告