У меня есть левая рекурсивная грамматика.Мой AST выглядит примерно так:
...
and Expr = BinaryExpr of BinaryExpr
and BinaryExpr = Expr * BinaryOperator * Expr
and BinaryOperator = Plus
...
Я планировал использовать для этого анализатор приоритета оператора, например:
let exprOpp = new OperatorPrecedenceParser<Expr,unit,unit>()
let pBinaryExpr = exprOpp.ExpressionParser
exprOpp.TermParser <- pExpr
let consBinExpr op x y = (x, op, y) |> BinaryExpr
exprOpp.AddOperator(InfixOperator("+", ws, 1, Associativity.Left, (consBinExpr Plus)))
, где pExpr
- анализатор для Expr
.
Левая рекурсия вызывает переполнение стека.Мне было интересно, был ли какой-то конкретный способ решения этой проблемы с помощью FParsec, все еще используя OperatorPrecedenceParser
?
Спасибо!
РЕДАКТИРОВАТЬ:
Возможно, проблема возниклаисходя из того факта, что pExpr
перенаправляет все вызовы другому анализатору pExprRef
.
let pExpr, pExprRef = createParserForwardedToRef()
и после синтаксического анализатора приоритета оператора, определяется ссылка:
do pExprRef :=
choice [pBinaryExpr, <other-parsers...>];