- •Задание
- •Описание языка
- •Описания и типы
- •Способы описания собственных типов:
- •Описание констант:
- •Описание переменных:
- •Имена и выражения Выражения:
- •Переменные:
- •Операторы
- •Оператор присваивания
- •Структуры данных
- •Подграмматика для выражения:
- •Подграмматика для описания типов:
- •Подграмматика для переменных:
- •Подграмматика для операторов:
- •Описание промежуточного языка
- •Описание перевода (таг) каждой конструкции входного языка Основная грамматика:
- •Подграмматика для выражения:
- •Подграмматика для описания типов:
- •Подграмматика для переменных:
- •Подграмматика для операторов:
Описание перевода (таг) каждой конструкции входного языка Основная грамматика:
Нетерминалы:
PRG |
программа |
|
RL |
раздел меток |
|
RC |
раздел констант |
|
RT |
раздел типов |
|
RV |
раздел переменных |
|
RO |
раздел операторов |
|
OM |
определение метки |
|
OM` |
остаток определения метки |
|
OC |
определение константы |
|
OC` |
остаток определения константы |
|
ICp |
имя константы |
p - синтезированный |
CNSp |
константа |
p - синтезированный |
CNSNp |
константа без знака |
p - синтезированный |
OT |
определение типа |
|
OT` |
остаток определения типа |
|
ITp |
имя типа |
p - синтезированный |
TYPP |
тип |
p - синтезированный |
OV |
определение переменной |
|
OV` |
остаток определения переменной |
|
LIp |
список имен |
p - синтезированный |
OPS |
составной оператор |
|
PRG ® RL RC RT RV RO .
RL ® lab OM ; OM`
RL ® e
OM` ® OM ; OM`
OM` ® e
OM ® lblp1 {:метка}r,p2
r¬НОВМЕТ
p2¬p1
RC ® con OC ; OC`
RC ® e
OC` ® OC ; OC`
OC` ® e
OC ® ICp1 = CNSq1 {константа}p2,q2,r
r¬НОВКОН
p2¬p1
q2¬q1
CNSp2 ® + CNSNSp1
p2¬p1
CNSp2 ® - CNSNSp1
p2¬p1
CNSp2 ® CNSNSp1
p2¬p1
CNSNSp2 ® nump1
p2¬p1
CNSNSp2 ® ICp1
p2¬p1
ICp2 ® idp1
p2¬p1
RT ® typ OT ; OT`
RT ® e
OT` ® OT ; OT`
OT` ® e
OT ® ITp1 = TYPq1 {тип}p2,q2,r
r¬НОВТИП
p2¬p1
q2¬q1
ITp2 ® idp1
p2¬p1
RV ® var OV ; OV`
RV ® e
OV` ® OV ; OV`
OV` ® e
OV ® LIp1 : TYPq1 {переменная}p2,q2,r
r¬НОВПЕР
p2¬p1
q2¬q1
RO ® beg OPS end
НОВМЕТ - процедура, которая выдает значение указателя на свободную позицию таблицы меток.
НОВКОН - процедура, которая выдает значение указателя на свободную позицию таблицы констант.
НОВТИП - процедура, которая выдает значение указателя на свободную позицию таблицы типов.
НОВПЕР - процедура, которая выдает значение указателя на свободную позицию таблицы идентификаторов.
Операционные символы:
{:метка}A1,A2 |
Сопоставляет имя метки А1 с номером позиции в таблице меток. |
{константа}A1,A2,A3 |
Записывает имя А1 и значение А2 константы в таблицу констант по адресу A3. |
{тип}A1,A2,A3 |
Записывает имя А1 и значение А2 типа в таблицу типов по адресу A3. |
{переменная}A1,A2,A3 |
Записывает имя А1 и тип А2 переменной в таблицу идентификаторов по адресу A3. |
Подграмматика для выражения:
Нетерминалы:
Et |
выражение |
t - синтезированный |
E`p,t |
остаток выражения |
p - унаследованный,t - синтезированный |
EARt |
арифметическое выражение |
t - синтезированный |
Tt |
терм |
t - синтезированный |
T`p,t |
остаток терма |
p - унаследованный,t - синтезированный |
Pt |
произведение |
t - синтезированный |
P`p,t |
остаток произведения |
p - унаследованный,t - синтезированный |
Ft |
фактор |
t - синтезированный |
VARt |
переменная |
t - синтезированный |
Et2 ® EARp1 E`p2,t1
p2¬p1
t2¬t1
E`p1,t2 ® = EARq1 {равно}p2,q2,r2 E`r2,t1
r1,r2¬НОВЭЛТ
p2¬p1
q2¬q1
t2¬t1
E`p1,t2 ® < EARq1 {меньше}p2,q2,r2 E`r2,t1
r1,r2¬НОВЭЛТ
p2¬p1
q2¬q1
t2¬t1
E`p1,t2 ® > EARq1 {больше}p2,q2,r2 E`r2,t1
r1,r2¬НОВЭЛТ
p2¬p1
q2¬q1
t2¬t1
E`p1,p2 ® e
p2¬p1
EARt2 ® + Tt1
t2¬t1
EARt2 ® - Tt1 {поменять_знак}t1
t2¬t1
EARt2 ® Tt1
t2¬t1
Tt2 ® Pp1 T`p2,t1
p2¬p1
t2¬t1
T`p1,t2 ® + Pq1 {сложить}p2,q2,r2 T`r2,t1
r1,r2¬НОВЭЛТ
p2¬p1
q2¬q1
t2¬t1
T`p1,t2 ® - Pq1 {вычесть}p2,q2,r2 T`r2,t1
r1,r2¬НОВЭЛТ
p2¬p1
q2¬q1
t2¬t1
T`p1,p2 ® e
p2¬p1
Pt2 ® Fp1 P`p2,t1
p2¬p1
t2¬t1
P`p1,t2 ® * Fq1 {умножить}p2,q2,r1 P`
r1,r2¬НОВЭЛТ
p2¬p1
q2¬q1
t2¬t1
P`p1,t2 ® / Fq1 {делить}p2,q2,r1 P`r2,t1
r1,r2¬НОВЭЛТ
p2¬p1
q2¬q1
t2¬t1
P`p1,p2 ® e
p2¬p1
Ft2 ® cnst1
t2¬t1
Ft2 ® ( EARt1 )
t2¬t1
Ft2 ® VARt1
t2¬t1
НОВЭЛТ - процедура, которая выдает значение указателя на свободную позицию таблицы, используемой для запоминания результата.
Операционные символы:
{равно}A1,А2,R |
R = адрес триады, сгенерированной в соответствии с таблицей 1 |
{меньше}A1,А2,R |
R = адрес триады, сгенерированной в соответствии с таблицей 2 |
{больше}A1,А2,R |
R = адрес триады, сгенерированной в соответствии с таблицей 3 |
{поменять_знак}A |
Генерируется триада в соответствии с таблицей 4 |
{сложить}A1,А2,R |
R = адрес триады, сгенерированной в соответствии с таблицей 5 |
{вычесть}A1,А2,R |
R = адрес триады, сгенерированной в соответствии с таблицей 6 |
{умножить}A1,А2,R |
R = адрес триады, сгенерированной в соответствии с таблицей 7 |
{делить}A1,А2,R |
R = адрес триады, сгенерированной в соответствии с таблицей 8 |
Таблица 1:
== |
integer |
real |
complex |
boolean |
integer |
==I A1,A2 |
|
|
|
real |
|
==R A1,A2 |
|
|
complex |
|
|
==C A1,A2 |
|
boolean |
|
|
|
==B A1,A2 |
Таблица 2:
< |
integer |
real |
complex |
boolean |
integer |
<I A1,A2 |
|
|
|
real |
|
<R A1,A2 |
|
|
complex |
|
|
<C A1,A2 |
|
boolean |
|
|
|
<B A1,A2 |
Таблица 3:
> |
integer |
real |
complex |
boolean |
integer |
>I A1,A2 |
|
|
|
real |
|
>R A1,A2 |
|
|
complex |
|
|
>C A1,A2 |
|
boolean |
|
|
|
>B A1,A2 |
Таблица 4:
- (бинарный) |
integer |
real |
complex |
boolean |
integer |
negI A1,A2 |
|
|
|
real |
|
negR A1,A2 |
|
|
complex |
|
|
negC A1,A2 |
|
boolean |
|
|
|
|
Таблица 5:
+ |
integer |
real |
complex |
boolean |
integer |
addI A1,A2 |
|
|
|
real |
|
addR A1,A2 |
|
|
complex |
|
|
addC A1,A2 |
|
boolean |
|
|
|
|
Таблица 6:
- |
integer |
real |
complex |
boolean |
integer |
subI A1,A2 |
|
|
|
real |
|
subR A1,A2 |
|
|
complex |
|
|
subC A1,A2 |
|
boolean |
|
|
|
|
Таблица 7:
* |
integer |
real |
complex |
boolean |
integer |
mulI A1,A2 |
|
|
|
real |
|
mulR A1,A2 |
|
|
complex |
|
|
mulC A1,A2 |
|
boolean |
|
|
|
|
Таблица 8:
/ |
integer |
real |
complex |
boolean |
integer |
divI A1,A2 |
|
|
|
real |
|
divR A1,A2 |
|
|
complex |
|
|
divC A1,A2 |
|
boolean |
|
|
|
|