Переполнение стека FParsec в.Net Core

Я использую FParsec в проекте netstandard2.1 (StandartProj) и использую его из netcoreapp2.0 (CoreProj).

// Standard Project
let parser = pfloat |>> (fun x -> x + 1)
let runParser str = run parser str

// Core Project
let parseResult = runParser "1" // Stackru exception

Если я запускаю parseResult, он завершается неудачей с исключением Stackru, но если я использую парсер, то исключение CoreProj исчезает:

// Standard Project
let parser = pfloat |>> (fun x -> x + 1)
let runCustomParser parser str = run parser str

// Core Project
let parseResult = runCustomParser parser "1" // Returns Success 2

Так почему же возникает это исключение Stackru и как я могу исправить это без костыля?

Обновление 1:

После исправления некоторых проблем с зависимостями нет проблем с простым парсером вроде float, Но кажется, что рекурсивные парсеры выдают эту ошибку во время выполнения, если они не могут быть собраны. До сих пор я нашел исправление, определив максимальную рекурсивную глубину и установив все такие вызовы парсера с помощью функции:

let recursiveParser () =
    let rec _recParser depth =
        let simpleParser = ...
        if depth > maxDepth then simpleParser else recursiveParser() <|> simpleParser
    _recParser 1

1 ответ

Эта проблема упоминалась в рекурсивных грамматиках, поэтому даже если рекурсивный анализатор потребляет входные данные для внутренних синтаксических анализаторов и только если он сам с ним не справляется, это не помогает. Так что код, который помогает

let recursiveParser () =
    let simpleParser = pfloat
    let rec _recParser () = simpleParser .>> >>= (fun x -> pstring "+" >>. _recParser () |>> (fun y -> ...)
    simpleParser <|> _recParser ()
Другие вопросы по тегам