Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

X text

1,638 views

Published on

  • Be the first to comment

  • Be the first to like this

X text

  1. 1. Xtext Framework — как написать IDE за один день
  2. 2. Что такое DSL и зачем он нужен?  Domain Specific Language — язык для описания предметной области  Заточен под конкретную задачу  Предназначен для специалиста в предметной области  Не требует навыков проектирования программ
  3. 3. DSL подразделяются на  Внутренний DSL — является подмножеством базового языка программирования  Внешний DSL — не является подмножеством базового языка  Текстовый  Графический
  4. 4. Общеизвестные DSL  SQL  HTML  Языки программной оболочки(tcl, bash)  Auto Lisp  UML  TeX/LaTeX язык вёрстки документов
  5. 5. Что такое Xtext?  Высокоуровневый фреймворк для создания DSL языков  Позволяет создавать IDE на основе Eclipse platform  Использует для парсинга ANTLR 3  Хранит дерево разбора с помощью Eclipse Modelling Framework
  6. 6. Возможности Xtext  Генератор парсеров  Постпарсинг валидация  Кодогенерация  Форматирование  Поддержка юниттестов  Интеграция с IDE
  7. 7. Интеграция с IDE  Подсветка синтаксиса  Автокомплит  Поддержка форматирования  Поддержка сообщения о ошибках компиляции/предупреждениях  Поддержка построения графических и структурных диаграмм кода
  8. 8. DSL с редактором — пример из жизни  DSL как общая часть портируемых игр  DSL для общения дизайнера и програмиста
  9. 9. Пример языка: CasualIntellect  Поведение агента задаётся с помощью конечного автомата  Состояние агента опрашивается на каждый тик игрового цикла, если выполняется условие производится переход в состояние, если нет – проверка другого условия из списка. Если никакое условие не выполняется
  10. 10. Как работает язык casualintellect? Язык задающий конечный автомат для управления игровым агентом
  11. 11. Как же создать DSL за один день? Создаём проект Определяем грамматику Генерируем Xtext артифакты Имплементируем метод в валидаторе
  12. 12. Создаём Xtext проект
  13. 13. Главный проект Содержит  Файл грамматики и сопутствующие файлы  Пакеты для  Форматирования  Проверки скоупа  Валидации
  14. 14. Проект UI {Lang name}UiModule — регистрация компонент используемых с IDE {lang name}ProposalProvider- переопределение автокомплита для всех правил грамматики {lang_name}OutlineTreeProvider — используется для управления view outline
  15. 15. Определяем грамматику, полезные детали  Список лексем Model:states+=State+;  Список с запятой, или его отсутствие Transitions: 'transitions' ':' '{' list+=Transition? (Comma list+=Transition)* '}';  Ключевое слово returns: Or returns Expression – Сгенерированный интерфейс OR будет унаследован от Expression
  16. 16. Определяем грамматику, полезные детали  Список лексем Model:states+=State+;  Список с запятой, или его отсутствие Transitions: 'transitions' ':' '{' list+=Transition? (Comma list+=Transition)* '}';  Ключевое слово returns: Or returns Expression – Сгенерированный интерфейс OR будет унаследован от Expression
  17. 17. Определяем грамматику, полезные детали  Фигурные скобки в теле выражения. Entity: 'entity' {Entity} name = ID ('extends' superType=[Entity])? '{' attributes += Attribute* '}' ; создаём сущность до полной инициализации.
  18. 18. Удаление левой рекурсии  Грамматика называется леворекурсивной, если она содержит продукцию с вызовом самой себя без продвижения по строке Expression : Expression '+' Expression | '(' Expression ')' | INT;  ANTLR использует LL(*) алгоритм, леворекурсивные грамматики он не парсит.
  19. 19. Удаление левой рекурсии  Грамматику можно менять с помощью переписывания  Expression : TerminalExpression ('+' TerminalExpression)?; TerminalExpression :'(' Expression ')' |INT;
  20. 20. Удаление левой рекурсии Но такое преобразование приведёт к созданию лишних элементов AST. «(42)» будет разобрано как Operation { left=Operation { left=IntLiteral { value=42 } } }
  21. 21. Удаление левой рекурсии Чтобы избежать избыточности AST произведём переписывание дерева Expression : TerminalExpression ({Operation.left=current} op='+' right=Expression)?; TerminalExpression returns Expression: '(' Expression ')' | {IntLiteral} value=INT;
  22. 22. Удаление левой рекурсии  Пытаемся разбирать выражение с помощью правила TerminalExpression  Ищем опциональный + с последующим другим выражением • Если опциональная часть не найдена, выражение совпадает с разобранным элементом • Иначе, создаём обьект «плюс» где левая часть разобрана перед этим и правая часть разбирается после +
  23. 23. Язык Xtend входной для Xtext  Выпущен Eclipse Fundation http://www.eclipse.org/xtend/  Используется в Xtext начиная с версии 2.4  Транслируется в Java  Меньше шума – больше сахара
  24. 24. Язык Xtend входной для Xtext Пример кода class HelloWorld { def static void main(String[] args){ println("Hello World") } }
  25. 25. Язык Xtend входной для Xtext Сгенерированный код import org.eclipse.xtext.xbase.lib.InputOutput; @SuppressWarnings("all") public class HelloWorld { public static void main(final String[] args) { InputOutput.<String>println("Hello World"); } }
  26. 26. Язык Xtend, добавим сахару  Extension methods  Lambda Expressions  Switch with expressions  Patterns  Additional operators
  27. 27. Пишем код - кодогенерация  Интерфейс Igenerator public void doGenerate(Resource input, IFileSystemAccess fsa);  Проходит по узлам AST генерирует код
  28. 28. Пишем код - валидация  Используется для постсинтаксического(семантического анализа текста)  Класс наследуемый от AbstractDeclarativeValidator  Для проверки используются методы аннотированные @Check  Пример валидации:проверка инициализации переменной до её использования
  29. 29. Пишем код - форматирование текста  Класс наследуется от AbstractDeclarativeFormatter  Вставляем переход на новую строку, увеличение/уменьшение отступа до и после структуры данных
  30. 30. Пишем код - изменение outline  Класс наследуется от DefaultEObjectLabelProvider  Содержится в ui проекте  Переопределяем метод text — изменяем метку  Переопределяем метод image — изменяем картинку
  31. 31. Тестирование  Xtext предоставляет полную поддержку TDD  Интегрирован с Junit 4(@Test, @Before, TestSuite)  Аннотации для запуска тестов XtextRunner(Запуск Junit4) IinjectorProvider(Создаём Google Guice инжектор)
  32. 32. Тестирование парсера  @Inject extension ParseHelper<Model> парсит текст в модель  @Inject extension ValidationTestHelper валидация модели
  33. 33. Тестирование кодогенерации  CompilationTestHelper компилирует модель, генерит код
  34. 34. Вопросы?

×