- •Пояснительная записка к курсовой работе по дисциплине "Теория языков программирования"
- •2005 Отчет по курсовой работе тяп.
- •1 Описание входного языка
- •1.1 Задание
- •1.2 Синтаксис и семантика языка
- •1.2.1 Словарь и представление
- •1.2.2 Описания и области действия
- •1.2.3 Описания констант
- •1.2.4 Описания типов
- •1.2.5 Описания переменных
- •1.2.6 Выражения
- •1.2.6.1 Операнды
- •1.2.6.2 Операции
- •1.2.7 Операторы
- •2. Лексический анализ
- •2.1 Типы лекскем.
- •2.2 Диаграммы переходов
- •2.3 Структуры данных
- •2.4 Тестирование лексического анализатора
- •3 Синтаксический анализ и перевод во внутреннюю форму
- •3.1 Кс-грамматика входного языка
- •3.1.1 Основная грамматика.
- •3.1.2 Грамматика описывающая составной оператор.
- •3.1.3 Грамматика описывающая выражение
- •3.2 Диаграмма переходов
- •3.3 Описание промежуточного языка
- •3.4 Описание перевода
- •3.4.1 Атг для программы
- •3.4.2 Атг для оператора
- •3.4.3 Атг для выражения
- •3.4.4 Описание конструкций языка при помощи триад
- •3.5 Алгоритм работы дмп-процессора
- •3.6 Тестирование синтаксического анализатора
- •4 Генерация кода
3.4 Описание перевода
3.4.1 Атг для программы
N1 program idc ; N3 .
N1 N3 .
N3 N16 operator
N3 operator
N7 idl , N7
N7 idl
N10 N8 N10
N10 N8
N12t Expressiont1,v1,n1 .. Expressiont2,v2,n2
t longint // тип диапазона longint
If (t1, t2 = boolean, boolmatr) then {ошибка построения типа диапазона}
if (v1>v2) then {ошибка, константа слева должна быть меньше}
N12t idtt1
t t1 // Номер типа в таблице типов
N12t boolmatr [Expressiont1,v2,n3 , Expressiont2,v2,n2 ]
t Номер boolmatr в таблице типов
if (t1,t2= boolean, boolmatr) then {ошибка типа выражения}
N16 N18 N16
N16 label N7 ;
N16 const N10
N16 type N23
N16 var N26
N16 N19 N16
N16 N20 N16
N16 N21 N16
N18 label N7 ;
N19 const N10
N20 type N23
N21 var N26
N22 idt = N12t ;
N23 N22 N23
N23 idt = N12t ;
N25 idvt,v,n , N25 {VAR}t,n
// Семантика как в 28
N25 idvt,v,n {VAR}t,n
t // Тип переменной
v0
n// Номер переменной в таблице переменных
{VAR}t.n
Выдать на выход триаду вида VAR n, t
if t=boolmatr {выдать на выход триаду ARG M,N}
N26 N25 : N12 ;
N26 N25 : N12 ; N26
N8 idct1,v1,n1 = Expressiont2,v2,n2 ;
t1t2 //Присвоение типа константе
v1v2 // Присвоение значения константы
n1n2 // Если n>0 то ошибка переменная в константном выражении
N8 idct1,v1,n1 : N12t = Expressiont2,v2,n2 ;
t1t2 //Присвоение типа константе если t=t2, иначе ошибка
v1v2 // Присвоение значения константы
n1n2 // Если n>0 то ошибка переменная в константном выражении
3.4.2 Атг для оператора
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