1 / 23

Attribute Grammars

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 ).

garret
Download Presentation

Attribute Grammars

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. Attribute Grammars Attribute Grammar is a Frameworkfor specifying semantics and enables Modularspecification. http://knoesis.wright.edu/tkprasad/papers/Attribute-Grammars.pdf L167AG

  2. “Correct” Programs (no run-time errors) S* Regular (lexer) Context-free (parser) Context-sensitive (type-checker) L167AG

  3. 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

  4. 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

  5. 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

  6. 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

  7. Derivation Tree N N 0 N 1 110 ~> 6 1 L167AG

  8. 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

  9. 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

  10. 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

  11. 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

  12. Information Flow inherited computed available synthesized ... ... L167AG

  13. 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

  14. 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

  15. 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

  16. 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

  17. 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

  18. 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

  19. 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

  20. 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

  21. <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

  22. 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

  23. Attribute Computation Rules <exp> ::= <exp1> + <exp2> envienvienvi envoenvoenvo dnumdnumdnum <exp1>.envi = <exp>.envi <exp2>.envi = <exp1>.envo <exp>.envo = <exp2>.envo <exp>.dnum = length(<exp>.envo) L167AG

More Related