SlideShare a Scribd company logo
1 of 30
Download to read offline
Семинар ”Наукоемкое
программное обеспечение“
PSI-2014
24-27 июня, Санкт-Петербург
Инструментальная поддержка встроенных языков в
интегрированных средах разработки
Автор: Григорьев Семён, Вербицкая Екатерина,
Иванов Андрей, Мавчун Екатерина,
Полубелова Марина
Лаборатория JetBrains на Математико-Механическом факультете
Санкт-Петербургского государственного университета
Григорьев Семён (JetBrains) 26 июня 2014г. 1 / 30
Встроенные языки
Динамический SQL
IF @X = @Y
SET @TABLE = ’#table1’
ELSE
SET @TABLE = ’table2’
EXECUTE
(’SELECT x FROM’ + @TABLE + ’ WHERE ISNULL(n,0) > 1’)
JavaScript в Java
String script =
"function hello(name) print(’Hello, ’ + name); ";
engine.eval(script);
Invocable inv = (Invocable) engine;
inv.invokeFunction("hello", "Scripting!!!" );
Григорьев Семён (JetBrains) 26 июня 2014г. 2 / 30
Проблемы
Динамически формируемые выражения – код на некотором языке
и его нужно соответствующим образом поддерживать и
обрабатывать
Ошибки в динамически формируемых выражениях
обнаруживаются лишь во время выполнения
Поддержка в IDE
Реинжиниринг ПО, разработанного с использованием встроенных
языков
Однако для стандартных инструментов это просто строки
Ошибки во время выполнения
Нет поддержки в IDE
Григорьев Семён (JetBrains) 26 июня 2014г. 3 / 30
Актуальность
Да, новый код так почти не пишут. Но:
Многое уже написано и оно требует поддержки, сопровождения
Альтернатив динамическому SQL пока мало
Есть кодогенераторы и они генерируют код в виде текста
Григорьев Семён (JetBrains) 26 июня 2014г. 4 / 30
Предлагаемое решение
Статическая обработка встроенных языков
Поддержка в IDE
Многие ошибки можно искать без запуска программы
Автодополнение, рефакторинги
Реинжиниринг
Статический анализ
Трансформация (трансляция)
Григорьев Семён (JetBrains) 26 июня 2014г. 5 / 30
Существующие решения
Alvor – плагин для Eclipse для статической проверки встроенного
в Java SQL
Java String Analyzer – статический анализатор динамических
выражеинй для Java
PHP String Analyzer – статический анализатор динамических
выражеинй для PHP
PHPStorm – IDE для PHP с поддержкой HTML, CSS, JavaScript
IntelliLang – плагин к PHPStorm и IDEA, осуществляющий
поддержку различных языков
Предоставляемая функциональность часто скудна
Часто поддержка других языков возможна только путём
изменения исходного кода инструмента
Григорьев Семён (JetBrains) 26 июня 2014г. 6 / 30
Цели
Платформа для создания инструментов анализа встроенных
языков
Расширяемость в смысле поддержки других языков
Расширяемость в смысле предоставляемой функциональности
Плагин для MS Visual Studio на основе ReSharper
Демонстрация возможностей платформы
Поддержка встроенных языков в MS Visual Studio
Григорьев Семён (JetBrains) 26 июня 2014г. 7 / 30
Языковые расширения
Поддержка нового языка – создание плагина на основе общей
функциональности
IDE
Ядро SDK
Lang1 Lang3Lang2
Григорьев Семён (JetBrains) 26 июня 2014г. 8 / 30
Языковые расширения
SDK
Генератор абстрактных лексических анализаторов
Генератор абстрактных синтаксических анализаторов
Описание общих интерфейсов
...
Плагинная система на основе Mono.Addins
Механизм разметки кода конечного пользователя
Григорьев Семён (JetBrains) 26 июня 2014г. 9 / 30
Языковые расширения: пример
var tbl1 = “#tbl1”
var tbl2 = “tbl2”
[<InjectedLang("TSQL")>]
execute (“select x from ” + if cond then tbl1 else tbl2)
[<InjectedLang("Calc")>]
eval (“12 + 3 * (4 + 5)”)
Григорьев Семён (JetBrains) 26 июня 2014г. 10 / 30
Как это работает: абстрактный анализ
Kyung-Goo Doh, Hyunha Kim, David A. Schmidt
Комбинация LR-анализа и анализа потока данных для обработки
встроенных языков
Для каждого выражения строится конструкция,
аппроксимирующая множество его возможных значений
Data-flow уравнение
Граф
Регулярное выражение
Выполнение лексического, синтаксического анализа над графом
Григорьев Семён (JetBrains) 26 июня 2014г. 11 / 30
Пример
IF @X = @Y
SET @TABLE = ’#table1’
ELSE
SET @TABLE = ’table2’
EXECUTE
(’SELECT x FROM ’ + @TABLE + ’ WHERE ISNULL(n,0) > 1’)
Множество значений:
{’SELECT x FROM #table1 WHERE ISNULL(n,0) > 1’ ;
’SELECT x FROM table2 WHERE ISNULL(n,0) > 1’}
Аппроксимация:
1 2
"SELECT x FROM "
3
"#table1"
"table2"
4
" WHERE ISNULL(n,0) > 1"
Григорьев Семён (JetBrains) 26 июня 2014г. 12 / 30
Абстрактный лексический анализ
Аппроксикация (граф со строками на рёбрах) → граф с токенами
на рёбрах
Привязка к литералу в исходном коде
Точная привязка внутри литерала
Например:
Входной граф
0 1
"12"
2
"3"
3
"+5"
"*6"
Результат лексического анализа
0 1
NUM: 123
2*
3
+ 4
NUM: 6
NUM: 5
Григорьев Семён (JetBrains) 26 июня 2014г. 13 / 30
Абстрактный лексический анализ: рваные токены
Токены могут собираться из нескольких частей
0 1
"select x from name_"
2
"1"
" 2"
Нужно обрабатывать такие ситуации
Нужно сохранять привязку каждой части
Григорьев Семён (JetBrains) 26 июня 2014г. 14 / 30
Обобщённый синтаксический анализ
Generalized LR parsing (GLR)
Предназначен для работы с произвольными КС грамматиками
Shift-Reduce и Reduce-Reduce конфликты
Использует организованный в виде графа стек (GSS)
1
0
s
4
3
e
2
PLUS
2
PLUS
NUM
NUM
5
NUM
Использует компактное представление леса вывода (SPPF)
Переиспользование общих узлов
Григорьев Семён (JetBrains) 26 июня 2014г. 15 / 30
Абстрактный синтаксический анализ
Добавим Shift-Shift ”конфликты“ – ситуации, возникающие при
ветвлении входного потока
Получилось расширение GLR
Вход:
10 32
1 + 2
3
Результат:
1
+
2 1
+
3
Григорьев Семён (JetBrains) 26 июня 2014г. 16 / 30
Диагностика ошибок
Нужно возвращать лес разбора для корректных выражений и
список ошибок для некорректных
Для обычного GLR умершая ветка — нормально, для
абстрактного не всегда
Пропускать токены в графе сложнее, чем в линейном потоке
0 1
1
2
+
3
2
6
*
4
)
7
3
8
-
/
5
/
4
9
5
Существуют проблемы, связанные с особенностями базового
(GLR) алгоритма
Григорьев Семён (JetBrains) 26 июня 2014г. 17 / 30
Восстановление после ошибок
Отдельный вопрос для исследований
В больших выражениях хочется видеть все ошибки
В сложных выражениях может быть много ложных ошибок
Бывают принципиально некорректные выражения, которые при
реальном выполнении не формируются
Например
x = condition ? “(1+2” : “1+2”;
y = condition ? “)*3” : “*3”;
Program.Eval(x + y);
2 из 4 путей не могут быть получены, но в графе есть все
0 1
(1+2
1+2
2
)*3
*3
Григорьев Семён (JetBrains) 26 июня 2014г. 18 / 30
Вычисление семантики
Результат анализа – минимум одно дерево для пути в графе и
весь лес разбора сжат в SPPF
Что-то можно вычислить прямо на графе, но часто нужно
извлекать деревья
0
1
"1 + "
2
" 2 "" 3 "
n expr
prod 1
n expr t PLUS n expr
prod 2 prod 2 prod 2
t NUM 1 t NUM 2 t NUM 3
Григорьев Семён (JetBrains) 26 июня 2014г. 19 / 30
Вычисление семантики: пример
Подсветка синтаксиса
Достаточно покрыть все токены
Можно возвращать не все деревья, а некоторое подмножество
0 1
NUM 1
NUM 2
2
PLUS
3
NUM 3
NUM 4
n expr
n expr t PLUS n expr
t NUM 1 t NUM 3
n expr
n expr t PLUS n expr
t NUM 2 t NUM 4
Григорьев Семён (JetBrains) 26 июня 2014г. 20 / 30
Вычисление семантики
В худшем случае придётся перебирать все деревья
0 1
...
2
...
...
...
...
3
...
4
...
Ленивая генерация деревьев
Григорьев Семён (JetBrains) 26 июня 2014г. 21 / 30
Демонстрация
Григорьев Семён (JetBrains) 26 июня 2014г. 22 / 30
Что дальше
Большинство задач, применимых к обычному коду, применимо и
ко встроенным языкам:
навигация
проверка типов
трансформации
...
Григорьев Семён (JetBrains) 26 июня 2014г. 23 / 30
Навигация по коду
Визуальное представление динамического выражения в виде
графа
Навигация в код
Навигация в граф из кода
Информация об ошибках на графе: если ошибка на стыке
строковых литералов, то трудно понять, где она реально
Григорьев Семён (JetBrains) 26 июня 2014г. 24 / 30
Проверка типов
Внутри выражения
int x = eval (“12 * ’string’ + 3 ”)
Согласованность с внешним кодом
int x = execute (“select ’string’ from dual”)
Григорьев Семён (JetBrains) 26 июня 2014г. 25 / 30
Трансформации
Рефакторинг
Переход с одного диалекта на другой
Для SQL особенно актуально
Переход на новые технологии
Встроенный SQL → LINQ
Много вопросов
Возможны ли нетривиальные трансформации?
Как обратно генерировать код?
Как гарантировань корректность трансформаций?
Григорьев Семён (JetBrains) 26 июня 2014г. 26 / 30
Результаты
Ядро
Генератор абстрактных лексических анализаторов
Привязка к исходному коду
Генератор абстрактных синтаксических анализаторов
Диагностика ошибок
Механизм вычисления семантики
Модульная архитектура для языковых расширений
Плагин для ReSharper
Расширяемая архитектура, позволяющая легко поддержать любой
встроенный язык
Внешний язык должен поддерживаться в ReSharper
Григорьев Семён (JetBrains) 26 июня 2014г. 27 / 30
Реализация
Открытый код
Платформа .NE.
Основной язык – F#
Проект YaccConstructor – платформа для исследований в области
синтаксического анализа
Григорьев Семён (JetBrains) 26 июня 2014г. 28 / 30
Область применения
Поддержка встроенных языков в IDE
Интерактивная ("на лету")
"Офлайновая" проверка (ручной запуск)
Поддержка, сопровождение кода со встроенными языками
Автоматизированный реинжиниринг ПО, разработанного с
применением встроенных языков
Верификация генераторов кода
Григорьев Семён (JetBrains) 26 июня 2014г. 29 / 30
Информация о проекте
Контакты:
Григорьев Семён: Semen.Grigorev@jetbrains.com
Вербицкая Екатерина: kajigor@gmail.com
Мавчун Екатерина: emavchun@gmail.com
Иванов Андрей: ivanovandrew2004@gmail.com
Полубелова Марина: polubelovam@gmail.com
Исходный код YaccConstructor:
http://recursive-ascent.googlecode.com
Google+ сообщество:
https://plus.google.com/u/0/communities/102842370317111619055
Сообщество GitHub: https://github.com/YaccConstructor
Григорьев Семён (JetBrains) 26 июня 2014г. 30 / 30

More Related Content

Similar to Инструментальная поддержка встроенных языков в IDE.

Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5Technopark
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Яковенко Кирилл
 
TMPA-2015: Lexical analysis of dynamically formed string expressions
TMPA-2015: Lexical analysis of dynamically formed string expressionsTMPA-2015: Lexical analysis of dynamically formed string expressions
TMPA-2015: Lexical analysis of dynamically formed string expressionsIosif Itkin
 
Flame graph: новый взгляд на старое профилирование
Flame graph: новый взгляд на старое профилированиеFlame graph: новый взгляд на старое профилирование
Flame graph: новый взгляд на старое профилированиеКирилл Борисов
 
Основы программирования на C++
Основы программирования на C++Основы программирования на C++
Основы программирования на C++Olga Maksimenkova
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотекPyNSK
 
Predzazhita 2009 v16
Predzazhita 2009 v16Predzazhita 2009 v16
Predzazhita 2009 v16guest1ba51d
 
TMPA-2013 Anureyev: On the Road to Technology of Developing the Means of Dedu...
TMPA-2013 Anureyev: On the Road to Technology of Developing the Means of Dedu...TMPA-2013 Anureyev: On the Road to Technology of Developing the Means of Dedu...
TMPA-2013 Anureyev: On the Road to Technology of Developing the Means of Dedu...Iosif Itkin
 
Tmpa-2014. table-based GLL parsing.
Tmpa-2014. table-based GLL parsing.Tmpa-2014. table-based GLL parsing.
Tmpa-2014. table-based GLL parsing.Semyon Grigorev
 
Программирование разветвляющихся алгоритмов
Программирование разветвляющихся алгоритмовПрограммирование разветвляющихся алгоритмов
Программирование разветвляющихся алгоритмовAndrey Dolinin
 
Алгоритмы и языки программирования
Алгоритмы и языки программированияАлгоритмы и языки программирования
Алгоритмы и языки программированияTheoretical mechanics department
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаAndrey Karpov
 
Введение в Clojure (Margincon 2010)
Введение в Clojure (Margincon 2010)Введение в Clojure (Margincon 2010)
Введение в Clojure (Margincon 2010)Alex Ott
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)Alex Filatov
 
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelЛекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelMikhail Kurnosov
 
О.В.Сухорослов "MapReduce"
О.В.Сухорослов "MapReduce"О.В.Сухорослов "MapReduce"
О.В.Сухорослов "MapReduce"Yandex
 

Similar to Инструментальная поддержка встроенных языков в IDE. (20)

Java осень 2014 занятие 5
Java осень 2014 занятие 5Java осень 2014 занятие 5
Java осень 2014 занятие 5
 
Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3Лекция #5. Введение в язык программирования Python 3
Лекция #5. Введение в язык программирования Python 3
 
TMPA-2015: Lexical analysis of dynamically formed string expressions
TMPA-2015: Lexical analysis of dynamically formed string expressionsTMPA-2015: Lexical analysis of dynamically formed string expressions
TMPA-2015: Lexical analysis of dynamically formed string expressions
 
Flame graph: новый взгляд на старое профилирование
Flame graph: новый взгляд на старое профилированиеFlame graph: новый взгляд на старое профилирование
Flame graph: новый взгляд на старое профилирование
 
Основы программирования на C++
Основы программирования на C++Основы программирования на C++
Основы программирования на C++
 
Мир Python функционалим с помощью библиотек
Мир Python  функционалим с помощью библиотекМир Python  функционалим с помощью библиотек
Мир Python функционалим с помощью библиотек
 
3. Массивы в C#
3. Массивы в C#3. Массивы в C#
3. Массивы в C#
 
Predzazhita 2009 v16
Predzazhita 2009 v16Predzazhita 2009 v16
Predzazhita 2009 v16
 
TMPA-2013 Anureyev: On the Road to Technology of Developing the Means of Dedu...
TMPA-2013 Anureyev: On the Road to Technology of Developing the Means of Dedu...TMPA-2013 Anureyev: On the Road to Technology of Developing the Means of Dedu...
TMPA-2013 Anureyev: On the Road to Technology of Developing the Means of Dedu...
 
Tmpa-2014. table-based GLL parsing.
Tmpa-2014. table-based GLL parsing.Tmpa-2014. table-based GLL parsing.
Tmpa-2014. table-based GLL parsing.
 
Программирование разветвляющихся алгоритмов
Программирование разветвляющихся алгоритмовПрограммирование разветвляющихся алгоритмов
Программирование разветвляющихся алгоритмов
 
Алгоритмы и языки программирования
Алгоритмы и языки программированияАлгоритмы и языки программирования
Алгоритмы и языки программирования
 
Transpile it.pdf
Transpile it.pdfTranspile it.pdf
Transpile it.pdf
 
Всё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программистаВсё о статическом анализе кода для Java программиста
Всё о статическом анализе кода для Java программиста
 
Введение в Clojure (Margincon 2010)
Введение в Clojure (Margincon 2010)Введение в Clojure (Margincon 2010)
Введение в Clojure (Margincon 2010)
 
Использование возможностей параллельных вычислений в синтезе функциональных п...
Использование возможностей параллельных вычислений в синтезе функциональных п...Использование возможностей параллельных вычислений в синтезе функциональных п...
Использование возможностей параллельных вычислений в синтезе функциональных п...
 
Обзор ES2015(ES6)
Обзор ES2015(ES6)Обзор ES2015(ES6)
Обзор ES2015(ES6)
 
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray ChapelЛекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
Лекция 12 (часть 1): Языки программирования семейства PGAS: Cray Chapel
 
8 3-4
8 3-48 3-4
8 3-4
 
О.В.Сухорослов "MapReduce"
О.В.Сухорослов "MapReduce"О.В.Сухорослов "MapReduce"
О.В.Сухорослов "MapReduce"
 

Инструментальная поддержка встроенных языков в IDE.

  • 1. Семинар ”Наукоемкое программное обеспечение“ PSI-2014 24-27 июня, Санкт-Петербург Инструментальная поддержка встроенных языков в интегрированных средах разработки Автор: Григорьев Семён, Вербицкая Екатерина, Иванов Андрей, Мавчун Екатерина, Полубелова Марина Лаборатория JetBrains на Математико-Механическом факультете Санкт-Петербургского государственного университета Григорьев Семён (JetBrains) 26 июня 2014г. 1 / 30
  • 2. Встроенные языки Динамический SQL IF @X = @Y SET @TABLE = ’#table1’ ELSE SET @TABLE = ’table2’ EXECUTE (’SELECT x FROM’ + @TABLE + ’ WHERE ISNULL(n,0) > 1’) JavaScript в Java String script = "function hello(name) print(’Hello, ’ + name); "; engine.eval(script); Invocable inv = (Invocable) engine; inv.invokeFunction("hello", "Scripting!!!" ); Григорьев Семён (JetBrains) 26 июня 2014г. 2 / 30
  • 3. Проблемы Динамически формируемые выражения – код на некотором языке и его нужно соответствующим образом поддерживать и обрабатывать Ошибки в динамически формируемых выражениях обнаруживаются лишь во время выполнения Поддержка в IDE Реинжиниринг ПО, разработанного с использованием встроенных языков Однако для стандартных инструментов это просто строки Ошибки во время выполнения Нет поддержки в IDE Григорьев Семён (JetBrains) 26 июня 2014г. 3 / 30
  • 4. Актуальность Да, новый код так почти не пишут. Но: Многое уже написано и оно требует поддержки, сопровождения Альтернатив динамическому SQL пока мало Есть кодогенераторы и они генерируют код в виде текста Григорьев Семён (JetBrains) 26 июня 2014г. 4 / 30
  • 5. Предлагаемое решение Статическая обработка встроенных языков Поддержка в IDE Многие ошибки можно искать без запуска программы Автодополнение, рефакторинги Реинжиниринг Статический анализ Трансформация (трансляция) Григорьев Семён (JetBrains) 26 июня 2014г. 5 / 30
  • 6. Существующие решения Alvor – плагин для Eclipse для статической проверки встроенного в Java SQL Java String Analyzer – статический анализатор динамических выражеинй для Java PHP String Analyzer – статический анализатор динамических выражеинй для PHP PHPStorm – IDE для PHP с поддержкой HTML, CSS, JavaScript IntelliLang – плагин к PHPStorm и IDEA, осуществляющий поддержку различных языков Предоставляемая функциональность часто скудна Часто поддержка других языков возможна только путём изменения исходного кода инструмента Григорьев Семён (JetBrains) 26 июня 2014г. 6 / 30
  • 7. Цели Платформа для создания инструментов анализа встроенных языков Расширяемость в смысле поддержки других языков Расширяемость в смысле предоставляемой функциональности Плагин для MS Visual Studio на основе ReSharper Демонстрация возможностей платформы Поддержка встроенных языков в MS Visual Studio Григорьев Семён (JetBrains) 26 июня 2014г. 7 / 30
  • 8. Языковые расширения Поддержка нового языка – создание плагина на основе общей функциональности IDE Ядро SDK Lang1 Lang3Lang2 Григорьев Семён (JetBrains) 26 июня 2014г. 8 / 30
  • 9. Языковые расширения SDK Генератор абстрактных лексических анализаторов Генератор абстрактных синтаксических анализаторов Описание общих интерфейсов ... Плагинная система на основе Mono.Addins Механизм разметки кода конечного пользователя Григорьев Семён (JetBrains) 26 июня 2014г. 9 / 30
  • 10. Языковые расширения: пример var tbl1 = “#tbl1” var tbl2 = “tbl2” [<InjectedLang("TSQL")>] execute (“select x from ” + if cond then tbl1 else tbl2) [<InjectedLang("Calc")>] eval (“12 + 3 * (4 + 5)”) Григорьев Семён (JetBrains) 26 июня 2014г. 10 / 30
  • 11. Как это работает: абстрактный анализ Kyung-Goo Doh, Hyunha Kim, David A. Schmidt Комбинация LR-анализа и анализа потока данных для обработки встроенных языков Для каждого выражения строится конструкция, аппроксимирующая множество его возможных значений Data-flow уравнение Граф Регулярное выражение Выполнение лексического, синтаксического анализа над графом Григорьев Семён (JetBrains) 26 июня 2014г. 11 / 30
  • 12. Пример IF @X = @Y SET @TABLE = ’#table1’ ELSE SET @TABLE = ’table2’ EXECUTE (’SELECT x FROM ’ + @TABLE + ’ WHERE ISNULL(n,0) > 1’) Множество значений: {’SELECT x FROM #table1 WHERE ISNULL(n,0) > 1’ ; ’SELECT x FROM table2 WHERE ISNULL(n,0) > 1’} Аппроксимация: 1 2 "SELECT x FROM " 3 "#table1" "table2" 4 " WHERE ISNULL(n,0) > 1" Григорьев Семён (JetBrains) 26 июня 2014г. 12 / 30
  • 13. Абстрактный лексический анализ Аппроксикация (граф со строками на рёбрах) → граф с токенами на рёбрах Привязка к литералу в исходном коде Точная привязка внутри литерала Например: Входной граф 0 1 "12" 2 "3" 3 "+5" "*6" Результат лексического анализа 0 1 NUM: 123 2* 3 + 4 NUM: 6 NUM: 5 Григорьев Семён (JetBrains) 26 июня 2014г. 13 / 30
  • 14. Абстрактный лексический анализ: рваные токены Токены могут собираться из нескольких частей 0 1 "select x from name_" 2 "1" " 2" Нужно обрабатывать такие ситуации Нужно сохранять привязку каждой части Григорьев Семён (JetBrains) 26 июня 2014г. 14 / 30
  • 15. Обобщённый синтаксический анализ Generalized LR parsing (GLR) Предназначен для работы с произвольными КС грамматиками Shift-Reduce и Reduce-Reduce конфликты Использует организованный в виде графа стек (GSS) 1 0 s 4 3 e 2 PLUS 2 PLUS NUM NUM 5 NUM Использует компактное представление леса вывода (SPPF) Переиспользование общих узлов Григорьев Семён (JetBrains) 26 июня 2014г. 15 / 30
  • 16. Абстрактный синтаксический анализ Добавим Shift-Shift ”конфликты“ – ситуации, возникающие при ветвлении входного потока Получилось расширение GLR Вход: 10 32 1 + 2 3 Результат: 1 + 2 1 + 3 Григорьев Семён (JetBrains) 26 июня 2014г. 16 / 30
  • 17. Диагностика ошибок Нужно возвращать лес разбора для корректных выражений и список ошибок для некорректных Для обычного GLR умершая ветка — нормально, для абстрактного не всегда Пропускать токены в графе сложнее, чем в линейном потоке 0 1 1 2 + 3 2 6 * 4 ) 7 3 8 - / 5 / 4 9 5 Существуют проблемы, связанные с особенностями базового (GLR) алгоритма Григорьев Семён (JetBrains) 26 июня 2014г. 17 / 30
  • 18. Восстановление после ошибок Отдельный вопрос для исследований В больших выражениях хочется видеть все ошибки В сложных выражениях может быть много ложных ошибок Бывают принципиально некорректные выражения, которые при реальном выполнении не формируются Например x = condition ? “(1+2” : “1+2”; y = condition ? “)*3” : “*3”; Program.Eval(x + y); 2 из 4 путей не могут быть получены, но в графе есть все 0 1 (1+2 1+2 2 )*3 *3 Григорьев Семён (JetBrains) 26 июня 2014г. 18 / 30
  • 19. Вычисление семантики Результат анализа – минимум одно дерево для пути в графе и весь лес разбора сжат в SPPF Что-то можно вычислить прямо на графе, но часто нужно извлекать деревья 0 1 "1 + " 2 " 2 "" 3 " n expr prod 1 n expr t PLUS n expr prod 2 prod 2 prod 2 t NUM 1 t NUM 2 t NUM 3 Григорьев Семён (JetBrains) 26 июня 2014г. 19 / 30
  • 20. Вычисление семантики: пример Подсветка синтаксиса Достаточно покрыть все токены Можно возвращать не все деревья, а некоторое подмножество 0 1 NUM 1 NUM 2 2 PLUS 3 NUM 3 NUM 4 n expr n expr t PLUS n expr t NUM 1 t NUM 3 n expr n expr t PLUS n expr t NUM 2 t NUM 4 Григорьев Семён (JetBrains) 26 июня 2014г. 20 / 30
  • 21. Вычисление семантики В худшем случае придётся перебирать все деревья 0 1 ... 2 ... ... ... ... 3 ... 4 ... Ленивая генерация деревьев Григорьев Семён (JetBrains) 26 июня 2014г. 21 / 30
  • 23. Что дальше Большинство задач, применимых к обычному коду, применимо и ко встроенным языкам: навигация проверка типов трансформации ... Григорьев Семён (JetBrains) 26 июня 2014г. 23 / 30
  • 24. Навигация по коду Визуальное представление динамического выражения в виде графа Навигация в код Навигация в граф из кода Информация об ошибках на графе: если ошибка на стыке строковых литералов, то трудно понять, где она реально Григорьев Семён (JetBrains) 26 июня 2014г. 24 / 30
  • 25. Проверка типов Внутри выражения int x = eval (“12 * ’string’ + 3 ”) Согласованность с внешним кодом int x = execute (“select ’string’ from dual”) Григорьев Семён (JetBrains) 26 июня 2014г. 25 / 30
  • 26. Трансформации Рефакторинг Переход с одного диалекта на другой Для SQL особенно актуально Переход на новые технологии Встроенный SQL → LINQ Много вопросов Возможны ли нетривиальные трансформации? Как обратно генерировать код? Как гарантировань корректность трансформаций? Григорьев Семён (JetBrains) 26 июня 2014г. 26 / 30
  • 27. Результаты Ядро Генератор абстрактных лексических анализаторов Привязка к исходному коду Генератор абстрактных синтаксических анализаторов Диагностика ошибок Механизм вычисления семантики Модульная архитектура для языковых расширений Плагин для ReSharper Расширяемая архитектура, позволяющая легко поддержать любой встроенный язык Внешний язык должен поддерживаться в ReSharper Григорьев Семён (JetBrains) 26 июня 2014г. 27 / 30
  • 28. Реализация Открытый код Платформа .NE. Основной язык – F# Проект YaccConstructor – платформа для исследований в области синтаксического анализа Григорьев Семён (JetBrains) 26 июня 2014г. 28 / 30
  • 29. Область применения Поддержка встроенных языков в IDE Интерактивная ("на лету") "Офлайновая" проверка (ручной запуск) Поддержка, сопровождение кода со встроенными языками Автоматизированный реинжиниринг ПО, разработанного с применением встроенных языков Верификация генераторов кода Григорьев Семён (JetBrains) 26 июня 2014г. 29 / 30
  • 30. Информация о проекте Контакты: Григорьев Семён: Semen.Grigorev@jetbrains.com Вербицкая Екатерина: kajigor@gmail.com Мавчун Екатерина: emavchun@gmail.com Иванов Андрей: ivanovandrew2004@gmail.com Полубелова Марина: polubelovam@gmail.com Исходный код YaccConstructor: http://recursive-ascent.googlecode.com Google+ сообщество: https://plus.google.com/u/0/communities/102842370317111619055 Сообщество GitHub: https://github.com/YaccConstructor Григорьев Семён (JetBrains) 26 июня 2014г. 30 / 30