CS143 斯坦福大学编译原理-001 Lexical Analysis
简介
概述
词法分析作为编译的第一步骤,需要将输入的字符串文本(即源代码),解析为基本词素(Token)。每个词素需要包含类型和对应源码的字符串(Lexeme)。 在实现上一般由语法解析器驱动词法分析器进行分析。 实现上一般被称作Lexer(词法分析器)。 一般词素类别有:
- Identifier(标识符)
- Keywords(关键词)
- (){}[]
- Numbers(数字)
- Whitespace(空白符)
- Operator(操作符)
在分割过程中,也需要检测非法地token。 词法分析程序产生器LEX,使用根据词法规则生成C语言词法分析器。
原理
Regular Language(正则语言)
基本定义
单个字符组成的集合为c={“c”},“c”代表任意字符。 空字符集ε={““},注意集合不为空,仅仅字符为空。 所有字符集合
基本操作
Union(合并):
示例
表示所有1元素的集合:
Formal Language(形式语言)
所有字符集合
Lexical Specifications(词法规范)
可以定义基本词素。 数值:
流程
通用步骤
- 定义Token 具体可以参考[[#Lexical Specifications(词法规范)]]
- 构造R与匹配所有Token 利用定义的Token,构造正则式:
- 循环解析输入字符串 对于输入长度为n的字符串。 找到
,使得 ; 若成功找到 ,可以根据 正则式获取所有token;并将 从输入字符串中移除;
要求
匹配R时采用最大匹配方式 token需要按照优先级排列匹配R列表 尽可能多的定义错误R,并将其放入列表尾部。可以反馈错误的地方
注意
一般词法分析有语法分析主导,不会单独解析。
实现
Finite Automata(有限自动机)
简介
正则式主要描述规则,则有限自动机实现这些规则。
符号定义
输入字母表:
图形表示法
状态:
开始状态:
可接受状态:
输入为a时,状态转化:
基本规则
判定
若输入结束并且当前状态可接受,则完成转换。 其他情况拒绝。此时: 最终状态为非可接受状态;转换停止;
两类自动机区别
- DFA对于相同输入只有一条路径
- NFA对于相同输入存在不同的路径(有选择)
- DFA和NFA可以实现相同的语言
- DFA执行速度更快
- 一般来说,NFA实现体积小
Deterministic Finite Automata(确定的有限自动机)
DFA对于相同输入只有一条路径
表格实现
X轴为输入:
Non-Deterministic Finite Automata(不确定的有限自动机)
NFA对于相同输入存在不同的路径(有选择)
图形表示
表达式M:
解析
解析
解析
解析
解析
闭包函数
示例

图中可以获得部分闭包函数
转化为DFA
- 假定NFA有符号: 状态集合:
起始状态: 可接受的状态子集: 输入为a时,转换后集合: - 假定被转化的DFA有符号: 状态集合:
开始状态: 最终状态: 能够转换的条件为:
示例
有如下NFA图形
转换后DFA图形 
表格实现
X轴为输入: