Upload
semyon-grigorev
View
126
Download
1
Embed Size (px)
Citation preview
Международная научно-практическая
конференция: Инструменты и методы
анализа программ, TMPA-2014
14-15 ноября 2014, г. Кострома, РФ
Обобщённый табличный LL-анализ
Автор: Рагозина Анастасия
Лаборатория JetBrains на Математико-Механическом факультетеСанкт-Петербургского государственного университета
15 ноября 2014г.
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 1 / 20
ВведениеАвтоматический анализ кода
I компиляторыI верификаторыI средства анализа
Для анализа кода необходимо получить егоструктурное представление – абстрактноесинтаксическое дерево
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 2 / 20
Встроенные языкиIF @X = @Y
SET @TABLE = ’#table1’ELSE
SET @TABLE = ’table2’EXECUTE
(’SELECT x FROM’ + @TABLE + ’ WHERE ISNULL(n,0) > 1’)
JavaScript в JavaString script =
"function hello(name) print(’Hello, ’ + name); ";engine.eval(script);Invocable inv = (Invocable) engine;inv.invokeFunction("hello", "Scripting!!!" );
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 3 / 20
Абстрактный анализАвторы: Kyung-Goo Doh, Hyunha Kim, David A.Schmidt
I Анализ потока данных + LR-анализ для обработкисложного (нелинейного) входа
Для каждого выражения строится аппроксимациямножества всех его значений, над которойпроизводится синтаксический анализ
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 4 / 20
Пример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
Абстрактный анализ
Оригинальный подход: LALR-таблицыВ лаборатории JetBrains: обобщённый LR
I Поддержка произвольных КС-грамматикI Проблема: диагностика ошибок
Надежда на обобщённый LL-анализ: хорошеекачество диагностики ошибок
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 6 / 20
Синтаксический анализНисходящий
I Структура анализатора имеет тесную связь сграмматикой, что упрощает понимание
I Легко и быстро могут быть написаны вручнуюI Хорошая диагностика ошибокI К сожалению, обрабатывает узкий класс
обрабатываемых языковВосходящий
I Расширяет класс обрабатываемых языковI Более сложная структура парсераI Сложности с диагностикой ошибок
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 7 / 20
Обобщённый анализGeneralized LR (GLR)
I Впервые предложен ТомитойI Существует множество модификацийI Сложная для отладки структура анализатора
Generalized LL (GLL)I Elizabeth Scott, Adrian Johnstone, 2010I Поддержка всех КС-грамматик (левая рекурсия,
скрытая левая рекурсия)I Наследует преимущества нисходящих анализаторов
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 8 / 20
Принцип работы
При возникновении неоднозначностейрассматриваются все возможные вариантыразбораВетвление стека: для каждого варианта создаётсясвой стекРезультат работы: лес разбора
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 9 / 20
Структуры данных
На каждый вариант разбора свой стек и дерево –дорогоGraph Structured Stack (GSS)Shared Packed Parsing Forest (SPPF)
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 10 / 20
GSS
Позволяет комбинировать стеки в компактнуюструктуруПри возникновении конфликта стек разветвляетсяВсе вершины хранятся в единственномэкземпляре – склейка вариантов разбора
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 11 / 20
GSS: пример
S1, 0
S0, 0
bottom
S1, 1
S2, 1
S1, 0
S0, 0
bottom
S1, 2
S3, 1
S2, 1
S1, 0
S0, 0
bottom
→
S1, 1
S2, 1
S1, 2
S3, 1
S1, 0
S0, 0
bottom
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 12 / 20
SPPF
Переиспользование узловТипы узлов:
I Nonterminal symbol nodesI Terminal symbol nodesI Packed nodes
В GLL есть дополнительные:I Intermidiate nodes
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 13 / 20
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
GLL-анализатор
Анализатор состоит из набора функцийДля каждой альтернативы генерируется отдельнаяфункция, управление между которыми передаётсяс помощью команды goto()Некоторые goto() могут иметь несколько целевыхметок (неоднозначности в грамматике)
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 15 / 20
Дескрипторы, множестваДескриптор – (L, s, i , t)
I L – меткаI s – вершина стекаI i – позиция во входном потокеI t – корень соответствующего поддерева
Очередь дескрипторов RПроблема: количество дескрипторов можетэкспоненцально зависеть от входа, созданиеповторных при левой реккурсии – циклРешение: U – множество уже созданныхдескрипторов
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 16 / 20
Описание
(L, i) – на вершинах стекаЧасти уже построенного дерева хранятся нарёбрах стека(T |N, j , i) – терминальный и нетерминальныйузел дерева(X = x1x2 · x3x4, j , i) – промежуточные ячейки
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 17 / 20
Возможные ситуации
Перед терминалом: увеличить позицию вовходном потоке, создать терминальный узелдереваПеред нетерминалом: создать вершину стека,записать новый дескрипторПравило закончилось
I извлечь вершину со стекаI создать новый дескриптор с использованием метки,
записанной в вершине
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 18 / 20
Табличный анализ
Выбор альтернативы проиходит с использованиемLL-таблицМетки заменены на позицию в грамматике ихранится пара чиселБыли выделены общие ситуации: процесс разбораосуществляется с помощью парывзаимнорекурсивных функций
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 19 / 20
Контактная информация
Рагозина Анастасия: [email protected]Григорьев Семён: [email protected]Исходный код YaccConstructor:http://recursive-ascent.googlecode.com
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 20 / 20