课程概览
编译流程(编译原理课程学习什么)
首先,我们对编译流程有个整体的认知,这也可以帮助我们把握课程主线:
基本概念
接着,我们来了解一些基本概念:
- 二义性:
- 四类形式语言及文法的分类:
接着,我们进入第一个阶段:词法分析。
词法分析
概览
在实际编码中如何将图转化为实际代码呢?以下是一些基本原则:
这里穿插一个很重要的概念:
如何判定两个正规(正则式)等价?
它们对应的正规集相等。
通过正规式构造DFA(反之亦然)
将正规式转为图的形式:
以下是一些转化的例子:
整体思路为:抓住主干,先处理优先级最高的,再按规则不断细分每个部分。
NFA转化为DFA:子集法
- 原理:将状态间的关系转化为状态集之间的关系
- 关键词:ε-closure;move(T,α)
- 基本概念:
- ε-closure(A):从A出发经过ε弧所能到达的状态的集合
- move(T,α):从T出发严格经过ε弧所能到达的状态的集合
- 原NFA的起始状态的ε-closure(move(T,α)就是确定化后的DFA的起始状态
- 含有原NFA终止状态的I都是确的DFA的终止状态
以下是一道例题:
题目要求:确定化如上图所示的NFA。
解题思路:
- 从初始状态的I开始,找出经过不同输入所到达的状态,并将每次出现的新状态加入到状态集合中,直到没有出现新状态。注意空集也要列出。
- 重命名
其中※号表示终态。
- 画新图
DFA最小化:分割法
核心思想:分割子集,使不同子集间可区分,同一子集内状态等价。 具体实现步骤:
- 第一步先划分初态和终态。
- 之后,要判断某个子集中的元素是否需要再次拆分,可对比子集内的元素获得同一输入后所到达的状态是否属于不同集合,如果属于不同集合,说明这些元素也是应该属于不同集合,需要进行拆分。
- 将化简后的状态重命名并画图。
以下是一道例题:
- 可以先列出不同状态对应输入的输出,以便后续快速参考
- 参照上面的具体实现步骤对集合进行划分
- 重命名并画图