【算符优先分析器设计实验报告--宁剑】 算符优先分析
时间:2020-07-25 12:50:38 来源:天一资源网 本文已影响 人
精品文档
装订线
装
订
线
编译原理实验报告
题目: 算符优先分析法分析器
学 院 计算机科学与技术
专 业 xxxxxxxxxxxxxxxx
学 号 xxxxxxxxxxxx
姓 名 宁剑
指导教师 xxxx
2015年xx月xx日
算符优先分析法分析器
一、实验目的?
1.理解自底向上优先分析,比较和自顶向下优先分析的不同。
2.理解算符优先分析的特点,体会其和简单优先分析方法的不同。
3.加深对编译器语法分析的理解。
二、实验原理?
1.自底向上优先分析方法,也称移进-归约分析,粗略地说它的思想是对输入符号串自左向右进行扫描,并将输入符号逐个移入一个后进先出栈,边移入边分析,一旦栈顶符号串形成某个句型的句柄或可归约串时,就将该产生式的左部非终极符代替相应的右边文法符号串。
2.算符优先分析法的基本思想
首先确定算符(确切地说是终结符)之间的优先关系和结合性质,然后借助这种关系,比较相邻算符之间的优先级来确定句型的可归约串,并进行归约。
注意:算符优先分析过程是自下而上的归约过程,但它的可归约串未必是句柄,也就是说,算符优先分析过程不是一种规范归约。
3.终结符号间优先关系的确定,用FIRSTVT和LASTVT计算。
4.最左素短语
所谓素短语是指这样一个短语,它至少含有一个终结符,并且除它自身之外不再含有其它素短语。最左素短语是指处于句型最左边的那个素短语。最左素短语是算符优先分析算法的可归约串。
5.计算得到所给文法的算符优先矩阵
6.算符优先分析的基本过程
三、实验要求
使用算符优先分析算法分析下面的文法:
E’→#E#
E→E+T|T
T→T*F|F
F→P^F|P
P→(E)|i
其中i可以看作是一个终结符,无需作词法分析。具体要求如下:
1.如果输入符号串为正确句子,显示分析步骤,包括分析栈中的内容、优先关系、输入符号串的变化情况;
2.如果输入符号串不是正确句子,则指示出错位置。
四、实验结果(程序)及分析
#include <stdio.h>
#include <cstring>
#include <iostream>
#include <iomanip>
#define MAX 100
using namespace std;
char S[MAX];
char shuru[MAX],yu[MAX];
void scanner();
int panyouxian(char x);
void shengyuchuan();
int k;
char youxian[7][7]=
{
{'>','<','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','<','<','<','>','>'},
{'>','>','>','$','$','>','>'},
{'<','<','<','<','<','=','$'},
{'>','>','>','$','$','>','>'},
{'<','<','<','<','<','$','='},
}; //优先关系表,其中>为大于,<为小于,=为等于,$为空格
int main()
{
int l,j;
cout<<"请输入一个字符串:";
cin.get(shuru,MAX); //将输入的字符串存到数组
cout<<"步骤 栈 优先关系 当前符号 剩余输入串 移进或归约"<<endl;
k=0;
S[k]='#';
S[k+1]='\0';
l=strlen(shuru); //求输入字符串的长度
for(j=0;j<l;j++)
yu[j]=shuru[j];
yu[j]='\0';
scanner();
return 0;
}
void scanner() //扫描分析输入串
{
int i,j,l,h1,l1,h2,l2,h3,l3,y1,y2,r1,r2;
int step=0;//分析步骤数
char a; //存放正在分析的字符
char p1,Q,p2;
l=strlen(shuru); //算出输入串长度
for(i=0;i<l;i++)
{
a=shuru[i];
if(S[k]=='+'||S[k]=='*'||S[k]=='^'||S[k]=='i'||S[k]=='('||S[k]==')'||S[k]=='#')
j=k;
else
j=k-1;
h1=panyouxian(S[j]);// 从优先关系表中查出S[j]和a的优先关系
if(a=='+'||a=='*'||a=='^'||a=='i'||a=='('||a==')'||a=='#')
l1=panyouxian(a);
else //如果句子含有不是终结符集合里的其它字符,不合法
{
cout<<"错误!不合法的句子!"<<endl;
break;
}
p1=youxian[h1][l1];
if(p1=='>')
{
loop:
Q=S[j];
if(S[j-1]=='+'||S[j-1]=='*'||S[j-1]=='^'||S[j-1]=='i'||S[j-1]=='('||S[j-1]==')'||S[j-1]=='#')
j=j-1;
else
j=j-2;
h2=panyouxian(S[j]);
l2=panyouxian(Q);
p1=youxian[h2][l2];
if(p1=='<') //S[j+1]…S[k]归约为F
{
k=j+1;
shengyuchuan();
step++;
cout<<left<<"("<<step<<setw(6)<<")"<<setw(10)<<S<<setw(10)<<p1<<setw(10)<<a<<setw(5)<<right<<yu<<setw(15)<<"归约"<<endl;
i--;
S[k]='F';
r1=strlen(S);
for(r2=k+1;r2<r2;r2++)
S[r2]='\0';//多个字符归约,把栈顶后面的舍弃
y1=strlen(yu);
for(y2=0;y2<y1;y2++)
yu[y1-y2]=yu[y1-y2-1];
yu[0]='i';
}
else
goto
loop;
}
else
{
if(p1=='<') //移进如果上一步是不归约,剩余的字符串减少一个
{
shengyuchuan();
shuru[l]='\0';
step=step+1;
cout<<left<<"("<<step<<setw(6)<<")"<<setw(10)<<S<<setw(10)<<p1<<setw(10)<<a<<setw(5)<<right<<yu<<setw(15)<<"移近"<<endl;
k=k+1;
S[k]=a;
}
else
{
if(p1=='=')
{
h3=panyouxian(S[j]);
l3=panyouxian('#');
p2=youxian[h3][l3];
if(p2=='=')
{
shengyuchuan();
step++;
cout<<left<<"("<<step<<setw(6)<<")"<<setw(10)<<S<<setw(10)<<p1<<setw(10)<<a<<setw(5)<<right<<yu<<setw(15)<<"接受"<<endl;
cout<<"合法的句子!"<<endl;;
break;
}
else
{
k=k+1;
S[k]=a;
}
}
else
{
cout<<"出错!"<<endl;
break;
}
}
}
}
}
void shengyuchuan()
{
int i,j;
i=strlen(yu);
for(j=0;j<i;j++)
yu[j]=yu[j+1];
yu[i-1]='\0';
}
int panyouxian(char x)
{
int m;
switch(x)
{
case'+':
m=0;
break;
case'*':
m=1;
break;
case'^':
m=2;
break;
case'i':
m=3;
break;
case'(':
m=4;
break;
case')':
m=5;break;
case'#':
m=6;
break;
}
return m;
}
输入的程序界面如图:
输入一个正确的句子,结果如下:
输入一个错误的句子,提示为不合法的句子:
售后服务方案(赠送)
1.售后服务概述
公司长期以来一直致力于提供高质量、完善的支持服务,确保用户的系统稳定运行。
公司拥有一批资深的施工人员,具有丰富的经验,能够很好的解决设备各类故障,强大的用户支持队伍和良好的用户满意度是我们的一大优势。
维护计划及承诺
?一、 项目售后服务内容承诺
我公司贯彻执行:“诚信正直、成就客户、完善自我、追求卓越”的宗旨,对于已经竣工、验收合格的项目进行质量跟踪服务,本着技术精益求精的精神,向用户奉献一流的技术和一流的维护服务。
我公司如果承接了端拾器项目,将严格遵循标书及合同的规定,在保证期内向业主提供该项目的责任和义务。在保修期之后,考虑到设备维护的连续性,建议业主与我公司签订维护合同,以确保此系统项目的正常运行所必需的技术支持和管理支持。
二、 服务与保证期
?在项目验收合格之日起,开始进行售后服务工作,包括以下几个方面:
1、售后服务期; ?2、维护人员; 3、售后服务项目; 4、服务响应时间。
? 三、 售后服务期
? 在项目验收合格之日起,即进入了售后服务期。
售后服务期=质量保证期+质量维护期
? 质量保证期:在质量保证期内,如因质量问题造成的故障,实行免费更换设备、元器件及材料。如因非质量因素造成的故障,收取更换设备、元器件及材料成本费。
质量维护期:在质量保证期之后,即自行进入质量维护期。
我方对所承担端拾器项目提供终身质量维护服务,以不高于本合同设备单价的优惠价格提供所需更换的元器件及材料,另收维护人员工本费。
四、 具体措施承诺
? 1、首先在签订项目合同的同时与客户签订售后服务保证协议书,排除客户的后顾之忧,对客户做出实事求是的、客观的承诺。
2、对已经验收合格交付用户的端拾器项目,在合同期内与用户进行联系,记录用户使用情况,系统运行状况等进行质量跟踪调查,变被动服务为主动服务。
3、对已交工的端拾器项目建立系统运行档案,并进行质量跟踪。
4、系统运行档案记录其端拾器项目运行情况、各类设备使用情况、操作人员操作水平情况及人员流动情况。
5、针对各用户单位操作人员出现的代表性问题,定期对操作人员进行技术培训或到现场培训及指导。
6、正在使用中的系统、设备出现故障时,公司维修服务人员接到报告后及时赴现场处理、维修。
7、对于运行时间较长的端拾器项目,公司维修服务人员定期与客户进行联系询问情况,定期到客户方进行巡视、检查,并做出记录,记录归档保存。
8、施工保证
将选派具有丰富经验的技术人员负责端拾器项目具体施工,保证安装质量及系统使用功能,并保证整个系统运行平稳、高效、可靠。
9、系统保修
作为项目承包单位,我公司将严格遵循招标文件及合同的规定,向业主提供端拾器项目最终验收合格之日起,在保质期范围内免费维修。
10、保修期内设备损坏,经鉴定为设备本身原因造成的故障,我方负责免费维修或者更换;同时负责在保修期内定期对设备提供保养维护服务。
总之,为使业主使用放心、使用方便、保证端拾器项目正常运行,公司全体技术、维护人员本着客户第一的原则,全心全意地为客户着想,全力以赴的进行工作,让我们共同携手,为创造美好的明天而努力工作。
五、保修服务内容及范围
我公司将为所承担的各个端拾器项目提供保修服务,有效期从项目验收后,业主在竣工报告上签字之日起。
1、 响应时间:具体的响应时间将按故障级别划分;
2、 维修地点:用户现场。
我公司负责实施的所有系统项目,在正常环境下做适当使用时所发生的故障,我公司将提供约定保修服务。非当前故障,我公司安排提供服务,但需按收费标准另收费用。
我公司的保修服务仅限于经我公司认定的合格产品。所谓不合格的产品包括:非经我公司供应的产品、非经我公司认定合格的产品及顾客不允许我公司做功能改进的产品。
下列情况所发生的系统损害不包括在保修服务范围内:
1、 使用不适当的工具进行系统维护时造成的系统设备损坏;
2、 现场环境不符合我公司建议的规范;
3、 意外、自然灾害、疏忽及不当使用、战争、暴动、罢工、雷击或电力故障、顾客搬运不当的损坏,经由非我公司人员或其授权的子承包商对系统进行修改和变动;
4.设备的维护和信息处理方式。
六、 系统维护
1、系统运行管理工作
为了保证系统能够长时间的正常运行,我们将进行完善的系统培训,同时制定各个系统项目操作规程,并配合业主制定操作人员责任界面及合理的交接班制度。
2、系统维护保养
我公司的售后服务人员在维护期内将对贵方的系统项目提供服务,使它们保持良好的运行状态。
? 3、月度保养
? 坚持月度维护保养,保证每个系统项目机械装置保持最佳工作状态。
七、维护及服务支持措施
1、电话支持服务
电话服务热线号码以我方提供给业主的号码为准(包括电话和传真号码)。如有更改,我方至少在自更改之日起3天内以电子邮件、传真、电话的方式通知业主。
2、现场排除故障或技术指导
我方在接到业主的电话支持服务请求后,如果不能通过电话支持服务解决设备或产品发生的技术故障,且经双方商议确认需要进行现场支持的情况下,我方将派专业项目技术人员及时前往现场协助业主排除故障。
3、电话咨询服务
对业主在使用设备或产品过程中产生的非故障类问题,我方提供电话咨询服务。
4、投诉受理服务
我方在公司设有用户投诉电话
相关关键词: 分析器