正在查看ragel,但不知道如何合理地从文件中读取。据我所知,它需要一个不会在令牌中间中断的内存缓冲区。这显然有相当多的工作要实现,特别是如果我不知道标记的大小,例如带有新行的字符串,转义等。如果我实现了所有这些,我不确定我是否还需要ragel。
没有更好的方法了吗?
发布于 2017-12-07 03:36:09
如果将一个文件映射到内存中(mmap、CreateFileMapping),那么整个文件就可以作为一个连续的内存块使用。
还可以看看Ragel用户指南(5.9维护指向输入数据的指针),其中有一些处理这种情况的示例代码。对于可能超过固定缓冲区大小的字符串或标记,可以使用根据需要增长的可变大小的缓冲区。
发布于 2018-01-09 16:33:16
这是非常棘手的,并依赖于你正在做的解析的类型。
对于文件,您可以将整个文件映射到内存中并对其进行处理。
这是最好的选择。
如果您按块读取数据,您仍然可以解析它,但是您需要在解析的调用中跟踪您的状态变量。我通常将它们放在一个类中,并使用一个方法解析,该方法可以增量地解析数据缓冲区。
如果要从数据中提取令牌,则需要在返回之前将令牌捕获为字符串。当您恢复解析时,当您完成令牌匹配时,您可以将其与之前匹配的部分连接起来,这就是完整的令牌。在最坏的情况下,您的令牌缓冲区可能与原始文件一样大。
你可以在这里看到一些这样的例子:
如果解析器标记了标记的开始,但尚未完成标记,则会存储该标记:在调用https://github.com/kurocha/async-http/blob/eff77f61f7a85a3ac21f7a8f51ba07f069063cbe/source/Async/HTTP/V1/RequestParser.rl#L52-L54
parse:https://github.com/kurocha/async-http/blob/eff77f61f7a85a3ac21f7a8f51ba07f069063cbe/source/Async/HTTP/V1/Protocol.cpp#L36-L54)时,会保留状态
https://stackoverflow.com/questions/47594247
复制相似问题