首页 > 编程语言 >编译原理实验四----NFA确定化(附C++代码)

编译原理实验四----NFA确定化(附C++代码)

时间:2025-01-16 13:28:13浏览次数:3  
标签:状态 NFA 字符 转化 C++ ---- 输入

编译原理实验四----NFA确定化(附C++代码)


本文仅为编译原理课程实验记录开发过程,设计的知识点,以及实现算法的设计过程
使用的是Qt开发的有关 文法类型判断词法分析器NFA的确定化LL(1)分析表的构建使用LL(1)分析表分析句子等的演示应用程序,包含算法设计思路与过程。
请还请大家理解理解作者的辛苦,觉得文章写的通俗易懂的还请点赞支持支持,不胜感谢

  1. 编译原理实验一----字符串匹配
  2. 编译原理实验二----文法类型的判断
  3. 编译原理实验三----词法分析器
  4. 编译原理实验四----NFA确定化(附C++代码)
  5. 编译原理实验五----LL(1)分析法
  6. 编译原理实验六----编译器

在这里插入图片描述

经验分享

相信大家在学习此内容的时候都会遇见一个问题,就是课程上学习到的知识只能用来写一些NFA确定化的题目,但是上机实现的时候感觉无从下手。我自己总结的一套经验可以给大家分享分享,这种思路也可以说贯穿了整个项目的设计。
对于算法的设计,在动手之前,我们首先需要思考的问题就是:

  1. 我们需要设计什么东西?
  2. 我们设计的东西是以什么形式输入?
  3. 我们设计的算法是否具有中间状态?
  4. 该中间状态是以什么形式出现的?
  5. 我们设计的东西是以什么形式输出?

我们下面都是围绕上述问题的过程。

算法思路

前述知识点

我们首先要明确的是:
一个非确定的有穷自动机(NFA)M是一个五元式:

  1. M=(K,∑,δ,S,Z)
  2. K是一个有限集,它包含所有状态。
  3. ∑是一个有穷字母表,它包含所有输入字符
  4. δ是包含所有状态转化过程的集合
  5. S⊆K,是一个初态集
  6. Z⊂ K , 是一个终态集

因此,我们需要使用的数据绝大部分是在δ中,包含转化的状态,输入的字符,以及转化到的状态。K集可以用来判断状态的合法性,∑用来判断输入字符的合法性,S, Z决定起始状态和终止状态,决定转化的起点与终点。

输入结构体

在了解上述情况,其实我们已经可以知道,所需的输入需要哪些数据,比如说下表为需要输入的NFA:(其实输出的DFA也同样是下述的结构)

转化状态/输入字符 a b
0 01 1
1 1
2

再根据此表,我们可以定义一个结构体NFAnode,包含转化的状态(唯一),输入的字符(唯一),以及转化到的状态集,如下。

  1. state:转化的状态
  2. Map<QChar, QSet> nexts:根据上表,我们可知,每一个状态都对应一个输入字符,每一个输入字符都对应一个或者多个转化到的状态,因此,我们可以使用Map类型,前面的char类型表示输入字符,后面的set类型的容器表示转化到的状态集(使用set类型主要目的其实是去重)

注:Map类型和Set类型都是C++的容器,用途效率高,便捷,有需要的可以了解了解C++的STL库,STL库在项目中经常会使用到,推荐大概了解使用的方法
QChar类型和QSet类型以及QString类型是Qt重新封装的类型,与STL库类似,可移植性更强,功能类似

struct NFAnode {                     // 节点结构体
    QString state;                      // 状态
    QMap<QChar, QSet<QChar>> nexts;            // 下一个状态集合
    bool isChange = false ;                     // 是否改变(用于子集法确定化后的DFA重新给状态命名)
};
QVector<NFAnode> nodes;         // 输入节点数组

子集法(确定化)

在完成输入结构体的构建,以及输入对应数据后,我们需要知道的是,怎样把NFA确定化为DFA,最常用的方法就是子集法。子集法的官方描述较为抽象,可以用具体的例子来说明,如下。

  1. 在已经了解到非确定的有穷自动机(NFA)是一个五元式M=(K,∑,δ,S,Z),状态的转化肯定是从起始状态开始,因此可以得出下表,包含起始状态以及起始状态可以转化成的状态集:
转化状态/输入字符 a b
0 01 1
未知 未知 未知
未知 未知 未知
  1. 我们将整个起始状态可以转化成的状态集合作为一个状态,就可以解决一个输入字符,可以转移多个状态的问题,将NFA转化为DFA,如下表:
转化状态/输入字符 a b
0 01 1
01 未知 未知
1 未知 未知
  1. 继续根据输入五元式M=(K,∑,δ,S,Z)填表:(不含有终结状态黄色标注出来的了
转化状态/输入字符 a b
0 01 1
01 01 1
1 1
  1. 得到DFA后,可以改写状态名称
转化状态/输

标签:状态,NFA,字符,转化,C++,----,输入
From: https://blog.csdn.net/2301_79878653/article/details/145119822

相关文章

  • 创建Spring boot项目的五种方式
    1.idea直接从spring.io官网下载注意maven版本不能太高,使用3.3.9的版本2.Idea从阿里云的官网(https://start.aliyun.com)下载打开17版的idea不支持阿里云,需要使用更高版本的idea3.从spring.io官网(https://start.spring.io/)下载好,用idea打开......
  • CentOS扩容boot分区并升级内核
    本文作者CVE-柠檬i:https://www.cnblogs.com/CVE-Lemon前言由于安装k8s需要升级内核,但我自己的的boot分区只有200M大小,无法安装新内核,所以干脆把swap分区分给boot了。在此期间关于grub的操作踩了好多坑,所以特此记录一下正确操作。使用rpm安装新内核,下载链接:https://mirrors.core......
  • helm repository 安装与使用
     官网:https://github.com/helm/chartmuseumhttps://helm.sh/zh/docs/topics/chart_repository/安装命令下载:https://github.com/helm/chartmuseum使用方法:https://chartmuseum.com/docs/#installationchart推送插件下载$helmplugininstallhttps://github.com/chartmus......
  • STM32简介
    1、STM32是基于ARM-Cortex-M内核开发的32位微控制器。STM32分为高性能系列,主流系列,低功耗系列、无线系列:视频采用STM32F1系列高性能系列:STM32F2,F4,F7,H7(3224内核跑分,双核微控制器=550MHz的Cortex-M7+240MHz的Cortex-M4)2、ARM内核型号:经典ARM处理器:ARM7、ARM9、ARM11Corte......
  • (未完工)「学习笔记」二维数点问题
    0.0前言看了一个晚上,加上同桌的讲解,大致了解了二维数点问题的基本思路。0.1前置知识可持久化线段树树状数组1.0概述二维数点问题的一般形式是形如“给定平面上\(n\)个点,每次询问给定一个矩形,求该位于矩形内的点的个数”一类问题,模板题为P2163[SHOI2007]园丁的......
  • 陨石的秘密
    题目链接:https://www.acwing.com/problem/content/319/题目描述提取题目大意:构造L1对{},L2对[],L3对()组成的深度为D的括号序列,求方案数。并且中括号里不能有大括号,小括号里不能有中括号和大括号。思路:考虑“第一段”括号序列(它作为一个整体,只能是{}[]或(),不能是其他)即......
  • Python Wi-Fi密码测试工具
    PythonWi-Fi测试工具相关资源文件已经打包成EXE文件,可双击直接运行程序,且文章末尾已附上相关源码,以供大家学习交流,博主主页还有更多Python相关程序案例,秉着开源精神的想法,望大家喜欢,点个关注不迷路!!!1.简介:这款工具的目的是通过字典攻击方式帮助用户测试Wi-Fi网络的......
  • 计算机毕业设计Springboot冰城商户管理系统 冰城商家运营管理系统基于SpringBoot的开
    计算机毕业设计Springboot冰城商户管理系统t8n7qzwr(配套有源码程序mysql数据库论文)本套源码可以先看具体功能演示视频领取,文末有联xi可分享随着数字化浪潮的席卷,传统商业模式正面临前所未有的变革。在冰城这样的特色区域,商户们在激烈的市场竞争中寻求突破,渴望借助科技力......
  • 计算机毕业设计Springboot便利店连锁经营管理系统 Spring Boot 便利店连锁管理系统 基
    计算机毕业设计Springboot便利店连锁经营管理系统95z197da(配套有源码程序mysql数据库论文)本套源码可以先看具体功能演示视频领取,文末有联xi可分享博客开头内容随着城市化进程的加快,便利店作为提供日常便捷服务的重要商业形态,在城市生活中扮演着越来越重要的角色。为了满......
  • 计算机毕业设计Springboot“茶文化”网站 “茶韵在线”Spring Boot 网站开发 Spring B
    计算机毕业设计Springboot“茶文化”网站2p9kxpza(配套有源码程序mysql数据库论文)本套源码可以先看具体功能演示视频领取,文末有联xi可分享随着茶文化在全球范围内的影响力日益扩大,越来越多的人渴望深入了解这一古老而深邃的文化。为了满足这一需求,我们开发了“茶文化”网......