FParsec - 如何从标准输入流解析

rap*_*ard 0 .net f# parsing fparsec

我似乎无法使用FParsec成功解析标准输入流.我把我的情况简化为这个非常简单的代码:

match (runParserOnStream (pstring "test" .>> FParsec.CharParsers.newline) () "stdin" (Console.OpenStandardInput ()) Console.InputEncoding) with
    | Success(result, _, _)   -> printfn "Success: %A" result
    | Failure(errorMsg, perr, _) -> printfn "Failure: %s" errorMsg
Run Code Online (Sandbox Code Playgroud)

但是,当我运行程序时,输入字符串测试,然后按Enter,它挂起,我似乎无法弄清楚为什么..

什么是解决方案?

Ste*_*orf 6

出于性能原因和简单性,FParsec以块为单位读取输入流(或在开始解析之前将完整流读取为字符串).有关更多详细信息,请参阅此答案:使用FParsec进行Chunked解析

如果你想用一个带有FParsec的REPL来解析输入,你可以实现一个简单的扫描器,它等待输入流中的终结符(例如";;"后跟换行符,就像在FSI控制台中一样)然后,当遇到这样的终结器,将输入复制到终结器中并将其交给FParsec解析器进行评估.