Скачиваний:
9
Добавлен:
01.05.2014
Размер:
1.43 Mб
Скачать

Г. Определение атрибутной транслирующей грамматики. При необходимости передачи данных между узлами синтаксического дерева транслирующую грамматику расширяют до атрибутной транслирующей грамматики.

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

  • от символа левой части символам правой части правила вывода;

  • от символов правой части правила символу левой части этого же правила вывода;

  • между символами правой части правила вывода.

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

  1. Определить источник передаваемого значения (символ грамматики) и приписать ему атрибут.

  2. Определить приемник значения (символ грамматики) и приписать ему атрибут.

  3. Учитывая ограничения в передаче атрибутов, определить маршрут передачи значения, для чего удобно пользоваться синтаксическим деревом грамматики.

  4. Описать передачу значения атрибута правилами АТ-грамматики, стараясь, чтобы функции вычисления атрибутов были простейшими (копирующие правила).

Д. Тестирование АТ-грамматики. Тестирование АТ- грамматики заключается в моделировании работы построенного по ней процессора, выполняющего перевод. При большом числе тестов и/или большой их длине эта работа может быть выполнена только при использовании соответствующих средств автоматизации. Для простых языковых конструкций, когда длина теста и их число невелики, а тестирование выполняется отдельно для каждой конструкции, начиная с простейших, работа эта не только необходима, но и реально выполнима.

Тестирование АТ-грамматики позволяет определять два вида ошибок:

  • ошибки в структуре выходной цепочки (неверный порядок следования символов в выходной цепочке);

  • ошибки в значениях символов выходной цепочки, что связано с ошибками в передаче значений атрибутов.

При тестировании реального описания перевода желательно использовать комплексные тесты, определяющие оба вида ошибок.

4.2. Пример разработки атрибутной транслирующей грамматики

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

for <переменная> = <начальное значение>

to <конечное значение> step <шаг>

<тело цикла>

next <переменная> .

Для упрощения введем следующие ограничения:

  • <переменная> – идентификатор целой переменной;

  • <начальное значение>, <конечное значение> и <шаг> – целые положительные константы;

  • <тело цикла> – оператор цикла или терминальный (не подлежащий переводу) оператор;

  • кодирование символов входной и выходной программы не рассматривается.

Оператор цикла, который требуется перевести, имеет вид:

for i = c1 to c2 step c3 <тело цикла> next i

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

i := c1; m1: if i > c2 then goto m2 ;<тело цикла>; i := i + c3 ; goto m1; m2:

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

  1. Объекты, передаваемые в выходную цепочку из входной цепочки (переменная цикла i, начальное значение c1, конечное значение c2, шаг c3).

  2. Объекты, не изменяющиеся в процессе перевода (множество терминальных символов выходного языка { ;, :, :=, +, >, if, then, goto }.

  3. Объекты, генерируемые во время перевода (метки m1 и m2).

Рис. 4.1

Составим БНФ, которая описывает синтаксис заданного оператора цикла, выбирая такую структуру описания, которая позволяет проиллюстрировать практически все проблемы синтеза атрибутных транслирующих грамматик.

  1. <оператор цикла> ::= <заголовок цикла><тело цикла>< конец цикла>

  2. <заголовок цикла> ::= for <нач_значение><конечное значение><шаг>

  3. <нач_значение> ::= <идентификатор> = <константа>

  4. <конечное значение> ::= to <константа>

  5. <шаг> ::= step <константа>

  6. <тело цикла> ::= <оператор цикла>

  7. <тело цикла> ::= <терминал>

  8. <конец цикла> ::= next <идентификатор >

Пусть S – <оператор цикла>, A – <заголовок цикла>, B – <тело цикла>, C – < конец цикла >, D – <нач_значение>, E – <конечное значение>, F – <шаг>. Тогда правила вывода КС-грамматики, описывающей синтаксис входного языка, имеют вид:

(1) S A B C (5) F step cns

(2) A for D E F (6) B S

(3) D id = cns (7) B term

(4) E to cns (8) C next id

Соседние файлы в папке Формальные методы описания перевода(1)