使用ANTLR验证LL(1)语法

时间:2013-05-25 00:16:29

标签: antlr grammar

我知道ANTLR可以接受LL(*)语法。但是,有没有办法检查语法是否是LL(1)或不使用ANTLR?

2 个答案:

答案 0 :(得分:5)

options {
   k = 1;
}

如果您的语法不在LL1中,它会发出警告。

答案 1 :(得分:1)

对于语法/语言为LL(1),我们知道在输入中的任何给定位置,我们只能使用一个生成来消耗输入的标记。因此,为了确定语法是否为LL(1),我们需要:

1)检查所有非终结符的第一组,如果单个非终结符中有任何重复,则语法不是LL(1)。
        EX:S-> aba | abc(如果给出输入“a”,我们使用哪个生产,我们无法确定,并且需要查看下一个输入令牌,实际上我们需要查看第三个确定(所以这个需要LL(3)。

    2)由于我们知道我们正在寻找哪种非终结符号,因此我们不需要考虑第一组其他非终结符号。
        EX。 S-> ABA
            T-> ACC
    FIRST(T)= {a}的FIRST的部分,但由于我们知道我们正在生产S或T(一次只有一个),我们不需要担心多个非终端有非空交叉集。

    3)最后,当语法转到空字符串(S->ε)时要小心。在这种情况下,FOLLOW集应该与FIRST联合以确保它们的交集是空的         EX。 S-> aba | bSa | ε
            T-> CDD
    在这里,如果我们得到输入“ba ...”,我们将使用生产S-> bSa,但是我们会在输入流中看到“a”并且不知道是否生成S-> aba(如果输入是b [aba] a)或产生S->ε(如果输入是b [ε] a)