BDD. The Outer Limits. Iosif Itkin at Youcon (in Russian)
Generalized Tabular LL-Analysis
1. Международная научно-практическая
конференция: Инструменты и методы
анализа программ, TMPA-2014
14-15 ноября 2014, г. Кострома, РФ
Обобщённый табличный LL-анализ
Автор: Рагозина Анастасия
Лаборатория JetBrains на Математико-Механическом факультете
Санкт-Петербургского государственного университета
15 ноября 2014г.
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 1 / 20
2. Введение
Автоматический анализ кода
I компиляторы
I верификаторы
I средства анализа
Для анализа кода необходимо получить его
структурное представление – абстрактное
синтаксическое дерево
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 2 / 20
3. Встроенные языки
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) GLL 15 ноября 2014г. 3 / 20
4. Абстрактный анализ
Авторы: Kyung-Goo Doh, Hyunha Kim, David A.
Schmidt
I Анализ потока данных + LR-анализ для обработки
сложного (нелинейного) входа
Для каждого выражения строится аппроксимация
множества всех его значений, над которой
производится синтаксический анализ
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 4 / 20
5. Пример
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’}
Аппроксимация:
"SELECT x FROM "
1 2
3
"#table1"
"table2"
4
" WHERE ISNULL(n,0) > 1"
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 5 / 20
6. Абстрактный анализ
Оригинальный подход: LALR-таблицы
В лаборатории JetBrains: обобщённый LR
I Поддержка произвольных КС-грамматик
I Проблема: диагностика ошибок
Надежда на обобщённый LL-анализ: хорошее
качество диагностики ошибок
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 6 / 20
7. Синтаксический анализ
Нисходящий
I Структура анализатора имеет тесную связь с
грамматикой, что упрощает понимание
I Легко и быстро могут быть написаны вручную
I Хорошая диагностика ошибок
I К сожалению, обрабатывает узкий класс
обрабатываемых языков
Восходящий
I Расширяет класс обрабатываемых языков
I Более сложная структура парсера
I Сложности с диагностикой ошибок
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 7 / 20
8. Обобщённый анализ
Generalized LR
I Впервые предложен Томитой
I Существует множество модификаций
I Сложная для отладки структура анализатора
Generalized LL
I Elizabeth Scott, Adrian Johnstone, 2010
I Поддержка всех КС-грамматик (левая рекурсия,
скрытая левая рекурсия)
I Наследует преимущества нисходящих анализаторов
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 8 / 20
9. Принцип работы
При возникновении неоднозначностей
рассматриваются все возможные варианты
разбора
Ветвление стека: для каждого варианта создаётся
свой стек
Результат работы: лес разбора
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 9 / 20
10. Структуры данных
На каждый вариант разбора свой стек и дерево –
дорого
Graph Structured Stack (GSS)
Shared Packed Parsing Forest (SPPF)
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 10 / 20
11. GSS
Позволяет комбинировать стеки в компактную
структуру
При возникновении конфликта стек разветвляется
Все вершины хранятся в единственном
экземпляре – склейка вариантов разбора
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 11 / 20
13. SPPF
Переиспользование узлов
Типы узлов:
I Nonterminal symbol nodes
I Terminal symbol nodes
I Packed nodes
В GLL есть дополнительные:
I Intermidiate nodes
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 13 / 20
14. SPPF: пример
Грамматика:
strat → s;
s → ss|B
Вход:
B B B
prod 2
n s
prod 0
n s n s
prod 0 prod 1
n s n s
prod 1 prod 1
t B t B
t B
prod 2
n s
prod 0
n s n s
prod 1
t B
prod 0
n s n s
prod 1 prod 1
t B t B
→
prod 2
n s
prod 0 prod 0
n s
n s n s
n s
prod 0
prod 1 prod 1
t B
n s
prod 1
prod 0
t B t B
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 14 / 20
15. GLL-анализатор
Анализатор состоит из набора функций
Для каждой альтернативы генерируется отдельная
функция, управление между которыми передаётся
с помощью команды goto()
Некоторые goto() могут иметь несколько целевых
меток (неоднозначности в грамматике)
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 15 / 20
16. Дескрипторы, множества
Дескриптор – (L, s, i, t)
I L – метка
I s – вершина стека
I i – позиция во входном потоке
I t – корень соответствующего поддерева
Очередь дескрипторов R
Проблема: количество дескрипторов может
экспоненцально зависеть от входа, создание
повторных при левой реккурсии – цикл
Решение: U – множество уже созданных
дескрипторов
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 16 / 20
17. Описание
(L, i) – на вершинах стека
Части уже построенного дерева хранятся на
рёбрах стека
(T|N, j, i) – терминальный и нетерминальный
узел дерева
(X = x1x2 · x3x4, j, i) – промежуточные ячейки
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 17 / 20
18. Возможные ситуации
Перед терминалом: увеличить позицию во
входном потоке, создать терминальный узел
дерева
Перед нетерминалом: создать вершину стека,
записать новый дескриптор
Правило закончилось
I извлечь вершину со стека
I создать новый дескриптор с использованием метки,
записанной в вершине
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 18 / 20
19. Табличный анализ
Выбор альтернативы проиходит с использованием
LL-таблиц
Метки заменены на позицию в грамматике и
хранится пара чисел
Были выделены общие ситуации: процесс разбора
осуществляется с помощью пары
взаимнорекурсивных функций
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 19 / 20
20. Контактная информация
Рагозина Анастасия: ragozina.anastasiya@gmail.com
Григорьев Семён: Semen.Grigorev@jetbrains.com
Исходный код YaccConstructor:
http://recursive-ascent.googlecode.com
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 20 / 20