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

4.4. Пример вывода в атрибутной грамматике.

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

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

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

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

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

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

(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, $, $ )