Скачиваний:
10
Добавлен:
01.05.2014
Размер:
1.03 Mб
Скачать

Передача атрибутов в дмп-процессоре

Замена нетерминала:

Выталкиваем верхушку стека, не очищая из под нее память, получаем на нее указатель.

В зависимости от кода правила кладем в стек цепочку замены в обратном порядке

Передача атрибутов:

Если атрибут копируется из левой части правила вывода в правую, то копируем данные(так как АТГ имеет форму простого присваивания)

Пример

Xp1, q1Yp2 Zq2

p2  p1//p1 - унаследованный

q2  q1//q1 - унаследованный

Y

123

Z

aa00

X

123

aa00

Если копируется атрибут из символа части X правила вывода в символ, находящийся правее Y, то атрибуту X добавляется ссылка на атрибут Y.

Если необходимо передать атрибут символа из правой части правила вывода в левую, то добавляется все ссылки атрибута левого символа атрибуту правого символа.

Тестирование дмп-процессора

Рассмотрим следующую программу:

program my;

const

con = 1;

label

lab1;

var

a, b : integer;

c, d : rational;

ar : array[1..4] of rational;

begin

c.numerator := 1; c.denominator := 1;

d := c;

a := b + c common d;

if a > c.numerator then begin

a := 1

end else begin

d := simplify c;

end;

ar[ 1 ].numerator := 3;

end.

На выходе мы получим:

Таблица меток:

3

aa01

aa00

lab1

------------

Name |

Таблица типов:

5

1

GENERIC ARRAY N-Ord Nil 2 4 0 0 N-Ord 32

2

GENERIC RANGE Ord Nil Nil 5 1 4 4 4

3

boolean NAMED ENUM Ord Nil Nil Nil 0 1 2 4

4

rational NAMED RAT N-Ord Nil Nil Nil 0 0 N-Ord 8

5

integer NAMED INT Ord Nil Nil Nil -32768 32767 65536 4

-------------------------------------------------------------------------------

Name |Type |Cons |Ord? |Alias|Idx |Base|LeftB |RightB |Variant|Size |

Таблица идентификаторов:

7

1

ar VAR 1 Nil

2

c VAR 4 Nil

3

d VAR 4 Nil

4

a VAR 5 Nil

5

b VAR 5 Nil

6

con CONST 5 1

7

my SYSTEM No type Nil

8

true CONST 3 1

9

false CONST 3 0

-----------------------------------

Name |Mode |TypeIdx| Value|

Программа на ПОЛИЗе:

c

@NUMERATOR

1

@SET

c

@DENOMINATOR

1

@SET

d

c

@SET

a

b

c

d

@COMMON

@ADDINT

@SET

a

c

@NUMERATOR

@>INT

:aa00

@JMPF

a

1

@SET

:aa01

@JMP

:aa00

@DEFL

d

c

@SIMPLIFY

@SET

:aa01

@DEFL

ar

1

2

@SUBS

@NUMERATOR

3

@SET

[Warning]: Label declared, but never used: "lab1"

Рассмотрим детально транслирование фрагмента программы:

ar[ 1 ].numerator

Магазин

Входная цепочка

Выход

VAR

ar[ 1 ].numerator

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

id

ar[ 1 ].numerator

ar

{переменная}

адрес переменной

LE

1

кол-во операндовSUBS

{вычислить адрес}

адрес переменной

кол-во операндов SUBS

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

PAR

входной тип переменной

выходной тип переменной

{переменная}

[ 1 ].numerator

ar

LE

1

кол-во операндовSUBS

{вычислить адрес}

ar

кол-во операндов SUBS

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

PAR

входной тип переменной

выходной тип переменной

[

[ 1 ].numerator

ar

EXP

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

{индекс}

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

{inc}

1

кол-во операндов

SXP

кол-во операндов

кол-во операндов

]

LE

кол-во операндов

кол-во операндов

{вычислить адрес}

ar

кол-во операндов SUBS

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

PAR

входной тип переменной

выходной тип переменной

EXP

1 ].numerator

ar

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

{индекс}

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

{inc}

1

кол-во операндов

SXP

кол-во операндов

кол-во операндов

]

LE

кол-во операндов

кол-во операндов

{вычислить адрес}

ar

кол-во операндов SUBS

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

PAR

входной тип переменной

выходной тип переменной

EXP

1 ].numerator

ar

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

{индекс}

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

{inc}

1

кол-во операндов

SXP

кол-во операндов

кол-во операндов

]

LE

кол-во операндов

кол-во операндов

{вычислить адрес}

ar

кол-во операндов SUBS

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

PAR

входной тип переменной

выходной тип переменной

AE

1 ].numerator

ar

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

SAE

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

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

{индекс}

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

{inc}

1

кол-во операндов

SXP

кол-во операндов

кол-во операндов

]

LE

кол-во операндов

кол-во операндов

{вычислить адрес}

ar

кол-во операндов SUBS

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

PAR

входной тип переменной

выходной тип переменной

ME

1 ].numerator

ar

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

SME

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

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

SAE

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

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

{индекс}

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

{inc}

1

кол-во операндов

SXP

кол-во операндов

кол-во операндов

]

LE

кол-во операндов

кол-во операндов

{вычислить адрес}

ar

кол-во операндов SUBS

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

PAR

входной тип переменной

выходной тип переменной

usi

1 ].numerator

ar

1/ integer

{число}

адрес константы

SME

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

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

SAE

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

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

{индекс}

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

{inc}

1

кол-во операндов

SXP

кол-во операндов

кол-во операндов

]

LE

кол-во операндов

кол-во операндов

{вычислить адрес}

ar

кол-во операндов SUBS

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

PAR

входной тип переменной

выходной тип переменной

{число}

].numerator

ar

1

SME

integer

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

SAE

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

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

{индекс}

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

{inc}

1

кол-во операндов

SXP

кол-во операндов

кол-во операндов

]

LE

кол-во операндов

кол-во операндов

{вычислить адрес}

ar

кол-во операндов SUBS

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

PAR

входной тип переменной

выходной тип переменной

SME

].numerator

ar

1

integer

integer

SAE

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

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

{индекс}

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

{inc}

1

кол-во операндов

SXP

кол-во операндов

кол-во операндов

]

LE

кол-во операндов

кол-во операндов

{вычислить адрес}

ar

кол-во операндов SUBS

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

PAR

входной тип переменной

выходной тип переменной

SAE

].numerator

ar

1

integer

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

{индекс}

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

{inc}

1

кол-во операндов

SXP

кол-во операндов

кол-во операндов

]

LE

кол-во операндов

кол-во операндов

{вычислить адрес}

ar

кол-во операндов SUBS

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

PAR

входной тип переменной

выходной тип переменной

{индекс}

].numerator

ar

1

integer

{inc}

1

кол-во операндов

SXP

кол-во операндов

кол-во операндов

]

LE

кол-во операндов

кол-во операндов

{вычислить адрес}

ar

кол-во операндов SUBS

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

PAR

входной тип переменной

выходной тип переменной

{inc}

].numerator

ar

1

1

кол-во операндов

SXP

кол-во операндов

кол-во операндов

]

LE

кол-во операндов

кол-во операндов

{вычислить адрес}

ar

кол-во операндов SUBS

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

PAR

входной тип переменной

выходной тип переменной

SXP

].numerator

ar

1

2

кол-во операндов

]

LE

кол-во операндов

кол-во операндов

{вычислить адрес}

ar

кол-во операндов SUBS

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

PAR

входной тип переменной

выходной тип переменной

]

].numerator

ar

1

LE

2

кол-во операндов

{вычислить адрес}

ar

кол-во операндов SUBS

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

PAR

входной тип переменной

выходной тип переменной

LE

.numerator

ar

1

2

кол-во операндов

{вычислить адрес}

ar

кол-во операндов SUBS

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

PAR

входной тип переменной

выходной тип переменной

{вычислить адрес}

.numerator

ar

1

ar

2

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

PAR

входной тип переменной

выходной тип переменной

{вычислить адрес}

.numerator

ar

1

ar

2

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

PAR

входной тип переменной

выходной тип переменной

PAR

.numerator

ar

1

2

@SUBS

rational

выходной тип переменной

.

.numerator

ar

1

2

@SUBS

numerator

{числитель}

rational

выходной тип переменной

.

.numerator

ar

1

2

@SUBS

numerator

{числитель}

rational

выходной тип переменной

numerator

numerator

ar

1

2

@SUBS

{числитель}

rational

выходной тип переменной

{числитель}

ar

1

2

@SUBS

rational

выходной тип переменной

ar

1

2

@SUBS

@NUMERATOR

45

Соседние файлы в папке Бяша