目录
  1. 1. 字母表
    1. 1.1. 字母表的运算
  2. 2.
    1. 2.1. 串上的运算
  3. 3. 正则表达式(RE)
    1. 3.1. 正则表达式的定义
    2. 3.2. 正则定义
  4. 4. 有穷自动机(FA)
    1. 4.1. 转换图
    2. 4.2. 最长字串匹配原则
    3. 4.3. 确定的有穷自动机(DFA)
    4. 4.4. 不确定的有穷自动机
    5. 4.5. NFA和DFA的等价性
    6. 4.6. 带有和不带有$\epsilon$边的NFA的等价性
    7. 4.7. 从正则表达式到有穷自动机
      1. 4.7.1. 根据RE构造NFA
      2. 4.7.2. 从NFA到DFA的转换
编译原理复习整理(一)

参考课程为自哈尔滨工业大学的 《编译原理》,参考教材为《编译原理及实践教程》(第三版)。

本文划分仅考虑本人每日复习量,没有章节划分参考价值。

字母表

字母表$\Sigma$十一个有穷符号集合。 (符号包括字母、数字、标点符号)

二进制字母表$\{0,1\}$,ASCII字符集,Unicode字符集都属于字母表。

字母表的运算

  • 乘积: $\Sigma_1\Sigma_2=\{a,b|a\in\Sigma_1, b\in\Sigma_2\}$ Ex: $\{0,1\}\{a,b\}=\{0a,0b,1a,1b\}$
  • 幂:$\begin{equation}\left\{\begin{array}{lr}\Sigma^0 = \{\epsilon\}(空串) & \\ \Sigma^n=\Sigma^{n-1}\Sigma\end{array}\right.\end{equation}$ Ex: $\{0,1\}^3 = \{000,001,010,011,100,101,110,111\}$

  • 正闭包:$\Sigma^+=\Sigma\bigcup\Sigma^2\bigcup\Sigma^3\bigcup\dots$ Ex: $\{a,b,c,d\}^+=\{a,b,c,d,aa,ab,ac,ad,ba,bb,bc,bd,ca,cb,cc,cd,da,db,dc,dd,aaa,\dots\}$

  • (克林)闭包:$\Sigma^*=\Sigma^0\bigcup\Sigma^+$ 就是在正闭包的基础上加上一个空串。

设$\Sigma$是一个字母表,$\forall{x\in\Sigma^*}$,称$x$为$\Sigma$上的一个串,串是字母表中符号的一个有穷序列。

串$s$的长度通常记为$|s|$,指$s$中符号的个数。 Ex: $|aab|=3$

串上的运算

  • 连接:$xy$ , $x=dog, y=house, xy=doghouse$

    对于空串:$\epsilon s=s\epsilon = s$

    设$x,y,z$是三个字符串,若$x = yz$,则$y$为$x$的前缀,$z$为$x$的后缀。

  • 幂运算:$\begin{equation}\left\{\begin{array}{lr}s^0 = \epsilon, & \\ s^n=s^{n-1}s, &n\geq1\end{array}\right.\end{equation}$ Ex: $s=ba,s^1=ba,s^2=baba,s^3=bababa$

正则表达式(RE)

语言可以用集合表示,设语言

正则表达式是一种用来描述正则语言的更紧凑的表示方法。

例如

正则表达式可以由较小的正则表达式按照特定规则递归的构建。每个正则表达式$r$定义(表示)一个语言,记为$L(r)$。这个语言是根据$r$的字表达式递归定义的。

正则表达式的定义

  • $\epsilon$是一个RE,$L(\epsilon) = \epsilon$
  • 如果$a\in\Sigma$,则$a$是一个RE,$L(a) = \{a\}$
  • 假设$r$和$s$都是RE,表示的语言分别为$L(r)$和$L(s)$,则:
    • $r|s$是一个RE,$L(r|s)=L(r)\bigcup L(s)$
    • $rs$是一个RE,L(rs) = L(r)L(s)$
    • $r^$是一个RE,L(r^)=L(r)^*$
    • $(r)$是一个RE,L((r))=L(r)$

运算优先级: $* > $ 连接 $> |$

正则定义

正则定义就相当于一个函数封装。

有穷自动机(FA)

转换图

初始状态用$\Rightarrow$表示, 终止状态用双圈表示。

由一个有穷自动机$M$接收的所有串构成的集合称为是FA定义(或接收)的语言,记为$L(M)$。

有穷自动机

最长字串匹配原则

当输入串的多个前缀与一个或者多个模式匹配时,总是选择最长的前缀进行匹配。

说人话就是到了终止状态,若还有符号,则继续前进。

确定的有穷自动机(DFA)

$S$:有穷状态集

$\Sigma$:输入字母表

$\delta$:将$S\times\Sigma$映射到$S$的转换函数,$\delta(s,a)$表示从s出发,沿a能到达的状态

$s_0$:开始状态(或初始状态),$s_0\in S$

$F$:接收状态(或终止状态)集合,$F\subseteq S$

DFA也可以用转换表来表示

dfa

不确定的有穷自动机

和DFA的区别在于,$\delta(s,a)$表示从s出发,沿a能到达的所有状态的集合

nfa

NFA和DFA的等价性

NFA和DFA的等价性

在上图的DFA中,状态1表示串以a结尾,状态2表示串以ab结尾,状态3表示串以abb结尾。

他们都是$r=(a|b)^*abb$,由此$RE \Leftrightarrow FA \Leftrightarrow 正则文法$。

带有和不带有$\epsilon$边的NFA的等价性

从正则表达式到有穷自动机

根据RE构造NFA

从NFA到DFA的转换

子集构造法。

文章作者: QF
文章链接: http://blog.logan-qiu.cn/posts/b4e4b501/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 QF的个人博客
打赏
  • 微信
  • 支付宝

评论