- •Пояснительная записка
- •1 Формальная постановка задачи
- •2 Описание входного языка
- •2.1. Синтаксис входного языка
- •2.2. Семантика входного языка
- •2.2.1.Встроенные типы данных входного языка
- •2.2.2.Операции входного языка и их приоритет
- •2.2.3.Конструкции входного языка
- •3 Описание этапа лексического анализа
- •3.1 Описание типов лексем
- •3.2 Функции лексического анализатора
- •3.3 Тестирование лексического анализатора
- •4 Описание этапа синтаксического анализа
- •4.1 Исходная порождающая кс-грамматика
- •4.2 Разбиение исходной грамматики на подграмматики
- •4.3. Разработка дмп-процессора, порожденного исходной грамматикой
- •4.3.1 Алгоритм разбора для ll(1)-грамматик
- •4.3.2 Взаимодействие дмп-процессоров
- •4.3.3 Алгоритм работы дмп-процессора
- •4.3.4 Управляющие таблицы дмп-процессоров
- •4.3. Описание перевода во внутренний язык
- •4.3.1 Формат тетрады
- •4.3.2 Формат тетрад для представления основных операторов
- •4.3.3 Представление основных операторов(описанных в разделе семантики) с помощью тетрад
- •4.4.4 Взаимодействие атг с имеющимися таблицами лексического анализатора
- •4.4.5 Разработка атрибутной транслирующей грамматики
- •4.4.6 Описание используемых операционных символов
- •4.4.7 Атрибутный перевод дляLl(1)-грамматик
- •4.4.8 Атрибутный дмп-процессор
- •4.4.9 Тестовый пример
- •Список литературы
- •Приложение 1 Тестирование дмп-процессора
4.4.5 Разработка атрибутной транслирующей грамматики
------------------Основная грамматика----------------------------
<P> → void main(){ DVAR}
<DVAR> → DECVAR ; DVAR
DVAR → DVEC
DVAR → COP
DVEC → DEVEC; DVEC
DVEC →COP
------------------Подграмматика типов--------------------------------
DECVAR, -> BASEp VARname {AddVar}q,r
q <- p //класс типа
r <- name //имя переменной данного типа
BASEp -> intv
p <- v //класс типа
BASEp -> floatv
p <- v
BASEp -> boolv
p <- v
DECVEC -> vector VARname [ CI t] {AddVec}q,p,d ; DECVEC
r <- vector //класс типа
p <- name //имя вектора
d <- t //размерность – значение константы CI
DECVEC ->
------------------Подграмматика операторов-------------------------
COP → SOP
SOP → OP; SOP
SOP →
OP → LABELq: ULO
OP → ULO
ULO →for(EQOname; LEXend; EQOstep) {begin_cycle} m1, m2, p1, p2, p3, p4 COP {end_cycle}p1, p2, p3, p4
m1 <- NewLabel // метка начала цикла
m2 <- NewLabel // метка конца цикла
p1 <- name // имя переменной цикла
p2 <- begin // начальное значение
p3 <- step // шаг цикла
p4 <- end // граничное значение
ULO → EQO
EQO →VAR q EQRS t,e {ASS}p1, p2, p3t
p2 <- q //адрес переменной в таблице
p1<-t //тип операции присваивания
p3 <-e //адрес значения выражения в таблице
ULO → goto LABEL p {BRL} q
p <- q //адрес
LABELq → IDENTp {DEFLq, , }q
q <- p
ULO → IF2p OP{DEFL}m
mp
IF2p → if (LEXvalue) {BF}m, v
m NewLabel
p m
vvalue
ULO → IF2p COP IF3q1, q2 COP {DEFL}m
mq1
q2p
IF3q1, q2 → else{BRL}m1{DEFL}m2
m1 NewLabel
q1 m1
m2q2
OP ->
ULO → cin>>VAR p {CIN} m
p <- m //адрес
ULO →cout <<VAR p {COUT} m
m <- p //адрес значения переменной
EQRS t,e → =EXP p
t <- код для операции = //тип присваивания
e <- p //адрес значения выражения в таблице
EQRS t,e → +=EXP p
t <- код для операции +=
e <- p
EQRS t,e → -=EXP p
t <- код для операции -=
e <- p
EQRS t,e → *=EXP p
t <- код для операции *=
e <- p
EQRS t,e → /=EXP p
t <- код для операции .=
e <- p
------------------Подграмматика переменной --------------------------------------------
VARname,type,eql → IDENTr
name <- адрес IDENT
type<- код типа вектор
eql<- r-значение из таблицы идентификаторов
VAR name,type,eql → [ ELEMp SELEMq,n]
name <- 10 //это будет безымянная переменная
type<- код типа вектор
eql<- n – размерность вектора
SELEMq,n → , ELEMr SELEMq1,n1
q<-q1
n<-n1+1
SELEMp →
p<-10
n<-1
ELEMe → IDENTr SENDind,n,e
n<-r
SEND ind,n,e → [ CI ] {SUBS name, ind, r}
ind <- CI
e<- GetNew
SEND ind,n,e →
ind <- 10
n<-10
e<-10
ELEM i → CF t
i<-t //адрес CF
VAR name,type,eql →CI t
name<-10
type<- код для int
eql<-t //адрес CI
------------------------ Подграмматика выражения ---------------------------
EXP r → EXPS q SAE t,type {ADD}p1, p2, p3,p4
p1<-q
p2<-t
r<-p3
p4<- type
SAE t,type → + AEr SAE t,type
t<- k
type<- код операции для сложения
SAE t,type → - AEr SAE t,type
SAE t,type -> (EXPr)
t<- r
type<- 10
EXPSq →++ AEr {++}p1
p1<- r
EXPS q → -- AEr {--}p1
p1<- r
EXPS q → AEr
EXPS q → ~ VEC r,t {~}p1, p2
p1<- r
p2<- getNew
q<- p2
AEr → ME t SME q,type {MUL}p1, p2, p3,p4
r<- p3
p1<-t
p2 <-q
p4<- type
p4<- getNew
SME q,type → * ME t SME
q<- t
type<- код для *
SME q,type → / ME t SME
q<- t
type<- код для /
SME q,type → (EXP)
q<- 10
type<- 10
MEt → ( EXPr )
t<-r
MEt → VAR name,type,eql
t<- eql
------------------ Подграмматика логического выражения ------------------
LEXl → Cv or SCm {OR}p1, p2, r
p1<- v
p2<- m
r<- getNew
l <-r
SCm -> (LEXl)
m<- l
SCm→
m<-10
LEXl→RELp
l<- p
C res →LMq and SLMy {AND}p1, p2, r
p1<- q
p2<- y
r<- getNew
res<- r
SLMy→ SLMp
y<-p
SLMy→
y<- 10
LMq→( LEXl )
q<-l
LMq→not LMp {NOT}p1, r
p1<- p
r<- getNew
q<- r
RELp→ EXP r REOq,res
q<- r
p<- res
REOq,res→ < EXP t {REL}p1, p2, p3, r
p1<-код операции <
p2<- q
p3<- t
r<- getNew
res<-r
REOq,res→ > EXP t {REL}p1, p2, p3, r
p1<-код операции >
p2<- q
p3<- t
r<- getNew
res<-r
REOq,res→ == EXP t {REL}p1, p2, p3, r
p1<-код операции ==
p2<- q
p3<- t
r<- getNew
res<-r
REOq,res→ <= EXP t {REL}p1, p2, p3, r
p1<-код операции <=
p2<- q
p3<- t
r<- getNew
res<-r
REOq,res→ >= EXP t {REL}p1, p2, p3, r
p1<-код операции >=
p2<- q
p3<- t
r<- getNew
res<-r
REOq,res→ != EXP t {REL}p1, p2, p3, r
p1<-код операции !=
p2<- q
p3<- t
r<- getNew
res<-r