Скачиваний:
17
Добавлен:
01.05.2014
Размер:
381.95 Кб
Скачать

Описание перевода (постфиксная s – атрибутная транслирующая грамматика) каждой конструкции входного языка

Все нетерминалы содержат только синтезированныеатрибуты.

Операционные символы содержат как унаследованные, так и синтезированные атрибуты. Синтезтрованные атрибуты операционных символов – это те атрибуты, значения которых есть результат некоторой функции (НОВЭЛТ, НОВМЕТ, ..). Все остальные атрибуты операционных символов – унаследованные.

Основная грамматика

PRG -> voi mai ( ) SOP

PRG -> GD voi mai ( ) SOP

GD -> GD DES

GD -> DES

Подграмматика составного оператора

SOP -> { SET }

SOP -> { }

SET -> SET OP

SET -> OP

Подграмматика оператора

OP -> LOP OPS

OP -> OPS

LOP -> idp1 : {МЕТКА}p2

p2p1

OPS -> OPN

OPS -> GOT

OPS -> IN

OPS -> OUT

OPS -> SOP

OPS -> ;

GOT -> got idp ; {БП}q

qp

IN -> scn ( LIN ) ;

LIN -> VARp {ВВОД}q

qp

LIN -> LIN , VARP {ВВОД}q

qp

Подграмматика оператора вывода

OUT -> prn ( LO ) ;

LO -> AEXp {ВЫВОД}q

qp

LO -> LO , AEXp {ВЫВОД}q

qp

Операционные символы:

{МЕТКА}A

Идентификатору A1задается класс метка и ссылка указывает на таблицу меток, в которую добавляется текущий номер тетрады.

{БП}A

Если A– идентификатор и его класс – метка, то генерируется тетрада:JMPA1, иначе ошибка.

{ВВОД}A

Если A– переменная целого или вещественного типов, то в зависимости от типа переменнойAгенерируется тетрада:SCAN(см. таблицу), иначе ошибка.

{ВЫВОД}A

Если A– переменная или константа целого или вещественного типов, то в зависимости от типа значенияAгенерируется тетрада:PRINT(см. таблицу), иначе ошибка.

тип A

SCAN

PRINT

float

SCANF A

PRINTF A

int

SCANI A

PRINTF A

Подграмматика для операторов

OPN -> FOR

OPN -> IF

OPN -> GIV

FOR -> for HDq1,q2 ) OP {БП}m1 {ИМ}m2

m1q2

m2q1

HDp1,p2 -> HD0q1,q2,q3,q4 OGV {БП}m {ИМ}m1

mq1

m1q3

p1q2

p2q4

HDp1,p2 -> HD0q1,q2,q3,q4 {БП}m {ИМ}m1

mq1

m1q3

p1q2

p2q4

HD0p1,p2,p3,p4 -> HD1q LEXr ; {ДВМ}m {УПЛ}r1,m1 {ДВМ}n {БП}n1 {ДМ}n2

p1q

mНОВМЕТ

p2,m1m

nНОВМЕТ

p3,n1n

n2НОВМЕТ

p4n2

HD0p1,p2,p3,p4 -> HD1q ; {ДВМ}n {ДВМ}m {БП}m1 {ДМ}m2

nНОВМЕТ

mНОВМЕТ

p3,m1m

m2НОВМЕТ

p4m2

p2n

p1q

HD1p -> ( ; {ДМ}m

mНОВМЕТ

pm

HD1p -> ( GIV {ДМ}m

mНОВМЕТ

pm

IF -> IF1p

IF -> IF1p els op {ИМ}q

qp

IF1p -> if CONp1 ) op {ДВМ}k {БП}k1 {ИМ}q {ИМ}k2

qp1

kНОВМЕТ

p, k2, k1k

CONp1 -> ( LEXq {ДВМ}m {УПЛ}r,m1

rq

m1,mНОВМЕТ

p1m

GIV -> OGV ;

OGV -> VARp = AEXq {=}q1,q2

p1p

q1q

LEXp -> LEXp1 != LE1q {!=}r1,r2,r3

p,r3НОВЭЛТ

r1p1

r2q

LEXp -> LEXp1 == LE1q {==}r1,r2,r3

p,r3НОВЭЛТ

r1p1

r2q

LEXp -> LE1q

pq

LE1p -> AEXq

pq

LE1p -> LE1p1 > AEXq {<}r1,r2,r3

r1q

r2p1

p,r3НОВЭЛТ

LE1p -> LE1p1 < AEXq {<}r1,r2,r3

r1p1

r2q

p,r3НОВЭЛТ

LE1p -> LE1p1 >= AEXq {<=}r1,r2,r3

r1q

r2p1

p,r3НОВЭЛТ

LE1p -> LE1p1 <= AEXq {<=}r1,r2,r3

r1p1

r2q

p,r3НОВЭЛТ

Операционные символы:

{ДВМ}A1

Добавляет виртуальную метку в таблицу меток, и возвращает ее номер в A1

{ИМ}A1

Инициализируется метка с номером A­1– записывается в таблицу меток номер текущей тетрады.

{ДМ}A1

Метке с номером A1присваивается номер следующей тетрады.

{УПЛ}A1,A2

Если A1– переменная или константа типаint, то генерируется тетрада:JMPFА1,A2, гдеA1 – номер переменной или константы,A2– номер в таблице меток, иначе ошибка.

{<}A1,A2,R

Если A1иA2– переменные или константы целого и вещественного типов, то в зависимости от типаintилиfloat, генерируется тетрада:LIA­1A2RилиLFA1A2R, иначе ошибка

{<=}A1,A2,R

Если A1иA2– переменные или константы целого и вещественного типов, то в зависимости от типаintилиfloat, генерируется тетрада:LEIA­1A2RилиLEFA1A2R, иначе ошибка.

{==}A1,A2,R

Если A1иA2– переменные или константы целого и вещественного типов, то в зависимости от типаintилиfloat, генерируется тетрада:EEIA­1A2RилиEEFA1A2R, иначе ошибка.

{!=}A1,A2,R

Если A1иA2– переменные или константы целого и вещественного типов, то в зависимости от типаintилиfloat, генерируется тетрада:NEIA­1A2RилиNEFA1A2R, иначе ошибка.

{=}A1,A2

Если A1– не переменная, то ошибка. ЕслиA­2– не переменная и не константа, то ошибка. Если типыA1иA2совпадают, то в зависимости от типа генерируется тетрада:SETxA­1A2R. Если типA1 –float, а типA2–int, то генерируются тетрады:FTYPEA2 -A3;SETA1A3R

Операционные символы операций отношений вызывают функцию проверки совпадения типов операндов. Если типы не совпадают, и A1–float, аA2–int, то генерируется тетрада преобразования типаintкfloat:FTYPE A - R, гдеA– элемент типаint.

НОВМЕТ - процедура, которая выдает значение указателя на свободную позицию таблицы меток.

НОВЭЛТ - процедура, которая выдает значение указателя на свободную позицию таблицы, используемой для запоминания результата.

Подграмматика объявлений

DES -> DVA

DES -> DMT

DES -> DC

DVA -> TYPp LIq ; {ПЕРЕМЕННЫЕ}p1,q1

p1p

q1q

DVA -> TYPp LAq ; {МАССИВ}p1,q1

p1p

q1q

DMT -> fmt LMT ;

TYPp -> intq

pq

TYPp -> fltq

pq

LIp -> LIq , idr {СПИСОК}r1,q1

p,q1q

r1r

LIp -> idq {СПИСОК}q1,r

q1q

rНОВ_СПИСОК

pr

LAp -> LAr1 , idq IAr2 {СПИСОК_МАСС}q1,r3,r4

q1q

r3r2

p,r4r1

LAp -> idq IAr {СПИСОК_МАСС}q1,r1,r2

q1q

r1r

r2НОВ_СПИСОК_МАСС

pr2

IAp -> [ numq1 ] {СПИСОК}q2,r

q2q1

rНОВ_СПИСОК

pr

IAp -> IAp1 [ numq1 ] {СПИСОК}q2,r

q2q1

r,pp1

LMT -> LMT , id­p [ numq1 , numq2 ] {МАТРИЦА}r1,r2,r3

r1p

r2q1

r3q2

LMT -> idp [ numq1 , numq2 ] {МАТРИЦА}r1,r2,r2

r1p

r2q1

r3q2

Операционные символы:

{МАТРИЦА}A1,A2,A3

Объявление матрицы: размер которой [A2,A3]. Если идентификатор уже объявлен, то ошибка. ИдентификаторуA1задается класс – переменная, и ссылка указывает на таблицу переменных. В поле “атрибуты” таблицы переменных записывается размер матрицы. В поле “тип” записывается 3 –fmatr. В поле “адрес” записывается адрес свободной ячейки памяти.“размер” = A2 * A3 * 4

{СПИСОК}A1,A2

Добавляется элемент A1в списокA2,

{СПИСОК_МАСС}A1,A2,A3

В список массивов по адресу A3добавляется элемент {A1,A2}, гдеA1– идентификатор,A2– указатель на список индексов.

{МАССИВ}A1,A2

Объявление массивов: В цикле обрабатывается список массивов. Если идентификатор уже объявлен, то ошибка. Если размерность массива больше 10, то ошибка. Идентификатору задается класс – переменная, и ссылка указывает на таблицу переменных. В поле “атрибуты” таблицы переменных записывается указатель на список размеров массива. В поле “тип” записывается тип массива. В поле “адрес” записывается адрес свободной ячейки памяти. В поле “размер” записывается количество байт, требуемых массиву.

{ПЕРЕМЕННЫЕ}A1,A2

Объявляются переменные типа A1.A2– список идентификаторов. Если идентификатор уже объявлен, то ошибка. Идентификатору задается класс – переменная, и ссылка указывает на таблицу переменных

НОВ_СПИСОК – создается список из элементов типа (unsigned char) и возвращается указатель на него.

НОВ_СПИСОК_МАСС – создается список из элементов типа ARR и возвращается указатель на него.

ARR = struct {

List<unsigned char>* ptr; - указатель на список индексов

unsigned char ID – номер идентификатора

}

Соседние файлы в папке kurs