本次笔记内容: 3-1 正则表达式 3-2 正则定义 3-3 有穷自动机 3-4 有穷自动机的分类 3-5 从正则表达式到有穷自动机 3-6 从NFA到DFA的转换 3-7 识别单词的DFA
文章目录
词法分析:正则表达式
正则表达式的定义
正则表达式简单例子
例子:C语言无符号整数的RE
正则语言
RE的代数定律
正则文法与正则表达式等价
正则定义
正则定义(Regular Definition)
例1:C语言中标识符的正则定义
例2:(整型或浮点型)无符号数的正则定义
词法分析重大理论基础:有穷自动机(FA)
起源与定义
FA的典型例子(电梯控制装置)
FA模型
FA模型
转换图
FA定义(接收)的语言
最长子串匹配原则(Longest String Matching Principle)
FA分类
确定的有穷自动机(DFA)
例:一个DFA
非确定的有穷自动机(NFA)
例:一个NFA
DFA和NFA的等价性
带有" ϵ \epsilon ϵ - 边"的NFA
带有和不带有" ϵ \epsilon ϵ - 边"的NFA的等价性
DFA的算法实现
从正则表达式到有穷自动机
根据RE构造NFA
例: r = ( a ∣ b ) ∗ a b b r=(a|b)^* abb r=(a∣b)∗abb对应的NFA
从NFA到DFA的转换
例子1:DFA一个状态代表NFA多个状态
例子2:从带有ε-边的NFA到DFA的转换
子集构造法
识别单词的DFA
识别标识符的DFA
识别无符号数的DFA
识别各进制无符号整数的DFA
识别注释的DFA
识别Token的DFA
词法分析阶段的错误处理
词法分析:正则表达式
正则表达式可以更好地描述语言,非正则例子如下:
语 言 L = { a } { a , b } ∗ ( { ϵ } ∪ ( { . , _ } { a , b } { a , b } ∗ ) ) 语言L = \{ a \} \{ a,b \}^* (\{ \epsilon \} \cup ( \{ .,\_ \} \{a,b\} \{ a,b \}^* )) 语言L={
a}{
a,b}∗({
ϵ}∪({
.,_}{
a,b}{
a,b}∗))
正则表达式(Regular Expression, RE)是一种用来描述正则语言的更紧凑的表示方法。
例如,上式可以用正则表达式表示: r = a ( a ∣ b ) ∗ ( ϵ ∣ ( . ∣ ) ( a ∣ b ) ( a ∣ b ) ∗ ) r=a(a|b)^* (\epsilon | (.|_)(a|b)(a|b)^*) r=a(a∣b)∗(ϵ∣(.∣)(a∣b)(a∣b)∗)
句子的第一个符号是字母a;接下来连接一个任意长度的ab串;接下来连接一个空串,此时句子结束;除此之外,还可以连接一个.或者_,接下来再连接一个长度大于等于1的ab串。
正则表达式可以由较小的正则表达式按照特定规则递归地构建。每个正则表达式r定义(表示)一个语言,记为 L ( r ) L(r) L(r)。这个语言也是根据 r r r的子表达式所表示的语言递归定义的。
正则表达式的定义
ϵ \epsilon ϵ是一个RE, L ( ϵ ) = { ϵ } L(\epsilon)=\{ \epsilon \} L(ϵ)={
ϵ}
如果 a ∈ Σ a \in \Sigma a∈Σ,则 a a a是一个RE, L ( a ) = { a } L(a)=\{ a \} L(a)={
a}
假设 r r r和 s s s都是RE,表示的语言分别是 L ( r ) L(r) L(r)和 L ( s ) L(s) L(s),则
r ∣ s r|s r∣s是一个RE, L ( r ∣ s ) = L ( r ) ∪ L ( s ) L(r|s)=L(r) \cup L(s) L(r∣s)=L(r)∪L(s)
r s rs rs是一个RE, L ( r s ) = L ( r ) L ( s ) L(rs)=L(r)L(s) L(rs)=L(r)L(s)
r ∗ r^* r∗是一个RE, L ( r ∗ ) = ( L ( r ) ) ∗ L(r^*)=(L(r))^* L(r∗)=(L(r))∗
( r ) (r) (r)是一个RE, L ( ( r ) ) = L ( r ) = L ( r ) L((r))=L(r) = L(r) L((r))=L(r)=L(r)
运算的优先级为:*、连接、|。
正则表达式简单例子
令 Σ = { a , b } \Sigma = \{ a,b \} Σ={
a,b},则
L ( a ∣ b ) = L ( a ) ∪ L ( b ) = { a } ∪ { b } = { a , b } L(a | b)=L(a) \cup L(b)=\{a\} \cup\{b\}=\{a, b\} L(a∣b)=L(a)∪L(b)={
a}∪{
b}={
a,b}
L ( ( a ∣ b ) ( a ∣ b ) ) = L ( a ∣ b ) L ( a ∣ b ) = { a , b } { a , b } = { a a , a b , b a , b b } L((a | b)(a | b))=L(a | b) L(a | b)=\{a, b\}\{a, b\}=\{a a, a b, b a, b b\} L((a∣b)(a∣b))=L(a∣b)L(a∣b)={
a,b}{
a,b}={
aa,ab,ba,bb}
L ( a ∗ ) = (