步骤
- 词法分析
- 语法分析
- 语义分析与中间代码产生
- 优化
- 目标代码生成
文法
- 3型文法:正则文法,用于描述程序设计语言词法的有效工具
- 2型文法:上下型无关文法,描述程序语法的有效工具
产生式
A -> B
B -> BC|C
C -> 0|1|2|3|4|5|6|7|8|9
推导与规约
A -> aBc
B -> b
==================
aBc是abc的归约
abc是aBc的推导
规范推导/规约
规范推导:最右推导
规范规约:最左规约
无符号串
=》数字串
=》数字串+数字
=》数字串6
=》数字6
=》56
句型
由产生式到最终状态之间的中间串
例如<数字>9
句子
产生式最终匹配的终态
例如56是文法无符号整数的一个句子
词法分析
有限自动机
DFA
确定有限自动机:每个状态在接收下一个输入,只会转移到唯一一个下一个状态
L(M):代表由FA能够识别的所有字符串的总体
NFA
非确定有限自动机,自动机中含有某些状态,在接收下一个输入后,会转移到多于一个的状态
NFA确定化
每个NFA都存在一个DFA,使得L(NFA) = L(DFA),也就是说等价
NFA的确定化就是,从NFA转变为DFA的过程
- c-closure(state):c-闭包,从一个状态转移不需要通过输入可以直接转移到下一个状态的集合
- move(state, action):从状态state,通过action,转换到的下一个状态的集合
- a弧转换的闭包:I = c-closure(move(state, action))
子集构造法
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sideDoGL-1594611776650)(http://upload-images.jianshu.io/upload_images/24077087-6f91da5d1ba4bd27.PNG)]
然后把I列表标记为状态,并画出DFA
在NFA->DFA后,得到的DFA并不是最简的,必须通过DFA最简化处理,来提高分析的效率
DFA最简化
- 多余状态:从开始状态出发无法到达的状态
- 死状态:从此状态出发无法到达最终状态的状态
- 无关状态:多余状态+死状态
- 等价状态(不可区别状态):当两个状态,输入任意action,都转移到相同的状态时,代表这两个状态是等价的。
简化步骤为:
- 消除无关状态
- 合并等价状态