这是我自下而上的解析器的骨架:
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
自下而上的解析对我来说非常新,所以任何帮助都会受到赞赏。
答案 0 :(得分:1)
您可以使用前瞻来决定是转移还是减少。您的示例语法适用于LR(1)语法系列,因此具有1个符号前瞻的自下而上解析器应该能够捕获它。
在您的示例中,您输入了以下内容:
2 + 3
所以你建立一个堆栈:
Program, Expr, Number
转移FLOAT
,缩小Number
,减少Expr
。现在您可以选择是缩小Program
还是转换'+'
,因此您可以向前看是否有'+'
。如果是这样,您就转移并遵循Expr = Expr '+' Expr
规则。
您可能仍希望执行Program = Expr EOF
,因此如果没有任何内容需要解析,您的预测可以始终返回EOF
。