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

news2024/11/16 13:38:24

一、实验目的及要求

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

小DEMO:css制作圆滑梯形按钮

代码&#xff1a; <div class"pull-btn-box"><div class"pull-btn"><svg width"12" height"12"><path d"M0 0 L6 11 L12 0" stroke"#A6A6A6" stroke-width"2" fill"none&qu…

彩票双色球预测工具1.0

搏一搏 单车变跑车 祝各位开出大奖&#xff01;&#xff01; 后续会持续更新&#xff0c;欢迎关注&#x1f44f; from random import randintdef gener_blue_ball():return randint(0, 33)def gener_blue_ball_s():blue_ball_set set()while True:if len(blue_ball_set) 6:b…

Git笔记简化版

起源 Git是目前世界上最先进的分布式版本控制系统。林纳斯-托瓦兹在开发linux系统时有很多人想有一个平台进行版本控制。当时同类型的版本控制软件是BitKeeper&#xff0c;bitKeep是不开源的。当林纳斯团队无法免费使用它时&#xff0c; 林纳斯花费了一个月左右时间就开发出了…

springboot单体项目部署

配置类 检查跨域配置类 检查黑白名单是否有问题&#xff0c;是否需要更改 配置文件 检查端口 查看端口是否为需要搭建的端口 检查数据源 查看数据库是否为线上数据库 配置页面 注意&#xff1a;如果是单体项目的话&#xff0c;前端页面是和后端整合在一起的&#xff0…

springboot整合vue2实现简单的新增删除,整合ECharts实现图表渲染

先看效果图&#xff1a; 1.后端接口 // 查询所有商品信息 // CrossOrigin(origins "*")RequestMapping("/list1")ResponseBodypublic List<Goodsinfo> list1(){List<Goodsinfo> list goodsService.list();return list;}// 删除 // …

普通测径仪升级的智能测径仪 增添11大实用功能!

普通测径仪能对各种钢材进行非接触式的外径及椭圆度在线检测&#xff0c;测量数据准确且无损&#xff0c;可测、监测、超差提示、系统分析等。在此基础上&#xff0c;为测径仪进行了进一步升级制成智能测径仪&#xff0c;为其增添更多智能化模块&#xff0c;让其使用更加方便。…

mac下vue-cli从2.9.6升级到最新版本

由于mac之前安装了 vue 2.9.6 的版本&#xff0c;现在想升级到最新版本&#xff0c;用官方给的命令&#xff1a; npm uninstall vue-cli -g 发现不行。 1、究其原因&#xff1a;从vue-cli 3.0版本开始原来的npm install -g vue-cli 安装的都是旧版&#xff0c;最高到2.9.6。安…

Mysql删除占用事务的线程

参考&#xff1a;https://www.jianshu.com/p/dd0291391188 产生原因&#xff1a;这个问题的原因是在mysql中产生了事务A&#xff0c;执行了修改的语句&#xff0c;比如&#xff1a; update t1 set aget18 where id1;此时事务并未进行提交&#xff0c;事务B开始运行&#xff0c…

【2015年数据结构真题】

用单链表保存m个整数&#xff0c;结点的结构为 [data] [link]&#xff0c;且|data|<n(n为正整数)。现要求设计一个时问复杂度尽可能高效的算法&#xff0c;对于链表中 data 的绝对值相等的结点&#xff0c;仅保留第一次出现的结点而删除其余绝对值相等的结点。例如&#xff…

HackTheBox-Starting Point--Tier 2---Unified

文章目录 一 Unified 测试过程1.1 打点1.2 权限获取1.3 权限提升 二 题目 一 Unified 测试过程 1.1 打点 1.端口扫描 nmap -sV -sC 2.访问8080端口 页面跳转到&#xff1a;https://10.129.96.149:8443/manage/account/login?redirect%2Fmanage   观察到版本号为unifi 6.4.5…

Java GUI小程序之图片浏览器

以下是一个简单的图片浏览器示例代码&#xff0c;它包含了图片放大缩小、拖拽、上一张/下一张查看等功能。你可以根据它进行扩展&#xff0c;提高用户体验。 import java.awt.BorderLayout; import java.awt.Dimension; import java.awt.event.ActionEvent; import java.awt.e…

Copliot:让你一秒变身网页达人的神奇助手

Copliot&#xff1a;一款能够帮助你快速理解网页内容的智能助手 你是否有过这样的经历&#xff0c;当你浏览网页时&#xff0c;遇到了一些你不太了解的内容&#xff0c;比如一些专业术语&#xff0c;一些复杂的概念&#xff0c;或者一些有趣的话题&#xff1f;你是否想要快速地…

【深度学习 | 核心概念】那些深度学习路上必经的核心概念,确定不来看看? (六)

&#x1f935;‍♂️ 个人主页: AI_magician &#x1f4e1;主页地址&#xff1a; 作者简介&#xff1a;CSDN内容合伙人&#xff0c;全栈领域优质创作者。 &#x1f468;‍&#x1f4bb;景愿&#xff1a;旨在于能和更多的热爱计算机的伙伴一起成长&#xff01;&#xff01;&…

Android问题笔记四十五:解决SeekBar操作thumb周围产生的圆形阴影/灰色阴影/白色圆圈的解决办法

点击跳转专栏>Unity3D特效百例点击跳转专栏>案例项目实战源码点击跳转专栏>游戏脚本-辅助自动化点击跳转专栏>Android控件全解手册点击跳转专栏>Scratch编程案例点击跳转>软考全系列点击跳转>蓝桥系列点击跳转>ChatGPT和AIGC &#x1f449;关于作者 专…

登上CMMLU性能评测榜单第一 四大维度解码夸克自研大模型

11月14日&#xff0c;拥有千亿参数的夸克自研大模型正式发布&#xff0c;立刻占据CMMLU榜单第一名。夸克大模型将应用于通用搜索、医疗健康、教育学习、职场办公等多个场景。性能方面&#xff0c;其整体水平已经超过GPT-3.5&#xff0c;其中在写作、考试等部分场景中可以超过GP…

Shopee可以绑定大陆银行卡吗?Shopee收款方式选哪种?——站斧浏览器

shopee可以绑定大陆银行卡吗&#xff1f; 对于中国大陆的卖家而言&#xff0c;他们希望能够在Shopee上绑定自己的大陆银行卡&#xff0c;方便进行交易和收款。然而&#xff0c;目前的情况是Shopee并不支持直接绑定大陆银行卡。这主要是因为Shopee在中国大陆并不是主要运营的电…

成本2元开发游戏,最快3分钟完成!全程都是AI智能体“打工”,大模型加持的那种

金磊 发自 凹非寺 量子位 | 公众号 QbitAI 家人们&#xff0c;OpenAI前脚刚发布自定义GPT&#xff0c;让人人都能搞开发&#xff1b;后脚国内一家大模型初创公司也搞了个产品&#xff0c;堪称重新定义开发——让AI智能体们协作起来&#xff01; 只需一句话&#xff0c;最快3分…

ubuntu 18.04安裝QT+PCL+VTK+Opencv

资源 qt5.14.1:qt5.14.1.run opencv4.5.5:opecv4.5.5压缩包 1.国内换中科大源&#xff0c;加快下载速度 cd /etc/apt/ sudo gedit sources.list 替换成如下内容 deb https://mirrors.ustc.edu.cn/ubuntu/ bionic main restricted universe multiverse deb-src https://mirro…

kubernetes集群编排(11)

目录 k8s etcd 备份 恢复 k8s etcd [rootk8s2 etcd]# scp -r /etc/kubernetes/pki/etcd/ k8s1: 备份 从镜像中拷贝etcdctl二进制命令 [rootk8s2 ~]# docker run -it --rm reg.westos.org/k8s/etcd:3.5.4-0 sh输入ctrlpq快捷键&#xff0c;把容器打入后台 获取容器id [rootk8s2 …

数据分析场景下,企业如何做好大模型选型和落地?

在数据驱动的数字化时代&#xff0c;有效的数据分析已成为企业成功的关键因素。而随着大模型带来能力突破&#xff0c;让AI与数据分析相互结合&#xff0c;使分析结果更好支撑业务&#xff0c;促进企业内部数据价值释放&#xff0c;成为了当下企业用户尤为关注的话题。 如何按照…