语法&& LL解析器

时间:2013-03-08 04:16:47

标签: grammar ll

所以我有一个家庭作业,我花了2个多小时试图找出为什么这个语法不适用于LL解析器:

<A> → a <B>
<A> → a b <C>
<B> → b d <D>
<C> → d <E>
<D> → m n
<E> → x y

有人可以指出我正确的方向吗?我知道一个LL可以被绊倒的方法之一是它是否会遇到无限循环,我不相信它会在这里发生。

由于

1 个答案:

答案 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>,会发生这种情况; AFOLLOW(A)相交,FIRST(A)A。您的示例中不会出现此特定冲突。

有关FIRST,FOLLOW和NULLABLE的详细信息,我会

有关这些冲突的更多详细信息,请参阅the Wikipedia page on LL(1) Conflicts