
- •Структура компилятора. Типы транслирующих программ.
- •Определение языка. Синтаксис и семантика.
- •Порождающие грамматики Хомского. Примеры порождающих грамматик.
- •Контекстно-свободные грамматики.
- •Деревья вывода. Канонические выводы. Двусмысленные порождающие грамматики
- •Любой язык может быть порожден бесконечным числом грамматик.
- •Лексический анализ.
- •Пример структуры программы сканирования
- •Ll(n) и lr(n) – грамматики.
- •Ll(k)-грамматики
- •Lr(k) грамматики
- •Построение синтаксического графа.
- •Восходящий синтаксический анализ.
- •Пример:
- •Работа с таблицей символов.
- •Реализация в виде массива
- •Реализация в виде цепочной структуры (связанного списка)
- •2. Дополнительные затраты памяти, поскольку хранятся ссылки на последующий и, возможно, предыдущий элемент На практике также встречается комбинация этих подходов.
- •Восстановление при синтаксических ошибках.
- •Постфиксная запись.
- •Методы генерирования кода.
Деревья вывода. Канонические выводы. Двусмысленные порождающие грамматики
Графическим деревом вывода можно представить КС-грамматики, показывая, как нетерминалы, стоящие в узлах дерева, заменяются цепочками правых частей соответствующих продукций. Контекстно-свободные (КС) грамматики - по сути, частный подкласс грамматик Хомского - цепочка левой части, определяющая заменяемую подцепочку, содержит только один единственный символ нетерминального словаря. Деревья вывода цепочек языка, порождаемого КС-грамматикой, имеют следующую структуру. Корень дерева помечен начальным символом грамматики, в каждом внутреннем узле дерева стоит нетерминал, листья помечены терминальными символами так, что читаемые слева направо, они представляют терминальную цепочку, выведенную из начального символа. Из любого узла дерева, помеченного нетерминальным символом Q, идут вниз ветви к узлам, помеченным Х1Х2 ... Хк, если Q →Х1Х2 ... Хк – это одно из правил грамматики (рис. 2.3).
Таким образом, вывод любой цепочки языка, порождаемой КС-грамматикой из ее начального символа, может быть экономно представлен деревом вывода. Очевидно, что как правый, так и левый выводы цепочки языка единственные в КС-грамматике, они однозначно восстанавливаются по дереву вывода (так же, как дерево вывода однозначно строится по любому выводу цепочки). В связи с этим правый и левый выводы называются каноническими выводами цепочки в КС-грамматике.
Согласно предположению Хомского, нетерминалы грамматики представляют собой языковые конструкции (классы), играющие определенные роли в предложениях языка, а дерево вывода связывает эти роли и их смысловые нагрузки, что позволяет построить, "вычислить" смыслы более общих конструкций из смыслов их составляющих конструкций и, в конце концов, смысл всего предложения.
Терминальные символы – это символы, из которых строятся цепочки языка, порождаемого грамматикой. Нетерминалы – это вспомогательные символы, обозначающие конструкции, категории, понятия языка. Эти символы необходимы, когда мы рассуждаем о языке, но в цепочках языка эти символы не встречаются.
Пример: V3={a,b,c}; L3={anbcm| n, m>0}.
Структура любой цепочки языка L3 – АВС (А – цепочки из а, С – цепочки из с), и поскольку количества символов а в начале цепочек языка и с в конце цепочек могут не совпадать, отдельные части структуры цепочек можно генерировать независимо. Искомая грамматика:
G3: S→ ABC; A→ aA ; A→ a; B→b; C→ Cc; C→ c
Введем небольшое упрощение при записи правил грамматики. Все альтернативные замены одного и того же нетерминала (т.е. различные правые части правил с одинаковой левой частью) будем записывать в одну строку через знак альтернативы '': G3: S→ ABC; A→ aA a; B→b;C→ Cc c
Пример вывода в грамматике G3: S → ABC → aABC → aaABC → aaaBC → aaabC → aaabCc → aaabcc. Здесь на каждом шаге вывода в промежуточной цепочке заменялась самая левая подцепочка, которую можно было заменить в соответствии с правилами грамматики. Такой вывод называется левым. Ту же цепочку языка можно породить в этой грамматике и с помощью другого вывода – например, заменяя самый правый нетерминал в промежуточной цепочке вывода. Такой вывод называется правым: S → ABC→ ABCс → ABcс → Abcс → aAbcc → aaAbcc→ aaabcc. Наконец, можно породить ту же цепочку ни левым, ни правым выводом, произвольно выбирая заменяемую подстроку: S→ ABC → ABCс → aABСс → aAbСс → aaAbСс → aaAbcс → aaabcc.
ОпределениeДве грамматики называются эквивалентными, если они порождают один и тот же язык.