Синтаксическийанализдля«встроенных»языковАндрейБреславСоавторы: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 – разработкаиреализацияэффективныхструктурданныхдляхранениямножествамножествстеков