Пример преобразования кода на языке 1С в XML
Небольшой пример преобразования кода на языке 1С в XML.
Ограничения — не обрабатвает препроцессор, не распознает имена свойств если они совпадают с ключевыми словами, Не выделяет коментарий в отделььный узел.
Ошибка чтения грамматики ‘d:11C-BNF.xml’
{ВнешняяОбработка.ВнешняяОбработка1.МодульОбъекта(419)}: Значение не является значением объектного типа
(Переходы)
СостояниеРазбора = СтруктураГраматики.Переходы.Старт;
Спасибо за комментарий.
https://github.com/wwall/GPTemplate
Обновления выкладываются здесь
Планируется ли создать пример обратного преобразования?
не понял, а зачем такое?
Чтобы изменённый код в XML отдать на выполнение:
Тестовое применение: убедиться в правильности преобразования (изначальный код 1С без обработки должен совпадать с конечным).
Твоя цель преобразования «код 1С → код в XML»?
так из хмл ты можешь получить тект просто обойдя дерево и выводя его в поток. не вижу сложности
можешь попутно преобразовать его (например привести ключевые слова к каноническому виду)
или я снова тебя не понял?
Согласен, дальше можно сделать всё/что-то/кое-что самостоятельно. Вопрос закрыт.
хотя вот подумав пришел к выводу что по хмл однозначно не востановить текст программы — причина — не сохраняется информация о пробельных символах. то есть не ясно как интерпретировать разрыв между токенами — как пробелы или как табы. В случае если сделать предварительную замену табов на пробелы то код для генерации текста по дереву и его проверки — примитивен и внимания не заслуживает.
По факту да, но не смертельно, а вот комменты…
[QUOTE=so-quest]Не выделяет комментарий в отдельный узел.[/IS-QUOTE]Что-то я их вообще в выгрузке не наблюдаю ни в каком узле.
Не досмотрел наверное до сюда —
<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С эта вещь не имеет. Хотя для жругих грамматик — не вопрос — строиться все очень легко и быстро.
Действительно, недосмотрел. Посмотрел внимательнее, — комментарии сохраняются выборочно:
Код 1С
Показать
Код в XML
Т.е. сохраняется только одна непустая предшествующая строка комментариев.
ок. спасибо за ошибку — гляну
Ну первый шаг к интелектуальному, а не построчному сравнению кода сделан….:-) Великое ку
(11) — Исправил. Если нужно забирай.
А можно описания для сего чуда, что оно и как? А то если честно ничего не понятно для тупого и жадного 1сника.
(15) качни (можешь с гитхаба, там бесплатно), глянь. там одна кнопка и одно поле ввода. В общих чертах — это обработчик для таблиц сгенерированных голдпарсером, с выводом дерева в хмл, одновременным построением xdto пакета по граматике. В общем если слова gold parser, FSM (DFA, NFA), parser, lexer — не очень хорошо знакомы то описание не поможет, а если знакомы — то бессмысленно.
(14) Забрал. Ещё последние комменты куда-нибудь бы привязать (чтоб не пропадали):
или
Может под это дело создать токен «endModule» или «NullString» или сделать исключение и привязать к предыдущей строке с пометкой «basement»?:
commentString=//НадстрочныйКоммент //(basement)Финальный
В общем, не суть куда, лишь бы был. 🙂
С коментами все же есть сложность — с одной стороны это токен, с другой — это нафиг не нужная инфа для компилятора. В формальной грамматике разрисовать место комментария — достаточно сложно (граматика становиться противоречивой из-за reduce-reduce конфиликтов) Ты объясни для каких задач тебе нужен этот комментарий — может есть решения проще, чем огород с автоматами городить.
Задача (озвучивал в (5)): обработанный код вернуть в 1С. Если конвертер будет заодно кромсатором, то могут улететь пометки, временно сплошь закомментированные функции и заготовки. Да и код может быть чужой, составленный по индивидуальным соображениям, нехорошо его обрезать.
Полагаю, для задач, где комментарии всё же нужны (не компиляторы, не обфускаторы), лучше их выделить таки в токен. А при равноправных конфликтах уступать первому. 🙂
При указании директивы компиляции выгружается только чистый скелет (читай — ничего):
Для управляемых форм не планировалось?
AST освобождено от токенов. Не нужны они в дереве. То о чем ты говоришь — это токенизер, и это немного в стороне от моих планов. Если хочешь могу скинуть свой токенизер — пили до совершенства
(20) Intervent, не. УФ не поддерживается.
(21) Был бы благодарен, в хозяйстве пригодится; вышли, пожалуйста, сюда: АвоськаСобакаПисьмоТочкаРФ
(22) Жаль, а я было навострил лыжи… (
все эти модификаторы — насервере, наклиенте и т.д. — препроцессор с областью действия следующей компилируемой единицы, а препроцессор — не поддерживается. если очень нужно — прикурить — вопрос 5 минут. Добавь нужное определение и собери по новой хмл файл граматики
Есть другой адрес — яндекс слать отказывается на него
Мыльный синоним на латинице: avoskaDOGpismorfDOTcom
В публикации про одинэсные инструкции препроцессору говорилось? А я до этого момента думал, что про какой-нибудь лексический препроцессор. 🙂 Куда добавить нужные определения я пока не нашёл, проще закомментировать весь неформат.
хм… а подскажи — где ты ищешь куда добавить? я вроде grm не выкладывал
В макет xmlGrammar в SymbolTable добавил строку:
Ничего не изменилось, куда ещё можно что-то прописать, — непонятно.
ууууу…..
http://www.goldparser.org/) берешь шаблон хмл отсюда https://github.com/wwall/GPTemplate файл XML.pgt кладешь его ко всем шабллонам голдпарсера (каталог template там где ставил голдпарсер) — берешь граматику оттуда же где и ХМЛ (файл 1C-BNF.grm)
короче краткая инструкция — ставишь себе Gold parser (качать здесь
правишь как тебе надо и перегенерируешь таблицы лексера и парсера (в годпарсере меню project — create sceleton programm выбираешь Text — XML 5.0) получившийся хмл вносишь вместо моего макета граматики xmlGrammar в обработке. все.
если доделаешь грамматику под комментарии и препроцессор — поделись.
ЗЫ. а ведь по идее вопрос как править грамматику должен был возникнуть одним из первых
Прошёлся по инструкции, — всё ОК: теперь знаю где править, будем на досуге пробовать…
вот ты бы это ву виде статьи расписал бы что ли? со скриншотами
Так одно дело методом тыка, другое — обзор составлять (объяснить почему тыкать именно так). Не могу ж я учить, в чём сам не разбираюсь. Да и большинству будет интересна практическая сторона вопроса, так что лучше направить усилия в сторону создания инструмента, а не пережёвывания теории.
так хоть заскриншоть что делал по тому что я тебе писал — и тебе плюс и ссылку на мою поделку там дашь.
Это реклама называется.
А насчет теории — не прав ты. Без нее в компиляции делать нечего.
У тебя есть аналог TrimReductions из родного парсера GoldParser?
да. в модуле объекта переменную trim выставить в истину
Попробовал в макет «xmlGrammar» поместить текст таблиц парсинга
Показать
Получил ошибку
Чтение объекта типа: {GoldParser}Grammar — [7,17]
Проверка дополнительного свойства:
форма: Элемент
имя: Parameters: Ошибка проверки данных XDTO:
Структура объекта не соответствует типу: {GoldParser}Grammar
Посмотри на объявление схемы, ты пропустил 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>
Глянул сейчас, это не от моего pgt файл. Попробуй мой взять. Должно получиться.
(37) Объясни, как мне свою грамматику подключить. С разбега не вышло как видишь.
Коллеги, добрый день.
Репозиторийhttps://github.com/wwall/GPTemplate недоступен, найти нечто подобное на GitHub не получилось. Не подскажете, где искать актуальную редакцию GPTemplate для 1S BSL? Необходимо написать на 1С парсер своей грамматики…