我有一个通过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
问题在于它会在运行时导致堆栈溢出。
在尊重“合同”的同时如何避免这种情况?