Upload
others
View
4
Download
0
Embed Size (px)
Citation preview
D. Lucanu – Programare Algebrica
Curs 4• Aplicatie: semantica algebrica a programelor
– sintaxa l.p. (in Maude)– cod Maude asociat unui program sursa– semantica operationala
D. Lucanu – Programare Algebrica
Limbajul de programare
• tipurile int si bool• variabile simple de tip int• tablouri de int-uri• expresii aritmetice:
+ - * / %
• expresii booleene: < <= > >= == != && || !
• instructiuni: atribuirea, if, if-else, while, {...}• sintaxa l.p. poate fi precizata in Maude
– Maude este utilizata ca metalimbaj– cu sistemul Maude obtinem un analizor sintactic pe
gratis
D. Lucanu – Programare Algebrica
Definitia limbajului: ierarhia modulelor
INT IDENT
DECL
EXPR
TST
INSTR
PGM
D. Lucanu – Programare Algebrica
Precizarea sintaxei l.p. in Maude: identificatorifth IDENT is
sort Ident .ops a b c d : -> Ident .ops A B C D : -> Ident .*** etc
endfth
D. Lucanu – Programare Algebrica
Precizarea sintaxei l.p. in Maude: declaratii
fth DECL isinc INT .inc IDENT .sorts IdentList VarDecl ArrDecl Decl .subsorts VarDecl ArrDecl < Decl .subsort Ident < IdentList .
op _,_ : IdentList IdentList -> IdentList[assoc].
op int_; : IdentList -> VarDecl .op int_[_] ; : Ident Nat -> ArrDecl
[strat (1 2 0)].op _ _ : Decl Decl -> Decl [assoc] .
endfth
D. Lucanu – Programare Algebrica
Precizarea sintaxei l.p. in Maude: expresiiaritmetice
fth EXP is inc DECL .sort Exp ArrComp .subsorts Int Ident ArrComp < Exp .
*** array componentop (_[_]) : Ident Exp -> ArrComp
[strat (1 2 0)] .op _+_ : Exp Exp -> Exp [ ditto ] .op _-_ : Exp Exp -> Exp [ ditto ] .op _*_ : Exp Exp -> Exp [ ditto ] .op _/_ : Exp Exp -> Exp [ prec 31 ] .op _%_ : Exp Exp -> Exp [ prec 31 ] .
endfth
D. Lucanu – Programare Algebrica
Precizarea sintaxei l.p. in Maude: expresii booleene
fth TST is inc EXP .sort Tst .subsort Bool < Tst .op _==_ : Exp Exp -> Tst [ prec 34 ] .op _!=_ : Exp Exp -> Tst [ prec 34 ] .op _<_ : Exp Exp -> Tst [ ctor ditto ] .op _<=_ : Exp Exp -> Tst [ ctor ditto ] .op _>_ : Exp Exp -> Tst [ ctor ditto ] .op _>=_ : Exp Exp -> Tst [ ctor ditto ] .op _&&_ : Tst Tst -> Tst [assoc comm prec 35] .op _||_ : Tst Tst -> Tst [assoc comm prec 36] .op !_ : Tst -> Tst .
endfth
D. Lucanu – Programare Algebrica
Precizarea sintaxei l.p. in Maude: instructiuni
fth INSTR is inc TST .sorts Instr InstrSeq .subsort Instr < InstrSeq .op _=_; : Ident Exp -> Instr [prec 20] .op _=_; : ArrComp Exp -> Instr [prec 20] .op if (_)_ : Tst Instr -> Instr .op while (_)_ : Tst Instr -> Instr .op skip ; : -> Instr .op _ _ : InstrSeq InstrSeq -> InstrSeq .op {_} : InstrSeq -> Instr .
endfth
D. Lucanu – Programare Algebrica
Precizarea sintaxei l.p. in Maude: programefth PGM is
inc INSTR .sorts Pgm .op __ : Decl Instr -> Pgm .
endfth
D. Lucanu – Programare Algebrica
Verificarea sintaxei unui programfth EX is
inc PGM .op PTEST : -> [Pgm] .eq PTEST =
int x ;int a[10] ; {
x = 1 ; (a[1]) = 10 ;
} .endfth
Maude> red PTEST .reduce in EX : PTEST .rewrites: ...result Pgm: (int x ; int a[10] ;)
{x = 1 ; (a[1]) = 10 ;}
D. Lucanu – Programare Algebrica
Codul Maude a unui program sursa
cod Maudecod sursa
fth SWAP-OBJ isinc OBJCODE .op x y t : -> SimVar .op body : InstrSeq .eq body = (t <- x;
x <- y;y <- t;) .
enfth
// SWAPint x, y, t;{
t = x;x = y;y = t;
}
D. Lucanu – Programare Algebrica
Cod Maude: ierarhia modulelor
VAR
OBJEXPR
OBJTST
OBJINSTR
OBJCODE
D. Lucanu – Programare Algebrica
Limbajul cod-Maudefth VAR is
sorts SimVar ArrVar .endfth
fmod OBJEXP{X :: VAR} is *** ...
endfm
fmod OBJTST{X :: VAR} isinc OBJEXP{X} .*** ...*** obs. == este codat cu ===
endfm
D. Lucanu – Programare Algebrica
Limbajul cod-Maude (continuare)fmod OBJINSTR{X :: VAR} is
*** ...*** obs. op de atrib = este codat cu <-
endfm
fmod OBJCODE{X :: VAR} is*** ...*** obs. == este codat cu ===
endfm
D. Lucanu – Programare Algebrica
Compilarea sursei in cod Maude
op a : -> SimVar .
int a;
op b : -> ArrVar .eq size(b) = n .
int b[n];
op Instrn : -> ObjInstr .eq Instrn = x <- obj(expr) .nume(x = expr;) = Instrn
x = expr;
D. Lucanu – Programare Algebrica
Compilarea sursei in cod Maude (continuare)
obj(Instrucţiune1)op Instrn : -> ObjInstr .eq Instrn = if (obj(expr))
{nume(obj(Instrucţiune1)) }nume(if ...) = Instrn
if (expr) Instrucţiune1
obj(Instrucţiune1)op Instrn : -> ObjInstr .
eq Instrn = while (obj(expr)) {nume(obj(Instrucţiune1)) }
nume(while ...) = Instrn
while (expr) Instrucţiune1
D. Lucanu – Programare Algebrica
Semantica operationala algebrica - memoria
sorts Store EStore .subsort Store < EStore .op _[[_]] : Store SimVar -> Int .op _[[_]] : Store ArrComp -> Int .
D. Lucanu – Programare Algebrica
Semantica operationala algebrica - evaluare expresii
op _[[_]] : Store ObjExp -> Int .*** ...eq S[[N]] = N .eq S[[E1 + E2]] = S[[E1]] + S[[E2]] .eq S[[E1 - E2]] = S[[E1]] - S[[E2]] .eq S[[E1 * E2]] = S[[E1]] * S[[E2]] .eq S[[E1 / E2]] = S[[E1]] quo S[[E2]] .eq S[[E1 % E2]] = S[[E1]] rem S[[E2]] .
D. Lucanu – Programare Algebrica
Semantica operationala algebrica - evaluare teste
op _[[_]] : Store ObjTst -> Bool .eq S[[TB]] = TB .eq S[[E1 === E2]] = (S[[E1]] is S[[E2]]) .eq S[[E1 != E2]] = not (S[[E1]] is S[[E2]]) .eq S[[E1 <= E2]] = (S[[E1]] <= S[[E2]]) .eq S[[E1 < E2]] = (S[[E1]] < S[[E2]]) .eq S[[E1 >= E2]] = (S[[E1]] >= S[[E2]]) .eq S[[E1 > E2]] = (S[[E1]] > S[[E2]]) .eq S[[T1 || T2]] = S[[T1]] or S[[T2]] .eq S[[T1 && T2]] = S[[T1]] and S[[T2]] .eq S[[! T]] = (not S[[T]]) .
D. Lucanu – Programare Algebrica
Semantica operationala algebrica – instr. de atribuire
op _[[_]] : Store ObjInstr -> Store .op _[[_]] : Store ObjInstrSeq -> Store .
eq (S[[ X <- E; ]])[[ Y ]] = if (X == Y)then S[[ E ]]else S[[ Y ]]
fi .eq (S[[ X <- E; ]]) [[ A[I] ]] = S[[ A[I] ]] . eq (S[[ A[E1] <- E2; ]])[[ B[I] ]] =
if (A == B)then if (S[[ E1 ]] is I)
then S[[ E2 ]]else S[[ A[I] ]]
fielse S[[ B[I] ]]
fi .eq (S[[ A[E1] <- E2; ]]) [[ Y ]] = S[[ Y ]] .
D. Lucanu – Programare Algebrica
Semantica operationala algebrica – compunerea secventiala
eq (S[[ P1 P2 ]]) [[ X ]] = ((S[[ P1 ]])[[ P2 ]])[[ X ]] .
eq (S[[ P1 P2 ]])[[ A[I] ]] = ((S[[ P1 ]])[[ P2 ]])[[ A[I] ]] .
D. Lucanu – Programare Algebrica
Semantica operationala algebrica – instr. if-else
eq (S[[if T INSTR1 else INSTR2 ]]) [[ X ]] =if (S[[ T ]])
then (S[[ INSTR1 ]])[[ X ]]else (S[[ INSTR2 ]])[[ X ]]
fi .eq (S[[if T INSTR1 else INSTR2]])[[ A[I] ]] =
if (S[[ T ]])then (S[[ INSTR1 ]])[[ A[I] ]]else (S[[ INSTR2 ]])[[ A[I] ]]
fi .
D. Lucanu – Programare Algebrica
Semantica operationala algebrica – instr. while
eq (S[[while T INSTR1]]) [[ X ]] =if (S [[ T ]])
then (S [[ INSTR1 while T INSTR1 ]])[[ X ]]else S [[ X ]]
fi .eq (S[[ while T INSTR1]])[[ A[I] ]] =
if (S[[ T ]])then (S[[ INSTR1 while T INSTR1 ]])[[ A[I] ]]else S[[ A[I] ]]
fi .
D. Lucanu – Programare Algebrica
Memorie nedefinita
• programulwhile (true)i = i+1;
• nu are proprietatea de terminare• ... decis[[while (true) i = i+1;]] =s[[i = i+1; while (true) i = i+1;]] =s[[i = i+1; i = i+1; while (true) i = i+1;]] = ...
este nedefinita• notam
s[[while (true) do i = i+1;]] = ⊥