基于C++设计与实现的算符优先分析器

一、实验目的及要求

1.1 目的

加深对语法分析器工作过程的理解;加强对算符优先分析法实现语法分析程序的掌握;能够采用一种编程语言实现简单的语法分析程序;能够使用自己编写的分析程序对简单的程序段进行语法翻译。

1.2 要求

对语法规则有明确的定义
编写的分析程序能够对实验一的结果进行正确的语法分析
对于遇到的语法错误,能够做出简单的错误处理,给出简单的错误提示,保证顺利完成语法分析过程
软件、硬件环境:code::blocks 10.05,win10系统

二、实验步骤

2.1 实验步骤

定义目标语言的语法规则
求解预测分析方法需要的符号集和分析表
输入将要进行分析的句子
根据预测分析的方法进行语法分析,直到源程序结束
对遇到的语法错误做出错误处理

2.2 文法定义

E->E*T
F->T
T->(E)
T->i

2.3 求出FIRSTVT和LASTVT

FIRSTVT	LASTVT
E	*  (   i	*   )   i
T	(   i	)   i

2.4 画出算符优先分析表

*	(	)	i	#
*	>	<	>	<	>
(	<	<	=	<	>
)	>		>		
i	>		>		>
# 	<	<		<	=

三、实验内容

# include<stdlib.h>
# include<stdio.h>
# include<string.h>
# include<iostream>
# define SIZE 128
char priority[6][6]={{0},{'>','>','<','<','>','>'},{'>','>','$','$','>','>'},{'<','<','<','<','=','$'},
{'>','>','$','$','>','>'},{'<','<','<','<','$','='}};
char input[SIZE];     
char remain[SIZE];    
char AnalyseStack[SIZE];  
int  testchar(char x),k;  
void remainString();    
int testchar(char x){int m;if(x=='+')  m=0;if(x=='*')  m=1;if(x=='i')  m=2;if(x=='(')  m=3;if(x==')')  m=4;if(x=='#')  m=5;return m;
}
void analyse(){int i,j,f,z,z1,n,n1,z2,n2;int count=0;char a;char p,Q,p1,p2;f=strlen(input);  for(i=0;i<=f;i++) {a=input[i];if(i==0)  remainString();if(AnalyseStack[k]=='+'||AnalyseStack[k]=='*'||AnalyseStack[k]=='i'||AnalyseStack[k]=='('||AnalyseStack[k]==')'||AnalyseStack[k]=='#')j=k;else  j=k-1;z=testchar(AnalyseStack[j]);if(a=='+'||a=='*'||a=='i'||a=='('||a==')'||a=='#')  n=testchar(a);else //如果句子含有不是终结符集合里的其它字符,不合法printf("错误!该句子不是该文法的合法句子!\n");  break;p=priority[z][n];if(p=='$'){printf("错误!该句子不是该文法的合法句子!\n");  return;}if(p=='>'){for( ; ; ){Q=AnalyseStack[j];if(AnalyseStack[j-1]=='+'||AnalyseStack[j-1]=='*'||AnalyseStack[j-1]=='i'||AnalyseStack[j-1]=='('||AnalyseStack[j-1]==')'||AnalyseStack[j-1]=='#')j=j-1;else  j=j-2;z1=testchar(AnalyseStack[j]);n1=testchar(Q);p1=priority[z1][n1];if(p1=='<') {count++;printf("(%d)     %s\t%10c\t%5c%17s\t    归约\n",count,AnalyseStack,p,a,remain);k=j+1;  i--;AnalyseStack[k]='N';  int r,r1;r=strlen(AnalyseStack);for(r1=k+1;r1<r;r1++)AnalyseStack[r1]='\0';break;}else  continue;}}else{if(p=='<'){ count++;printf("(%d)     %s\t%10c\t%5c%17s\t    移进\n",count,AnalyseStack,p,a,remain);k=k+1;AnalyseStack[k]=a;remainString();}else{if(p=='='){z2=testchar(AnalyseStack[j]);n2=testchar('#');  p2=priority[z2][n2];if(p2=='='){count++;printf("(%d)     %s\t%10c\t%5c%17s\t    接受\n",count,AnalyseStack,p,a,remain);printf("该句子是该文法的合法句子。\n");break;}else{count++;printf("(%d)     %s\t%10c\t%5c%17s\t    移进\n",count,AnalyseStack,p,a,remain);k=k+1;AnalyseStack[k]=a;  remainString();}}elseprintf("错误!该句子不是该文法的合法句子!\n");  break;}}}
}
void remainString(){int i,j;  i=strlen(remain);for(j=0;j<i;j++)  remain[j]=remain[j+1];remain[i-1]='\0';
}
int main(){printf("请输入要进行分析的句子(以#号结束输入):\n");gets(input);  k=0;printf("步骤    栈           优先关系    当前符号    剩余输入串   移进或归约\n");AnalyseStack[k]='#';  AnalyseStack[k+1]='\0';int length,i;   length=strlen(input);for(i=0;i<length;i++)  remain[i]=input[i];remain[i]='\0';  analyse();return 0;
}

四、实验结果

4.1 运行截图

4.png

五、实验总结

本次实验基本完成了实验题目的要求,定义了一个文法,求出了每一个非终结符的VT集和LASTVT集,画出了算符优先关系表,并判定出给定的文法是否是算符优先文法。当给定一个 句子时,能够判定是否是文法中的句子,并能够将分析过程打印出来。
这个实验最大的收获,不仅仅使我更进一步的了解到了算符优先算法是一个省略了所有单非终结符产生式对应的归约步骤,其分析效率是很高的,同时,通过此次实验让我的处理问题的能力,思考问题的角度都得到了很大的提高,从词法分析到语法分析再到语义分析,基本走完了编译器的大致流程,这对我理解编译的过程和具体的实现都是有极大的帮助的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/177754.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

五、nacos安装指南

Nacos安装指南 1.Windows安装 开发阶段采用单机安装即可。 1.1.下载安装包 在Nacos的GitHub页面&#xff0c;提供有下载链接&#xff0c;可以下载编译好的Nacos服务端或者源代码&#xff1a; GitHub主页&#xff1a;https://github.com/alibaba/nacos GitHub的Release下载…

性能测试 —— Jmeter接口处理不低于200次/秒-场景

需求&#xff1a;期望某个接口系统的处理能力不低于200次/秒&#xff0c;如何设计&#xff1f; ①这个场景是看服务器对某个接口的TPS值是否能大于等于200&#xff0c;就可以了&#xff1b; ②系统处理能力&#xff1a;说的就是我们性能测试中的TPS&#xff1b; ③只要设计一…

一文搞定以太网PHY、MAC及其通信接口

本文主要介绍以太网的 MAC 和 PHY&#xff0c;以及之间的 MII&#xff08;Media Independent Interface &#xff0c;媒体独立接口&#xff09;和 MII 的各种衍生版本——GMII、SGMII、RMII、RGMII等。 简介 从硬件的角度看&#xff0c;以太网接口电路主要由MAC&#xff08;M…

【Liunx】DHCP服务

【Liunx】DHCP服务 DHCP概述A.安装dhcpB.查看配置文件C.修改配置文件 DHCP概述 DHCP(Dynamic Host Configuration Protocol)i动态主机配置协议 DHCP是由Internet工作任务小组设计开发的&#xff0c;专门用于为TCP/IP网络中的计算机自动分配TCP/IP参数的协议。 口使用DHCP服务的…

【vue+amap】高德地图绘制多边形区域

参考文档&#xff1a; 高德地图参考手册 高德地图示例代码 1、高德地图控制台创建应用&#xff0c;获取权限ak 高德地图控制台 Ps.本项目里按钮等基础控件使用的是element-ui版本控件 2、项目内全局引入 index.html内引入高德地图代码&#xff1a; <script type"te…

使用手机作为电脑的麦克风和摄像头外设

工具 Iriun Iriun 电脑端安装&#xff1a;Iriun Android: Iriun 4K Webcam for PC and Mac - Apps on Google Play Apple: Iriun Webcam for PC and Mac on the App Store 基础功能免费&#xff0c;普通使用足够了。 付费功能&#xff1a; 使用 这里有介绍&#xff1a…

【ArcGIS处理】行政区划与流域区划间转化

【ArcGIS处理】行政区划与流域区划间转化 引言数据准备1、行政区划数据2、流域区划数据 ArcGIS详细处理步骤Step1&#xff1a;统计行政区划下子流域面积1、创建批量处理模型2、添加批量裁剪处理3、添加计算面积 Step2&#xff1a;根据子流域面积占比均化得到各行政区固定值 参考…

Android 摇一摇功能实现,重力加速度大于15

最近接到需求实现摇一摇需求&#xff0c;不过这个法律限制的很严格&#xff0c;属于敏感地带&#xff0c;实现后又被叫停了。 法律要求&#xff1a; 如果按照规定&#xff0c;操作时间不少于3s就基本没什么跳转了。 实现的话&#xff0c;只考虑了第一条&#xff0c;即&#…

太可怕啦!我在网上发了个贴,就被GPT-4推断出了个人隐私!GPT-4化身福尔摩斯

最近 GPT-4 被人发现了具有“福尔摩斯”一样的能力&#xff01; 可以仅仅通过帖子内容来推测出用户的隐私&#xff01; 瑞士苏黎世联邦理工学院的研究人员发现大语言模型可以对用户发在Reddit 帖子进行深度分析&#xff0c;并成功“猜测”出用户的年龄、地点、性别和收入等个…

Openssl X509 v3 AuthorityKeyIdentifier实验与逻辑分析

Openssl是X509的事实标准&#xff0c;目前主流OS或个别安全性要求较高的设计场景&#xff0c;对X509的证书链验证已经不在停留在只从数字签名校验了&#xff0c;也就是仅仅从公钥验签的角度&#xff0c;在这些场景中&#xff0c;往往还会校验AuthorityKeyIdentifier和SubjectKe…

2023年阿里云双11优惠活动,省钱攻略来了!

2023阿里云双11优惠活动开启了&#xff0c;轻量2核2G3M带宽服务器87元一年、2核4G4M带宽165元一年&#xff0c;云服务器ECS经济型e实例2核2G3M固定带宽优惠价格99元一年&#xff0c;新老用户同享&#xff0c;并且续费不涨价&#xff0c;第二年99元续费。阿里云个人和企业用户还…

抽象 I/O设备模型

I/O设备模型框架 RT-Thread提供了一套简单的I/O设备模型框架。 如图所示&#xff0c;它位于硬件和应用程序之间&#xff0c;共分成三层&#xff0c;从上到下分别是I/O设备管理层、设备驱动框架层、设备驱动层。 应用程序通过I/O设备管理接口获得正确的设备驱动&#xff0c;然…