Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/apache-kafka/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用ANTLR验证LL(1)语法_Antlr_Grammar - Fatal编程技术网

使用ANTLR验证LL(1)语法

使用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”,我们将使用哪

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

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)

谢谢。这比我想象的要简单得多。