LL(1)文法的递归预测分析法和非递归预测分析法

关于递归的预测分析法,可以先看下下面的示例图

如果是非递归的预测分析法,预测分析器由一个输入带,读头和一个带有预测分析表的控制器构成,从下面这样的自动机的构造来看其实和有穷自动机的构造是相似的,有穷自动机就是一个状态遇到输入符号然后去改变状态,和有穷自动机不同的就是增加了一个栈也叫做下推存储器起到记忆的作用,因此这个自动机也叫做下推自动机

下推自动机比有穷自动机的识别能力更强,有穷自动机的识别能力不强是因为它的记忆功能不强

有这样的一个语言 L = {a^nb^n|n>=1},是由n个符号a连接上n个符号b构成,那么如果想识别这个语言当中的句子,我们就需要记住读入的a的个数,有穷自动机不具备专门的存储器,因此它要利用不同的状态来记录a的个数n,这里的n的个数是趋近于无穷的

有穷自动机的状态个数又是有穷的,所以这样就导致了有穷自动机无法识别上面的那个语言

如果我们给有穷自动机增加一个下推存储器也就是栈的话,那么每当我们遇到一个输入符号a,就把a压入到栈中,这样我们就可以把n个a压入到栈中,然后没遇到一个输入符号b就出栈,如果到串尾的时候恰好最后一个a出栈,那么也就是说a和b的个数相同,这样就能成功接收 L = {a^nb^n|n>=1}这个串


递归的预测分析法需要为文法中的每一个非终结符都编写一个递归下降过程,因此它的程序规模比较大,但是不需要载入分析表

非递归的预测分析法主控程序很小,虽然需要载入分析表,但是分析表也较小

递归的预测分析法是根据产生式的右部来编写程序,因此直观性比较好,而非递归的预测分析法比较差

对于递归的预测分析法,高深度的递归调用需要在递归子程序之间进行连接,这就会影响分析器的效率

非递归分析法的分析时间就是大概是正比于待分析程序的长度

递归的预测分析法需要根据产生式的右部来编写过程,因此比较难自动生成

非递归的预测分析法采用的是自动机的方式,比较容易自动生成



猜你喜欢

转载自blog.csdn.net/zcmuczx/article/details/80651928