简单使用有限自动机

确定有限自动机(DFA)和不确定有限自动机(NFA)的主要区别 所以,理解DFA和NFA的区别,需要从它们的转移特性、转移函数、识别过程以及表达能力等角度进行综合考虑。 阅读详情

最近写程序碰到一个问题,主要就是关于实时运行程序的状态转化,虽然可以将动作与状态写在一起解决,总是感觉不妥,于是上网找了一些资料学习了一下,写了一个有限自动机的类,将动作与状态分离,使用方便了许多。

类设计基本是照搬某篇E文资料中的。

 

class FSMstate 
{
public:
 int  GetID();         //得到本StateID
 void AddTransition(int iInput, int iOutputID); //增加转化
 void DeleteTransition(int iOutputID);   //删除转化
 int  GetOutput(int iInput);      //得到某个转化

 void InitState(int iStateID, unsigned usTransitions); //初始化
 void Release();           //释放空间
 FSMstate(int iStateID, unsigned usTransitions);
 FSMstate();
 virtual ~FSMstate();
 
private:
    unsigned m_usNumberOfTransitions;//状态最大数
    int   *m_piInputs;   //输入数组
    int   *m_piOutputState;  //输出状态数组
    int   m_iStateID;    //本状态标识符
};

class FSMclass 
{
public:
 FSMstate * CreateFSMstate(int iStateID, unsigned usTransitions);  //创建用于Add

    int  GetCurrentState() { return m_iCurrentState; }     //返回当前状态ID
    void SetCurrentState(int iStateID) { m_iCurrentState = iStateID; } //设置当前状态ID
   
 FSMstate* GetState(int iStateID);  //返回FSMstate对象指针
    void AddState(FSMstate* pState);  //增加状态对象指针
    void DeleteState(int iStateID);  //删除状态对象指针

 int  StateTransition(int iInput); //转换状态。

 void Release();
 FSMclass(int iStateID); //初始化状态
 FSMclass();
 virtual ~FSMclass();
 
private:
 vector<FSMstate *> m_states;  //包括了状态机的所有状态
    int m_iCurrentState; //当前状态的ID
};

使用时实例化一个FSMclass,然后创建FSMstate,用AddTransition()方法把有限自动机的输入输出添加进去,然后用FSMclass类的AddState方法添加状态就完成了。用这个类管理有限状态机确实方便。如果做游戏的话,可能会对有限自动机使用比较多吧。

编译原理笔记3:有限自动机 有限自动机 阅读详情

相关推荐

利用有限自动机进行字符串匹配

Q:Finite Automaton?,我根本就没有听说过这种数据结构,毫不关心无压力.jpg A:这个还是有点儿用处的,等一下我会讲的,你就当涨知识了吧。 Q:呼噜噜~~~~~~ A:睡好。。。 在讲解Finite Automaton之前我们先介绍一下朴素字符串匹配算法 朴素字符串匹配算法就是通过一个循环找到所有的有效偏移,对于n-m+1个可能的s,我们需要检测P[1...m]==T[...

天才小熊猫的博客 5793

有限自动机DFA 、 无限自动机NFA

软件设计师

douxingpeng1的博客 1万+

Java和C++的词法分析

在上述代码中,我们定义了一个源代码字符串并创建了一个正则表达式模式,该模式匹配C++中的关键字(int、float、double、bool和char)。在上述代码中,我们定义了一个源代码字符串并创建了一个正则表达式模式,该模式匹配Java中的关键字(int、float、double、boolean和char)。词法分析是编译器前端的重要组成部分,用于将源代码分解成一系列的词法单元,例如关键字、标识符、运算符、常量和符号等。在本文中,我们将探讨Java和C++两种编程语言的词法分析,并提供相应的源代码实现。

PixelBlade的博客 92

有限自动机以及无限自动机的总结

这是计算机编译原理的一直觉得很不懂的地方今天终于整懂了 一下简单解释一下 ∑()表示空,在例子中没有具体的字符时。 什么是有限自动机DFA 正则式与有限自动机的转换规定 什么是无限自动机NFA ...

刘佳欢 6514

正则表达式和NFA的JavaScript实现

正则表达式是一种强大的模式匹配工具,而NFA则为正则表达式的实现提供了理论基础。在JavaScript中,我们可以使用内置的正则表达式对象进行模式匹配,并且也可以通过自己实现NFA来理解正则表达式的底层原理。在示例中,我们创建了一个简单的NFA状态图,用于匹配字符串"ab"。在JavaScript中,正则表达式的实现通常基于NFA的理论。正则表达式的匹配过程就是根据NFA的状态转换进行的。JavaScript中的正则表达式支持许多模式修饰符和元字符,用于扩展匹配的功能。,并返回匹配的结果。

XymkMl的博客 73

ocaml-autos:无限状态自动机

Autos——无限状态自动机 理论 Mealy 和 Moore 机器可以被看作是索引状态和索引状态(例如“商店”)类型的不动点。 type (-'i, +'j, +'a) istate = 'i -> ( 'a , 'j ) type (-'i, +'j, +'a) istore = ( 'i -> 'a ) * 'j type (-'a, +'b) mealy = Mealy of ( 'a , 'b , ( 'a , 'b ) mealy )) istate type (-'a, +'b) moore = Moore of ( 'a , 'b , ( 'a , 'b ) moore )) istore 但是,我们可以通过存在类型而不是使用类型递归来获取显式最大不动点,从而实现更有效的表示。 在具有更高级类型和类型 lambda 的假装 OCaml 中 type _ nu = N

确定有限自动机DFA&非确定有限自动机NFA

确定有限自动机DFA&非确定有限自动机NFA Part 1_自动机介绍:有穷自动机(finite state automata)是一个识别器,它对每个输入的字符做识别和判断,以确定其能到达的最终状态或状态集和路径,有穷自动机分为两类,即不确定的有穷自动机NFA和确定的有穷自动机DFA[1].例子1:红绿灯系统: G(绿灯亮了的状态);R(红灯亮的状态);Y(黄灯亮的状态)例子2:零售机(vending machine)。它接受五角和一块的硬币,但是要至少积累到3元才能按下选择,并且只有作出选择才会执

一只攻城狮的博客 7865

有限自动机

有限自动机 ppt 关于图灵机 还有有限状态自动机 确定的有限状态自动机

【编译原理】有限状态机(FSM)和有限自动机(FA)

FSM是一个5元组 M = (S, Σ, f, s0, Z)S是有限状态集Σ是一个有限字母表,其中w=w1w1…wn是一个输入字符串,且wi是∑的成员f是一个单值转换函数,定义了S x Σ -> Ss0∈S是初始状态0Z∈S是最终状态L0 L1 L2 L3 从左到右,最右边语法限制最多if α → β举例:如果语法是规则的,那么它必须是上下文无关参考来源:Dr. Amit K. Chopra。

qq_46130027的博客 2317

基于有限自动机方法的简单词法分析程序的设计与实现

基于有限自动机方法的简单词法分析程序的设计与实现 ——无符号实数的识别

python机器人编程——用python实现一个写字机器人

本篇我们构建一个可以跟人一样写字的机器人python软件。实现如下功能:打开一个写字板,人类在屏幕上写或画出任意形状,机器人同步在纸面上画出和人类一样的形状,就好像人类在远程操控机械臂,又或是机械臂是人的另一只手。这个软件是可以扩展的,如果连上互联网,可以实现人在北京写了一行字,在上海的机器臂同时也在自己的本子上写了一行字。

JAMES费的空间 7993

编译原理之美---正则文法和有限自动机:纯手工打造词法分析器

craf.h #ifndef _Craft_H_INCLUDED_ #define _Craft_H_INCLUDED_ #include <string> #include <vector> #include <queue> using namespace std; /** * Token的类型 */ enum class TokenType { ...

新博客:https://aping-dev.com/ 1728

分享一下如何使用labelimg制作自己的YOLO数据集

首先准备一下自己的下准备一个空文件夹用于保存标签文件,如下图所示。

skywalkerxhx的博客 831

字符串匹配算法 之 基于DFA(确定性有限自动机)

确定有限自动机定义:http://en.wikipedia.org/wiki/Deterministic_finite_automaton 自动机在字符串匹配中的应用 1 #include<stdio.h> 2 #include<string.h> 3 #include<stdlib.h> 4 #define ALPHABETLEN...

weixin_30878361的博客 241

在 CentOS7 下安装 Cadence IC验证平台 INCISIVE152

前言 本文所使用的软件 虚拟机软件:VMware Workstation 15 PRO 如何安装? 操作系统:CentOS-7, CentOS-7-x86_64-DVD-1810.iso 如何安装? 简介 INCISIVE Incisive是nc_verilog, nc_sim, nc_lauch,以及ABV,TBV的集合,用于仿真和验证。 InstallScape InstallSc...

沈醉不知的博客 2万+

避开CPU瓶颈:手把手教你用RK3588的DMA-BUF实现V4L2到NPU的零拷贝数据流

本文详细介绍了如何在RK3588平台上利用DMA-BUF实现V4L2到NPU的零拷贝数据流,显著提升异构计算性能。通过实战指南展示了如何配置摄像头采集、RGA图像预处理和NPU推理优化,最终实现CPU占用率降低60%、延迟减少60%的效果,特别适合YOLOv5等AI推理应用的高效部署。

weixin_30374009的博客 571

实现正则表达式处理功能

 本来要打算每一个星期争取能够写一篇文章的,但是的确我自己有些懒散,MSN的空间不能在文档里面插入图片,又给了我一个绝好的偷懒的借口。就好必喜欢在 下雨天睡懒觉一样,总是找着诸如“太阳还没有起床”之类的借口。还有一个借口就是,我要写一些自己原创,或者是自己懂得文章,不能随便google一篇文 章,引用一下敷衍了事。更要命的是,文章还需要长一些的。写完以后,不管内容怎么样,总是要自己好好满足一把。感

Donjuan的专栏 2197

考完CAIE认证一年后,谈谈它对我的职业的真实影响(干货)

大门,让面试官愿意给你机会,但进门之后的发展,还得靠持续的学习和项目积累。说实话,当时的心态是“考都考了,总比闲着强”,对这张证书能带来什么实际价值,心里并没有底。这种广泛的生态认可,让这张证书的“流通性”变得很强——无论跳槽还是在原公司发展,它都是一个被市场验证过的能力证明。对我个人而言,虽然没跳槽,但在年度调薪和争取内部项目时,持证经历也成了一个有力的“加分项”。这种巨大的薪资差距,恰恰反映了市场对“能落地、懂技术”的深度人才的渴求。考完证后的这一年,我看到了两条清晰的职业发展路径在自己面前展开。

qq_16014487的博客 817

c语言词法分析初试(C++实现)

开篇 所谓词法分析,就是将源代码按照构词规则分解成一系列单词符号。单词是语言中具有独立意义的最小单位,包括关键字、标识符、运算符、界符和常量等。 分析 源程序分解的单词可以归为以下几类: 1. 关键字 c语言关键字有不少,这里只列举其中一部分: for,while,do,continue,if,else, char,int,double,return 2. 变量名 变量名

YiShi's Blog 7346

Vite与Webpack路径配置大不同:从Vue2迁移到Vue3必须知道的public目录使用技巧

本文详细解析了Vite与Webpack在public目录路径配置上的核心差异,为Vue2迁移到Vue3的开发者提供实用指南。重点对比了两种构建工具的资源处理逻辑,给出典型编译警告的解决方案,并分享路径适配表与高级优化技巧,帮助开发者高效完成技术栈升级。

weixin_30836759的博客 485

IgH EtherCAT 从入门到精通:第 29 章 实战:EoE 远程维护通道搭建

摘要:本章详细介绍了基于EoE(Ethernet over EtherCAT)协议的远程维护通道搭建方案。主要内容包括:1)网络架构设计,采用管理网络与EoE子网隔离的方案;2)从站EoE支持确认与IP地址配置,提供API和命令行两种方式;3)路由/交换两种部署模式,重点推荐路由模式并给出自动化配置脚本;4)SSH远程访问配置,包括直接连接和跳板访问两种方式;5)安全加固措施,如防火墙规则、SSH密钥认证等;6)故障恢复机制与性能注意事项。该方案实现了通过EtherCAT网络对从站设备的远程SSH访问、文件

从事嵌入式linux android驱动开发,拥有全栈能力 360

写个简单的正则表达式

使用NFA来构造正则表达式,详细解释可以参见Algorithm 4th。书中代码为JAVA版本。 书中内容前后耦合度较大,遂用cpp简单的实现了一下(基于vector的存储方式主要是我发现std::stack不能访问中间的元素,性能上的优化我就忽略掉了)。 代码接受“(A*C|AB)V.*”等类似的正则表达式,不检测中间匹配的情况(主要是为了缩减代码量,我对200这个数很纠结) 由于判断检测...

weixin_30344131的博客 112

看完这篇你就能讲解LLC软开关:一文秒懂 ZVS 和 ZCS 到底啥意思!

想要 MOS 管ZVS 好实现➜ 把工作频率保持在 fr1 或更高。想让整流二极管也ZCS 实现➜ 频率就别高过 fr1。设计磁性元件时,一定要计算好 Lr、Lm、Cr 的值,这直接决定你 fr、fr1 是多少!LLC 的软开关技术不是“魔法”,是电感电容+频率控制的精妙组合;fr1 就像黄金分割点,整流和开关都能“刚刚好”;不是所有软开关都能同时实现,要看你在频率曲线的哪一段!

weixin_43199439的博客 1533

腾讯精选50题—Day2题目7,8,9

腾讯精选50题—Day2题目7,8,9 今天是打卡的第二天,元气满满的冲鸭~~~ 1. 题目7 整数反转 (1)题目描述 (2)题目思路 (3)题解

Fox_Alex的博客 263

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

语义分析程序 c语言,语义分析的C语言代码

之前写了12篇使用有限自动机(DFA)分析语法的文章,今天说一下语义分析。怎么用C语言写语法分析3,基于有限自动机的表达式分析怎么用C语言写语法分析用C语言实现一个真正的词法分析器语义分析,也是编译器前端的一个模块。一般来说,它比语法分析要简单。程序源码的各种复杂逻辑,在经过语法分析之后,就成了一棵抽象语法树(AST)。生成这个语法树比较难,因为源代码里互相耦合的概念太多。生成语法树之后,把树遍历...

weixin_34138397的博客 2923

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

下一篇: 逆转ACE《逆转裁判3》中文汉化版发布!
maxvampire82
博客等级 码龄21年 3粉丝 15原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值