- •3. Классификация языков по н. Хомскому.
- •4. Нотация Бэкуса-Наура
- •6. Дерево вывода. Левосторонний и правосторонний выводы
- •Пример построения Деревьев
- •Синтаксический анализ кс-языков
- •7. Однозначные и неоднозначные грамматики.
- •8. Основные понятия, связанные с процессами трансляции
- •9. Этапы и фазы процесса трансляции. Характеристики основных этапов
- •10. Цепочки символов. Понятие лексемы. Задачи лексического анализатора
- •11. Лексический анализ с помощью конечных автоматов
- •12. Алгоритм построения детерминированного конечного автомата по недетерминированному конечному автомату
- •14. Нормальная форма Хомского
- •16. Построение дерева синтаксического разбора.
- •17. Нисходящий синтаксический анализ
- •18. Ll(1) – грамматики
- •19. Восходящий синтаксический анализ
- •20. Таблицы транслятора
- •21. Организация таблиц символов компилятора
- •22. Основные элементы, требующие память во время выполнения.
- •23. Механизмы распределения памяти.
- •24. Стековое управление памятью.
- •25. Статическое управление памятью.
- •26. Управление кучей.
- •27. Сборка мусора.
14. Нормальная форма Хомского
Определение. КС-грамматика G= (N, Σ, P, S) называется грамматикой в нормальной форме Хомского (или в бинарной нормальной форме), если каждое правило из Р имеет один из следующих видов:
А ВС, где А, В и С принадлежат N,
Аа, где а Σ,
(3) Se, если e L(G), причем S не встречается в правых частях правил.
Покажем, что каждый КС-язык порождается грамматикой в нормальной форме Хомского. Этот результат полезен в тех случаях, когда требуется простая форма представления КС-языка.
Алгоритм 2.12. Преобразование к нормальной форме Хомского.
Вход. Приведенная КС-грамматика G = (N, Σ, Р, S).
Выход. КС-грамматика G' в нормальной форме Хомского, эквивалентная G, т.е. L{G') = L(G).
Метод. Грамматика G' строится по G следующим образом:
Включить в Р' каждое правило и:н Р вида Аа.
Включить в Р' каждое правило из Р вида А ВС.
Включить в Р' правило S e если оно было в Р.
(4) Для каждого правила из Р вида A Х1...Хk где k > 2, включить в Р' правила
А Х’1 < Х2...Хk >
< Х2... Xk > Х’2 < Х3... Xk >
.
.
.
< Xk-2Xk-1Xk > X’k-2 < Xk-1Xk >
<Xk-1Xk > X’k-1 X’k
где Х’i=Хi если Xi N; Х’i —новый нетерминал, если Хi Σ;
< Xi.. .Xk>- новый нетерминал.
(5) Для каждого правила из Р вида A Х1 Х2 ,где хотя бы один из символов Х1 и Х2 принадлежит Σ, включить в Р' правило A Х'1 Х'2
(6) Для каждого нетерминала вида а', введенного на шагах (4) и (5), включить в Р' правило а' а. Наконец, пусть N'— это N вместе со всеми новыми нетерминалами, введенными при построении Р '. Тогда искомой грамматикой будет G' = (N', Σ, Р', S)1).
(*) Авторы забыли исключить S из правых частей правил. Надо либо модифицировать алгоритм 2.12, либо, проще, ввести новые символ S' и правило S'—>S и прежде, чем применять алгоритм 2.12, сделать приведение грамматики.— Прим. ред.)
Пример 2.26. Пусть G —приведенная КС-грамматика, определяемая правилами
S aAB | BA
А ВВВ | а
B AS | b
Строим Р' алгоритмом 2.12, сохраняя правила S ВА, А а, B AS и В b. Заменяем S aAB правилами S а' < AB > и < AB > AB ,а А ВВВ — правилами A В <ВВ> и <ВВ> ВВ. Наконец, добавляем а' а. В результате получаем грамматику
G' = (N',{a, b}, P', S), где N' = {S, A, B, <AB>,<BB>,a'} , а P' состоит из правил
S a'<AB> | BA
A B<BB> | a
B AS | b
<AB> AB
<BB> BB
а' а
(Надо еще устранить S из правой части правила B AS. – Прим. Ред.)
15. Роль синтаксического анализатора.
В трансляторе синтаксический анализатор получает строку лексем от лексического анализатора и проверяет, может ли эта строк имен порождаться грамматикой исходного языка.
Место синтаксического анализатора в модели транслятора:
От синт-го анал-ра ожидается сообщение обо всех выявленных ошибках, причем достаточно внятное и полное. Кроме того, синт-ий анал-ор должен уметь обрабатывать обычные часто встречающиеся ошибки и продолжать работу с оставшейся частью программы. Концептуально, в случае корректности программы синт. анал. строит дерево разбора и передает его следующей части компилятора для дальнейшей обработки.
В действительности явного построения дерева разбора не требуется, так как проверки и действия трансляции могут выполняться в процессе синт-го анализа. Таким образом, синт. анал. и другие части начальной стадии транслятора могут быть реализованы в виде единственного модуля.
Имеется 3 основных типа синт-их анал-ов грамматик:
- основная;
- восходящая;
- нисходящая;
Универсальные методы разбора, такие как алгоритмы Кока-Янгера-Касами и Эрли, могут работать с любой грамматикой. Но эти методы слишком неэффективны для использования в промышленных трансляторах.
Методы, обычно применяемые в трансляторах, классифицируются как нисходящие и восходящие.
Нисходящие синт. анал-ы строят дерево разбора сверху (от корня) вниз (к листьям), а восходящие начинают с листьев и идут к корню. В обоих случаях входной поток синт-го анал-а сканируется посимвольно слева направо.
Наиболее эффективные нисходящие и восходящие методы работают только с подклассами грамматик, но некоторые из этих подклассов (LL- и LR-грамматики) достаточно выразительны для описания большинства синт-их конструкций языков программирования.
Выход синт-го анал-ра является некоторым представлением дерева разбора потока лексем от лекс-го анал-ра.
На практике имеется множество задач, которые могут сопровождать процесс разбора, а именно: сбор информации о различных лексемах в таблице символов, выполнение проверки типов и других видов семантического анализа, генерация промежуточного кода.