Sintassi: Programma e classi Program::=prog {ClassDeclList {StatList}} ClassDeclList::=ClassDecl ClassDeclList | ClassDecl::=class Ide c [StaticMetDefList] StaticMetDefList::=StaticMetDef StaticMetDefList | StaticMetDef::=public static TypeR Ide m (Type Ide a ) {StatList} Command::=...| Ide c.Ide m (Exp) |... Exp::=...| Ide c.Ide m (Exp) TypeR::= Type | void Type::=int | boolean |...
Esempio prog{ class Num { public static int fact (int p) { if (p==0) return 1; else return p *fact(p-1);} { int y; int x=5; if (x>=0) y=Num.fact(x);}} public class Num { public static int fact (int p) { if (p==0) return 1; else return p *fact(p-1);} public static void main (String [ ] args) { int y; int x=5; if (x>=0) y=Num.fact(x); }} programma Java programma nel linguaggio didattico
Classi: class Num {public static int fact (int p) { if (p==0) return 1; else return p*fact(p-1);} public static void main (String [] args){...}} Ambienti delle classi: Cenv Cenv = {Ide Menv x x Menv} Menv = {Ide Ide x Block} metodi statici: main e operazioni di uso generale c = {Num -> } s ={fact ->, main -> } Il Nuovo Stato : Cenv x
Sistema di transizioni per: Semantica dei Comandi S S com ={< com, T com, com } com = { | C Com, , c c Cenv} > { | } > T com = { | } com = {(=),..., tutte le regole che vedremo }
classdecl c com classdecl c > com prog prog (prog) Semantica: il programma
c ’ c ” c ’ c ” <ClassDecl ClassDeclList, c c ” <ClassDecl ClassDeclList, c c ” cmd s cmd s / c] c [ / c] (classdecllist) Semantica: classi (classdecl)
s [ /m] s [ /m] s ’ s ” s ’ s ” < StaticMetDef StaticMetDefList, s s ” < StaticMetDef StaticMetDefList, s s ” (SMD) (SMDLl) Semantica: metodi statici (che non calcolano un risultato)
s (m)= > v c (ideC)= s (m)= > ’ > ’ > Semantica: metodi statici (che non calcolano un risultato) invocazione invoc
Ambiente del metodo (ovvero Identificatori noti nel metodo) Si desume dallo stato di valutazione del Blocco corpo del metodo, e cioè: – –l’ambiente delle classi c – –lo stack contenente il(i) parametro(i) [v/x]. f La politica di scoping di Java è statica e pertanto le variabli definite nello stato di invocazione del metodo risultano NON accessibili. Linguaggi in cui, invece, le variabili definite nello stato di invocazioni sono accessibili sono linguaggi a scoping dinamico. Linguaggi a scoping dinamico esistono anche se non sono molto diffusi (Lisp), perchè di difficile comprensione
s (m)= > v c (ideC)= s (m)= ’ ’ > ’(retVal) > v > [v/retVal] (return) Semantica: metodi statici (che calcolano un risultato) invoc (Exp)
Espressioni: semantica (B () ) (B true ) > exp b > exp b’ b [op] b’ = b” > exp b” > exp b > exp b’ b [|] b’ = b” > exp b” > exp b exp b’ b [&] b’ = b” > exp b” > exp b not b = b’ (x)= b ! E exp b’ > exp b > exp tt > exp ff (B Ide ) (B | ) (B & ) (B ! ) (BE op ) (B false ) (B true )