Синтаксический анализ для
This presentation is the property of its rightful owner.
Sponsored Links
1 / 17

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


  • 105 Views
  • Uploaded on
  • Presentation posted in: General

Синтаксический анализ для «встроенных» языков. Андрей Бреслав Соавторы: 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.While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server.


- - - - - - - - - - - - - - - - - - - - - - - - - - E N D - - - - - - - - - - - - - - - - - - - - - - - - - -

Presentation Transcript


6928850

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

Андрей Бреслав

Соавторы: A. Annamaa, V. Vene

(University of Tartu, Estonia)


6928850

Немного о предмете

SELECT id, date, title

FROM Orders

WHERE (user_id=239) AND (completed=FALSE)

ORDERBY date ASC

SQL-Запросы

Наша

Программа

База данных

Данные


6928850

Как работает «Наша программа»

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);

}


6928850

Кто заметил ошибки?

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);

}


6928850

Постановка задачи

  • Статически обнаруживать

    синтаксические ошибки

    в SQL-запросах внутри Java-строк

    и сообщать о них пользователю,

    не запуская его программу


6928850

Что кроме SQL?

URI:

git+ssh://foo.bar.com:foo.git

String.format(“Foo %s, %d bar!”, s, x);


6928850

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


6928850

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


Abstract strings

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)?


6928850

Время работы


Abstract parsing

Abstract Parsing

Bison

LR-Разбор

  • Управляющие таблицы не меняются(для данного языка)

  • Измененяемое состояние:

    • Стек состояний парсера

    • Позиция считывающей головки

  • Основная идея абстрактного разбора

    • Для каждой позицииво входномавтомате

      • Вычислить множество всех возможных стековсостояний парсера

Множествострок (REG)

Управляющие

таблицы

Вход

Abstract

Parser

Сообщения

об

ошибках

Стек состояний

Упр. таблицы


6928850

Алгоритм

a

b

c

e

d


6928850

Время работы

  • Sin – множество состояний входного автомата

  • Sp – множество управляющих состояний парсера

  • Stacks(SP) – множество стеков состояний парсера

  • Время работы алгоритма

    • O(|Sin|*|Stacks(Sp)|)

  • Регулярная аппроксимация

    • Ограничим глубину стеков состояний парсера числом D

    • O(|Sin|*|Stacks(Sp)|)= O(|Sin|*|Sp|D)

  • = , задача неразрешима!


6928850

Поиск контрпримеров

  • Пользователю нужно показать, какую именно неправильную строку может сформировать его программа

    • Контрпример – путь в графе стеков, заканчивающийся ошибочным состоянием

    • Обычно нас интересует самый короткий контрпример

  • Как решать?

a

b

c

e

d

Контрпримеры:

- a(bc)+e

- ab(cb)+d


6928850

Технические требования

  • Нужно сообщать об ошибках в процессе написания кода

    • нужны инкрементальные алгоритмы

  • Подход должен единообразно поддерживать разные встроенные языки

    • Хотелось бы просто описывать синтаксис (контекстно-свободной) грамматикой

    • Не хотелось бысоздавать такие грамматики вручную. Лучше взять готовую, например, из стандарта языка.

    • Грамматики, приводимые в стандартах, содержат множество неоднозначностей


6928850

Что я не рассказал

  • Abstract GLR-Parsing

    • Возможность работать с неоднозначными грамматиками

  • Abstract Lexical Analysis

    • Входной алфавит парсера на самом деле не Unicode, а алфавит лексем: ключевых слов, идентификаторов, констант...

      • Как сконвертировать один автомат в другой?

  • Как проверять отсутствие опечаток в идентификаторах

    • Автоматические тесты

    • [Открытый вопрос] Булевские грамматики

  • Метод можно обобщить так, что для любого автоматного предиката можно

    • Проверить его истинность на регулярном множестве строк

    • Найти кратчайший контрпример


6928850

Темы дипломных работ

  • [М] Использование булевских грамматик и Abstract Parsing для обнаружения опечаток в идентификаторах

  • [М] Мспользование булевских грамматик для реализации автодополнения идентификаторов в SQL-запросах

  • [Б] Оптимизация регулярной абстракции: ограничивать глубину стека только там и так, где и как это необходимо

  • [Б] Оптимизация потребления памяти GLR Abstract Parsing – разработка и реализация эффективных структур данных для хранения множества множеств стеков


  • Login