- •Задание
- •Символьный преобразователь
- •Входная грамматика
- •Функции переходов преобразователя
- •Лексический анализатор
- •Грамматика лексических единиц
- •Диаграмма состояний
- •Структуры данных и таблицы
- •Семантика анализа и символы действия.
- •3.5 Спецификация функций
- •3.6 Структура программы
- •Синтаксический анализатор
- •4.1 Неформальное описание семантики
- •4.2 Атрибутная грамматика
- •4.3 Описание символов действия
- •5. Атрибутный преобразователь
5. Атрибутный преобразователь
5.1 Построение функций переходов АП
Порядок построения АТ - преобразователя по заданной LАТ-грамматике в форме простого присваивания выглядит следующим образом:
-
Удалим из правил заданной LАТ-грамматики все атрибуты и правила их вычисления. В результате получим транслирующую грамматику.
-
Для полученной транслирующей грамматики построим преобразователь. Учитывая, что такой преобразователь в дальнейшем должен быть использован для работы с атрибутами, внесем следующие изменения в правила его построения:
а) чтобы первая команда преобразователя могла установить начальные значения последующих атрибутов начального символа грамматики, в качестве начальной примем конфигурацию следующего вида:
(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АТ - грамматики в магазине при каждом применении правила необходимо построить фрагмент магазина, соответствующий правой части правила, и установить связи атрибутов правой части правила с атрибутами заменяемой левой части правила, которые в момент замены находятся непосредственно под вершиной магазина. В результате установки связи в элементы магазина, определяющие значения наследуемых атрибутов, должны быть записаны указатели на элементы магазина, в которые нужно поместить значения этих атрибутов, а в элементы, соответствующие синтезируемым атрибутам, должны быть занесены указатели на элементы магазина, в которых будут расположены значения этих атрибутов. При этом в магазине могут образовываться цепочки указателей, ссылающихся друг на друга, которые соответствуют отложенным присваиваниям и последовательностям стрелок в графическом представлении вывода. Вывод в атрибутных грамматиках совмещается с вычислением значений атрибутов. Если грамматика задана в форме простого присваивания, то вычисление значений атрибутов осуществляется при выполнении символов действия. Полученные в результате вычисления значения атрибутов должны заноситься в отведенные этим атрибутам элементы магазина, а также во все элементы,связанные с ними цепочкой указателей.
Основываясь на описанной выше схеме выполнения левого вывода в атрибутной грамматике с использованием магазина, можно сделать вывод о том, что усложнение атрибутного преобразователя по сравнению с преобразователем, построенным по транслирующей грамматике, возникает за счет необходимости выделения памяти для атрибутов в магазине и работы с указателями.
Правила вычисления значений атрибутов:
-
Если источником копирующего правила является синтезируемый атрибут или атрибут терминального символа, то в поле, соответствующее источнику, записывается указатель на поле приемника, в которое нужно поместить значение источника после его определения.
-
Если источником копирующего правила является наследуемый атрибут, то в поле, соответствующее приемнику, записывается указатель на поле источника, из которого нужно взять значение.
-
Если источником копирующего правила является константа, то ее значение заносится в поле, соответствующее приемнику.
-
Если приемниками копирующего правила являются несколько атрибутов (множественное присваивание), то они связываются цепочкой указателей.
5.4 Фрагмент работы АП