F#中是否有任何已知的解析器组合库可以解析二进制文件(不是文本)文件?

StackOverflow https://stackoverflow.com/questions/7800586

我熟悉FPARSEC的一些基础知识,但它似乎是针对文本文件或流的。

还有其他可以有效解析二进制文件的F#库吗?还是可以轻松修改FPARSEC以与二进制流有效工作?

有帮助吗?

解决方案

您可能对 腌菜组合. 。这些有点像解析器组合器,但更专注于更简单的二进制格式(送货员 允许您生成二进制数据,并 未踢手 解析它们)。有一个 关于这个想法的很可读的文章 (PDF)由安德鲁·肯尼迪(Andrew Kennedy)(措施单位的作者)。

我自己没有太多的经验,但是我只是意识到这可能与您有关。该想法在F#编译器中用于生成一些二进制资源(例如存储在资源中的报价)。虽然,我不确定是否 F#编译器实施 有任何好处(这是从F#编译器的早期开始的事情之一)。

其他提示

使用二进制流的问题本身并不是解析器问题,这是一个征服问题。 Lexer是将原始数据转换为解析可以处理的元素的原因。

大多数解析系统都有很少的问题,可以让您提供自己的Lexer,如果可以的话,理想情况下,您可以很容易地编写一个在二进制流上工作的合规Lexer。

但是,问题在于,当今大多数解析和LEXing系统本身都是由更高级别的工具创建的。而且该工具很可能不是设计用于与二进制流一起工作的。也就是说,对于您而言,这是不实用的,可以指定可用于创建后续解析器和Lexer的二进制流的令牌和语法。此外,您可能在二进制流中可能会遇到的多字节二进制数字(短,较长,浮标等)的更高级别的概念也可能没有任何支持如果您实际上需要处理其实际值,则再次是因为系统主要是为基于文本的令牌设计的,并且基础运行时处理了将其转换为机器可以使用的文本的细节(例如,在实际上,ASCII数字序列到实际二进制整数)。

综上所述,您实际上可以使用工具的解析部分,因为解析器更多地在由Lexer喂食的抽象令牌上工作。创建语法后,在象征性的层面上,您将需要重做Lexer来创建从二进制流的问题令牌以进食解析器。

这实际上是好的,因为解析器往往比基本词汇更复杂,因此该工具包可以为您处理大部分“困难部分”。但是,您仍然需要处理创建自己的Lexer并将其正确接口到生成的解析器。这不是无法克服的任务,如果语法具有任何真正的复杂性,从长远来看,您可能值得您努力。

如果一切都很简单,那么您可能会手工做自己的自己。在我的头顶中,很难想象一个困难的二进制语法,因为二进制格式的主要卖点是它更接近机器,这与大多数解析器设计的文本相矛盾。但是我不知道你的用例。

但是考虑拆卸器的情况。这是一个简单的Lexer,可能能够在高级别的不同指令类型上(例如那些没有参数的操作数,将单个字节作为论点或一个单词的操作数),然后将其馈送给解析器然后,可以将指令转换为普通汇编语法中的助记符和操作数,并处理标签参考等。

这是一个人为的案例,因为拆卸器通常不会分开链路和解析阶段,因此通常不够复杂而无法打扰,但这是查看问题的一种方法。

附加物:

如果您有足够的信息将二进制流转换为文本以馈送到引擎,那么您有足够的信息而不是创建文本,可以创建解析器希望从Lexer中看到的实际令牌。

就是说,您可以做的是采用文本格式,将其用作解析工具和语法的基础,并为您创建Lexer和Parser机器,然后手工测试您的解析器及其它使用“文本测试”处理。

但是,当您四处阅读二进制文件时,而不是创建文本以亮着和解析,只需创建Lexer会创建的令牌(这些应该是简单的对象),然后直接泵送解析器即可。这将为您节省LEX步骤,并为您节省一些处理时间。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top