编译器-有限自动机和正则表达式
编译器的词法分析是基于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:
编译器-有限自动机和正则表达式相关推荐
- 【计算理论】正则语言 ( 推广型的非确定性有限自动机 GNFA | 删除状态 | 确定性有限自动机 转为 正则表达式 )
文章目录 一.推广型的非确定性有限自动机 ( GNFA ) 引入 二.推广型的非确定性有限自动机 ( GNFA ) 删除状态 三.确定性有限自动机 ( DFA ) 转为 正则表达式 四.确定性有限自动 ...
- 编译器设计-有限自动机
编译器设计-有限自动机 Compiler Design - Finite Automata 有限自动机是一种状态机,它以一串符号作为输入,并相应地改变其状态.有限自动机是正则表达式的识别器.当正则表达 ...
- 【计算理论】计算理论总结 ( 正则表达式转为非确定性有限自动机 NFA ) ★★
文章目录 一.正则表达式 二.正则语言运算示例 ★ 三.根据正则表达式构造自动机 一.正则表达式 1 . 正则表达式原子定义 : 如果 RRR 是 字符集 Σ\SigmaΣ 中的 111 个字符 , ...
- 动手实现正则表达式引擎
http://www.graphviz.org/ 原文地址: http://swtch.com/~rsc/regexp/regexp1.html 下面两张表是两种正则表达式引擎的表现.其中一种用在许多 ...
- 正则表达式匹配也可以简单快速(下:实现部分)
转载请注明译者: phylips@bmy 出处: http://duanple.blog.163.com/blog/static/7097176720099402916150/ 实现 Thomps ...
- [No0000160]常用C# 正则表达式大全
正则表达式的本质是使用一系列特殊字符模式,来表示某一类字符串.正则表达式无疑是处理文本最有力的工具,而.NET提供的Regex类实现了验证正则表达式的方法.Regex 类表示不可变(只读)的正则表达式 ...
- 正则表达式原理及引擎实现
转载请注明作者: phylips@bmy 出处: http://duanple.blog.163.com/blog/static/7097176720098303134160/ 概述 在正则表达式领域 ...
- 全面剖析C#正则表达式
C#中的正则表达式包含在.NET基础雷库的一个名称空间下,这个名称空间就是System.Text.RegularExpressions.该名称空间包括8个类,1个枚举,1个委托.他们分别是: ...
- .NET中的正则表达式 (三)RegexCompilationInfo 类
RegexCompilationInfo 类 提供编译器用于将正则表达式编译为独立程序集的信息. 属性 IsPublic:获取或设置一个值,该值指示所编译的正则表达式是否具有公共可见性. Name:获 ...
- C#中的正则表达式引擎
目录 介绍 背景 使用代码 兴趣点 下载示例,实现源和二进制文件 - 109.8 KB 介绍 为什么还要在.NET包含丰富的正则表达式库时生成正则表达式引擎? 首先,正则表达式引擎有两大类--回溯和非 ...
最新文章
- 如何用windows系统访问Linux系统的web网站
- PHP 使用 Redis
- Java项目:基于SSM实现房屋租赁系统
- 不该被忽视的CoreJava细节(四)
- 说人话教AI打游戏,Facebook开源迷你版星际争霸,成果登上NeurIPS 2019
- SAAS,象B2C那样的B2B分销系统
- java代码示例(6-3)
- KMP算法 java版本
- java cha r转string_JAVA String.format 方法使用介绍
- 以一个通俗易懂的方式解释一下写程序为什么要声明接口和类,面向对象的编程思想,字数不多,主要通过代码理解
- Csdn Blog 开发团队致广大网友的一封信
- 基于Web的MIS系统环境配置和相关含义(拷贝版)
- 如果突然多了一笔财富。。
- 实习踩坑之路:ElasticSearch双写数据不同步?不实时?怎么优化?
- C/C++创建服务器和客户端的demo
- python 建站 上传文件_Python sdk上传
- 西北大学本科毕业论文答辩PPT模板
- 走进微软亚洲研究院随笔
- 语义版本号(Semantic Versioning)
- 计算机网络概述 网络的起源与发展
热门文章
- vmware 虚拟机安装系统成功,没有虚拟网卡的完美解决方法
- 一种用于压力传感器的温度控制系统设计
- 千古第一文人苏轼的众CP
- 小技巧(8):Word中自定义目录,并设置自动目录的格式
- 王者荣耀服务器不稳定总是跳频,vivo iQOO Pro 5G手机打玩王者荣耀网络不稳定出现断流...
- 「洛谷P2906」[USACO08OPEN]牛的街区Cow Neighborhoods 解题报告
- python控制电脑休眠唤醒键_使用Python实现Wake On Lan远程开机功能
- 2022年全球市场电动线性气缸总体规模、主要生产商、主要地区、产品和应用细分研究报告
- 23个可以免费学习编程的网站
- python案例小游戏