МП-преобразователь для Т-грамматики
Активная цепочка может рассматриваться как программа управления работой МП-преобразователя. Прежде чем посмотреть, как это происходит, обратимся к методике построения МП-преобразователя по транслирующей грамматике. Затем получим, преобразователь для Т-грамматики условного оператора и проследим работу преобразователя.
Рассматриваемая входная грамматика условных операторов (см. табл. 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 - операционный символ, слева от которого в правой части правила имеется хотя бы один нетерминал;
# — маркер дна магазина.
4. Z0 = S#, S располагается в вершине магазина.
5. Заготовить управляющую таблицу преобразователя со строками Z Г и столбцами а (одну, так как состояние одно).
6.Последовательно проанализировать правила Т-грамматики и заполнить позиции (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, где Z VN,а 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 Перевод условного оператора в ОПЗ
Шаг перевода | Магазин | Входная строка | Стек меток | Операция | Запись в выходную строку |
U# | if P1 then z1 else z2 # | ||||
K# | P2 then z2 else z2;# | [x0] | Р1 | ||
## | then z1 else z2; # | m1: | [x1] | т1 УПЛ | |
OM[x3];# | z1 else z2;# | m1: | [x0] | Z1 | |
М[х2];# | else z1;# | m1: | [x2] | m2 БПm1: | |
О[х3];# | z2;# | m2: | [x0] | z2 | |
[x3];# | ;# | m2: | [х3] | т2: | |
;# | ;# | ||||
# | # |
Дата добавления: 2016-03-27; просмотров: 653;