`OperatorPrecedenceParser` с рекурсивным термином - FParsec - PullRequest
0 голосов
/ 10 января 2019

У меня есть парсер с монадическими ссылками, что-то вроде этого:

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

Проблема в том, что это вызывает переполнение стека во время выполнения.

Как мы можем избежать этого при соблюдении "контракта"?

...