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

Más contenido relacionado

La actualidad más candente

10кл общие сведения о языке программирования паскаль
10кл общие сведения о языке программирования паскаль10кл общие сведения о языке программирования паскаль
10кл общие сведения о языке программирования паскальAnna_Malina
 
Общие сведения о языке программирования Паскаль
Общие сведения о языке программирования ПаскальОбщие сведения о языке программирования Паскаль
Общие сведения о языке программирования ПаскальAndrey Dolinin
 
О SOLID-ности
О SOLID-ностиО SOLID-ности
О SOLID-ностиCEE-SEC(R)
 
Способы записи алгоритмов
Способы записи алгоритмовСпособы записи алгоритмов
Способы записи алгоритмовAndrey Dolinin
 
Конструирование алгоритмов
Конструирование алгоритмовКонструирование алгоритмов
Конструирование алгоритмовAndrey Dolinin
 
F# - функциональный язык «новой» волны
F# - функциональный  язык «новой» волныF# - функциональный  язык «новой» волны
F# - функциональный язык «новой» волныKiev ALT.NET
 
Cреда программирования
Cреда программированияCреда программирования
Cреда программированияirina8682
 
Ayan9r1 po(1)
Ayan9r1 po(1)Ayan9r1 po(1)
Ayan9r1 po(1)Ayan_R
 
Типы данных
Типы данныхТипы данных
Типы данныхOlgaDask
 
Основы программирования на ruby
Основы программирования на rubyОсновы программирования на ruby
Основы программирования на rubyEvgeny Smirnov
 
Запись вспомогательный алгоритмов на языка Паскаль
Запись вспомогательный алгоритмов на языка ПаскальЗапись вспомогательный алгоритмов на языка Паскаль
Запись вспомогательный алгоритмов на языка ПаскальAndrey Dolinin
 
F# функциональный язык "новой" волны
F# функциональный язык "новой" волныF# функциональный язык "новой" волны
F# функциональный язык "новой" волныArtem Prysyazhnuk
 
язык програмирования
язык програмированияязык програмирования
язык програмированияOlegmingalev1997
 
практика 4
практика 4практика 4
практика 4student_kai
 
Введение в теорию автоматов и вычислений. 1.12 дорожная карта 2 - ДКА
Введение в теорию автоматов и вычислений. 1.12 дорожная карта 2 - ДКАВведение в теорию автоматов и вычислений. 1.12 дорожная карта 2 - ДКА
Введение в теорию автоматов и вычислений. 1.12 дорожная карта 2 - ДКАIgor Kleiner
 

La actualidad más candente (20)

10кл общие сведения о языке программирования паскаль
10кл общие сведения о языке программирования паскаль10кл общие сведения о языке программирования паскаль
10кл общие сведения о языке программирования паскаль
 
java 8
java 8java 8
java 8
 
Общие сведения о языке программирования Паскаль
Общие сведения о языке программирования ПаскальОбщие сведения о языке программирования Паскаль
Общие сведения о языке программирования Паскаль
 
О SOLID-ности
О SOLID-ностиО SOLID-ности
О SOLID-ности
 
Способы записи алгоритмов
Способы записи алгоритмовСпособы записи алгоритмов
Способы записи алгоритмов
 
Конструирование алгоритмов
Конструирование алгоритмовКонструирование алгоритмов
Конструирование алгоритмов
 
F# - функциональный язык «новой» волны
F# - функциональный  язык «новой» волныF# - функциональный  язык «новой» волны
F# - функциональный язык «новой» волны
 
Scala lecture #4
Scala lecture #4Scala lecture #4
Scala lecture #4
 
Cреда программирования
Cреда программированияCреда программирования
Cреда программирования
 
Ayan9r1 po(1)
Ayan9r1 po(1)Ayan9r1 po(1)
Ayan9r1 po(1)
 
Типы данных
Типы данныхТипы данных
Типы данных
 
функции
функциифункции
функции
 
Основы программирования на ruby
Основы программирования на rubyОсновы программирования на ruby
Основы программирования на ruby
 
Запись вспомогательный алгоритмов на языка Паскаль
Запись вспомогательный алгоритмов на языка ПаскальЗапись вспомогательный алгоритмов на языка Паскаль
Запись вспомогательный алгоритмов на языка Паскаль
 
F# функциональный язык "новой" волны
F# функциональный язык "новой" волныF# функциональный язык "новой" волны
F# функциональный язык "новой" волны
 
язык програмирования
язык програмированияязык програмирования
язык програмирования
 
Урок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графовУрок 8. Введение в редукцию графов
Урок 8. Введение в редукцию графов
 
Тодуа. Методы разработки интерпретатора языка Рефал-2
Тодуа. Методы разработки интерпретатора языка Рефал-2Тодуа. Методы разработки интерпретатора языка Рефал-2
Тодуа. Методы разработки интерпретатора языка Рефал-2
 
практика 4
практика 4практика 4
практика 4
 
Введение в теорию автоматов и вычислений. 1.12 дорожная карта 2 - ДКА
Введение в теорию автоматов и вычислений. 1.12 дорожная карта 2 - ДКАВведение в теорию автоматов и вычислений. 1.12 дорожная карта 2 - ДКА
Введение в теорию автоматов и вычислений. 1.12 дорожная карта 2 - ДКА
 

Destacado

BIG DATA: From mammoth to elephant
BIG DATA: From mammoth to elephantBIG DATA: From mammoth to elephant
BIG DATA: From mammoth to elephantRoman Nikitchenko
 
Web application I have always dreamt of
Web application I have always dreamt ofWeb application I have always dreamt of
Web application I have always dreamt ofVictor_Cr
 
JEE Conf 2015: Less JS!
JEE Conf 2015: Less JS!JEE Conf 2015: Less JS!
JEE Conf 2015: Less JS!_Dewy_
 
Generics Past, Present and Future
Generics Past, Present and FutureGenerics Past, Present and Future
Generics Past, Present and FutureRichardWarburton
 
Statis code analysis
Statis code analysisStatis code analysis
Statis code analysischashnikov
 
Spring Boot. Boot up your development. JEEConf 2015
Spring Boot. Boot up your development. JEEConf 2015Spring Boot. Boot up your development. JEEConf 2015
Spring Boot. Boot up your development. JEEConf 2015Strannik_2013
 
Spring cloud for microservices architecture
Spring cloud for microservices architectureSpring cloud for microservices architecture
Spring cloud for microservices architectureIgor Khotin
 
Do we need JMS in 21st century?
Do we need JMS in 21st century?Do we need JMS in 21st century?
Do we need JMS in 21st century?Mikalai Alimenkou
 

Destacado (11)

BIG DATA: From mammoth to elephant
BIG DATA: From mammoth to elephantBIG DATA: From mammoth to elephant
BIG DATA: From mammoth to elephant
 
Web application I have always dreamt of
Web application I have always dreamt ofWeb application I have always dreamt of
Web application I have always dreamt of
 
JEE Conf 2015: Less JS!
JEE Conf 2015: Less JS!JEE Conf 2015: Less JS!
JEE Conf 2015: Less JS!
 
Jee conf
Jee confJee conf
Jee conf
 
Generics Past, Present and Future
Generics Past, Present and FutureGenerics Past, Present and Future
Generics Past, Present and Future
 
Spring data jee conf
Spring data jee confSpring data jee conf
Spring data jee conf
 
Statis code analysis
Statis code analysisStatis code analysis
Statis code analysis
 
Spring Boot. Boot up your development. JEEConf 2015
Spring Boot. Boot up your development. JEEConf 2015Spring Boot. Boot up your development. JEEConf 2015
Spring Boot. Boot up your development. JEEConf 2015
 
Scala Rock-Painting
Scala Rock-PaintingScala Rock-Painting
Scala Rock-Painting
 
Spring cloud for microservices architecture
Spring cloud for microservices architectureSpring cloud for microservices architecture
Spring cloud for microservices architecture
 
Do we need JMS in 21st century?
Do we need JMS in 21st century?Do we need JMS in 21st century?
Do we need JMS in 21st century?
 

Similar a X text

Развитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кодаРазвитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кодаPositive Hack Days
 
Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Dmitri Soshnikov
 
Custom Language Plugin for JetBrains IDEA
Custom Language Plugin for JetBrains IDEACustom Language Plugin for JetBrains IDEA
Custom Language Plugin for JetBrains IDEAAlexander Zastashkov
 
"Модифицируй это!" или "Больше магии Python с помощью изменения AST"
"Модифицируй это!" или "Больше магии Python с помощью изменения AST""Модифицируй это!" или "Больше магии Python с помощью изменения AST"
"Модифицируй это!" или "Больше магии Python с помощью изменения AST"PyNSK
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9Technopark
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Alex Ott
 
039
039039
039JIuc
 
Erlang мгновенное просветление
Erlang  мгновенное просветлениеErlang  мгновенное просветление
Erlang мгновенное просветлениеMaxim Sokhatsky
 
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)ScalaNsk
 
лекции спрг 6_семестр (1)
лекции спрг 6_семестр (1)лекции спрг 6_семестр (1)
лекции спрг 6_семестр (1)djbelyakk
 
презентация лекции №10
презентация лекции №10презентация лекции №10
презентация лекции №10student_kai
 
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 27bits
 
Шаблоны C++ и базы данных. Сергей Федоров. CoreHard Spring 2019
Шаблоны C++ и базы данных. Сергей Федоров. CoreHard Spring 2019Шаблоны C++ и базы данных. Сергей Федоров. CoreHard Spring 2019
Шаблоны C++ и базы данных. Сергей Федоров. CoreHard Spring 2019corehard_by
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программированияguestfc8ae0
 

Similar a X text (20)

Transpile it.pdf
Transpile it.pdfTranspile it.pdf
Transpile it.pdf
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Rgsu04
Rgsu04Rgsu04
Rgsu04
 
Развитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кодаРазвитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кода
 
Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...Функциональное программирование для разработки распределённых, облачных и веб...
Функциональное программирование для разработки распределённых, облачных и веб...
 
Custom Language Plugin for JetBrains IDEA
Custom Language Plugin for JetBrains IDEACustom Language Plugin for JetBrains IDEA
Custom Language Plugin for JetBrains IDEA
 
"Модифицируй это!" или "Больше магии Python с помощью изменения AST"
"Модифицируй это!" или "Больше магии Python с помощью изменения AST""Модифицируй это!" или "Больше магии Python с помощью изменения AST"
"Модифицируй это!" или "Больше магии Python с помощью изменения AST"
 
C++ осень 2012 лекция 9
C++ осень 2012 лекция 9C++ осень 2012 лекция 9
C++ осень 2012 лекция 9
 
Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)Clojure: Lisp for the modern world (русская версия)
Clojure: Lisp for the modern world (русская версия)
 
039
039039
039
 
Erlang мгновенное просветление
Erlang  мгновенное просветлениеErlang  мгновенное просветление
Erlang мгновенное просветление
 
Xslt
XsltXslt
Xslt
 
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
Павел Павлов - Scala для Java программистов (JavaDay Nsk 28.11.2013)
 
Обзор Ruby
Обзор RubyОбзор Ruby
Обзор Ruby
 
лекции спрг 6_семестр (1)
лекции спрг 6_семестр (1)лекции спрг 6_семестр (1)
лекции спрг 6_семестр (1)
 
презентация лекции №10
презентация лекции №10презентация лекции №10
презентация лекции №10
 
Подпрограммы
ПодпрограммыПодпрограммы
Подпрограммы
 
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
Спецкурс "Современные практики разработки ПО", 2013-2014 уч. год, занятие 2
 
Шаблоны C++ и базы данных. Сергей Федоров. CoreHard Spring 2019
Шаблоны C++ и базы данных. Сергей Федоров. CoreHard Spring 2019Шаблоны C++ и базы данных. Сергей Федоров. CoreHard Spring 2019
Шаблоны C++ и базы данных. Сергей Федоров. CoreHard Spring 2019
 
паттерны программирования
паттерны программированияпаттерны программирования
паттерны программирования
 

Más de Владимир Кожаев

Más de Владимир Кожаев (10)

JetBrains MPS
JetBrains MPSJetBrains MPS
JetBrains MPS
 
ANTLR4 in depth
ANTLR4 in depthANTLR4 in depth
ANTLR4 in depth
 
Scrum
ScrumScrum
Scrum
 
что такое Git и как с ним бороться
что такое Git и как с ним боротьсячто такое Git и как с ним бороться
что такое Git и как с ним бороться
 
игровая логика, проблемы и решения
игровая логика, проблемы и решенияигровая логика, проблемы и решения
игровая логика, проблемы и решения
 
флеш и сервер
флеш и серверфлеш и сервер
флеш и сервер
 
ньюансы разработки видео для мобильных устройств
ньюансы разработки видео для мобильных устройствньюансы разработки видео для мобильных устройств
ньюансы разработки видео для мобильных устройств
 
ньюансы разработки видео для мобильных устройств
ньюансы разработки видео для мобильных устройствньюансы разработки видео для мобильных устройств
ньюансы разработки видео для мобильных устройств
 
Vladimir kozhayev isometry handmade
Vladimir kozhayev   isometry handmadeVladimir kozhayev   isometry handmade
Vladimir kozhayev isometry handmade
 
Vladimir kozhayev isometry handmade
Vladimir kozhayev   isometry handmadeVladimir kozhayev   isometry handmade
Vladimir kozhayev isometry handmade
 

X text

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