Пред.Страница След.Страница  Раздел Содержание


7.6. Построение инструкций АТ-преобразователя

Порядок построения АТ-преобразователя описан в разделе 5.4. Процесс состоит из  следующих шагов:

·        построение функций выбора для каждого правила грамматики,

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

·        определение ссылок, соответствующих правилам присваивания,

·        построение инструкций преобразователя.

Обычно при описании работы преобразователя в виде последовательности конфигураций предполагается, что в начале каждого такта работы выполняется чтение очередного входного символа. В случае атрибутного преобразователя входные символы могут быть двух видов: знаки операций и разделители, не имеющие атрибутов, или символы идентификаторов и чисел, имеющие атрибуты. После чтения символа без атрибутов следующий такт работы преобразователя выполняется обычным образом, начинаясь чтением очередного входного символа. Если же входной символ имеет атрибут, то его необходимо извлечь и обработать до чтения очередного входного символа. Чтобы учесть это обстоятельство, в состав магазинных символов включена команда чтения очередного входного символа (9,1). Таким образом, инструкции для входных символов с атрибутами должны включать символ действия, выполняющий извлечение атрибута из токена, за которым нужно поместить команду чтения очередного токена (9,1).

Ниже приводятся два примера построения инструкций преобразователя. Каждой инструкции предшествует правило грамматики, правила присваивания, ссылки магазина, реализующие эти правила, а также значение функции выбора и функции переходов. При написании функций переходов в правой части в квадратных скобках указываются атрибуты, находящиеся в вершине магазина. Предполагается, что чтение очередных входных символов без атрибутов выполняется модулем, реализующим алгоритм работы преобразователя.

Так, инструкции для правила, определяющего <Про_описание2>, имеют вид:

 

<5>.g2 ::= ",""Идентификатор"{5}.b2<5>.

            Правила: b2=g2, g3=g2,

            Ссылки: b2 = -3, g3 = -1

            Выбор: ","

            Функция:  φ( ",", <5>) = [g2] ( .g3<5>.b2 {5}"Идентификатор"",")

            Инструкция: (8,-1)(5,5)(9,1)(8,-4)(6,5) (1,0) (4,10)ComEnd

 

<5>.g4 ::= ;

            Правила:

            Ссылки:

            Выбор: ";"

            Функция: φ( ";", <5>) = [g4](";")

            Инструкция: (6,10)(4,3)ComEnd

В качества второго примера приведем исходные данные и инструкцию для правила, определяющего <Про_выражение>.

 

<11>.m2.n2 ::= "|" <10>l2{3}.x1.x2.x3<11>.m3.n3

            Правила: m2=m3, x1=l2, x2=n2, n3=x3

            Ссылки: m3 = -2, l2 = --2, x2=-6, x3=-3

            Выбор: "|"

            Функция:  φ( "|", <11>) = [.n2.m2] ( .n3.m3<11>.x3.x2.x1{3}.l2<10>"|")

            Инструкция:(8,nl)(8,-2)(5,11)(8,-3)(8,-6)(8,nl)(6,3)(8.-2)(5,10)(4,5)ComEnd

 

<11>.m4.n4 ::= {8}

            Правила: m4=n4

            Ссылки

            Выбор: ")"

            Функция: φ*( ")", <11>) = [.n3.m3] ( )

            Инструкция:(6,8)ComEnd

 

<11>.m4.n4 ::= {8}

            Правила: m4=n4

            Ссылки

            Выбор ";"

            Функция: φ*( ";", <11>) = [.n3.m3] ( )

            Инструкция:(6,8)ComEnd

 

Полное описание функций переходов и соответствующих инструкций преобразователя приведено в приложении к разделу 7.

 


Пред.Страница След.Страница  Раздел Содержание