词法分析☞DFA语言识别

Description

对于给出的DFA和输入的字符串,判断字符串是否是DFA识别的语言。

INPUT

输入有多组数据。每组数据的第一行是两个整数N(N<=50)和M(M<=26),分别代表DFA的状态数和字母表的字符数。DFA的N个状态用整数0~N-1表示。状态0为起始状态。字母表包含的字符是小写英文字母的前M个字符。接下来的N行,每行有M个整数。其中第i行第j列的数字k,表示DFA在状态i-1,当输入符号为第j个小写字母时,迁移到状态k。接下来的一行包含若干个整数,代表DFA的接受状态,这一行以-1结尾。接下来的每一行是一个待识别的字符串,字符串的长度在1到50之间且只含有小写字母。字符串”#”代表本组数据结束。N=M=0表示输入结束。

OUTPUT

对于每个待识别的字符串,如果能被给出的DFA识别,输出YES;否则输出NO

样例输入

4 2
1 0
1 2
1 3
1 0
3 -1
aaabb
abbab
abbaaabb
abbb
#
1 3
0 0 0
0 -1
cacba
#
0 0

样例输出

YES
NO
YES
NO
YES

思路分析

对于DFA的每个状态,对字母表中的每个字母,有且只有一条路径离开。即,对于DFA的某个状态status, 当输入确定时,能够唯一确定下一个状态

因此,我们只需要记录好转换函数,然后对于每个输入的序列,经过转换函数,确定其最后达到的状态,再判断该状态是否是接受状态即可


#include <iostream>
#include <string>using namespace std;int main() {int M, N, accept_num;int trans[50][26];  // 转换函数char alphabet[26]; // 字母表int accept[51];  // 记录接受状态int finall_state; // 记录每一步的状态string input;  // 输出的字符串bool beAccepted; // 标记是否被接受// 初始化字母表for (int i = 0; i < 26; i++) {alphabet[i] = 97+i;}// 读入N和M// 判断N和M的值是否为0 直到为0时结束while ((cin >> N >> M) && N != 0 && M != 0) {// 输入转换函数for (int i = 0; i < N; i++) {for (int j = 0; j < M; j++) {cin >> trans[i][j];}}// 输入接受状态for (accept_num = 0; accept_num < 51; accept_num++) {cin >> accept[accept_num];if (accept[accept_num] == -1) break;}// 开始匹配输入的字符串while (1) {cin >> input;beAccepted = false;// 判断是否输入结束if (input == "#") break;// 初始化第一个状态finall_state = 0;// 找到该字符串的最后一个状态for (int i = 0; i < input.size(); i++) {finall_state = trans[finall_state][input[i]-97];}// 判断该状态是否为接受状态for (int i = 0; i < accept_num; i++) {if (finall_state == accept[i]) {beAccepted = true;break;}}if (beAccepted == true) {cout << "YES\n";} else {cout << "NO\n";}}}return 0;
}

词法分析☞DFA语言识别相关推荐

  1. 编译原理 理论知识点

    第一章 引论 编译程序和解释程序是两类重要的高级语言处理程序. 机器语言:计算机可以直接执行的代码形式的指令系统称为机器语言. 翻译程序:源程序 --- 目标程序 汇编程序:汇编语言 --- 机器语言 ...

  2. 【编译原理】复习总结

    文章目录 说明 第一章 基础知识 第二章 文法 CFG分析树(经常考) 二义性文法(Ambiguous Grammar) 正则表达式(正规表达式) 第三章词法分析 DFA的算法实现 正则表达式转换成有 ...

  3. 实验一基于 的词法分析实验_[源码和文档分享]基于JAVA实现的基于DFA的词法分析程序...

    1 实验目的 根据自己确定的正规表达式,编写.调试一个词法分析程序,对语句进行词法分析,从而更好理解词法分析原理. 2 内容描述 此程序用java编写.程序读取一个文本文件,并对其中的内容进行词法分析 ...

  4. 【编译原理笔记03】词法分析:正则表达式、有穷自动机(FA)、DFA与NFA及RE的相互转换、DFA识别单词、语法检测

    本次笔记内容: 3-1 正则表达式 3-2 正则定义 3-3 有穷自动机 3-4 有穷自动机的分类 3-5 从正则表达式到有穷自动机 3-6 从NFA到DFA的转换 3-7 识别单词的DFA 文章目录 ...

  5. 词法分析(NFA与DFA)

    词法分析(1)---词法分析的有关概念以及转换图 词法分析是编译的第一个阶段,前面简介中也谈到过词法分析器的任务就是: 字符流------>词法记号流 这里词法分析和语法分析会交错进行,也就是说 ...

  6. 词法分析(4)---NFA与DFA的转化

    1. 子集构造(Subset Construction) 这是一个转换NFA到DFA的算法.我们知道NFA和DFA的区别最主要的就是一个状态和一个input symbol是否能够确定一个状态的问题,对 ...

  7. 词法分析(3)---DFA

    1. DFA(Deterministic Finite automaton) DFA就是确定的有限自动机,因为DFA和NFA关系密切,我们经常需要把他们拿到一起来讲,NFA可以转化成为一个DFA,DF ...

  8. 编译原理——词法分析(3)有穷自动机中DFA与NFA的理解

    1.1词法分析器生成工具Lex 虽然在学习上,我们学习的是Lex,但是最近经常使用的是词法分析器生成工具是Flex,它可以为C语言生成代码,Vern Paxson于1987年以C语言写作了Flex,他 ...

  9. [编译原理]词法分析实验之基于 DFA 的单词识别

    Spring-_-Bear 的 CSDN 博客导航 问题描述: 基于 DFA 的单词识别问题的一种描述是:编写一个程序,输入一个确定的有穷自动机(DFA),使用该 DFA 识别单词. 基本要求: 设置 ...

最新文章

  1. ggplot2版聚类物种丰度堆叠图
  2. R语言ggplot2可视化使用facet_grid构建多个子图(facet、面图)并自定义每个子图(facet、面图)的文本实战
  3. x86汇编语言从实模式百度云_Intel x86 CPU 32位保护模式杂谈之任务切换 上
  4. Ubuntu通过路由器上网的配置
  5. VSCode 初次写vue项目并一键生成.vue模版
  6. oracle dba 手动创建数据实例
  7. spring学习(37):注入list类型
  8. Java并发编程实战~Happens-Before 规则
  9. 关闭word_Word文档如何快速查找?超实用的5个Word技巧教给你
  10. 云服务器运行gpu程序很卡,请问怎样才使程序在GPU上运行?
  11. php 生存分析,HPA数据库08.做生存分析
  12. 小学五年级计算机听课记录表,小学五年级语文教师听课记录
  13. Python, Ruby 与 Groovy,谁与争锋
  14. asp mysql性能_asp和mysql分页代码
  15. 【指纹识别】基于matlab GUI指纹识别门禁系统【含Matlab源码 1692期】
  16. 在CSDN开通博客专栏后如何发布文章及改进建议(图文)
  17. centos下smartctl安装配置(硬盘S.M.A.R.T信息及坏块检测命令)
  18. 带你实战Android深色模式,深入原理剖析
  19. 平均股价的时间序列图形_数据可视化——pandas绘制股票走势图
  20. 程序员的数学思维修炼(趣味解读)还有哪些进制

热门文章

  1. ChemDraw加键的两种方法
  2. CPU 是怎样工作的
  3. 添加背景音乐(visual stdio2019)
  4. HDU 6411 带劲的and和【枚举贡献】
  5. 带劲!厂内全流程智能仓储物流系统
  6. U牌“唤醒生命,未来可7”
  7. 安卓手机刷入面具Magisk
  8. OpenSSL密码库算法笔记——第2.2.2章 Barrett约化的优越性
  9. 5-10 计算存款利息 (10分)
  10. 深度学习中模型攻击与防御(Attack DL Models and Defense)的原理与应用(李宏毅视频课笔记)