230 likes | 427 Views
Attribute Grammars. Attribute Grammar is a Framework for specifying semantics and enables Modular specification. http://knoesis.wright.edu/tkprasad/papers/Attribute-Grammars.pdf. “Correct” Programs ( no run-time errors ). S*. Regular ( lexer ). Context-free ( parser ).
E N D
Attribute Grammars Attribute Grammar is a Frameworkfor specifying semantics and enables Modularspecification. http://knoesis.wright.edu/tkprasad/papers/Attribute-Grammars.pdf L167AG
“Correct” Programs (no run-time errors) S* Regular (lexer) Context-free (parser) Context-sensitive (type-checker) L167AG
Number 46 (if base 2) 101110 (if base 10) Fraction 23/64 Unary encoding “13” ASCII Character “.” Switch positions ON-OFF-ON-… Binary string “0101110” Semantics of Bit Pattern : 0101110 L167AG
Motivation for Precise Specification • Capture subtly different semantics for the same syntax in various languages. • Arrays and strings. • Parameter passing mechanisms. • Scoping rules. • Primitive types vs Composite types. • Type equivalence. L167AG
Attribute Grammars Formalism for specifying semantics based on context-free grammars (BNF) • Static semantics (context-sensitive aspects) • Type checking and type inference • Compatibility between procedure definition and call • Scope rules • Dynamic semantics • Associate attributes with terminals and non-terminals • Associate attribute computation rules with productions L167AG
N -> 0 N -> 1 N -> N 0 N -> N 1 N . val:= 0 N . val:= 1 N . val:= 2* N. val N . val:= 2* N. val+ 1 Synthesized Attributes L167AG
Derivation Tree N N 0 N 1 110 ~> 6 1 L167AG
N -> 0 N -> 1 N -> 0 N N -> 1 N N . val:= 0 N . len:= 1 N . val:= 1 N . len:= 1 N . val:= N. val N . len:= N. len + 1 N . val:= N. val+ 2^ N. len N . len:= N. len + 1 Synthesized Attributes L167AG
Inherited Attributes • Declaration and Use { inti, j, k; i := i + j + j; } <assign-stm> -> <var> := <expr> <var>.env := <assign-stm>.env <expr>.env:= <assign-stm>.env L167AG
Inherited Attributes • Coercion Code Generation 5.0 + 2 coerce_int_to_real • Determination of un-initialized variables • Determination of reachable non-terminals • Evaluation of an expression containing variables L167AG
Attributes A(X) • Synthesized S(X) • Inherited I(X) • Attribute computation rules(Semantic functions) X0 -> X1 X2 … Xn S(X0) = f( I(X0), A(X1), A(X2), …, A(Xn) ) I(Xj) = Gj( I(X0), A(X1), A(X2), …, A(Xj-1)) for allj in1..n P( A(X0), A(X1), A(X2), …, A(Xn) ) L167AG
Information Flow inherited computed available synthesized ... ... L167AG
Synthesized Attributes Pass information up the parse tree • Inherited Attributes Pass information down the parse tree or from left siblings to the right siblings • Attribute values assumed to be available from the context. • Attribute values computed using the semantic rules provided. The constraints on the attribute evaluation rules permit top-down left-to-right (one-pass) traversal of the parse tree to compute the meaning. L167AG
E -> n | m E -> x | y E -> E1 + E2 E -> E1 * E2 E.type := int E.type := real if E1.type= E2.type then E.type:=E1.type else E.type:= real Static Semantics L167AG
Executable Specification in Prolog type(i,int). type(x,real). type(+(E,F),T) :- type(E,T), type(F,T). type(+(E,F),real) :- type(E,T1), type(F,T2), T1 \= T2. • Type Checking ?- type(+(i,x),real). • Type Inference ?- type(+(x,x),T). L167AG
E -> n | m E -> p | q E -> if E0 then E1 else E2 E.type := int E.type := bool if ( E0.type= bool ) Ù ( E1.type = E2.type ) then E.type:=E1.type elsetypeerror Static Semantics L167AG
F -> . N N -> 0 N -> 1 N -> 0 N N -> 1 N F.val:= N.val N.pow:= 1 N.val:= 0 N.val:= (1/2^N.pow) N.pow:= 1 + N.pow N.val:= N.val N.pow:= 1 + N.pow N.val:= N.val + (1/2^N.pow) Fractions L167AG
F -> . N N -> 0 N -> 1 N -> 0 N N -> 1 N F.val := N.val/ 2 N.val:= 0 N.val:= 1 N.val:= N.val / 2 N.val:= N.val/ 2 + 1 Fractions (Alternate solution) L167AG
Applications of Attribute Grammars • Compiler Generation • Top-down Parsers (LL(1)) • FIRST sets, FOLLOW sets, etc • Code Generation Computations • Type, Storage determination, etc • Databases • Optimizing Bottom-up Query Evaluation (Magic Sets) • Programming and Definitions L167AG
An Extended Example • Distinct identifiers in a straight-line program. BNF <exp> ::= <var> | <exp> + <exp> <stm> ::= <var> := <exp> | <stm> ; <stm> Attributes <var> id <exp> ids <stm> ids num • Semantics specified in terms of sets (of identifiers). L167AG
<exp> ::= <var> <exp>.ids = {<var>.id } <exp> ::= <exp1> + <exp2> <exp>.ids = <exp>.idsU<exp>.ids <stm> ::= <var> := <exp> <stm>.ids ={ <var>.id }U <exp>.ids <stm>.num = | <stm>.ids | <stm> ::= <stm1> ; <stm2> <stm>.ids = <stm1>.ids U <stm2>.ids <stm>.num = | <stm>.ids | L167AG
Alternate approach : Using lists • Attributes envi : list of vars in preceding context envo : list of vars for following context dnum : number of new variables <exp> ::= <var> <exp>.envo = ifmember(<var>.id,<exp>.envi) then <exp>.envi elsecons(<var>.id,<exp>.envi) L167AG
Attribute Computation Rules <exp> ::= <exp1> + <exp2> envienvienvi envoenvoenvo dnumdnumdnum <exp1>.envi = <exp>.envi <exp2>.envi = <exp1>.envo <exp>.envo = <exp2>.envo <exp>.dnum = length(<exp>.envo) L167AG