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

下载本文档

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

文档简介

本文格式为Word版,下载可任意编辑——算符优先分析算法

设计一个算符优先分析器,理解优先分析方法的原理。重点和难点:本试验的重点是理解优先分析方法的原理;难点是如何构造算符优先关系。

数学与计算机学院编译原理试验报告

年级09软工学号姓名成绩专业软件工程试验地点主楼指导教师湛燕

试验项目算符优先关系算法试验日期2023.6.6

一、试验目的和要求

设计一个算符优先分析器,理解优先分析方法的原理。

重点和难点:本试验的重点是理解优先分析方法的原理;难点是如何构造算符优先关系。

二、试验内容

使用算符优先分析算法分析下面的文法:

E’→#E#

E→E+T|T

T→T*F|F

F→P^F|P

P→(E)|i

其中i可以看作是一个终结符,无需作词法分析。具体要求如下:

1、假使输入符号串为正确句子,显示分析步骤,包括分析栈中的内容、优先关系、输入符号串的变化状况;

2、假使输入符号串不是正确句子,则指示出错位置。

三、程序设计

全局变量有一下几个:

staticstringinput;//记录输入串

chars[20];//栈

inttop=-1;//栈顶指针

有三个函数:

intanalyze(stringinput);//分析输入的串是否符合标准

voidprocess();//进行归约的函数

intmain()

input是一个全局变量,记录输入串,用analyze(input)分析输入的是不是符合标准的字符串,(例如“i+i*i^(i+i)〞)假使不符合标准,提醒用户重新输入。

进行归约的函数主要思想是:先构造优先关系矩阵,有“〞,“〞,“=〞和空格四种关系。Chara记录栈中最高位的终结符,假使栈中是#E+E,则a的赋

设计一个算符优先分析器,理解优先分析方法的原理。重点和难点:本试验的重点是理解优先分析方法的原理;难点是如何构造算符优先关系。

值是“+〞,假使形如“#E+〞或“#E+i〞则a赋值“+〞或“i〞。charnowchar记录当前的字符。a与nowchar依照算符优先关系矩阵找出优先关系。假使优先关系是“〞,则进行移进;假使优先关系是“〞,则进行归约;假使是“=〞,则去掉括号或分析成功。

五、代码和截图

自己编写代码如下:

#includeiostream

#includestring

usingnamespacestd;

staticstringinput;//输入串

chars[20];//栈

inttop=-1;//栈顶指针

charVT[7]={'+','*','^','i','(',')','#'};//终结符

staticcharmatrix[7][7]={

'','','','','','','',

'','','','','','','',

'','','','','','','',

'','','','','','','',

'','','','','','=','',

'','','','','','','',

'','','','','','','='};//优先关系矩阵,不存在优先关系时为空格

intanalyze(stringinput);//分析输入的串是否符合标准

voidprocess();//规约

intmain()

{

//cout输入一个符号串!endl;

intflag=1;

while(flag==1)

{

cout输入一个符号串!endl;

cininput;

if(analyze(input)==0)

flag=1;

else

flag=0;

}

cout**********************************************************

设计一个算符优先分析器,理解优先分析方法的原理。重点和难点:本试验的重点是理解优先分析方法的原理;难点是如何构造算符优先关系。

*endl;

cout表达式文法算符优先关系表endl;

coutendl;

for(inti=0;i8;i++)

{

coutVT[i];

}

coutendl;

coutendl;

for(i=0;i7;i++)

{

coutVT[i];

for(intj=0;j7;j++)

{

cout;

coutmatrix[i][j];

}

coutendl;

}

//coutendl;

cout***********************************************************endl;

cout对输入串input的算符优先分析过程如下:endl;process();

coutendl;

//cout栈优先关系当前符号剩余输入串移进或规约endl;

coutendl;

coutendl;

coutendl;

return1;

}

intanalyze(stringinput)//分析输入的串是否符合标准

{

//coutinput[0]input[1]input[2]input[3]endl;intlen=input.length();//获得输入串长度

//coutlenendl;

intflag=0;

//chart;//

//chartemp;

for(inti=0;ilen;i++)

{

设计一个算符优先分析器,理解优先分析方法的原理。重点和难点:本试验的重点是理解优先分析方法的原理;难点是如何构造算符优先关系。

if((input[len-1]!='i')(input[len-1]!=')')){flag=1;break;}//coutinput[len-1]endl;switch(input[i]){case'(':if(i==0){}elseif(input[i-1]=='^'||'+'||'*'){}elseflag=1;break;case')':if(input[i-1]=='i'){}elseflag=1;break;case'*':if(input[i-1]=='i'||')'){}//coutiflagendl;elseflag=1;break;case'^':if(input[i-1]=='i'||')'){}//coutiflagendl;elseflag=1;break;case'+':if(input[i-1]=='i'||')'){}//coutiflagendl;elseflag=1;break;case'i':{if(input[len-1]=='i')flag=1;else{}

设计一个算符优先分析器,理解优先分析方法的原理。重点和难点:本试验的重点是理解优先分析方法的原理;难点是如何构造算符优先关系。

}//coutiflag输入的是正确的字符串!endl;break;

default:

//coutflagendl;

flag=1;

break;

}

}

//intflag=0;

if(flag==0)

{cout输入的是正确的句子!endl;return1;}

else

{cout输入的是错误的句子!endl;return0;}

}

voidprocess()//规约

{

//coutsendl;

//couttop;

introw;//列

intline;//行

s[++top]='#';

//input=i+i*(i+i);//coutinputendl;

input=input+'#';//

//coutinputendl;

//chartemp;

inti=0;

intk=0;

intg;

chara;

//charnowchar;

//++top;

//s[top]=input[i];

//couts[top-1]endl;

//coutinput[i]endl;

//couts[top]endl;

intflag=0;

charnowchar;//记录当前字符

coutendl;

cout栈优先关系当前符号剩余输入串进或归约endl;

nowchar=input[0];

while(flag==0)//s[2]!='#'移

设计一个算符优先分析器,理解优先分析方法的原理。重点和难点:本试验的重点是理解优先分析方法的原理;难点是如何构造算符优先关系。

{//k++;

if(s[top]=='E')

a=s[top-1];

else

a=s[top];

for(intn=0;n7;n++)//记录行

{

if(a==VT[n])

line=n;

}

for(n=0;n7;n++)//记录列

{

if(nowchar==VT[n])

row=n;

}

charcompare;

for(intm=0;m7;m++)

for(n=0;n7;n++)

{

if((line==m)(row==n))

compare=matrix[m][n];

}

intj;

//i=top;

///cout******compare******endl;

switch(compare)

{

case'':

{

//cout;

for(j=0;j=top;j++)

couts[j];//cout@a;//coutlinerow;couts[top]acompare;

//cout(栈);

cout;

coutinput[i];

for(j=strlen(s);jinput.length();j++)

coutinput[j];

cout移进;//10-strlen(s)

s[++top]=input[i];//移进

if(nowchar=='#')

设计一个算符优先分析器,理解优先分析方法的原理。重点和难点:本试验的重点是理解优先分析方法的原理;难点是如何构造算符优先关系。

{}elsenowchar=input[strlen(s)-1];//coutnowchar;coutendl;//cout(剩余输入串)endl;//coutendl;i++;break;}case''://cout;for(j=0;j=top;j++)couts[j];//cout@a;///couts[top]a;cout;coutinput[i];//cout;for(j=strlen(s);jinput.length();j++)coutinput[j];//coutendl;coutendl;if(s[top]=='E'){top=top-2;s[top]='E';}elseif(s[top]==')'){top=top-2;s[top]='E';}elses[top]='E';//归约//couts[top];//if((s[top]=='E')||(s[top]==')'))//i++;if(nowchar=='#'){}elsenowchar=input[strlen(s)-1];cout归约endl;break;case'=':if(s[top-1]=='('

温馨提示

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

评论

0/150

提交评论