是柠檬解析器LALR(1)还是SLR(1)?

我正在阅读柠檬解析器的PHP移植:
for ($i = 0; $i < $this->nstate; $i++) {   /* Loop over all states */
    $stp = $this->sorted[$i]->data;
    for ($cfp = $stp->cfp; $cfp; $cfp = $cfp->next) {
        /* Loop over all configurations */
        if ($cfp->rp->nrhs == $cfp->dot) {        /* Is dot at extreme right? */
            for ($j = 0; $j < $this->nterminal; $j++) {
                if (isset($cfp->fws[$j])) {
                    /* Add a reduce action to the state "stp" which will reduce by the
                    ** rule "cfp->rp" if the lookahead symbol is "$this->symbols[j]" */
                    PHP_ParserGenerator_Action::Action_add($stp->ap, PHP_ParserGenerator_Action::REDUCE,
                                            $this->symbols[$j], $cfp->rp);
                }
            }
        }
    }
}
在我看来,解析器是一个SLR(1)解析器,根据它如何计算动作表,但是@the的主页,它表现为LALR(1)解析器:
http://www.hwaci.com/sw/lemon/
是SLR(1)还是LALR(1)?     
已邀请:
如果它是纯SLR,则不会有任何前瞻符号($ this-> symbol [$ j])用于控制减少。所以我得出的结论是LALR(1)。 编辑:yoyo是对的SLR(1)确实使用下一个输入符号来控制缩减(我把这个问题误读为[LALR(1)vs] SLR(0),这根本不关心);我纠正了。在检查中,SLR(1)使用(生产规则无上下文)FOLLOW设置来控制减少; LALR(1)使用(左上下文相关)LOOKAHEAD集。因此,两者都有一个“前瞻”设置每个减少。这意味着你无法从这个代码片段告诉它是哪种类型;充其量我们希望编码器真正计算出“前瞻性”。您必须看到其余的代码才能知道它是什么类型。 实际上,如果你要构建一个自下而上的解析器生成器,你可以选择构建SLR(0)[我曾经做过一次这就是我的大脑误读了这个问题),SLR(1),LALR (1)和LR(1)解析器生成器几乎使用完全相同的机器。 30年的经验表明LALR(1)是最实用的,所以默认是...... LALR(1); SLR(x)严格来说是一个子集,所以如果只需要一点点努力就可以让你做到这一点,那么为什么呢?LALR(1)?如果Lemon实现者遵循传统,我期待一个LALR(1)解析器生成器。所以现在你有点接受他们的话。 当然,你可以构建一个简单的实验来说服自己。只需构建一个SLR(1)无法正确解析LALR(1)可以尝试的语法。或者你可以仔细阅读代码。 请参阅http://en.wikipedia.org/wiki/LALR_parser上的LALR解析     

要回复问题请先登录注册