Язык синтаксического анализа для двоичных и символьных файлов - PullRequest
3 голосов
/ 11 марта 2010

Проблема: У вас есть некоторые данные, и ваша программа требует определенного ввода. Например, строки, которые являются числами. Вы ищете способ преобразования исходных данных в нужный вам формат. И проблема в том, что источником может быть что угодно. Это может быть XML, списки свойств, двоичные файлы, которые содержит необходимые данные, глубоко внедренные в бинарный мусор. И ваш формат вывода может отличаться также: это могут быть числовые строки, числа с плавающей запятой, двойные числа ...

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


Сложение:

Многие пользователи сталкиваются с этой проблемой и надеются, что их программы смогут конвертировать, читать и записывать данные, предоставленные другими источниками. Если это невозможно, они обречены или используют такие программы, как бизнес интеллект. Это не проблема. Я говорю об инструменте для разработчика , который знает, что он делает, но также недоволен тем, что каждый раз пишет подпрограммы на обычном языке. Профессиональный инструмент для манипулирования данными, что-то вроде шестнадцатеричного редактора, regex, vi, grep, parser, объединенного вместе доступны подпрограммами или REPL.

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


Позволяет:

  • объединение / группировка / объединение результатов
  • вставка / удаление / вывод / замена
  • написать макрос, который позволяет многократно выполнять цепочку команд
  • метагруппировка (списки-> таблицы-> n-мерные таблицы)

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

Я ищу хороший язык / языковой дизайн и, если возможно, реализацию. Какой дизайн вам нравится или даже, если он не соответствует условиям, вы бы не хотели пропустить?

РЕДАКТИРОВАТЬ: Вопрос в том, существует ли решение проблемы и если да, какие реализации доступны. Вы НЕ реализуете свой собственный алгоритм сортировки, если доступны Quicksort, Mergesort и Heapsort. Вы НЕ изобретаете свой собственный анализ текста метод, если у вас есть регулярные выражения. Вы НЕ изобретаете свой собственный 3D-язык для графики, если доступен OpenGL / Direct3D. Существуют существующие решения или, по крайней мере, документы с описанием проблемы и предложениями. И есть люди, которые, возможно, работали и испытывали такие проблемы, и которые могут дать идеи и предложения. Идея, что эта проблема является совершенно новой, и я должен решить и реализовать ее сам без фона позвольте мне признать, что знание совершенно не соответствует действительности.

UPDATE: К сожалению, у меня было меньше времени, чем предполагалось, чтобы углубиться в эту тему, потому что наша команда разработчиков в настоящее время находится в горячей фазе. Но я связался с автором TextTransformer, и он любезно ответил на мои вопросы.
Тем временем я исследовал TextTransformer (http://www.texttransformer.de)) и до сих пор вижу, что он предлагает полное и эффективное решение, если вы собираетесь анализировать символьные данные.

Для тех, кто попробует реализовать хороший язык синтаксического анализа, наименьший набор операторов для непосредственного преобразования любых входных данных в любые выходные данные, если (!) Они были достаточно мощными, кажется:

  • Вставить / удалить: самоочевидный

  • Group / Ungroup: разбить входные данные на набор токенов и организовать их в группы и супергруппы (структуры данных, списки, таблицы и т. д.)

  • Преобразование

    • Замена: изменить содержимое токенов (специальная операция: заменить)
    • Транспонирование: изменение порядка жетонов (своп, слияние и т. Д.)

Ответы [ 5 ]

4 голосов
/ 12 марта 2010

Вы исследовали TextTransformer ?

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

Вам все еще нужно немного поработать над программированием.

3 голосов
/ 11 марта 2010

Это предложение может значительно расширить область вашего поиска ... но вот оно:

Вы можете использовать повторно, как есть, или иным образом получить «вдохновение» из [открытого исходного кода] кода SnapLogic framework.

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

Существенной и мощной особенностью SnapLogic является ее способность [виртуально] без кода создавать « конвейеры », то есть процессы, выполненные из предварительно созданных компонентов; Компоненты, отвечающие наиболее распространенным требованиям задач интеграции данных, поставляются в комплекте с SnapLogic. Например, есть компоненты для

  • чтение и / или запись в файлы в формате CSV, XML или фиксированной длины
  • подключение к различным бэкэндам SQL (для ввода, вывода или для обоих)
  • преобразование / форматирование [легко анализируемые] поля данных
  • сортировка записей
  • объединение записей для поиска и общего «денормализованного» построения записей (похоже на объединения SQL, но применимо к любому входу [разумного размера])
  • объединение источников
  • Фильтрация записей в источнике (чтобы выбрать и на более позднем этапе работать с записями, скажем, только с атрибутом "State", равным "NY")
  • см. список доступных компонентов для более подробной информации

Относительно слабая область функциональности SnapLogic (для описанной цели OP) связана с синтаксическим анализом . Стандартные компоненты будут считывать только общие форматы файлов (XML, RSS, CSV, Fixed Len, СУБД ...), поэтому структурированные (или полуструктурированные?) Файлы, такие как описанные в вопросе, со смешанным двоичным и текстовым файлами и тому подобное. вряд ли когда-либо будет стандартным компонентом.
Поэтому вам нужно написать свою собственную логику синтаксического анализа, на Python или Java, с уважением, конечно, к API SnapLogic, чтобы впоследствии модуль мог «хорошо играть» с другими.
Кстати, задача разбора описанных файлов может быть выполнена одним из двух способов, с «монолитным» компонентом считывателя (т. Е. Тот, который принимает весь файл и производит массив легко анализируемых записей), или с многокомпонентным подход, при котором компонент ввода считывает и анализирует файл на уровне «записи» (или на уровне строки или на уровне блока, независимо от того, что это может быть), и другие стандартные или пользовательские компоненты SnapLogic используются для создания конвейера, который эффективно выражает логику разбора записи (или блока, или ...) на отдельные поля / атрибуты.
Второй подход, конечно, более модульный и может быть применим, если цель состоит в том, чтобы обрабатывать много разных форматов файлов, при этом каждый новый формат требует объединения компонентов без какого-либо или небольшого кодирования. Какой бы подход не использовался для ввода / анализа файла (ов), платформа SnapLogic остается доступной для создания конвейеров, чтобы затем обрабатывать анализируемый ввод различными способами.

Поэтому мое понимание вопроса побудило меня предложить SnapLogic в качестве возможной основы для рассматриваемой проблемы, потому что я понимал пробел в функции, касающейся анализа без кода файлов нестандартного формата, но также видел некоторую общность функций в отношении создания различных технологических трубопроводов.
Я также отреагировал на мое предложение выражением типа « вдохновляй себя от » из-за возможного пробела в функциях, но также из-за относительной недостаточной зрелости предложения SnapLogic и его очевидного коммерческого / открытого источника. амбивалентность.
(Примечание: это утверждение не является ни критикой технической зрелости / ценности самой структуры, ни критикой бизнес-ориентированного использования открытого исходного кода, но скорее предупреждением о том, что деловое / коммерческое давление может формировать предложение в разных направлениях)

Подводя итог :
В зависимости от конкретных деталей видения, выраженного в вопросе, SnapLogic может быть достоин рассмотрения, при условии, что каждый понимает, что « некоторая сборка требуется » будет применяться, в частности, в области анализа файлов, и что конкретная форма и характер продукта могут эволюционировать (но опять же, это открытый исходный код, поэтому его можно заморозить или согнуть при необходимости).
Более общим замечанием является то, что SnapLogic основан на Python, который является очень популярным языком для кодирования различных коннекторов, логики преобразования и т. Д.

3 голосов
/ 11 марта 2010

Для программиста я бы предложил:

Perl против SQL бэкэнда.

Для непрограммиста то, что вы ищете, это что-то вроде Business Intelligence Suite.

2 голосов
/ 15 марта 2010

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

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

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

Подход b) на первый взгляд может показаться «неприятным», но, учитывая хороший выразительный язык высокого уровня с кучей полезных библиотек (регулярные выражения, манипуляции с XML, создание анализаторов ...), он не должен быть слишком сложным, и может постепенно превращаться в DSL для этой цели. Помимо уже упоминавшегося Perl, Python и Ruby звучат как хорошие кандидаты на эти языки (могу поспорить, некоторые производные от Lisp тоже есть, но у меня там нет опыта).

1 голос
/ 17 марта 2010

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

...