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

5.2. Построение инструкций атрибутного преобразователя.

Для каждого правила заданной атрибутной грамматики необходимо построить инструкции, выполняемые при записи правила в магазин. Затем нужно все инструкции пронумеровать,

обозначив их # N.

Инструкции атрибутного преобразователя :

Инструкция #1

{

Записать в магазин цепочку

b1a1 <I>

stack[sp-1]:=a//a– начальное значение атрибута а1 (указатель на первую своб. ячеку ТЗ)

}

Инструкция #2

{

Удалить символ из магазина

Записать в магазин цепочку

b3 a3 <Code> b2 a2 <Vars>

stack [sp-1]:=-5

stack [sp-2]:=-2

stack [sp-5]:=-2

}

Инструкция #3

{

Удалить символ из магазина

Записать в магазин цепочку

‘</arr>’ x4 b5 a5 {FMB} y2 x3 {WrRM} y1 <Chislo> ‘,’ x2 <Id>

stack [sp-1]:=-5

stack [sp-4]:=-3

stack [sp-6]:=-5

stack [sp-9]:=-3

stack [sp-10]:=-3

stack [sp-11]:=-3

}

Инструкция #4

{

Удалить символ из магазина

Записать в магазин цепочку

‘</arr>’ x8 b7 a7 {FMC} y4 x7 {WrRM} y3 <Chislo> ‘,’ x6 <Id>

stack [sp-1]:=-5

stack [sp-4]:=-3

stack [sp-6]:=-5

stack [sp-9]:=-3

stack [sp-10]:=-3

stack [sp-11]:=-3

}

Инструкция #5

{

Удалить символ из магазина

Записать в магазин цепочку

‘</earr>’ t2 y6 x10 {FUkTZEM} y5 <Chislo> ‘,’ x9 <Id>

stack [sp-1]:=-4

stack [sp-3]:=-3

stack [sp-7]:=-7 }

Инструкция #6

{

Удалить символ из магазина

Записать в магазин цепочку

b10 a10 <R3> ‘</boolean>’ b9 a9 <NamesBool>

stack [sp-1]:=-6

stack [sp-2]:=-3

stack [sp-6]:=-2

}

Инструкция #7

{

Удалить символ из магазина

Записать в магазин цепочку

b13 a13 <R3> ‘</char>’ b12 a12 <NamesChar>

stack [sp-1]:=-6

stack [sp-2]:=-3

stack [sp-6]:=-2

}

Инструкция #8

{

Удалить символ из магазина

Записать в магазин цепочку

b19 a19 <R4> x12 b18 a18 {NewB} x11 <Id>

stack [sp-1]:=-4

stack [sp-3]:=-6

stack [sp-4]:=-3

stack[sp-8]:=-2

}

Инструкция #9

{

Удалить символ из магазина

Записать в магазин цепочку

b24a24 <NamesBool>

stack [sp-1]:=-2

stack [sp-2]:=-2

}

Инструкция #10

{

Удалить символ из магазина

Записать в магазин цепочку

b28 a28 <R5> x15 b27 a27 {NewC} x14 <Id>

stack [sp-1]:=-4

stack [sp-3]:=-6

stack [sp-4]:=-3

stack[sp-8]:=-2

}

Инструкция #11

{

Удалить символ из магазина

Записать в магазин цепочку

b33 a33 <NamesChar>

stack [sp-1]:=-2

stack [sp-2]:=-2

}

Инструкция #12

{

Удалить символ из магазина

Записать в магазин цепочку

b37 a37 <R6> ‘</ass>’ t7 t6 t5 {FAt=} t4 b36 a36 <Vyrazh> ‘,’ t3 <Perem>

stack [sp-1]:=-7

stack [sp-4]:=-11

stack [sp-5]:=-8

stack [sp-6]:=-3

stack [sp-8]:=-2

stack [sp-14]:=-2

}

Инструкция #13

{

Удалить символ из магазина

Записать в магазин цепочку

t9 x18 {FUkTZId} x17 <Id>

stack [sp-1]:=-2

stack [sp-4]:=-1

}

Инструкция #14

{

Удалить символ из магазина

Записать в магазин цепочку

z1 <Const>

stack [sp-1]:=-3

stack [sp-2]:=-1

}

Инструкция #15

{

Удалить символ из магазина

Записать в магазин цепочку

c1 <Simvol>

stack [sp-1]:=-3

stack [sp-2]:=-1

}

Инструкция #16

{

Удалить символ из магазина

Записать в магазин цепочку

‘</and>’ b46 a46 {NextZ} t23 t22 t21 {FAt&} t20 b45 a45 <Operand> ‘,’ t19 b44 a44 <Operand>

stack [sp-1]:=-16

stack [sp-2]:=-4

stack [sp-3]:=-7

stack [sp-7]:=-5

stack [sp-8]:=-3

stack [sp-12]:=-2

stack [sp-14]:=-5

stack[sp-15]:=-3

}

Инструкция #17

{

Удалить символ из магазина

Записать в магазин цепочку

‘</or>’ b50 a50 {NextZ} t29 t28 t27 {FAtV} t26 b49 a49 <Operand> ‘,’ t25 b48 a48 <Operand>

stack [sp-1]:=-16

stack [sp-2]:=-4

stack [sp-3]:=-7

stack [sp-7]:=-5

stack [sp-8]:=-3

stack [sp-12]:=-2

stack [sp-14]:=-5

stack[sp-15]:=-3

}

Инструкция #18

{

Удалить символ из магазина

Записать в магазин цепочку

‘</not>’ b53 a53 {NextZ} t34 t33 t32 {FAt!} t31 b52 a52 <Operand>

stack [sp-1]:=-11

stack [sp-2]:=-5

stack [sp-3]:=-2

stack [sp-6]:=Null

stack [sp-7]:=-2

stack [sp-9]:=-5

stack [sp-10]:=-2

}

Инструкция #19

{

Удалить символ из магазина

Записать в магазин цепочку

z2 <Const>

stack [sp-1]:=-3

stack [sp-2]:=-1

}

Инструкция #20

{

Удалить символ из магазина

Записать в магазин цепочку

b15 a15 <Vars>

stack [sp-1]:=-2

stack [sp-2]:=-2

}

Инструкция #21

{

Удалить символ из магазина

Записать в магазин цепочку

b22 a22 <R4> x13 b21 a21 <MasBool>

stack [sp-1]:=-6

stack [sp-2]:=-3

stack [sp-6]:=-2

}

Инструкция #22

{

Удалить символ из магазина

Записать в магазин цепочку

b31 a31 <R5> x16 b30 a30 <MasChar>

stack [sp-1]:=-6

stack [sp-2]:=-3

stack [sp-6]:=-2

}

Инструкция #23

{

Удалить символ из магазина

Записать в магазин цепочку

t11 <ElMas>

stack [sp-1]:=-1

}

Инструкция #24

{

Удалить символ из магазина

Записать в магазин цепочку

t15 <Perem>

stack [sp-1]:=-3

stack [sp-2]:=-1 }

Инструкция #25

{

Удалить символ из магазина

Записать в магазин цепочку

t17 b42 a42 <Operation>

stack [sp-1]:=-3

stack [sp-2]:=-3

stack [sp-3]:=-3 }

Инструкция #26

{

Удалить символ из магазина

Записать в магазин цепочку

t36 b55 a55 <Operation>

stack [sp-1]:=-3

stack [sp-2]:=-3

stack [sp-3]:=-3

}

Инструкция #27

{

Удалить символ из магазина

Записать в магазин цепочку

t38 <Perem>

stack [sp-1]:=-3

stack [sp-2]:=-1

}

Инструкция #28

{

Удалить символ из магазина

Записать в магазин цепочку

b59 a59 <Code>

stack [sp-1]:=-2

stack[sp-2]:=-2

}

Инструкция #29

{

Удалить символ из магазина

stack[sp]:=-1

}

Преобразуем команды символьного преобразователя.

Для этого необходимо заменить цепочки, записываемые в магазин символьным преобразователем, инструкциями атрибутного преобразователя:

(S, <входной символ>, <вершина магазина>) = (S, <номер выполняемой инструкции>)

Функции переходов атрибутного преобразователя :

*( S, <char>, [] ) = ( S, #1 )

*( S, <boolean>, [] ) = ( S, #1 )

( S, "<arr>" , <masbool> ) = ( S, #3 )

( S, "<arr>" , <maschar> ) = ( S,#4 )

( S, "<earr>" , <elmas> ) = ( S, #5 )

( S, "<boolean>" , <vars> ) = ( S, #6 )

( S, "<char>" , <vars> ) = ( S, #7 )

*( S, "<id>" , <namesbool> ) = ( S, #8 )

( S, "," , <r4> ) = ( S, #9 )

*( S, "<id>" , <nameschar> ) = ( S, #10 )

( S, "," , <r5> ) = ( S, #11 )

( S, "<ass>" , <code> ) = ( S, #12 )

*( S, "<id>" , <perem> ) = ( S, #13 )

*( S, "<const>" , <vyrazh> ) = ( S, #14 )

*( S, "<simvol>" , <vyrazh> ) = ( S, #15 )

( S, "<and>" , <operation> ) = ( S, #16 )

( S, "<or>" , <operation> ) = ( S, #17 )

( S, "<not>" , <operation> ) = ( S, #18 )

*( S, "<const>" , <operand> ) = ( S, #19 )

*( S, "<boolean>" , <i> ) = ( S, #2 )

*( S, "<char>" , <i> ) = ( S, #2 )

*( S, "<boolean>" , <r3> ) = (S, #20 )

*( S, "<char>" , <r3> ) = (S, #20 )

*( S, "<arr>" , <namesbool> ) = ( S, #21 )

*( S, "<arr>" , <nameschar> ) = ( S, #22 )

*( S, "<earr>" , <perem> ) = ( S, #23 )

*( S, "<id>" , <vyrazh> ) = ( S, #24 )

*( S, "<earr>" , <vyrazh> ) = ( S, #24 )

*( S, "<and>" , <vyrazh> ) = ( S, #25 )

*( S, "<or>" , <vyrazh> ) = ( S, #25 )

*( S, "<not>" , <vyrazh> ) = ( S, #25 )

*( S, "<and>" , <operand> ) = ( S, #26 )

*( S, "<or>" , <operand> ) = ( S, #26 )

*( S, "<not>" , <operand> ) = ( S, #26 )

*( S, "<id>" , <operand> ) = ( S, #27 )

*( S, "<earr>" , <operand> ) = ( S, #27 )

*( S, "<ass>" , <r6> ) = ( S, <code> , #28 )

*( S, "<ass>" , <r3> ) = ( S, #29 )

*( S, "</boolean>" , <r4> ) = ( S, #29 )

*( S, "</char>" , <r5> ) = ( S, #29 )

*( S, -|, <r6> ) = ( S, #29 )

( S, "," , "," ) = ( S , $ , $ )

( S, "<id>" , "<id>" ) = ( S , $ , $ )

( S, "<chislo>" , "<chislo>" ) = ( S , $ , $ )

( S, "</ass>" , "</ass>" ) = ( S , $ , $ )

( S, "</arr>" , "</arr>" ) = ( S , $ , $ )

( S, "</earr>", "</earr>" ) = ( S , $ , $ )

( S, "</boolean>" , "</boolean>" ) = ( S , $ , $ )

( S, "</char>" , "</char>" ) = ( S , $ , $ )

( S, "</and>" , "</and>" ) = ( S , $ , $ )

( S, "</or>" , "</or>" ) = ( S , $ , $ )

( S, "</not>" , "</not>" ) = ( S , $ , $ )

*( S, "{WrRM}", "{WrRM}") = (S, $, $ )

*( S, "{FMB}", "{FMB}") = (S, $, $ )

*( S, "{FMC}", "{FMC}") = (S, $, $ )

*( S, "{NewB}", "{NewB}") = (S, $, $ )

*( S, "{NewC}", "{NewC}") = (S, $, )

*( S, "{FUkTZEM}", "{FUkTZEM}") = (S, $, $ )

*( S, "{FUkTZId}", "{FUkTZId}") = (S, $, $ )

*( S, "{FAt=}", "{FAt=}") = (S, $, $ )

*( S, "{FAt&}", "{FAt&}") = (S, $, $ )

*( S, "{FAtV}", "{FAtV}") = (S, $, $ )

*( S, "{FAt!}", "{FAt!} ") = (S, $, $ )

*( S, "{NextZ}", "{NextZ}") = (S, $, $ )

( S, -|, [] ) = ( S1, $, $ )

При таком представлении команд в цепочках отсутствуют выходные символы. Предполагается, что формирование выходной цепочки должно выполняться символами действия.

45