我一直在编写一些递归上升解析器,而我一直在努力解决的问题之一就是左递归。在我看来,正确的递归可以递归地表达,就像
addExpr
: primaryExpr '+' addExpr
| primaryExpr;
通过类似的东西
parseAddExpr() {
auto x = parsePrimaryExpr();
if (next_token == '+') {
auto result = make_unique<PlusExpr>();
result->lhs = x;
result->rhs = parseAddExpr();
return std::move(result);
}
return std::move(x);
}
但是对于左递归,我能想出的只是一个while循环。
mulExpr
: mulExpr '*' addExpr
| addExpr;
parseMulExpr() {
auto expr = parseAddExpr();
while(next_token == '*') {
auto mul_expr = make_unique<MulExpr>();
mul_expr->lhs = std::move(expr);
mul_expr->rhs = parseAddExpr();
expr = std::move(mul_expr);
}
return std::move(expr);
}
我的意思是,这个功能很好,但我一直觉得它应该有一个递归版本。是否可以以递归而不是迭代的方式实现左关联运算符?