Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
9
Добавлен:
01.05.2014
Размер:
76.8 Кб
Скачать

Атрибутная грамматика.

1) Атрибутная грамматика для основной программы.

p - унаследованный

t - синтезированный

PRG ® OPS PR1

OPS ® e

PR1 ® void main ( ) { PR2

PR2 ® OPS PO }

PO ® O O'

O ® ;

O ® { PO }

O ® it1 O1p1 p1 ¬ t1

O ® printf ( MSG MS1 ) ;

O ® scanf ( P P1 ) ;

O ® goto it1 {перейти}A1 ; A1 ¬ t1

O ® for ( F1

O' ® O O'

O' ® e

O1p1 ® : {метка}A1

A1 ¬ p1

O1p1 ® = O2t1 {присвоить}A1, A2

A1 ¬ p1

A2 ¬ t1

O1p1 ® [ Vt1 ] {смещение}A1, A2, R = O2t2 {присвоить}A3, A4

A1 ¬ p1

A2 ¬ t1

A3 ¬ R

A4 ¬ t2

O2t1 ® it2 O3p1, t3

p1 ¬ t2

t1 ¬ t3

O2t1 ® Vt2 ;

t1 ¬ t2

O3p1, t1 ® = O2t2 {присвоить}A1, A2

A1 ¬ p1

A2 ¬ t2

t1 ¬ t2

O3p1, t1 ® [ Vt2 ] {смещение}A1, A2, R = O2t3 {присвоить}A3, A4

A1 ¬ p1

A2 ¬ t2

A3 ¬ R

A4 ¬ t3

t1 ¬ t3

MSG ® st1 {печатать}A1

A1 ¬ t1

MSG ® Vt1 {печатать}А1

A1 ¬ t1

MS1 ® , MSG MS1

MS1 ® e

P ® it1 I1p1

p1 ¬ t1

P1 ® , P P1

P1 ® e

I1p1 ® [ Vt2 ] {считать}A1, A2

A1 ¬ p1

A2 ¬ t2

I1p1 ® e {считать}A1

A1 ¬ p1

OP ® it1 OP1p1, t1

p1 ¬ t1

OP1p1, t1 ® = OP2t2 {присвоить}A1, A2

t1 ¬ t2

A1 ¬ p1

A2 ¬ t2

OP1p1, t1 ® [ Vt2 ] {смещение}A1, A2, R = OP2t3 {присвоить}A3, A4

t1 ¬ t3

A1 ¬ p1

A2 ¬ t2

A3 ¬ R

A4 ¬ t3

OP2t1 ® Vt2

t1 ¬ t2

OP2t1 ® it2 OP1p2, t3

p1 ¬ t2

t1 ¬ t3

F1 ® OP OP’ ; F2

F1 ® ; F2

F2 ® {L1:} U {условие} ; F3

F2 ® {L1:}{условие} ; F3

F3 ® {L2:} OP OP’ {L3:} ) O {конец итерации} {L4:}

F3 ® {L2:} {L3:} ) O {конец итерации} {L4:}

U ® Vt1 {проверка}A1 U1

A1 ¬ t1

U1 ® , V t1{проверка}A1 U1

A1 ¬ t1

U1 ® e

OP’ ® , OP OP’

OP’ ® e

O ® if ( V ) O {else}

Семантические процедуры для операционных символов.

{перейти}A1

Генерируется триада jmp label, A Параметр A фиктивный. Управление передается триаде по адресу label.

{метка}A1

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

{присвоить}A1, A2

Переменной по адресу A1 присваивается выражение A2. Если тип A1 - int а тип A2 - float или наоборот, то автоматически происходит преобразование типов.

Аномальные ситуации:

1) если тип A1 - vector а тип A2 - int или float.

2) если тип A2 - vector а тип A1 - int или float.

3) если тип A1 и A2 - vector и их размерности не совпадают.

{смещение}A1, A2, R

Результат есть адрес ячейки под номером А2 вектора по адресу А1.

{печатать}А1

На экран выводится значение переменной или строка по адресу A1.

Генерируется триада prn A1 , fict .

{считать}A1, A2

Информация считывается с клавиатуры в ячейку под номером A2 вектора по адресу A1 .

Генерируется триада scn A1, A2 .

{считать}A1

Информация считывается с клавиатуры и заносится в память по адресу A1 .

Генерируется триада scn A1, fict .

{конец итерации}

Генерируется триада

jmp L2

{условие}

Генерируется триада

jmp L3

{проверка}A1

Проверяется условие выхода из цикла while - генерируется следующая последовательность триад:

cmp A1, 1

jne L4

то есть при несоблюдении условий продолжения цикла его выполнение завершается.

{Li:}

В таблицу меток заносится сгенерированная метка с уникальным именем, хранящая адрес следующей за ней триады. Информация о данной метке будет доступна на всем протяжении действия данного цикла for.

{else}

Просматривается следующая лексема на входной цепочке и если это ключевое слово else, то рассматривается следующее продолжение правила для оператора if : else O. Соответственно в стек заносится операционный символ О и разбор продолжается.

19

Соседние файлы в папке Курсовая работа2