OberonCore
https://forum.oberoncore.ru/

YSon - Парсер/генератор JSON
https://forum.oberoncore.ru/viewtopic.php?f=90&t=4213
Страница 1 из 2

Автор:  Пётр Кушнир [ Среда, 09 Январь, 2013 17:52 ]
Заголовок сообщения:  YSon - Парсер/генератор JSON

Начал пилить. У всех уже есть, чем оберон хуже :)

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

В итоге планирую запилить сериализатор/десериализатор всяких рекордов.

(модератор, 06.06.2013) выложено в коллекции: http://oberoncore.ru/bbcc/subs/yson/

Автор:  Илья Ермаков [ Среда, 09 Январь, 2013 18:39 ]
Заголовок сообщения:  Re: Парсер/генератор JSON

Пётр Кушнир писал(а):
Парсер сделал двухуровневый, с возможностью не строить структуры, в общем, по принципу SAX для xml


Вот это правильно...

Автор:  Пётр Кушнир [ Четверг, 10 Январь, 2013 13:23 ]
Заголовок сообщения:  Re: Парсер/генератор JSON

попытка понимания/применения цикла Дейкстры:
Код:
   PROCEDURE ReadChar (rd: Reader; OUT ch: Char; OUT res: INTEGER);
      VAR x: CHAR; stop: BOOLEAN; u: ARRAY 6 OF CHAR; uc: INTEGER;
   BEGIN
      res:=continue; stop:=FALSE; ch.screen:=FALSE; uc:=-1;
      WHILE ~stop & rd.Read(x)  DO
         IF (x='\') & ~ch.screen THEN
            ch.screen:=TRUE;
         ELSIF ch.screen & (uc<0) THEN
            CASE x OF
               '\', '"', '/', 08X, 09X, 0DX, 0AX, 0CX: ch.x:=x; stop:=TRUE;
               |'u': uc:=0;
            ELSE
               res:=err; stop:=TRUE;
            END
         ELSIF ch.screen & (uc>=0) THEN
            IF uc < 4 THEN
               u[uc]:=x; INC(uc);
            ELSE
               u[4]:='H'; u[5]:=0X;
               Strings.StringToInt(u$, uc, res);
               IF res=0 THEN
                  ch.x:=CHR(uc);
               ELSE
                  res:=err;
               END;
               stop:=TRUE;
               uc:=-1;
            END;
         ELSIF (x#'\') & ~ch.screen THEN
            ch.x:=x;
            stop:=TRUE;
         END;
      END;
      IF ~stop THEN res:=eot END;
   END ReadChar;

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

Автор:  Борис Рюмшин [ Четверг, 10 Январь, 2013 13:32 ]
Заголовок сообщения:  Re: Парсер/генератор JSON

Главное, чтобы попроще и покомпактнее 8)

Автор:  Борис Рюмшин [ Четверг, 10 Январь, 2013 13:34 ]
Заголовок сообщения:  Re: Парсер/генератор JSON

Борис Рюмшин писал(а):
Главное, чтобы попроще и покомпактнее 8)

Это ко всему парсеру относилось, а не к примеру))) А то мы как-то одновременно сообщения опубликовали.

Автор:  Valery Solovey [ Четверг, 10 Январь, 2013 20:42 ]
Заголовок сообщения:  Re: Парсер/генератор JSON

Символ экранироования - это escape character. То есть, вместо screen лучше использовать esc. Так понятнее, мне кажется.

Автор:  Пётр Кушнир [ Четверг, 10 Январь, 2013 22:26 ]
Заголовок сообщения:  Re: Парсер/генератор JSON

Valery Solovey писал(а):
escape character
Спасибо, как-то я проигнорировал этот факт.

Борис Рюмшин писал(а):
Это ко всему парсеру относилось
Сейчас вот такой расклад сырцов по строкам:
Код:
YSonParser:  390
YSonModels:  287
YSonConverters:  172
YSonGenerator:  159

Автор:  Борис Рюмшин [ Четверг, 10 Январь, 2013 23:55 ]
Заголовок сообщения:  Re: Парсер/генератор JSON

Пётр, да это не так важно. Я больше про интерфейс наверно...
Просто Xmlcore штука хорошая, но уж больно тяжеловесная. Хотя, там задача, конечно, пожёстче. :)

Автор:  Пётр Кушнир [ Суббота, 12 Январь, 2013 19:56 ]
Заголовок сообщения:  Re: Парсер/генератор JSON

вот, можно посмотреть на текущее состояние: https://bitbucket.org/petryxa/bbcb/comm ... ea0eb2b633 (там же свежая ypk)
вся тестовая работа пока через коммандеры Compile-List
вроде я осилил парсинг структур, теперь надо разобраться с форматами чисел.
Добавил генератор без опоры на модель, добавил ему чуть ума, чтобы совсем чушь не позволял генерировать.

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

Вложения:
Комментарий к файлу: имена файлов не имеют значения, но самый жирный по правкозатратам получился парсер, да.
Снимок.JPG
Снимок.JPG [ 63.67 КБ | Просмотров: 13203 ]

Автор:  Илья Ермаков [ Воскресенье, 13 Январь, 2013 10:11 ]
Заголовок сообщения:  Re: Парсер/генератор JSON

Пётр, правильно ли я понимаю, что если применять ваш парсер в режиме SAX, то он не будет использовать динамическую память (делать NEW)?

Автор:  Пётр Кушнир [ Воскресенье, 13 Январь, 2013 13:00 ]
Заголовок сообщения:  Re: Парсер/генератор JSON

Ну, чисто технически я не ставил задачу обходиться совсем без NEW, я скорее предполагал, что "деревянные" структуры из YSonModels многим не нужны (но не всем), и поэтому, можно воткнуть свою реализацию Parser.Target и работать внутри неё, реагируя на сигналы парсера непосредственно.

В данной реализации NEW будет использоваться в стеке отслеживания вложенных объектов/массивов и при работе с динамическими строками (куда же без них), но, думаю, если пошаманить, то можно избавиться от динамики, но, насколько я понимаю, это приведёт ко всяким особенностям, типа ограничения глубины вложенности (с другой стороны, кому нужны хотя бы 128 уровней, не ясно :) ), и, что более важно, ограничит длину строки (в base64 бинари кодировать уже не получится).

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

А как быть со скрытыми реализациями в отсутствии NEW?

Автор:  Илья Ермаков [ Воскресенье, 13 Январь, 2013 14:53 ]
Заголовок сообщения:  Re: Парсер/генератор JSON

Да реализации как раз проблемы не создают - это однократный NEW, на который не нужен GC.

А со строками можно работать с помощью интерфейса Files.File над памятью... Не обращайте внимания, это мои заморочки :)

Автор:  Иван Денисов [ Воскресенье, 13 Январь, 2013 20:15 ]
Заголовок сообщения:  Re: Парсер/генератор JSON

Илья Ермаков писал(а):
А со строками можно работать с помощью интерфейса Files.File над памятью...
Пожалуйста, поделитесь опытом, как это делать? Вопрос насущный. Даже для маленьких временных файлов создаваемых через Files.dir.New(), как я понял, идет обращение к диску. А очень бы хотелось, как вы говорите "над памятью". Если это будет оффтоп, то можно в отдельную ветку это вынести. Думаю, не мне одному будет интересно.

Автор:  Евгений Темиргалеев [ Воскресенье, 13 Январь, 2013 20:57 ]
Заголовок сообщения:  Re: Парсер/генератор JSON

Иван Денисов писал(а):
Илья Ермаков писал(а):
А со строками можно работать с помощью интерфейса Files.File над памятью...
Пожалуйста, поделитесь опытом, как это делать? ... Если это будет оффтоп, то можно в отдельную ветку это вынести. Думаю, не мне одному будет интересно.
Кому интересно, предлагаю продолжить в новой теме: viewtopic.php?f=23&t=4214

Автор:  Пётр Кушнир [ Четверг, 17 Январь, 2013 22:48 ]
Заголовок сообщения:  Re: Парсер/генератор JSON

обновил ревизию на битбакете, можно сказать, что стартовый этап завершён, RFC реализована, вроде как.
Парсер какие-то тесты проходит, правда пока везде стоят HALT, поэтому валидацию и распознавание типов ошибок там не ищите.
Как появится подходящая задача, можно будет провести разведку боем, и проверить адекватность решения и архитектуры задачам из Риал Ворлд :)

Автор:  Пётр Кушнир [ Четверг, 31 Январь, 2013 21:50 ]
Заголовок сообщения:  Re: Парсер/генератор JSON

При попытке использования парсера в стороннем компоненте сразу же всплыли интересные баги и особенности. Полезно иногда вот так брать и использовать компоненты. :)

Автор:  Пётр Кушнир [ Понедельник, 27 Май, 2013 14:34 ]
Заголовок сообщения:  Re: Парсер/генератор JSON

Не прошло и полгода, как я запилил документацию. Теперь можно даже выложить компонент в коллекцию oberoncore.ru. Вдруг кому-нибудь понадобится. Правда я забыл регламент публикации. :(

Автор:  Пётр Кушнир [ Воскресенье, 16 Июнь, 2013 22:52 ]
Заголовок сообщения:  Re: YSon - Парсер/генератор JSON

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

Автор:  Иван Кузьмицкий [ Понедельник, 17 Июнь, 2013 08:03 ]
Заголовок сообщения:  Re: YSon - Парсер/генератор JSON

Пётр Кушнир писал(а):
В результате экспериментов с консольной linux-версией ББ имею сообщить всем потенциальным пользователям подсистемы YSon, что подсистема успешно заработала под linux без модификации исходного кода.
Исходники трогать не пришлось, а потребовалась ли перекомпиляция?

Автор:  Пётр Кушнир [ Понедельник, 17 Июнь, 2013 08:33 ]
Заголовок сообщения:  Re: YSon - Парсер/генератор JSON

Бинарная совместимость в наличии.
Но перекомпилировал я по другим причинам.

Страница 1 из 2 Часовой пояс: UTC + 3 часа
Powered by phpBB® Forum Software © phpBB Group
https://www.phpbb.com/