Generalized LL parsing algorithm and it's modification for migration from full code generation to GLL table generation are described. Also we explain correspondence between GLL, GLR and static analysis of string embedded languages.
Павел Павлов - Scala для профессионалов - Joker 2013
Tmpa-2014. table-based GLL parsing.
1. Международная научно-практическая
конференция: Инструменты и методы
анализа программ, TMPA-2014
14-15 ноября 2014, г. Кострома, РФ
Обобщённый табличный LL-анализ
Автор: Рагозина Анастасия
Лаборатория JetBrains на Математико-Механическом факультете
Санкт-Петербургского государственного университета
15 ноября 2014г.
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 1 / 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
Анализ потока данных + 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’}
Аппроксимация:
1 2
"SELECT x FROM "
3
"#table1"
"table2"
4
" WHERE ISNULL(n,0) > 1"
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 5 / 20
6. Абстрактный анализ
Оригинальный подход: LALR-таблицы
В лаборатории JetBrains: обобщённый LR
Поддержка произвольных КС-грамматик
Проблема: диагностика ошибок
Надежда на обобщённый LL-анализ: хорошее
качество диагностики ошибок
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 6 / 20
7. Синтаксический анализ
Нисходящий
Структура анализатора имеет тесную связь с
грамматикой, что упрощает понимание
Легко и быстро могут быть написаны вручную
Хорошая диагностика ошибок
К сожалению, обрабатывает узкий класс
обрабатываемых языков
Восходящий
Расширяет класс обрабатываемых языков
Более сложная структура парсера
Сложности с диагностикой ошибок
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 7 / 20
8. Обобщённый анализ
Generalized LR (GLR)
Впервые предложен Томитой
Существует множество модификаций
Сложная для отладки структура анализатора
Generalized LL (GLL)
Elizabeth Scott, Adrian Johnstone, 2010
Поддержка всех КС-грамматик (левая рекурсия,
скрытая левая рекурсия)
Наследует преимущества нисходящих анализаторов
Рагозина Анастасия (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
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 0prod 0
n s
n sn 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)
L – метка
s – вершина стека
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. Возможные ситуации
Перед терминалом: увеличить позицию во
входном потоке, создать терминальный узел
дерева
Перед нетерминалом: создать вершину стека,
записать новый дескриптор
Правило закончилось
извлечь вершину со стека
создать новый дескриптор с использованием метки,
записанной в вершине
Рагозина Анастасия (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