- •Государственный комитет Российской Федерации по высшему образованию
- •Синтаксис и семантика языка Словарь и представление
- •Описания и области действия
- •Описания констант
- •Описания типов
- •Описания переменных
- •Выражения
- •Операнды
- •Операции
- •Операторы
- •Лексический анализ Типы лекскем
- •Диаграммы переходов
- •Структуры данных
- •Синтаксический анализ и перевод во внутреннюю форму кс-грамматика входного языка Основная грамматика
- •Грамматика описывающая составной оператор.
- •Грамматика описывающая выражение
- •Диаграмма переходов
- •Описание промежуточного языка
- •Описание перевода атг для программы
- •Атг для оператора
- •Атг для выражения
- •Описание конструкций языка при помощи триад
- •Алгоритм работы дмп-процессора
- •Тестирование синтаксического анализатора
- •Генерация кода
- •4. Результат выполнения сгнерированной программы:
Диаграмма переходов
Lex – текущий входной символ
St –верхушка стека
S S1 – Чтение лексемы, поиск действия в управляющей таблице (верхушка стека, лексема)
S1 P – Занесение атрибутов терминалов в стек атрибутов, обработка операционных символов, находящихся в середине правой части правила.
S1 C – Вычисление атрибутов, обработка операционных символов, находящихся в конце правой части правила.
S1 F – Вывод полученного потока триад.
S1 E – Вывод ошибки, завершение работы.
P S1 – Чтение следующей лексемы.
C S1 – Чтение следующей лексемы.
С E – Вывод ошибки, завершение работы.
Описание промежуточного языка
Описание триад
Триада |
Семантика триады |
EQU B, A |
A:=B если A элемент boolmatr, то добавляется AGR X,Y (координаты ячейки матрицы) |
DEFL L, - |
Описание метки L |
JMPL L, - |
Безусловный переход на триаду с меткой L |
JMP m, - |
Безусловный переход на триаду с номером m |
READ X, T |
Получает значение Х с консоли, типа T |
WRITE X, - |
Выводит значение X на консоль |
VAR V, T |
Объявляет переменную V типа T. (если тип boolmatr[M,N], то добавляется ARG M,N) |
ADD A, B |
Сложение A + B |
SUB A, B |
Вычитание A – B |
DIV A, B |
Целочисленное деление A div B |
MUL A, B |
Умножение A * B |
AND A, B |
Логическое-И A and B |
OR A, B |
Логическое-ИЛИ A or B |
XOR A, B |
Логическое исключение A xor B |
NOT A, - |
Логическое отрицание A |
SHL A, B |
Побитовый сдвиг влево A, на B бит, справа появляются 0 |
SHR A, B |
Побитовый сдвиг вправо A, на B бит, слева появляются 0 |
ELM M, X |
Элемент булевской матрицы M, используется с последовательной триадой ARG Y, - M[x,y] |
CE X, Y |
Вычисляет результат сравнения (X=Y) результат (true, false). |
CNE X, Y |
Вычисляет результат сравнения (X<>Y) результат (true, false). |
CL X, Y |
Вычисляет результат сравнения (X<Y) результат (true, false). |
CG X, Y |
Вычисляет результат сравнения (X>Y) результат (true, false). |
CLE X, Y |
Вычисляет результат сравнения (X<=Y) результат (true, false). |
CGE X, Y |
Вычисляет результат сравнения (X>=Y) результат (true, false). |
JFL L, E |
Переход на метку L если E=false |
JF M, E |
Переход на триаду с номером m если E=false |
ARG X, Y |
Интерпретируется, как дополнительный параметр для триады, за которой следует |
Описание перевода атг для программы
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 то ошибка переменная в константном выражении