Курсовая работа2 / PART_3
.DOCОсновная грамматика
Нетерминалы:
PRG |
программа |
PR1 |
остаток 1 программы |
PO |
последовательность операторов |
MSG |
сообщение |
MS1 |
остаток сообщения |
OPS |
описания |
PR2 |
остаток 2 программы |
O |
оператор |
O1 |
остаток 1 оператора |
O2 |
остаток 2 оператора |
O3 |
остаток 3 оператора |
O’ |
остаток оператора |
P |
переменная |
P1 |
остаток переменной |
I1 |
остаток |
OP |
оператор присваивания |
OP1 |
остаток 1 оператора присваивания |
OP2 |
остаток 2 оператора присваивания |
OP’ |
остаток оператора присваивания |
F1 |
остаток 1 для for |
F2 |
остаток 2 для for |
F3 |
остаток 3 для for |
U |
условие |
U1 |
остаток условия |
Правила :
1) PRG ® OPS PR1 2) OPS ® e
3) PR1 ® void main ( ) { PR2 4) PR2 ® OPS PO }
5) PO ® O O' 6) O ® ;
7) O ® { PO } 8) O ® i O1
9) O ® printf ( MSG MS1 ) ; 10) O ® scanf ( P P1 ) ;
11) O ® goto i ; 12) O ® for ( F1
13) O' ® O O' 14) O' ® e
15) O1 ® : 16) O1 ® = O2
17) O1 ® [ V ] = O2 18) O2 ® i O3
19) O2 ® V ; 20) O3 ® = O2
21) O3 ® [ V ] = O2 22) MSG ® s
23) MSG ® V 24) MS1 ® , MSG MS1
25) MS1 ® e 26) P ® i I1
27) P1 ® , P P1 28) P1 ® e
29) I1 ® [ V ] 30) I1 ® e
31) OP ® i OP1 32) OP1 ® = OP2
33) OP1 ® [ V ] = OP2 34) OP2 ® V
-
OP2 ® i OP1 36) F1 ® OP OP’ ; F2
37) F1 ® ; F2 38) F2 ® U ; F3
39) F2 ® ; F3 40) F3 ® OP OP’ ) O
41) F3 ® ) O 42) U ® V U1
43) U1 ® , V U1 44) U1 ® e
45) OP’ ® , OP OP’ 46) OP’ ® e
47) O ® if ( V ) O
Атрибутная грамматика.
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. Соответственно в стек заносится операционный символ О и разбор продолжается.