Леворекурсивные грамматики при разборе приоритетов операторов - PullRequest
0 голосов
/ 06 марта 2019

У меня есть левая рекурсивная грамматика.Мой 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...>]; 
...