《编译原理报告》word版.doc_第1页
《编译原理报告》word版.doc_第2页
《编译原理报告》word版.doc_第3页
《编译原理报告》word版.doc_第4页
《编译原理报告》word版.doc_第5页
已阅读5页,还剩24页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

课 程 设 计 报 告课程名称: 编译原理 专业班级: 信息安全 1302 班 学 号: 姓 名: 指导教师: 报告日期: 2015年11月10日 计算机科学与技术学院目录目录1实验一 词法分析31.1 实验目的31.2 实验要求31.3 实验原理41.4 算法实现61.5 实验结果6实验二 语法分析82.1 实验目的82.2 实验要求82.3 实验原理82.4 算法实现122.5 实验结果13总结和体会15附录16实验一 词法分析1.1 实验目的设计、编制并调试一个词法分析程序,加深对词法分析原理的理解。1.2 实验要求1. 待分析的简单语言的词法(1) 关键字begin if then while do end所有的关键字都是小写。(2) 运算符和界符::= + - * / = = = ; ( ) #(3) 其他单词是标识符(ID)和整形常数(NUM),通过以下正规式定义:ID = letter(letter | digit)*NUM = digit digit*(4) 空格由空白、制表符和换行符组成。空格一般用来分隔ID、NUM、运算符、界符和关键字,词法分析阶段通常被忽略。2. 各种单词符号对应的种别码。单词符号种别码单词符号种别码begin1:17if2:=18then320while421do523letter (letter | digit)*10=24digit digit*11=25+13;26-14(27*15)28/16#03. 词法分析程序的功能输入:所给文法的源程序字符串。输出:二元组(syn, token 或 sum)构成的序列其中:syn为单词种别码;token为存放的单词自身字符串;sum为整形常数。例如:对源程序begin x:=9; if x0 then x:= 2 * x + 1 / 3 ; end #的源文件,经词法分析后输出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)1.3 实验原理算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。1.3.1 主程序流程程序从文件中得到相应的代码段,之后对缓存区的数据进行词法分析,此番分析的结构流程图如图3.1所示:图3.1 主程序流程图1.3.2 扫描子程序扫描子程序会对缓存区中的代码根据关键字表进行判定,并未每一个代码生成其对应的二元组。程序结构如图3.2所示:图3.2 扫描子程序流程图1.3.3 函数及变量设计扫描开始之前需要在程序中预设,或者从文件中读取一个关键字表,并根据关键字表对程序进行词法分析,彼此实验关键字表预设在程序开始前定义的一个char型数组中,其定义格式如下:char *rwtab=begin,if,then,while,do,end,_KEY_WORD_END;其中KEY_WORD_END为关键字结束标志生成的二元组存储在一个数据结构中,数据结构定义如下:typedef structint typenum; /*种别码*/char *word;WORD;数据结构内容包括种别码和相应单词。1.4 算法实现1.4.1 变量设计程序中所用主要变量定义形式如下:typedef struct/*二元组结构*/int typenum; /*种别码*/char *word;WORD;char input255; /*源程序缓字符冲区*/char token255=; /*单词缓冲区*/int p_input; /*源程序字符指针*/int p_token; /*单词缓冲区指针*/char ch; /*当前读入字符*/char *rwtab=begin,if,then,while,do,end,_KEY_WORD_END;/*关键字表*/1.4.2 函数设计程序中涉及的函数定义形式如下char m_getch() /*从输入源读一个字符到CH中*/void getbc() /*去掉空白字符*/void concat() /*拼接单词*/int letter()/*判断是否是单词*/int digit()/*判断是否是数字*/int reserve()/*检索关键字表格*/void retract()/*回退一个字符*/WORD *scaner()/*词法扫描程序*/1.4.3 函数代码函数代码见附录。1.5 实验结果测试代码存储在文件中,代码如下:程序运行结果如下:实验二 语法分析2.1 实验目的编制一个递归下降分析程序,实现对词法分析程序所提供的单词序列的语法检查和结构分析。2.2 实验要求利用C语言编制递归下降分析程序,并对简单语言进行语法分析。1. 待分析的简单语言的语法用扩充的BNF表示如下:(1) := begin end(2) := ; (3) := (4) := ID := (5) := + | -(6) := * | /(7) := ID | NUM | ()2. 实验要求说明输入单词串,以“#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出“error”。例如:输入 begin a:=9; x:=2*3; b:=a+x end #输出 success输入 x:=a+b*c end #输出 error2.3 实验原理语法分析程序以实验一中实现的词法分析程序为基础。能够判断一段代码是否符合语法规则。2.3.1 主程序流程程序从文件中得到相应的代码段,之后对缓存区的数据进行分析,分析的结构流程图如图3.1所示:图3.1 主程序流程图2.3.2 递归下降分析程序递归下降分析程序出错处理包括三种,若第一个单词符号不是begin,则会输出“no begin error!”,若最后一个单词不是end而且kk!=1,则输出“no end error!”,若end之后不是标识符“#”而是其他内容,则输出“three should not be anything after end”。程序流程图如图3.2所示:图3.2 递归下降分析程序流程图2.3.3 语句串分析程序程序流程图如图3.3所示:图3.3 语句串分析程序流程图2.3.4 赋值语句分析程序程序流程图如图3.4所示:图3.4 赋值语句分析程序流程图2.3.5 表达式分析程序程序流程图如图3.5所示:图3.5 表达式分析程序流程图2.3.6 项分析程序程序流程图如图3.6所示:图3.6 项分析程序流程图2.3.7 因子分析程序程序流程图如图3.7所示:图3.7 因子分析程序流程2.4 算法实现函数代码见附录。2.5 实验结果测试代码存储在文件中代码正确时:程序运行结果如下:缺少begin时:程序运行结果如下:缺少end时:程序运行结果如下:end之后不是#时:程序运行结果如下:由实验结果可以看出,程序正确的分析出了代码的各种错误,结果达到了预期要求。 总结和体会通过此次的上机实验,我对于编译原理这门课的实际应用从一无所知到熟练掌握,学到了很多东西。在刚刚接触这门课程时,以为理论的东西会占据绝大部分的课程,但是,通过上机实验看到了这门课程生动活泼的一面。原来不仅仅是理论知识,我们也可以向其他实用课程一样,写出自己的编译器来,虽然实现的功能十分简单,但是,这样的实验确实要比纯理论来的好。实验课上进行的内容,包括了课堂上讲解的绝大部分内容,更是将几部分的内容串联到了一起进行设计,这对于理解整个课程的内容,理解编译工作的原理有着很大的帮助。此外,处理自己动手编写程序之外,还可以借助现成的分析工具进行相应的分析工作,这样做不仅节省的时间,而且能够大大避免错误的出现。也不失为一种生成编译程序的好办法。附录附录一:词法分析程序#include#include#include#define _KEY_WORD_END waiting fou your expanding/*定义关键字的结束标志*/typedef structint typenum; /*种别码*/char *word;WORD;char input255; /*源程序缓字符冲区*/char token255=; /*单词缓冲区*/int p_input; /*源程序字符指针*/int p_token; /*单词缓冲区指针*/char ch;char *rwtab=begin,if,then,while,do,end,_KEY_WORD_END;WORD *scaner(); /*词法扫描函数,获得一个单词*/int main() FILE *fin;int over=1;int count=0;WORD *oneword = new WORD;while (1) printf(n在文件中输入代码(按任意键开始):); getchar(); fin=fopen(test.txt,r); fscanf(fin,%#s,input); fclose(fin); /scanf(%#s,input); /*输入源程序字符串到缓冲区,以#结束*/ p_input=0; printf(词法分析结果是:nn); count = 0; while (overword=OVER) break; else if(oneword-typenum typenum ,oneword-word ); over=oneword-typenum ; count+; if(count%6=0) printf(n);/每六行输出 printf(#,0) ); return 0;char m_getch() /*从输入源读一个字符到CH中*/ch=inputp_input;p_input=p_input+1;return ch;void getbc() /*去掉空白字符*/while (ch = | ch= 10 | ch= 9 )ch = inputp_input;p_input=p_input+1;void concat() /*拼接单词*/tokenp_token=ch;p_token=p_token+1;tokenp_token=0;int letter()/*判断是否是单词*/if(ch=a & ch=A & ch =0& chtypenum=10;myword-word= ;p_token=0;m_getch();getbc();if(letter()while(letter()|digit()concat();m_getch();retract();myword-typenum=reserve();myword-word=token;return myword;else if(digit()while(digit()concat();m_getch();retract();myword-typenum =11;myword-word =token;return myword;else switch(ch)case= : m_getch();if(ch=)myword-typenum =29;myword-word =;return myword;retract();myword-typenum =25;myword-word =;return myword;break;case+:myword-typenum =13;myword-word =+;return myword;break;case-:myword-typenum =14;myword-word =-;return myword;break;case*:myword-typenum =15;myword-word =*;return myword;break;case/:myword-typenum =16;myword-word =/;return myword;break;case(:myword-typenum =27;myword-word =(;return myword;break;case):myword-typenum =28;myword-word =);return myword;break;case:myword-typenum =30;myword-word =;return myword;break;case:myword-typenum =31;myword-word =;return myword;break;case:myword-typenum =32;myword-word =;return myword;break;case:myword-typenum =33;myword-word =;return myword;break;case,:myword-typenum =34;myword-word =,;return myword;break;case:if(inputp_input=)myword-typenum =18;myword-word =:=;return myword;elsemyword-typenum =17;myword-word =:;return myword;break;case;:myword-typenum =26;myword-word =;return myword;break;case:m_getch();if(ch=)myword-typenum =24;myword-word =;return myword;retract();myword-typenum =23;myword-word =;return myword;break;casetypenum =22;myword-word =typenum =20;myword-word =typenum =40;myword-word =!=;return myword;retract();myword-typenum =-1;myword-word =ERROR;return myword;break;case0:myword-typenum=100;myword-word=OVER;return myword;break;default:myword-typenum=-1;myword-word=ERROR;return myword;附录二:语法分析程序#include#include#includeint syn,p_input,p_token,kk;char ch;char input100;char token100=;char* key_words=begin,if,then,while,do,end;int expression();void m_getch();int letter();int digit();int compare();void c_token();void scaner();int lrparser();int yuju();void scaner();void m_getch();void c_token();int compare();int letter();int digit();int expression();int factor();int term();int statement();int main()FILE *fin;char buffer100;int size;while(1) printf(n按任意键开始从文件中读取信息进行分析!n); getchar();if(fin=fopen(test.txt,r)=NULL)printf(Cannot open the file!n);exit(-1);fin=fopen(test.txt,r);while(fgets(buffer,100,fin)!=NULL)strcat(input,buffer);lrparser();/printf(npress # to exit:n);/scanf(%#,input);fclose(fin);return 0;int lrparser() scaner();if(syn=1)scaner();yuju();if(syn=6)scaner();if(syn=0)&(kk=0)printf(successn);return 1;else printf(three should not be anything after end); return 0;/printf(Successn);elseif(kk!=1)printf(no end errorn); kk=1;return 0;elseprintf(no begin errorn);kk=1;return 0;int yuju()statement();while (syn=29)scaner();statement();return 1;void scaner()p_token=0;m_getch();while(ch= |ch=10)m_getch();if(letter()while(letter()|digit()c_token();m_getch();p_input-;syn=compare();else if(digit()while(digit()c_token();m_getch();p_input-;syn=11;else switch(ch)case =: c_token();m_getch();if(ch=)syn=24;c_token();elsep_input-;syn=21;break;case )syn=26;c_token();else p_input-;syn=22;break;case : c_token();m_getch();if(ch=)syn=27;c_token();elsep_input-;syn=23;break;case +: syn=13;c_token();break;case -: syn=14;c_token();break;case *: syn=15;c_token();br

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论