您的位置:首页 > 其它

SLR(1)预测分析表的构建以及对句子的分析步骤

2017-06-20 17:35 656 查看

SLR(1)预测分析表相关知识

首先,SLR(1)分析器是自上而下语法分析里面的分析器;

步骤:(1)写出已知文法G的扩展文法G'

           (2)写出扩展文法G'的初始项目集

           (3)根据状态转移构建识别G'活前缀的DFA(项目集编号为I0-In)

           (4)计算G'的FIRST和FOLLOW集合

           (5)根据步骤(3)和(4)构建SLR(1)分析表

例:文法G如下所示,

                               E->E+T|T          T->T*F|F          F->(E)|-F|id

   (1)  G'     

                         E'->E                         (1)

                         E->E+T                     (2)

                        E->T                           (3)

                        T->T*F|F                    (4)

                        T->F                           (5)

                        F->(E)                         (6)

                       F->-F                           (7)

                       F->id                            (8)

  (2)  (3)



(4)  FIRST(E)={(, - , id }             FOLLOW(E)={# , + , ) }

           FIRST(T)={(, - , id }             FOLLOW(T)={# , + , ) ,* }

           FIRST(F)={(, - , id }             FOLLOW(F)={# ,+ , ) , * }

(5)预测分析表如下:



(6)对-id+id*id进行分析如下:



总结:第一步 令栈内容为#0,当前输入为-id+id*id(即要"分析的句子#"),动作为SLR(1)分析表中0行#列对应的动作。

          其余步骤遵循:当上一步骤动作为移进时(s),将当前输入移入一个字符和上一步骤移进动作后面的数字到栈内容中 ,再根据分析表中(当前栈最后的数字(纵坐标),当前输入第一个字符(横坐标))得出对应的动作;当上一步骤动作为规约时(r),按照规约后面的数字对当前栈内容进行规约,再将分析表中(当前栈最后的数字,当前栈规约得到的非终结符)得出对应的数字加入到当前栈内容中,然后由分析表中(更新后的栈最后数字,当前输入第一个字符)得出对应的动作。

以上总结仅个人理解,仅供参考,具体的算法相关教材上都有,不过不好理解;本人才疏学浅,若有什么错误,请多多指教。


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: