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

下载本文档

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

文档简介

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

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

3、。Char a记录栈中最高位的终结符,如果栈中是 #E+E,则a的赋 值是“ +”,如果形如“ #E+” 或“ #E+i ”则 a 赋值“ +” 或 “i”。charnowchar 记录当前的字符。 a 与 nowchar 按照算符优先关系矩阵找出优先关系。如果优 先关系是“ <” ,则进行移进 ;如果优先关系是“ >” ,则进行归约;如果是“ =”, 则去掉括号或分析成功。五、代码和截图自己编写代码如下:#include <iostream>#include <string>using namespace std;static string input;/

4、输入串char s20;/栈int top=-1;/栈顶指针char VT7='+',fi','(',')',#;终结符static char matrix77='>','<','<','<','<','>','>','>','>','<','<','<','>&#

5、39;,'>','>','>','<','<','<','>','>','>','>','>',' ',' ','>','>','<','<','<','<','<',&#

6、39;=',' ','>','>','>',' ',' ','>','>','<','<','<','<','<',' ','=' / 优先关系矩阵,不存在优先关系时为 空格int analyze(string input);/分析输入的串是否符合标准void process();/ 规约i

7、nt main()/cout<<" 输入一个符号串! "<<endl;int flag=1;while(flag=1)cout<<" 输入一个符号串! "<<endl;cin>>input;if(analyze(input)=0)flag=1;elseflag=0;cout<<"*"<<endl;cout<<" 表达式文法算符优先关系表 "<<endl; cout<<endl;for(inti=0

8、;i<8;i+)cout<<" "<<VTi; cout<<endl; cout<<endl; for(i=0;i<7;i+) cout<<VTi; for(int j=0;j<7;j+)cout<<" " cout<<matrixij; cout<<endl;/cout<<<<endl; cout<<"*"<< endl;cout<<" 对输入串 &q

9、uot;<<input<<" 的算符优先分析过程如下: "<<endl; process();cout<<""<<endl;剩余输/cout<<" 栈"<<" 优先关系 "<<" 当前符号 "<<" 入串"<<"移进或规约 "<<endl;cout<<""<<endl; cout&l

10、t;<""<<endl; cout<<""<<endl;return 1;int analyze(string input)/ 分析输入的串是否符合标准 /cout<<input0<<input1<<input2<<input3<<endl;intlen = input.length();/获得输入串长度/cout<<len<<endl;int flag=0;/char t;/char temp; for(inti=0;i<

11、len;i+)if(inputlen-1!='i')&&(inputlen-1!=')') flag=1;break;/cout<<inputlen-1<<endl; switch(inputi) case '(': if(i=0)else if(in puti-1='A'|'+'|'*')else flag=1; break; case ')': if(inputi-1='i')else flag=1; break;if(in

12、puti-1='i'|')')/cout<<i<<flag<<endl;else flag=1;break;case'A'-if(inputi-1='i'|')')/cout<<i<<flag<<endl;elseflag=1; break; case '+':if(inputi-1='i'|')')/cout<<i<<flag<<endl;elseflag=1

13、;break;case 'i':if(inputlen-1='i') flag=1;else/cout<<i<<flag<<" 输入的是正确的字符串! "<<endl; break;default:/cout<<flag<<endl;flag=1; break;/int flag=0;if(flag=0)cout<<" 输入的是正确的句子! "<<endl;return 1;elsecout<<" 输入的是

14、错误的句子! "<<endl;return 0; void process()/ 规约/cout<<s<<endl; /cout<<top;int row;/ 列 int line;/ 行 s+top='#'/input="i+i*(i+i)"/cout<<input<<endl; input=input+'#'/cout<<input<<endl;/char temp; inti=0; int k=0; int g; char a;/c

15、har nowchar; /+top;/stop=inputi; /cout<<stop-1<<endl;/cout<<inputi<<endl; /cout<<stop<<endl;int flag=0;char nowchar;/ 记录当前字符 cout<<endl;移进或归cout<<" 栈"<<" 优先关系 "<<" 当前符号 "<<" 剩余输入串 "<<"

16、; 约"<<e ndl;nowchar=input0; while(flag=0)/s2!='#' /k+; if(stop='E')a=stop-1;elsea=stop;for(int n=0;n<7;n+)/ 记录行 if(a=VTn) line=n;for(n=0;n<7;n+)/ 记录列 if(nowchar=VTn) row=n;char compare;for(int m=0;m<7;m+) for(n=0;n<7;n+) if(line=m)&&(row=n) compare=matr

17、ixmn;int j;/i=top;/cout<<"*"<<compare<<"*"<<endl; switch(compare)case '<':/cout<<" " for(j=0;j<=top;j+) cout<<sj;/cout<<""<<a;/cout<<line<<row;cout<<"&&&"<

18、<stop<<a<<c ompare;/cout<<"( 栈)"cout<<" <"cout<<" "<<inputi<<" " for(j=strlen(s);j<input.length ();j+) cout<<inputj;cout<<"移进 "/<<10-strlen(s)s+top=inputi;/ 移进 if(nowchar='#'

19、;)else nowchar=inputstrlen(s)-1;/cout<<nowchar; cout<<endl;/cout<<"( 剩余输入串 )"<<endl;/cout<<endl; i+;break; case '>':/cout<<" " for(j=0;j<=top;j+) cout<<sj;/cout<<""<<a;/cout<<"&&&

20、"<<stop<<a; cout<<" >"cout<<" "<<inputi<<" "/cout<<" " for(j=strlen(s);j<input.length ();j+) cout<<inputj;/cout<<" "<<endl;cout<<endl; if(stop='E') top=top-2; stop=&

21、#39;E'else if(stop=')') top=top-2; stop='E' elsestop='E'/ 归约/cout<<stop;/if(stop='E')|(stop=')')/i+; if(nowchar='#') else nowchar=inputstrlen(s)-1; cout<<"归约 "<<endl;break;case '=': if(stop-1='(') top=top-1;a=stop;stop='E'no wchar='#'if(stop-1='(')/ /no wchar='#'/ elsecout<<"规约成功"<<endl;cout<&l

温馨提示

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

评论

0/150

提交评论