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

Post on 20-Jan-2017

137 Views

Category:

Documents

4 Downloads

Preview:

Click to see full reader

TRANSCRIPT

Синтаксическийанализдля«встроенных»языковАндрейБреславСоавторы:A.Annamaa,V.Vene(UniversityofTartu,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,%dbar!”,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 – разрешимаязадача

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

языка?

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

Времяработы

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

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

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

Plazma 48’520 94 4 6 3.8 0.4 65

Compiere 319’570 1343 12 138 120 0.5 445

AbstractParsing

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

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

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

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

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

AbstractParser

Сообщенияоб

ошибках

Bison

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

c

sn

s0

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

стоя

ний

Вход

LR-Разбор

ACTION GOTO

SA

R

s1s0

Алгоритм

s2s0

s0

a b

ce

d

s4s3

s5

es3

s5s1s0

s4s3

s3

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

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

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

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

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

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

s0

s2s0

s0

a b

ce

d

s4s3

s5

es3

s5s1s0

s4s3

s3

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

top related