
- •Содержание
- •1 Формальные языки и грамматики
- •1.1 Основные понятия теории формальных языков
- •Определение Цепочка, которая не содержит ни одного символа, называется пустой цепочкой и обозначается .
- •1.2 Способы задания языков
- •1.2.1 Формальные грамматики
- •1.2.1.1 Определение формальной грамматики
- •Определение Цепочка (vtvn)* выводима из цепочки в грамматике(обозначается*), если существует последовательность цепочек (n0) такая, что .
- •1.2.1.3 Эквивалентность грамматик
- •1.2.2 Формы Бэкуса - Наура
- •1.2.3 Диаграммы Вирта
- •1.2.5 Механизмы распознавания языков
- •1.2.5.1 Определение распознавателя
- •1.2.5.2 Схема работы распознавателя
- •1.2.5.3 Классификация распознавателей
- •2 Регулярные грамматики и языки
- •2.1 Регулярные выражения
- •2.2 Лемма о разрастании языка
- •2.3 Конечные автоматы
- •2.3.1 Определение конечного автомата
- •2.3.2 Распознавание строк конечным автоматом
- •Существуют следующие способы представления функции переходов: - командный способ.Каждую команду ка записывают в форме , где.
- •2.3.3 Преобразование конечных автоматов
- •2.3.3.1 Преобразование конечного автомата к детерминированному виду
- •Алгоритм Преобразование нка в дка
- •2.3.3.2 Минимизация конечного автомата
- •2.3.3.2.1 Устранение недостижимых состояний ка
- •2.3.3.2.2 Объединение эквивалентных состояний ка Алгоритм Объединение эквивалентных состояний ка
- •2.4 Взаимосвязь способов определения грамматик
- •2.4.1 Построение ка по регулярной грамматике
- •Выход:ка.
- •3 Контекстно-свободные языки и грамматики
- •3.1 Задача разбора
- •3.1.1 Вывод цепочек
- •Определение Цепочка (vtvn)* выводима из цепочки в грамматике(обозначается*), если существует последовательность цепочек (n0) такая, что .
- •3.1.2 Дерево разбора
- •3.1.2.1 Нисходящее дерево разбора
- •3.1.2.2 Восходящее дерево разбора
- •3.1.3 Однозначность грамматик
- •3.2 Преобразование кс-грамматик
- •3.2.1 Проверка существования языка грамматики
- •3.2.2 Устранение недостижимых символов
- •Алгоритм Устранение нетерминалов, не порождающих терминальных строк Вход: кс-грамматика.
- •Алгоритм Устранение недостижимых символов Вход: кс-грамматика.
- •Определим множество достижимых символов z грамматики g, т.Е. Множество
- •3.2.3 Устранение -правил Алгоритм Устранение -правил Вход: кс-грамматика.
- •3.2.4 Устранение цепных правил Алгоритм Устранение цепных правил Вход: кс-грамматика.
- •3.2.5 Левая факторизация правил Алгоритм Устранение левой факторизации правил Вход: кс-грамматика.
- •3.2.6 Устранение прямой левой рекурсии Алгоритм Устранение прямой левой рекурсии Вход: кс-грамматика.
- •3.3 Автомат с магазинной памятью
- •3.3.1 Определение мп-автомата
- •3.3.2 Разновидности мп-автоматов
- •3.3.3 Взаимосвязь мп-автоматов и кс-грамматик
- •3.3.3.1 Построение мп-автомата по кс-грамматике
- •3.3.3.2 Построение расширенного мп-автомата по кс-грамматике
- •3.4 Нисходящие распознаватели языков
- •3.4.1 Рекурсивный спуск
- •3.4.1.1 Сущность метода
- •3.4.1.2 Достаточные условия применимости метода рекурсивного спуска
- •3.4.2 Распознаватели ll(k)-грамматик
- •3.4.2.1 Определение ll(k)-грамматики
- •3.4.2.2 Необходимое и достаточное условие ll(1)-грамматики
- •3.4.2.3 Построение множества first(1, a)
- •3.4.2.4 Построение множества follow(1, a)
- •3.4.2.5 Алгоритм «сдвиг-свертка» для ll(1)-грамматик
- •Шаг 6. Получили следующую цепочку вывода:
- •3.5.1.1.2 Поиск основы сентенции грамматики
- •3.5.1.1.3 Построение множеств l(a) и r(a)
- •3.5.1.1.5 Алгоритм «сдвиг - свертка» для грамматик простого предшествования
- •Шаг 3. Функционирование распознавателя для цепочки (((aa)a)a) показано в таблице 3.9.
- •3.5.1.2 Грамматика операторного предшествования
- •3.5.1.2.1 Определение грамматики операторного предшествования
- •3.5.1.2.2 Построение множеств Lt(a) и Rt(a)
- •3.5.1.2.4 Алгоритм «сдвиг-свертка» для грамматики операторного предшествования
- •3.5.2 Распознаватели lr(k)-грамматик
- •3.6 Соотношение классов кс-грамматик и кс-языков
- •3.6.1 Соотношение классов кс-грамматик
- •3.6.2 Соотношение классов кс-языков
- •4 Принципы построения языка
- •4.1 Лексика, синтаксис и семантика языка
- •4.2 Определение транслятора, компилятора, интерпретатора и ассемблера.
- •4.3 Общая схема работы компилятора
- •4.4 Лексический анализ
- •4.4.1 Задачи лексического анализа
- •4.4.2 Диаграмма состояний с действиями
- •4.4.3 Функция scanner
- •4.5 Синтаксический анализатор программы
- •4.5.1 Задача синтаксического анализатора
- •4.5.2 Нисходящий синтаксический анализ
- •Теорема Достаточные условия применимости метода рекурсивного спуска
- •4.6 Семантический анализ программы
- •4.6.1 Обработка описаний
- •4.6.2 Анализ выражений
- •4.6.3 Проверка правильности операторов
- •4.7 Генерация кода
- •4.7.1 Формы внутреннего представления программы
- •4.7.1.1 Тетрады
- •4.7.1.2 Триады
- •4.7.1.3 Синтаксические деревья
- •4.7.1.4 Польская инверсная запись
- •Составной оператор begin s1; s2;...; Sn end в полиЗе записывается как s1 s2... Sn.
- •4.7.1.5 Ассемблерный код и машинные команды
- •4.7.2 Преобразование дерева операций в код на языке ассемблера
- •4.8 Оптимизация кода
- •4.8.1 Сущность оптимизации кода
- •4.8.2 Критерии эффективности результирующей программы
- •4.8.3 Методы оптимизации кода
- •4.8.4 Оптимизация линейных участков программ
- •4.8.4.1 Свертка объектного кода
- •4.8.4.2 Исключение лишних операций
- •4.8.5 Оптимизация логических выражений
- •4.8.6 Оптимизация циклов
- •4.8.7 Оптимизация вызовов процедур и функций
- •4.8.9 Машинно-зависимые методы оптимизации
- •4.8.9.1 Распределение регистров процессора
- •4.8.9.2 Оптимизация кода для процессоров, допускающих распараллеливание вычислений
- •5 Формальные методы описания перевода
- •5.1 Синтаксически управляемый перевод
- •5.1.1 Схемы компиляции
- •5.1.4 Практическое применение су-схем
- •5.2 Транслирующие грамматики
- •5.2.1 Понятие т-грамматики
- •5.3 Атрибутные транслирующие грамматики
- •5.3.1 Синтезируемые и наследуемые атрибуты
- •5.3.2 Определение и свойства ат-грамматики
- •5.3.3 Формирование ат-грамматики
- •Решение
5.2 Транслирующие грамматики
5.2.1 Понятие т-грамматики
В простых СУ-схемах можно объединить левые и правые части соответствующих правил входной и выходной грамматик. Получающиеся таким образом грамматики принято называть транслирующими грамматиками (Т-грамматиками). Символы выходного алфавита А в Т-грамматике называют операционными символами. При записи Т-грамматики каждый операционный символ во избежание путаницы каким-либо образом выделяют. Будем заключать такой символ в прямоугольные скобки.
Пример
Определение
Т-грамматики для перевода инфиксных
арифметических выражений в ПОЛИЗ: VT=
{+,
*,
(,), имя};
= {[+],
[*], [имя]};
VN
= {S,
Е,T,
F};
S
—
аксиома, правила
R:
1)S->E 2)E->E+T[+] 3) E->T 4) T->T*F[*]
5) T->F 6) F->(E) 7) F-> имя[имя]
Ясно, что результатом удаления операционных символов из Т-грамматики будет входная грамматика. Если удалить из Т-грамматики терминалы, получим выходную грамматику, или грамматику действий.
Т-грамматика описывает правила образования строк из терминалов и операционных символов. Эти строки называют активными цепочками. Если удалить из активной цепочки операционные символы, то получится ее входная часть. Если удалить из активной цепочки терминалы, получится выходная часть, или, иначе, трансляция, перевод входной части. Активную цепочку можно рассматривать как программу управления работой МП - преобразователя, соответствующего Т-грамматике. При этом входной символ можно считать обозначением операции чтения этого символа, а операционный символ — обозначением операции выдачи этого символа.
Пример Активная цепочка а[a]+b[b]*с[с][*][+] описывает процесс трансляции входной цепочки а + b*с (исключили из активной цепочки операционные символы) в ПОЛИЗ [а] [b] [с] [*][+] (исключили из активной цепочки терминалы). Действительно, существует вывод (левосторонний)
S => Е => Е+ Т[+] => Т+ Т[+] => F+ T[+] => а[а] + Т[+] =>
a[a] + T*F[*][+] => a[a] + F*F[*][+] => a[a] + b [b]*F [*][+] =>
a[a] + b[b]* с [с ][*][+],
и пара (а + b*c, [a][b][с][*][+]) принадлежит переводу инфиксных выражений в ПОЛИЗ. В этом примере каждый операционный символ обозначает просто выдачу соответствующего входного символа в выходную строку.
5.2.2 Т-грамматика с подпрограммами
Рассмотрим Т-грамматику для условных операторов. Грамматика описывает перевод сокращенных и полных условных операторов в ПОЛИЗ, например оператора вида if A then В else С; в ПОЛИЗ вида А т1УПЛ В m2БП m1:С т2, где А — логическое выражение, Z и С — любые операторы, в том числе и условные. Ясно, что элементы А, В и С в ПОЛИЗ оператора также будут записаны в ПОЛИЗ.
Представим грамматику G = (VT, Vn,P, S) условного оператора некоторого языка программирования правилами (табл. 4.2). Это входная грамматика, в которой VT= {if then, else, z, p, ;}, VN= {U,K,H,M,O}, S = U- аксиома. Для обозримости иллюстраций полагаем, что логическое выражение р и не условный оператор z описываются в других грамматиках и считаются уже разобранными синтаксическими конструкциями. Поэтому они включены в множество терминалов VN.
Таблица 5.1 Правила грамматики условного оператора
Номер правила |
Входная грамматика G |
Транслирующая грамматика GT |
1 |
U->if K |
U->if K |
2 |
К->рН |
K->p[xo]H |
3 |
Н -> then О М; |
H->then[x1]O M [x3]; |
4 |
М -> else О |
М -> else [X2] О |
5 |
M-> |
М
-> |
6 |
O->U |
O->U |
7 |
0->z |
O->z [x0] |
Теперь
запишем Т-грамматику, пополнив входную
грамматику операционными символами.
Операционные символы подберем,
исходя из сравнения форм исходных
операторов и соответствующих
им форм ПОЛИЗ. Возможный вариант правил
R
для
Т-грамматики
GT
=
(VT,
VN,
,
Р,
S)
показан
в табл. 5.2.1. В этой грамматике
= {[х0],
[х1],
[х2],
[х3]},
a
VT,
VN
и
U
имеют
тот же смысл,
что и во входной грамматике. Операционные
символы по
сути своей являются подпрограммами,
которые выполняются
в темпе синтаксического анализа и
осуществляют следующие действия:
- [x0] - копирует текущий входной символ (терминал) в выходную строку;
- [x1] - создает очередную метку mj, дописывает в выходную строку цепочку mj УПЛ и помещает mj. в вершину стека меток;
- [x2] - создает очередную метку mj+1, дописывает в выходную строку цепочку mj+1БПmj:, где тj— метка в вершине стека меток, и замещает в стеке метку mi: меткой mj+1:;
- [х3] - выталкивает метку тk из вершины стека меток в выходную строку.
Транслирующая грамматика GT описывает активные цепочки. Так, входному оператору if a then b else с; будет соответствовать активная цепочка if a [x0] then[x1] b[x0] else[x2] c[x0] [x3].
5.2.3 МП-преобразователь для Т-грамматики
Активная цепочка может рассматриваться как программа управления работой МП-преобразователя. Прежде чем посмотреть, как это происходит, обратимся к методике построения МП-преобразователя по транслирующей грамматике. Затем получим, преобразователь для Т-грамматики условного оператора и проследим работу преобразователя.
Рассматриваемая входная грамматика условных операторов (см. табл. 5.2.1) относится к классу LL(1)-грамматик. Поэтому вполне естественно вести здесь речь о построении преобразователя, подходящего для такого класса грамматик. Наш МП - преобразователь будет использовать нисходящую стратегию анализа, он будет также детерминированным. Методика построения МП - распознавателя для LL(1)-грамматик была рассмотрена ранее. Повторим здесь полностью все пункты указанной методики с учетом особенностей, которые привносит в нее Т-грамматика.
Прежде всего, сохраним, по возможности, обозначения подпрограмм в управляющей таблице преобразователя:
-
3 (,
)
- Замена символа в вершине магазина
строкой
и запись в выходную строку части перевода,
соответствующей цепочке
операционных символов.
- П - перемещение указателя входной строки на одну позицию вправо.
-
И()
-
Исключение символа из вершины магазина
и вывод в
выходную строку части перевода,
соответствующей цепочке
операционных
символов.
- О - Обнаружение Ошибки в программе и завершение работы.
- В - Выход, нормальное завершение работы.
Если
один из аргументов подпрограммы 3
отсутствует,
сохраняем
разделяющую запятую. При отсутствии
единственного аргумента
подпрограммы И
пишем
И().
Теперь
дадим пункты методики
построения ДМП-преобразователя М
=
(Q,
,
Г,
,
,
q0,
Z0,
F)
с
одним состоянием по Т-грамматике GT
=
(VT,
VN,
,
R,
S),
входная
грамматика G
= (VT,
VN,
Р,
S)
которой
обладает свойством
LL(1)-грамматик.
1.Q={q};q0=
q;F=
2.
=VT
{#}, # — концевой маркер входной строки.
3.
Г= VN
{#}
{t\
t
VT,(A
->
t
)
Р,
V+,
V*}
{r\r,
(А-
>
1B
2
r
3)
R,
B
VN;
1
2,
3
(V
)*},
где
t - не головной символ в правой части правила;
r - операционный символ, слева от которого в правой части правила имеется хотя бы один нетерминал;
# — маркер дна магазина.
Z0 = S#, S располагается в вершине магазина.
Заготовить управляющую таблицу преобразователя со строками Z
Г и столбцами а
(одну, так как состояние одно).
Последовательно проанализировать правила Т-грамматики и заполнить позиции (Z, а) таблицы обозначениями подпрограмм преобразователя:
а) 3(,fg),П—для
правила вида Z->fag
,где
Z
VN
,a
VT,
f,g
*;
{V
}*
и h1(
)
V,
т.е. головной символ строки
не
должен быть операционным;
б) 3(,f)—для
правила вида Z->f
и всех a
DS(Z,
),
где f
*;
=A
,Z,A
VN;
{V
}*,
;DS(Z,
)
вычисляется
по правилам входной грамматики G;
в)
И(f)—для
правил вида Z
->f
и
всех a
DS(Z,
),
где Z
VN;
f
*,
а
;DS(Z,
)
вычисляется по грамматике G;
г)
И(fg),П—для
правил вида Z->fag,
где ZVN,а
VT;f,
g
*.
7. Завершение заполнения позиций (Z, д) таблицы обозначениями подпрограмм преобразователя:
а) И(),
П
— для всех позиций Z
= а, где
Z,a
VT;
б) И
— для всех позиций строки Z
;
в) В — для позиции Z = а = #;
г) О — для всех оставшихся пустыми позиций.
Теперь формируются заготовки текстов сообщений об ошибках, и на этом разработка МП-преобразователя завершается.
Задача Построить МП-преобразователь по транслирующей грамматике условных операторов
Решение
1.
Q=
{q};q0=q;F=
2.
={if,then,else,z,p,;,#}
3. Г= {U,K,H,M,O,#,;,[x3]} 4. Z0= U#
5. Управляющая таблица представлена в табл. 5.2.2
6. Пояснения к заполнению табл. 5.2.2:
а) правило 1 — помещаем 3(К,),П в позицию (U, if); правило 2 — помещаем 3(Н,[х0]),П в позицию (K, р); правило 3 — помещаем З((ОМ[х3];),[х1]), в позицию (H, then); правило 4 — помещаем З(О,[х2]),П в позицию (М, else);
б) правило 6 — помещаем 3(U,) в позицию (О, z);
в) правило 5 — помещаем И в позицию (М,;);
г) правило 7 — помещаем И([х0]),П в позицию (О, z).
7. Пояснения к завершению заполнения табл. 5.2.2;
а) помещаем И( ),П в позицию (;,;);
б) помещаем И([xз]) во все позиции строки [xз];
в) помещаем В в позицию (#, #);
г) помещаем О во все свободные позиции таблицы.
Таблица 5.2 Управляющая таблица
|
if |
then |
else |
z |
р |
; |
# | |||||
U |
3(К,),П |
О |
О |
О |
О |
О |
0 | |||||
K |
О |
О |
О |
О |
3(О,[х2]),П |
O |
0 | |||||
H |
О |
3((0М[х3]; [x1]),П |
О |
O |
О |
O |
0 | |||||
M |
О |
О |
3(О,[х2]),П |
О |
О |
И() |
0 | |||||
О |
3(U,) |
О |
О |
И[х0]),П |
O |
O |
0 | |||||
; |
О |
О |
О |
О |
О |
И(),П |
0 | |||||
[х3] |
И([x3]) | |||||||||||
# |
О |
O |
O |
О |
O |
0 |
B |
Задача Используя МП - преобразователь из предыдущей задачи, выполнить перевод оператора ifp1 then z1 else z2; в ОПЗ.
Прежде всего обратим внимание на то, что помимо магазина наш МП -преобразователь работает со стеком меток. Решение представим в табл. 5.2.3, предусмотрев в ней колонки для отображения номера шага преобразования, содержимого магазина, содержимого входной строки и записей в выходную строку преобразователя. Магазин изображается так, что его вершина расположена слева. Текущий символ входной строки также находится слева. Выходная строка формируется слева направо. Кроме того, для наглядности предусмотрены колонки для показа операционного символа, являющегося активным на текущем шаге перевода (колонка "операция"), и для представления стека меток (вершина стека слева).
На каждом шаге работы преобразователя выделяется пара (символ в магазине, текущий входной символ) и выполняются действия, определенные содержимым соответствующей позиции таблицы и активным операционным символом. На выходе преобразователя получена строка р1т2УПЛz1т1БПт1:z2т2:, которая представляет собой ПОЛИЗ исходного оператора и может быть использована для генерации машинного кода или интерпретации.
Таблица 5.3 Перевод условного оператора в ОПЗ
Шаг перевода |
Магазин |
Входная строка |
Стек меток |
Операция |
Запись в выходную строку |
1 |
U# |
if P1 then z1 else z2 # |
|
|
|
2 |
K# |
P2 then z2 else z2;# |
|
[x0] |
Р1 |
3 |
## |
then z1 else z2; # |
m1: |
[x1] |
т1 УПЛ |
4 |
OM[x3];# |
z1 else z2;# |
m1: |
[x0] |
Z1 |
5 |
М[х2];# |
else z1;# |
m1: |
[x2] |
m2 БПm1: |
6 |
О[х3];# |
z2;# |
m2: |
[x0] |
z2 |
7 |
[x3];# |
;# |
m2: |
[х3] |
т2: |
8 |
;# |
;# |
|
|
|
9 |
# |
# |
|
|
|