算符优先分析算法9页_第1页
算符优先分析算法9页_第2页
算符优先分析算法9页_第3页
算符优先分析算法9页_第4页
算符优先分析算法9页_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

1、数学与计算机学院 编译原理 实验报告年级 09软工 学号 姓名 成绩 专业 软件工程 实验地点 主楼 指导教师 湛燕 实验项目 算符优先关系算法 实验日期 2012.6.6 一、实验目的和要求设计一个算符优先分析器,理解优先分析方法的原理。重点和难点:本实验的重点是理解优先分析方法的原理;难点是如何构造算符优先关系。二、实验内容使用算符优先分析算法分析下面的文法:E #E#E E+T | TT T*F | FF PF | PP (E) | i其中i可以看作是一个终结符,无需作词法分析。具体要求如下:1、如果输入符号串为正确句子,显示分析步骤,包括分析栈中的内容、优先关系、输入符号串的变化情况;

2、2、如果输入符号串不是正确句子,则指示出错位置。三、程序设计全局变量有一下几个:static string input;/记录输入串char s20;/栈int top=-1;/栈顶指针有三个函数:int analyze(string input);/分析输入的串是否符合标准void process();/进行归约的函数int main()input是一个全局变量,记录输入串,用analyze(input)分析输入的是不是符合标准的字符串,(例如“i+i*i(i+i)”)如果不符合标准,提示用户重新输入。进行归约的函数主要思想是:先构造优先关系矩阵,有“”,“=”和空格四种关系。Char a

3、记录栈中最高位的终结符,如果栈中是#E+E,则a 的赋值是“+”,如果形如“#E+”或“#E+i”则a 赋值“+”或“i”。char nowchar记录当前的字符。a 与 nowchar 按照算符优先关系矩阵找出优先关系。如果优先关系是“”,则进行归约;如果是“=”,则去掉括号或分析成功。五、代码和截图自己编写代码如下:#include #include using namespace std;static string input;/输入串char s20;/栈int top=-1;/栈顶指针char VT7=+,*,i,(,),#;/终结符 static char matrix77=, ,

4、 , , , , , , , , ,=; /优先关系矩阵,不存在优先关系时为空格int analyze(string input);/分析输入的串是否符合标准void process();/规约int main()/cout输入一个符号串!endl;int flag=1;while(flag=1)cout输入一个符号串!input;if(analyze(input)=0)flag=1;elseflag=0;cout*endl;cout表达式文法算符优先关系表endl;coutendl;for(int i=0;i8;i+)coutVTi;coutendl;coutendl;for( i=0;i7

5、;i+)coutVTi;for(int j=0;j7;j+)cout;coutmatrixij;coutendl;/coutendl;cout*endl;cout对输入串input的算符优先分析过程如下:endl;process();coutendl;/cout 栈 优先关系 当前符号 剩余输入串 移进或规约endl;coutendl;coutendl;coutendl;return 1;int analyze(string input)/分析输入的串是否符合标准/coutinput0input1input2input3endl;int len = input.length();/获得输入串长

6、度/coutlenendl;int flag=0;/char t;/char temp;for(int i=0;ilen;i+)if(inputlen-1!=i)&(inputlen-1!=)flag=1;break;/coutinputlen-1endl;switch(inputi)case (:if(i=0)else if(inputi-1=|+|*)elseflag=1;break;case ):if(inputi-1=i)else flag=1;break;case *:if(inputi-1=i|)/coutiflagendl;elseflag=1;break;case :if(in

7、puti-1=i|)/coutiflagendl;elseflag=1;break;case +:if(inputi-1=i|)/coutiflagendl;elseflag=1;break;case i:if(inputlen-1=i)flag=1;else/coutiflag输入的是正确的字符串!endl;break;default:/coutflagendl;flag=1;break;/int flag=0;if(flag=0)cout输入的是正确的句子!endl;return 1;elsecout输入的是错误的句子!endl;return 0;void process()/规约/cou

8、tsendl;/couttop;int row;/列int line;/行s+top=#;/input=i+i*(i+i);/coutinputendl;input=input+#;/coutinputendl;/char temp;int i=0;int k=0;int g;char a;/char nowchar;/+top;/stop=inputi;/coutstop-1endl;/coutinputiendl;/coutstopendl;int flag=0;char nowchar;/记录当前字符coutendl;cout栈优先关系当前符号剩余输入串移进或归约endl;nowchar

9、=input0;while(flag=0)/s2!=# /k+;if(stop=E)a=stop-1;elsea=stop;for(int n=0;n7;n+)/记录行if(a=VTn)line=n;for(n=0;n7;n+)/记录列if(nowchar=VTn)row=n;char compare;for(int m=0;m7;m+)for(n=0;n7;n+)if(line=m)&(row=n)compare=matrixmn;int j;/i=top;/cout*compare*endl;switch(compare)case :/cout;for(j=0;j=top;j+)couts

10、j;/couta;/coutlinerow;cout&stopacompare;/cout(栈);cout;coutinputi;for(j=strlen(s);jinput.length ();j+)coutinputj;cout移进;/10-strlen(s)s+top=inputi;/移进if(nowchar=#)elsenowchar=inputstrlen(s)-1;/coutnowchar;coutendl;/cout(剩余输入串)endl;/cout:/cout;for(j=0;j=top;j+)coutsj;/couta;/cout&stopa;cout;coutinputi;/cout;for(j=strlen(s);jinput.length ();j+)coutinputj;/coutendl;coutendl;if(stop=E)top=top-2;stop=E;else if(stop=)top=top-2;stop=E;elsestop=E;/归约/coutstop;/if(stop=E)|(stop=)/i+;if(nowchar=#)elsenowchar=inputstrlen(s)-1;cout归约endl;break;case =:if(stop-1=()top=top-1;/a=stop

温馨提示

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

评论

0/150

提交评论