【问题标题】:Grammars && LL Parsers语法 && LL 解析器
【发布时间】:2013-03-08 04:16:46
【问题描述】:

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

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

有人可以指出我正确的方向吗?我知道 LL 可能会被绊倒的一种方式是,如果它陷入无限循环,我不相信它会在这里发生。

谢谢

【问题讨论】:

  • 也许assignmet就是为什么语法不是LL(1)?

标签: grammar ll


【解决方案1】:

我认为 LL Parser 的意思是 LL(1) 解析器(前瞻为 1 的 LL 解析器)

对于一个可以被 LL(1) 解析器解析的文法,它必须是 LL(1)。一个语法必须遵守一些事情才能成为 LL(1),如果它破坏了其中之一,则称为 LL(1) 冲突。

  • FIRST/FIRST 冲突:

    对于每个非终结符,每个产生式都必须有一个不相交的 FIRST 集。 (FIRST 集是所有可以从主语派生的句子开始的终结符的集合。)

    E.G:在你上面的例子中,非终端有两个产生式:

    <A> -> a <B>
    <A> -> a b <C>
    

    每部作品的第一组如下:

    FIRST(a <B>) = {a}
    FIRST(a b <C>) = {a}
    

    你可以很清楚地看到这两个集合相交。这是一个问题,因为在 LL 解析器中,如果到达 A 在堆栈上的点,并且要读取的下一个符号是“a”,那么解析器不知道是选择 &lt;A&gt; -&gt; a &lt;B&gt; 还是 &lt;A&gt; -&gt; a b &lt;C&gt; .

  • FIRST/FOLLOW 冲突:

    当对于特定的非终端 A 时,会发生这种情况; FOLLOW(A)FIRST(A) 相交并且 ANULLABLE。您的示例中没有出现这种特殊的冲突。

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

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

【讨论】:

    猜你喜欢
    • 2021-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-23
    • 2020-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多