- •Государственный комитет Российской Федерации по высшему образованию
- •Синтаксис и семантика языка Словарь и представление
- •Описания и области действия
- •Описания констант
- •Описания типов
- •Описания переменных
- •Выражения
- •Операнды
- •Операции
- •Операторы
- •Лексический анализ Типы лекскем
- •Диаграммы переходов
- •Структуры данных
- •Синтаксический анализ и перевод во внутреннюю форму кс-грамматика входного языка Основная грамматика
- •Грамматика описывающая составной оператор.
- •Грамматика описывающая выражение
- •Диаграмма переходов
- •Описание промежуточного языка
- •Описание перевода атг для программы
- •Атг для оператора
- •Атг для выражения
- •Описание конструкций языка при помощи триад
- •Алгоритм работы дмп-процессора
- •Тестирование синтаксического анализатора
- •Генерация кода
- •4. Результат выполнения сгнерированной программы:
Атг для оператора
N1 begin N2 end
N1 begin if Expressiont,v,n then {JFL}nl,t,v,n N3 end {DEFL}nl
nl newlabel // Метка на которую нужно перейти
t // тип выражения
v //Значение выражения
n // Если переменная, то номер в таблице переменных, n=-1, тогда в v – ссылка.
{JFL} nl,t,v,n
If t=boolean then
{ if n>0 then X=n else X=v
nl := newlabel
Выдать на выход триаду вида JFL nl, X
} else {Ошибка типа выражения}
N2 N3
N2 N3 ;
N2 N3 ; N2
N2 N4
N2 N4 ;
N2 N4 ; N2
N3 idln : {DEFL}n N3
n // номер метки в таблице меток
{DEFL}n
Выдать на выход триаду вида DEFL n,
N3 idvt1,v1,n1 := Expressiont,v,n {EQU}t,v,n,t1,v1,n1
t //Тип выражения
v //Значение выражения
n // Если переменная, то номер в таблице переменных, n=-1, тогда в v – ссылка.
t1 //Тип переменной
v1 // неиспользуется
n1 // должен быть >0
{EQU}t,n,t1,v1,n1
if t совместимо t1 then
{ if n>0 then
{ if n1>0 then X=n1 else X=v1
Выдать триаду вида EQU X,n
}else {Ошибка : ожидалась переменная}
}else {Ошибка совместимости типов}
N3 idvt,v,n [Expressiont1,v1,n1 , Expressiont2,v2,n2 ] := Expressiont3,v3,n3 {EQUM}t,n,t1,v1,n1,t2,v2,n2,t3,n3,v3
t1,2,3 //Тип выражения
v1,2,3 //Значение выражения
n1,2,3 // Если переменная, то номер в таблице переменных, n=-1, тогда в v – ссылка.
t //Тип переменной
v // неиспользуется
n // должен быть >0
{EQUM}t,n,t1,v1,n1,t2,v2,n2,t3,n3,v3
if (t совместимо t3) then
{if t2,t3<> boolean, boolmatr)
{ if n>0 then
{ if n3>0 then Z=n3 else Z=v3
if n1>0 then X=n1 else X=v1
if n2>0 then Y=n2 else Y=v2
Выдать триаду вида EQU Z,n
ARG X,Y
}else {Ошибка : ожидалась переменная}
} else {Ошибка в типе индекса}
}else {Ошибка совместимости типов}
N3 got idln {JMP}n
n // номер метки в таблице меток
Выдать на выход триаду вида JMP n,
N3 write ( N11 )
N3 writeln ( N11 ) {WRITELN}
{WRITELN}
Выдать на выход триаду вида WRITE #13#10 ,
N3 write
N3 writeln {WRITELN}
N3 repeatnum1 N2 until Expressiont,v,n {JF}num2, t,v,n
Num2num1 // запомнить номер триады на которую нужно перейти
t // тип выражения
v //Значение выражения
n // Если переменная, то номер в таблице переменных, n=-1, тогда в v – ссылка.
{JF}num2 ,t,v,n
if t=boolean {
if n>0 then X=n else X=v
Выдать на выход триаду вида JF num2, X}
Else { Ошибка типа условия }
N3 N1
N3 read ( idvt,v,n ) {READ}t,v,n
t // тип переменной
v = 0 // неопределено
n // Номер в таблице переменных
if t<>boolmatr then
{ Выдать на выход триаду вида READ n,t}
else {Ошибка типа переменной}
N3 readln ( idvt,v,n )
t // тип переменной
v = 0 // неопределено
n // Номер в таблице переменных
if t<>boolmatr then
{ Выдать на выход триаду вида READ n,t
WRITE #13#10 , }
else {Ошибка типа переменной}
N11 N12t,v,n {WRITE}v,n
t // Тип выражения (строка)
v // Значение
n // Переменная или строка
{WRITE}t,v,n
if t=0 then {X=содержимое строки }
else
if t<>boolmatr then
{ if n>0 then X=n else X=v
Выдать на выход триаду вида WRITE X, }
N11 N11 , N12 t,v,n {WRITE}v,n
// Семантика как в 21
N12t,v,n strv1
t 0 // Нулевой тип
v v1 // Номер строки
n-2 // n=-2, тогда в v – ссылка на строку.
N12t,v,n Expressiont1,v1,n1
tt1 // Тип выражения
vv1 // Значение выражения или ссылка на результат выполнения триады
nn1 // Если переменная, то номер в таблице переменных, n=-1, тогда в v – ссылка.
N4 if Expressiont,v,n then {JFL}nl,t,v,n N3 else {JMP}nl2 {DEFL}nl N3 {DEFL}nl2
Семантика как в 2
nl2 // Вторая метка
N4 if Expressiont,v,n then {JFL}nl,t,v,n N3 {DEFL}nl
Семантика как в 2
N4 if Expressiont,v,n then {JFL}nl,t,v,n N3 else {JMP}nl2 {DEFL}nl N4 {DEFL}nl2
Семантика как в 25