Left-recursive grammars in operator precedence parsing

时间:2019-03-06 11:30:35

标签: f# fparsec

I have a left recursive grammar. My AST looks something like:

...
and Expr = BinaryExpr of BinaryExpr
and BinaryExpr = Expr * BinaryOperator * Expr
and BinaryOperator = Plus
...

I was planning on using the operator precedence parser for this, for example:

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)))

where pExpr is a parser for Expr.

The left recursion causes a stack overflow. I was wondering whether there was a particular FParsec-way of dealing with this while still using the OperatorPrecedenceParser?

Thanks!

EDIT:

The issue may be coming from the fact that pExpr forwards all calls to another parser pExprRef.

let pExpr, pExprRef = createParserForwardedToRef()

and after the operator precedence parser, the reference is defined:

do pExprRef :=
    choice [pBinaryExpr, <other-parsers...>]; 

0 个答案:

没有答案