Parsing LR(0)或SLR(1)或LALR(1)

Parsing LR(0)或SLR(1)或LALR(1),parsing,compiler-construction,context-free-grammar,Parsing,Compiler Construction,Context Free Grammar,我在一个编译器期末考试样本中尝试的一个问题上遇到了严重的困难。如果有人能帮我解释一下,我将不胜感激。谢谢 考虑下面列出的语法G S=E$ E=E+T|T T=T*F | F F=ident|(E) 其中,+*ident()是终端符号,$是文件结尾。 a) 这是LR(0)语法吗?证明你的答案是正确的。 b) 语法是SLR(1)吗?证明你的答案是正确的。 c) 这是LALR(1)语法吗?证明你的答案是正确的。如果你能证明语法是LR(0),那么它当然是SLR(1)和LALR(1),因为LR(0)更具限

我在一个编译器期末考试样本中尝试的一个问题上遇到了严重的困难。如果有人能帮我解释一下,我将不胜感激。谢谢

考虑下面列出的语法G

  • S=E
    $
  • E=E
    +
    T|T
  • T=T
    *
    F | F
  • F=
    ident
    |
    E
  • 其中,+*ident()是终端符号,
    $
    是文件结尾。 a) 这是LR(0)语法吗?证明你的答案是正确的。 b) 语法是SLR(1)吗?证明你的答案是正确的。
    c) 这是LALR(1)语法吗?证明你的答案是正确的。

    如果你能证明语法是LR(0),那么它当然是SLR(1)和LALR(1),因为LR(0)更具限制性

    不幸的是,语法不是LR(0)

    例如,假设您刚刚识别出E:

    S -> E . $
    
    如果下面是
    +
    *
    符号,则不能将此E减少为S,因为
    E
    后面可以跟
    +
    *
    ,这将继续构建更大的表达式:

    S -> E . $
    E -> E . + T
    T -> T . * F
    
    这要求我们提前查看一个标记,以知道在该状态下要做什么:移位(
    +
    *
    )或减少(
    $

    SLR(1)添加了前瞻,并利用跟随集信息进行缩减(总比没有好,但是从语法全局获得的跟随集信息与LALR(1)中的特定于状态的前瞻集一样不区分上下文)

    在SLR(1)下,上述冲突消失了,因为只有当前瞻符号在
    S
    的跟随集合中时,
    S->E
    减少才被考虑,并且在
    S
    的跟随集合中唯一的东西是EOF符号
    $
    。如果输入符号不是
    $
    ,如
    +
    ,则不考虑缩减;发生的变化与减少不冲突

    因此,语法不会因为冲突而不符合SLR(1)。然而,它可能会有其他冲突。透过它,我看不到一个;但要正确地“证明该答案”,您必须生成所有LR(0)状态项,并通过例行程序验证是否未违反SLR(1)约束。(您将简单LR(0)项用于SLR(1),因为SLR(1)不会以任何新的方式增加这些项。请记住,它只是使用从语法中抄录的follow set信息来消除冲突。)

    如果是SLR(1),则LALR(1)按子集关系下降

    更新


    红龙书(编译器:原理、技术和工具,Aho、Sethi、Ullman,1988)在一组示例中使用了完全相同的语法,这些示例显示了规范LR(0)项集和相关DFA的推导,以及填充解析表的一些步骤。这在第4.7节中,从示例4.34开始。

    您只是在寻找答案吗?还是你在问你应该采取什么样的方法?我也在寻找一种方法和答案。谢谢,我刚才找到了一些关于这方面的很好的课堂讲稿:。增加到lec07.pdf、lec08.pdf等@user976078开始在玩得好的情况下问这样的问题-我一辈子都记不住这些语法的细节,我想知道谁能记住。然后我查看了你的用户页面,看到了你正在使用的语言的链接,这很有意义。。。