dfa算法c语言,用c语言采用模拟dfa算法编写一个扫描器.docx

用C语言米用模拟DFA算法编写一个扫描器/*第一章:相关知识DFA定义:一个确定的有穷自动机(DFA)M是一个五元组:M=(K,厶f,S,Z)其中0K是一个有穷集,它的每个元素称为一个状态;工是一个有穷字母表,它的每个元素称为一个输入符号,所以也称工为输入符号字母表;f是转换函数,是KX》tK的映射,即,如f(ki,a)=kj,(ki€K,kj€K)就意味着,当前状态…

大家好,又见面了,我是你们的朋友全栈君。

用C语言米用模拟DFA算法编写一个扫描器

/*

第一章:相关知识

DFA定义:一个确定的有穷自动机(DFA) M是一个五元组:M= ( K,厶f, S, Z)其中

0K是一个有穷集,它的每个元素称为一个状态;

工是一个有穷字母表,它的每个元素称为一个输入符号,所以也称工为输入符号字母

表;

f是转换函数,是 KX》tK的映射,即,如 f (ki, a) =kj,

(ki € K, kj € K)就意味着,当前状态为ki,输入符为a时,将转换为下一个状态 kj,

我们把kj称作ki的一个后继状态;

S € K是唯一的一个初态;

Z??K是一个终态集,终态也称可接受状态或结束状态。

第二章:题目

用C语言米用模拟DFA算法编写一个扫描器(词法分析器)用来识别:

由任意个a或b开始后接aa再自加或自减1的字符串,即正规式r=(a|b)*aa(+|-)1描述的语 言 L (r)

该词法分析器的任务:

滤掉源程序中的无用成分,如空格;

识别正规式r=(a|b)*aa(+|-)1描述的字符串。

从键盘读入或打开文件读入字符串,词法分析器读入字符ywe串后扫描源字符串,

若发现符合符合正规式r描述的字符串时,输出“ye或”可接受”或可识别”

否则输出“ n或’不可识别”。

第三章:分析

第一节?

K有10个状态,也就是10个元素: 0,也就是开始状态’a’,转到状态 s1’b’,转到状态 s2

K有10个状态,也就是10个元素: 0,也就是开始状态

‘a’,转到状态 s1

‘b’,转到状态 s2

状态S3:从s2开始接受了一个字母’a’,转到状态S3

状态s4:从s3开始接受了一个字母’a’,转到状态s4

状态S5:如果s1已经连续接受了至少两个字母’a’,从s4开始接受一个符号 ‘+’,转到状

态s5。

从s4开始接受了一个符号’+’,转到状态S5。

状态S6:如果s1已经连续接受了至少两个字母’a’,从s4开始接受一个符号’-‘,转到状

态s6。

从S4开始接受了一个符号’-‘,转到状态s6。

状态S7:从S5或S6开始接受了一个数字’1’,转到S7。

状态S8:从S7开始接受了一个字符串结束符号’\0’,转到状态S8。【这是成功状态】

状态s9:【这是出错状态】 第二节 .

根据正规式(a|b)*aa(+|-)1 ,我们可以分析出 习包含的字母有:a,b,+,-,1 第三节 .

根据正规式 (a|b)*aa(+|-)1 ,我们分析出转换函数 f 有:

F[0]. s0 –(输入一个字母 ‘a’) –> s1

F[1]. s0 –(输入一个字母 ‘b’) –> s2

F[2]. s1 –(输入一个字母 ‘a’) –> s1

F[3]. s2 –(输入一个字母 ‘b’) –> s2

F[4]. s2 –(输入一个字母 ‘a’) –> s3

F[5]. s3 –(输入一个字母 ‘a’) –> s4

F[6]. 如果状态 s1 中已经累积有至少两个字母 ‘a’

s1 –(输入一个符号 ‘+’) –> s5

F[7]h. s4 –(输入一个字母 ‘+’) –> s5

F[8]. 如果状态 s1 中已经累积有至少两个字母 ‘a’

s1 –(输入一个符号 ‘-‘) –> s6

F[9]. s4 –(输入一个字母 ‘-‘) –> s6

F[10]. s5 –(输入一个数字 ‘1’) –> s7

F[11]. s6 –(输入一个数字 ‘1’) –> s7

F[12]. s7 –(输入一个字符串结束符’\0′) –> s8(成功状态)

F[13].其他情况,统一进入状态s9(出错状态)

第四节 .

根据正规式(a|b)*aa(+|-)1 ,我们分析出【唯一的】初态 S即K中的s0

第五节 .

,s9(出根据正规式(a|b)*aa(+|-)1,我们分析出结束状态有两个,即K中的s8(

,s9(出

错状态 ) */

#include /* 下面的一组全局参数是作为自动机的参数 */

// 正则式

const char regex[]=”(a|b)*aa(+|-)1″;

// 状态集合

int states[10]={0};

// 状态总数

const int statesAmount = sizeof(states)/sizeof(int);

// 可接受的字符集合

const char letterSet[]=”ab+-1″;

// 开始状态

const int startStateId=0;

// 可接受的结束状态集 const int endStateIds[]={8,9};

// 可接受的结束状态总数

const int endStates

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/126746.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • Visual Studio——使用多字节字符集与使用Unicode字符集

    Visual Studio——使用多字节字符集与使用Unicode字符集vs配置选项“使用多字节字符集”和“使用Unicode字符集”的区别VS集成开发环境,字符集选择“使用多字节字符集”和“使用Unicode字符集”的直接区别就是:编译器是否增加了宏定义——UNICODE。当选择“使用Unicode字符集”时,编译器会增加宏定义——UNICODE;而选择“使用多字节字符集”时,编译器则不会增加宏定义——UNICODE。而是否增加了宏定义UNICODE,则…

    2022年10月22日
    0
  • android 屏幕触摸事件及处理机制解读

    android 屏幕触摸事件及处理机制解读原创性声明:Android最让我开心和有成就感的就是可以实现自定义,追根朔源是开源带来的,出于普适性,google不会提供定制性特别强的视图组件,但是我们可以自己动手,丰衣足食。但是,往往自定义的时候会出现好多问题,说到底是还没有吃透,我不推荐学生时期自学的时候过分追究原理,那个时期并不合适做这件事,那种闭关到世界第一再出关的苦学我也是不认可的。学习就是要循序渐进,慢慢吃透,扩展出

    2022年9月11日
    0
  • logistic 函数(logistic function)sigmoid函数

    logistic 函数(logistic function)sigmoid函数今天看SVM(支持向量机),开始先引入了logistic函数,虽然给出了一公式,但好奇logistic函数啥东东啊,为啥叫logistic呢,搜索ing。说简单些,logistic函数其实就是这样一个函数:

    2025年6月18日
    0
  • 防止站点数据被採集——成佩涛黑客「建议收藏」

    防止站点数据被採集——成佩涛黑客

    2022年2月1日
    38
  • 操作系统中并发和并行的区别在于_线程是并行还是并发

    操作系统中并发和并行的区别在于_线程是并行还是并发一、教材解释:·并行是指两个或者多个事件在同一时刻发生,而并发是指两个或者多个事件在同一时间间隔发生·并行是在不同实体上的多个事件,并发是在同一实体上的多个事件二、c语言站长公众号解释:1、并发早期计算机的CPU都是单核的,一个CPU在同一时间只能执行一个进程或线程,当系统中有多个进程或线程等待执行时,CPU只能执行完一个再执行下一个。计算机在运行过程中,有很多指令会设计i/o操作,而i/o操作又是相当耗时间的,速度远远低于CPU,这导致CPU经常处于空闲状态,只能等待i/o操作完成

    2025年6月9日
    0
  • PCB设计-Allegro软件入门系列第九讲-Class分类和Subclass应用

    PCB设计-Allegro软件入门系列第九讲-Class分类和Subclass应用在Allegro软件中,Class和SubcClass是一个相对新的专业术语,这里单独拿一节出来给大家讲解一下。相信不少画过PCB的读者也许跟笔者一样也用过AD,刚从AD过来学习allegro都会发现allegro这个平台所有对象都分Class和Subclas。比如上一节中的板框我是定义在了BoardGeometry的Outline里面。其实Allegro将所有元素都分类的很仔细是方便后…

    2022年7月16日
    14

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号