Group Members
Sohail Memon (429)
Abdul Qayoom (350)
Rehmatullah (408)
Muhammad Bilal (392)
Noor-ul-Ain (402)
Semantic Analysis
From Code Form To Program Meaning
Source Code
Compiler or Interpreter Interpre-
tation
Translation Execution
Target Code
Phases of Compilation
The Semantic Analyzer
The principal job of the semantic analyzer is to enforce static semantic rules.
In general, anything that requires the compiler to compare things that are
separate by a long distance or to count things ends up being a matter of
semantics.
The semantic analyzer also commonly constructs a syntax tree (usually first),
and much of the information it gathers is needed by the code generator.
Semantic Errors
We have mentioned some of the semantics errors that the semantic analyzer 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.
Specification of Programming Languages
PLs require precise definitions (i.e. no ambiguity)
Language form (Syntax)
Language meaning (Semantics)
Consequently, PLs are specified using formal notation:
Formal syntax
Tokens
Grammar
Formal semantics
Attribute Grammars (static semantics)
Dynamic Semantics
Static Semantics
Attribute grammars add basic semantic rules to the specification of a
language
They specify static semantics
But they are limited to the semantic form that can be checked at compile
time
Other semantic properties cannot be checked at compile time
They are described using dynamic semantics
Dynamic Semantics
Use to formally specify the behavior of a programming language
Semantic-based error detection
Correctness proofs
There is not a universally accepted notation
Operational semantics
Executing statements that represent changes in the state of a real or simulated machine
Axiomatic semantics
Using predicate calculus (pre and post-conditions)
Denotational semantics
Using recursive function theory
Attribute Grammar
Attribute grammar is a special form of context-free grammar
where some additional information (attributes) are 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 is a medium to provide semantics to the
context-free grammar and it can help specify the syntax and
semantics of a programming language. Attribute grammar
(when viewed as a parse-tree) can pass values or
information among the nodes of a tree.
Example:
E → E + T { [Link] = [Link] + [Link] }
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.
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.
Attribute Flow
Example
The figure shows the result of
annotating the parse tree for
(1+3)*2
Each symbols has at most one attribute
shown in the corresponding box
Numerical value in this example
Operator symbols have no value
Arrows represent attribute flow
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 trees are
parsed top-down and left to
right. Whenever reduction
occurs, we apply its
corresponding semantic rules
actions.
Parse Tree
We have learnt how a parser
constructs parse trees in the syntax
analysis phase. The plain parse-
tree constructed in that 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
THANK YOU