编译技术笔记(一) 词法分析

2017.12.23日的吐槽,说实话我也看不懂我这都写的啥了

词法分析器的概念

关于NFA,首先了解状态转换图(由表示状态的元素,和边(连接状态)组成)

状态转换图实例

  • 关系算符的转换
  • 标识符和保留字的转换图
  • 无符号数的转换图
    • digit表示数字, digit+表示不少于一个数字
    • .表示小数点
    • E表示指数
    • ()?表示可有可无

然后可以根据状态图手动编写 词法分析器

  1. 首先通过正则表达式来描述词法单元的模式
  2. 基本目标:判断一个串s是否属于一个正则表达式R表示的语言

词法自动识别的过程中可能遇到的问题:

  • 匹配最长可能的串
  • 排在前面的正则表达式优先匹配
  • 构造一个ERROR正则表达式

##词法分析器生成工具 —— LEX
Lex 是一种词法分析程序的自动构造工具。通常和Yacc一起使用,生成编译器的前端(生成中间代码,后端对程序进行优化)

过程: 正则表达式 -> NFA -> DFA -> minDFA ->词法分析器 (利用了正则表达式和DFA的等价性)

FA 有限自动机

DFA确定的有限自动机(没输入一个字符,进入确定的状态)
NFA不确定的有限自动机

DFA的形式定义:五元组 M=(Σ, Q, q0, F, δ),

P29页对应的正则表达式:(a|b)(aa|bb)(a|b)
或者(b|\e)(ab)(b|aa)(b|a)

DFA 示例2 —— 能被5整除的二进制数
图中表示的状态其实是余数的状态变化。

---------------- ♥ The End ♥ ----------------