1.1, АнонимХ (ok), 19:52, 10/11/2016 [ответить] [﹢﹢﹢] [ · · · ]
| +11 +/– |
Нужно!
Предлагаю всем собраться и решить вопрос с генератором, ибо это тоже нужно, но сложнее
| |
1.2, Uri (??), 20:16, 10/11/2016 [ответить] [﹢﹢﹢] [ · · · ]
| –6 +/– |
Ура! Да здравствует тысяча первый язык описания бинарных форматов!
| |
|
2.3, GreyCat (ok), 20:44, 10/11/2016 [^] [^^] [^^^] [ответить]
| +3 +/– |
Назовите хотя бы 3 предыдущих живых языка, если не сложно? Чтобы им можно было описать структуру файловой системы или там какого-нибудь JPEG- или PNG-файла.
| |
|
|
4.16, GreyCat (ok), 08:45, 11/11/2016 [^] [^^] [^^^] [ответить]
| +2 +/– |
Что самое смешное - там сейчас ни одного из языков описания бинарных форматов не затронуто. Речь про DFDL, BinPAC, PacketTypes, DataScript, PADS, PEG и т.п.
| |
|
|
|
1.6, Аноним (-), 22:39, 10/11/2016 [ответить] [﹢﹢﹢] [ · · · ]
| –5 +/– |
интересно, может ли эта вещь выполнять роль компилятора/кросскомпилятора, в последствии заменив собой гцц/шланг?
| |
|
2.11, Аноним (-), 00:57, 11/11/2016 [^] [^^] [^^^] [ответить]
| +1 +/– |
> интересно, может ли эта вещь выполнять роль компилятора/кросскомпилятора, в последствии
> заменив собой гцц/шланг?
Столица переезжает в Нью-Васюки!
| |
2.14, Led (ok), 04:28, 11/11/2016 [^] [^^] [^^^] [ответить]
| +1 +/– |
Даже не надейся: домашние задания всё равно будут задавать.
| |
|
1.8, zztop (?), 22:55, 10/11/2016 [ответить] [﹢﹢﹢] [ · · · ]
| +1 +/– |
Подскажите в какой программе сделана схема в первом изображении?
| |
|
2.18, Comdiv (ok), 12:27, 11/11/2016 [^] [^^] [^^^] [ответить]
| +/– |
Насколько можно судить, грамматика Kaitai Struct мощнее, или, как минимум, не уже регулярных выражений.
| |
|
3.19, GreyCat (ok), 12:36, 11/11/2016 [^] [^^] [^^^] [ответить]
| +1 +/– |
> Насколько можно судить, грамматика Kaitai Struct мощнее, или, как минимум, не уже
> регулярных выражений.
Нет, здесь просто область применения радикально другая. Регулярные языки (да и вообще традиционные задачи парсинга) упираются в разрешение неоднозначности: всякие там ^(a*)(aaa)$ - очередная "a" - это еще первая группа или уже вторая? И, соответственно, приносятся всякие бэктрекинги, DFA, LL/LR/LALR, lookup'ы и т.д.
Бинарные форматы в массе своей куда проще. Здесь нет неоднозначности - они специально так проектируются, чтобы их было легко читать алгоритмом. Соответственно, и нет почти никакой необходимости в механиках неоднозначности.
| |
|
4.20, Comdiv (ok), 13:11, 11/11/2016 [^] [^^] [^^^] [ответить]
| +/– |
Ну, регулярные выражения в классическом понимании не требуют сложных механизмов разбора. В прагматичных применениях нет смысла замедлять разборщик, позволяя делать откат при разборе текста по приведённому Вами выражению и достаточно жадной стратегии, так как такие выражения не имеют практического смысла, и легко могут быть заменены на нормальные.
P.S Обратил внимание на недостатки:
1. В документации отсутсвует грамматика самого Katai Struct, это усложняет ознакомление.
2. Входной документ не проверяется на корректность и генератор легко делает некомпилируемый код
| |
|
5.21, GreyCat (ok), 13:27, 11/11/2016 [^] [^^] [^^^] [ответить]
| +1 +/– |
> Ну, регулярные выражения в классическом понимании не требуют сложных механизмов разбора.
Ну, как минимум DFA-то требуют. Хотя что считать сложным.
> P.S Обратил внимание на недостатки:
> 1. В документации отсутсвует грамматика самого Katai Struct, это усложняет ознакомление.
По-моему, в документации как раз ничего, кроме грамматики и нет :( Для упрощения ознакомления надо по идее писать какие-то туториалы, quick start и человеческие гайды, но мне все некогда, а кто-то еще никак не сподвигнется. Единственный гайд, который до сих пор написали - та самая статья в двух частях про реверсинг VN - но ее сложно назвать "гайдом по инструментарию".
> 2. Входной документ не проверяется на корректность
Ох. Как раз вроде бы теперь сильно больше проверяется. Можно больше конкретных примеров?
> и генератор легко делает некомпилируемый код
Это довольно многогранный вопрос, не совсем связанный с корректностью входного ksy. Например, если мы компилируем два ksy по отдельности: FormatA и FormatB, и FormatA ссылается на FormatB. На момент компиляции FormatA компилятор ничего не знает о структуре (и даже существовании) FormatB, поэтому лучшее, что он может сделать, встретив неописанный тип - просто вывести его названием, как есть, в предположении, что это тип верхнего уровня. По отдельности FormatA не скомпилируется. А вот FormatA + FormatB в одном проекте уже дадут искомую работающую связку.
| |
|
6.22, Comdiv (ok), 14:05, 11/11/2016 [^] [^^] [^^^] [ответить]
| +/– |
> Ох. Как раз вроде бы теперь сильно больше проверяется. Можно больше конкретных
> примеров?
Я не экспериментировал много, просто ввёл такое:
meta:
id: Операция Ы
что разборщик съел и не поморщился, выдав:
...
public class Операция Ы extends KaitaiStruct {
public static Операция Ы fromFile(String fileName) throws IOException {
return new Операция Ы(new KaitaiStream(fileName));
}
...
| |
|
7.25, GreyCat (ok), 14:14, 11/11/2016 [^] [^^] [^^^] [ответить]
| +1 +/– |
>> Ох. Как раз вроде бы теперь сильно больше проверяется. Можно больше конкретных
>> примеров?
> Я не экспериментировал много, просто ввёл такое:
> meta:
> id: Операция Ы
Да, факт. Не должно. Вообще все идентификаторы как раз проверяются, кроме, как оказалось, этого ;) Сейчас починю.
Хотя вообще само по себе это наталкивает на забавную дилемму. "Операция Ы", может, и невалидный идентификатор, а вот "операция_ы" (который станет в Java "ОперацияЫ") - вполне себе. Может, разрешить non-ASCII?..
| |
|
8.28, Comdiv (ok), 14:45, 11/11/2016 [^] [^^] [^^^] [ответить] | +/– | Если разрешать, тогда, наверное, для целевых языков, не поддерживающих такие сим... текст свёрнут, показать | |
|
|
6.23, chinarulezzz (ok), 14:12, 11/11/2016 [^] [^^] [^^^] [ответить]
| +1 +/– |
О, разработчик! Очень приятно.
С регулярными выражениями позицию понял. Хотел спросить еще, что на счет юзерских функций? Заметил, что есть process. Можно задавать собственные функции обработки? Бывает, попадаются извращенцы, которые упаковывают так, что одними xor/rol/ror/zlib не обойтись. Если да, то как?
| |
|
7.26, GreyCat (ok), 14:28, 11/11/2016 [^] [^^] [^^^] [ответить]
| +2 +/– |
> Хотел спросить еще, что на счет юзерских
> функций? Заметил, что есть 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 такой интерфейс.
| |
|
|
9.35, GreyCat (ok), 17:23, 11/11/2016 [^] [^^] [^^^] [ответить] | +2 +/– | Например Распаковщик, если что, инициализируется вручную на том же уровне, на к... текст свёрнут, показать | |
|
|
|
6.24, Comdiv (ok), 14:13, 11/11/2016 [^] [^^] [^^^] [ответить]
| +/– |
> По-моему, в документации как раз ничего, кроме грамматики и нет :(
Я имел ввиду формальное определение в РБНФ или что-то подобное. Такое описание позволяет быстрей ухватить суть за счёт компактности определения - синтаксис серьёзных языков умещается в несколько страниц, простых предметно ориентированных может влезть и в несколько строк. Зависит, конечно, от навороченности языка.
| |
|
7.27, GreyCat (ok), 14:31, 11/11/2016 [^] [^^] [^^^] [ответить]
| +1 +/– |
>> По-моему, в документации как раз ничего, кроме грамматики и нет :(
> Я имел ввиду формальное определение в РБНФ или что-то подобное. Такое описание
> позволяет быстрей ухватить суть за счёт компактности определения - синтаксис серьёзных
> языков умещается в несколько страниц, простых предметно ориентированных может влезть и
> в несколько строк. Зависит, конечно, от навороченности языка.
Тогда нужно придумать какую-то очередную вариацию БНФ для YAML-based форматов. Или можно по идее сделать YAML-схему...
| |
|
8.37, Comdiv (ok), 19:45, 11/11/2016 [^] [^^] [^^^] [ответить] | +1 +/– | Если сам YAML вписывается в БНФ, то проблем быть не должно, но всё же РБНФ лучше... текст свёрнут, показать | |
|
9.38, GreyCat (ok), 20:10, 11/11/2016 [^] [^^] [^^^] [ответить] | +1 +/– | Писать самому парсер YAML - это да, мягко говоря, удручающее занятие Вообще вес... текст свёрнут, показать | |
|
10.40, Comdiv (ok), 20:23, 11/11/2016 [^] [^^] [^^^] [ответить] | –1 +/– | Конечно, нечто подобное и хотелось бы видеть в качестве входного языка вместо мо... текст свёрнут, показать | |
|
|
|
|
|
|
|
|
|
1.43, Аноним (-), 05:34, 12/11/2016 [ответить] [﹢﹢﹢] [ · · · ]
| +1 +/– |
Прекрасно оформленная новость и очень крутой апдейт с кучей полезностей!
| |
1.44, Аноним (-), 06:03, 12/11/2016 [ответить] [﹢﹢﹢] [ · · · ]
| –1 +/– |
Увы, пока очень слабо. Но потенциал для развития есть. Автор, откройте драфт какого-нибудь стандарта, например, H.264 и сами все поймете.
| |
|
|
3.46, Max (??), 16:44, 12/11/2016 [^] [^^] [^^^] [ответить]
| +/– |
А как можно начать считывание типов со смещением от конца потока?
| |
|
4.47, GreyCat (ok), 16:45, 12/11/2016 [^] [^^] [^^^] [ответить]
| +/– |
> А как можно начать считывание типов со смещением от конца потока?
instances:
foo:
pos: _io.size - смещение_от_конца
| |
|
5.48, Max (??), 17:05, 12/11/2016 [^] [^^] [^^^] [ответить]
| +/– |
Как ни странно, но именно это я и попробовал сделать в первую очередь...
Не работает оно(
| |
|
6.49, GreyCat (ok), 17:07, 12/11/2016 [^] [^^] [^^^] [ответить]
| +/– |
> Как ни странно, но именно это я и попробовал сделать в первую
> очередь...
> Не работает оно(
Можно чуть более развернуто - что именно не работает? Не компилируется ksc, не компилируется целевым языком, компилируется, но зачитывает не то, что ожидалось?
| |
|
7.50, Maxim (??), 17:23, 12/11/2016 [^] [^^] [^^^] [ответить]
| +/– |
А теперь до меня дошло, что в ksv не подсвечиваются секции указанные в instances...
Печально. Я думал, что оно тоже должно подсвечиваться.
| |
|
|
|
|
11.59, Maxim (??), 21:58, 15/11/2016 [^] [^^] [^^^] [ответить] | +/– | Спасибо за исправление Теперь все работает как надо Еще я хотел узнать, а можн... текст свёрнут, показать | |
|
|
|
|
|
|
|
|
19.68, Maxim (??), 22:57, 15/11/2016 [^] [^^] [^^^] [ответить] | +/– | Кстати, в данном случае надо сбросить подсветку родительской секции В данном сл... текст свёрнут, показать | |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2.56, GreyCat (ok), 08:36, 15/11/2016 [^] [^^] [^^^] [ответить]
| +/– |
> Нужная штука. Как бы так ее скрестить с Thrift/Avro....
А зачем? Разбирать Thrift или Avro в KS?
| |
|
1.57, КО (?), 18:00, 15/11/2016 [ответить] [﹢﹢﹢] [ · · · ]
| +/– |
Битовые поля поддерживаются? Или можно ли таким инструментом описывать регистры аппаратуры, где далеко не все поля кратны байтам?
| |
|
2.58, GreyCat (ok), 18:01, 15/11/2016 [^] [^^] [^^^] [ответить]
| +1 +/– |
> Битовые поля поддерживаются? Или можно ли таким инструментом описывать регистры аппаратуры,
> где далеко не все поля кратны байтам?
Пока нет, но, надеюсь, скоро сделаем. Пока все побитовые операции делаются через битмаски.
| |
|
3.69, Rustlang (?), 12:21, 17/11/2016 [^] [^^] [^^^] [ответить]
| +/– |
Здравствуйте. Мне попался бинарный файл, который содержит в качестве дескриптора таблицу вида: тип элемента+конец смещения относительно начала файла.
Размер элемента определяется разностью между концом и началом, но началом служит конец блока дескрипторов, а эту информацию внутри instances никак не получить...
Нужно все-таки научить этот язык итерировать списки.
И я так и не нашел как создавать предусловия для цикла.
| |
|
4.70, GreyCat (ok), 22:33, 23/11/2016 [^] [^^] [^^^] [ответить]
| +/– |
Очень мало что понял без более конкретных примеров, но попробую ответить.
> Размер элемента определяется разностью между концом и началом, но началом служит конец > блока дескрипторов, а эту информацию внутри instances никак не получить...
Если нужно получить "начало" через конец блока дескрипторов - то, вероятно, нужно создать отдельный элемент в seq, который бы начинался сразу после этого самого блока дескриптора - он создаст поток, в этом потоке размечать уже instances. Индексация при этом уже будет с 0, получать ничего не нужно.
Альтернативный (но относительно хаковый) вариант - каким-то образом сделать так, чтобы после блока дескрипторов вызвался _io.pos и сохранился где-то (в вычислимом instance, например). А затем уже отчитывать вручную от него.
> Нужно все-таки научить этот язык итерировать списки.
Зачем?
> И я так и не нашел как создавать предусловия для цикла.
Никак.
| |
|
5.71, Maxim (??), 23:20, 24/11/2016 [^] [^^] [^^^] [ответить]
| +/– |
> Если нужно получить "начало" через конец блока дескрипторов - то, вероятно, нужно
> создать отдельный элемент в seq, который бы начинался сразу после этого
> самого блока дескриптора - он создаст поток, в этом потоке размечать
> уже instances. Индексация при этом уже будет с 0, получать ничего
> не нужно.
Вот именно, что нужно не просто получить "начало", а использовать блок дескрипторов для разбора этих элементов. Нужно как-то итерировать блок дескрипторов внутри instances после блока...
| |
|
6.72, GreyCat (ok), 19:20, 25/11/2016 [^] [^^] [^^^] [ответить]
| +/– |
>> Если нужно получить "начало" через конец блока дескрипторов - то, вероятно, нужно
>> создать отдельный элемент в seq, который бы начинался сразу после этого
>> самого блока дескриптора - он создаст поток, в этом потоке размечать
>> уже instances. Индексация при этом уже будет с 0, получать ничего
>> не нужно.
> Вот именно, что нужно не просто получить "начало", а использовать блок дескрипторов
> для разбора этих элементов. Нужно как-то итерировать блок дескрипторов внутри instances
> после блока...
Можно какой-то чуть более конкретный пример? Я пока понял, что вроде бы речь идет о случае, когда есть два отдельных массива (прямо совсем отдельных, чуть ли не в разных объектах на разных уровнях лежащих), и надо итерироваться сразу по обоим одновременно?
| |
|
7.73, Max (??), 03:09, 26/11/2016 [^] [^^] [^^^] [ответить]
| +/– |
Ну почти так.
Нужно сначала получить все дескрипторы, а потом уже получить второй массив.
Могу скинуть пример позже.
| |
|
|
|
|
|
|
|