正则表达式
-
正则表达式简单介绍
-
正则表达式定义
-
- R E RE RE 是 正则表达式 缩写
-
-
例: C语言无符号整数的RE
-
-
RE 的代数定律
-
正则语言
- 可以用RE定义的语言叫做正则语言(regular language)或正则集合(regular set)
-
正则文法与正则表达式等价
- 对任何正则文法 G G G,存在定义同一语言的正则表达式$ r $
- 对任何正则表达式 r r r,存在生成同一语言的正则文法 G G G
正则定义
为了方便起见,给某些正则表达式命名,然后像使用字母表中的符号一样使用这些名字来构建正则表达式
-
例1
-
C语言中标识符的正则定义
-
digit(数字) → 0|1|2|…|9
-
letter_ → A|B|…|Z|a|b|…|z|_
-
id → letter_(letter_|digit)*
id 中 体现是的字母打头的字符串,真实标识符的构造方法
-
-
-
例2
有 穷 自 动 机 (Finite Automata, FA )
词法分析的重要基础
- 有穷自动机的典型例子——elevator
- 电梯控制装置
- 输入:顾客的乘梯需求(所要到达的层号)
- 状态:电梯所处的层数+运动方向
- 电梯控制装置并不需要记住先前全部的服务要求,只需要知道电梯当前所处的状态以及还没有满足的所有服务请求
- 电梯控制装置
- FA模型
-
- 输入带(input tape):用来存放输入符号串
- 读头(head ):从左向右逐个读取输入符号(方向确定),不能修改(只读)、不能往返移动
- 有穷控制器( finite control ):具有有穷个状态数,根据当前的
状态和当前输入符号控制转入下一状态
-
FA的表示
-
FA定义(接收)的语言
-
最长子串匹配原则
-
比如 ++ ,<=,中一起出现时,不只是选择 +,<
-
有穷自动机的分类
-
FA的分类
- 确定的FA——DFA
- 非确定的FA——NFA
-
确定的有穷自动机DFA
-
一个DFA
- 转换图和转换表两者的功能是等价的
-
非确定的有穷自动机(NFA)
-
NFA的最终结果不唯一,这个也是 N N N的来源
-
DFA 和 NFA 的等价性
- 对任何非确定的有穷自动机N ,存在定义同一语言的确定的有穷自动机D
- 对任何确定的有穷自动机D ,存在定义同一语言的非确定的有穷自动机N
- DFA和NFA可以识别相同的语言
-
- 通过分析可知:
- NFA表示的为以 a a a a b ab ab a b b abb abb 三种情况
- 仔细分析DFA也可以得到一样的结论,需要注意的是,0 状态不能作为结尾
- 以上的FA表达可以使用左边相同的正则表达式表达,同时正则表达式又与前文说的正则文法等价,所以
- 正则文法 ⇔ 正则表达式 ⇔ FA
- NFA较为直观,DFA在计算机实现上更为容易,两者可以相互转换
- 通过分析可知:
-
-
带有“ε-边”的NFA
-
带有和不带有“ε-边”的NFA 的等价性
-
- 这里图下方的 A A A状态可以作为状态,两个小图的符号不一样
-
-
DFA的算法实现
从正则表达式到有穷自动机
正则表达式采用的是一种符号序列的模式,可以很直观的来描述单词的构成。但是在构造分析器的时候,真正实现或模拟的是DFA。以此这个也是这章要介绍的
- 从正则表达式到有穷自动机
-
从 RE 到 FA 之间进行转换会比较困难,中间引入 N F A NFA NFA 出处理会比较容易
-
根据 RE 构造 NFA
-
例
-
从NFA到DFA的转换
- 从NFA到DFA的转换
-
- NFA转换到DFA
-
例2:从带有ε-边的NFA到DFA的转换
-
- 通过判断 正则表达式来判断 NFA DFA是否等价
-
-
- 子集构造法
-
- 结合上面内容可知,子集构造法容易理解
- 计算 ε-closure (T )
-