6.0 Introduction

6.1 Static Checking

6.2 Attribute Grammars

6.3 Translation to an IR

6.4 Semantic Analyzer Generators

6.5 More on Attribute Grammars

6.6 Attribute Evaluation

6.7 Summary

Web References

Exercises

6.2.4 A More Practical Example

Example 2 is a more practical one; it might be used by a symbol table routine to attach type information to the variables in a declaration.

EXAMPLE 2 Assigning declaration types to variables

    Consider the following attribute grammar:

         Real    A,B,Q
         Integer X,Y,Q
    and the following grammar:
         Declaration   Type List
    
         List          Variable
    
         List          List , Variable
    
         Type          Real | Integer
    Adding Attributes,
    Declaration  Type List            List.Class := Type.Class
    List         Variable             Variable.Class := List.Class
    List0        List1, Variable      List1.Class := List0.Class
                                       Variable.Class := List0.Class
    Type         Real | Integer       Type.Class := LexValue(Type)

    where LexValue is the value of the token (Real or Integer) found by the lexical analyzer. This attribute, Class, for the nonterminal Type in the last production, is said to be intrinsic because its value is given, not computed. There is again only one attribute, Class. It is an inherited attribute since its value is computed while going down the tree. This can be seen by noticing that the semantic functions compute the attribute for the grammar symbols on the right-hand side of production in terms of the values on the left-hand side. For example, in the semantic function:

      Variable.Class := List.Class

    The nonterminal "Variable" appears on the right-hand side of the production:

      List Variable

    while the nonterminal "List" appears on the left-hand side.

    The parse tree before attribute evaluation for the first line above is:


Send questions and comments to: Karen Lemone