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

Презентация:



Advertisements
Похожие презентации
ЛАБОРАТОРНАЯ РАБОТА 1 ПРОЕКТИРОВАНИЕ И РЕАЛИЗАЦИЯ ТАБЛИЦ, ИСПОЛЬЗУЕМЫХ В ТРАНСЛЯТОРЕ Рейн Т. С.
Advertisements

Содержание: 1. Управление данными. а) Извлечение данных команда SELECT; б) Полный список разделов. 2. Раздел SELECT. а) Синтаксис раздела SELECT; б) Ключевые.
Презентация на тему: Ключевое слово TOP n [PERCENT] [WITH TIES]
Троицкий Д.И. Лингвистическое и программное обеспечение САПР 1 Классификация грамматик и языков Лекция 9 Кафедра «Автоматизированные станочные системы»
СУБД Microsoft Access 2003 Элементы языка SQL. Язык SQL SQL (Structured Query Language) – структурированный язык запросов Язык SQL применяется во многих.
Семантический анализ КC-грамматики, с помощью которых описывают синтаксис языков программирования, не позволяют задавать контекстные условия (КУ), имеющиеся.
Челябинск 2006 г. 1 Разработка SQL компилятора для СУБД «ОМЕГА» Докладчик Губин Максим Владимирович Научный руководитель Соколинский Леонид Борисович.
СУБД 5. SQL для выборки данных. 2 SELECT Обработка элементов оператора SELECT выполняется в следующей последовательности: FROM – определяются имена используемых.
«Типы данных». Целочисленные типы данных Тип ДиапазонТребуемая память (байт) byte shortint integer word longint
Базы данных Язык запросов SQL. Команда SELECT. Команда SELECT – выборка данных Общий синтаксис: SELECT [{ ALL | DISTINCT }] { список_вывода | * } FROM.
Выражения унарные (унарный минус) арифметические (+, -, *, /) сравнения (, =, =, , LIKE, BETWEEN...) конкатенации (||) логические (NOT, AND, OR)
Обобщенная архитектура СУБД. Область SQL содержит данные связывания, временные буферы, дерево разбора и план выполнения для каждого оператора SQL, Область.
ЯЗЫКИ ПРОГРАММИРОВАНИЯ С РАСШИРЯЕМЫМ СИНТАКСИСОМ П.В. Егоров Екатеринбург, Июнь 2006.
Тамбовский государственный университет имени Г.Р. Державина Институт математики, физики и информатики Кафедра информатики и информационных технологий Иванова.
1 Основы SQL: MySQL Будем использовать MySQL СУБД с открытым кодом Бесплатная версия (Community Edition) – на В Linux-дистрибутивах.
1 БАЗЫ ДАННЫХ Использование SQL для построения запросов. ЗАНЯТИЕ 6 ПУГАЧЁВ Ю.В. Учитель информатики Харьковская общеобразовательная школа І-ІІІ ступеней.
ПОТОКО-ЧУВСТВИТЕЛЬНЫЙ АНАЛИЗ УКАЗАТЕЛЕЙ ЯЗЫКА С, ОСНОВАННЫЙ НА ДИАГРАММАХ ДВОИЧНЫХ РЕШЕНИЙ Санкт-Петербургский Государственный Университет Математико-Механический.
Функциональное программирование Лекция 11. Содержание Анализ искусственных и естественных языков Метапрограммирование: Quotations 2.
Бланк запроса. Создание списка специальностей Вид при конструирования запросов.
Алгоритм называется частичным алгоритмом, если мы получаем результат только для некоторых d є D и полным алгоритмом, если алгоритм получает правильный.
Транксрипт:

Синтаксический анализ для «встроенных» языков Андрей Бреслав Соавторы: 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= ,title=fooid=11, date= ,title=barid=80, date= ,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 = " + minAge; connection.prepareStatement(sql); "SELECT˽id" ",˽name"? "FROM˽People˽WHERE˽age˽=˽" minAge)? for => a+ + => a b if => a | b Сокращение: AS? := (AS | "")

Время работы Проект Размер LOC # ВыраженийВремя (сек) Память всегоошибокобщееAStringsкэш Plazma Compiere

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

s1s1 s0s0 Алгоритм s2s2 s0s0 s0s0 a b c e d s4s4 s3s3 s5s5 e s3s3 s5s5 s1s1 s0s0 s4s4 s3s3 s3s3

Время работы

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

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

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

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