gifts2017

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

Опубликовал Валентин Бомбин (so-quest) в раздел Программирование - Практика программирования

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

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

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

 

Скачать файлы

Наименование Файл Версия Размер
Пример 50
.epf 61,43Kb
22.05.13
50
.epf 61,43Kb Скачать

См. также

Подписаться Добавить вознаграждение

Комментарии

1. Василий Борисов (EliasShy) 20.05.13 13:47
Ошибка чтения грамматики 'd:\1\1C-BNF.xml'

{ВнешняяОбработка.ВнешняяОбработка1.МодульОбъекта(419)}: Значение не является значением объектного типа
(Переходы)
СостояниеРазбора = СтруктураГраматики.Переходы.Старт;
2. Валентин Бомбин (so-quest) 20.05.13 15:00
Спасибо за комментарий.
Обновления выкладываются здесь https://github.com/wwall/GPTemplate
3. Сергей Гуняков (Intervent) 21.05.13 16:44
Планируется ли создать пример обратного преобразования?
4. Валентин Бомбин (so-quest) 21.05.13 17:09
5. Сергей Гуняков (Intervent) 21.05.13 18:22
Чтобы изменённый код в XML отдать на выполнение:
  1. Код 1С → Код в XML
  2. Обработка кода XML
  3. Код в XML → Код 1С
Тестовое применение: убедиться в правильности преобразования (изначальный код 1С без обработки должен совпадать с конечным).

Твоя цель преобразования "код 1С → код в XML"?
6. Валентин Бомбин (so-quest) 21.05.13 18:46
так из хмл ты можешь получить тект просто обойдя дерево и выводя его в поток. не вижу сложности
можешь попутно преобразовать его (например привести ключевые слова к каноническому виду)

или я снова тебя не понял?
7. Сергей Гуняков (Intervent) 21.05.13 19:38
Согласен, дальше можно сделать всё/что-то/кое-что самостоятельно. Вопрос закрыт.
8. Валентин Бомбин (so-quest) 21.05.13 21:56
хотя вот подумав пришел к выводу что по хмл однозначно не востановить текст программы - причина - не сохраняется информация о пробельных символах. то есть не ясно как интерпретировать разрыв между токенами - как пробелы или как табы. В случае если сделать предварительную замену табов на пробелы то код для генерации текста по дереву и его проверки - примитивен и внимания не заслуживает.
9. Сергей Гуняков (Intervent) 21.05.13 23:08
По факту да, но не смертельно, а вот комменты...
[QUOTE=so-quest]Не выделяет комментарий в отдельный узел.[/IS-QUOTE]Что-то я их вообще в выгрузке не наблюдаю ни в каком узле.
10. Валентин Бомбин (so-quest) 21.05.13 23:59
Не досмотрел наверное до сюда -
<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С эта вещь не имеет. Хотя для жругих грамматик - не вопрос - строиться все очень легко и быстро.
11. Сергей Гуняков (Intervent) 22.05.13 07:07
Действительно, недосмотрел. Посмотрел внимательнее, - комментарии сохраняются выборочно:
Код 1С
//Ниже пустой коммент, который не будет сохранён
//
Процедура ТестКомментариев()
//Комментарий1
//Комментарий2
Message("Hello, Gold Parser!"); //Комментарий3
//Комментарий4
//Комментарий5
КонецПроцедуры
...Показать Скрыть
Код в XML
...
Identifier=Message;commentString=Комментарий2
...	
endProc=КонецПроцедуры;commentString=Комментарий5
...
...Показать Скрыть

Т.е. сохраняется только одна непустая предшествующая строка комментариев.
12. Валентин Бомбин (so-quest) 22.05.13 10:21
ок. спасибо за ошибку - гляну
13. diver.sun diver.sun (diver.sun) 22.05.13 10:29
Ну первый шаг к интелектуальному, а не построчному сравнению кода сделан....:-) Великое ку
14. Валентин Бомбин (so-quest) 22.05.13 11:13
(11) - Исправил. Если нужно забирай.
15. Саша Безымяный (help1Ckr) 22.05.13 11:23
А можно описания для сего чуда, что оно и как? А то если честно ничего не понятно для тупого и жадного 1сника.
16. Валентин Бомбин (so-quest) 22.05.13 11:33
(15) качни (можешь с гитхаба, там бесплатно), глянь. там одна кнопка и одно поле ввода. В общих чертах - это обработчик для таблиц сгенерированных голдпарсером, с выводом дерева в хмл, одновременным построением xdto пакета по граматике. В общем если слова gold parser, FSM (DFA, NFA), parser, lexer - не очень хорошо знакомы то описание не поможет, а если знакомы - то бессмысленно.
17. Сергей Гуняков (Intervent) 22.05.13 12:04
(14) Забрал. Ещё последние комменты куда-нибудь бы привязать (чтоб не пропадали):
Функция Три()
	Возврат 1+1+1;	
КонецФункции 
//TODO: Оптимизировать

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

Может под это дело создать токен "endModule" или "NullString" или сделать исключение и привязать к предыдущей строке с пометкой "basement"?:
commentString=//НадстрочныйКоммент //(basement)Финальный

В общем, не суть куда, лишь бы был. :)
18. Валентин Бомбин (so-quest) 22.05.13 12:15
С коментами все же есть сложность - с одной стороны это токен, с другой - это нафиг не нужная инфа для компилятора. В формальной грамматике разрисовать место комментария - достаточно сложно (граматика становиться противоречивой из-за reduce-reduce конфиликтов) Ты объясни для каких задач тебе нужен этот комментарий - может есть решения проще, чем огород с автоматами городить.
19. Сергей Гуняков (Intervent) 22.05.13 13:05
Задача (озвучивал в (5)): обработанный код вернуть в 1С. Если конвертер будет заодно кромсатором, то могут улететь пометки, временно сплошь закомментированные функции и заготовки. Да и код может быть чужой, составленный по индивидуальным соображениям, нехорошо его обрезать.

Полагаю, для задач, где комментарии всё же нужны (не компиляторы, не обфускаторы), лучше их выделить таки в токен. А при равноправных конфликтах уступать первому. :)
20. Сергей Гуняков (Intervent) 22.05.13 13:30
При указании директивы компиляции выгружается только чистый скелет (читай - ничего):
&НаКлиенте
Функция Пустышка()
КонецФункции 
Для управляемых форм не планировалось?
21. Валентин Бомбин (so-quest) 22.05.13 13:35
AST освобождено от токенов. Не нужны они в дереве. То о чем ты говоришь - это токенизер, и это немного в стороне от моих планов. Если хочешь могу скинуть свой токенизер - пили до совершенства
22. Валентин Бомбин (so-quest) 22.05.13 13:39
(20) Intervent, не. УФ не поддерживается.
23. Сергей Гуняков (Intervent) 22.05.13 14:09
(21) Был бы благодарен, в хозяйстве пригодится; вышли, пожалуйста, сюда: АвоськаСобакаПисьмоТочкаРФ
(22) Жаль, а я было навострил лыжи... (
24. Валентин Бомбин (so-quest) 22.05.13 16:24
все эти модификаторы - насервере, наклиенте и т.д. - препроцессор с областью действия следующей компилируемой единицы, а препроцессор - не поддерживается. если очень нужно - прикурить - вопрос 5 минут. Добавь нужное определение и собери по новой хмл файл граматики

Есть другой адрес - яндекс слать отказывается на него
25. Сергей Гуняков (Intervent) 22.05.13 17:06
Мыльный синоним на латинице: avoskaDOGpismorfDOTcom

В публикации про одинэсные инструкции препроцессору говорилось? А я до этого момента думал, что про какой-нибудь лексический препроцессор. :) Куда добавить нужные определения я пока не нашёл, проще закомментировать весь неформат.
26. Валентин Бомбин (so-quest) 22.05.13 17:08
хм... а подскажи - где ты ищешь куда добавить? я вроде grm не выкладывал
27. Сергей Гуняков (Intervent) 22.05.13 17:39
В макет xmlGrammar в SymbolTable добавил строку:
<gp:SymbolTable count="124">
...
<gp:Symbol name = "&AtClient" value = "AtClient" id = "123"  kind = "0" index= "123" description = "&AtClient"/>
...Показать Скрыть

Ничего не изменилось, куда ещё можно что-то прописать, - непонятно.
28. Валентин Бомбин (so-quest) 22.05.13 17:51
ууууу.....
короче краткая инструкция - ставишь себе 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 в обработке. все.

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

ЗЫ. а ведь по идее вопрос как править грамматику должен был возникнуть одним из первых
29. Сергей Гуняков (Intervent) 22.05.13 19:00
Прошёлся по инструкции, - всё ОК: теперь знаю где править, будем на досуге пробовать...
30. Валентин Бомбин (so-quest) 22.05.13 20:21
вот ты бы это ву виде статьи расписал бы что ли? со скриншотами
31. Сергей Гуняков (Intervent) 22.05.13 22:28
Так одно дело методом тыка, другое - обзор составлять (объяснить почему тыкать именно так). Не могу ж я учить, в чём сам не разбираюсь. Да и большинству будет интересна практическая сторона вопроса, так что лучше направить усилия в сторону создания инструмента, а не пережёвывания теории.
32. Валентин Бомбин (so-quest) 22.05.13 22:49
так хоть заскриншоть что делал по тому что я тебе писал - и тебе плюс и ссылку на мою поделку там дашь.
Это реклама называется.

А насчет теории - не прав ты. Без нее в компиляции делать нечего.
33. Сергей Старых (tormozit) 08.07.13 00:20
У тебя есть аналог TrimReductions из родного парсера GoldParser?
34. Валентин Бомбин (so-quest) 08.07.13 09:07
да. в модуле объекта переменную trim выставить в истину
35. Сергей Старых (tormozit) 09.02.14 00:07
Попробовал в макет "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
36. Валентин Бомбин (so-quest) 09.02.14 11:04
Посмотри на объявление схемы, ты пропустил 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>

37. Валентин Бомбин (so-quest) 09.02.14 12:20
Глянул сейчас, это не от моего pgt файл. Попробуй мой взять. Должно получиться.
38. Сергей Старых (tormozit) 10.02.14 20:51
(37) Объясни, как мне свою грамматику подключить. С разбега не вышло как видишь.
Для написания сообщения необходимо авторизоваться
Прикрепить файл
Дополнительные параметры ответа