You are on page 1of 6

Syntax Directed Definition (SDD) 

is a kind of abstract specification. It is generalization of


context free grammar in which each grammar production X –> a is associated with it a set
of production rules of the form s = f(b1, b2, ……bk) where s is the attribute obtained from
function f. The attribute can be a string, number, type or a memory location. Semantic
rules are fragments of code which are embedded usually at the end of production and
enclosed in curly braces ({ }). 
Example:  
E --> E + T { E.val = E .val + T.val}
1 1

Annotated Parse Tree – The parse tree containing the values of attributes at each node
for given input string is called annotated or decorated parse tree. 
Features –  
 High level specification
 Hides implementation details
 Explicit order of evaluation is not specified
Types of attributes – There are two types of attributes: 
1. Synthesized Attributes – These are those attributes which derive their values from
their children nodes i.e. value of synthesized attribute at node is computed from the
values of attributes at children nodes in parse tree. 
Example:  
E --> E + T { E.val = E .val + T.val}
1 1

In this, E.val derive its values from E1.val and T.val 


Computation of Synthesized Attributes –  
 Write the SDD using appropriate semantic rules for each production in given grammar.
 The annotated parse tree is generated and attribute values are computed in bottom up
manner.
 The value obtained at root node is the final output.
Example: Consider the following grammar  
S --> E
E --> E + T
1

E --> T
T --> T * F
1

T --> F
F --> digit
The SDD for the above grammar can be written as follow 
Let us assume an input string 4 * 5 + 6 for computing synthesized attributes. The
annotated parse tree for the input string is 
For computation of attributes we start from leftmost bottom node. The rule F –> digit is
used to reduce digit to F and the value of digit is obtained from lexical analyzer which
becomes value of F i.e. from semantic action F.val = digit.lexval. Hence, F.val = 4 and
since T is parent node of F so, we get T.val = 4 from semantic action T.val = F.val. Then,
for T –> T1 * F production, the corresponding semantic action is T.val = T1.val * F.val .
Hence, T.val = 4 * 5 = 20 
Similarly, combination of E1.val + T.val becomes E.val i.e. E.val = E1.val + T.val = 26.
Then, the production S –> E is applied to reduce E.val = 26 and semantic action
associated with it prints the result E.val . Hence, the output will be 26. 

2. Inherited Attributes – These are the attributes which derive their values from their
parent or sibling nodes i.e. value of inherited attributes are computed by value of parent or
sibling nodes. 
Example:  
A --> BCD { C.in = A.in, C.type = B.type }
Computation of Inherited Attributes –  
 Construct the SDD using semantic actions.
 The annotated parse tree is generated and attribute values are computed in top down
manner.
Example: Consider the following grammar  
S --> T L
T --> int
T --> float
T --> double
L --> L , id
1

L --> id
The SDD for the above grammar can be written as follow 
Types of attributes –
Attributes may be of two types – Synthesized or Inherited.
1. Synthesized attributes –
A Synthesized attribute is an attribute of the non-terminal on the left-hand side of a production.
Synthesized attributes represent information that is being passed up the parse tree. The attribute
can take value only from its children (Variables in the RHS of the production).
For eg. let’s say A -> BC is a production of a grammar, and A’s attribute is dependent on B’s
attributes or C’s attributes then it will be synthesized attribute.
2. Inherited attributes –
An attribute of a nonterminal on the right-hand side of a production is called an inherited
attribute. The attribute can take value either from its parent or from its siblings (variables in the
LHS or RHS of the production).
For example, let’s say A -> BC is a production of a grammar and B’s attribute is dependent on
A’s attributes or C’s attributes then it will be inherited attribute.
Now, let’s discuss about S-attributed and L-attributed SDT.
1. S-attributed SDT :
 If an SDT uses only synthesized attributes, it is called as S-attributed SDT.
 S-attributed SDTs are evaluated in bottom-up parsing, as the values of the parent nodes
depend upon the values of the child nodes.
 Semantic actions are placed in rightmost place of RHS.
2. L-attributed SDT:
 If an SDT uses both synthesized attributes and inherited attributes with a restriction that
inherited attribute can inherit values from left siblings only, it is called as L-attributed SDT.
 Attributes in L-attributed SDTs are evaluated by depth-first and left-to-right parsing manner.
 Semantic actions are placed anywhere in RHS.
For example,
A -> XYZ {Y.S = A.S, Y.S = X.S, Y.S = Z.S}
is not an L-attributed grammar since Y.S = A.S and Y.S = X.S are allowed but Y.S =
Z.S violates the L-attributed SDT definition as attributed is inheriting the value from
its right sibling.
Note – If a definition is S-attributed, then it is also L-attributed but NOT vice-versa.

Example – Consider the given below SDT.


P1: S -> MN {S.val= M.val + N.val}
P2: M -> PQ {M.val = P.val * Q.val and P.val =Q.val}
Select the correct option.
A. Both P1 and P2 are S attributed.
B. P1 is S attributed and P2 is L-attributed.
C. P1 is L attributed but P2 is not L-attributed.
D. None of the above
Explanation –
The correct answer is option C as, In P1, S is a synthesized attribute and in L-
attribute definition synthesized is allowed. So P1 follows the L-attributed definition.
But P2 doesn’t follow L-attributed definition as P is depending on Q which is RHS to
it.

A dependency graph
is a graph with directed edges that represent the relationship existing between vertices. Its
typical usage consists of describing processes, such as those in the development of
software; or relationships, such as those contained in a knowledge graph.

You might also like