编译原理-语法分析实验报告_第1页
编译原理-语法分析实验报告_第2页
编译原理-语法分析实验报告_第3页
编译原理-语法分析实验报告_第4页
编译原理-语法分析实验报告_第5页
已阅读5页,还剩21页未读 继续免费阅读

下载本文档

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

文档简介

编译原理实验报告26/26课程实验报告课程名称:编译原理(语法分析)专业班级:信息安全1001班学号:U201014608姓名:指导教师:骆婷报告日期:2010/11/8计算机科学与技术学院1、实验目的设计并编制一个语法分析程序,加深对语法分析程序中递归下降分析方法的理解;巩固对代码生成及报错处理等理论的认识;培养对完整系统独立分析和设计的能力;培养学生独立编程的能力;

2、实验要求利用C语言编制递归下降分析程序,并对简单语言进行语法分析。2.1待分析的简单语法的语法用扩充的BNF表示如下:<程序>::=begin<语句串>end<语句串>::=<语句>{:语句}<语句>::=<赋值语句><赋值语句>::=ID:=<表达式><表达死>::=<项>{+<项>|-<项>}<项>::=<因子>{*<因子>|/<因子>}<因子>::=ID|NUM|(<表达式>)2.2语法分析程序的功能输入单词串,以”#”结束,如果是文法正确的句子,则输出成功信息,打印“success”,否则输出”error”例如:输入:begina:=9;b:=0end#输出:success输入:begina=9end#输出:error3、词法分析程序的算法思想算法的基本任务是从字符串中表示的源程序中识别出具有独立意义的单词符号,并通过其基本文法,正确规约到开始符号。全局变量的设置在此程序中,需要设置两个个全局变量:关键字表retab[6]、当前识别的种别号syn。其中retab中元素为“begin”“if”“then”“while”“do”“end”,在程序会扫描出标识符时,首先查关键字表。如果能找到匹配的单词,则该单词为关键字,否则为一般标识符。syn用于每一步扫描中scanner的返回值。在整个语法分析程序中均需要使用该全局变量。主程序main算法流程图开始开始读取读取字符串到inputStringinti=0;输入字符串长度inputLength SScanner()syn==-1syn==-1 Nlrparser()结束lrparser()结束扫描子程序scanner()的算法流程图调用调用ch=ch=当前第一个字符字母当前字符串数字运算符/界符当前字符串syn=种别号当前数字syn=相应的种别号是否关键字syn=种别号当前数字syn=相应的种别号是否关键字 其他符号错误 N错误syn=11syn=11Y返回返回lrparser()的算法流程图调用调用syn=1 Nsyn=1 Yscanner()scanner()yucuyucu()synsyn==6 N Yscanner()scanner()synsyn==0 N Y出错处理成功,打印“出错处理成功,打印“success”语句串分析程序yucu()的算法流程图调用调用statement()statement()syn==26(;)syn==26(;)scanner()scanner()出错处理 Y出错处理statement语句分析算法流程图调用

调用synsyn==26(;)scanner()scanner()synsyn==18(:=) 否 scanner() 是scanner()出错处理expression()出错处理expression()expression表达式分析算法流程图调用调用term()term()是否是否+或- N Yscanner()scanner()出错处理term出错处理termterm分析函数算法流程图调用调用factor()factor()是否*或是否*或/ 出错处理Scanner()出错处理Scanner()factor分析函数算法流程图调用调用是否标识符 Y是否标识符 N是否整常数是否整常数 Y N 是否(是否( Y scanner();expression()scanner();expression()出错处理出错处理是否)是否)scanner();返回 scanner();返回Y4、实验结果输入begina:=9;x:=2*3end#结果如下输入begina=9end#结果如下5、实验感想及总结本次实验和第一实验一样,框架已经给出,算法已经用类C语言写出,我们需要做的是将第一个实验和第二个实验很好的结合起来。由于第一次实验中不是按照书中的框架写出的代码,因此在第二次实验时传递参数时出现了问题,最后不得不利用全局变量syn解决。通过两次编译原理的实验,更加理解了词法语法分析的过程,促进了对课程的进一步学习。6、源代码#include<stdio.h>#include<string.h>#include<ctype.h>#include<stdlib.h>charGetChar(char*input,int*index,intlength);intClearBlank(char*input,int(*index),intlength);intreserve(char*s);voidlrparser(char*input,intinputLength,int*index);voidyucu(char*input,intinputLength,int*index);voidfactor(char*input,intinputLength,int*index);voidstatement(char*input,intinputLength,int*index);voidexpression(char*input,intinputLength,int*index);voidterm(char*input,intinputLength,int*index);char*retab[6]={"begin","if","then","while","do","end"};//关键字intsyn=0;intmyIsAlpha(charch){ if(islower(ch)==2||isupper(ch)==1) { return1; } else { return0; }}voidscaner(char*input,intinputLength,int*index){ chars[256]="";//保存当前的字符 charch=GetChar(input,index,inputLength); intnowPosition=0; intj=0; if(myIsAlpha(ch)==1)//如果是字母 { while(((ch>='0'&&ch<='9')||(myIsAlpha(ch)==1))&&*index<=inputLength) { s[nowPosition]=ch;//添加到当前字符串中 nowPosition++; ch=GetChar(input,index,inputLength); } if((ch<'0'||ch>'9')&&(myIsAlpha(ch)==0))//进行回退操作,并输出结果 { s[nowPosition]='\0';//添加结束标志 j=reserve(s); if(j==0) { syn=10; } else { syn=j; } (*index)--; return; } else//超过范围 { s[nowPosition++]=ch; s[nowPosition]='\0';//添加结束标志 j=reserve(s); if(j==0) { syn=10; } else { syn=j; } getchar(); exit(0);*/ return; } } else if(ch>='0'&&ch<='9')//如果是数字 { while(ch>='0'&&ch<='9'&&*index<=inputLength) { s[nowPosition]=ch;//添加到当前字符串中 nowPosition++; ch=GetChar(input,index,inputLength); } if(ch<'0'||ch>'9')//进行回退操作 { (*index)--; syn=11; return; } else//超过范围时 { s[nowPosition]=ch; syn=11; return; } } else { switch(ch) { case'+': { syn=13; return; } case'-': { syn=14; return; } case'*': { syn=15; return; } case'/': { syn=16; return; } case'<': { ch=GetChar(input,index,inputLength); if(ch=='=') { syn=22; return; } else if(ch=='>') { syn=21; return; } else { syn=20; if(*index>inputLength) { return; } else { (*index)--; return; } } } case'>': { ch=GetChar(input,index,inputLength); if(ch=='=') { syn=24; return; } else { syn=23; if(*index>inputLength) { return; } else { (*index)--; return; } } } case':': { ch=GetChar(input,index,inputLength); if(ch=='=') { syn=18; return; } else { if(*index>inputLength) { 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("(非法符号)"); } } }}intreserve(char*s){ if(strcmp(s,retab[0])==0) { return1; } else if(strcmp(s,retab[1])==0) { return2; } else if(strcmp(s,retab[2])==0) { return3; } else if(strcmp(s,retab[3])==0) { return4; } else if(strcmp(s,retab[4])==0) { return5; } else if(strcmp(s,retab[5])==0) { return6; } else { return0; }}charGetChar(char*input,int*index,intlength){ if(*index<=length) { (*index)++; returninput[(*index)-1]; } else return0;}intClearBlank(char*input,int(*index),intlength){ while((*index)!=length) { if(input[(*index)]==32&&(*index)!=length) { ((*index))++; } else if(input[(*index)]==32&&(*index)==length) { printf("\n谢谢使用!\n"); getchar(); exit(0); } else { return1; } }return0;}voidlrparser(char*input,intinputLength,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("success\n"); getchar(); return; } } } else { printf("error!"); return; }}voidyucu(char*input,intinputLength,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;}voidstatement(char*input,intinputLength,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("输出语句错误!%d\n",syn); getchar(); exit(0); } return;}voidexpression(char*input,intinputLength,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;}voidterm(char*input,intinputLength,int*index){ factor(input,inputLength,index); while(syn==15||syn==16) { scaner(input,inputLength,index); while(syn==-1) { scaner(input,inputLength,index); }factor(input,inputLength,index); } return;}voidfactor(char*input,intinputLength,int*index){ if(syn==10||syn==11) { scane

温馨提示

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

评论

0/150

提交评论