编译原理报告(8).docx_第1页
编译原理报告(8).docx_第2页
编译原理报告(8).docx_第3页
编译原理报告(8).docx_第4页
编译原理报告(8).docx_第5页
已阅读5页,还剩25页未读 继续免费阅读

下载本文档

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

文档简介

编译原理实验报告课 程 实 验 报 告课程名称: 编译原理 专业班级: 信息安全1302班 学 号: 姓 名: 指导教师: 报告日期: 2015/11/8 计算机科学与技术学院实验一:词法分析一、 实验要求1.1 待分析的简单的词法(1)关键字: begin if then while do end所有的关键字都是小写。(2)运算符和界符: = + - * / = = = ; ( ) #(3)其他单词是标识符(ID)和整型常数(SUM),通过以下正规式定义:ID = letter (letter | digit)*NUM = digit digit*(4)空格有空白、制表符和换行符组成。空格一般用来分隔ID、SUM、运算符、界符和关键字,词法分析阶段通常被忽略。1.2 各种单词符号对应的种别码:表2.1 各种单词符号对应的种别码单词符号种别码 单词符号种别码begin1:17If2:=18Then320while421do523lettet(letter|digit)*10=24dight dight*11=25+13;2614(27*15)28/16#01.3 词法分析程序的功能:输入:所给文法的源程序字符串。输出:二元组(syn,token或sum)构成的序列。其中:syn为单词种别码; token为存放的单词自身字符串; sum为整型常数。例如:对源程序begin x:=9: if x9 then x:=2*x+1/3; end #的源文件,经过词法分析后输出如下序列:(1,begin)(10,x)(18,:=)(11,9)(26,;)(2,if)二、词法分析程序的算法思想:算法的基本任务是从字符串表示的源程序中识别出具有独立意义的单词符号,其基本思想是根据扫描到单词符号的第一个字符的种类,拼出相应的单词符号。2.1 主程序示意图:主程序示意图如图3-1所示。其中初始包括以下两个方面: 关键字表的初值。关键字作为特殊标识符处理,把它们预先安排在一张表格中(称为关键字表),当扫描程序识别出标识符时,查关键字表。如能查到匹配的单词,则该单词为关键字,否则为一般标识符。关键字表为一个字符串数组,其描述如下:Char *rwtab6 = “begin”, “if”, “then”, “while”, “do”, “end”,;置初值调用扫描子程序输出单词二元组输入串结束 否 是结束 图2-1(2)程序中需要用到的主要变量为syn,token和sum2.2 扫描子程序的算法思想:首先设置3个变量:token用来存放构成单词符号的字符串;sum用来整型单词;syn用来存放单词符号的种别码。扫描子程序主要部分流程如图3-2所示。变量初始化忽略空格是否文件结束? 返回 是 是否字母拼数拼字符串 数字 其他运算符、 符号是否关键字?界符等符号报错对不同符号给出相应的syn值返回syn=1111syn=10 否syn为对应关键字的单词种别码 是图 2-2三.测试结果对源程序begin x:=9: if x9 then x:=2*x+1/3; end #的源文件,经过词法分析,结果正确,与预期一致。四.源程序#include #include char prog80,token8,ch;int syn,p,m,n,sum;char *rwtab6=begin,if,then,while,do,end;main()p=0;printf(n #:n);doscanf(%c,&ch);progp+=ch;while(ch!=#);p=0;doscaner();switch(syn)case 11:printf( %-10d%5d )n,sum,syn);break;case -1:printf(you have input a wrong stringn);getch();exit(0);default: printf( %-10s%5d )n,token,syn);break;while(syn!=0); getch();scaner()sum=0;for(m=0;m8;m+)tokenm+=NULL;ch=progp+;m=0;while(ch= )|(ch=n)ch=progp+;if(ch=a)|(ch=A) while(ch=a)|(ch=A)|(ch=0)&(ch=9) tokenm+=ch;ch=progp+;tokenm = 0;p-;syn=10;for(n=0;n=0)&(ch=0)&(ch=9) sum=sum*10+ch-0;ch=progp+; p-;syn=11;else switch(ch) case ) syn=21;tokenm+=ch;else syn=20;p-;break;case :tokenm+=ch;ch=progp+;if(ch=) syn=18;tokenm+=ch;else syn=17;p-;break;case :tokenm+=ch;ch=progp+;if(ch=) syn=24;tokenm+=ch;else syn=23;p-;break;case -:syn=14;tokenm+=ch;break;case +: syn=13;tokenm+=ch;break;case *: syn=15;tokenm+=ch;break;case /: syn=16;tokenm+=ch;break;case (: syn=27;tokenm+=ch;break;case ): syn=28;tokenm+=ch;break;case =: syn=25;tokenm+=ch;break;case ;: syn=26;tokenm+=ch;break;case #: syn=0;tokenm+=ch;break;default: syn=-1;break;tokenm+=0;实验二:语法分析一.实验目的1) 设计并编制一个语法分析程序,加深对语法分析程序中递归下降分析方法的理解;2) 巩固对代码生成及报错处理等理论的认识;3) 培养对完整系统独立分析和设计的能力;4) 培养学生独立编程的能力;二.实验要求 利用C语言编制递归下降分析程序,并对简单语言进行语法分析。2.1 待分析的简单语法的语法用扩充的BNF表示如下:(1) :=begin end(2) :=:语句(3) :=(4) :=ID := (5) :=+|-(6) :=*|/(7) :=ID | NUM | ( )2.2 语法分析程序的功能输入单词串,以”#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出”error”例如: 输入: begin a:=9;b:=0 end # 输出: success 输入: begin a=9 end # 输出: error三.词法分析程序的算法思想算法的基本任务是从字符串中表示的源程序中识别出具有独立意义的单词符号,并通过其基本文法,正确规约到开始符号。 1) 全局变量的设置 在此程序中,需要设置两个个全局变量: 关键字表retab6、当前识别的种别号syn。 其中retab中元素为 “begin” “if” “then” “while” “do” “end”,在程序会扫描出标识符时,首先查关键字表。如果能找到匹配的单词,则该单词为关键字,否则为一般标识符。syn用于每一步扫描中scanner 的返回值。在整个语法分析程序中均需要使用该全局变量。2) 主程序main算法流程图开始读取字符串到inputStringint i =0;输入字符串长度inputLengthScanner() syn = -1Y Nlrparser()结束 3) 扫描子程序scanner()的算法流程图调用ch =当前第一个字符 字母 当前字符串 数字 运算符/界符syn=种别号当前数字syn=相应的种别号是否关键字 其他符号错误Nsyn=11 Y返回4) lrparser()的算法流程图调用syn = 1 NYscanner()yucu()syn = 6 N Yscanner()syn = 0NY出错处理成功,打印“success” 5) 语句串分析程序yucu()的算法流程图调用statement()syn =26(;)Nscanner()出错处理Y6) statement语句分析算法流程图调用syn =26(;)scanner()syn =18(:=)否scanner()是出错处理expression()7) expression表达式分析算法流程图调用term()是否+ 或- NYscanner()出错处理term8) term分析函数算法流程图调用factor()是否* 或 / N出错处理Scanner()Y9) factor分析函数算法流程图调用是否标识符YN是否整常数YN是否(Yscanner() ; expression() 出错处理是否 )scanner() ;返回 N Y四.实验结果1. 输入begin a:=9; x:= 2*3 end # 结果如下2. 输入begin a=9 end # 结果如下五.实验感想及总结本次实验和第一实验一样,框架已经给出,我们需要做的是将第一个实验和第二个实验很好的结合起来。 由于第一次实验中不是按照书中的框架写出的代码,因此在第二次实验时传递参数时出现了问题,最后不得不利用全局变量syn解决。通过两次编译原理的实验,更加理解了词法语法分析的过程,促进了对课程的进一步学习。六.源代码#include #include#include#includechar GetChar(char *input,int *index,int length);int ClearBlank(char *input,int (*index),int length);int reserve(char *s);void lrparser(char *input,int inputLength,int *index);void yucu(char *input,int inputLength,int *index);void factor(char *input,int inputLength,int *index);void statement(char *input,int inputLength,int *index);void expression(char *input,int inputLength,int *index);void term(char *input,int inputLength,int *index);char *retab6=begin,if,then,while,do,end;/关键字int syn=0;int myIsAlpha(char ch)if(islower(ch)=2 | isupper(ch)=1) return 1; elsereturn 0;void scaner(char *input,int inputLength,int *index)char s256=; /保存当前的字符char ch=GetChar(input,index,inputLength);int nowPosition=0;int j=0;if(myIsAlpha(ch)=1) /如果是字母 while(ch=0 & ch=9) | (myIsAlpha(ch)=1 ) )& *index =inputLength) snowPosition=ch; /添加到当前字符串中 nowPosition+; ch=GetChar(input,index,inputLength); if(ch 9) &(myIsAlpha(ch)=0 ) )/进行回退操作,并输出结果 snowPosition=0;/添加结束标志 j=reserve(s); if(j=0) syn=10; else syn=j; (*index)-; return; else /超过范围 snowPosition+=ch; snowPosition=0;/添加结束标志 j=reserve(s); if(j=0) syn=10; else syn=j; getchar(); exit(0); return; elseif(ch=0 & ch=0 & ch=9& *index =inputLength) snowPosition=ch; /添加到当前字符串中 nowPosition+; ch=GetChar(input,index,inputLength); if(ch9)/进行回退操作 (*index)-; syn=11; return; else /超过范围时 snowPosition=ch;syn=11; return; else switch(ch)case +: syn=13;return;case -: syn=14;return ;case *: syn=15;return ;case /: syn=16;return ;case ) syn=21; return ;else syn=20;if(*indexinputLength) return;else (*index)-; return ;case : ch=GetChar(input,index,inputLength);if(ch=) syn=24; return ;else syn=23;if(*indexinputLength) return;else (*index)-; return ;case :ch=GetChar(input,index,inputLength);if(ch=) syn=18; return ;else if(*indexinputLength)return;else (*index)-; return ;case =: syn=25;return ;case ;: syn=26;return ;case (: syn=27;return ;case ): syn=28;return ;case #:syn=0;return ;case : syn=-1; return ; default: printf(非法符号); int reserve(char *s)if(strcmp(s,retab0)=0) return 1;elseif(strcmp(s,retab1)=0) return 2; elseif(strcmp(s,retab2)=0) return 3; else if(strcmp(s,retab3)=0) return 4; else if(strcmp(s,retab4)=0) return 5; else if(strcmp(s,retab5)=0) return 6; else return 0; char GetChar(char *input,int *index,int length)if(*index = length) (*index)+; return input(*index)-1;elsereturn 0;int ClearBlank(char *input,int (*index),int length) while( (*index) != length) if(input(*index) =32 & (*index) != length) (*index)+; else if( input(*index) =32 & (*index) = length) printf(n谢谢使用!n);getchar();exit(0); else return 1; return 0; void lrparser(char *input,int inputLength,int *index)if(syn=1) scaner(input,inputLength, index); while(syn=-1) scaner(input,inputLength, index); yucu(input,inputLength, index);if(syn = 6) scaner(input,inputLength, index); while(syn=-1) scaner(input,inputLength, index); if(syn=0 ) printf(successn); getchar(); return; else printf(error!); return; void yucu(char *input,int inputLength,int *index) statement(input,inputLength, index);while(syn=26)scaner(input,inputLength, index); while(syn=-1) scaner(input,inputLength, index); statement(input,inputLength, index);return ;void statement(char *input,int inputLength,int *index)if(syn =10) scaner(input,inputLength, index); while(syn=-1) scaner(input,inputLength, index); if(syn=18) scaner(input,inputLength, index); while(syn=-1) scaner(input,inputLength, index); expression(input,inputLength, index); else printf(输出赋值号错误!n); getchar(); exit(0); else printf(输出语句错误!%dn,syn); getchar(); exit(0); return ;void expression(char *input,int inputLength,int *index) term(input,inputLength, index); while(syn = 13| syn =14) scaner(input,inputLength, index); while(syn=-1) scaner(input,inputLength, index); term(input,inputLength, index ); return ;void term(char *input,int inputLength,int *index) factor(input,inputLength, index ); while(syn = 15| syn =16) scaner(input,inputLength, index); while(syn=-1) scaner(input,inputLength, index); factor(inp

温馨提示

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

评论

0/150

提交评论