Переполнение стека 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 ()