Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Shpory_tyap (1).doc
Скачиваний:
23
Добавлен:
17.04.2019
Размер:
1.05 Mб
Скачать

14. Нормальная форма Хомского

Определение. КС-грамматика G= (N, Σ, P, S) называется грам­матикой в нормальной форме Хомского (или в бинарной нормаль­ной форме), если каждое правило из Р имеет один из следую­щих видов:

  1. А ВС, где А, В и С принадлежат N,

  2. Аа, где а Σ,

(3) Se, если e L(G), причем S не встречается в правых частях правил.

Покажем, что каждый КС-язык порождается грамматикой в нормальной форме Хомского. Этот результат полезен в тех случаях, когда требуется простая форма представления КС-языка.

Алгоритм 2.12. Преобразование к нормальной форме Хомского.

Вход. Приведенная КС-грамматика G = (N, Σ, Р, S).

Выход. КС-грамматика G' в нормальной форме Хомского, эк­вивалентная G, т.е. L{G') = L(G).

Метод. Грамматика G' строится по G следующим образом:

  1. Включить в Р' каждое правило и:н Р вида Аа.

  2. Включить в Р' каждое правило из Р вида А ВС.

  3. Включить в Р' правило 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

где Х’ii если 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-грамматики) достаточно выразительны для описания большинства синт-их конструкций языков программирования.

Выход синт-го анал-ра является некоторым представлением дерева разбора потока лексем от лекс-го анал-ра.

На практике имеется множество задач, которые могут сопровождать процесс разбора, а именно: сбор информации о различных лексемах в таблице символов, выполнение проверки типов и других видов семантического анализа, генерация промежуточного кода.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]