- •Государственный комитет Российской Федерации по высшему образованию
- •Синтаксис и семантика языка Словарь и представление
- •Описания и области действия
- •Описания констант
- •Описания типов
- •Описания переменных
- •Выражения
- •Операнды
- •Операции
- •Операторы
- •Лексический анализ Типы лекскем
- •Диаграммы переходов
- •Структуры данных
- •Синтаксический анализ и перевод во внутреннюю форму кс-грамматика входного языка Основная грамматика
- •Грамматика описывающая составной оператор.
- •Грамматика описывающая выражение
- •Диаграмма переходов
- •Описание промежуточного языка
- •Описание перевода атг для программы
- •Атг для оператора
- •Атг для выражения
- •Описание конструкций языка при помощи триад
- •Алгоритм работы дмп-процессора
- •Тестирование синтаксического анализатора
- •Генерация кода
- •4. Результат выполнения сгнерированной программы:
Атг для выражения
N2t,v,n N7t1,v1,n1
tt1 // Тип выражения
vv1 // Значение выражения или ссылка на результат выполнения триады
nn1 // Если переменная, то номер в таблице переменных, n=-1, тогда в v – ссылка.
N2 t,v,n N7 t1,v1,n1 < N2 t2,v2,n2 {C<}t1, t2,v1,v2,n1,n2
t boolean.
n -1 // Если n=-1 то в v находится ссылка на результат выполнения триады
v (№)// Номер триады с результатом
{C<}t1, t2,v1,v2,n1,n2
if (t1 совместим t2) then
{ if n1>0 then X=n1 else X=v1
if n2>0 then Y=n2 else Y=v2
Выдать на выход триаду вида CL X,Y} else
{ Ошибка в выражении }
N2 t,v,n N7 t1,v1,n1 > N2 t2,v2,n2 {C>}t1, t2,v1,v2,n1,n2
//Семантика как в 2
{C>}t1, t2,v1,v2,n1,n2
if (t1 совместим t2) then
{ if n1>0 then X=n1 else X=v1
if n2>0 then Y=n2 else Y=v2
Выдать на выход триаду вида CG X,Y} else
{ Ошибка в выражении }
N2 t,v,n N7 t1,v1,n1 <= N2 t2,v2,n2 {C<=}t1, t2,v1,v2,n1,n2
//Семантика как в 2
{C<=}t1, t2,v1,v2,n1,n2
if (t1 совместим t2) then
{ if n1>0 then X=n1 else X=v1
if n2>0 then Y=n2 else Y=v2
Выдать на выход триаду вида CLE X,Y} else
{ Ошибка в выражении }
N2 t,v,n N7 t1,v1,n1 >= N2 t2,v2,n2 {C>=}t1, t2,v1,v2,n1,n2
//Семантика как в 2
{C>=}t1, t2,v1,v2,n1,n2
if (t1 совместим t2) then
{ if n1>0 then X=n1 else X=v1
if n2>0 then Y=n2 else Y=v2
Выдать на выход триаду вида CGE X,Y} else
{ Ошибка в выражении }
N2 t,v,n N7 t1,v1,n1<> N2 t2,v2,n2 {C<>}t1, t2,v1,v2,n1,n2
//Семантика как в 2
{C<>}t1, t2,v1,v2,n1,n2
if (t1 совместим t2) then
{ if n1>0 then X=n1 else X=v1
if n2>0 then Y=n2 else Y=v2
Выдать на выход триаду вида CNE X,Y} else
{ Ошибка в выражении }
N2 t,v,n N7 t1,v1,n1 = N2 t2,v2,n2 {C=}t1, t2,v1,v2,n1,n2
//Семантика как в 2
{C=}t1, t2,v1,v2,n1,n2
if (t1 совместим t2) then
{ if n1>0 then X=n1 else X=v1
if n2>0 then Y=n2 else Y=v2
Выдать на выход триаду вида CE X,Y} else
{ Ошибка в выражении }
N1t,v,n idvt1,0,n1
tt1 //Тип переменной
nn1 // Номер в таблице переменных
v0 // Не определено
N1 t,v,n idct1,v1,0
tt1 //Тип константы
n0 // Если n=0, то в v находится значение константы
vv1 // Значение константы
N1 t,v,n idnt1, v1,0
tt1 //Тип числа
n0 // Если n=0, то в v находится значение числа
vv1 // Значение числа
N1 t,v,n idvt3,0,n3 [ N2 t1,v1,n1 , N2 t2,v2,n2 ] {ELEM}t1, t2, t3, v1, v2,n1, n2, n3
t3 // Тип переменной
n3 // Номер в таблице переменных
t boolean.
n -1 // Если n=-1 то в v находится ссылка на результат выполнения триады
v (№)// Номер триады с результатом
{ELEM}
if (t3=boolmatr) and (t1 совместим t2) then
{ Записать на выход триады вида ELEM n3, X
ARG Y , -
if n1>0 then X=n1 else X=v1
if n2>0 then Y=n2 else Y=v2
} else
{Ошибка обращения к матрице}
N1 t,v,n idvt3,n3 [Expression t1,v1,n1 , Expression t2,v2,n2 ]
Аналогично 11.
N1 t,v,n not N1 t1,v1,n1 {NOT}v1,n1
tt1 // Тип
n-1
v(№) // Номер триады с результатом
{NOT}
if n1>0 then X=n1 else X=v1
выдать на выход триаду вида NOT X, -
N1 t,v,n - N1 t1,v1,n1 {SUB0}t1,v1,n1
//Семантика как в 13
{SUB0}
if (t1<>boolean) and (t1<>boolmatr) then
{ if n1>0 then X=n1 else X=v1
выдать на выход триаду вида SUB 0, X
} else
{ Ошибка в выражении}
N1 t,v,n ( N2 t1,v1,n1 )
tt1 // Тип выражения
vv1 // Значение выражения или ссылка на результат выполнения триады
nn1 // Если переменная, то номер в таблице переменных, n=-1, тогда в v – ссылка.
N3 t,v,n N1 t1,v1,n1 and N3 t2,v2,n2 {AND}t1, t2,v1,v2,n1,n2
tt1 // Тип общий для t1 и t2
n-1
v(№) // Номер триады с результатом
{AND}t1, t2,v1,v2,n1,n2
if (t1 совместим t2) then
{ if n1>0 then X=n1 else X=v1
if n2>0 then Y=n2 else Y=v2
Выдать на выход триаду вида AND X,Y} else
{ Ошибка в выражении }
N3 t,v,n N1 t1,v1,n1
//Семантика как в 15
N4 t,v,n N3 t1,v1,n1 div N4 t2,v2,n2 {DIV}t1, t2,v1,v2,n1,n2
//Семантика как в 16
{DIV}t1, t2,v1,v2,n1,n2
if (t1 совместим t2) and (t1 и t2 <> boolean или boolmatr) then
{ if n1>0 then X=n1 else X=v1
if n2>0 then Y=n2 else Y=v2
Выдать на выход триаду вида DIV X,Y} else
{ Ошибка в выражении }
N4 t,v,n N3 t1,v1,n1 mod N4 t2,v2,n2 {MOD}t1, t2,v1,v2,n1,n2
//Семантика как в 16
{MOD}t1, t2,v1,v2,n1,n2
if (t1 совместим t2) and (t1 и t2 <> boolean или boolmatr) then
{ if n1>0 then X=n1 else X=v1
if n2>0 then Y=n2 else Y=v2
Выдать на выход триаду вида MOD X,Y} else
{ Ошибка в выражении }
N4 t,v,n N3 t1,v1,n1 shl N4 t2,v2,n2 {SHL}t1, t2,v1,v2,n1,n2
//Семантика как в 16
{SHL}t1, t2,v1,v2,n1,n2
if (t1 совместим t2) and (t1 и t2 <> boolean или boolmatr) then
{ if n1>0 then X=n1 else X=v1
if n2>0 then Y=n2 else Y=v2
Выдать на выход триаду вида SHL X,Y} else
{ Ошибка в выражении }
N4 t,v,n N3 t1,v1,n1 shr N4 t2,v2,n2 {SHR}t1, t2,v1,v2,n1,n2
//Семантика как в 16
{SHR}t1, t2,v1,v2,n1,n2
if (t1 совместим t2) and (t1 и t2 <> boolean или boolmatr) then
{ if n1>0 then X=n1 else X=v1
if n2>0 then Y=n2 else Y=v2
Выдать на выход триаду вида SHR X,Y} else
{ Ошибка в выражении }
N4 t,v,n N3 t1,v1,n1
//Семантика как в 15
N5 t,v,n N4 t1,v1,n1 * N5 t2,v2,n2 {MUL}t1, t2,v1,v2,n1,n2
//Семантика как в 16
{MUL}t1, t2,v1,v2,n1,n2
if (t1 совместим t2) and (t1 и t2 <> boolean или boolmatr) then
{ if n1>0 then X=n1 else X=v1
if n2>0 then Y=n2 else Y=v2
Выдать на выход триаду вида MUL X,Y} else
{ Ошибка в выражении }
N5 t,v,n N4 t1,v1,n1
//Семантика как в 15
N6 t,v,n N5 t1,v1,n1 or N6 t2,v2,n2 {OR}t1, t2,v1,v2,n1,n2
//Семантика как в 16
{OR}t1, t2,v1,v2,n1,n2
if (t1 совместим t2) then
{ if n1>0 then X=n1 else X=v1
if n2>0 then Y=n2 else Y=v2
Выдать на выход триаду вида OR X,Y} else
{ Ошибка в выражении }
N6 t,v,n N5 t1,v1,n1 xor N6 t2,v2,n2 {XOR}t1, t2,v1,v2,n1,n2
//Семантика как в 16
{XOR}t1, t2,v1,v2,n1,n2
if (t1 совместим t2) then
{ if n1>0 then X=n1 else X=v1
if n2>0 then Y=n2 else Y=v2
Выдать на выход триаду вида XOR X,Y} else
{ Ошибка в выражении }
N6 t,v,n N5 t1,v1,n1
//Семантика как в 15
N7 t,v,n N6 t1,v1,n1 - N7 t2,v2,n2 {SUB}t1, t2,v1,v2,n1,n2
//Семантика как в 16
{SUB}t1, t2,v1,v2,n1,n2
if (t1 совместим t2) or (t1 и t2 <> boolean или boolmatr) then
{ if n1>0 then X=n1 else X=v1
if n2>0 then Y=n2 else Y=v2
Выдать на выход триаду вида SUB X,Y} else
{ Ошибка в выражении }
N7 t,v,n N6 t1,v1,n1 + N7 t2,v2,n2 {ADD}t1, t2,v1,v2,n1,n2
//Семантика как в 16
{ADD}t1, t2,v1,v2,n1,n2
if (t1 совместим t2) or (t1 и t2 <> boolean или boolmatr) then
{ if n1>0 then X=n1 else X=v1
if n2>0 then Y=n2 else Y=v2
Выдать на выход триаду вида ADD X,Y} else
{ Ошибка в выражении }
N7 t,v,n N6 t1,v1,n1
//Семантика как в 15