The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]



Вариант для распечатки  
Пред. тема | След. тема 
Форум Разговоры, обсуждение новостей
Режим отображения отдельной подветви беседы [ Отслеживать ]

Оглавление

Вышел язык спецификации бинарных форматов Kaitai Struct 0.5, opennews (ok), 10-Ноя-16, (0) [смотреть все]

Сообщения [Сортировка по времени | RSS]


19. "Вышел язык спецификации бинарных форматов Kaitai Struct 0.5"  +1 +/
Сообщение от GreyCat (ok), 11-Ноя-16, 12:36 
> Насколько можно судить, грамматика Kaitai Struct мощнее, или, как минимум, не уже
> регулярных выражений.

Нет, здесь просто область применения радикально другая. Регулярные языки (да и вообще традиционные задачи парсинга) упираются в разрешение неоднозначности: всякие там ^(a*)(aaa)$ - очередная "a" - это еще первая группа или уже вторая? И, соответственно, приносятся всякие бэктрекинги, DFA, LL/LR/LALR, lookup'ы и т.д.

Бинарные форматы в массе своей куда проще. Здесь нет неоднозначности - они специально так проектируются, чтобы их было легко читать алгоритмом. Соответственно, и нет почти никакой необходимости в механиках неоднозначности.

Ответить | Правка | Наверх | Cообщить модератору

20. "Вышел язык спецификации бинарных форматов Kaitai Struct 0.5"  +/
Сообщение от Comdiv (ok), 11-Ноя-16, 13:11 
Ну, регулярные выражения в классическом понимании не требуют сложных механизмов разбора. В прагматичных применениях нет смысла замедлять разборщик, позволяя делать откат при разборе текста по приведённому Вами выражению и достаточно жадной стратегии, так как такие выражения не имеют практического смысла, и легко могут быть заменены на нормальные.

P.S Обратил внимание на недостатки:
1. В документации отсутсвует грамматика самого Katai Struct, это усложняет ознакомление.
2. Входной документ не проверяется на корректность и генератор легко делает некомпилируемый код

Ответить | Правка | Наверх | Cообщить модератору

21. "Вышел язык спецификации бинарных форматов Kaitai Struct 0.5"  +1 +/
Сообщение от GreyCat (ok), 11-Ноя-16, 13:27 
> Ну, регулярные выражения в классическом понимании не требуют сложных механизмов разбора.

Ну, как минимум DFA-то требуют. Хотя что считать сложным.

> P.S Обратил внимание на недостатки:
> 1. В документации отсутсвует грамматика самого Katai Struct, это усложняет ознакомление.

По-моему, в документации как раз ничего, кроме грамматики и нет :( Для упрощения ознакомления надо по идее писать какие-то туториалы, quick start и человеческие гайды, но мне все некогда, а кто-то еще никак не сподвигнется. Единственный гайд, который до сих пор написали - та самая статья в двух частях про реверсинг VN - но ее сложно назвать "гайдом по инструментарию".

> 2. Входной документ не проверяется на корректность

Ох. Как раз вроде бы теперь сильно больше проверяется. Можно больше конкретных примеров?

> и генератор легко делает некомпилируемый код

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

Ответить | Правка | Наверх | Cообщить модератору

22. "Вышел язык спецификации бинарных форматов Kaitai Struct 0.5"  +/
Сообщение от Comdiv (ok), 11-Ноя-16, 14:05 
> Ох. Как раз вроде бы теперь сильно больше проверяется. Можно больше конкретных
> примеров?

Я не экспериментировал много, просто ввёл такое:

meta:
  id: Операция Ы


что разборщик съел и не поморщился, выдав:

...
public class Операция Ы extends KaitaiStruct {
    public static Операция Ы fromFile(String fileName) throws IOException {
        return new Операция Ы(new KaitaiStream(fileName));
    }
...

Ответить | Правка | Наверх | Cообщить модератору

25. "Вышел язык спецификации бинарных форматов Kaitai Struct 0.5"  +1 +/
Сообщение от GreyCat (ok), 11-Ноя-16, 14:14 
>> Ох. Как раз вроде бы теперь сильно больше проверяется. Можно больше конкретных
>> примеров?
> Я не экспериментировал много, просто ввёл такое:
> meta:
>   id: Операция Ы

Да, факт. Не должно. Вообще все идентификаторы как раз проверяются, кроме, как оказалось, этого ;) Сейчас починю.

Хотя вообще само по себе это наталкивает на забавную дилемму. "Операция Ы", может, и невалидный идентификатор, а вот "операция_ы" (который станет в Java "ОперацияЫ") - вполне себе. Может, разрешить non-ASCII?..

Ответить | Правка | Наверх | Cообщить модератору

28. "Вышел язык спецификации бинарных форматов Kaitai Struct 0.5"  +/
Сообщение от Comdiv (ok), 11-Ноя-16, 14:45 
Если разрешать, тогда, наверное, для целевых языков, не поддерживающих такие символы нужно делать преобразование имён. Короче говоря, проще запретить.
Ответить | Правка | Наверх | Cообщить модератору

32. "Вышел язык спецификации бинарных форматов Kaitai Struct 0.5"  +1 +/
Сообщение от chinarulezzz (ok), 11-Ноя-16, 16:47 
> Если разрешать, тогда, наверное, для целевых языков, не поддерживающих такие символы нужно
> делать преобразование имён. Короче говоря, проще запретить.

Проще -- не всегда лучше. Предлагаю ограничиться предупреждением. А то в начале вводят в языки UTF8, а потом ограничивают его использование.

Ответить | Правка | Наверх | Cообщить модератору

23. "Вышел язык спецификации бинарных форматов Kaitai Struct 0.5"  +1 +/
Сообщение от chinarulezzz (ok), 11-Ноя-16, 14:12 
О, разработчик! Очень приятно.

С регулярными выражениями позицию понял. Хотел спросить еще, что на счет юзерских функций? Заметил, что есть process. Можно задавать собственные функции обработки? Бывает, попадаются извращенцы, которые упаковывают так, что одними xor/rol/ror/zlib не обойтись. Если да, то как?

Ответить | Правка | К родителю #21 | Наверх | Cообщить модератору

26. "Вышел язык спецификации бинарных форматов Kaitai Struct 0.5"  +2 +/
Сообщение от GreyCat (ok), 11-Ноя-16, 14:28 
> Хотел спросить еще, что на счет юзерских
> функций? Заметил, что есть process. Можно задавать собственные функции обработки? Бывает,
> попадаются извращенцы, которые упаковывают так, что одними xor/rol/ror/zlib не обойтись.
> Если да, то как?

Пока - вручную. То есть один формат, в котором все заканчивается на

   meta:
     id: Format1
   seq:
     # ...
     - id: buf
       size: something

дальше в целевом языке:

    Format1 foo = Format1.fromFile("...");
    byte[] buf = foo.buf();
    // как-то распаковали, отталкиваясь от buf
    byte[] unpacked = ...;
    // и запускаем парсить то, что внутри по второму формату:
    Format2 bar = new Format2(new KaitaiStream(unpacked));

и дальше уже отдельный тип Format2 в ksy описывает все, что внутри.

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

   - id: buf
     size: something
     process: user(some_unpacker)

И тогда внутри будет генерироваться вызов чего-то типа

   buf = new SomeUnpacker().unpack(raw)

А от пользователя, соответственно, будет предполагаться, что у него где-то неподалеку в окружении найдется класс SomeUnpacker, который implements такой интерфейс.

Ответить | Правка | Наверх | Cообщить модератору

30. "Вышел язык спецификации бинарных форматов Kaitai Struct 0.5"  +1 +/
Сообщение от chinarulezzz (ok), 11-Ноя-16, 16:45 
Ок. Если реализуете идею с интерфейсом наружу, то не забудьте про передачу параметров. Иногда нужно передать в распаковщик ранее распарсенную структуру.
Ответить | Правка | Наверх | Cообщить модератору

35. "Вышел язык спецификации бинарных форматов Kaitai Struct 0.5"  +2 +/
Сообщение от GreyCat (ok), 11-Ноя-16, 17:23 
> Ок. Если реализуете идею с интерфейсом наружу, то не забудьте про передачу
> параметров. Иногда нужно передать в распаковщик ранее распарсенную структуру.

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

Ответить | Правка | Наверх | Cообщить модератору

24. "Вышел язык спецификации бинарных форматов Kaitai Struct 0.5"  +/
Сообщение от Comdiv (ok), 11-Ноя-16, 14:13 
> По-моему, в документации как раз ничего, кроме грамматики и нет :(

Я имел ввиду формальное определение в РБНФ или что-то подобное. Такое описание позволяет быстрей ухватить суть за счёт компактности определения - синтаксис серьёзных языков умещается в несколько страниц, простых предметно ориентированных может влезть и в несколько строк. Зависит, конечно, от навороченности языка.

Ответить | Правка | К родителю #21 | Наверх | Cообщить модератору

27. "Вышел язык спецификации бинарных форматов Kaitai Struct 0.5"  +1 +/
Сообщение от GreyCat (ok), 11-Ноя-16, 14:31 
>> По-моему, в документации как раз ничего, кроме грамматики и нет :(
> Я имел ввиду формальное определение в РБНФ или что-то подобное. Такое описание
> позволяет быстрей ухватить суть за счёт компактности определения - синтаксис серьёзных
> языков умещается в несколько страниц, простых предметно ориентированных может влезть и
> в несколько строк. Зависит, конечно, от навороченности языка.

Тогда нужно придумать какую-то очередную вариацию БНФ для YAML-based форматов. Или можно по идее сделать YAML-схему...

Ответить | Правка | Наверх | Cообщить модератору

37. "Вышел язык спецификации бинарных форматов Kaitai Struct 0.5"  +1 +/
Сообщение от Comdiv (ok), 11-Ноя-16, 19:45 
Если сам YAML вписывается в БНФ, то проблем быть не должно, но всё же РБНФ лучше для восприятия человеком.

Нашёл БНФ для YAML https://gist.github.com/tociyuki/3936873 - выглядит удручающе, но вполне возможно, что грамматика Kaitai Struct, являясь подмножеством, будет попроще.

Ответить | Правка | Наверх | Cообщить модератору

38. "Вышел язык спецификации бинарных форматов Kaitai Struct 0.5"  +1 +/
Сообщение от GreyCat (ok), 11-Ноя-16, 20:10 
> Если сам YAML вписывается в БНФ, то проблем быть не должно, но
> всё же РБНФ лучше для восприятия человеком.
> Нашёл БНФ для YAML https://gist.github.com/tociyuki/3936873 - выглядит удручающе, но
> вполне возможно, что грамматика Kaitai Struct, являясь подмножеством, будет попроще.

Писать самому парсер YAML - это да, мягко говоря, удручающее занятие. Вообще весь смысл использования YAML (XML, JSON, или чего-то такого высокоуровневого) был ровно в том, чтобы *не* заморачиваться с любыми описаниями грамматик и Бэкусом-Науром, а использовать какие-то инструменты более высокого уровня для описания того, что дозволено иметь в формате.

Как правило - такие инструменты начинаются со схем. Для YAML это, например, Kwalify - http://www.kuwata-lab.com/kwalify/ruby/users-guide.01.html#s....

Если хочется именно грамматику и BNF / ENBF / RNBF / ANTLR / yacc / etc - то тогда имеет смысл ее просто придумать и описать, в терминах, формализуемых проще, чем языки разметки. В свое время на LOR народ предлагал вместо:

    meta:
      id: foo
    seq:
      - id: len
        type: u1
      - id: my_str
        type: str
        encoding: UTF-8
        size: len

делать что-то C-подобное, а ля

    type foo {
        u1 len;
        str(len, UTF-8) my_str;
    }

Ответить | Правка | Наверх | Cообщить модератору

40. "Вышел язык спецификации бинарных форматов Kaitai Struct 0.5"  –1 +/
Сообщение от Comdiv (ok), 11-Ноя-16, 20:23 
>    type foo {
>        u1 len;
>        str(len, UTF-8) my_str;
>    }

Конечно, нечто подобное и хотелось бы видеть в качестве входного языка вместо монотонно многословного YAML. Если такой вариант рассматривался, что стало преградой для воплощения?

Ответить | Правка | Наверх | Cообщить модератору

41. "Вышел язык спецификации бинарных форматов Kaitai Struct 0.5"  +1 +/
Сообщение от GreyCat (ok), 11-Ноя-16, 20:39 
>>    type foo {
>>        u1 len;
>>        str(len, UTF-8) my_str;
>>    }
> Конечно, нечто подобное и хотелось бы видеть в качестве входного языка вместо
> монотонно многословного YAML. Если такой вариант рассматривался, что стало преградой для
> воплощения?

И тот, и другой выбор - в любом случае спорные с многих точек зрения. Кому-то нравится одно, кому-то - другое. С точки зрения написания вручную - кому-то проще выучить синтаксис-скобочки-всякие []{}(), кому-то - держать в голове ключевые слова "size", "type", "id" и т.д.

С точки зрения программной обработки - конечно, любой язык разметки (YAML, JSON, XML) сильно выигрывает в плане того, что можно сделать красивый GUI, где показывать всю эту штуку в виде дерева с менюшками добавления элементов. Да и если надо сделать что-то простое с ksy-описанием - например, написать скрипт автоматического переименования типов - добавлять префикс - на любом скриптовом языке сейчас это делается в 2 строчки. Решать аналогичную задачу с полноценным языком с грамматикой - задача на два порядка более сложная.

Поддерживать параллельно два-три альтернативных представления формата (YAML/JSON, XML, C-подобный) мне на данном этапе развития проекта кажется не очень актуальным - хотя, в теории, дописать такую поддержку - задача на один-два вечера. Благо парсер с грамматиками у нас все равно уже есть. Дольше, скорее, это C-подобное представление придумывать.

Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Рекомендовать для помещения в FAQ | Индекс форумов | Темы | Пред. тема | След. тема




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру