Лекция 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}, которые являются палиндромами