Лекции 14-15 «Задачи синтаксического

advertisement
Лекция 13
13 ноября 2015 г.
поток лексем
id (0)
=
id (0)
+
id (1)
*
num (1.2e-12)
;
Промежуточное представление
=
синтаксическое дерево
список атомов
(MULT,id:1,num,TEMP1)
(ADD,id:0,TEMP1,TEMP2)
(MOVE,TEMP2,id:0)
id:0
+
id:0
*
id:1
num
Поток лексем
Список атомов
промежуточное представление
Синтаксическое дерево
Целевой код
Опр. 1: Синтаксический анализ – процесс определения синтаксической структуры линейной
последовательности лексем формального языка. Как правило, синтаксическая структура
представляется деревом.
Пример синтаксически некорректных строк:
x = (2 + 3) * 9);
if x > y x = 2;
while (x == 3) do f1();
Опр. 2: Формальная грамматика – средство описания формального языка. Грамматики бывают
порождающими (генеративными) и распознающими.
Опр. 3: Порождающая грамматика – это набор правил, которые могут быть использованы для
порождения всех слов языка.
Опр. 4: Распознающая грамматика – это набор правил, которые могут быть использованы для
определения принадлежности слова языку.
Опр. 5: Порождающая грамматика – это четверка <T, N, S, P>, где
T - входной алфавит или множество терминальных символов (терминалов),
N – множество нетерминальных символов (нетерминалов),
𝑆 ∈ 𝑁 – начальный нетерминал,
P – конечное множество правил вывода, называемых еще продукциями, определяющих
процедуру вывода строк в грамматике. Каждое из этих правил имеет форму 𝛼 → 𝛽, где α и β –
произвольная строка терминалов и нетерминалов, и α – состоит из как минимум одного
нетерминала.
Опр. 6: Сентенциальная форма – последовательность терминалов и нетерминалов.
Опр. 7: Предложение (слово) – последовательность терминалов.
Опр. 8: Выводом называется последовательность сентенциальных форм, начинающихся со
стартового нетерминала, заканчивающаяся последовательностью терминалов, в которой каждая
форма (кроме первой) получается из предыдущей применением к ней одной из продукций.
Например, если стартовый нетерминал S, мы будем писать вывод так: S => α => β => γ => … => x,
где α, β и γ – последовательности, в которых есть хотя бы один нетерминал, а x –
последовательность, в которой нет ни одного нетерминала.
Будем обозначать S
и более шагов.
*
x – S порождает x порождает за ноль и более шагов, а S
+
x – за один
Опр. 9: Язык, генерируемый грамматикой G (обозначается L(G)), представляет собой множество
всех ее предложений, выводимых из стартового нетерминала.
Опр. 10: Грамматики g1 и g2 называются эквивалентными, если L(g1) = L(g2)
Пример №1:
Пример вывода в грамматике
S => 0S0 => 00S00 => 001S100 => 0010100
Пример №2:
Пример вывода в грамматике
S => ASB => AASBB => AaSBB => AaBB => AaBb => Aabb => aabb
Введем некоторые условные обозначения:
A, B, C, … – один нетерминал
a, b, c, … – один терминал
…, X, Y, Z – один терминал или нетерминал
…, x, y, z – строка терминалов
α, β, γ – строка терминалов и нетерминалов
Опр. 11: Согласно иерархии Хомского все грамматики можно разделить на 4 категории:
1. неограниченные: правила имеют любой вид
2. контекстно-зависимые: все правила имеют вид αAγ -> αβγ
3. контекстно-свободные: все правила имеют вид A -> α
4. регулярные: все правила имеют вид A -> aB, A -> Ba или A -> a
1. леволинейные: A -> Ba или A -> a
2. праволинейные: A -> aB или A -> a
Тип 0 - неограниченные
Тип 1 – контекстно-зависимые
Тип 2 – контекстно-свободные
Тип 3 – регулярные
(автоматные)
Опр. 12: Язык, для которого существует КС-грамматика, называется КС-языком, и т.д.
Вопрос: язык {ε, a, aa, aaa, aaaa, …} является:
1. неограниченным?
2. контекстно-зависимым?
3. контекстно-свободным?
4. регулярным?
Ответ: язык {ε, a, aa, aaa, aaaa, …} является:
1. неограниченным,
2. контекстно-зависимым,
3. контекстно-свободным,
4. и регулярным.
Алгоритм 1: построение грамматики по регулярному языку
Пусть L = {anbn | n >= 1}. Предположим, что этот язык – регулярный.
Пример №3:
Язык, задаваемый грамматикой:
{anbncn}
Опр. 13: Дерево вывода – это дерево, в котором внутренний узел является нетерминалом, его
непосредственными потомками являются символы одного из правил вывода, в котором этот
нетерминал стоит в левой части, а листья дерева образуют слово, выводимое из нетерминала в
корне дерева.
Пример №4:
S -> aSb | ε
S => aSb => aaSbb => aaaSbbb => aaabbb
Опр. 14: Говорят, что КС-грамматика G является неоднозначной, если для какого-либо слова из
языка L(G) существует более одного дерева вывода.
Пример №5:
E -> E + E | E * E | (E) | var | const
Выводимая строка: var + var * var
Опр. 15: Левосторонним выводом слова (левым) называется такой вывод слова , в котором
каждая последующая строка получена из предыдущей путем замены по одному из правил самого
левого встречающегося в строке нетерминала.
Опр. 16: Правосторонним выводом слова (правым) называется такой вывод слова , в котором
каждая последующая строка получена из предыдущей путем замены по одному из правил самого
правого встречающегося в строке нетерминала.
Пример №6:
E -> E + E | E * E | (E) | var | const
Выводимая строка: var + var * var
Левосторонний вывод: E => E + E => var + E => var + E * E => var + var * E => var + var * var
Правосторонний вывод: E => E + E => E + E * E => E + E * var => E + var * var => var + var * var
Упражнение 1
Выпишите три различных вывода любых слов для следующей грамматики:
1.
2.
3.
4.
S -> a S A
S -> B A
A -> a b
B -> b A
Упражнение 2
Классифицируйте каждое из правил по Хомскому:
1.
2.
3.
4.
5.
6.
aSb -> aAcBb
B -> aA
a -> ABC
S -> aBc
Ab -> b
AB -> BA
Упражнение 3
Для каждой грамматики и строки приведите:
• левый вывод
• правый вывод,
• дерево разбора,
• задаваемый грамматикой язык
1.
2.
3.
4.
5.
S -> 0 S 1 | 01
S -> + S S | * S S | a
S -> S + S | S S | (S) | S* | a
S -> (L) | a L -> L,S | S
S -> a S b S | b S a S | ε
строка 000111
строка +*aaa
строка (a + a) * a
строка ((a, a), a, (a))
строка aabbab
Упражнение 4
Постройте грамматики для следующих регулярных выражений:
1.
2.
3.
4.
(a+b)*c
(aa)*(bb)*c
(a+bb+c)a*
((a+b)(c+d))*
Упражнение 5
Классифицируйте каждую из приведенных грамматик по Хомскому:
Упражнение 6
Для каждого из выражений постройте дерево вывода в следующей грамматике:
1.
2.
3.
4.
5.
6.
7.
S
S
A
A
B
B
B
->
->
->
->
->
->
->
S a A
A
A b B
B
c S d
e
f
Упражнение 7
Напишите грамматику для вывода:
1. корректных регулярных выражений
2. множества всех строк из {0, 1} таких, что за каждым 0 следует, по меньшей мере, одна 1
3. множество всех строк из {0, 1}, которые являются палиндромами
Download