2016-12-03 03 Евгений Тюменцев. dsl на коленке

30
DSL на коленке Евгений Тюменцев Директор HWdTech, LLC

Upload: -

Post on 17-Jan-2017

26 views

Category:

Education


4 download

TRANSCRIPT

DSL на коленке

Евгений Тюменцев

Директор

HWdTech, LLC

Определение 1. (Алфавит)

Алфавит – произвольное непустое конечное множество символов.

A = {𝑎𝑖| 𝑖 = 1,2, … , 𝑛}.

Определение 2. (Слово в алфавите)

𝑎1𝑎2 … 𝑎𝑛

Словом в алфавите A называется конечная цепочка (в том числе, пустая)

записанных подряд символов этого алфавита

Определение 3. (Конкатенация)

Конкатенацией слов α и β называется слово αβ, получающееся

приписыванием слова β к слову α.

Определение 4. (Формальный язык)

Множество всех слов в алфавите A обозначается через 𝐴∗ (пустое слово

принадлежит 𝐴∗).

Формальным языком (или просто языком) в алфавите A называется какое

угодно подмножество множества 𝐴∗.

Пример 5. (язык С++)

Алфавит: do, while, if, {, }, (, ), +, -, …

Слово:

void f(int a, int b)

{

return a + b;

}

Определение 6. (Исчисление)

Пусть A - произвольный алфавит, а L - некоторый язык в алфавите A.

Тогда говорят, что задано исчисление C, если задано

1. множество Ax слов языка L,

2. конечное множество R не менее, чем двухместных отношений на L.

Каждое слово из множества Ax называется аксиомой исчисления C, а каждое

отношение из R - правилом вывода исчисления C.

Определение 7. (n+1-местное отношение)

Пусть r ∈ R - (n+1)-местное правило вывода, где n - положительное целое

число. Тогда, если (𝑎1, 𝑎2, … , 𝑎𝑛, 𝑎) ∈ r, то говорят, что 𝑎 получается из

𝑎1, 𝑎2, … , 𝑎𝑛 по правилу вывода r.

𝑎1, 𝑎2, … , 𝑎𝑛

𝑎

Определение 8. (Выводимость)

Пусть D – множество формул, B – формула.

Тогда D ⊦ B, если ∃ B1, B2, …, Bn , что

1.Bn – это B,

2.Bi – это

либо формула из L,

либо аксиома,

либо формула полученная при

помощи правила вывода

Определение 9. (Грамматика)

Формальная грамматика — четверка

T — множество терминальных символов (термов);

N — множество нетерминальных символов;

S — начальный символ;

P — набор правил вывода (продукций).

Теорема 10.

1. Для любой формальной грамматики существует машина Тьюринга,

распознающая язык этой грамматики.

2. Если язык распознается некоторой машиной Тьюринга, то существует

формальная грамматика, которая его генерирует.

Пример 11. Грамматика

1. 𝑆 → 𝑆 𝑆

2. 𝑆 → 𝑆 𝑆

3. 𝑆 → 𝜀

Пример 12. Вывод (()(()))

2 2 2 2 3 3

S=>(S)S=>(()S)S=>(()(S)S)S => (()((S)S)S)S => (()(()S)S)S => (()(())S)S

3 3

=> (()(()))S => (()(()))

Дерево вывода

Классификация Хомского

Вид правил определяет сложность алгоритма разбора формального языка

Определение 13. Регулярные грамматики

𝐴 → 𝑎 𝐵

𝐴 → 𝐵 𝑎

Определение 14. Контекстно-свободные

грамматики

𝐴 → 𝛽

Определение 14. Контекстно-зависимые

грамматики

𝛼𝐴𝛽 → 𝛼𝛾𝛽

Определение 15. Неограниченная грамматика

𝛼 → 𝛽

Практическое применение

На практике используются КС-грамматики

Регулярные – слишком узкий класс {0𝑛1𝑚|𝑛, 𝑚 ∈ ℕ}

КЗ и неограниченные – слишком трудоемкие

Восходящий и нисходящий разбор

S <=> …………………………………. <=> 𝛼

𝑎1, 𝑎2, … , 𝑎𝑛

𝑎

Определение 16. Множество First

Для каждого нетерминала A вычисляется First(A):

• если в грамматике есть правило с A в левой части и правой частью,

начинающейся с терминала, то данный терминал входит в First(A)

• если в грамматике есть правило с A в левой части и правой частью,

начинающейся с нетерминала (обозначим B), то First(B) строго входит в

First(A)

• никакие иные терминалы не входят в First(A)

Определение 17. Множество направляющих

символов

если правая часть правила начинается с терминала, то множество

направляющих символов состоит из одного этого терминала

иначе правая часть начинается с нетерминала A, тогда множество

направляющих символов есть First(A)

Определение 18. LL(1)-грамматика

для любой пары правил с одинаковой левой частью множества

направляющих символов не пересекаются.

Недостаток LL(1) грамматик

1-1-1 = 1 – (1-1)

LR(k)-грамматика

Пример

S=> ( S ) S

S => ε

1 S=> 3 ( 4 S 5) 6 S

2 S => 7 ε

Таблица разбора

Номер Напр. символы Следующий Accept

Stack Return Error

1 ( 3 0 0 0 0

2 -|, ) 7 0 0 0 1

3 ( 4 1 0 0 1

4 (, -|, ) 1 0 1 0 1

5 ) 6 1 0 0 1

6 (, -|, ) 1 0 1 0 1

7 -|, ) - 0 0 1 1

Парсер

State state = intialState;

while(state = state -> to());

Вопросы?