SlideShare a Scribd company logo
1 of 20
Download to read offline
Международная научно-практическая
конференция: Инструменты и методы
анализа программ, TMPA-2014
14-15 ноября 2014, г. Кострома, РФ
Обобщённый табличный LL-анализ
Автор: Рагозина Анастасия
Лаборатория JetBrains на Математико-Механическом факультете
Санкт-Петербургского государственного университета
15 ноября 2014г.
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 1 / 20
Введение
Автоматический анализ кода
компиляторы
верификаторы
средства анализа
Для анализа кода необходимо получить его
структурное представление – абстрактное
синтаксическое дерево
Рагозина Анастасия (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 в 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
Абстрактный анализ
Авторы: Kyung-Goo Doh, Hyunha Kim, David A.
Schmidt
Анализ потока данных + 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
Поддержка произвольных КС-грамматик
Проблема: диагностика ошибок
Надежда на обобщённый LL-анализ: хорошее
качество диагностики ошибок
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 6 / 20
Синтаксический анализ
Нисходящий
Структура анализатора имеет тесную связь с
грамматикой, что упрощает понимание
Легко и быстро могут быть написаны вручную
Хорошая диагностика ошибок
К сожалению, обрабатывает узкий класс
обрабатываемых языков
Восходящий
Расширяет класс обрабатываемых языков
Более сложная структура парсера
Сложности с диагностикой ошибок
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 7 / 20
Обобщённый анализ
Generalized LR (GLR)
Впервые предложен Томитой
Существует множество модификаций
Сложная для отладки структура анализатора
Generalized LL (GLL)
Elizabeth Scott, Adrian Johnstone, 2010
Поддержка всех КС-грамматик (левая рекурсия,
скрытая левая рекурсия)
Наследует преимущества нисходящих анализаторов
Рагозина Анастасия (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
Переиспользование узлов
Типы узлов:
Nonterminal symbol nodes
Terminal symbol nodes
Packed nodes
В GLL есть дополнительные:
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)
L – метка
s – вершина стека
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
Возможные ситуации
Перед терминалом: увеличить позицию во
входном потоке, создать терминальный узел
дерева
Перед нетерминалом: создать вершину стека,
записать новый дескриптор
Правило закончилось
извлечь вершину со стека
создать новый дескриптор с использованием метки,
записанной в вершине
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 18 / 20
Табличный анализ
Выбор альтернативы проиходит с использованием
LL-таблиц
Метки заменены на позицию в грамматике и
хранится пара чисел
Были выделены общие ситуации: процесс разбора
осуществляется с помощью пары
взаимнорекурсивных функций
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 19 / 20
Контактная информация
Рагозина Анастасия: ragozina.anastasiya@gmail.com
Григорьев Семён: Semen.Grigorev@jetbrains.com
Исходный код YaccConstructor:
http://recursive-ascent.googlecode.com
Рагозина Анастасия (JetBrains) GLL 15 ноября 2014г. 20 / 20

More Related Content

What's hot

20100321 virtualization igotti_lecture08
20100321 virtualization igotti_lecture0820100321 virtualization igotti_lecture08
20100321 virtualization igotti_lecture08
Computer Science Club
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
m2rus
 
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
Iosif Itkin
 

What's hot (19)

06 - Java. Ввод/вывод, доступ к файловой системе
06 - Java. Ввод/вывод, доступ к файловой системе06 - Java. Ввод/вывод, доступ к файловой системе
06 - Java. Ввод/вывод, доступ к файловой системе
 
Беглый обзор "внутренностей" Python
Беглый обзор "внутренностей" PythonБеглый обзор "внутренностей" Python
Беглый обзор "внутренностей" Python
 
Универсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHPУниверсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHP
 
12 - Java. Разработка сетевых приложений на Java
12 - Java. Разработка сетевых приложений на Java12 - Java. Разработка сетевых приложений на Java
12 - Java. Разработка сетевых приложений на Java
 
20100321 virtualization igotti_lecture08
20100321 virtualization igotti_lecture0820100321 virtualization igotti_lecture08
20100321 virtualization igotti_lecture08
 
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
 
Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1Основы и применение статического анализа кода при разработке лекция 1
Основы и применение статического анализа кода при разработке лекция 1
 
Oop java.generics
Oop java.genericsOop java.generics
Oop java.generics
 
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
TMPA-2013 Petrenko Pakulin: Technical Solutions and Non-Technical Challenges ...
 
Тодуа. Методы разработки интерпретатора языка Рефал-2
Тодуа. Методы разработки интерпретатора языка Рефал-2Тодуа. Методы разработки интерпретатора языка Рефал-2
Тодуа. Методы разработки интерпретатора языка Рефал-2
 
Obj c
Obj cObj c
Obj c
 
02 - Java. Базовый синтаксис Java
02 - Java. Базовый синтаксис Java02 - Java. Базовый синтаксис Java
02 - Java. Базовый синтаксис Java
 
Теория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциямТеория языков программирования некоторые слайды к лекциям
Теория языков программирования некоторые слайды к лекциям
 
10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы10 - Java. Многопоточность в Java: основы
10 - Java. Многопоточность в Java: основы
 
"Внутренности" CPython, часть II
"Внутренности" CPython, часть II"Внутренности" CPython, часть II
"Внутренности" CPython, часть II
 
Ввведение в java
Ввведение в javaВвведение в java
Ввведение в java
 
Иван Кочуркин. Теория и практика парсинга формальных языков
Иван Кочуркин. Теория и практика парсинга формальных языковИван Кочуркин. Теория и практика парсинга формальных языков
Иван Кочуркин. Теория и практика парсинга формальных языков
 
DLR Hosting
DLR HostingDLR Hosting
DLR Hosting
 
Системы контроля версий
Системы контроля версийСистемы контроля версий
Системы контроля версий
 

Similar to Tmpa-2014. table-based GLL parsing.

Инструментальная поддержка встроенных языков в IDE.
Инструментальная поддержка встроенных языков в IDE.Инструментальная поддержка встроенных языков в IDE.
Инструментальная поддержка встроенных языков в IDE.
Semyon Grigorev
 
Распределенные мультикластерные вычислительные системы и параллельное мультип...
Распределенные мультикластерные вычислительные системы и параллельное мультип...Распределенные мультикластерные вычислительные системы и параллельное мультип...
Распределенные мультикластерные вычислительные системы и параллельное мультип...
Mikhail Kurnosov
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013
ScalaNsk
 

Similar to Tmpa-2014. table-based GLL parsing. (7)

Введение в Clojure (Margincon 2010)
Введение в Clojure (Margincon 2010)Введение в Clojure (Margincon 2010)
Введение в Clojure (Margincon 2010)
 
Инструментальная поддержка встроенных языков в IDE.
Инструментальная поддержка встроенных языков в IDE.Инструментальная поддержка встроенных языков в IDE.
Инструментальная поддержка встроенных языков в IDE.
 
Распределенные мультикластерные вычислительные системы и параллельное мультип...
Распределенные мультикластерные вычислительные системы и параллельное мультип...Распределенные мультикластерные вычислительные системы и параллельное мультип...
Распределенные мультикластерные вычислительные системы и параллельное мультип...
 
Язык программирования SocLang (VKLang)
Язык программирования SocLang (VKLang)Язык программирования SocLang (VKLang)
Язык программирования SocLang (VKLang)
 
PostgreSQL. Стильно. Модно. Молодёжно
PostgreSQL. Стильно. Модно. МолодёжноPostgreSQL. Стильно. Модно. Молодёжно
PostgreSQL. Стильно. Модно. Молодёжно
 
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
Руслан Гроховецкий "Как Python стал делать погоду в Яндексе"
 
Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - Scala для профессионалов - Joker 2013Павел Павлов - Scala для профессионалов - Joker 2013
Павел Павлов - 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
  • 2. Введение Автоматический анализ кода компиляторы верификаторы средства анализа Для анализа кода необходимо получить его структурное представление – абстрактное синтаксическое дерево Рагозина Анастасия (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 Анализ потока данных + 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
  • 12. 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
  • 13. SPPF Переиспользование узлов Типы узлов: Nonterminal symbol nodes Terminal symbol nodes Packed nodes В GLL есть дополнительные: 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 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