所以我有一个家庭作业,我花了2个多小时试图找出为什么这个语法不适用于LL解析器:
<A> → a <B>
<A> → a b <C>
<B> → b d <D>
<C> → d <E>
<D> → m n
<E> → x y
有人可以指出我正确的方向吗?我知道一个LL可以被绊倒的方法之一是它是否会遇到无限循环,我不相信它会在这里发生。
由于
答案 0 :(得分:2)
我认为LL Parser你的意思是LL(1)解析器(一个先探为1的LL解析器)
对于LL(1)解析器可解析的语法,它必须是LL(1)。语法必须遵守一些LL(1),如果它破坏其中一个,则称为LL(1)冲突。
FIRST / FIRST Conflict:
对于每个非终端,每个制作必须具有不相交的FIRST集。 (FIRST集合是可以开始从主题派生的句子的所有终端的集合。)
E.G:在上面的例子中,非终端有两个产品:
<A> -> a <B>
<A> -> a b <C>
每个作品的第一组如下:
FIRST(a <B>) = {a}
FIRST(a b <C>) = {a}
你可以清楚地看到这两组相交。这是一个问题,因为在LL解析器中,如果到达A在堆栈上的点,并且要读取的下一个符号是'a',则解析器不知道是选择<A> -> a <B>
还是{ {1}}。
首先/关注冲突:
对于特定的非终端<A> -> a b <C>
,会发生这种情况; A
和FOLLOW(A)
相交,FIRST(A)
为A
。您的示例中不会出现此特定冲突。
有关FIRST,FOLLOW和NULLABLE的详细信息,我会
有关这些冲突的更多详细信息,请参阅the Wikipedia page on LL(1) Conflicts。