- •Задание на курсовую работу
- •1. Описание входного языка.
- •1.2.3. Конструкции входного языка.
- •Оператор итерационного цикла for-to-do и for-downto-do.
- •Оператор безусловного перехода goto.
- •Условный опеатор if-then-else
- •Лексический анализатор.
- •Представление основных операторов в полиз
- •Разобьем исходную грамматику на подграмматики:
- •Подграмматика для списка имён:
- •Подграмматика для типов:
- •Основная подграмматика:
- •Описание перевода (атг) каждой конструкции входного языка
- •Подграмматика для переменной:
- •Операционный символ { вычислить адрес }p, n, r
- •Операционный символ { числитель }p, t
- •Операционный символ {сложить}p, q, r
- •Операционный символ {вычесть}p, q, r
- •Операционный символ { умножить }p, q, r
- •Операционный символ { делить }p, q, r
- •Операционный символ { общий знаменатель }p, q, r
- •Операционный символ { дизъюнкция }p, q, r
- •Операционный символ { конъюнкция }p, q, r
- •Операционный символ { отрицание }p, q
- •Операционный символ { меньше }p, q, r
- •Операционный символ { отношение }q1, q2, q3, r
- •Подграмматика для операторов:
- •Операционный символ { id }n
- •Операционный символ { init }n, V, r
- •Операционный символ { нач_ц }q1, q2, q3, m1, m2, r2
- •Операционный символ { кон_ц } q4, q5, m1, m2
- •Операционный символ { присвоить }p, q
- •Операционный символ {индекс}p, r
- •Операционный символ {создать метку}p, r
- •Описание типа
- •Структуры данных дмп-процессора
- •Структура символа
- •Магазин дмп процессора
- •Управляющая таблица ll1-анализатора для подграмматики выражений
- •Управляющая таблица ll1-анализатора для подграмматики логических выражений
- •Управляющая таблица ll1-анализатора для подграмматики списка имён
- •Управляющая таблица ll1-анализатора для подграмматики операторов
- •Управляющая таблица ll1-анализатора для основной подграмматики
- •Управляющая таблица ll1-анализатора для подграмматики типов
- •Управляющая таблица ll1-анализатора для подграмматики переменных
- •Разработка дмп-процессора
- •Взаимодействие дмп-процессоров
- •Алгоритм работы дмп-процессора
- •Передача атрибутов в дмп-процессоре
- •Тестирование дмп-процессора
Передача атрибутов в дмп-процессоре
Замена нетерминала:
Выталкиваем верхушку стека, не очищая из под нее память, получаем на нее указатель.
В зависимости от кода правила кладем в стек цепочку замены в обратном порядке
Передача атрибутов:
Если атрибут копируется из левой части правила вывода в правую, то копируем данные(так как АТГ имеет форму простого присваивания)
Пример
Xp1, q1Yp2 Zq2
p2 p1//p1 - унаследованный
q2 q1//q1 - унаследованный
Y 123 Z aa00
X | |
123 | |
aa00 | |
|
|
Если копируется атрибут из символа части X правила вывода в символ, находящийся правее Y, то атрибуту X добавляется ссылка на атрибут Y.
Если необходимо передать атрибут символа из правой части правила вывода в левую, то добавляется все ссылки атрибута левого символа атрибуту правого символа.
Тестирование дмп-процессора
Рассмотрим следующую программу:
program my;
const
con = 1;
label
lab1;
var
a, b : integer;
c, d : rational;
ar : array[1..4] of rational;
begin
c.numerator := 1; c.denominator := 1;
d := c;
a := b + c common d;
if a > c.numerator then begin
a := 1
end else begin
d := simplify c;
end;
ar[ 1 ].numerator := 3;
end.
На выходе мы получим:
Таблица меток:
3
aa01
aa00
lab1
------------
Name |
Таблица типов:
|
5 |
1 |
GENERIC ARRAY N-Ord Nil 2 4 0 0 N-Ord 32 |
2 |
GENERIC RANGE Ord Nil Nil 5 1 4 4 4 |
3 |
boolean NAMED ENUM Ord Nil Nil Nil 0 1 2 4 |
4 |
rational NAMED RAT N-Ord Nil Nil Nil 0 0 N-Ord 8 |
5 |
integer NAMED INT Ord Nil Nil Nil -32768 32767 65536 4 |
|
------------------------------------------------------------------------------- |
|
Name |Type |Cons |Ord? |Alias|Idx |Base|LeftB |RightB |Variant|Size | |
Таблица идентификаторов:
|
7 |
1 |
ar VAR 1 Nil |
2 |
c VAR 4 Nil |
3 |
d VAR 4 Nil |
4 |
a VAR 5 Nil |
5 |
b VAR 5 Nil |
6 |
con CONST 5 1 |
7 |
my SYSTEM No type Nil |
8 |
true CONST 3 1 |
9 |
false CONST 3 0 |
|
----------------------------------- |
|
Name |Mode |TypeIdx| Value| |
Программа на ПОЛИЗе:
c
@NUMERATOR
1
@SET
c
@DENOMINATOR
1
@SET
d
c
@SET
a
b
c
d
@COMMON
@ADDINT
@SET
a
c
@NUMERATOR
@>INT
:aa00
@JMPF
a
1
@SET
:aa01
@JMP
:aa00
@DEFL
d
c
@SIMPLIFY
@SET
:aa01
@DEFL
ar
1
2
@SUBS
@NUMERATOR
3
@SET
[Warning]: Label declared, but never used: "lab1"
Рассмотрим детально транслирование фрагмента программы:
ar[ 1 ].numerator
-
Магазин
Входная цепочка
Выход
VAR
ar[ 1 ].numerator
тип переменной
id
ar[ 1 ].numerator
ar
{переменная}
адрес переменной
LE
1
кол-во операндовSUBS
{вычислить адрес}
адрес переменной
кол-во операндов SUBS
тип переменной
PAR
входной тип переменной
выходной тип переменной
{переменная}
[ 1 ].numerator
ar
LE
1
кол-во операндовSUBS
{вычислить адрес}
ar
кол-во операндов SUBS
тип переменной
PAR
входной тип переменной
выходной тип переменной
-
[
[ 1 ].numerator
ar
EXP
тип выражения
{индекс}
тип выражения
{inc}
1
кол-во операндов
SXP
кол-во операндов
кол-во операндов
]
LE
кол-во операндов
кол-во операндов
{вычислить адрес}
ar
кол-во операндов SUBS
тип переменной
PAR
входной тип переменной
выходной тип переменной
EXP
1 ].numerator
ar
тип выражения
{индекс}
тип выражения
{inc}
1
кол-во операндов
SXP
кол-во операндов
кол-во операндов
]
LE
кол-во операндов
кол-во операндов
{вычислить адрес}
ar
кол-во операндов SUBS
тип переменной
PAR
входной тип переменной
выходной тип переменной
-
EXP
1 ].numerator
ar
тип выражения
{индекс}
тип выражения
{inc}
1
кол-во операндов
SXP
кол-во операндов
кол-во операндов
]
LE
кол-во операндов
кол-во операндов
{вычислить адрес}
ar
кол-во операндов SUBS
тип переменной
PAR
входной тип переменной
выходной тип переменной
-
AE
1 ].numerator
ar
тип выражения
SAE
тип выражения
тип выражения
{индекс}
тип выражения
{inc}
1
кол-во операндов
SXP
кол-во операндов
кол-во операндов
]
LE
кол-во операндов
кол-во операндов
{вычислить адрес}
ar
кол-во операндов SUBS
тип переменной
PAR
входной тип переменной
выходной тип переменной
-
ME
1 ].numerator
ar
тип выражения
SME
тип выражения
тип выражения
SAE
тип выражения
тип выражения
{индекс}
тип выражения
{inc}
1
кол-во операндов
SXP
кол-во операндов
кол-во операндов
]
LE
кол-во операндов
кол-во операндов
{вычислить адрес}
ar
кол-во операндов SUBS
тип переменной
PAR
входной тип переменной
выходной тип переменной
-
usi
1 ].numerator
ar
1/ integer
{число}
адрес константы
SME
тип выражения
тип выражения
SAE
тип выражения
тип выражения
{индекс}
тип выражения
{inc}
1
кол-во операндов
SXP
кол-во операндов
кол-во операндов
]
LE
кол-во операндов
кол-во операндов
{вычислить адрес}
ar
кол-во операндов SUBS
тип переменной
PAR
входной тип переменной
выходной тип переменной
-
{число}
].numerator
ar
1
SME
integer
тип выражения
SAE
тип выражения
тип выражения
{индекс}
тип выражения
{inc}
1
кол-во операндов
SXP
кол-во операндов
кол-во операндов
]
LE
кол-во операндов
кол-во операндов
{вычислить адрес}
ar
кол-во операндов SUBS
тип переменной
PAR
входной тип переменной
выходной тип переменной
-
SME
].numerator
ar
1
integer
integer
SAE
тип выражения
тип выражения
{индекс}
тип выражения
{inc}
1
кол-во операндов
SXP
кол-во операндов
кол-во операндов
]
LE
кол-во операндов
кол-во операндов
{вычислить адрес}
ar
кол-во операндов SUBS
тип переменной
PAR
входной тип переменной
выходной тип переменной
-
SAE
].numerator
ar
1
integer
тип выражения
{индекс}
тип выражения
{inc}
1
кол-во операндов
SXP
кол-во операндов
кол-во операндов
]
LE
кол-во операндов
кол-во операндов
{вычислить адрес}
ar
кол-во операндов SUBS
тип переменной
PAR
входной тип переменной
выходной тип переменной
-
{индекс}
].numerator
ar
1
integer
{inc}
1
кол-во операндов
SXP
кол-во операндов
кол-во операндов
]
LE
кол-во операндов
кол-во операндов
{вычислить адрес}
ar
кол-во операндов SUBS
тип переменной
PAR
входной тип переменной
выходной тип переменной
-
{inc}
].numerator
ar
1
1
кол-во операндов
SXP
кол-во операндов
кол-во операндов
]
LE
кол-во операндов
кол-во операндов
{вычислить адрес}
ar
кол-во операндов SUBS
тип переменной
PAR
входной тип переменной
выходной тип переменной
-
SXP
].numerator
ar
1
2
кол-во операндов
]
LE
кол-во операндов
кол-во операндов
{вычислить адрес}
ar
кол-во операндов SUBS
тип переменной
PAR
входной тип переменной
выходной тип переменной
-
]
].numerator
ar
1
LE
2
кол-во операндов
{вычислить адрес}
ar
кол-во операндов SUBS
тип переменной
PAR
входной тип переменной
выходной тип переменной
-
LE
.numerator
ar
1
2
кол-во операндов
{вычислить адрес}
ar
кол-во операндов SUBS
тип переменной
PAR
входной тип переменной
выходной тип переменной
-
{вычислить адрес}
.numerator
ar
1
ar
2
тип переменной
PAR
входной тип переменной
выходной тип переменной
-
{вычислить адрес}
.numerator
ar
1
ar
2
тип переменной
PAR
входной тип переменной
выходной тип переменной
-
PAR
.numerator
ar
1
2
@SUBS
rational
выходной тип переменной
-
.
.numerator
ar
1
2
@SUBS
numerator
{числитель}
rational
выходной тип переменной
-
.
.numerator
ar
1
2
@SUBS
numerator
{числитель}
rational
выходной тип переменной
-
numerator
numerator
ar
1
2
@SUBS
{числитель}
rational
выходной тип переменной
-
{числитель}
ar
1
2
@SUBS
rational
выходной тип переменной
-
ar
1
2
@SUBS
@NUMERATOR