Keyboard shortcuts

Press or to navigate between chapters

Press ? to show this help

Press Esc to hide this help

有限自动机(进阶)

复习

  • 正则表达式:用组合规则描述词法模式
  • 手写词法分析器:本质是一个状态机
  • 语言与文法:用规则描述语言

本章为进阶内容,零基础读者可以跳过,不影响后续阅读。

TL;DR

  • 有限自动机是只有有限状态的识别机器
  • 它逐字符读入,依据当前状态转移
  • 正则表达式可以机械地转成有限自动机
  • 它正是“自动生成词法分析器”的原理

正文

  上一章说,正则表达式很适合描述词法规则。可正则毕竟是“描述”,计算机要真正识别一个字符串符不符合正则,还得把它变成一台能运转的机器。这台机器,就是有限自动机(finite automaton,FA)。

一台只有有限状态的机器

  有限自动机由几样东西组成:

  • 一组状态(数量有限)
  • 一组转移规则:在某个状态读到某个字符,就跳到某个状态
  • 一个起始状态和若干接受状态

  它从起始状态出发,逐个读入字符,按转移规则改变状态。读完整个输入后,如果停在接受状态,就说明这个字符串“被接受”,属于所描述的语言。

  这也解释了它名字里的“有限”:它只能靠有限个状态来“记住”信息,没有无限的记忆能力。 正因如此,它识别不了“任意嵌套的括号”——那需要数不清的层数,超出有限状态的表达力。

两类:DFA 与 NFA

  有限自动机有两种常见形式:

  • 确定性(DFA):每个状态对每个字符,只有唯一一条转移,走法是确定的
  • 非确定性(NFA):同状态下、同一字符,可能有多条转移,甚至可以不读字符就“空跳”

  直觉上 NFA 更灵活、更难直接执行,但有个漂亮的结果:任何 NFA 都能转成等价的 DFA。

从正则到自动机

  更有意思的是:任何正则表达式,都能机械地转成一台有限自动机。 连接、选择、重复这些运算,各自都有对应的构造方式;NFA 再转成 DFA,就得到一台可以直接运行的识别机器。

  这条流水线的意义非同小可:你只要把词法规则写成正则,程序就能自动生成词法分析器。 这比手写省力得多,也不容易出错。

  于是,正则在“描述”和“执行”之间,由有限自动机架起了一座桥。一层负责声明规则,一层负责落实执行——又是分层的思路。

  到这里,字符已经能可靠地变成一个个词法单元了。下一组,我们要回答更大的问题:怎样把这些词,组织成有结构的语法树?

思考题 1

  有限自动机为什么叫“有限”?它最多能记住多少信息?

思考题 2

  把正则表达式转成有限自动机,对自动生成词法分析器有什么意义?

小结

知识点

  • 有限自动机由有限状态、转移、起始与接受状态构成
  • 它逐字符读入并转移,按结束状态判断是否接受
  • 分 DFA(确定)与 NFA(非确定)
  • 任何正则表达式都可转成等价的有限自动机

参考资料

  1. Wikipedia(zh):有限自动机:有限状态的字符串识别机器
  2. Wikipedia(zh):确定有限自动机:每个状态转移唯一的自动机

思考题答案(仅供参考)

思考题 1

  “有限”指它的状态数量是有限的,因此能记住的信息也有限(本质上只是“当前处于哪个状态”)。它无法记录任意大的计数或任意深的嵌套,所以识别不了需要无限记忆的语言。

思考题 2

  因为正则表达式可以机械地转成有限自动机,而有限自动机是可以直接执行的识别机器。于是只需把词法规则写成正则,程序就能自动生成词法分析器,省去手写,既高效又不易出错。

协议

  本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

封面图

设计师 | 南国微雪