Интерактивное прототипирование и отладка грамматики
От: nikov США http://www.linkedin.com/in/nikov
Дата: 08.07.15 18:04
Оценка:
У меня иногда встаёт задача интерактивного прототипирования и отладки некоторой грамматики. У меня есть некоторое представление о том, какие правила должны быть в грамматике (возможно, неполное или где-то ошибочное), и мне хочется написать какие-то тесты, немедленно увидеть получившееся AST или ошибки разбора, что-то изменить в грамматике или тестах, немедленно увидеть, что изменилось в AST и т.д.

Обычно для этой цели я использую язык M и старую бета-версию Intellipad 2009 года, которые были частью ныне почившего майкрософтовского проекта Oslo. В целом, это удовлетворяет моим требованиям, хотя там отсутствуют многие удобства, которые бы мне хотелось иметь: автодополнение(и в редакторе грамматики, и в редакторе разбираемого текста), навигация к декларации правила, поиск мест использования правила, автоматическое переименование, возможность определить правила для цветной подстветки разбираемого кода (хотя бы синие ключевые слова и зеленые комментарии), фолдинг исходного кода и AST. Сообщения об ошибках разбора также оставляют желать лучшего: хотя они сообщают, в каком месте появилась ошибка (и подчёркивают его красным), и там даже есть некоторое автоматическое восстановление после ошибок, они не сообщают, например, какие токены были бы допустимыми в данном месте.

Вот как это выглядит:



Возможно ли (легко ли) реализовать такое приложение на основе Nitra? Можно ли устранить те недостатки, о которых я писал выше?
Re: Интерактивное прототипирование и отладка грамматики
От: WolfHound  
Дата: 08.07.15 19:31
Оценка: 32 (1)
Здравствуйте, nikov, Вы писали:

N>Возможно ли (легко ли) реализовать такое приложение на основе Nitra?

Можно.

N>Можно ли устранить те недостатки, о которых я писал выше?

Можно.

В принципе почти всё есть.
Nitra.Visualizer умеет все, что ты хочешь кроме редактирования и компиляции грамматики.
Мы редактируем грамматику (или чаще саму нитру) в студии и запускаем Nitra.Visualizer.
Nitra.Visualizer запоменает своё состояние между запусками.
Так что цикл очень быстрый.

Но если очень хочется, то не сложно научить Nitra.Visualizer редактировать и компилировать грамматику.
А если ещё немного дописать можно будет сделать подсветку куска грамматики, которым был разобран узел АСТ.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: Интерактивное прототипирование и отладка грамматики
От: nikov США http://www.linkedin.com/in/nikov
Дата: 08.07.15 19:44
Оценка:
Здравствуйте, WolfHound, Вы писали:

N>>Можно ли устранить те недостатки, о которых я писал выше?

WH>Можно.
Каким образом в Nitra можно задавать правила для раскраски кода и фолдинга?

WH>В принципе почти всё есть.

WH>Nitra.Visualizer умеет все, что ты хочешь кроме редактирования и компиляции грамматики.
WH>Но если очень хочется, то не сложно научить Nitra.Visualizer редактировать и компилировать грамматику.
Это основная killer-фича Intellipad, которая меня привлекает. Было бы замечательно, если бы вы её реализовали. Мне совершенно неудобно переключаться между окнами, нажимать что-то для перекомпилирования, и что-то перезапускать или обновлять. Я меняю что-то в грамматике и хочу видеть немедленный результат (задержка меньше секунды).

WH>А если ещё немного дописать можно будет сделать подсветку куска грамматики, которым был разобран узел АСТ.

А подстветка соответствующих друг другу фрагментов исходного кода и узлов AST уже есть?
Re[3]: Интерактивное прототипирование и отладка грамматики
От: WolfHound  
Дата: 08.07.15 20:01
Оценка:
Здравствуйте, nikov, Вы писали:

N>Каким образом в Nitra можно задавать правила для раскраски кода и фолдинга?

https://confluence.jetbrains.com/display/Nitra/SpanClass
https://confluence.jetbrains.com/display/Nitra/Outline
Поищи использование в грамматике C#. Эту часть Влад со Стасом делали.
Я её почти не знаю.

N>Я меняю что-то в грамматике и хочу видеть немедленный результат (задержка меньше секунды).

Вот с этим проблема. Нитра использует в качестве бэкенда немерле.
А компилятор немерла весьма не поворотливый.
Так что даже на небольших грамматиках он тупит 5-10 секунд.
Когда перейдём на другой бэкенд должно стать значительно быстрее.

N>А подстветка соответствующих друг другу фрагментов исходного кода и узлов AST уже есть?

Есть. Работает в обе стороны.
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: Интерактивное прототипирование и отладка грамматики
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.07.15 21:35
Оценка:
Здравствуйте, nikov, Вы писали:

N>У меня иногда встаёт задача интерактивного прототипирования и отладки некоторой грамматики. У меня есть некоторое представление о том, какие правила должны быть в грамматике (возможно, неполное или где-то ошибочное), и мне хочется написать какие-то тесты, немедленно увидеть получившееся AST или ошибки разбора, что-то изменить в грамматике или тестах, немедленно увидеть, что изменилось в AST и т.д.


Как сказал WolfHound все базовые вещи уже есть или находятся в процессе и будут в близайшее время.
У нас есть тестовая утилита Nitra.Visualizer.exe (GUI-ёвая) в которой можно тестировать граматику. Hardcase хотел допилить ее напильником, чтобы она могла работать в режиме linq pad-а (так как ты хочешь), но руки пока не дошли.

Плюс есть одна проблема — скорость компиляции грамматик. Она у нас пока что очень низкая (из-за использования текущей версии Nemerle для генерации кода и его компиляции). Так что интерактивность процесса тестирования может быть очень низкой при больших грамматиках. Но Nitra поддерживает расширения, так что можно менять не саму грамматику, а ее расширение. Это должно существенно ускорить процесс.

N>...хотелось иметь: автодополнение(и в редакторе грамматики, и в редакторе разбираемого текста), навигация к декларации правила, поиск мест использования правила, автоматическое переименование, возможность определить правила для цветной подстветки разбираемого кода (хотя бы синие ключевые слова и зеленые комментарии), фолдинг исходного кода и AST.


Тут расклад следующий. Сейчас мы работаем над подсистемой символов. Свет в конце тунеля уже виден. После ее завершения, в черне, любой язык описанный на Нитре с ее применением получит все описываемые тобой возможности. Ну, а фолдинг, подсветка и комплит литералов уже работают. К сожалению, еще не проделана работа по интеграции всего этого в VS, но уже кое что работает в том же Nitra.Visualizer-е.

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


У нас сообщения уже удовлетворительные. Про токены сообщаем. Иногда, правда, оно излишне фантазирует. Но в общем, довольно информативно.

N>Возможно ли (легко ли) реализовать такое приложение на основе Nitra? Можно ли устранить те недостатки, о которых я писал выше?


Как сказал WolfHound многое уже доступно в Nitra.Visualizer, но менять и компилировать грамматику нужно в Студии. Процесс простой, но не очень шустрый (как я уже говорил).

То что ты хочешь сделать можно. Но у нас в ближайшее время другие планы. Если хочешь — подключайся и помоги нам сделать такую интерактивную утилиту. Я и Стас (hardcase) подскажем тебе, что и как нужно сделать.

Ну, или придется подождать немного.

PS

Из печального. Интерактив (за исключением фолдинга, подсветок и ошибок парсинга) будет работать только для языков описанных с использованием подсистемы символов которую мы сейчас разрабатываем. К сожалению, пока что сама Nitra к таковым не относится. Она написана на более ранней версии, которая не обладала данными возможностями. Мы собираемся переводить Нитру на новую подсистему символов, но произойдет это не раньше чем мы заверишм работу над их поддержкой (над соответствующими DSL-ями). Я оцениваю это время в 1-2 месяца.

Вторая ложка дектя — мы пока что не наладили поддержку символов в студии. Эксперименты ведутся на Nitra.Visualizer, поддержка студии отстает. Опять же пока мы не доделаем систему работы с символами поддержки не будет.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: Интерактивное прототипирование и отладка грамматики
От: VladD2 Российская Империя www.nemerle.org
Дата: 08.07.15 21:56
Оценка:
Здравствуйте, nikov, Вы писали:

N>Каким образом в Nitra можно задавать правила для раскраски кода


Ключевые слова раскрашиваются автоматом, если задать паттернт их обнаружения, например:
span class Keyword = ['a'..'z', '_']['a'..'z', '_']+;

Так же можно вешать так называемые SpanClass-ы (по сути метаинформация развешиваемая на диапазоны текста):
[SpanClass(String)]
token RegularStringLiteral = "\"" RegularStringLiteralPart* "\"";


N> и фолдинга?

Для поддержки фолдинга (оутлянинга) нужно разметить грамматику специальными маркерами (маркерными правилами). Они не влияют на грамматику, но позволяют задать дополнительную метинформацию, которую можно потом использовать в обходчиках. Есть предопределенные маркеры, о которых знает поддержка IDE. С их помощью можно разметить код и получить автоматический отулянинг. Вот пример, описания пространства имен в C#:
syntax NamespaceMemberDeclaration
{
  | Namespace = "namespace" sm NamespaceName outline_begin_before nl "{" inl ExternAliasDirective* UsingDirective* NamespaceMemberDeclaration* d "}" ";"? nl outline_end_before;
  | Type      = TypeDeclaration;
}


Здесь outline_begin_before и outline_end_before — это маркеры оутлайнинга, а sm, nl, inl и d — маркеры претипринта.

outline_begin_before — говорит, что нужно начать оутлянинг перед следующим токеном.
outline_end_before — говорит, что нужно завершить оутлянинг после следующим токена.
sm — говорит, что при претипринте, нужно вставить пробел.
nl — говорит, что при претипринте, нужно вставить конец строки.
inl — говорит, что при претипринте, нужно вставить конец строки и отступ (indent).
d — говорит, что при претипринте, нужно убрать отступ (deindent).

N>Это основная killer-фича Intellipad, которая меня привлекает. Было бы замечательно, если бы вы её реализовали. Мне совершенно неудобно переключаться между окнами, нажимать что-то для перекомпилирования, и что-то перезапускать или обновлять. Я меняю что-то в грамматике и хочу видеть немедленный результат (задержка меньше секунды).


Ну, совсем немедленно не получится, так как режим интепретации мы не поддерживаем в принципе. Грамматику нужно будет все равно перекомпилировать. Можно только встроить в Nitra.Visualizer поддержку автоматической компиляции и перезагрузки грамматики. Но при этом все равно придется ждать. Плюс такое встраивание займет время. Ну, и для поддержки интеллисенса к самой Nitra нужно дождаться когда мы ее перепишем на новых символах. Это где-то 2-3 месяца.

Как я уже говорил выше, присоединяйся и сделай интерактивную компиляцию сам. Мы поможем консультациями.

N>А подстветка соответствующих друг другу фрагментов исходного кода и узлов AST уже есть?


Да. Двустороняя. При навигации по коду можно видеть текущие ветки дерева разбора или АСТ-а, а при даблклике по узлам дерева разбора или по узлам АСТ-а выделяется соответствующие куски разобранного кода. Ну, и естественно, ошибки "вешаются" прямо в код, плсю в списке ошибок выводятся.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Интерактивное прототипирование и отладка грамматики
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.07.15 14:02
Оценка:
Здравствуйте, nikov, Вы писали:

В общем, если соберешься попробовать Nitra-у, стучись ком мне в скайп vc.rsdn.ru, обсудим что и как.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.