LL(1) 文法

问题描述:输入:文法的多个产生式或产生式选项输出:(1)    产生式中非终结符的First集和Follow集     (2)    判断该文法是否是LL(1)文法     (3)    建立LL(1)文法的分析表     (4)    对输入的符号串进行LL(1)文法分析,并给出分析结果二、解决思路:(1)First集的求解:对G中每个文法符号XÎVT∪VN,构造
摘要由CSDN通过智能技术生成

 

  1. 问题描述:

    输入:文法的多个产生式或产生式选项

    输出:(1)    产生式中非终结符的First集和Follow集

         (2)    判断该文法是否是LL(1)文法

         (3)    建立LL(1)文法的分析表

         (4)    对输入的符号串进行LL(1)文法分析,并给出分析结果

    二、解决思路:

    (1)First集的求解:

    对G中每个文法符号XÎVT∪VN,构造 FIRST(X)。连续使用下述规则,直至每个FIRST集合不再增大:

    a、若XÎ VT,则FIRST(X)={X};

    b、若XÎ VN,且有产生式X®a…,则把a加入FIRST(X) ;若X®e也是一条产生式,则把e也加入

    c、若X®Y…是一个产生式且YÎ VN,则把FIRST(Y)中的所有非e元素都加入FIRST(X)中;若X®Y1Y2…Yk是一个产生式,Y1,Y2,…,Yi-1都是非终结符,而且,对任意j(1≤j≤i-1),FIRST(Yj)都含有e,则把FIRST(Yi)中的所有非e元素加入FIRST(X)中;特别是,若所有的FIRST(Yj)均含有e,j=1, 2, …,k, 则把e加入FIRST(X)中

    (2)Follow集的求解:

    对G中每个非终结符A,构造FOLLOW(A)。连续使用下述规则,直至每个FOLLOW不再增大:

    a、对文法的开始符号S,置$于FOLLOW(S)中;

    b、若A®aBb是一个产生式,则把FIRST(b)\{e}加入FOLLOW(B);

    c、若A®aB是一个产生式,或A®aBb是一个产生式而bÞe,则把FOLLOW (A)加入FOLLOW(B)

    (3) 构造M[A, a]

    a、对文法G的每个产生式A®a,执行第2步和第3步;

    b、对每个终结符aÎFIRST(a),把A®a加入M[A, a];

    c、若eÎFIRST(a),则对任何bÎFOLLOW(A)把A®a加入M[A,b]中

    d、所有无定义的M[A, a]标上“出错标志”。

    (4) 文法分析程序的过程:

    文法分析表是一个M[A, a]形式的矩阵,A为非终结符,a是终结符或“#” (结束符)。矩阵元素M[A, a]中存放着一条关于A的产生式,指出当A面临输入符号a时所采用的候选,M[A, a]中可能存放着一个“出错标志”,指出A根本不该面临输入符号a。栈STACK存放文法符号,栈底先放一个“#”,然后,放进文法开始符号,同时,假定输入串之后也总有一个“#”,标志输入串的结束。文法分析程序的总控程序在任何时候都是按STACK栈顶符号X和当前的输入符号a行事的。对于任何(X,a),总控程序每次都执行下面三中可能的动作之一:

    a、若X=a=‘#’,则分析成功,并停止分析过程

    b、若X=a¹‘#’,则把X从STACK栈顶逐出,让a指向下一个输入符号

    c、若X是一个非终结符,则查表M。若M[A,a]中存在产生

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值