欢迎来到三一办公! | 帮助中心 三一办公31ppt.com(应用文档模板下载平台)
三一办公
全部分类
  • 办公文档>
  • PPT模板>
  • 建筑/施工/环境>
  • 毕业设计>
  • 工程图纸>
  • 教育教学>
  • 素材源码>
  • 生活休闲>
  • 临时分类>
  • ImageVerifierCode 换一换
    首页 三一办公 > 资源分类 > DOC文档下载  

    编译原理词法分析程序实现实验报告.doc

    • 资源ID:2396938       资源大小:489KB        全文页数:50页
    • 资源格式: DOC        下载积分:8金币
    快捷下载 游客一键下载
    会员登录下载
    三方登录下载: 微信开放平台登录 QQ登录  
    下载资源需要8金币
    邮箱/手机:
    温馨提示:
    用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)
    支付方式: 支付宝    微信支付   
    验证码:   换一换

    加入VIP免费专享
     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    编译原理词法分析程序实现实验报告.doc

    实验一 词法分析程序实现一、实验内容选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来。输入:由无符号数和+,*,/, ( , ) 构成的算术表达式,如1.5E+2100。输出:对识别出的每一单词均单行输出其类别码(无符号数的值暂不要求计算)。二、 设计部分因为需要选取无符号数的算术四则运算中的各类单词为识别对象,要求将其中的各个单词识别出来,而其中的关键则为无符号数的识别,它不仅包括了一般情况下的整数和小数,还有以E为底数的指数运算,其中关于词法分析的无符号数的识别过程流程图如下:GOTO 1:GOTO 2:三、 源程序代码部分#include <stdio.h>#include<stdlib.h>#include <math.h>#define MAX 100#define UNSIGNEDNUMBER 1#define PLUS 2#define SUBTRACT 3#define MULTIPLY 4#define DIVIDE 5#define LEFTBRACKET 6#define RIGHTBRACKET 7#define INEFFICACIOUSLABEL 8#define FINISH 111int count=0;int Class;void StoreType();int Type100;char Store20='0'void ShowStrFile();/已经将要识别的字符串存在文件a中void Output(int a,char *p1,char *p2);/字符的输出过程int Sign(char *p);/'+''-''*''/'整体识别过程int UnsignedNum(char *p);/是否适合合法的正整数09int LegalCharacter(char *p);/是否是合法的字符:Sign(p)|UnsignedNum(p)|'E'|'.'void DistinguishSign(char *p);/'+''-''*''/'具体识别过程void TypyDistinguish();/字符的识别过程void ShowType();/将类别码存储在Type100中,为语法分析做准备void ShowStrFile()/已经将要识别的字符串存在文件a中FILE *fp_s;char ch;if(fp_s=fopen("a.txt","r")=NULL)printf("The FILE cannot open!"); exit(0);elsech=fgetc(fp_s);while(ch!=EOF)putchar(ch);ch=fgetc(fp_s);printf("n");void StoreStr()/将文件中的字符串存储到数组Storei FILE *fp=fopen("a.txt","r");char str;int i=0;while(!feof(fp)fscanf(fp,"%c",&str);if(str='?')Storei='0'break;Storei=str;i+;Storei='0'void ShowStore()int i;for (i=0;Storei!='0'i+) printf("%c",Storei);printf("n");void Output(int a,char *p1,char *p2) printf("%3st%dt%st","CLASS",a,"VALUE");while(p1<=p2)printf("%c",*p1);p1+;printf("n");int Sign(char *p)char ch=*p;if(ch='+'|ch='-'|ch='*'|ch='/'|ch='('|ch=')')return 1;elsereturn 0;int UnsignedNum(char *p)char ch=*p;if('0'<=ch&&ch<='9')return 1;elsereturn 0;int LegalCharacter(char *p)char ch=*p;if(Sign(p)|UnsignedNum(p)|ch='E'|ch='.')return 1;else return 0;void DistinguishSign(char *p) int Class;char ch=*p;switch(ch) case '+': Output(PLUS,p,p);Typecount+=PLUS;break; case '-': Output(SUBTRACT,p,p);Typecount+=SUBTRACT;break; case '*': Output(MULTIPLY,p,p);Typecount+=MULTIPLY;break; case '/': Output(DIVIDE,p,p);Typecount+=DIVIDE;break; case '(': Output(LEFTBRACKET,p,p);Typecount+=LEFTBRACKET;break; case ')': Output(RIGHTBRACKET,p,p);Typecount+=RIGHTBRACKET;break; default: break; void TypyDistinguish() printf("词法开始,分析结果如下:n"); char *p; p=&Store0; while(*p!='0') if(Sign(p) DistinguishSign(p+); continue; else if(UnsignedNum(p)|*p='.') char *p1=p;if(UnsignedNum(p)while(UnsignedNum(p)p+;if(*p='0') Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUMBER;p+;continue;else if(*p='E')p+;if(UnsignedNum(p)while(UnsignedNum(p)p+;Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUMBER;p+;continue;else if(*p='+'|*p='-')p+;while(UnsignedNum(p)p+;Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUMBER;p+;continue;else Output(INEFFICACIOUSLABEL,p1,-p);printf("输入的这个符号是不合法的!");break;Typecount+=INEFFICACIOUSLABEL;p+;continue;else if(*p='.')p+;while(UnsignedNum(p)p+;if(*p='0') Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUMBER;p+;continue;else if(*p='E')p+;if(UnsignedNum(p)while(UnsignedNum(p)p+;Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUMBER;p+;continue;else if(*p='+'|*p='-')p+;if(UnsignedNum(p)while(UnsignedNum(p)p+;Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUMBER;p+;continue;else Output(INEFFICACIOUSLABEL,p1,-p);printf("输入的这个符号是不合法的! /n");break;Typecount+=INEFFICACIOUSLABEL;p+;continue;elseOutput(INEFFICACIOUSLABEL,p1,-p);printf("输入的这个符号是不合法的!因为他的后面既不是09也不是“+”或者“-");break;/1.5E*2这样的字符串不是无符号数 Typecount+=INEFFICACIOUSLABEL;p+;continue;else Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUMBER;p+;continue;else Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUMBER;p+;continue;if(*p='.')p+;if(UnsignedNum(p)p+;while(UnsignedNum(p)p+;if(*p='0') Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUMBER;p+;continue;else if(*p='E')p+;if(UnsignedNum(p)while(UnsignedNum(p)p+; Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUMBER;p+;continue;else if(*p='+'|*p='-')p+;while(UnsignedNum(p)p+;Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUMBER;p+;continue;else Output(UNSIGNEDNUMBER,p1,-p);Typecount+=UNSIGNEDNUMBER;p+;continue;else Output(INEFFICACIOUSLABEL,p1,-p); printf("输入的这个符号是不合法的!");break;Typecount+=INEFFICACIOUSLABEL;p+;continue; else if(*p='E') Output(INEFFICACIOUSLABEL,p,p);break; Typecount+=INEFFICACIOUSLABEL; printf("输入的这个符号是不合法的!"); p+; continue; printf("nn词法分析完毕!");void ShowType()/将类别码存储在Type100中,为语法分析做准备 printf("n用类别码表示输入的字符如下:n");int i;printf("n");for(i=0;Typei!=FINISH;i+)printf("%d",Typei);printf("nn"); void main() /词法分析部分 StoreStr(); ShowStore(); TypyDistinguish(); Typecount=FINISH; ShowType(); 四、 实验结果正确的结果:错误的结果:输入的字符串中有1.5E*2因为实验是以文件的形式进行读取的所以,在读取不合法的过程中只是将存在project 中的a.txt 中的内容改变改为1.5E*2+100*555实验结果如下:结果分析:对于正确的结果,我以二元式的形式输出,包括他的值和他的类别码,其中将类别码存放在另外的一个数组中,为了在实验二中的语法识别打下基础。对于错误的结果,我选择的是跳出这个程序,并且能过分析出错的原因。改进设计:(1)字符串是以文件的形式输出的,连续重复输入存在局限性(2)能够跳过错误的字符继续识别剩下的字符实验一扩展李晓萌 088330一、实验内容:试对基础实验识别的单词种类进行扩充,构造识别以下单词的词法分析程序。语言中具有的单词包括五个有代表性的关键字begin、end、if、then、else;标识符;整型常数;六种关系运算符;一个赋值符和四个算术运算符。二、 设计部分基础实验和扩展实验的差别在基础实验的关键在于无符号数的判断,但是,扩展实验的关键在于关键字和标识符的识别。关于关键字的识别,通过和题目中给出的几个关键字的对比,若相同则可以确定是关键字,否则,就可自动确定为标识符具体实现的流程图如下:三、 源程序代码部分#include<iostream.h> #include<string.h> #define BEGIN 1#define END 2#define IF 3#define THEN 4#define ELSE 5# define ID 6# define INT 7# define LT 8# define LE 9# define EQ 10# define NE 11# define GT 12# define GE 13#define IS 14#define PL 15#define MI 16#define MU 17#define DI 18char *KeyWord5="begin","end","if","then","else" int i=0,j=0,k=0,t=0;/搜索指示器 char ch;/存放最新读入的原程序字符 char strToken20;/存放构成单词符号的字符串 char * chr_form100;/字符表 char * int_form100;/常数表 char form1000; int q=0; int temp; void GetChar()/将下一个字符读入ch中,搜索指示器前移一字符位 ch=formk; k+; void GetBC()/检查ch中的字符是否为空白,若是则调用Getchar直至ch中进入 /一个非空白字符 while(ch=' ') /k-; GetChar(); void Concat()/将ch中的字符连接到strToken之后, strTokeni=ch; i+; bool IsLetter()/判断ch中的字符是否为字符 if(ch<='z')&&(ch>='a')|(ch<='Z')&&(ch>='A') return (1); else return(0); bool IsDigit()/判断ch中的字符是否为数字 /k-; if(ch)<='9')&&( (ch)>='0') return (1); else return (0); int Reserve()/对strToken中的字符串查找保留字表,若它是一个保留字 /则返回它的编码,否则返回-1值 for(int q=0;q<5;q+) if(strcmp(KeyWordq,strToken)=0) return q; if(q=4) return -1; void Retract()/将搜索指示器回调一个字符位置,将ch置为空白字符 k-; ch=NULL; char*InsertId()/将strToken中的标识符插入符号表,返回符号表的指针 chr_formj=strToken; j+; return chr_form0; char * InsertConst()/将strToken中的常数插入常数表,返回常数表指针 int_formt=strToken; t+; return int_form0; int code; / void Output(int a,char *p1,char *p2)cout<<"t类别码(CLASS):"<<a<<"t 单词值(VALUE):"while(p1<=p2)cout<<*p1;p1+;cout<<endl; void analyze() GetChar(); GetBC(); /cout<<"此处没有错"<<endl; if(IsLetter() while(IsLetter()|IsDigit() Concat(); GetChar(); /cout<<"此处没有错"<<endl; Retract(); code=Reserve(); switch(code) case 0:cout<<"需检测的的单词:"<<strToken<<" 类别码为: "<<BEGIN <<endl;break; case 1:cout<<"需检测的的单词:"<<strToken<<" 类别码为: "<<END<<endl;break; case 2:cout<<"需检测的的单词:"<<strToken<<" 类别码为: "<<IF<<endl;break; case 3:cout<<"需检测的的单词:"<<strToken<<" 类别码为: "<<THEN<<endl;break; case 4:cout<<"需检测的的单词:"<<strToken<<" 类别码为: "<<ELSE<<endl;break; default: cout<<"需检测的的单词:"<<strToken<<" 类别码为: "<<ID<<endl;break; else if(IsDigit() while(IsDigit()|ch='.') Concat(); GetChar(); Retract(); cout<<"需检测的的单词:"<<strToken<<" 类别码为: "<<INT<<endl; else switch (ch) case '+': cout<<"需检测的的单词:+ 类别码为: "<<PL<<endl;break; case'-': cout<<"需检测的的单词:- 类别码为: "<<MI<<endl;break; case'*': cout<<"需检测的的单词:* 类别码为: "<<MU<<endl;break; case'/': cout<<"需检测的的单词:/ 类别码为: "<<DI<<endl;break; case':':GetChar(); if(ch='=') cout<<"需检测的的单词:= 类别码为: "<<IS<<endl;break; else Retract(); cout<<"需检测的的单词为非法输入!"<<endl;break; case'=':cout<<"需检测的的单词:= 类别码为: "<<EQ<<endl;break; case'>':GetChar();switch(ch) case'=': cout<<"需检测的的单词:>= 类别码为: "<<GE<<endl;break; default:Retract(); cout<<"需检测的的单词:> 类别码为: "<<GT<<endl;break; case'<':GetChar(); switch(ch) case'=':cout<<"需检测的的单词:<= 类别码为: "<<LE<<endl;break; case'>':cout<<"需检测的的单词:<> 类别码为: "<<NE<<endl;break; default:Retract(); cout<<"需检测的的单词:< 类别码为: "<<LT<<endl;break; while(k<q) for(int p=0;p<50;p+) strTokenp='0' i=0; analyze(); void main() cout<<"请输入一段程序,以#号结束:"<<endl; form0=cin.get(); for( q=1;formq-1!='#'q+) formq=cin.get(); if(formq='#') cout<<"你输入的程序段为n" cout.write(form,q); break; cout<<endl; analyze(); 四、实验结果:结果分析:实验的程序只是完成了最基本的部分,能够把题目中给出的关键字begin、end、if、then、else;标识符;整型常数;六种关系运算符;一个赋值符和四个算术运算符顺利的识别出来,还是存在缺陷改进设计:(1)关键字的数目太少(2)只是识别了整数,应该能够将基本实验中的无符号数识别出来(3)实现多次循环输入(4)判断出错的功能是很强大实验二 语法分析程序实现李晓萌 088330一、实验内容:通过设计、编制、调试典型的SLR(1)语法分析程序,实现对实验一所得词法分析程序所提供的单词序列进行语法检查和结构分析,进一步掌握常用的语法分析方法。二、设计部分(1)首先根据算术四则运算的语法定义,构造SLR(1)分析表。无符号数的算术四则运算的语法可表示为:S->E(自己添加的)E->E+T| E-T|TT->T*F| T/F|FF->(E)|i该表1是根据下一页的图画出来的:+-*/()i#E T F0S4S51231S6S7acc2R3S8S9R3R33R6R6R6R6R6R64S4S510235R8R8R8R8R8R86S4S51137S4S51238S4S5139S4S51410S6S7S1511R1R1S8S9R1R112R2R2S8S9R2R213R4R4R4R4R4R414R5R5R5R5R5R515R7R7R7R7R7R7表1(2)对实验一得字符串1.5E+2+100*555进行验证:经过自己的推理所得的表2步骤状态栈符号栈输入串ACTIONGOTO10#i+i*iS5205#i+i*i#R8GOTO0,F=3303#F+i*i#R6GOTO0,T=2402#T+i*i#R3GOTO0,E=1501#E+i*i#S66016#E+i*i#S570165#E+i*i#R8GOTO0,F=380163#E+F*i#R6GOTO0,T=290162#E+T*i#S81001628#E+T*i#S511016285#E+T*i#R8GOTO0,F=312016283#E+T*F#R6GOTO0,T=21301611#E+T#R1GOTO0,E=11401#E#acc成功!表2程序设计:(1)设置输入缓冲区用结构buf实现输入字符的存储,包括值和类型的存储(为实验三做准备),为后续的语法分析和词法分析做准备(2)状态栈state 作为状态栈,存储归约和移进过程状态的变化(3)符号栈Symbol作为符号栈,栈顶的符号不断地进行着归约和移进的动作(4)运用c语言编写了相应的程序进行移近和归约以及接受的动作,需要注意的是,在规约的过程中不仅需要弹出数目确定的字符,还要有相应的字符入栈注意:在实验设计过程中,从读取存有算数字符的文件开始,就获得了每一个算术表达式的字符个数(除去”->”的剩余部分)并存储在数组VNum中三、 源程序代码实验代码部分将会在实验三给出四、 实验结果见实验三实验三 语义分析程序实现李晓萌 088330一、实验内容:通过设计、编制、调试一个简单的语义处理分析程序,实现对实验一和实验二所得单词和语句的语义信息简单处里,进一步掌握语义处理的内容和简单方法。二、设计部分(1)需要将实验一的1.5E+2+100*555中的每一个无符号数相应的算出最终的结果:如:1500.000000+2.000000+100.000000*555.000000(2)在进行归约的过程中,不仅仅是弹出需要进行归约的字符,还要进行值的传递和计算计算(3)设计思路:1 Calculate_UnsignedFigure(char *p1,char *p2) 函数能过准确的计算出无符号的值2 Quarternary_Out(int a1,double a2,double a3,double a4)语义分析四元式输出3 Store_ResuctionMAX在语法分析的过程中,把归约过程都标记在这个数组中&& UnsignedFigure在计算的过程中也已经把相应的算数字符的值存储在这个数组4调用相应的归约过程,利用UnsignedFigure存储的值进行计算,最后获得运算结果结果可以对实验二得标进一步完善步骤状态栈符号栈输入串ACTIONGOTO语义处理生成中间代码10#i+i*iS5205#i+i*i#R8GOTO0,F=3i1.value=1500.000000303#F+i*i#R6GOTO0,T=2F1.value=1500.000000402#T+i*i#R3GOTO0,E=1T1.value=1500.000000501#E+i*i#S6E1.value=1500.0000006016#E+i*i#S570165#E+i*i#R8GOTO0,F=3i2.value=100.00000080163#E+F*i#R6GOTO0,T=2F2.value=100.00000090162#E+T*i#S8T2.value=100.0000001001628#

    注意事项

    本文(编译原理词法分析程序实现实验报告.doc)为本站会员(laozhun)主动上传,三一办公仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知三一办公(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    备案号:宁ICP备20000045号-2

    经营许可证:宁B2-20210002

    宁公网安备 64010402000987号

    三一办公
    收起
    展开