现在需要做一个Java语言中逻辑表达式(布尔表达式)的解析程序,要求布尔表达式中支持数学表达式计算。哪位能提供一下这种支持数学表达式计算的布尔表达式的完整LL(1)文法描述?
如何验证一个文法是不是正确表示了布尔表达式运算?谢谢!

解决方案 »

  1.   

    LL(1)文法表示是有限的,有的文法是无法用LL(1)文法表示的.
    LL(1)文法的条件有板有3:
    1:无左递归
    2:无左公因子
    3:如果 ε∈first(A),A∈非终结符,
      那么必须满足:
      first(A)∩follow(A)= φ
    首先你给的文法很容易看出没有直接或间接左递归.
    其次你的算法中含有左公共因子,则需要消除左公共因子. 所以消除左公共因子后文法是:
    S->C$
    C->bA |aB
    A->aP |bAA
    B->bP|aBB
    P->C |ε
    然后检测改算法是否是LL(1)文法的第三个条件.
    对于你这个文法很容易看出只有first(p) 含有ε,那么只需检测first(P)∩follow(P)
    容易看出 : first(P) = {ε}∪first(C) = {ε} ∪ {a,b} = {a,b,ε}
              follow(P) = follow(A)∪follow(B) = follow(C)∪follow(C) = follow(C) = {$}
    first(P)∩follow(P)= φ
    满足第三个条件 .所以上改造后的文法是LL(1). 
      

  2.   

    能不能说一下
    S->C$ 
    C->bA |aB 
    A->aP |bAA 
    B->bP|aBB 
    P->C |ε 
    中各个非终结符和终结符都是什么意思啊?
    谢谢!