自上而下的语法分析(递归下降法,LL(1)预测分析法,预测分析表)

※递归下降法:

简而言之,就是比如文法是

STTFM, F+MMa

 

用伪代码表示这个文法

则首先要写 procedure S 

BEGIN

T;

END

 

然后写 procedure T

BEGIN

F;

M;

END

 

Procedure F

BEGIN

+M;

END

 

Procedure M

BEGIN

匹配a

END

这样的过程是递归下降的过程。递归下降方法仅表示一种思路,没有特别的

 

 

 

 

※LL(1)预测分析法:

第一个L表示从左到右扫描输入串

第二个L表示最左推导

1表示分析时每步只需向前查看一个符号

 

 

考虑First集和FOLLOW集:

First,FIRST( α)是由α推导出的所有的第一个终结符号组成的集合

FOLLOW:FOLLOWA)是由所有句型中紧跟在A后面的终结符a组成的集合

引入FOLLOW集的意义是,在有空转换的文法里,有时候不能确定是否把这个非终结符变成空,这就要看看这个非终结符跟着的元素,是否有可能匹配下一个元素。如果能匹配,那么就可以把它变成空

 

 

 

预测分析表

文法:

 

自上而下的语法分析(递归下降法,LL(1)预测分析法,预测分析表) - 小镜子~ - 菜园子

 

 

各个非终结符的first集合:

 

自上而下的语法分析(递归下降法,LL(1)预测分析法,预测分析表) - 小镜子~ - 菜园子

 

 

 

关于follow集合我们只要考虑有可能变成空转换的非终结符:

 

自上而下的语法分析(递归下降法,LL(1)预测分析法,预测分析表) - 小镜子~ - 菜园子

 

 

 

根据FIRST集和FOLLOW集可以生成一张LL(1)文法的预测分析表:

 

自上而下的语法分析(递归下降法,LL(1)预测分析法,预测分析表) - 小镜子~ - 菜园子
 
 

 

 

 

预测分析表法的分析过程:

要以表格的形式,列出分析栈的变化,输入,和输出动作:

以下是上面的文法对于id+id*id串的分析过程

 

自上而下的语法分析(递归下降法,LL(1)预测分析法,预测分析表) - 小镜子~ - 菜园子
 

 

 

 

错误恢复:同步符号

有时候输入的串可能有点小错误掺杂了一些不该有的符号,可以利用同步符号synch跳过这些符号,使语法分析能够继续:

这就要考虑所有非终结符的FOLLOW集合:

 

以上面的文法的预测分析表做例子

FOLLOW集合:

 

自上而下的语法分析(递归下降法,LL(1)预测分析法,预测分析表) - 小镜子~ - 菜园子

 

 

加入错误处理的预测分析表:

 

自上而下的语法分析(递归下降法,LL(1)预测分析法,预测分析表) - 小镜子~ - 菜园子
 

 

 

 

串  )id+*id 的分析过程:

 

自上而下的语法分析(递归下降法,LL(1)预测分析法,预测分析表) - 小镜子~ - 菜园子

 

posted @ 2017-05-29 19:12  天涯海角路  阅读(2026)  评论(0)    收藏  举报