使用ANTLR验证LL(1)语法
我理解ANTLR可以接受LL(*)语法。但是,有没有办法检查语法是否是LL(1)或是否使用ANTLR使用ANTLR验证LL(1)语法,antlr,grammar,Antlr,Grammar,我理解ANTLR可以接受LL(*)语法。但是,有没有办法检查语法是否是LL(1)或是否使用ANTLR options { k = 1; } 如果您的语法不在LL(1)中,它将发出警告。 对于LL(1)的语法/语言,我们知道在输入中的任何给定位置,我们只能使用一个结果来使用输入的标记。因此,为了确定语法是否为LL(1),我们需要: 1) 检查第一组所有非终结符,如果单个非终结符之间存在任何重复项,则语法不是LL(1)。 例如:S->aba | abc(如果我们得到输入“a”,我们将使用哪
options {
k = 1;
}
如果您的语法不在LL(1)中,它将发出警告。
对于LL(1)的语法/语言,我们知道在输入中的任何给定位置,我们只能使用一个结果来使用输入的标记。因此,为了确定语法是否为LL(1),我们需要:
1) 检查第一组所有非终结符,如果单个非终结符之间存在任何重复项,则语法不是LL(1)。
例如:S->aba | abc(如果我们得到输入“a”,我们将使用哪种产品,我们无法确定,需要查看下一个输入标记,事实上,我们需要查看第三个输入标记来确定(因此需要LL(3))。
2)既然我们知道我们在寻找什么样的非终结点,就不需要考虑第一组其他非终结符。 EX.S->aba
T->acc
FIRST(s)的intesection与FIRST(T)={a},但是由于我们知道我们为s或T生成(一次只生成一个),我们不需要担心多个非终结符具有非空相交集。
3) 最后,当语法指向空字符串(S->ε)时要小心。在这种情况下,后续集合应与第一个集合联合,以确保它们的交点为空。
例如S->aba | bSa |ε
T->cdd
在这里,如果我们得到输入“ba…”,我们将使用生产S->bSa,但是我们将在输入流中看到“a”,并且不知道是生产S->aba(如果输入是b[aba]a)还是生产S->ε(如果输入是b[ε]a)
谢谢。这比我想象的要简单得多。