# 编译原理

comming soon... 本文正在筹划中

三大经典书籍,个人推荐先读虎书,比较易读:

  • 《编译原理》(龙书)
  • 《现代编译原理:C语言描述》(虎书)
  • 《高级编译器设计与实现》(鲸书)

# 概述

# 词法分析

术语:

  • 有限自动机 (Finite Automata, FA) 指的是状态的数量有限
  • 确定有限自动机 (deterministic finite automaton, DFA),按照虎书的话说就是: "no two edges leaving from the same state are labeled with the same symbol"
  • 非确定有限自动机 (nondeterministic finite automaton, NFA)

实现词法分析的两种方案:

  • 手写词法分析器
  • 用正则表达式 (regular expressions) 描述词法,然后用 DFA 实现

用正则表达式描述词法会存在二义性 (ambiguous),有两种消除二义性的办法:

  • Longest match
  • Rule priority: 以第一个匹配到的正则表达式为准,所以正则表达式规则的书写顺序很重要

《虎书》在 ch2.2 用正则表达式描述了一门语言,然后在 ch2.3 画了相应的 DFA,ch2.3 还用转换矩阵 (transition matrix) 实现了这个 DFA。为了解决二义性问题,ch2.3 还实现了一种 longest match 的算法。

《虎书》在 ch2.4 说正则转 NFA 很容易,但程序实现 NFA 很困难 (需要试错、回溯,时间复杂度高)。为此 ch2.4.2 给出了一种 NFA 转 DFA 的算法,本质就是广度优先搜索。所以我们通常会:写正则 -> NFA -> DFA -> 实现 DFA。