我知道ANTLR可以接受LL(*)语法。但是,有没有办法检查语法是否是LL(1)或不使用ANTLR?
答案 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)