基于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();
                    }
                }
                else
                    printf("错误!该句子不是该文法的合法句子!\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集,画出了算符优先关系表,并判定出给定的文法是否是算符优先文法。当给定一个 句子时,能够判定是否是文法中的句子,并能够将分析过程打印出来。
这个实验最大的收获,不仅仅使我更进一步的了解到了算符优先算法是一个省略了所有单非终结符产生式对应的归约步骤,其分析效率是很高的,同时,通过此次实验让我的处理问题的能力,思考问题的角度都得到了很大的提高,从词法分析到语法分析再到语义分析,基本走完了编译器的大致流程,这对我理解编译的过程和具体的实现都是有极大的帮助的。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

单链表OJ题目——C语言

本篇博客并非提供完整解题思路代码&#xff0c;而是重点阐述在OJ的链表题目中容易被忽视的点&#xff0c;从而让部分读者在出错百思不得解的情况下能快速发现自己的漏洞&#xff0c;高效查缺补漏&#xff0c;本博客支持读者按题搜索&#xff0c;同时也支持读者根据博客内容自行…

安装pr缺少wmvcore.dll的解决方法,分享4个有效的方法

在当今数字化时代&#xff0c;计算机软件在我们的生活中扮演着重要的角色。然而&#xff0c;有时候我们可能会遇到一些软件问题&#xff0c;其中之一就是缺少某个关键的动态链接库文件。在这篇文章中&#xff0c;我将分享关于如何解决Adobe Premiere Pro&#xff08;PR&#xf…

【官宣】守护四年,“惠医保”暖心回归!

11月13日&#xff0c;惠州参保人专属的城市定制型商业健康险——“惠医保2024”正式升级上线&#xff0c;面向全市基本医保参保人开放参保&#xff0c;超200万保障&#xff0c;150元/人/年起&#xff01; 惠州市医疗保障局、惠州市卫生健康局、惠州市金融工作局及国家金融监督…

c#桥接模式详解

基础介绍&#xff1a; 将抽象部分与它的实现部分分离&#xff0c;使它们都可以独立地变化。适用于不希望在抽象和实现部分之间有固定的绑定关系的情况&#xff0c;或者类的抽象以及它的实现都应该可以通过生成子类的方法加以扩充的情况。 将抽象部分与实现部分分离&#xff0c;…

C语言中自己实现了一个排序为什么会比 qsort 的速度慢几十倍不止

C语言中自己实现了一个排序&#xff0c;为什么会比 qsort 的速度慢几十倍不止? 讲到算法&#xff0c;有一个非常重要的前置知识叫时间复杂度&#xff0c;脱离了这个讲算法的优劣是没什么意义的。这个概念主要是指&#xff0c;你数据量的增加&#xff0c;会让算法的处理时间增加…

mini型光学3D表面轮廓仪,上车即走,上桌即用!

“小身材&#xff0c;大作用”——一个简单的比喻&#xff0c;恰当地总结了SuperView WM100光学3D表面轮廓仪的特点。mini型光学3D表面轮廓仪SuperView WM100&#xff0c;回应了市场对小型化、便携式光学3D表面轮廓仪的需求。 轻便的机身&#xff0c;简约的设计——没有控制箱…

element el-upload上传功能

2023.11.14今天我学习了如何使用el-upload: <!--drag设置可拖动--><!--accept".xlsx"设置上传的文件类型--><!--:limit1上传文件的最大个数--><!--:auto-upload"false"是否在选取后直接上传--><!--:before-upload"beforeU…

cout的输出整数格式

cout默认以十进制格式显示整数 cout << oct和cout << hex不会显示出来&#xff0c;而只是修改cout显示整数的方式 使用std::hex和std::oct时&#xff0c;可以将hex和oct当做变量名&#xff0c;否则不可以 #include<iostream>int main() {int a;std::cout &l…

高并发场景下,如何设计订单库存架构,一共9个关键性问题

库存系统可以分为实物库存和虚拟库存两种类型。实物库存的管理涉及到采购、存储、销售和库存轮换等复杂的活动&#xff0c;需要进行供应链管理和仓库管理等工作。相比之下&#xff0c;虚拟库存的管理相对简单&#xff0c;主要适用于线上资源的数量管理&#xff0c;包括各类虚拟…

安装部署Esxi7.0并创建虚拟机

1. Esxi介绍 ESXI虚拟平台是VMware出品的一个强大平台&#xff0c;它可以直接安装在物理机上&#xff0c;从而充分利用物理奖性能&#xff0c;虚拟多个系统出来。ESXI是一个带WEB管理后台的软件&#xff0c;非常适合安装在服务器上&#xff0c;然后直接通过网页进行远程管理。…

发布自研大模型 夸克App将迎来全面升级

国产大模型阵营再添新锐选手。11月14日&#xff0c;阿里巴巴智能信息事业群发布全栈自研、千亿级参数的夸克大模型&#xff0c;将应用于通用搜索、医疗健康、教育学习、职场办公等众多场景。夸克App将借助自研大模型全面升级&#xff0c;加速迈向年轻人工作、学习、生活的AI助手…

分享一下微信会员充值管理系统怎么做

在当今数字化时代&#xff0c;微信作为中国最流行的社交平台&#xff0c;其功能已经从简单的沟通交流扩展到了生活的方方面面。微信会员充值管理系统就是其中之一&#xff0c;它为商家提供了一个高效、便捷的充值体验&#xff0c;同时也为用户提供了更加个性化的服务。本文将详…

操作系统——死锁(一文详解死锁,死锁产生的原因和死锁的解决方案)

1、什么是死锁&#xff1f;死锁产生的条件&#xff1f; 1.1、什么是死锁&#xff1f; 答&#xff1a; 在两个或者多个并发进程中&#xff0c;如果每个进程持有某种资源而又等待其它进程释放它或它们现在保持着的资源&#xff0c;在未改变这种状态之前都不能向前推进&#xff…

22款奔驰C260L升级小柏林音响 全新15个扬声器 提升音乐效果

奔驰新款C级号称奔驰轿车的小“S”&#xff0c;在配置方面上肯定也不能低的&#xff0c;提了一台低配的车型&#xff0c;通过后期升级加装件配置提升更高档次&#xff0c;打造独一无二的奔驰C级&#xff0c;此次来安排一套小柏林之声音响&#xff0c;效果怎么样&#xff0c;我们…

bclinux aarch64 ceph 14.2.10 对象存储 http网关 CEPH OBJECT GATEWAY Civetweb

相关内容 bclinux aarch64 ceph 14.2.10 文件存储 Ceph File System, 需要部署mds&#xff1a; ceph-deploy mds-CSDN博客 ceph-deploy bclinux aarch64 ceph 14.2.10【3】vdbench fsd 文件系统测试-CSDN博客 ceph-deploy bclinux aarch64 ceph 14.2.10【2】vdbench rbd 块设…

独立站邮件营销大佬,手把手教你如何做好!

做独立站邮件营销的方式&#xff1f;独立站怎么做邮件营销&#xff1f; 邮件营销&#xff0c;作为独立站营销的重要手段之一&#xff0c;越来越受到卖家的重视。如何才能做好邮件营销呢&#xff1f;蜂邮EDM将手把手教你如何做好独立站邮件营销&#xff0c;让你在电商领域中更上…

银行转账p图手机软件,实现回执单截图生成,用Swing或JavaFX实现

其实总体用了很少的代码&#xff0c;就是模版图框架代码实现&#xff0c;模版也是网上的&#xff0c;非常多总体实现的原理还是绘图功能&#xff0c;捕捉用户输入。 用户界面 (UI): 我们可以使用Swing或JavaFX来创建一个窗口界面&#xff0c;允许用户输入所需的信息。 数据处理…

Sui上TVL突破1.28亿美金,浅谈DeFi续创新高背后的基础知识

根据财富商业洞察研究&#xff0c;DeFi市场预计从2022年的555.8亿美元增长到2030年的3370.4亿美元。推动这一增长的活动包括对token的交易、借贷和借款&#xff0c;这通常是点对点的&#xff0c;无需传统金融机构的参与。随着Sui网络于今年五月份启动主网和其SUI token&#xf…

MCU常见通信总线串讲(五)—— CAN总线协议

&#x1f64c;秋名山码民的主页 &#x1f602;oi退役选手&#xff0c;Java、大数据、单片机、IoT均有所涉猎&#xff0c;热爱技术&#xff0c;技术无罪 &#x1f389;欢迎关注&#x1f50e;点赞&#x1f44d;收藏⭐️留言&#x1f4dd; 获取源码&#xff0c;添加WX 目录 前言一…

【原创】java+swing+mysql车辆维修管理系统设计与实现

摘要&#xff1a; 车辆维修管理系统是一个用于管理和追踪车辆维修过程的系统&#xff0c;它能够提高效率&#xff0c;减少错误&#xff0c;并提供详细的车辆历史记录&#xff0c;可以帮助车辆维修企业实现信息化管理&#xff0c;提高工作效率和客户满意度&#xff0c;降低运营…