都说编译原理挺难,其实它并不像大家想象中的那么难, It’s so easy!
总的来说编译原理可以分为以下几个知识点:文法的分类;不确定的有限状态自动机到确定的有限状态自动机的转换;正则表达式。掌握了这三个知识点,编译原理中每个题的道理了,其实编译原理就是这么回事。
下面具体介绍上面说的三个知识点:
1. 文法的分类(乔姆斯基文法)
做一个表格,简单明了的说明,你一下就明白了
文法类型 |
要求 |
举例 |
0型文法(短语文法) |
左边至少有一个非终结节点 |
A->a,Ab->c |
1型文法(上下文有关文法) |
在0型文法基础上,右边长度不得短于左边的长度 |
A->a,Ab->ab |
2型文法(上下文无关文法) |
在1型文法基础上,每一个α→β都有α是非终结符 |
A->a,B->bc |
3型文法(正规文法) |
在2型文法的基础上,满足:A→α|αB(右线性文法)或A→α|Bα(左线性文法) |
A→α|αB(右线性文法)或A→α|Bα(左线性文法) |
2. NFA->DFA转换
过程大致是首先找开始状态,其次确定输入的数据,然后确定输入数据后分别到达什么状态。举一个例子,大家可以去悟其中的道理,将下图中的NFA转换为DFA
转换过程为:
状态集合 |
输入0到达的状态 |
输入1到达的状态 |
初态{S、1、2、3} |
{1,3,4,5,Z} |
{2,3} |
{1,3,4,5,Z} |
{1,3,4,5,6,Z} |
{空} |
{2,3} |
{4,5,Z} |
{2,3} |
{4,5,Z} |
{6} |
{空} |
{1,3,4,5,6,Z} |
{1,3,4,5,6,Z} |
{5,Z} |
{6} |
{空} |
{5,Z} |
{5,Z} |
{6} |
{空} |
3. 正则表达式
掌握下面3个规则就可以了
规则 |
文法产生式 |
正规式 |
规则1 |
A→xB,B→y |
A=xy |
规则2 |
A→xA|y |
A=x*y |
规则3 |
A→x,A→y |
A=x|y |