实验二记录---编译原理

news/2024/5/2 18:05:37/文章来源:https://blog.csdn.net/m0_51265528/article/details/127191289

实验2:生产流水线的自动规划器

实验二:生产流水线的自动设计器
一、实验内容:
输入一个表示要准备进行设计的生产流水线对应的正则表达式,最终完成整个生成流水线的自动设计。
二、必做实验要求:
(1)正则表达式应该支持单个字符,运算符号有: 连接 选择(|) 闭包(*) 正闭包(+) 可选(?) 括号
(2)要提供一个源程序编辑界面,让用户输入表示生成流水线处理过程的正则表达式(可保存、打开正则表达式文件)
(3)需要提供窗口以便用户可以查看转换得到的NFA(用状态转换表呈现即可)
(4)需要提供窗口以便用户可以查看转换得到的DFA(用状态转换表呈现即可)
(5)需要提供窗口以便用户可以查看转换得到的最小化DFA(用状态转换表呈现即可)
(6)要求应用程序为Windows界面
(7)书写完善的软件文档
三、选做实验要求:
完成绘制转换得到的NFA图,DFA图以及最小化的DFA图
如果选做该内容,实验文档以及使用说明书中就一定要有关于这个内容的设计文档及执行操作说明

1.输入正则表达式

第一关:特殊运算符: ‘&’ , ‘|’ , ‘*’ , ‘+’ , ‘?’ , ‘[ ]’

扫描一行符号

1.去掉空格
2.方括号要转换形式,从[1-5],变成 (1|2|3|4|5)这样方便进一步转换

因为连接符号在正则表达式中是隐形的,所以为了转换,需要手动加上‘&’表示连接符号。

  1. 两个字符之间需要加一个 “&”
    这几种情况要加& : “a a” 、“a (” 、“* a” 、“* (” 、“) a” 、 “) (”
    比如原字符串:a|bcs[1-3]asds
    加&后 : a|b&c&s&(1|2|3)&a&s&d&s
    开始遍历
    如果栈内的运算符优先级大于等于当前运算符,则弹出栈内运算符
 //添加连接符'&'int length = raw.length();QString rawadd;for(int i=0;i<length;i++){rawadd.append(raw[i]);if(i < length-1 && ((isAlpha(raw[i]) && isAlpha(raw[i+1])) || (isAlpha(raw[i]) && raw[i+1] == '(') || (raw[i] == '*' && isAlpha(raw[i+1]))|| (raw[i] == '*' && raw[i+1] == '(') || (raw[i] == ')' && isAlpha(raw[i+1])) || (raw[i] == ')' && raw[i+1] == '('))){rawadd.append('&');}}

字符可以直接加入到 总的字符串中,因为在中缀和后缀表达式中,数字的位置都是一样的。遇到5大符号( ‘&’ , ‘|’ , ‘*’ , ‘+’ , ‘?’),则需要单独处理,进入栈中,这块还有一些逻辑。

‘[ ]’

方括号太抽象, 这里转换成更具体的范围 (||||) 用圆括号和 || 来表示
QString::toLatin1是相当于 ASCii码不包含中文的遇到中文默认转换为ascii码。
bracket()函数 , 即当遇到[ - ]这段的时候,用 (||||)替代,其他原封不动的保存。

QString bracket(QString raw)
{QString p;int i=0;while(i<raw.length()){if(raw[i] == '['){p.append('(');char c1 = raw[++i].toLatin1();p.append(c1);i++;char c3 = raw[++i].toLatin1();for(int j=(c1-'0')+1;j<=(c3-'0');j++){p.append('|');p.append(char(j+'0'));}i++;p.append(')');}else{p.append(raw[i]);}i++;}return p;
}

正则表达式是中缀的,但是为了方便使用后缀表达式

中缀表达式 9+(3-1)x3+10÷2
后缀表达式9 3 1 - 3 x + 10 2 ÷ +
开两个栈结构,一个放数字,一个放符号。
从左到右。9 入数字栈
+号 入符号栈(目前栈空,栈空就进栈)
( 入符号栈
目前栈里从上到下:( +
3入数字栈
当前表达式为 9 3

  • 入栈
    目前栈里从上到下:-( +
    正则表达式中总共有以下的符号。
算法思路如下:

QString process, 和一个栈结构 operator
process相当于数字栈, operator 相当于符号栈

NFA

正则表达式转成后缀之后,就可以开始构建图结构。
以邻接表形式存储NFA图
后缀表达式,按照扫描的方式来做:

基本NFA图:
是两个结点一条边。
在这里插入图片描述之后构图就是由这些基本结点连接,形成图。
而连接这些基本的结点的就是 空,一条边。在这里插入图片描述

例子:

源字符串: a|b*[1-3]a*
加了&之后:a|b*&(1|2|3)&a*
变成后缀之后:ab12|3|&a&|
现在用后缀生成NFA状态表和图结构

这里定义一个NFA类,NFA有两个指针,分别指向初态和终态。

struct NFA
{Linknode* start = nullptr;Linknode* end = nullptr;NFA(Linknode* s, Linknode* e){start = s;end = e;}
};

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

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

相关文章

RNN/LSTM/CNN/Transformer/Bert 面试问题

文章目录RNNLSTMGRUCNNTransformerTransformer&#xff1a;每一位从事NLP研发的同仁都应该透彻搞明白Transformer为什么RNN能够这么快在NLP流行并且占据了主导地位呢&#xff1f;RNN在新时代面临的两个严重问题&#xff1a;为什么RNN的并行计算能力不行呢&#xff1f;1.Transfo…

Bootstrap设计可响应式的移动网页

目录 1、设计响应式图片 1.1、使用标签&#xff08;中&#xff09; 1.2、使用css图片 2、响应式视频 3、响应式导航菜单 4、响应式表格 4.1、隐藏表格中的列 4.2 滚动表格中的列 4.3 转换表格中的列 1、设计响应式图片 1.1、使用<picture>标签&#xff08;<body…

Linux 中的which命令及C/C++代码实现

Linux which命令允许用户搜索$PATH环境变量中的路径列表&#xff0c;并输出作为参数指定的命令的完整路径。该命令通过查找与给定命令匹配的可执行文件来工作。 如果您想知道指定的程序存储在哪里&#xff0c;那么which命令可以帮助您识别路径&#xff0c;使用起来非常简单。 …

一个Python文件被多个文件同时导入会怎么样?

我们在写代码时&#xff0c;往往会遇到一个Python文件被多个文件同时导入&#xff0c;如下例所示&#xff1a; test1.py、test2.py和test3.py是3个Python文件。其中&#xff0c;test2.py导入了test1.py中的所有内容&#xff0c;test3.py导入了test1.py和test2.py中的所有内容。…

第 6 章 机器人仿真系统 1 —— 概述 + URDF 集成 Rviz 基本流程 urdf01_rviz

文章目录0 学习目标1 相关组件1.1 URDF —— 机器人建模1.2 Rviz —— 感知环境1.3 Gazebo —— 创建仿真环境2 课程说明3 URDF 集成 Rviz 基本流程3.1 创建功能包&#xff0c;导入依赖 —— 功能包 urdf01_rviz3.2 编写 URDF 文件 —— demo01_helloworld.urdf3.3 launch 文件…

读取文件报错:FileNotFoundError: [Errno 2] No such file or directory

文章目录问题描述问题分析解决办法问题描述 使用 img Image.open(data/DSC_8923.jpg) 读取一张图片时&#xff0c;报 FileNotFoundError: [Errno 2] No such file or directory: data/DSC_8923.jpg 的错误&#xff0c;如下图所示&#xff1a; 问题分析 很明显&#xff0c…

yolov5 原理解析

1、 网络结构 关于YOLOv5的网络结构其实网上相关的讲解已经有很多了。网络结构主要由以下几部分组成&#xff1a; Backbone: New CSP-Darknet53Neck: SPPF, New CSP-PANHead: YOLOv3 Head激活函数 通过和上篇博文讲的YOLOv4对比&#xff0c;其实YOLOv5在Backbone部分没太大变…

基础 | NIO - [0 复制]

INDEX1 0 复制1 0 复制演进1 示例1 0 复制 通常在进行 IO 操作时&#xff0c;涉及到 2 种复制 DMA 复制 不需要 CPU 参与&#xff0c;效率极高&#xff0c;但不可避免CPU 复制 就是 0 复制中需要消灭的复制&#xff0c;0 复制其实是指 0 CPU 复制 1 0 复制演进 BIO 用户态/…

如何自己设计一个定时任务分布式调度器

为什么要使用分布式调度器 分布式调度器主要应用于系统中一些任务定时调度处理。通常我们设计一个定时任务&#xff0c;最简单的就是直接使用scheduled注解配置好定时任务&#xff0c;这样开发工作也简单。但是也许会有一种情况&#xff0c;如果发生在生产环境上&#xff0c;需…

FPGA学习笔记(五)Testbench文件编写

这里写目录标题Testbench文件时间单位/精度测试模块输入信号初始化always 语句实现信号变化实例化系统函数Testbench文件 编写Testbench的目的是在Modsim中进行仿真验证&#xff0c;查看仿真波形和打印信息验证代码逻辑。 例如下面代码&#xff1a; timescale 1ns/1ns modul…

python数据容器---list

目录 1、列表的定义 1.1 基本语法 1.2 定义变量 1.3 定义空列表 2、列表的下标&#xff08;索引&#xff09; 2.1 基本语法 2.1.1 正向查找 2.1.2 方向查找 2.1.3 嵌套列表 3、列表的常用操作 3.1 查找某元素的下标 3.2 修改特定索引的值 3.3 插入追加元素 3.4 删…

基于java+jsp+ssm水果蔬菜销售系统

生活中,人们买水果或者蔬菜都是去菜市场买,因为那里是卖水果、蔬菜的聚集地。农商们把水果、蔬菜从远处运到那里,进行销售。但是这种销售方式的不足在于每次运输的数量是有限的,并且运输过程中也影响了水果、蔬菜的口感。随着生活节奏的加快,人们越来越注重高效的在线服务。在线…

让GPU跑的更快

作为一个cuda爱好者 一定要好好看看 不再让CPU和总线拖后腿&#xff1a;Exafunction让GPU跑的更快&#xff01;确实只用cpu会卡的一比... 在云服务中使用 GPU 是获得低延迟深度学习推理服务最经济的方式。使用 GPU 的主要瓶颈之一是通过 PCIe 总线在 CPU 和 GPU 内存之间复制…

关卡一: ajax

【学习前提】 完成前端开发基础和JavaScript基础学习 【阶段说明】 Ajax这个术语源自描述从基于 Web 的应用到基于数据的应用。 Ajax 不是一种新的编程语言&#xff0c;而是一种用于创建更好更快以及交互性更强的Web应用程序的技术。 使用 JavaScript 向服务器提出请求并处理响…

有被惊艳到 复刻一个大型互联网项目有多简单?大型网约车项目实战+东宝商城(附项目白皮书+核心源码)

从上图可以看出&#xff0c;面试准备其实可以分为两个部分&#xff1a;第一个部分是日常工作中对自己负责项目的抽象、提效、数据化表达&#xff1b;不断反思如何用技术的手段提升业务价值&#xff0c;就是我们日常常说的技术为业务赋能&#xff1b;第二个部分才是决定面试后 &…

第八章 CSP 架构 - CSP 网关配置

文章目录第八章 CSP 架构 - CSP 网关配置CSP 网关配置CSP 网关管理器定义服务器访问定义应用程序访问CSP 网关参数第八章 CSP 架构 - CSP 网关配置 CSP 网关配置 CSP 网关是安装在 Web 服务器上并由其加载的 DLL 或共享库。 CSP 网关检测对扩展名为 .csp 或 .cls 的文件的任何…

ApplicationRunner和CommandLineRunner的作用和区别

一、作用 ApplicationRunner和CommandLineRunner都用于在容器启动后&#xff08;也就是SpringApplication.run()执行结束&#xff09;执行某些逻辑。 可用于项目的一些准备工作&#xff0c;比如加载配置文件&#xff0c;加载执行流&#xff0c;定时任务等 二、共同点和区别 …

nodejs+vue+elementui学生成绩管理系统python/php/java445

前台首页功能模块 学生成绩管理系统设计&#xff1b;主要实现首页、优秀教师、优秀班主任、学校简介、教学课件、公告信息、优秀学生、试卷列表、新闻资讯、我的、跳转到后台&#xff0c;功能。 优秀教师&#xff0c;在优秀教师页面可以填写标题、教师工号、荣誉等详细&#xf…

经典论文研读:《F1:A Distributed SQL Database That Scales》

一 简介 F1是Google提出的分布式关系型数据库&#xff0c;支持便捷的水平伸缩。这篇论文是NewSQL分布式数据库架构的基石。论文首先定义了F1分布式数据库设计的关键方向&#xff1a; 可伸缩性&#xff1a;数据库要提供对业务透明的水平扩展能力&#xff0c;并支持数据迁移、数…

全同态加密(FHE)体系概述

同态加密定义 假设有这样一个场景&#xff0c;用户有一组私密数据&#xff0c;被加密存储在了第三方的云平台&#xff0c;现在&#xff0c;该用户想对这组数据进行某种处理&#xff0c;但是处理过程和结果都不想让第三方云平台看到。当然&#xff0c;用户可以选择将数据下载下…