5. Атрибутный преобразователь

5.1 Построение функций переходов АП

Порядок построения АТ - преобразователя по заданной LАТ-грамматике в форме простого присваивания выглядит следующим образом:

  1. Удалим из правил заданной LАТ-грамматики все атрибуты и правила их вычисления. В результате получим транслирующую грамматику.

  1. Для полученной транслирующей грамматики построим преобразователь. Учитывая, что такой преобразователь в дальнейшем должен быть использован для работы с атрибутами, внесем следующие изменения в правила его построения:

а) чтобы первая команда преобразователя могла установить начальные значения последующих атрибутов начального символа грамматики, в качестве начальной примем конфигурацию следующего вида:

(s0 , <заданная цепочка>, h 0 ),

б) откажемся от совмещения команд для правил вида <А> --> b  , где b является терминалом, имеющим атрибут, и  - некоторая цепочка из терминальных и нетерминальных символов, используя вместо команды

f(s0, b,<A>) = (s0, R)

две команды

f * 0(s0, b, <A>) = (s0, Rb)

f(s0, b, b) = (s0, $),

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

*( S, {, h0 ) = ( S, h0<I>, $ )

( S, {, <i> ) = ( S, }<опер.> <опис.> ,$)

( S, "<arr>" , <массив b> ) = ( S, "</arr>" "{фмб}" <r3> "{зрм}" "<ч.>" " " "<ид.>" ,$)

( S, "<arr>" , <массив c> ) = ( S, "</arr>" "{фмч}" <r3> "{зрм}" "<ч.>" " " "<ид.>" ,$)

( S, " " , <r3> ) = ( S, <r3> "{зрм}" "<ч.>" ,$)

( S, "<marr>" , <эл.мас.> ) = ( S, "</marr>" "{футзэм}" <r4> "{фсд}" "<ч.>" " " "<ид.>" ,$)

( S, " " , <r4> ) = ( S, <r4> "{фсд}" "<ч.>" ,$)

( S, "<bool>" , <опис.> ) = ( S, <r5> ;"</bool>" <тип bool> ,$)

( S, "<char>" , <опис.> ) = ( S, <r5> ;"</char>" <тип char> ,$)

*( S, "<ид.>" , <тип bool> ) = ( S, <r6> "{впб}" "<ид.>" ,$)

( S, "<ass>" , <тип bool> ) = ( S, <r6> "</ass>" <класс bool> ,$)

*( S, "<ид.>" , <класс bool> ) = ( S, "{зтз}" "<константа>" " " "{впб}" "<ид.>" ,$)

( S, "<iarr>" , <иниц.мас.bool> ) = ( S, "</iarr>" <константы> ,$)

*( S, "<константа>" , <константы> ) = ( S, <r7> "{зтзмб}" "<константа>" ,$)

( S, " " , <r7> ) = ( S, <r7> "{зтзмб}" "<константа>" ,$)

( S, "," , <r6> ) = ( S, <тип bool> ,$)

*( S, "<ид.>" , <тип char> ) = ( S, <r8> "{впч}" "<ид.>" ,$)

( S, "<ass>" , <тип char> ) = ( S, <r8> "</ass>" <класс char> ,$)

*( S, "<ид.>" , <класс char> ) = ( S, "{зтз}" "<символ>" " " "{впч}" "<ид.>" ,$)

( S, "<iarr>" , <иниц.мас.char> ) = ( S, "</iarr>" <символы> ,$)

*( S, "<символ>" , <символы> ) = ( S, <r9> "{зтзмч}" "<символ>" ,$)

( S, " " , <r9> ) = ( S, <r9> "{зтзмч}" "<символ>" ,$)

( S, "," , <r8> ) = ( S, <тип char> ,$)

( S, "<ass>" , <опер.> ) = ( S, <r10>; "</ass>" "{фat=}" <Л.опер.>" "<Оп1> ,$)

*( S, "<ид.>" , <оп1> ) = ( S, "{футзи}" "<ид.>" ,$)

( S, "<and>" , <л.опер.> ) = ( S, "</and>" "{ук}" "{фat&}" <оп2> " " <оп2> ,$)

( S, "<or>" , <л.опер.> ) = ( S, "</or>" "{ук}" "{фatv}" <оп2> " " <оп2> ,$)

( S, "<not>" , <л.опер.> ) = ( S, "</not>" "{ук}" "{фat!}" <оп2> ,$)

*( S, "<символ>" , <оп2> ) = ( S, "<символ>" ,$)

*( S, "<константа>" , <оп2> ) = ( S, "<константа>" ,$)

*( S, "<ид.>" , <оп2> ) = ( S, "{футзи}" "<ид.>" ,$)

*( S, "<bool>" , <r5> ) = ( S, <опис.> ,$)

*( S, "<char>" , <r5> ) = ( S, <опис.> ,$)

*( S, "<arr>" , <тип bool> ) = ( S, <r6> <массив b> ,$)

*( S, "<arr>" , <класс bool> ) = ( S, <иниц.мас.bool> <массив b> ,$)

*( S, "<arr>" , <тип char> ) = ( S, <r8> <массив c> ,$)

*( S, "<arr>" , <класс char> ) = ( S, <иниц.мас.char> <массив b> ,$)

*( S, "<marr>" , <оп1> ) = ( S, <эл.мас.> ,$)

*( S, "<marr>" , <оп2> ) = ( S, <эл.мас.> ,$)

*( S, "<and>" , <оп2> ) = ( S, <л.опер.> ,$)

*( S, "<or>" , <оп2> ) = ( S, <л.опер.> ,$)

*( S, "<not>" , <оп2> ) = ( S, <л.опер.> ,$)

*( S, "<ass>" , <r10> ) = ( S, <опер.> ,$)

*( S, "{фмч}" , <r3> ) = ( S, $ ,$)

*( S, "{фмб}" , <r3> ) = ( S, $ ,$)

*( S, "{футзэм}" , <r4> ) = ( S, $ ,$)

*( S, "<ass>" , <r5> ) = ( S, $ ,$)

*( S, "</iarr>" , <r7> ) = ( S, $ ,$)

*( S, "</bool>" , <r6> ) = ( S, $ ,$)

*( S, "</iarr>" , <r9> ) = ( S, $ ,$)

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

*( S, }, <r10> ) = ( S, $ ,$)

( S, }, }) = ( S, $ ,$)

( S, "<ид.>" , "<ид.>" ) = ( S, $ ,$)

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

( S, "<ч.>" , "<ч.>" ) = ( S, $ ,$)

( S, "{зрм}" , "{зрм}" ) = ( S, $ ,$)

( S, "{фмб}" , "{фмб}" ) = ( S, $ ,$)

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

( S, "{фмч}" , "{фмч}" ) = ( S, $ ,$)

( S, "{фсд}" , "{фсд}" ) = ( S, $ ,$)

( S, "{футзэм}" , "{футзэм}" ) = ( S, $ ,$)

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

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

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

( S, ;, ;) = ( S, $ ,$)

( S, "{впб}" , "{впб}" ) = ( S, $ ,$)

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

( S, "<константа>" , "<константа>" ) = ( S, $ ,$)

( S, "{зтз}" , "{зтз}" ) = ( S, $ ,$)

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

( S, "{зтзмб}" , "{зтзмб}" ) = ( S, $ ,$)

( S, "{впч}" , "{впч}" ) = ( S, $ ,$)

( S, "<символ>" , "<символ>" ) = ( S, $ ,$)

( S, "{зтзмч}" , "{зтзмч}" ) = ( S, $ ,$)

( S, "{фat=}" , "{фat=}" ) = ( S, $ ,$)

( S, "{футзи}" , "{футзи}" ) = ( S, $ ,$)

( S, "{фat&}" , "{фat&}" ) = ( S, $ ,$)

( S, "{ук}" , "{ук}" ) = ( S, $ ,$)

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

( S, "{фatv}" , "{фatv}" ) = ( S, $ ,$)

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

( S, "{фat!}" , "{фat!}" ) = ( S, $ ,$)

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

( S, { , { ) = ( S, $ ,$)

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

( S, , h0) = ( S1, $ ,$)

Теперь построим инструкции

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

{

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

B1 A1 <I>

stack[sp-1]=a //a-начальное значение атрибута A1

}

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

{

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

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

‘}’ B3 A3 <Опер.> B2 A2 <Опис.>

stack[sp-1]=-6

stack[sp-2]=-2

stack[sp-5]=-3

}

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

{

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

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

‘</arr>’ X5 B5 A5 {ФМБ} R3 X4 <R3> R2 R1 Y2 X3 {ЗРЗ} Y1 <Ч.>’ ‘X2 <Ид.>

stack[sp-1]=-5

stack[sp-4]=-3

stack[sp-6]=-5

stack[sp-8]=0

stack[sp-9]=-3

stack[sp-11]=-5

stack[sp-14]=-4

stack[sp-15]=-4

stack[sp-16]=-4

}

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

{

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

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

‘</arr>’ X10 B7 A7 {ФМЧ} R6 X9 <R3> R5 R4 Y4 X8 {ЗРЗ} Y3 <Ч.>’ ‘X7 <Ид.>

stack[sp-1]=-5

stack[sp-4]=-3

stack[sp-6]=-5

stack[sp-8]=0

stack[sp-9]=-3

stack[sp-11]=-5

stack[sp-14]=-4

stack[sp-15]=-4

stack[sp-16]=-4

}

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

{

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

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

R10 X13 <R3> R9 R8 Y6 X12 {ЗРМ} Y5 <Ч.>

stack[sp-1]=-3

stack[sp-3]=-5

stack[sp-5]=-6

stack[sp-6]=-3

stack[sp-8]=-2

}

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

{

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

}

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

{

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

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

‘</marr>’T2 P5 X18{ФУТЗЭМ}P4 P3 R14 X17<R4>P2 P1 R13 R12 Y8 X16{ФСД}Y7<Ч.>’ ‘X15<Ид.>

stack[sp-1]=-5

stack[sp-4]=-3

stack[sp-6]=-7

stack[sp-8]=0

stack[sp-9]=-6

stack[sp-10]=0

stack[sp-11]=-4

stack[sp-13]=-5

stack[sp-16]=-3

stack[sp-20]=-2

}

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

{

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

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

P11 P10 R18 X21 <R4> P9 P8 R17 R16 Y10 X20 {ФСД} Y9 <Ч.>

stack[sp-1]=-3

stack[sp-3]=-7

stack[sp-5]=-10

stack[sp-6]=-5

stack[sp-7]=-9

stack[sp-8]=-4

stack[sp-10]=-4

stack[sp-13]=-4

}

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

{

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

stack[sp-3]=-2

}

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

{

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

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

B10 A10 <R5> ’;’ ‘</bool> B9 A9 <Тип Bool>

stack[sp-1]=-7

stack[sp-2]=-4

stack[sp-7]=-2

}

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

{

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

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

B13 A13 <R5> ’;’ ‘</bool> B12 A12 <Тип Bool>

stack[sp-1]=-7

stack[sp-2]=-4

stack[sp-7]=-2

}

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

{

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

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

B16 A16 <R6> X24 B15 A15 {ВПБ} X23 <Ид.>

stack[sp-1]=-4

stack[sp-3]=-6

stack[sp-4]=-3

stack[sp-8]=-2

}

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

{

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

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

B19 A19 <R6> X25 B18 A18 <Массив b>

stack[sp-1]=-6

stack[sp-2]=-3

stack[sp-6]=-2

}

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

{

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

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

B22 A22 <R6> ‘</ass>’ B21 A21 <Класс Bool>

stack[sp-1]=-6

stack[sp-2]=-3

stack[sp-6]=-2

}

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

{

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

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

Z2 X28{ЗТЗ}Z1<Константа>’ ‘X27 B24 A24{ВПБ}X26<Ид.>

stack[sp-1]=-4

stack[sp-3]=-9

stack[sp-4]=-9

stack[sp-5]=-5

stack[sp-8]=-3

}]

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

{

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

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

X30 <Иниц.мас.Bool>X29 B26 A26<Массив b>

stack[sp-1]=-5

stack[sp-2]=-5

stack[sp-3]=-2

}

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

{

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

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

‘</iarr>’X32<Константы>

stack[sp-1]=-2

}

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

{

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

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

P16 X35 <R7> P15 P14 Z4 X34{ЗТЗМБ}Z3<Константа>

stack[sp-1]=-3

stack[sp-3]=-5

stack[sp-5]=0

stack[sp-6]=-3

stack[sp-8]=-2

}

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

{

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

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

P20 X38 <R7> P19 P18 Z6 X38 {ЗТЗМБ}Z5<Константа>

stack[sp-1]=-3

stack[sp-3]=-5

stack[sp-5]=-6

stack[sp-6]=-3

stack[sp-8]=-2

}

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

{

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

}

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

{

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

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

B28 A28 <Тип Bool>

stack[sp-1]=-2

stack[sp-2]=-2

}

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

{

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

stack[sp-0]=-1

}

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

{

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

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

B32 A32 <R8> X41 B31 A31 {ВПЧ} X40 <Ид.>

stack[sp-1]=-4

stack[sp-3]=-6

stack[sp-4]=-3

stack[sp-8]=-2

}

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

{

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

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

B35 A35 <R8> X42 B34 A34 <Массив c>

stack[sp-1]=-6

stack[sp-2]=-3

stack[sp-6]=-2

}

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

{

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

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

B38 A38 <R8> ‘</ass>’ B37 A37 <Класс Char>

stack[sp-1]=-6

stack[sp-2]=-3

stack[sp-6]=-2

}

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

{

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

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

С2 X45{ЗТЗ}С1<Символ>’ ‘X44 B40 A40{ВПБ}X40<Ид.>

stack[sp-1]=-4

stack[sp-3]=-9

stack[sp-4]=-9

stack[sp-5]=-5

stack[sp-8]=-3

}]

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

{

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

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

X47 <Иниц.мас.Char>X46 B42 A42<Массив c>

stack[sp-1]=-5

stack[sp-2]=-5

stack[sp-3]=-2

}

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

{

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

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

‘</iarr>’X49<Символы>

stack[sp-1]=-2

}

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

{

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

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

P24 X52 <R9> P23 P22 C4 X51{ЗТЗМБ}C3<Символ>

stack[sp-1]=-3

stack[sp-3]=-5

stack[sp-5]=0

stack[sp-6]=-3

stack[sp-8]=-2

}

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

{

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

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

P28 X55 <R9> P23 P22 C6 X54 {ЗТЗМБ}C5<Символ>

stack[sp-1]=-3

stack[sp-3]=-5

stack[sp-5]=-6

stack[sp-6]=-3

stack[sp-8]=-2

}

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

{

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

}

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

{

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

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

B44 A44 <Тип Char>

stack[sp-1]=-2

stack[sp-2]=-2

}

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

{

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

stack[sp-0]=-1

}

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

{

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

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

B47 A47 <Опис.>

stack[sp-1]=-2

stack[sp-2]=-2

}

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

{

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

stack[sp-0]=-1

}

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

{

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

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

B51 A51 <R10>’;’’</ass>’ T7 T6 T5{ФАТ=}T4 B50 A50 <Л.Опер.>’ ‘T3<Оп.1>

stack[sp-1]=-7

stack[sp-4]=-12

stack[sp-5]=-9

stack[sp-6]=-3

stack[sp-8]=-2

stack[sp-15]=-2

}

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

{

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

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

T9 X58 {ФУТЗИ}X57 <Ид.>

stack[sp-1]=-2

stack[sp-4]=-1

}

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

{

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

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

T11 <Эл.мас.>

stack[sp-1]=-1

}

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

{

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

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

‘</and>’B56 B55{УК}T17 T16 T15{ФАТ&}T14 B54 A54<Оп.2>’ ‘T13 B53 A53 <Оп.2>

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

}

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

{

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

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

‘</or>’B61 B60{УК}T23 T22 T21{ФАТV}T20 B59 A59<Оп.2>’ ‘T19 B58 A58 <Оп.2>

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

}

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

{

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

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

‘</not>’B65 B64{УК}T28 T27 T26{ФАТ!}T25 B63 A63 <Оп.2>

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]=-3

}

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

{

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

C7 <Символ>

stack[sp-1]=-3

stack[sp-2]=-1

}

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

{

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

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

Z7 <Константа>

stack[sp-1]=-3

stack[sp-2]=-1

}

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

{

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

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

T32 B69 A69 <Л.Опер.>

stack[sp-1]=-3

stack[sp-2]=-3

stack[sp-3]=-3

}

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

{

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

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

T34 X60 {ФУТЗИ}X59<Ид.>

stack[sp-1]=-2

stack[sp-4]=-3

stack[sp-5]=-1

}

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

{

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

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

T36 <Эл.мас.>

stack[sp-1]=-3

stack[sp-2]=-3

}

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

{

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

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

B73 A73 <Опер.>

stack[sp-1]=-2

stack[sp-2]=-2

}

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

{

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

stack[sp-0]=-1

}

Окончательные функции переходов АП.

*( S, {, h0 ) = ( S, #1#)

( S, {, <i> ) = ( S, #2#)

( S, "<arr>" , <массив b> ) = ( S, #3#)

( S, "<arr>" , <массив c> ) = ( S, #4#)

( S, " " , <r3> ) = ( S, <r3> "{зрм}" "<ч.>" ,#5#)

( S, "<marr>" , <эл.мас.> ) = ( S, #7#)

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

( S, "<bool>" , <опис.> ) = ( S, #10#)

( S, "<char>" , <опис.> ) = ( S, #11#)

*( S, "<ид.>" , <тип bool> ) = ( S, #12#)

( S, "<ass>" , <тип bool> ) = ( S, #14#)

*( S, "<ид.>" , <класс bool> ) = ( S, #15#)

( S, "<iarr>" , <иниц.мас.bool> ) = ( S, #17#)

*( S, "<константа>" , <константы> ) = ( S, #18#)

( S, " " , <r7> ) = ( S, #19#)

( S, "," , <r6> ) = ( S, #21#)

*( S, "<ид.>" , <тип char> ) = ( S, #23#)

( S, "<ass>" , <тип char> ) = ( S, #25#)

*( S, "<ид.>" , <класс char> ) = ( S, #26#)

( S, "<iarr>" , <иниц.мас.char> ) = ( S, #28#)

*( S, "<символ>" , <символы> ) = ( S, #29#)

( S, " " , <r9> ) = ( S, #30#)

( S, "," , <r8> ) = ( S, <тип char> , #32#)

( S, "<ass>" , <опер.> ) = ( S, #36#)

*( S, "<ид.>" , <оп1> ) = ( S, #37#)

( S, "<and>" , <л.опер.> ) = ( S, #39#)

( S, "<or>" , <л.опер.> ) = ( S, #40#)

( S, "<not>" , <л.опер.> ) = ( S, #41#)

*( S, "<символ>" , <оп2> ) = ( S, #42#)

*( S, "<константа>" , <оп2> ) = ( S, #43#)

*( S, "<ид.>" , <оп2> ) = ( S, #45#)

*( S, "<bool>" , <r5> ) = ( S, #34#)

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

*( S, "<arr>" , <тип bool> ) = ( S, #13#)

*( S, "<arr>" , <класс bool> ) = ( S, #16#)

*( S, "<arr>" , <тип char> ) = ( S, #24#)

*( S, "<arr>" , <класс char> ) = ( S, ## 27)

*( S, "<marr>" , <оп1> ) = ( S, #38#)

*( S, "<marr>" , <оп2> ) = ( S, #46#)

*( S, "<and>" , <оп2> ) = ( S, #39#)

*( S, "<or>" , <оп2> ) = ( S, #40#)

*( S, "<not>" , <оп2> ) = ( S, #41#)

*( S, "<ass>" , <r10> ) = ( S, #47#)

*( S, "{фмч}" , <r3> ) = ( S, #6#)

*( S, "{фмб}" , <r3> ) = ( S, #6#)

*( S, "{футзэм}" , <r4> ) = ( S, #9#)

*( S, "<ass>" , <r5> ) = ( S, #34#)

*( S, "</iarr>" , <r7> ) = ( S, #20#)

*( S, "</bool>" , <r6> ) = ( S, #22#)

*( S, "</iarr>" , <r9> ) = ( S, #31#)

*( S, "</char>" , <r8> ) = ( S, #35#)

*( S, }, <r10> ) = ( S, #48#)

( S, }, }) = ( S, $ ,$)

( S, "<ид.>" , "<ид.>" ) = ( S, $ ,$)

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

( S, "<ч.>" , "<ч.>" ) = ( S, $ ,$)

( S, "{зрм}" , "{зрм}" ) = ( S, $ ,$)

( S, "{фмб}" , "{фмб}" ) = ( S, $ ,$)

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

( S, "{фмч}" , "{фмч}" ) = ( S, $ ,$)

( S, "{фсд}" , "{фсд}" ) = ( S, $ ,$)

( S, "{футзэм}" , "{футзэм}" ) = ( S, $ ,$)

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

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

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

( S, ;, ;) = ( S, $ ,$)

( S, "{впб}" , "{впб}" ) = ( S, $ ,$)

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

( S, "<константа>" , "<константа>" ) = ( S, $ ,$)

( S, "{зтз}" , "{зтз}" ) = ( S, $ ,$)

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

( S, "{зтзмб}" , "{зтзмб}" ) = ( S, $ ,$)

( S, "{впч}" , "{впч}" ) = ( S, $ ,$)

( S, "<символ>" , "<символ>" ) = ( S, $ ,$)

( S, "{зтзмч}" , "{зтзмч}" ) = ( S, $ ,$)

( S, "{фat=}" , "{фat=}" ) = ( S, $ ,$)

( S, "{футзи}" , "{футзи}" ) = ( S, $ ,$)

( S, "{фat&}" , "{фat&}" ) = ( S, $ ,$)

( S, "{ук}" , "{ук}" ) = ( S, $ ,$)

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

( S, "{фatv}" , "{фatv}" ) = ( S, $ ,$)

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

( S, "{фat!}" , "{фat!}" ) = ( S, $ ,$)

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

( S, { , { ) = ( S, $ ,$)

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

( S, , h0) = ( S1, $ ,$)

5.3 Описание работы АП

Итак, для построения левого вывода LАТ - грамматики в магазине при каждом применении правила необходимо построить фрагмент магазина, соответствующий правой части правила, и установить связи атрибутов правой части правила с атрибутами заменяемой левой части правила, которые в момент замены находятся непосредственно под вершиной магазина. В результате установки связи в элементы магазина, определяющие значения наследуемых атрибутов, должны быть записаны указатели на элементы магазина, в которые нужно поместить значения этих атрибутов, а в элементы, соответствующие синтезируемым атрибутам, должны быть занесены указатели на элементы магазина, в которых будут расположены значения этих атрибутов. При этом в магазине могут образовываться цепочки указателей, ссылающихся друг на друга, которые соответствуют отложенным присваиваниям и последовательностям стрелок в графическом представлении вывода. Вывод в атрибутных грамматиках совмещается с вычислением значений атрибутов. Если грамматика задана в форме простого присваивания, то вычисление значений атрибутов осуществляется при выполнении символов действия. Полученные в результате вычисления значения атрибутов должны заноситься в отведенные этим атрибутам элементы магазина, а также во все элементы,связанные с ними цепочкой указателей.

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

Правила вычисления значений атрибутов:

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

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

  3. Если источником копирующего правила является константа, то ее значение заносится в поле, соответствующее приемнику.

  4. Если приемниками копирующего правила являются несколько атрибутов (множественное присваивание), то они связываются цепочкой указателей.

5.4 Фрагмент работы АП

Соседние файлы в папке Курсовой проект по дисциплине Формальные грамматики, языки и автоматы