何时减少shift-reduce解析器?

时间:2015-10-17 11:29:57

标签: parsing bottom-up

这是我自下而上的解析器的骨架:

while (!stack.empty())
{
    if (!reduce())
    {
        shift();
    }
}

我有这些规则:

Program -> Expr
Expr -> Expr '+' Expr
Expr -> Number
Number -> FLOAT | INTEGER  // These 2 are terminal symbols

如果我有以下输入:

2 + 3

2被推入堆栈,然后被缩减为数字,然后是表达式,然后是程序。所以它没有任何机会解析整个添加。我怎样才能强制解析器解析其余的呢?我应该做点什么:

Program -> Expr EOF

自下而上的解析对我来说非常新,所以任何帮助都会受到赞赏。

1 个答案:

答案 0 :(得分:1)

您可以使用前瞻来决定是转移还是减少。您的示例语法适用于LR(1)语法系列,因此具有1个符号前瞻的自下而上解析器应该能够捕获它。

在您的示例中,您输入了以下内容:

2 + 3

所以你建立一个堆栈:

Program, Expr, Number

转移FLOAT,缩小Number,减少Expr。现在您可以选择是缩小Program还是转换'+',因此您可以向前看是否有'+'。如果是这样,您就转移并遵循Expr = Expr '+' Expr规则。

您可能仍希望执行Program = Expr EOF,因此如果没有任何内容需要解析,您的预测可以始终返回EOF