编译原理实验报告 3.docx
- 文档编号:27885876
- 上传时间:2023-07-06
- 格式:DOCX
- 页数:30
- 大小:314.28KB
编译原理实验报告 3.docx
《编译原理实验报告 3.docx》由会员分享,可在线阅读,更多相关《编译原理实验报告 3.docx(30页珍藏版)》请在冰豆网上搜索。
编译原理实验报告3
计算机与信息学院
编译原理实验报告
专业班级
计算机科学与技术13-3
学生姓名及学号
吴晋文2013211698
课程教学班号
0002
任课教师
李宏芒
实验指导教师
李宏芒
实验地点
第二机房
2014~2015学年第二学期
实验一词法分析设计
一、实验功能:
1)从源程序文件中读入字符。
2)统计行数和列数用于错误单词的定位。
3)删除空格类字符,包括回车、制表符空格。
4)按拼写单词,并用(内码,属性)二元式表示。
(属性值——token的机内
表示)
5)如果发现错误则报告出错
6)根据需要是否填写标识符表供以后各阶段使用。
二、程序结构描述:
数组keywords存储关键字
数组optr存储算数运算符
数组separator存储分界符
函数IsKey判断是否是关键字,返回true或false
函数IsLetter判断是否是字母,返回true或false
函数IsDigit判断是否是数字,返回true或false
函数IsFloat判断是否是小数,返回true或false
函数IsOptr判断是否是算数运算符,返回true或false
函数IsSeparator判断是否是分界符,返回true或false
主函数:
数组记录表达式字符串,然后对表达式字符进行相应处理
主函数流程图:
词法分析子程序简化框图
实验总结:
词法分析器是编译的基础,是后续如语法分析的重要的前提,所以必须要掌握。
通过对词法分析器的编写,我对词法分析器有了更清楚的认识,知道了具体在实践中,词法分析器是什么,之间出现了很多错误,然后经过自己的修改,最后终于可以了,还是挺高兴的,虽然不能识别小数,还是通过自己的努力写出来了。
附录:
源程序
#include
#include
usingnamespacestd;
stringkeywords[8]={"do","end","for","if","printf","scanf","then","while"};
stringoptr[4]={"+","-","*","/"};
stringseparator[6]={",",";","{","}","(",")"};
boolIsKey(stringss){
inti;
for(i=0;i<8;i++)
if(!
strcmp(keywords[i].c_str(),ss.c_str()))
returntrue;
returnfalse;
}//判断是否为保留字
boolIsLetter(charc){
if(((c>='a')&&(c<='z'))||((c>='A')&&(c<='Z')))
returntrue;
returnfalse;
}//字母判断函数
boolIsDigit(charc){
if(c>='0'&&c<='9')
returntrue;
returnfalse;
}//数字判断函数
boolIsOptr(stringss){
inti;
for(i=0;i<4;i++)
if(!
strcmp(optr[i].c_str(),ss.c_str()))
returntrue;
returnfalse;
}//算术运算符判断函数
boolIsSeparator(stringss){
inti;
for(i=0;i<6;i++)
if(!
strcmp(separator[i].c_str(),ss.c_str()))
returntrue;
returnfalse;
}//分界符判断函数
intmain(){
chara;
intj,t=0;
charinstring[100];
for(j=0;j<100;j++)
instring[j]='\0';
inti=0;
do{
a=getchar();
instring[i++]=a;
}while(a!
='#');
//cout< intline=1,row=0; stringst=""; for(j=0;j<100;j++) { if((instring[j]=='')||(instring[j]=='\t')){}//空格,tab健 elseif(instring[j]=='\n'){line++;row=0;}//换行行数加一处理 elseif(IsLetter(instring[j])||instring[j]=='_')//关键字、标识符的处理 { st=""; row++; while(IsLetter(instring[j])||IsDigit(instring[j])||instring[j]=='_') { st+=instring[j]; j++; } if(IsKey(st))//判断是否为关键字查询关键字表; cout< else//否则为标示符 cout< j--; } elseif(IsDigit(instring[j]))//无符号整数处理 { st=""; row++; while(IsDigit(instring[j])) {st+=instring[j]; j++; } if(! (IsLetter(instring[j])||instring[j]=='_')) {cout< elseif(IsLetter(instring[j])||instring[j]=='_'){ while(IsLetter(instring[j])||IsDigit(instring[j])||instring[j]=='_') { st+=instring[j]; j++; } cout< } } else{ st=""; st+=instring[j]; if(IsOptr(st))//算术运算符处理 { row++; if(IsSeparator(st)||(instring[j+1]=='')||(instring[j+1]=='\t')||(instring[j+1]=='\n')||(instring[j+1]=='<')||(instring[j+1]=='=')||(instring[j+1]=='>')) cout< else { while(! (IsSeparator(st)||(instring[j+1]=='')||(instring[j+1]=='\t')||(instring[j+1]=='\n')||(instring[j+1]=='<')||(instring[j+1]=='=')||(instring[j+1]=='>'))) { if(instring[j]=='+'&&instring[j+1]=='+') {st+=instring[j+1]; cout< j++;} elseif(instring[j]=='-'&&instring[j+1]=='-') {st+=instring[j+1]; cout< j++;} else{ st+=instring[j+1]; cout< j++;} } //cout< } } elseif(IsSeparator(st))//分隔符处理 {row++; cout< } else{ switch(instring[j]){row++; case'=': {row++;cout<<"="<<"\t("<<"="<<","<<4<<")"<<'\t'<<"\t关系运算符"<<'\t'<<"("< case'>': {row++;j++; if(instring[j]=='=')cout<<">="<<'\t'<<"("<<">="<<","<<4<<")"<<'\t'<<"\t关系运算符"<<'\t'<<"("< else{cout<<">"<<"\t("<<">"<<","<<4<<")"<<'\t'<<"\t关系运算符"<<'\t'<<"("< case'<': {row++;j++; if(instring[j]=='=')cout<<"<="<<'\t'<<"("<<"="<<","<<4<<")"<<"\t关系运算符"<<'\t'<<"("< elseif(instring[j]=='>')cout<<"<>"<<'\t'<<"("<<"<>"<<","<<4<<")"<<'\t'<<"\t关系运算符"<<'\t'<<"("< else{cout<<"<"<<"\t("<<"<"<<","<<4<<")"<<"\t"<<"\t关系运算符"<<'\t'<<"("< }break; case'#': break; case'\0': break; default: {row++;cout< } } } } } } return0; } 实验二LL (1)分析法 一、实验原理: 1、写出LL (1)分析法的思想: 当一个文法满足LL (1)条件时,我们就可以为它构造一个不带回溯的自上而下的分析程序,这个分析程序是有一组递归过程组成的,每个过程对应文法的一个非终结符。 实现LL (1)分析的一种有效的方法是使用一张分析表和一个站进行联合控制。 预测分析表是一个M[A,a]形式的矩阵,存储着分析规则;栈STACK用于存放文法符号。 从栈顶取符号,按照分析表给出的规则进行有步骤的分析。 2.符合LL (1)分析法的文法: (1)E->TG (2)G->+TG|—TG (3)G->ε (4)T->FS (5)S->*FS|/FS (6)S->ε (7)F->(E) (8)F->i 二、程序结构描述: 模块结构: (1)定义部分: 定义常量、变量、数据结构。 (2)初始化: 设立LL (1)分析表、初始化变量空间(包括堆栈、结构体、数组、临时变量等); (3)控制部分: 从键盘输入一个表达式符号串; (4)利用LL (1)分析算法进行表达式处理: 根据LL (1)分析表对表达式符号串进行堆栈(或其他)操作,输出分析结果,如果遇到错误则显示错误信息。 程序各个部分的实现: 数组Vn[]存储非终结符数组; 数组Vt[]存储终结符数组; 数组A[]存放作为栈使用; 数组B[]存放分析串; LL (1)预测分析程序流程 三、实验总结: 通过对词LL (1)语法分析程序的编程,初步理解了语法分析器的作用,了解了语法分析器的功能,也初步掌握了语法分析器的原理和构造方法,语法分析是编译过程的核心部分,所以我们必须要掌握,否则我们就学不好编译原理。 通过对语法分析器的编写,加深了我对语法分析的理解和掌握,对我的编译原理的学习有很大的帮助。 同时,对我的程序开发能力也有了一定的提高。 虽然中间大部分代码都是copy网上代码,但是还是很庆幸自己看的懂 源程序: #include #include #include #include charA[20];/*分析栈*/ charB[20];/*剩余串*/ charv1[20]={'i','+','*','(',')','#'};/*终结符*/ charv2[20]={'E','G','T','S','F'};/*非终结符*/ intj=0,b=0,top=0,l;/*L为输入串长度*/ classtype/*产生式类型定义*/ {public: charorigin;/*大写字符*/ chararray[5];/*产生式右边字符*/ intlength;/*字符个数*/ }; typee,t,g,g1,s,s1,f,f1;/*类对象*/ typeC[10][10];/*预测分析表*/ voidprint()/*输出分析栈*/ { inta; for(a=0;a<=top+1;a++)
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 编译原理实验报告 编译 原理 实验 报告