REB - интерпретатор для низкоуровневого программирования.
От: Аноним Осман Бинеев  
Дата: 02.03.03 13:43
Оценка: 45 (2)
Статья :
REB — интерпретатор для низкоуровневого программирования.
Автор(ы): Осман Бинеев
Дата: 24.10.2001


Авторы :
Осман Бинеев
Идея супер! но на VC.NET не смог откомпилировать.
От: Alex4x  
Дата: 03.03.03 13:43
Оценка:
Идея очень хорошая, и тестовый пример показывает многие направления применения.
Я и сам очень радовался перловым регулярным выражениям, и страдал от того что их нет в си.

В VC.NET не смог откомпилировать (возможно просто что-то не понял) но библиотеки Hash я не нашел.
Есть ли версия исходника для VC 6.0 или VC.NET ???

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

продолжение есть.
Продолжение
От: Alex4x  
Дата: 03.03.03 13:44
Оценка:
Например для случая разбора некого файла, содержащего данные о 3d объекте и имеющего HTML подобную структуру.

<object[name_obj1]> //все что после // и до конца строки — примечание
<headobj>
triangls=100; //количество треуг
texturs=4; //количество текстур
<\headobj>
<verts>
<vert[1]>
x1=0;y1=0;z1=0;
x2=1;y2=1;z2=0;
x3=1;y3=1;z3=1;
<\vert[1]>
.
.
.
<\verts>
<texturs>
<textura[1]>
file="..\..\text1.jpg"; //файл
alpha=50%; //альфа
mipmap=8; //число уровней детализации
<\textura[1]>
.
.
<\texturs>
<\object[name_obj1]>
.
.
.
//Другие объекты

порядок обработки:
1. все_данные
2. <object[name_obj1]>....вызов функции обработки объекта....<\object[name_obj1]>
3. .....
.. .....
10. <object[name_obj10]>....вызов функции обработки объекта....<\object[name_obj10]>


Функция обработки объекта:
<headobj>...обработка заголовкаа.....<\headobj>
<verts>.....обработка узлов....<\verts>
<texturs>.....обработка текстур....<\texturs>

и так далее.
Продолжение 2
От: Alex4x  
Дата: 03.03.03 13:44
Оценка:
Если мы имеем такую структуру данных и хотим на этапе ее чтения превратить в нечто другое (например в стандартизованный для DX или OpenGL формат, то нам всеравно на каком-то этапе придется сформировать некую структуру данных и туда все записать.
1 вариант — все данные поместить в хеш, а потом работать с ним
2 вариант — вызовы функций по "запихиванию" данных в какой-то контейнер вписать прямо в шаблон,
соответсвенно сохранив функцию рекурсивности.

Мне кажется что PERL подобные регулярные выражения потому и не поддерживают рекурсивность, что на этапе определения глубины обработки регулярным синтаксисом невсегдя можно описать что делать,
поэтому может необходимо добавить каких-то комманд управляющих именно рекурсивностью, кстати если каждая обрабатываемая группа в регулярном выражении сможет вызывать ПРОИЗВОЛЬНУЮ функцию, указанную в шаблоне, то в этой как раз функции и имеет смысл вставить обработку того что туда попало, возможно снова регулярным выражением, и так далее...

p.s.
В VC.NET есть поддержка регулярных выражений (RegExp), было бы интересно попробовать на базе этого создать расширенную библиотеку.
Честно говоря не очень себе представляю как алгоритмически это написать, если кому будет не лень, может подаст идею с чего начать.

Если есть примеры подобного, или идеи или советы, сообщите пожалуйста alex_4x@mail.ru
Re: REB - интерпретатор для низкоуровневого программирования
От: Аноним  
Дата: 24.12.04 20:56
Оценка:
Здравствуйте, Аноним, Вы писали:
Идея класс, с переносимостью кода тоже все супер. Идея с cygwin меня реально проперла, правда тяжеловато получилось, но это не порок, придает солидности так сказать.
Re: REB - интерпретатор для низкоуровневого программирования
От: j.smith  
Дата: 25.12.04 08:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Статья :



А>Авторы :

А>Осман Бинеев

Представим себе что надо сделать какой-нить MPEG- video parser.
Сразу будет нужна поддержка big-/little- endian, битовых полей/строк как фиксированой так и переменной длины,
поддержка ремаппинга посредством таблиц (vld tables). В случаее если синтаксические елементы кодированы посредством арифметических кодеров то вообще сложно себе представить как ето можно парсить регулярными выражениями.

Мое резюме — REB выглядит недостаточно гибким, и в моем конкретном случае (или в этой области вообще) выглядит бесполезным.

Это, если хотите, критическая точка зрения после прочтения статьи..

И некоторые соображания, которые надеюсь будут интересными.

Для начала — я слышал только об одной сложной и объемной задаче парсинга бинарных даных — ASN parser (H.323), но этих парсеров уже достаточно. И достаточно хороших. Кому нужен еще один? (А "нужность" необходимое условие развития. Кстати если не ошибаюсь — у ASN parser-ов есть некий формалный язык описания формата даных из которого уже генерируют сам парсер. Может стоит посмотреть?).
Другие задачи парсинга бинарных даных — гораздо менее объемные. Например не-новичек в области MPEG- напишет какой-нить MPEG- парсер за неделю. Согласитесь — это достаточно мало, если учесть что полный декодер он будет делать еще месяца 2-3. А вот тем кто разрабатывает новый стандарт не помешал бы инструмент который с некоего формального языка мог бы сгенерить парсер или что-то похожее. Но сколько таких людей? Вообще "трудность" парсинга бинарный даных несколько надумана — здесь все значения однозначные в отличие от текстовых даных, нет непредвиденых даных. Все что нужно — один раз написать что-то типа get|peek|skip_bits()/get|peek|skip_bytes(). Регулярные выражения это хорошо в тексте — одни пишут строчки с игнорированием регистра, другие ставят вместо "\n" "\r\n" и т.д. В общем — головная боль.
Re: REB - интерпретатор для низкоуровневого программирования
От: Gaperton http://gaperton.livejournal.com
Дата: 27.12.04 15:49
Оценка:
Очень хорошо. Интересная статья, и интересная работа. Спасибо.

Обратите внимание на Binaries из языка Erlang. У вас получается в чем-то достаточно близко, а в чем-то более гибко. Возможно, вы сможете извлечь какие-нибудь полезные идеи и из этого языка, как вы сделали с Perl.

http://www.erlang.se/doc/doc-5.4.3/doc/reference_manual/expressions.html#bit_syntax
http://www.erlang.se/doc/doc-5.4.3/doc/programming_examples/bit_syntax.html#4

Erlang на данный момент один из лучших языков, поддерживающий работу с бинарными данными. От тоже динамически типизирован, как и ваш. Он функционален, но в данном случае неважно. Вот пример кода (разбор IP-датаграммы).
-define(IP_VERSION, 4).
-define(IP_MIN_HDR_LEN, 5).

DgramSize = size(Dgram),
case Dgram of 
    <<?IP_VERSION:4, HLen:4, SrvcType:8, TotLen:16, 
      ID:16, Flgs:3, FragOff:13,
      TTL:8, Proto:8, HdrChkSum:16,
      SrcIP:32,
      DestIP:32, RestDgram/binary>> when HLen >= 5, 4 * HLen =< DgramSize ->
            OptsLen = 4*(HLen - ?IP_MIN_HDR_LEN),
            <<Opts:OptsLen/binary, Data/binary>> = RestDgram,
    ...
end.

Обратите внимание на забавное сходство — там тоже применяются угловые скобки для бинарных данных. В проекте этой фичи они тоже, как и у вас, были одинарными, но это затрудняет парсинг — "<" путается со знаком меньше, поэтому ее заменили на "<<".
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.