具有递归项的`OperatorPrecedenceParser`-FParsec

时间:2019-01-10 20:27:25

标签: f# parsec fparsec

我有一个通过monadic链接实现的解析器,诸如此类:

let rec p1 = parse {}
and p2 = parse {}
and p3 = parse {}

and p = p1 <|> p2 <|> p3

and document = spaces >>? many p .>>? spaces

我想实现一个算术表达式解析器,将其作为术语p

let opParser = new OperatorPrecedenceParser<_, _, _> ()
// Adding operators
let term = p
opParser.TermParser <- spaces >>? term .>>? spaces

除了我希望使用p的分析器也能够使用算术表达式。所以我这样做:

let opParser = new OperatorPrecedenceParser<_, _, _> ()
// Adding operators

let rec p1 = parse {}
and p2 = parse {}
and p3 = parse {}

and p = p1 <|> p2 <|> p3 <|> (opParser.ExpressionParser)

let term = p
opParser.TermParser <- spaces >>? term .>>? spaces

问题在于它会在运行时导致堆栈溢出。

在尊重“合同”的同时如何避免这种情况?

0 个答案:

没有答案