首先我们来介绍一下LL(1)文法分析。
LL(1)文法是一种自顶向下的分析方式,是从非终结符到终结符的分析方式,这种方式和我们之前说的LR(0)分析方式是刚好相反的,在我们使用LR(0)分析方式的时候。我们可以看到这个符号栈是由开始空的而后变为终结符之后再变为非终结符的过程。
下面介绍一下用LL(1)文法进行分析句子的过程。
首先要写出FIRST集和FOLLOW集。
之后根据FIRST集和FOLLOW集来进行预测分析表的构造
预测分析表构造的时候若FIRST集没有推出ε那么就可以直接在预测分析表的FIRST集的位置填入原非终结符所对应的定义项。如果推出了ε,那么就要在FOLLOW集的位置填入ε。
当然,我们要注意的一个地方就是如果表中的一个空格中填入了两个元素(select集交集非空),那么就说明这个文法不适合用LL(1)文法来分析,就要改变分析方式。
下面讲一下具体的分析过程
符号栈的开始是非终结符S
输入串的栈中的内容是输入串的从尾部逐个输入栈。
之后我们要从之前填好的预测分析表中来找到对应的规则,从这个非终结符开始,将非终结符变为终结符和非终结符的和。之后,一旦这个符号栈和这个输入串的栈的栈顶相同,那么就可以进行弹出栈顶元素。因为我们弹出的结果肯定是终结符,所以剩下的结果肯定是一个非终结符。当栈顶的元素被不断地弹出之后,之后如果这个符号栈和输入串的栈均为空的时候,就可以表明现在的分析是成功的。
![876ad496bce2dee5b91838db0d36d7cd.png](https://i-blog.csdnimg.cn/blog_migrate/6203f60d552092535d873cf13479aa37.jpeg)
之后我们来介绍一下简单优先分析
简单优先分析是按照终结符和非终结符之间的优先关系来确定句柄的。
这里首先给出优先关系的定义,这里的优先关系的定义要在原先的“>”,“
当两个符号直接连在一块的时候例如……XYZ……则XYZ的优先关系相等。如果Y还可以继续向下推,则有XZ
若两个都能继续向下推,由于我们从最左下角的句柄开始进行规约,所此时左边推出的优先级要大于右边的优先级。关于句柄的概念我们在下一章的算符优先分析中再进行介绍。
这里知道了关系之后我们就可以根据它们的关系来构造关系矩阵表。简单优先分析的关系矩阵中是出现过得所有的元素,包含终结符和非终结符。
从文法的第一个句子开始向后找关系,之后把关系矩阵写出来,需要注意的是这里的大于号和小于号是不能交换的比如A>B并不等于B
简单优先分析方法的步骤
首先这里分为符号栈,关系,输入串栈,规则,四个对应的
符号栈开始为#,输入串的栈为我们要分析的字符串的逆序入栈。当关系为小于和等于的时候输入栈的栈顶弹出进入符号栈,关系为大于的时候进行规约。
我们直接查表来进行比较要注意,此时文法的开始符号的旁边有这个“#”,也可以由此得到“#”和文法开始符号之间的关系。
在进行规约的时候,我们要在后面的规则中写出对应的文法。之后一直是这个过程直到规约到文法的初始符。