编译器的词法分析是基于finite automata(有穷自动机) 和 regular expression(正则表达式)

alphabet:finite set of symbols 字母表:有限符号的集合
string:sequence of symbols from a given alphabet 字符串:给定字母表的符号序列
language:set of string 字符串的集合

例如x12 = 32;中有token
x12        identifier
=            assignment
32          unsigned int
;          end of statement

这里的4个token其实可以看作4门语言 每门语言都有其独特的字符构成

当把一个string(或者说一个token)传给finite automata或者regular expression的时候 它会返回告诉你这是不是一个合法的token 是不是一个属于它的语言的token

finite automata和regular expression作为一个工具来识别语言只能识别regular language(标准语言)

DFA相对来说要求会更加严格 每一个可能的输出都有且只有一条输出

L = { w | w contains 101 as substring}

DFA(deterministic finite automata)(确定有限自动机) for L 

transition table for DFA:

代码实现

switch(state)case q0:if sym == 0 go to q0if sym == 1 go to q1case q1:if sym == 0 go to q1if sym == 1 go to q2

每一个DFA也是一个NFA 但不是每一个NFA是一个DFA

 NFA(non-deterministic finite automata)(非确定有限自动机) for L


transition table for NFA 

NFA转DFA的方法:subset construction 子集构造法

那么如果用代码实现的话 是DFA更容易实现还是NFA更容易实现呢?
答案是DFA 所以在词法分析的过程中 通常会建立一个DFA

L = {w | w contains the substring 101 or the substring 111}

NFA:

L = {w | w contains the substring 101 or end with the substring 111}

NFA:

regular expression(正则表达式)

Thompson’s Construction: 把 regular expression 转换成 NFA
 NFA转DFA的方法:subset construction 子集构造法

正则表达式是我们人类最容易理解的方式 我们需要把regular expression先转换成NFA 然后再通过子集构造法转换成最终的DFA
只有转换成DFA 我们才能直观的进行代码编写

有一个叫做flex的工具 可以帮助我们完成这些转换 我们只要输入一个正则表达式 这个工具就能返回c语言代码

L = { w | w contains 101 as substring} 的正则表达式为:

(0 U 1)* 101 (0 U 1)*
或者也可以写成 ∑* 101 ∑*        //这里的∑*就代表所有可能的输入

接下来再给出两个正则表达式的例子

L = {w | w has an even length}     //偶数长度

(∑∑)*

L = {w | w has an odd length}     //奇数长度

∑(∑∑)*

正整数的正则表达式
regular expression for unsigned int:        [0 - 9]*        允许0开头 且 允许空字符串
                                                                 0 U [1 - 9][0 - 9]*        不允许0开头

0 U [1 - 9][0 - 9]* 的NFA:

变量的命名规则和其正则表达式        (_ U [a - z]) ([a-z] U [0 - 9] U _)*
它的NFA:

编译器-有限自动机和正则表达式相关推荐

  1. 【计算理论】正则语言 ( 推广型的非确定性有限自动机 GNFA | 删除状态 | 确定性有限自动机 转为 正则表达式 )

    文章目录 一.推广型的非确定性有限自动机 ( GNFA ) 引入 二.推广型的非确定性有限自动机 ( GNFA ) 删除状态 三.确定性有限自动机 ( DFA ) 转为 正则表达式 四.确定性有限自动 ...

  2. 编译器设计-有限自动机

    编译器设计-有限自动机 Compiler Design - Finite Automata 有限自动机是一种状态机,它以一串符号作为输入,并相应地改变其状态.有限自动机是正则表达式的识别器.当正则表达 ...

  3. 【计算理论】计算理论总结 ( 正则表达式转为非确定性有限自动机 NFA ) ★★

    文章目录 一.正则表达式 二.正则语言运算示例 ★ 三.根据正则表达式构造自动机 一.正则表达式 1 . 正则表达式原子定义 : 如果 RRR 是 字符集 Σ\SigmaΣ 中的 111 个字符 , ...

  4. 动手实现正则表达式引擎

    http://www.graphviz.org/ 原文地址: http://swtch.com/~rsc/regexp/regexp1.html 下面两张表是两种正则表达式引擎的表现.其中一种用在许多 ...

  5. 正则表达式匹配也可以简单快速(下:实现部分)

    转载请注明译者: phylips@bmy 出处: http://duanple.blog.163.com/blog/static/7097176720099402916150/   实现 Thomps ...

  6. [No0000160]常用C# 正则表达式大全

    正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串.正则表达式无疑是处理文本最有力的工具,而.NET提供的Regex类实现了验证正则表达式的方法.Regex 类表示不可变(只读)的正则表达式 ...

  7. 正则表达式原理及引擎实现

    转载请注明作者: phylips@bmy 出处: http://duanple.blog.163.com/blog/static/7097176720098303134160/ 概述 在正则表达式领域 ...

  8. 全面剖析C#正则表达式

    C#中的正则表达式包含在.NET基础雷库的一个名称空间下,这个名称空间就是System.Text.RegularExpressions.该名称空间包括8个类,1个枚举,1个委托.他们分别是:      ...

  9. .NET中的正则表达式 (三)RegexCompilationInfo 类

    RegexCompilationInfo 类 提供编译器用于将正则表达式编译为独立程序集的信息. 属性 IsPublic:获取或设置一个值,该值指示所编译的正则表达式是否具有公共可见性. Name:获 ...

  10. C#中的正则表达式引擎

    目录 介绍 背景 使用代码 兴趣点 下载示例,实现源和二进制文件 - 109.8 KB 介绍 为什么还要在.NET包含丰富的正则表达式库时生成正则表达式引擎? 首先,正则表达式引擎有两大类--回溯和非 ...

最新文章

  1. 如何用windows系统访问Linux系统的web网站
  2. PHP 使用 Redis
  3. Java项目:基于SSM实现房屋租赁系统
  4. 不该被忽视的CoreJava细节(四)
  5. 说人话教AI打游戏,Facebook开源迷你版星际争霸,成果登上NeurIPS 2019
  6. SAAS,象B2C那样的B2B分销系统
  7. java代码示例(6-3)
  8. KMP算法 java版本
  9. java cha r转string_JAVA String.format 方法使用介绍
  10. 以一个通俗易懂的方式解释一下写程序为什么要声明接口和类,面向对象的编程思想,字数不多,主要通过代码理解
  11. Csdn Blog 开发团队致广大网友的一封信
  12. 基于Web的MIS系统环境配置和相关含义(拷贝版)
  13. 如果突然多了一笔财富。。
  14. 实习踩坑之路:ElasticSearch双写数据不同步?不实时?怎么优化?
  15. C/C++创建服务器和客户端的demo
  16. python 建站 上传文件_Python sdk上传
  17. 西北大学本科毕业论文答辩PPT模板
  18. 走进微软亚洲研究院随笔
  19. 语义版本号(Semantic Versioning)
  20. 计算机网络概述 网络的起源与发展

热门文章

  1. vmware 虚拟机安装系统成功,没有虚拟网卡的完美解决方法
  2. 一种用于压力传感器的温度控制系统设计
  3. 千古第一文人苏轼的众CP
  4. 小技巧(8):Word中自定义目录,并设置自动目录的格式
  5. 王者荣耀服务器不稳定总是跳频,vivo iQOO Pro 5G手机打玩王者荣耀网络不稳定出现断流...
  6. 「洛谷P2906」[USACO08OPEN]牛的街区Cow Neighborhoods 解题报告
  7. python控制电脑休眠唤醒键_使用Python实现Wake On Lan远程开机功能
  8. 2022年全球市场电动线性气缸总体规模、主要生产商、主要地区、产品和应用细分研究报告
  9. 23个可以免费学习编程的网站
  10. python案例小游戏