Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Parsing 基于FParsec的分块分析_Parsing_F#_Fparsec - Fatal编程技术网

Parsing 基于FParsec的分块分析

Parsing 基于FParsec的分块分析,parsing,f#,fparsec,Parsing,F#,Fparsec,是否可以将输入以块的形式提交给FParsec解析器,比如从套接字提交?如果没有,是否可以检索当前结果和输入流的未解析部分,以便我可以完成此操作?我试图运行来自SocketAsyncEventArgs的输入块,而不缓冲整个消息 更新 注意使用SocketAsyncEventArgs的原因是,将数据发送到CharStream可能导致对底层流的异步访问。具体来说,我正在考虑使用循环缓冲区来推送来自套接字的数据。我记得FParsec文档指出底层的流不应该异步访问,所以我计划手动控制分块解析 最终问题:

是否可以将输入以块的形式提交给FParsec解析器,比如从套接字提交?如果没有,是否可以检索当前结果和输入流的未解析部分,以便我可以完成此操作?我试图运行来自
SocketAsyncEventArgs
的输入块,而不缓冲整个消息

更新

注意使用
SocketAsyncEventArgs
的原因是,将数据发送到
CharStream
可能导致对底层
流的异步访问。具体来说,我正在考虑使用循环缓冲区来推送来自套接字的数据。我记得FParsec文档指出底层的
不应该异步访问,所以我计划手动控制分块解析

最终问题:

  • 我可以在传递给
    字符流的
    流下使用循环缓冲区吗
  • 在这个场景中,我不需要担心手动控制分块吗

  • FParsec的正常版本(虽然不是)读取输入的分块,或者我在中称之为“分块”。因此,如果从
    System.IO.Stream
    构建
    CharStream
    ,并且内容足够大,可以跨越多个
    CharStream
    块,则可以在完全检索输入之前开始解析

    但是请注意,
    CharStream
    将以固定(但可配置)大小的块使用输入流,即它将调用
    System.IO.stream
    Read
    方法,以填充整个块。因此,如果解析输入的速度快于检索新输入的速度,
    CharStream
    可能会阻塞,即使已经有一些未解析的输入,因为还没有足够的输入来填充完整的块

    更新

    你最终问题的答案是:42

    • 如何实现用于构建
      CharStream
      流完全取决于您自己。您记得排除并行访问的限制只适用于
      CharStream
      类,它不是线程安全的

    • 实现为循环缓冲很可能

    • 不支持搜索时,
      字符流
      的块大小会影响您可以回溯多远

    • 异步解析输入的最简单方法是在异步任务中进行解析(即在后台线程上)。在任务中,您可以简单地同步读取套接字,或者,如果您不信任操作系统的缓冲,您可以使用流类,如您在下面的第二条注释中链接的文章中描述的
      BlockingStream

    • 如果输入可以很容易地分成独立的块(例如,基于行的文本格式的行),那么自己将其分块,然后逐块解析输入可能更有效


    FParsec在CharStream上工作,因此答案可能是肯定的。不过,我还是会等待更好的答案(希望如此)。谢谢你,斯蒂芬。我修改了我的问题,以更好地反映我试图更好地理解的内容。最初,我对
    CharStream
    方法感到兴奋,但之前我发现的关于异步访问底层
    Stream
    的注释让我停了下来。是否需要这样的工作?我已经更新了我的回复。这能回答你的问题吗?我不确定您所指的关于对底层
    流的异步访问的注意事项。你能写下你在哪里找到那张便条吗?我相信那张便条在旧文件里。我在新文档中找不到参考资料。谢谢这回答了我所有的问题。:)