都说编译原理挺难,其实它并不像大家想象中的那么难, 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 |