SlideShare a Scribd company logo
1 of 17
Синтаксический
анализ для
«встроенных» языков
Андрей Бреслав
Соавторы: A. Annamaa, V. Vene
(University of Tartu, Estonia)
Немного о предмете
Наша
Программа База данных
SQL-Запросы
Данные
SELECT id, date, title
FROM Orders
WHERE (user_id=239) AND (completed=FALSE)
ORDER BY date ASC
id=7, date=27.06.2010,title=“foo”
id=11, date=19.09.2010,title=“bar”
id=80, date=04.02.2011,title=“baz”
Как работает «Наша программа»
Наша
Программа База данных
SQL-Запросы
Данные
public PreparedStatement selectOrders(
int userId, boolean completedOnly,
boolean ascOrder) {
String sql = "SELECT id, date, title," +
"FROM Orders" +
"WHERE (user_id=" + userId;
if (completedOnly)
sql += "AND (completed=FALSE)";
sql += "ORDER BY date";
sql += (ascOrder) ? "ASC" : "DESC";
return ConnectionProvider.conn.prepareStatement(sql);
}
Кто заметил ошибки?
public PreparedStatement selectOrders(
int userId, boolean completedOnly,
boolean ascOrder) {
String sql = "SELECT id, date, title," +
"FROM Orders" +
"WHERE (user_id=" + userId;
if (completedOnly)
sql += "AND (completed=FALSE)";
sql += "ORDER BY date";
sql += (ascOrder) ? "ASC" : "DESC";
return ConnectionProvider.conn.prepareStatement(sql);
}
Наша
Программа База данных
SQL-Запросы
Данные
Постановка задачи
•Статически обнаруживать
синтаксические ошибки
в SQL-запросах внутри Java-строк
и сообщать о них пользователю,
не запуская его программу
Что кроме SQL?
URI:
git+ssh://foo.bar.com:foo.git
String.format(“Foo %s, %d bar!”, s, x);
Общая схема решения
• prepareStatement(sql)
• prepareCall(sql)
• executeQuery(sql)
• executeUpdate(sql)
Какие строковые
выражения нужно
проверить?
• Задача алгоритмически неразрешима в
общем случае
• Как представить результат?
• Множества бывают бесконечными
Каковы возможные
значения данного
выражения?
• CF ⊆ CF – неразрешима
• REG⊆ CF – неразрешима
• REG⊆ REG – разрешима
• но SQL – не регулярный
Удовлетворяют ли эти
значения требованиям
синтаксиса встроенного
языка?
Общая схема решения
• prepareStatement(sql)
• prepareCall(sql)
• executeQuery(sql)
• executeUpdate(sql)
Какие строковые
выражения нужно
проверить?
• Аппроксимация:
Построим регулярное множество,
содержащее все возможные значения
выражения
Каковы возможные
значения данного
выражения?
• Аппроксимация:
Найдем регулярный язык, содержащийся
в SQL, и будем проверять включение
вида REG⊆ REG – разрешимая задача
Удовлетворяют ли эти
значения требованиям
синтаксиса встроенного
языка?
Abstract Strings
String sql = "SELECT id";
if (needNames)
sql += ", name";
sql += "FROM People WHERE age <= " + maxAge;
if (minAge >= 0)
sql += "AND age >= " + minAge;
connection.prepareStatement(sql);
"SELECT˽id" ",˽name"? "FROM˽People˽WHERE˽age˽<=˽"
age ("AND˽age˽>=˽" minAge)?
for =>
a+
+ =>
a b
if =>
a | b
Сокращение:
AS? := (AS | "")
Время работы
Проект
Размер
LOC
# Выражений Время (сек)
Память
всего ошибок общее AStrings кэш
Plazma 48’520 94 4 6 3.8 0.4 65
Compiere 319’570 1343 12 138 120 0.5 445
Abstract Parsing
• Управляющие таблицы не меняются
(для данного языка)
• Измененяемое состояние:
• Стек состояний парсера
• Позиция считывающей головки
• Основная идея абстрактного разбора
• Для каждой позиции во входном автомате
• Вычислить множество всех возможных стеков состояний парсера
Множество
строк (REG)
Abstract
Parser
Сообщения
об
ошибках
Bison
Управляющие
таблицы
c
sn
s0
Упр. таблицыСтексостояний
Вход
LR-Разбор
ACTION GOTO
S
A
R
s1
s0
Алгоритм
s2
s0
s0
a b
c
e
d
s4
s3
s5
e
s3
s5
s1
s0
s4
s3
s3
Время работы
•
Поиск контрпримеров
• Пользователю нужно показать, какую именно неправильную
строку может сформировать его программа
• Контрпример – путь в графе стеков, заканчивающийся
ошибочным состоянием
• Обычно нас интересует самый короткий контрпример
• Как решать?
s1
s0
s2
s0
s0
a b
c
e
d
s4
s3
s5
e
s3
s5
s1
s0
s4
s3
s3
Контрпримеры:
- a(bc)+e
- ab(cb)+d
Технические требования
• Нужно сообщать об ошибках в процессе написания кода
• нужны инкрементальные алгоритмы
• Подход должен единообразно поддерживать разные
встроенные языки
• Хотелось бы просто описывать синтаксис (контекстно-
свободной) грамматикой
• Не хотелось бы создавать такие грамматики вручную. Лучше
взять готовую, например, из стандарта языка.
• Грамматики, приводимые в стандартах, содержат множество
неоднозначностей
Что я не рассказал
• Abstract GLR-Parsing
• Возможность работать с неоднозначными грамматиками
• Abstract Lexical Analysis
• Входной алфавит парсера на самом деле не Unicode, а
алфавит лексем: ключевых слов, идентификаторов, констант...
• Как сконвертировать один автомат в другой?
• Как проверять отсутствие опечаток в идентификаторах
• Автоматические тесты
• [Открытый вопрос] Булевские грамматики
• Метод можно обобщить так, что для любого
автоматного предиката можно
• Проверить его истинность на регулярном множестве строк
• Найти кратчайший контрпример
Темы дипломных работ
1. [М] Использование булевских грамматик и Abstract
Parsing для обнаружения опечаток в идентификаторах
2. [М] Мспользование булевских грамматик для
реализации автодополнения идентификаторов в
SQL-запросах
3. [Б] Оптимизация регулярной абстракции: ограничивать
глубину стека только там и так, где и как это необходимо
4. [Б] Оптимизация потребления памяти GLR Abstract
Parsing – разработка и реализация эффективных структур
данных для хранения множества множеств стеков

More Related Content

What's hot

Present saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasovPresent saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasovPavel Vlasov
 
Software Transactional Memory
Software Transactional MemorySoftware Transactional Memory
Software Transactional MemoryVadim Tsesko
 
Бессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоровБессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоровPositive Hack Days
 
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"Yandex
 
Почему Rust стоит вашего внимания
Почему Rust стоит вашего вниманияПочему Rust стоит вашего внимания
Почему Rust стоит вашего вниманияMichael Pankov
 
Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...
Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...
Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...Fuenteovejuna
 
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)Badoo Development
 
Hadoop > cascading -> cascalog (short version)
Hadoop  > cascading -> cascalog (short version)Hadoop  > cascading -> cascalog (short version)
Hadoop > cascading -> cascalog (short version)Andrew Panfilov
 
Romanova techforum bash
Romanova techforum bashRomanova techforum bash
Romanova techforum bashkuchinskaya
 
Js Http Request дмитрий котеров
Js Http Request   дмитрий котеровJs Http Request   дмитрий котеров
Js Http Request дмитрий котеровMedia Gorod
 
лабораторная работа №9
лабораторная работа №9лабораторная работа №9
лабораторная работа №9Zhanna Kazakova
 
Сергей Пузанков — XPath
Сергей Пузанков — XPathСергей Пузанков — XPath
Сергей Пузанков — XPathYandex
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptSmartTools
 
PHP Tricks
PHP TricksPHP Tricks
PHP TricksBlackFan
 
лабораторная работа №8
лабораторная работа №8лабораторная работа №8
лабораторная работа №8Zhanna Kazakova
 

What's hot (19)

Present saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasovPresent saint-per3-by-pavel-vlasov
Present saint-per3-by-pavel-vlasov
 
Python infrastructure from scratch
Python infrastructure from scratchPython infrastructure from scratch
Python infrastructure from scratch
 
Software Transactional Memory
Software Transactional MemorySoftware Transactional Memory
Software Transactional Memory
 
Бессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоровБессигнатурное обнаружение PHP-бэкдоров
Бессигнатурное обнаружение PHP-бэкдоров
 
What's in a metrics? Ruby Russia 2018
What's in a metrics? Ruby Russia 2018What's in a metrics? Ruby Russia 2018
What's in a metrics? Ruby Russia 2018
 
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
Андрей Субботин "Локализация приложений для iOS: как не прострелить себе ногу"
 
Почему Rust стоит вашего внимания
Почему Rust стоит вашего вниманияПочему Rust стоит вашего внимания
Почему Rust стоит вашего внимания
 
Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...
Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...
Сервер-агрегатор на python (аля Xscript FEST), Сумин Андрей, Сабуренков Михаи...
 
file handling in c
file handling in cfile handling in c
file handling in c
 
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)
"Почему язык Lua — это интересно?", Ник Заварицкий, (Mail.ru Group)
 
Hadoop > cascading -> cascalog (short version)
Hadoop  > cascading -> cascalog (short version)Hadoop  > cascading -> cascalog (short version)
Hadoop > cascading -> cascalog (short version)
 
Romanova techforum bash
Romanova techforum bashRomanova techforum bash
Romanova techforum bash
 
Js Http Request дмитрий котеров
Js Http Request   дмитрий котеровJs Http Request   дмитрий котеров
Js Http Request дмитрий котеров
 
file handling in c++
file handling in c++file handling in c++
file handling in c++
 
лабораторная работа №9
лабораторная работа №9лабораторная работа №9
лабораторная работа №9
 
Сергей Пузанков — XPath
Сергей Пузанков — XPathСергей Пузанков — XPath
Сергей Пузанков — XPath
 
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScriptСтажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
Стажировка 2016-07-14 02 Евгений Тарасенко. JavaScript
 
PHP Tricks
PHP TricksPHP Tricks
PHP Tricks
 
лабораторная работа №8
лабораторная работа №8лабораторная работа №8
лабораторная работа №8
 

Similar to 20110227 csseminar alvor_breslav

Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)Ontico
 
Развитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кодаРазвитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кодаPositive Hack Days
 
Современные подходы к SAST
Современные подходы к SASTСовременные подходы к SAST
Современные подходы к SASTVladimir Kochetkov
 
CSS глазами машин
CSS глазами машинCSS глазами машин
CSS глазами машинRoman Dvornov
 
Паттерны проектирования источников данных
Паттерны проектирования источников данныхПаттерны проектирования источников данных
Паттерны проектирования источников данныхAlex Polorotov
 
паттерны проектирования источников данных
паттерны проектирования источников данныхпаттерны проектирования источников данных
паттерны проектирования источников данныхVitaliy Trenkenshu
 
High Load 2009 Dimaa Rus Ready 16 9
High Load 2009 Dimaa Rus Ready 16 9High Load 2009 Dimaa Rus Ready 16 9
High Load 2009 Dimaa Rus Ready 16 9HighLoad2009
 
Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"Andrew Mayorov
 
Подходы к сигнатурному статическому анализу
Подходы к сигнатурному статическому анализуПодходы к сигнатурному статическому анализу
Подходы к сигнатурному статическому анализуPositive Development User Group
 
Универсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHPУниверсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHPИван Кочуркин
 
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Timur Shemsedinov
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке СиPositive Development User Group
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C codeDenis Efremov
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке СиPositive Hack Days
 
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"Tanya Denisyuk
 
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...Ontico
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6Technopark
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesPlatonov Sergey
 

Similar to 20110227 csseminar alvor_breslav (20)

Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
Консервативный Backend на Node.js / Дмитрий Ляпин (Recrumatic)
 
Развитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кодаРазвитие технологий генерации эксплойтов на основе анализа бинарного кода
Развитие технологий генерации эксплойтов на основе анализа бинарного кода
 
Programming c++ (begin-if-else)
Programming c++ (begin-if-else)Programming c++ (begin-if-else)
Programming c++ (begin-if-else)
 
Современные подходы к SAST
Современные подходы к SASTСовременные подходы к SAST
Современные подходы к SAST
 
CSS глазами машин
CSS глазами машинCSS глазами машин
CSS глазами машин
 
Паттерны проектирования источников данных
Паттерны проектирования источников данныхПаттерны проектирования источников данных
Паттерны проектирования источников данных
 
паттерны проектирования источников данных
паттерны проектирования источников данныхпаттерны проектирования источников данных
паттерны проектирования источников данных
 
High Load 2009 Dimaa Rus Ready 16 9
High Load 2009 Dimaa Rus Ready 16 9High Load 2009 Dimaa Rus Ready 16 9
High Load 2009 Dimaa Rus Ready 16 9
 
Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"Alexei Sintsov - "Between error and vulerability - one step"
Alexei Sintsov - "Between error and vulerability - one step"
 
Подходы к сигнатурному статическому анализу
Подходы к сигнатурному статическому анализуПодходы к сигнатурному статическому анализу
Подходы к сигнатурному статическому анализу
 
Универсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHPУниверсальный сигнатурный анализ кода на C#, Java, PHP
Универсальный сигнатурный анализ кода на C#, Java, PHP
 
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
Примеры быстрой разработки API на масштабируемом сервере приложений Impress д...
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Formal verification of C code
Formal verification of C codeFormal verification of C code
Formal verification of C code
 
Формальная верификация кода на языке Си
Формальная верификация кода на языке СиФормальная верификация кода на языке Си
Формальная верификация кода на языке Си
 
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
Андрей Дроздов "Создание высокопроизводительных rest api на tarantool"
 
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...PostgreSQL: практические примеры оптимизации SQL-запросов /  Иван Фролков (Po...
PostgreSQL: практические примеры оптимизации SQL-запросов / Иван Фролков (Po...
 
Web осень 2013 лекция 6
Web осень 2013 лекция 6Web осень 2013 лекция 6
Web осень 2013 лекция 6
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 
Оптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templatesОптимизация трассирования с использованием Expression templates
Оптимизация трассирования с использованием Expression templates
 

20110227 csseminar alvor_breslav

  • 1. Синтаксический анализ для «встроенных» языков Андрей Бреслав Соавторы: A. Annamaa, V. Vene (University of Tartu, Estonia)
  • 2. Немного о предмете Наша Программа База данных SQL-Запросы Данные SELECT id, date, title FROM Orders WHERE (user_id=239) AND (completed=FALSE) ORDER BY date ASC id=7, date=27.06.2010,title=“foo” id=11, date=19.09.2010,title=“bar” id=80, date=04.02.2011,title=“baz”
  • 3. Как работает «Наша программа» Наша Программа База данных SQL-Запросы Данные public PreparedStatement selectOrders( int userId, boolean completedOnly, boolean ascOrder) { String sql = "SELECT id, date, title," + "FROM Orders" + "WHERE (user_id=" + userId; if (completedOnly) sql += "AND (completed=FALSE)"; sql += "ORDER BY date"; sql += (ascOrder) ? "ASC" : "DESC"; return ConnectionProvider.conn.prepareStatement(sql); }
  • 4. Кто заметил ошибки? public PreparedStatement selectOrders( int userId, boolean completedOnly, boolean ascOrder) { String sql = "SELECT id, date, title," + "FROM Orders" + "WHERE (user_id=" + userId; if (completedOnly) sql += "AND (completed=FALSE)"; sql += "ORDER BY date"; sql += (ascOrder) ? "ASC" : "DESC"; return ConnectionProvider.conn.prepareStatement(sql); } Наша Программа База данных SQL-Запросы Данные
  • 5. Постановка задачи •Статически обнаруживать синтаксические ошибки в SQL-запросах внутри Java-строк и сообщать о них пользователю, не запуская его программу
  • 7. Общая схема решения • prepareStatement(sql) • prepareCall(sql) • executeQuery(sql) • executeUpdate(sql) Какие строковые выражения нужно проверить? • Задача алгоритмически неразрешима в общем случае • Как представить результат? • Множества бывают бесконечными Каковы возможные значения данного выражения? • CF ⊆ CF – неразрешима • REG⊆ CF – неразрешима • REG⊆ REG – разрешима • но SQL – не регулярный Удовлетворяют ли эти значения требованиям синтаксиса встроенного языка?
  • 8. Общая схема решения • prepareStatement(sql) • prepareCall(sql) • executeQuery(sql) • executeUpdate(sql) Какие строковые выражения нужно проверить? • Аппроксимация: Построим регулярное множество, содержащее все возможные значения выражения Каковы возможные значения данного выражения? • Аппроксимация: Найдем регулярный язык, содержащийся в SQL, и будем проверять включение вида REG⊆ REG – разрешимая задача Удовлетворяют ли эти значения требованиям синтаксиса встроенного языка?
  • 9. Abstract Strings String sql = "SELECT id"; if (needNames) sql += ", name"; sql += "FROM People WHERE age <= " + maxAge; if (minAge >= 0) sql += "AND age >= " + minAge; connection.prepareStatement(sql); "SELECT˽id" ",˽name"? "FROM˽People˽WHERE˽age˽<=˽" age ("AND˽age˽>=˽" minAge)? for => a+ + => a b if => a | b Сокращение: AS? := (AS | "")
  • 10. Время работы Проект Размер LOC # Выражений Время (сек) Память всего ошибок общее AStrings кэш Plazma 48’520 94 4 6 3.8 0.4 65 Compiere 319’570 1343 12 138 120 0.5 445
  • 11. Abstract Parsing • Управляющие таблицы не меняются (для данного языка) • Измененяемое состояние: • Стек состояний парсера • Позиция считывающей головки • Основная идея абстрактного разбора • Для каждой позиции во входном автомате • Вычислить множество всех возможных стеков состояний парсера Множество строк (REG) Abstract Parser Сообщения об ошибках Bison Управляющие таблицы c sn s0 Упр. таблицыСтексостояний Вход LR-Разбор ACTION GOTO S A R
  • 14. Поиск контрпримеров • Пользователю нужно показать, какую именно неправильную строку может сформировать его программа • Контрпример – путь в графе стеков, заканчивающийся ошибочным состоянием • Обычно нас интересует самый короткий контрпример • Как решать? s1 s0 s2 s0 s0 a b c e d s4 s3 s5 e s3 s5 s1 s0 s4 s3 s3 Контрпримеры: - a(bc)+e - ab(cb)+d
  • 15. Технические требования • Нужно сообщать об ошибках в процессе написания кода • нужны инкрементальные алгоритмы • Подход должен единообразно поддерживать разные встроенные языки • Хотелось бы просто описывать синтаксис (контекстно- свободной) грамматикой • Не хотелось бы создавать такие грамматики вручную. Лучше взять готовую, например, из стандарта языка. • Грамматики, приводимые в стандартах, содержат множество неоднозначностей
  • 16. Что я не рассказал • Abstract GLR-Parsing • Возможность работать с неоднозначными грамматиками • Abstract Lexical Analysis • Входной алфавит парсера на самом деле не Unicode, а алфавит лексем: ключевых слов, идентификаторов, констант... • Как сконвертировать один автомат в другой? • Как проверять отсутствие опечаток в идентификаторах • Автоматические тесты • [Открытый вопрос] Булевские грамматики • Метод можно обобщить так, что для любого автоматного предиката можно • Проверить его истинность на регулярном множестве строк • Найти кратчайший контрпример
  • 17. Темы дипломных работ 1. [М] Использование булевских грамматик и Abstract Parsing для обнаружения опечаток в идентификаторах 2. [М] Мспользование булевских грамматик для реализации автодополнения идентификаторов в SQL-запросах 3. [Б] Оптимизация регулярной абстракции: ограничивать глубину стека только там и так, где и как это необходимо 4. [Б] Оптимизация потребления памяти GLR Abstract Parsing – разработка и реализация эффективных структур данных для хранения множества множеств стеков