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

3.4 Описание перевода

3.4.1 Атг для программы

  1. N1  program idc ; N3 .

  2. N1  N3 .

  3. N3  N16 operator

  4. N3  operator

  5. N7  idl , N7

  6. N7  idl

  7. N10  N8 N10

  8. N10  N8

  9. N12t  Expressiont1,v1,n1 .. Expressiont2,v2,n2

t  longint // тип диапазона longint

If (t1, t2 = boolean, boolmatr) then {ошибка построения типа диапазона}

if (v1>v2) then {ошибка, константа слева должна быть меньше}

  1. N12t  idtt1

t  t1 // Номер типа в таблице типов

  1. N12t  boolmatr [Expressiont1,v2,n3 , Expressiont2,v2,n2 ]

t  Номер boolmatr в таблице типов

if (t1,t2= boolean, boolmatr) then {ошибка типа выражения}

  1. N16  N18 N16

  2. N16  label N7 ;

  3. N16  const N10

  4. N16  type N23

  5. N16  var N26

  6. N16  N19 N16

  7. N16  N20 N16

  8. N16  N21 N16

  9. N18  label N7 ;

  10. N19  const N10

  11. N20  type N23

  12. N21  var N26

  13. N22  idt = N12t ;

  14. N23  N22 N23

  15. N23  idt = N12t ;

  16. N25  idvt,v,n , N25 {VAR}t,n

// Семантика как в 28

  1. N25  idvt,v,n {VAR}t,n

t // Тип переменной

v0

n// Номер переменной в таблице переменных

{VAR}t.n

Выдать на выход триаду вида VAR n, t

if t=boolmatr {выдать на выход триаду ARG M,N}

  1. N26  N25 : N12 ;

  2. N26  N25 : N12 ; N26

  3. N8  idct1,v1,n1 = Expressiont2,v2,n2 ;

t1t2 //Присвоение типа константе

v1v2 // Присвоение значения константы

n1n2 // Если n>0 то ошибка переменная в константном выражении

  1. N8  idct1,v1,n1 : N12t = Expressiont2,v2,n2 ;

t1t2 //Присвоение типа константе если t=t2, иначе ошибка

v1v2 // Присвоение значения константы

n1n2 // Если n>0 то ошибка переменная в константном выражении

3.4.2 Атг для оператора

  1. N1  begin N2 end

  2. N1  begin if Expressiont,v,n then {JFL}nl,t,v,n N3 end {DEFL}nl

nl  newlabel // Метка на которую нужно перейти

t // тип выражения

v //Значение выражения

n // Если переменная, то номер в таблице переменных, n=-1, тогда в v – ссылка.

{JFL} nl,t,v,n

If t=boolean then

{ if n>0 then X=n else X=v

nl := newlabel

Выдать на выход триаду вида JFL nl, X

} else {Ошибка типа выражения}

  1. N2  N3

  2. N2  N3 ;

  3. N2  N3 ; N2

  4. N2  N4

  5. N2  N4 ;

  6. N2  N4 ; N2

  7. N3  idln : {DEFL}n N3

n // номер метки в таблице меток

{DEFL}n

Выдать на выход триаду вида DEFL n,

  1. N3  idvt1,v1,n1 := Expressiont,v,n {EQU}t,v,n,t1,v1,n1

t //Тип выражения

v //Значение выражения

n // Если переменная, то номер в таблице переменных, n=-1, тогда в v – ссылка.

t1 //Тип переменной

v1 // неиспользуется

n1 // должен быть >0

{EQU}t,n,t1,v1,n1

if t совместимо t1 then

{ if n>0 then

{ if n1>0 then X=n1 else X=v1

Выдать триаду вида EQU X,n

}else {Ошибка : ожидалась переменная}

}else {Ошибка совместимости типов}

  1. N3  idvt,v,n [Expressiont1,v1,n1 , Expressiont2,v2,n2 ] := Expressiont3,v3,n3 {EQUM}t,n,t1,v1,n1,t2,v2,n2,t3,n3,v3

t1,2,3 //Тип выражения

v1,2,3 //Значение выражения

n1,2,3 // Если переменная, то номер в таблице переменных, n=-1, тогда в v – ссылка.

t //Тип переменной

v // неиспользуется

n // должен быть >0

{EQUM}t,n,t1,v1,n1,t2,v2,n2,t3,n3,v3

if (t совместимо t3) then

{if t2,t3<> boolean, boolmatr)

{ if n>0 then

{ if n3>0 then Z=n3 else Z=v3

if n1>0 then X=n1 else X=v1

if n2>0 then Y=n2 else Y=v2

Выдать триаду вида EQU Z,n

ARG X,Y

}else {Ошибка : ожидалась переменная}

} else {Ошибка в типе индекса}

}else {Ошибка совместимости типов}

  1. N3  got idln {JMP}n

n // номер метки в таблице меток

Выдать на выход триаду вида JMP n,

  1. N3  write ( N11 )

  2. N3  writeln ( N11 ) {WRITELN}

{WRITELN}

Выдать на выход триаду вида WRITE #13#10 ,

  1. N3  write

  2. N3  writeln {WRITELN}

  3. N3  repeatnum1 N2 until Expressiont,v,n {JF}num2, t,v,n

Num2num1 // запомнить номер триады на которую нужно перейти

t // тип выражения

v //Значение выражения

n // Если переменная, то номер в таблице переменных, n=-1, тогда в v – ссылка.

{JF}num2 ,t,v,n

if t=boolean {

if n>0 then X=n else X=v

Выдать на выход триаду вида JF num2, X}

Else { Ошибка типа условия }

  1. N3  N1

  2. N3  read ( idvt,v,n ) {READ}t,v,n

t // тип переменной

v = 0 // неопределено

n // Номер в таблице переменных

if t<>boolmatr then

{ Выдать на выход триаду вида READ n,t}

else {Ошибка типа переменной}

  1. N3  readln ( idvt,v,n )

t // тип переменной

v = 0 // неопределено

n // Номер в таблице переменных

if t<>boolmatr then

{ Выдать на выход триаду вида READ n,t

WRITE #13#10 , }

else {Ошибка типа переменной}

  1. N11  N12t,v,n {WRITE}v,n

t // Тип выражения (строка)

v // Значение

n // Переменная или строка

{WRITE}t,v,n

if t=0 then {X=содержимое строки }

else

if t<>boolmatr then

{ if n>0 then X=n else X=v

Выдать на выход триаду вида WRITE X, }

  1. N11  N11 , N12 t,v,n {WRITE}v,n

// Семантика как в 21

  1. N12t,v,n  strv1

t 0 // Нулевой тип

v v1 // Номер строки

n-2 // n=-2, тогда в v – ссылка на строку.

  1. N12t,v,n  Expressiont1,v1,n1

tt1 // Тип выражения

vv1 // Значение выражения или ссылка на результат выполнения триады

nn1 // Если переменная, то номер в таблице переменных, n=-1, тогда в v – ссылка.

  1. N4  if Expressiont,v,n then {JFL}nl,t,v,n N3 else {JMP}nl2 {DEFL}nl N3 {DEFL}nl2

Семантика как в 2

nl2 // Вторая метка

  1. N4  if Expressiont,v,n then {JFL}nl,t,v,n N3 {DEFL}nl

Семантика как в 2

  1. N4  if Expressiont,v,n then {JFL}nl,t,v,n N3 else {JMP}nl2 {DEFL}nl N4 {DEFL}nl2

Семантика как в 25