- •2.1. Входная грамматика в структурированной форме
- •2.2. Су-схема и транслирующая грамматика
- •2.3. Функции переходов преобразователя
- •3.1. Грамматика лексических единиц и структура лексем
- •3.2. Диаграмма состояний лексического анализатора
- •3.3. Структуры данных и символы действия
- •4.1. Неформальное описание семантики
- •4.2. Атрибутная грамматика
- •4.3. Описание символов действия
- •4.4. Пример вывода в атрибутной грамматике.
- •5.1. Построение функций переходов атрибутного преобразователя.
- •5.2. Построение инструкций атрибутного преобразователя.
4.4. Пример вывода в атрибутной грамматике.
Атрибутный преобразователь
5.1. Построение функций переходов атрибутного преобразователя.
Порядок построения АТ - преобразователя по заданной LАТ-грамматике в форме простого присваивания выглядит следующим образом:
Удалим из правил заданной LАТ-грамматики все атрибуты и правила их вычисления. В результате получим транслирующую грамматику.
Для полученной транслирующей грамматики построим преобразователь. Учитывая, что такой преобразователь в дальнейшем должен быть использован для работы с атрибутами, внесем следующие изменения в правила его построения:
а) чтобы первая команда преобразователя могла установить начальные значения последующих атрибутов начального символа грамматики, в качестве начальной примем конфигурацию следующего вида:
(s0, <заданная цепочка>, h0),
б) откажемся от совмещения команд для правил вида <А> b, где b является терминалом, имеющим атрибут, и- некоторая цепочка из терминальных и нетерминальных символов, используя вместо команды
f(s0, b,<A>) = (s0, R)
две команды
*(s0, b, <A>) = (s0, Rb)
(s0, b, b) = (s0, $),
поскольку при выполнении одной команды терминальный символ и, следовательно, его атрибут не записываются в магазин, что делает невозможным формирование указателя для правила вычисления атрибута, в котором используется атрибут терминала b.
Функции переходов атрибутного преобразователя :
*( S, <char>, [] ) = ( S, []<I>, $ )
*( S, <boolean>, [] ) = ( S, []<I>, $ )
( S, "<arr>" , <masbool> ) = ( S, "</arr>" "{FMB}" "{WrRM}" "<chislo>" "," "<id>" , $ )
( S, "<arr>" , <maschar> ) = ( S, "</arr>" "{FMC}" "{WrRM}" "<chislo>" "," "<id>" , $ )
( S, "<earr>" , <elmas> ) = ( S, "</earr>" "{FUkTZEM}" "<chislo>" "," "<id>" , $ )
( S, "<boolean>" , <vars> ) = ( S, <r3> "</boolean>" <namesbool> , $ )
( S, "<char>" , <vars> ) = ( S, <r3> "</char>" <nameschar> , $ )
*( S, "<id>" , <namesbool> ) = ( S, <r4> "{NewB}" "<id>", $ )
( S, "," , <r4> ) = ( S, <namesbool> , $ )
*( S, "<id>" , <nameschar> ) = ( S, <r5> "{NewC}" "<id>", $ )
( S, "," , <r5> ) = ( S, <nameschar> , $ )
( S, "<ass>" , <code> ) = ( S, <r6> "</ass>" "{FAt=}" <vyrazh> "," <perem> , $ )
*( S, "<id>" , <perem> ) = ( S, "{FUkTZId}" "<id>", $ )
*( S, "<const>" , <vyrazh> ) = ( S, "<const>" , $ )
*( S, "<simvol>" , <vyrazh> ) = ( S, "<simvol>" , $ )
( S, "<and>" , <operation> ) = ( S, "</and>" "{NextZ}" "{FAt&}" <operand> "," <operand> , $ )
( S, "<or>" , <operation> ) = ( S, "</or>" "{NextZ}" "{FAtV}" <operand> "," <operand> , $ )
( S, "<not>" , <operation> ) = ( S, "</not>" "{NextZ}" "{FAt!} " <operand> , $ )
*( S, "<const>" , <operand> ) = ( S, "<const>" , $ )
*( S, "<boolean>" , <i> ) = ( S, <code> <vars> , $ )
*( S, "<char>" , <i> ) = ( S, <code> <vars> , $ )
*( S, "<boolean>" , <r3> ) = ( S, <vars> , $ )
*( S, "<char>" , <r3> ) = ( S, <vars> , $ )
*( S, "<arr>" , <namesbool> ) = ( S, <r4> <masbool> , $ )
*( S, "<arr>" , <nameschar> ) = ( S, <r5> <maschar> , $ )
*( S, "<earr>" , <perem> ) = ( S, <elmas> , $ )
*( S, "<id>" , <vyrazh> ) = ( S, <perem> , $ )
*( S, "<earr>" , <vyrazh> ) = ( S, <perem> , $ )
*( S, "<and>" , <vyrazh> ) = ( S, <operation> , $ )
*( S, "<or>" , <vyrazh> ) = ( S, <operation> , $ )
*( S, "<not>" , <vyrazh> ) = ( S, <operation> , $ )
*( S, "<and>" , <operand> ) = ( S, <operation> , $ )
*( S, "<or>" , <operand> ) = ( S, <operation> , $ )
*( S, "<not>" , <operand> ) = ( S, <operation> , $ )
*( S, "<id>" , <operand> ) = ( S, <perem> , $ )
*( S, "<earr>" , <operand> ) = ( S, <perem> , $ )
*( S, "<ass>" , <r6> ) = ( S, <code> , $ )
*( S, "<ass>" , <r3> ) = ( S, $ , $ )
*( S, "</boolean>" , <r4> ) = ( S, $ , $ )
*( S, "</char>" , <r5> ) = ( S, $ , $ )
*( S, -|, <r6> ) = ( S, $ , $ )
( 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, $, $ )