0% found this document useful (0 votes)
24 views19 pages

Lecture4-Semantic Analysis

The document discusses semantic analysis in compiler design. It explains that semantic analysis interprets the parse tree generated by syntax analysis by adding semantic meaning and type information. It checks for semantic errors like type mismatches. Semantic analysis is performed using attribute grammars, which extend context-free grammars with semantic attributes. There are two types of attributes - synthesized attributes which flow bottom-up and inherited attributes which can flow in any direction subject to restrictions. Syntax directed translations are used to evaluate attributes during semantic analysis.

Uploaded by

sabbir hossain
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
Download as pdf or txt
0% found this document useful (0 votes)
24 views19 pages

Lecture4-Semantic Analysis

The document discusses semantic analysis in compiler design. It explains that semantic analysis interprets the parse tree generated by syntax analysis by adding semantic meaning and type information. It checks for semantic errors like type mismatches. Semantic analysis is performed using attribute grammars, which extend context-free grammars with semantic attributes. There are two types of attributes - synthesized attributes which flow bottom-up and inherited attributes which can flow in any direction subject to restrictions. Syntax directed translations are used to evaluate attributes during semantic analysis.

Uploaded by

sabbir hossain
Copyright
© © All Rights Reserved
Available Formats
Download as PDF, TXT or read online on Scribd
Download as pdf or txt
Download as pdf or txt
You are on page 1/ 19

Compiler Design (CSE 335)

Lecture4 - Semantic Analysis

Papia Akter
Lecturer, Dept. of CSE
Prime University
Semantic Analysis
• The plain parse-tree constructed in syntax phase is generally of no use for a
compiler, as it does not carry any information of how to evaluate the tree.
• The productions of context-free grammar, which makes the rules of the language,
do not accommodate how to interpret them.
• For example:
• E→E+T
• The above CFG production has no semantic rule associated with it, and it cannot
help in making any sense of the production.
Semantics
• Semantics of a language provide meaning to its constructs, like tokens and
syntax structure.
• Semantics help interpret symbols, their types, and their relations with each
other.
• Semantic analysis judges whether the syntax structure constructed in the source
program derives any meaning or not.
• CFG + semantic rules = Syntax Directed Definitions
Semantics
• For example:
int a = “value”;
• This coding line should not issue an error in lexical and syntax analysis phase,
as it is lexically and structurally correct.
• But it should generate a semantic error as the type of the assignment differs.
• These rules are set by the grammar of the language and evaluated in semantic
analysis.
Tasks Performed by Semantic Analysis
• The following tasks should be performed in semantic analysis:
 Scope resolution
 Type checking
 Array-bound checking
Semantic Errors
• We have mentioned some of the semantics errors that the semantic analyser is
expected to recognize:
 Type mismatch
 Undeclared variable
 Reserved identifier misuse.
 Multiple declaration of variable in a scope.
 Accessing an out-of-scope variable.
 Actual and formal parameter mismatch.
Attribute Grammar
• Attribute grammar is a special form of context-free grammar where some
additional information (attributes) is appended to one or more of its non-
terminals in order to provide context-sensitive information.
• Each attribute has well-defined domain of values, such as integer, float, character,
string, and expressions.
• Attribute grammar (when viewed as a parse-tree) can pass values or information
among the nodes of a tree.
Attribute Grammar
• Example:
• E → E + T { E.value = E.value + T.value }
• The right part of the CFG contains the semantic rules that specify how the
grammar should be interpreted.
• Here, the values of non-terminals E and T are added together and the result
is copied to the non-terminal E.
Attribute Grammar
• Semantic attributes may be assigned to their values from their domain at the
time of parsing and evaluated at the time of assignment or conditions.
• Based on the way the attributes get their values, they can be broadly divided into
two categories:
• (a) Synthesized attributes and
• (b) Inherited attributes.
(a) Synthesized Attributes
• These attributes get values from the attribute values of their child nodes. To
illustrate, assume the following production:
• S → ABC
• If S is taking values from its child nodes (A,B,C), then it is said to be a
synthesized attribute, as the values of ABC are synthesized to S.
• As in our previous example (E → E + T), the parent node E gets its value from
its child node.
• Synthesized attributes never take values from their parent nodes or any
sibling nodes.
(b) Inherited Attributes
• In contrast to synthesized attributes, inherited attributes can take values from
parent and/or siblings. As in the following production,
• S → ABC
• A can get values from S, B and C. B can take values from S, A, and C.
Likewise, C can take values from S, A, and B.
Expansion and Reduction
• Expansion: When a non-terminal is
expanded to terminals as per a
grammatical rule.

• Reduction: When a terminal is


reduced to its corresponding non-
terminal according to grammar rules.
Syntax Directed Translation (SDT)
• Semantic analysis uses Syntax Directed Translations to perform the above
Expansion and Reduction tasks.
• Semantic analyzer receives AST (Abstract Syntax Tree) from its previous stage
(syntax analysis).
• Semantic analyzer attaches attribute information with AST, which are called
Attributed AST.
Syntax Directed Translation (SDT)
• Attributes are two tuple value, <attribute name, attribute value>
• For example:
int value = 5;

<type, “integer”>

<presentvalue, “5”>
For every production, we attach a semantic rule.
S-attributed SDT
• If an SDT uses only synthesized
attributes, it is called as S-attributed
SDT.
• These attributes are evaluated using S-
attributed SDTs that have their
semantic actions written after the
production (right hand side).
S-attributed SDT
• As depicted above, attributes in S-
attributed SDTs are evaluated in
bottom-up parsing, as the values of
the parent nodes depend upon the
values of the child nodes.
L-attributed SDT
• This form of SDT uses both synthesized and inherited attributes with
restriction of not taking values from right siblings.
• In L-attributed SDTs, a non-terminal can get values from its parent, child, and
sibling nodes.
L-attributed SDT
• As in the following production:
• S → ABC
• S can take values from A, B, and C (synthesized). A can take values from S
only. B can take values from S and A. C can get values from S, A, and B. No
non-terminal can get values from the sibling to its right.
• Attributes in L-attributed SDTs are evaluated by depth-first and left-to-right
parsing manner.
Relationship Between L & S-attributed SDT

• We may conclude that if a definition is S-attributed, then


it is also L-attributed as L-attributed definition encloses S-
attributed definitions.

• We know that, S-attributed SDT uses only synthesized


attributes but L-attributed SDT uses both synthesized and
inherited attributes with restriction of not taking values
from right siblings.
• That’s why we can say that “Every S-attributed SDT is L-
attributed SDT but Every L-attributed SDT is not S-
attributed SDT.

You might also like