computer science семинар, весна 2011: Синтаксический анализ для...

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

Upload: cs-center

Post on 20-Jan-2017

144 views

Category:

Documents


4 download

TRANSCRIPT

Page 1: Computer Science семинар, весна 2011: Синтаксический анализ для "встроенных" языков (Андрей Бреслав, кафедра

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

Page 2: Computer Science семинар, весна 2011: Синтаксический анализ для "встроенных" языков (Андрей Бреслав, кафедра

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

НашаПрограмма Базаданных

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”

Page 3: Computer Science семинар, весна 2011: Синтаксический анализ для "встроенных" языков (Андрей Бреслав, кафедра

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

НашаПрограмма Базаданных

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

Page 4: Computer Science семинар, весна 2011: Синтаксический анализ для "встроенных" языков (Андрей Бреслав, кафедра

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

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-Запросы

Данные

Page 5: Computer Science семинар, весна 2011: Синтаксический анализ для "встроенных" языков (Андрей Бреслав, кафедра

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

•Статически обнаруживатьсинтаксическиеошибкивSQL-запросахвнутриJava-строк

исообщатьонихпользователю,незапуская егопрограмму

Page 6: Computer Science семинар, весна 2011: Синтаксический анализ для "встроенных" языков (Андрей Бреслав, кафедра

ЧтокромеSQL?

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

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

Page 7: Computer Science семинар, весна 2011: Синтаксический анализ для "встроенных" языков (Андрей Бреслав, кафедра

Общаясхемарешения• prepareStatement(sql)• prepareCall(sql)• executeQuery(sql)• executeUpdate(sql)

Какиестроковыевыражениянужно

проверить?

• Задачаалгоритмическинеразрешимавобщемслучае

• Какпредставитьрезультат?• Множествабываютбесконечными

Каковывозможныезначенияданного

выражения?

• CF⊆ CF– неразрешима• REG⊆ CF – неразрешима• REG⊆ REG – разрешима

• ноSQL– нерегулярный

Удовлетворяютлиэтизначениятребованиямсинтаксисавстроенного

языка?

Page 8: Computer Science семинар, весна 2011: Синтаксический анализ для "встроенных" языков (Андрей Бреслав, кафедра

Общаясхемарешения• prepareStatement(sql)• prepareCall(sql)• executeQuery(sql)• executeUpdate(sql)

Какиестроковыевыражениянужно

проверить?

• Аппроксимация:Построимрегулярноемножество,содержащеевсевозможныезначениявыражения

Каковывозможныезначенияданного

выражения?

• Аппроксимация:Найдемрегулярныйязык,содержащийсявSQL,ибудемпроверятьвключениевидаREG⊆ REG – разрешимаязадача

Удовлетворяютлиэтизначениятребованиямсинтаксисавстроенного

языка?

Page 9: Computer Science семинар, весна 2011: Синтаксический анализ для "встроенных" языков (Андрей Бреслав, кафедра

AbstractStringsString 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+

+=>ab

if=>a|b

Сокращение:AS? := (AS | "")

Page 10: Computer Science семинар, весна 2011: Синтаксический анализ для "встроенных" языков (Андрей Бреслав, кафедра

Времяработы

Проект РазмерLOC

# Выражений Время (сек)Память

всего ошибок общее AStrings кэш

Plazma 48’520 94 4 6 3.8 0.4 65

Compiere 319’570 1343 12 138 120 0.5 445

Page 11: Computer Science семинар, весна 2011: Синтаксический анализ для "встроенных" языков (Андрей Бреслав, кафедра

AbstractParsing

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

• Измененяемоесостояние:• Стексостоянийпарсера• Позициясчитывающейголовки

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

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

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

AbstractParser

Сообщенияоб

ошибках

Bison

Управляющиетаблицы

c

sn

s0

Упр.таблицыСтексо

стоя

ний

Вход

LR-Разбор

ACTION GOTO

SA

R

Page 12: Computer Science семинар, весна 2011: Синтаксический анализ для "встроенных" языков (Андрей Бреслав, кафедра

s1s0

Алгоритм

s2s0

s0

a b

ce

d

s4s3

s5

es3

s5s1s0

s4s3

s3

Page 13: Computer Science семинар, весна 2011: Синтаксический анализ для "встроенных" языков (Андрей Бреслав, кафедра

Времяработы• Sin – множествосостоянийвходногоавтомата• Sp – множествоуправляющихсостоянийпарсера• Stacks(SP)– множествостековсостоянийпарсера

• Времяработыалгоритма• O(|Sin|*|Stacks(Sp)|)

• Регулярнаяаппроксимация• ОграничимглубинустековсостоянийпарсерачисломD• O(|Sin|*|Stacks(Sp)|) =O(|Sin|*|Sp|D)< ∞

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

Page 14: Computer Science семинар, весна 2011: Синтаксический анализ для "встроенных" языков (Андрей Бреслав, кафедра

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

• Обычнонасинтересуетсамыйкороткий контрпример• Какрешать? s1

s0

s2s0

s0

a b

ce

d

s4s3

s5

es3

s5s1s0

s4s3

s3

Контрпримеры:- a(bc)+e- ab(cb)+d

Page 15: Computer Science семинар, весна 2011: Синтаксический анализ для "встроенных" языков (Андрей Бреслав, кафедра

Техническиетребования• Нужносообщатьобошибкахвпроцессенаписаниякода• нужныинкрементальныеалгоритмы

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

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

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

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

Page 16: Computer Science семинар, весна 2011: Синтаксический анализ для "встроенных" языков (Андрей Бреслав, кафедра

Чтоянерассказал• AbstractGLR-Parsing• Возможностьработатьснеоднозначнымиграмматиками

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

• Какпроверятьотсутствиеопечатоквидентификаторах• Автоматическиетесты• [Открытыйвопрос] Булевскиеграмматики

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

Page 17: Computer Science семинар, весна 2011: Синтаксический анализ для "встроенных" языков (Андрей Бреслав, кафедра

Темыдипломныхработ1. [М]Использованиебулевскихграмматики Abstract

Parsingдляобнаруженияопечатоквидентификаторах

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

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

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