Существуют ли какие -либо известные библиотеки комбинатора синхронизаторов в F#, которые могут анализировать бинарные (не текстовые) файлы?

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

Вопрос

Я знаком с некоторыми основами FPARSEC, но, похоже, он ориентирован на текстовые файлы или потоки.

Есть ли другие библиотеки F#, которые могут эффективно проанализировать двоичные файлы? Или FPARSEC может быть легко изменен, чтобы эффективно работать с бинарными потоками?

Это было полезно?

Решение

Вас может быть заинтересован в Пиклер комбинаторы. Анкет Это немного похожи на комбинаторов анализаторов, но более сосредоточены на более простых бинарных форматах (петушисты Позвольте вам создавать бинарные данные и Неудовлетворители проанализировать их). Eсть довольно читаемая статья об этой идее (PDF) Эндрю Кеннеди (автор книг по единицам измерения).

У меня нет большого опыта с этим сам, но я просто понял, что это может быть актуально для вас. Идея используется в компиляторе F# для создания некоторых бинарных ресурсов (например, цитат, хранящихся в ресурсах). Хотя я не уверен, если F# реализация компилятора это хорошо (это одна из тех вещей с первых дней компилятора F#).

Другие советы

Проблема с работой с бинарными потоками не является проблемой анализатора как таковой, это проблема лексинга. Lexer - это то, что превращает необработанные данные в элементы, с которыми может обработать анализ.

У большинства любой системы анализа есть мало проблем, позволяющих вам снабжать свой собственный лексер, и если это так, в идеале вы могли бы легко написать совместный лексер, который работает на вашем двоичном потоке.

Проблема, однако, заключается в том, что большинство систем лексики и лексинга сегодня сами созданы из инструмента более высокого уровня. И этот инструмент, скорее всего, не предназначен для работы с бинарными потоками. То есть это не практично для вас, укажите токены и грамматику двоичного потока, которые можно использовать для создания последующих анализаторов и лексер. Кроме того, вероятно, нет никакой поддержки в концепциях более высоких двоичных цифр (шорты, длины, поплавки и т. Д.) Если вам действительно нужно работать над их фактической ценой, опять же, потому что системы в основном предназначены для токенов на основе текста, а основное время выполнения обрабатывает детали преобразования этого текста, который может использовать машину (например, последовательности ASCII в реальных бинарные целые числа).

Все, что сказано, вы, вероятно, можете на самом деле использовать раздел инструмента, так как анализаторы больше работают над абстрактными токенами, которые кормят их Lexer. Как только вы создаете свою грамматику, на символическом уровне вам нужно будет переделать Lexer, чтобы создать токены проблемы из двоичного потока, чтобы придать синтаксию.

Это на самом деле хорошо, потому что анализатор имеет тенденцию быть гораздо более сложным, чем основной лексер, поэтому инструментарий справится с большей частью «сложной части» для вас. Но вам все равно нужно будет иметь дело с созданием своего собственного лексера и должным образом взаимодействует с его сгенерированным анализатором. Не является непреодолимой задачей, и если грамматика имеет какую -либо реальную сложность, вероятно, стоит ваших усилий в долгосрочной перспективе.

Если все это в основном просто, то вам, скорее всего, вам лучше делать это самостоятельно. В макушке моей головы трудно представить сложную бинарную грамматику, поскольку основной точка продажи бинарного формата является то, что она намного ближе к машине, что противоречит тексту, с которым большинство анализаторов предназначены для работы. Но я не знаю вашего варианта использования.

Но рассмотрим случай сборочного марлера. Это простой лексер, который может быть в состоянии стоять на высоком уровне на различных типах инструкций (например, те, которые не имеют аргументов, те, которые принимают один байт в качестве аргумента или слово), и подают это анализатору Затем можно использовать для преобразования инструкций в их мнемонику и операнды в обычном синтаксисе ассемблера, а также обрабатывать ссылки на метку и тому подобное.

Это надуманный случай, поскольку разборщик обычно не разделяет фазы лексинга и анализа, обычно он недостаточно сложный, чтобы беспокоиться, но это один из способов взглянуть на проблему.

Добавка:

Если у вас есть достаточно информации, чтобы преобразовать бинарный поток в текст, чтобы подавать в двигатель, то у вас достаточно информации, чтобы вместо создания текста, вы можете создать фактические токены, которые анализатор хотел бы увидеть из Lexer.

Тем не менее, что вы могли бы сделать, так это принять свой текстовый формат, использовать его в качестве основы для вашего инструмента и грамматики анализа и создать для вас машины Lexer и San Обработка с использованием «Текстовых тестов».

Но когда вы приходите к чтению бинарного, вместо того, чтобы создавать текст, чтобы затем быть лексом и проанализированы, просто создайте токены, которые будет создавать Lexer (это должны быть простые объекты), и накачивайте анализатор напрямую. Это сэкономит вам шаг Lex и сохранит вам некоторое время обработки.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top