Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
pos.doc
Скачиваний:
161
Добавлен:
10.06.2015
Размер:
2.55 Mб
Скачать

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, (А- >1B2 r3) R, B VN; 1 2, 3 (V)*}, где

t - не головной символ в правой части правила;

r - операционный символ, слева от которого в правой части прави­ла имеется хотя бы один нетерминал;

# — маркер дна магазина.

  1. Z0 = S#, S располагается в вершине магазина.

  1. Заготовить управляющую таблицу преобразователя со строками ZГ и столбцами а (одну, так как состояние одно).

  2. Последовательно проанализировать правила Т-грамматики и заполнить позиции (Z, а) таблицы обозначениями подпрограмм преобразователя:

а) 3(,fg),П—для правила вида Z->fag,где ZVN ,a VT, f,g*; {V}* и h1()V, т.е. головной символ строки не должен быть операционным;

б) 3(,f)—для правила вида Z->f и всех aDS(Z, ), где f*;

=A,Z,AVN; {V}*,;DS(Z, ) вычисляется по правилам входной грамматики G;

в) И(f)—для правил вида Z ->f и всех a DS(Z, ), где ZVN; f*, а ;DS(Z, ) вычисляется по грамматике G;

г) И(fg),П—для правил вида Z->fag, где ZVNVT;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

#

#

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