1 / 17

Синтаксический анализ для «встроенных» языков

Синтаксический анализ для «встроенных» языков. Андрей Бреслав Соавторы: A. Annamaa , V. Vene (University of Tartu, Estonia). Немного о предмете. SELECT id, date, title FROM Orders WHERE ( user_id =239) AND (completed= FALSE) ORDER BY date ASC. SQL- Запросы. Наша Программа.

Download Presentation

Синтаксический анализ для «встроенных» языков

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Синтаксический анализ для«встроенных» языков Андрей Бреслав Соавторы: A. Annamaa, V. Vene (University of Tartu, Estonia)

  2. Немного о предмете SELECT id, date, title FROM Orders WHERE (user_id=239) AND (completed=FALSE) ORDERBY date ASC SQL-Запросы Наша Программа База данных Данные

  3. Как работает «Наша программа» SQL-Запросы Наша Программа База данных Данные publicPreparedStatementselectOrders( intuserId, booleancompletedOnly, booleanascOrder){ 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"; returnConnectionProvider.conn.prepareStatement(sql); }

  4. Кто заметил ошибки? SQL-Запросы Наша Программа База данных Данные publicPreparedStatementselectOrders( intuserId, booleancompletedOnly, booleanascOrder){ 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"; returnConnectionProvider.conn.prepareStatement(sql); }

  5. Постановка задачи • Статически обнаруживать синтаксические ошибки в SQL-запросах внутри Java-строк и сообщать о них пользователю, не запуская его программу

  6. Что кроме SQL? URI: git+ssh://foo.bar.com:foo.git String.format(“Foo %s, %d bar!”, s, x);

  7. Общая схема решения

  8. Общая схема решения

  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); Где аппроксимация? Сокращение: AS? := (AS | "") "SELECT˽id"",˽name"? "FROM˽People˽WHERE˽age˽<=˽" age("AND˽age˽>=˽"minAge)?

  10. Время работы

  11. Abstract Parsing Bison LR-Разбор • Управляющие таблицы не меняются(для данного языка) • Измененяемое состояние: • Стек состояний парсера • Позиция считывающей головки • Основная идея абстрактного разбора • Для каждой позицииво входномавтомате • Вычислить множество всех возможных стековсостояний парсера Множествострок (REG) Управляющие таблицы Вход Abstract Parser Сообщения об ошибках Стек состояний Упр. таблицы

  12. Алгоритм a b c e d

  13. Время работы • Sin – множество состояний входного автомата • Sp – множество управляющих состояний парсера • Stacks(SP) – множество стеков состояний парсера • Время работы алгоритма • O(|Sin|*|Stacks(Sp)|) • Регулярная аппроксимация • Ограничим глубину стеков состояний парсера числом D • O(|Sin|*|Stacks(Sp)|)= O(|Sin|*|Sp|D) • = , задача неразрешима!

  14. Поиск контрпримеров • Пользователю нужно показать, какую именно неправильную строку может сформировать его программа • Контрпример – путь в графе стеков, заканчивающийся ошибочным состоянием • Обычно нас интересует самый короткий контрпример • Как решать? a b c e d Контрпримеры: - a(bc)+e - ab(cb)+d

  15. Технические требования • Нужно сообщать об ошибках в процессе написания кода • нужны инкрементальные алгоритмы • Подход должен единообразно поддерживать разные встроенные языки • Хотелось бы просто описывать синтаксис (контекстно-свободной) грамматикой • Не хотелось бысоздавать такие грамматики вручную. Лучше взять готовую, например, из стандарта языка. • Грамматики, приводимые в стандартах, содержат множество неоднозначностей

  16. Что я не рассказал • Abstract GLR-Parsing • Возможность работать с неоднозначными грамматиками • Abstract Lexical Analysis • Входной алфавит парсера на самом деле не Unicode, а алфавит лексем: ключевых слов, идентификаторов, констант... • Как сконвертировать один автомат в другой? • Как проверять отсутствие опечаток в идентификаторах • Автоматические тесты • [Открытый вопрос] Булевские грамматики • Метод можно обобщить так, что для любого автоматного предиката можно • Проверить его истинность на регулярном множестве строк • Найти кратчайший контрпример

  17. Темы дипломных работ • [М] Использование булевских грамматик и Abstract Parsing для обнаружения опечаток в идентификаторах • [М] Мспользование булевских грамматик для реализации автодополнения идентификаторов в SQL-запросах • [Б] Оптимизация регулярной абстракции: ограничивать глубину стека только там и так, где и как это необходимо • [Б] Оптимизация потребления памяти GLR Abstract Parsing – разработка и реализация эффективных структур данных для хранения множества множеств стеков

More Related