二十天内补完编译技术(编译原理)——目前进度【LR(0),SLR,LR(1),LALR】

这是第一篇,突然觉得应该继续总结总结才行,所以学期末趁着赶进度“预习”别人复习的内容时的空余时间梳理一下知识。

进入语法分析之后感觉编译技术这门课明显变难了,表现为看书的过程中感觉特别多的字23333,感觉好不容易看完了一两页却感觉看的内容都是不知道有什么用的东西,而看老师的ppt又觉得太过简略。但是知识就是这样,温故而知新,在我慢慢的做完第六次作业之后,我回首一看之前的内容,顿时感觉豁然开朗,知识点已经连成线了,这种感觉非常爽。


下面说明需要用到的例子:

表达式文法:

E->E+T|T

T->T*F|F

F->(E)|id


 

先是自底向上语法分析这个概念——

从一个输入串构造语法分析树,比如书中的例子就是怎么样把输入的id*id还原成E,而LR(0),SLR,LR(1),LALR这四种方法实际上都是为了达成这样的目的来证明语法分析没有出错。

二十天内补完编译技术(编译原理)——目前进度【LR(0),SLR,LR(1),LALR】_第1张图片

首先最开始它就告诉我这玩意的通式叫“移进-归约”分析,但是肯定还是云里雾里。先解释归约,实际上就是把用E->E+T这样的文法把输入串中的具有文法右边形式的简化成左边形式的,最终归约的目的就是回到初始的非终结符,比如表达式文法需要使得整个输入可以简化为一个E。而移进是专门指代分析过程,我们分析是从前往后读入输入串的,在每次输入串的单个输入为a时,我们需要根据此时已经读入的存放在栈中的内容的状态来决定——是把a加入栈中呢还是暂时不处理a而是对栈中内容进行归约呢?当最后成功读完时可以进入接受操作,中途发生错误则报错并调用错误恢复子程序(这里不用管)。

举个例子,id*id$是原始输入串,栈中最开始只有结束符号$(这里的$都用来作为结束符),此时需要先移进一个id进入栈,然后栈中内容变成$id,输入串变成*id$,此时考虑到输入串的当前输入是*,而栈中的内容可以通过F->id这一文法进行归约,所以下一步我们放弃移进而是选择归约,于是变成栈中是$F,输入串还是*id$。

这是最基础的例子,而实际上LR(0),SLR,LR(1),LALR这四种方法就是对移进-归约分析的不同程度的限制来解决何时归约以及按照哪一个文法产生式进行归约这两个问题以求得到结果,按照分析能力来说排序是LR(0)

和LL分析(最左推导)不同的是,LR方法都是最右推导的逆过程(叫做规范归约),而最右推导的定义就是能先转化最右边的非终结符号就先转化最右边,如此我们反向归约的时候才可以按照顺序优先归约左边的输入串。

 


下一个是句柄。其实就是一个简单的定义,每次需要把哪些内容归约,这些内容就是当前的句柄,且句柄只会出现在栈的顶端(可以是栈顶的长度不限制的串)。只需要知道这个就可以做题了。


二十天内补完编译技术(编译原理)——目前进度【LR(0),SLR,LR(1),LALR】_第2张图片

上面是项的定义,实际上就是文法产生式加上一个圆点和一个搜索符号串组成,对于最简单的LR(0)这类不提前读取输入串的分析方法来说不需要搜索符号所以被省略。(之所以项加一的原因就是类似于——三棵树可以产生四个被阻隔的位置)

而项集的定义就是项组成的集合,而最重要的两个函数就是求项集I的闭包CLOSURE(I)和GOTO(I,X),四种方法的这两种方法的实现大同小异,在这篇专栏不再一一细讲。其中往往需要用到FIRST,FOLLOW函数来辅助求解。最终得到的是全部项集闭包,其每一个项集闭包对应自动机的一种状态,每一个GOTO对应不同状态间的转化,每一个包含圆点在最后的项的项集闭包都可以作为自动机的结束状态(进行一次归约),以此达到语法分析的目的。


接着是LR分析表的构建,实际上就是用来存储读取输入串过程的状态转换和操作选择的表,只需要根据之前画的项集闭包组成的自动机就可以制造出这样的分析表。

二十天内补完编译技术(编译原理)——目前进度【LR(0),SLR,LR(1),LALR】_第3张图片

二十天内补完编译技术(编译原理)——目前进度【LR(0),SLR,LR(1),LALR】_第4张图片

接着需要用驱动程序去处理LR分析表,这一步也很简单,就是一步步读入输入串根据栈中内容(实际上就是当前状态),再读取分析表中对应表项来决定应该选择的操作(移进,归约或者报错,接受acc)


可行前缀看看定义就行了,说实话这个感觉有点话特别多但是特别没用的感觉,做题目来看这个定义似乎并没啥用,还影响心情,弄的脑子很乱。


SLR就是在LR(0)基础上增加了归约限制,即必须输入串的当前输入和归约项FOLLOE集合来决定移进和归约

二十天内补完编译技术(编译原理)——目前进度【LR(0),SLR,LR(1),LALR】_第5张图片

LR(1)分析进一步加入了搜索符号串增加归约限制,确保只有接下来的输入串是搜索符号串时才进行归约

二十天内补完编译技术(编译原理)——目前进度【LR(0),SLR,LR(1),LALR】_第6张图片

LALR则是对LR(1)的简化,因为LR(1)太过复杂含有过多状态,所以LALR进行了部分合并

二十天内补完编译技术(编译原理)——目前进度【LR(0),SLR,LR(1),LALR】_第7张图片

你可能感兴趣的:(编译技术)