Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Курсовая работа по ТЯП. / готовый курсовик.doc
Скачиваний:
36
Добавлен:
01.05.2014
Размер:
1.2 Mб
Скачать

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

mp

IF2p → if (LEXvalue) {BF}m, v

m NewLabel

p m

vvalue

ULO → IF2p COP IF3q1, q2 COP {DEFL}m

mq1

q2p

IF3q1, q2 → else{BRL}m1{DEFL}m2

m1 NewLabel

q1 m1

m2q2

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