XML + XDTO + Gold Parser = код в XML

Пример преобразования кода на языке 1С в XML

Небольшой пример преобразования кода на языке 1С в XML.

Ограничения — не обрабатвает препроцессор, не распознает имена свойств если они совпадают с ключевыми словами, Не выделяет коментарий в отделььный узел.

 

39 Comments

  1. EliasShy

    Ошибка чтения грамматики ‘d:11C-BNF.xml’

    {ВнешняяОбработка.ВнешняяОбработка1.МодульОбъекта(419)}: Значение не является значением объектного типа

    (Переходы)

    СостояниеРазбора = СтруктураГраматики.Переходы.Старт;

    Reply
  2. so-quest

    Спасибо за комментарий.

    Обновления выкладываются здесь https://github.com/wwall/GPTemplate

    Reply
  3. Intervent

    Планируется ли создать пример обратного преобразования?

    Reply
  4. so-quest

    не понял, а зачем такое?

    Reply
  5. Intervent

    Чтобы изменённый код в XML отдать на выполнение:

    1. Код 1С → Код в XML
    2. Обработка кода XML
    3. Код в XML → Код 1С

    Тестовое применение: убедиться в правильности преобразования (изначальный код 1С без обработки должен совпадать с конечным).

    Твоя цель преобразования «код 1С → код в XML»?

    Reply
  6. so-quest

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

    можешь попутно преобразовать его (например привести ключевые слова к каноническому виду)

    или я снова тебя не понял?

    Reply
  7. Intervent

    Согласен, дальше можно сделать всё/что-то/кое-что самостоятельно. Вопрос закрыт.

    Reply
  8. so-quest

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

    Reply
  9. Intervent

    По факту да, но не смертельно, а вот комменты…

    [QUOTE=so-quest]Не выделяет комментарий в отдельный узел.[/IS-QUOTE]Что-то я их вообще в выгрузке не наблюдаю ни в каком узле.

    Reply
  10. so-quest

    Не досмотрел наверное до сюда —

    <Identifier id=»3401″ line=»298″ column=»2″ symbol=»32″><data>Action</data><commentString> Find the Token.СимволРазбора in the LALR table. */</commentString></Identifier>

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

    опять же комменты это скорее здесь нужны http://infostart.ru/public/186086/, меня же интересовал голд парсер и его генерация шаблонов (было нужно для задачи разбора хитрого формата) — попутно что получилось оформил в хмлный преобразователь и выложил здесь, как пример. Никакого рабочего значения без нормальной граматики 1С эта вещь не имеет. Хотя для жругих грамматик — не вопрос — строиться все очень легко и быстро.

    Reply
  11. Intervent

    Действительно, недосмотрел. Посмотрел внимательнее, — комментарии сохраняются выборочно:

    Код 1С

    //Ниже пустой коммент, который не будет сохранён
    //
    Процедура ТестКомментариев()
    //Комментарий1
    //Комментарий2
    Message(«Hello, Gold Parser!»); //Комментарий3
    //Комментарий4
    //Комментарий5
    КонецПроцедуры

    Показать

    Код в XML

    …
    Identifier=Message;commentString=Комментарий2
    …
    endProc=КонецПроцедуры;commentString=Комментарий5
    …

    Т.е. сохраняется только одна непустая предшествующая строка комментариев.

    Reply
  12. so-quest

    ок. спасибо за ошибку — гляну

    Reply
  13. diver.sun

    Ну первый шаг к интелектуальному, а не построчному сравнению кода сделан….:-) Великое ку

    Reply
  14. so-quest

    (11) — Исправил. Если нужно забирай.

    Reply
  15. help1Ckr

    А можно описания для сего чуда, что оно и как? А то если честно ничего не понятно для тупого и жадного 1сника.

    Reply
  16. so-quest

    (15) качни (можешь с гитхаба, там бесплатно), глянь. там одна кнопка и одно поле ввода. В общих чертах — это обработчик для таблиц сгенерированных голдпарсером, с выводом дерева в хмл, одновременным построением xdto пакета по граматике. В общем если слова gold parser, FSM (DFA, NFA), parser, lexer — не очень хорошо знакомы то описание не поможет, а если знакомы — то бессмысленно.

    Reply
  17. Intervent

    (14) Забрал. Ещё последние комменты куда-нибудь бы привязать (чтоб не пропадали):

    Функция Три()
    Возврат 1+1+1;
    КонецФункции
    //TODO: Оптимизировать

    или

    //{{здесь был Вася
    <кучка дюже полезных блоков>
    //ушёл, но обещал вернуться}}

    Может под это дело создать токен «endModule» или «NullString» или сделать исключение и привязать к предыдущей строке с пометкой «basement»?:

    commentString=//НадстрочныйКоммент //(basement)Финальный

    В общем, не суть куда, лишь бы был. 🙂

    Reply
  18. so-quest

    С коментами все же есть сложность — с одной стороны это токен, с другой — это нафиг не нужная инфа для компилятора. В формальной грамматике разрисовать место комментария — достаточно сложно (граматика становиться противоречивой из-за reduce-reduce конфиликтов) Ты объясни для каких задач тебе нужен этот комментарий — может есть решения проще, чем огород с автоматами городить.

    Reply
  19. Intervent

    Задача (озвучивал в (5)): обработанный код вернуть в 1С. Если конвертер будет заодно кромсатором, то могут улететь пометки, временно сплошь закомментированные функции и заготовки. Да и код может быть чужой, составленный по индивидуальным соображениям, нехорошо его обрезать.

    Полагаю, для задач, где комментарии всё же нужны (не компиляторы, не обфускаторы), лучше их выделить таки в токен. А при равноправных конфликтах уступать первому. 🙂

    Reply
  20. Intervent

    При указании директивы компиляции выгружается только чистый скелет (читай — ничего):

    &НаКлиенте
    Функция Пустышка()
    КонецФункции 

    Для управляемых форм не планировалось?

    Reply
  21. so-quest

    AST освобождено от токенов. Не нужны они в дереве. То о чем ты говоришь — это токенизер, и это немного в стороне от моих планов. Если хочешь могу скинуть свой токенизер — пили до совершенства

    Reply
  22. so-quest

    (20) Intervent, не. УФ не поддерживается.

    Reply
  23. Intervent

    (21) Был бы благодарен, в хозяйстве пригодится; вышли, пожалуйста, сюда: АвоськаСобакаПисьмоТочкаРФ

    (22) Жаль, а я было навострил лыжи… (

    Reply
  24. so-quest

    все эти модификаторы — насервере, наклиенте и т.д. — препроцессор с областью действия следующей компилируемой единицы, а препроцессор — не поддерживается. если очень нужно — прикурить — вопрос 5 минут. Добавь нужное определение и собери по новой хмл файл граматики

    Есть другой адрес — яндекс слать отказывается на него

    Reply
  25. Intervent

    Мыльный синоним на латинице: avoskaDOGpismorfDOTcom

    В публикации про одинэсные инструкции препроцессору говорилось? А я до этого момента думал, что про какой-нибудь лексический препроцессор. 🙂 Куда добавить нужные определения я пока не нашёл, проще закомментировать весь неформат.

    Reply
  26. so-quest

    хм… а подскажи — где ты ищешь куда добавить? я вроде grm не выкладывал

    Reply
  27. Intervent

    В макет xmlGrammar в SymbolTable добавил строку:

    <gp:SymbolTable count=»124″>
    …
    <gp:Symbol name = «&AtClient» value = «AtClient» id = «123»  kind = «0» index= «123» description = «&AtClient»/>
    

    Ничего не изменилось, куда ещё можно что-то прописать, — непонятно.

    Reply
  28. so-quest

    ууууу…..

    короче краткая инструкция — ставишь себе Gold parser (качать здесь http://www.goldparser.org/) берешь шаблон хмл отсюда https://github.com/wwall/GPTemplate файл XML.pgt кладешь его ко всем шабллонам голдпарсера (каталог template там где ставил голдпарсер) — берешь граматику оттуда же где и ХМЛ (файл 1C-BNF.grm)

    правишь как тебе надо и перегенерируешь таблицы лексера и парсера (в годпарсере меню project — create sceleton programm выбираешь Text — XML 5.0) получившийся хмл вносишь вместо моего макета граматики xmlGrammar в обработке. все.

    если доделаешь грамматику под комментарии и препроцессор — поделись.

    ЗЫ. а ведь по идее вопрос как править грамматику должен был возникнуть одним из первых

    Reply
  29. Intervent

    Прошёлся по инструкции, — всё ОК: теперь знаю где править, будем на досуге пробовать…

    Reply
  30. so-quest

    вот ты бы это ву виде статьи расписал бы что ли? со скриншотами

    Reply
  31. Intervent

    Так одно дело методом тыка, другое — обзор составлять (объяснить почему тыкать именно так). Не могу ж я учить, в чём сам не разбираюсь. Да и большинству будет интересна практическая сторона вопроса, так что лучше направить усилия в сторону создания инструмента, а не пережёвывания теории.

    Reply
  32. so-quest

    так хоть заскриншоть что делал по тому что я тебе писал — и тебе плюс и ссылку на мою поделку там дашь.

    Это реклама называется.

    А насчет теории — не прав ты. Без нее в компиляции делать нечего.

    Reply
  33. tormozit

    У тебя есть аналог TrimReductions из родного парсера GoldParser?

    Reply
  34. so-quest

    да. в модуле объекта переменную trim выставить в истину

    Reply
  35. tormozit

    Попробовал в макет «xmlGrammar» поместить текст таблиц парсинга

    <?GOLDParserTables version=»1.0″?>
    <Tables>
    <Parameters>
    <Parameter Name=»Case Sensitive» Value=»False»/>
    <Parameter Name=»Start Symbol» Value=»<Packet>»/>
    </Parameters>
    <SymbolTable Count=»267″>
    <Symbol Index=»0″ Name=»EOF» Kind=»3″/>
    <Symbol Index=»1″ Name=»Error» Kind=»7″/>
    …

    Показать

    Получил ошибку

    Ошибка преобразования данных XDTO:

    Чтение объекта типа: {GoldParser}Grammar — [7,17]

    Проверка дополнительного свойства:

    форма: Элемент

    имя: Parameters: Ошибка проверки данных XDTO:

    Структура объекта не соответствует типу: {GoldParser}Grammar
    Reply
  36. so-quest

    Посмотри на объявление схемы, ты пропустил Actions и SymbolKinds

    <?xml version=»1.0″ encoding=»UTF-8″?>

    <gp:Grammar xsi:schemaLocation=»GoldParser sq12.xsd» xmlns:gp=»GoldParser» xmlns:xsi=»http://www.w3.org/2001/XMLSchema-instance»>

    <gp:Actions>

    <gp:Action id=»1″ value=»Shift»/>

    <gp:Action id=»2″ value=»Reduce Rule»/>

    <gp:Action id=»3″ value=»Goto»/>

    <gp:Action id=»4″ value=»Accept»/>

    </gp:Actions>

    <gp:SymbolKinds>

    <gp:Kind id=»0″ value=»Normal Nonterminal» />

    <gp:Kind id=»1″ value=»Normal Terminal» />

    <gp:Kind id=»2″ value=»Whitespace Terminal» />

    <gp:Kind id=»3″ value=»End Character — End of File. This symbol is used to represent the end of the file or the end of the source input.» />

    <gp:Kind id=»4″ value=»Start of a block quote» />

    <gp:Kind id=»5″ value=»End of a block quote» />

    <gp:Kind id=»6″ value=»Line Comment Terminal» />

    <gp:Kind id=»7″ value=»Error Terminal. If the parser encounters an error reading a token, this kind of symbol can used to differentiate it from other terminal types.» />

    </gp:SymbolKinds>

    <gp:Parameters>

    <gp:Parameter name=»About» value=»» />

    <gp:Parameter name=»Author» value=»(Unknown)» />

    <gp:Parameter name=»CaseSensitive» value=»» />

    <gp:Parameter name=»Name» value=»1C:Enterprise 8.0″ />

    <gp:Parameter name=»StartSymbol» value=»» />

    <gp:Parameter name=»Version» value=»(Not Specified)» />

    </gp:Parameters>

    Reply
  37. so-quest

    Глянул сейчас, это не от моего pgt файл. Попробуй мой взять. Должно получиться.

    Reply
  38. tormozit

    (37) Объясни, как мне свою грамматику подключить. С разбега не вышло как видишь.

    Reply
  39. sergey.s.betke@yandex.ru

    Коллеги, добрый день.

    Репозиторий https://github.com/wwall/GPTemplate недоступен, найти нечто подобное на GitHub не получилось. Не подскажете, где искать актуальную редакцию GPTemplate для 1S BSL? Необходимо написать на 1С парсер своей грамматики…

    Reply

Leave a Comment

Ваш адрес email не будет опубликован. Обязательные поля помечены *