Parsing Isn';LR(0)解析器是否也使用lookaheads?

Parsing Isn';LR(0)解析器是否也使用lookaheads?,parsing,compiler-construction,ll,lr,shift-reduce,Parsing,Compiler Construction,Ll,Lr,Shift Reduce,LL(1)解析器需要一个先行符号来决定使用哪个产品。这就是为什么我总是认为当解析器查看下一个输入标记而不“消费”它时(即,它仍然可以通过下一个操作从输入中读取),会使用术语“lookahead”。然而,LR(0)解析器让我怀疑这是否正确: 我看到的每一个LR(0)解析器示例都使用下一个输入标记来决定是移位还是减少。 在减少的情况下,不使用输入令牌 我使用免费工具“ParsingEmu”生成一个LR表,并在下面对单词“aab”执行LR评估。如您所见,列标题包含标记。从评估中可以看出,解析器通过查看

LL(1)解析器需要一个先行符号来决定使用哪个产品。这就是为什么我总是认为当解析器查看下一个输入标记而不“消费”它时(即,它仍然可以通过下一个操作从输入中读取),会使用术语“lookahead”。然而,LR(0)解析器让我怀疑这是否正确:

我看到的每一个LR(0)解析器示例都使用下一个输入标记来决定是移位还是减少。 在减少的情况下,不使用输入令牌

我使用免费工具“ParsingEmu”生成一个LR表,并在下面对单词“aab”执行LR评估。如您所见,列标题包含标记。从评估中可以看出,解析器通过查看下一个输入标记来决定使用哪一列。但是,当解析器在步骤4-6中减少输入时,输入不会改变(尽管在执行到下一个状态的转换时,解析器需要知道下一个输入标记“$”)

语法:

S -> A
A -> aA
A -> b
表:

评价:

出于困惑的原因,我做出了以下假设:

  • 我对“lookahead”(lookahead=未使用的输入令牌)定义的假设是错误的。Lookahead对于LL解析器或LR解析器来说意味着两种不同的东西。如果是这样,“前瞻性”又如何定义呢

  • LR解析器(从使用下推自动机的理论角度来看)具有额外的内部状态,它们通过将输入令牌放在堆栈上来消耗输入令牌,因此能够通过查看堆栈来做出移位-减少-决策

  • 上述评估为LR(1)。如果为真,LR(0)评估将是什么样子


  • 现在,什么是正确的,1、2或3或完全不同的东西?

    重要的是要精确:

    LR(k)解析器使用当前解析器状态和k个先行符号来决定是否减少,如果是,则使用哪个产生

    它还使用一个移位转换表来决定在移动下一个输入标记之后应该移动到哪个解析状态。移位转换表由当前状态和被移位的(单个)令牌设置键,而与k的值无关

    如果在给定的解析器状态下,可能同时产生移位和减少操作,那么解析器就存在移位/减少冲突,并且无效。因此,上述两项测定在理论上可以不确定地进行

    如果在给定的解析器状态下,不可能进行reduce,并且无法移动下一个输入符号(即,该状态不存在与该输入符号的转换),则解析失败,算法终止

    另一方面,如果移位转换导致指定的接受状态,则解析成功,算法终止

    所有这一切意味着,前瞻是用来预测,如果有的话,减少应用。在LR(0)解析器中,必须在读取下一个输入标记之前做出移位(更准确地说,尝试移位)的决定,但要转换到do的状态的计算是在读取标记之后进行的,在这一点上,如果不可能移位,它将发出错误信号


    LL(k)解析器必须在看到非终端时立即预测用哪个产品替换非终端。基本LL算法从包含[S,$]的堆栈(从上到下)开始,并执行以下任一操作,直到完成:

    • 如果堆栈顶部是非端子,请使用该非端子的其中一个产品替换堆栈顶部,使用下一个k个输入符号确定哪一个(不移动输入光标),然后继续

    • 如果堆栈顶部是终端,则读取下一个输入标记。如果是同一个终端,则弹出堆栈并继续。否则,解析失败,算法完成

    • 如果堆栈为空,则解析成功,算法完成。(我们假设在输入的末尾有一个唯一的EOF标记$。)


    在这两种情况下,lookahead具有相同的含义:它包括在不移动输入光标的情况下查看输入标记

    如果k为0,则:

    • LR(k)解析器必须在不检查输入的情况下决定是否进行reduce,这意味着任何状态都不能有两个不同的reduce操作或reduce和shift操作

    • LL(k)解析器必须在不检查输入的情况下确定给定非终端的哪个产品是可应用的。实际上,这意味着每个非终端只能有一个结果,这意味着语言必须是有限的


    我的问题图片中显示的解析是LR(1)解析器吗?但语法应该是LR(0)-可解析的,因为在一种状态下,它必须移位(状态0和1)或减少(状态3和4)?如果一个状态行同时包含shift和reduce操作(取决于列(=令牌)?@chansey:shift消耗令牌,因此它必须读取它:)LR(0)解析器在读取令牌之前不需要知道它将转换到哪个状态;它只需要知道它会改变。一旦它做出决定,它是不可撤销的;它无法断定降价是否更有意义。我认为这似乎是不对称的,确实如此:解析过程完全是关于简化操作的,因为目标是发现派生。移位只是一种说法,“这里没有缩减,请尝试下一个输入点。”解析器状态也是如此,这是……一个实现细节,如果您愿意的话。解析器的可观察操作是“发出派生步骤”和“使用输入令牌”,LR(0)解析器必须