是否可以以块为单位向FParsec解析器提交输入?如果没有,是否可以检索输入流的当前结果和未解析部分,以便我可以完成此操作?我正在尝试运行来自的输入块SocketAsyncEventArgs而不缓冲整个消息.
更新
注意使用的原因SocketAsyncEventArgs是表示向a发送数据CharStream可能导致对底层的异步访问Stream.具体来说,我正在寻找使用循环缓冲区来推送来自套接字的数据.我记得FParsec文档指出Stream不应该异步访问底层,所以我计划手动控制分块解析.
终极问题:
Stream传递给我CharStream吗?正常版本的FParsec(虽然不是低信任版本)读取输入块,或"块方式",正如我在CharStream文档中所说的那样.因此,如果构造CharStreamfrom a System.IO.Stream并且内容足够大以跨越多个CharStream块,则可以在完全检索输入之前开始解析.
但是请注意,CharStream将以固定(但可配置)大小的块的形式使用输入流,即它将调用填充完整块所需的Read方法System.IO.Stream.因此,如果您以比检索新输入更快的速度解析输入,CharStream即使已经存在一些未解析的输入,也可以阻止输入,因为还没有足够的输入来填充完整的块.
更新
你最终问题的答案:42.
你如何实现Stream构建CharStream它的完全取决于你.您记住的排除并行访问的限制仅适用于CharStream不是线程安全的类.
实现Stream作为循环缓冲区可能会限制您可以回溯的最大距离.
CharStream当Stream不支持搜索时,块大小会影响你可以回溯多远.
异步解析输入的最简单方法是在异步任务中进行解析(即在后台线程上).在任务中,您可以简单地读取套接字同步,或者,如果你不被信任的操作系统缓冲,您可以使用流类,如BlockingStream您在下面的第二个评论链接的文章中介绍.
如果输入能够容易地分离成独立的组块(例如线基于行的文本格式),它可能是更高效的块它自己,然后由块解析输入块.