У меня есть парсер с монадическими ссылками, что-то вроде этого:
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
Проблема в том, что это вызывает переполнение стека во время выполнения.
Как мы можем избежать этого при соблюдении "контракта"?