- •2.1. Входная грамматика в структурированной форме
- •2.2. Су-схема и транслирующая грамматика
- •2.3. Функции переходов преобразователя
- •3.1. Грамматика лексических единиц и структура лексем
- •3.2. Диаграмма состояний лексического анализатора
- •3.3. Структуры данных и символы действия
- •4.1. Неформальное описание семантики
- •4.2. Атрибутная грамматика
- •4.3. Описание символов действия
- •4.4. Пример вывода в атрибутной грамматике.
- •5.1. Построение функций переходов атрибутного преобразователя.
- •5.2. Построение инструкций атрибутного преобразователя.
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, $, $ )
При таком представлении команд в цепочках отсутствуют выходные символы. Предполагается, что формирование выходной цепочки должно выполняться символами действия.