The purpose of types:
To define what the program should do.
e.g. read an array of integers and return a double
To guarantee that the program is meaningful.
that it does not add a string to an integer
that variables are declared before they are used
To document the programmer's intentions.
better than comments, which are not checked by the compiler
To optimize the use of hardware.
reserve the minimal amount of memory, but not more
use the most appropriate machine instructions.
Syntax-Directed Translation: Syntax-Directed Definitions, Evaluation Orders for SDD's, Applications of Syntax-Directed Translation, Syntax-Directed Translation Schemes, and Implementing L-Attributed SDD's. Intermediate-Code Generation: Variants of Syntax Trees, Three-Address Code, Types and Declarations, Type Checking, Control Flow, Back patching, Switch-Statements
Relationship Among Token, Lexeme & PatternBharat Rathore
Relationship among Token, Lexeme and Pattern
Outline
Token
Lexeme
Pattern
Relationship
Tokens : A token is sequence of characters that can be treated
as a unit/single logical entity.
Examples
Keywords
Examples : for, while, if etc.
Identifier
Examples : Variable name, function name, etc.
Operators
Examples : '+', '++', '-' etc.
Separators
Examples : ',' ';' etc.
Pattern
Pattern is a rule describing all those lexemes that can represent a particular token in a source language.
Lexeme
It is a sequence of characters in the source program that is matched by the pattern for a token.
Example : “float”, “=“, “223”, “;”
In this slide you will explore more about how to make derivations ,design parse tree ,what is ambiguity and how to remove ambiguity ,left recursion ,left factoring .
This is about a topic of compiler design, LR and SLR parsing algorithm and LR grammar, Canonical collection and Item, Conflict in LR parsing shift reduce. Classification of Bottom up parsing.
recognizer for a language, Deterministic finite automata, Non-deterministic finite automata, conversion of NFA to DFA, Regular Expression to NFA, Thomsons Construction
The purpose of types:
To define what the program should do.
e.g. read an array of integers and return a double
To guarantee that the program is meaningful.
that it does not add a string to an integer
that variables are declared before they are used
To document the programmer's intentions.
better than comments, which are not checked by the compiler
To optimize the use of hardware.
reserve the minimal amount of memory, but not more
use the most appropriate machine instructions.
Syntax-Directed Translation: Syntax-Directed Definitions, Evaluation Orders for SDD's, Applications of Syntax-Directed Translation, Syntax-Directed Translation Schemes, and Implementing L-Attributed SDD's. Intermediate-Code Generation: Variants of Syntax Trees, Three-Address Code, Types and Declarations, Type Checking, Control Flow, Back patching, Switch-Statements
Relationship Among Token, Lexeme & PatternBharat Rathore
Relationship among Token, Lexeme and Pattern
Outline
Token
Lexeme
Pattern
Relationship
Tokens : A token is sequence of characters that can be treated
as a unit/single logical entity.
Examples
Keywords
Examples : for, while, if etc.
Identifier
Examples : Variable name, function name, etc.
Operators
Examples : '+', '++', '-' etc.
Separators
Examples : ',' ';' etc.
Pattern
Pattern is a rule describing all those lexemes that can represent a particular token in a source language.
Lexeme
It is a sequence of characters in the source program that is matched by the pattern for a token.
Example : “float”, “=“, “223”, “;”
In this slide you will explore more about how to make derivations ,design parse tree ,what is ambiguity and how to remove ambiguity ,left recursion ,left factoring .
This is about a topic of compiler design, LR and SLR parsing algorithm and LR grammar, Canonical collection and Item, Conflict in LR parsing shift reduce. Classification of Bottom up parsing.
recognizer for a language, Deterministic finite automata, Non-deterministic finite automata, conversion of NFA to DFA, Regular Expression to NFA, Thomsons Construction
The Indian economy is classified into different sectors to simplify the analysis and understanding of economic activities. For Class 10, it's essential to grasp the sectors of the Indian economy, understand their characteristics, and recognize their importance. This guide will provide detailed notes on the Sectors of the Indian Economy Class 10, using specific long-tail keywords to enhance comprehension.
For more information, visit-www.vavaclasses.com
How to Create Map Views in the Odoo 17 ERPCeline George
The map views are useful for providing a geographical representation of data. They allow users to visualize and analyze the data in a more intuitive manner.
Ethnobotany and Ethnopharmacology:
Ethnobotany in herbal drug evaluation,
Impact of Ethnobotany in traditional medicine,
New development in herbals,
Bio-prospecting tools for drug discovery,
Role of Ethnopharmacology in drug evaluation,
Reverse Pharmacology.
We all have good and bad thoughts from time to time and situation to situation. We are bombarded daily with spiraling thoughts(both negative and positive) creating all-consuming feel , making us difficult to manage with associated suffering. Good thoughts are like our Mob Signal (Positive thought) amidst noise(negative thought) in the atmosphere. Negative thoughts like noise outweigh positive thoughts. These thoughts often create unwanted confusion, trouble, stress and frustration in our mind as well as chaos in our physical world. Negative thoughts are also known as “distorted thinking”.
Students, digital devices and success - Andreas Schleicher - 27 May 2024..pptxEduSkills OECD
Andreas Schleicher presents at the OECD webinar ‘Digital devices in schools: detrimental distraction or secret to success?’ on 27 May 2024. The presentation was based on findings from PISA 2022 results and the webinar helped launch the PISA in Focus ‘Managing screen time: How to protect and equip students against distraction’ https://www.oecd-ilibrary.org/education/managing-screen-time_7c225af4-en and the OECD Education Policy Perspective ‘Students, digital devices and success’ can be found here - https://oe.cd/il/5yV
Instructions for Submissions thorugh G- Classroom.pptxJheel Barad
This presentation provides a briefing on how to upload submissions and documents in Google Classroom. It was prepared as part of an orientation for new Sainik School in-service teacher trainees. As a training officer, my goal is to ensure that you are comfortable and proficient with this essential tool for managing assignments and fostering student engagement.
The Roman Empire A Historical Colossus.pdfkaushalkr1407
The Roman Empire, a vast and enduring power, stands as one of history's most remarkable civilizations, leaving an indelible imprint on the world. It emerged from the Roman Republic, transitioning into an imperial powerhouse under the leadership of Augustus Caesar in 27 BCE. This transformation marked the beginning of an era defined by unprecedented territorial expansion, architectural marvels, and profound cultural influence.
The empire's roots lie in the city of Rome, founded, according to legend, by Romulus in 753 BCE. Over centuries, Rome evolved from a small settlement to a formidable republic, characterized by a complex political system with elected officials and checks on power. However, internal strife, class conflicts, and military ambitions paved the way for the end of the Republic. Julius Caesar’s dictatorship and subsequent assassination in 44 BCE created a power vacuum, leading to a civil war. Octavian, later Augustus, emerged victorious, heralding the Roman Empire’s birth.
Under Augustus, the empire experienced the Pax Romana, a 200-year period of relative peace and stability. Augustus reformed the military, established efficient administrative systems, and initiated grand construction projects. The empire's borders expanded, encompassing territories from Britain to Egypt and from Spain to the Euphrates. Roman legions, renowned for their discipline and engineering prowess, secured and maintained these vast territories, building roads, fortifications, and cities that facilitated control and integration.
The Roman Empire’s society was hierarchical, with a rigid class system. At the top were the patricians, wealthy elites who held significant political power. Below them were the plebeians, free citizens with limited political influence, and the vast numbers of slaves who formed the backbone of the economy. The family unit was central, governed by the paterfamilias, the male head who held absolute authority.
Culturally, the Romans were eclectic, absorbing and adapting elements from the civilizations they encountered, particularly the Greeks. Roman art, literature, and philosophy reflected this synthesis, creating a rich cultural tapestry. Latin, the Roman language, became the lingua franca of the Western world, influencing numerous modern languages.
Roman architecture and engineering achievements were monumental. They perfected the arch, vault, and dome, constructing enduring structures like the Colosseum, Pantheon, and aqueducts. These engineering marvels not only showcased Roman ingenuity but also served practical purposes, from public entertainment to water supply.
How to Split Bills in the Odoo 17 POS ModuleCeline George
Bills have a main role in point of sale procedure. It will help to track sales, handling payments and giving receipts to customers. Bill splitting also has an important role in POS. For example, If some friends come together for dinner and if they want to divide the bill then it is possible by POS bill splitting. This slide will show how to split bills in odoo 17 POS.
2. Chapter Five
This Chapter Covers:
Syntax Directed Translation and definitions
Construction of syntax trees
3. Syntax-Directed Translation
Grammar symbols are associated with attributes to
associate information with the programming language
constructs that they represent.
Values of these attributes are evaluated by the semantic
rules associated with the production rules.
Evaluation of these semantic rules:
may generate intermediate codes
may put information into the symbol table
may perform type checking
may issue error messages
may perform some other activities
in fact, they may perform almost any activities.
An attribute may hold almost any thing.
a string, a number, a memory location, a complex record.
4. SDD and Translation Schemes
When we associate semantic rules with productions, we use
two notations:
Syntax-Directed Definitions
Translation Schemes
Syntax-Directed Definitions:
Hide many implementation details such as order of
evaluation of semantic actions.
We associate a production rule with a set of semantic
actions, and we do not say when they will be evaluated.
Translation Schemes:
Indicate the order of evaluation of semantic actions
associated with a production rule.
In other words, translation schemes give a little bit
information about implementation details.
5. Syntax-Directed Definitions
A syntax-directed definition is a generalization of a context-
free grammar in which:
Each grammar symbol is associated with a set of
attributes.
This set of attributes for a grammar symbol is partitioned
into two subsets called synthesized and inherited attributes
of that grammar symbol.
Each production rule is associated with a set of semantic
rules.
Semantic rules set up dependencies between attributes
which can be represented by a dependency graph.
This dependency graph determines the evaluation order of
these semantic rules.
7. Annotated Parse Tree
A parse tree showing the values of attributes at each node is
called an annotated parse tree.
The process of computing the attributes values at the nodes
is called annotating (or decorating) of the parse tree.
Of course, the order of these computations depends on the
dependency graph induced by the semantic rules.
8. Syntax-Directed Definition
In a syntax-directed definition, each production A→α is
associated with a set of semantic rules of the form:
b=f(c1,c2,…,cn) where f is a function,
and b can be one of the followings:
b is a synthesized attribute of A and c1,c2,…,cn are
attributes of the grammar symbols in the production (
A→α ).
OR
b is an inherited attribute one of the grammar symbols
in α (on the
right side of the production), and c1,c2,…,cn are
attributes of the grammar symbols in the production (
A→α ).
9. Attribute Grammar
So, a semantic rule b=f(c1,c2,…,cn) indicates that the
attribute b depends on attributes c1,c2,…,cn.
In a syntax-directed definition, a semantic rule may just
evaluate a value of an attribute or it may have some
side effects such as printing values.
An attribute grammar is a syntax-directed definition in
which the functions in the semantic rules cannot have side
effects (they can only evaluate values of attributes).
10. Syntax-Directed Definition -- Example
Production Semantic Rules
L → E return print(E.val)
E → E1 + T E.val = E1.val + T.val
E → T E.val = T.val
T → T1 * F T.val = T1.val * F.val
T → F T.val = F.val
F → ( E ) F.val = E.val
F → digit F.val = digit.lexval
Symbols E, T, and F are associated with a synthesized
attribute val.
The token digit has a synthesized attribute lexval (it is
assumed that it is evaluated by the lexical analyzer).
+
13. SDD – Example2
Production Semantic Rules
E → E1 + T E.loc=newtemp(),
E.code=E1.code||T.code || add E1.loc,T.loc,E.loc
E → T E.loc = T.loc, E.code=T.code
T → T1 * F T.loc=newtemp(),T.code=T1.code
|| F.code || mult T1.loc,F.loc,T.loc
T → F T.loc = F.loc, T.code=F.code
F → ( E ) F.loc = E.loc, F.code=E.code
F → id F.loc = id.name, F.code=“”
Symbols E, T, and F are associated with synthesized
attributes loc and code.
14. SDD – Example2 (Cont.)
The token id has a synthesized attribute name (it is
assumed that it is evaluated by the lexical analyzer).
It is assumed that || is the string concatenation operator.
15. SDD – Inherited Attributes
Production Semantic Rules
D → T L L.in = T.type
T → int T.type = integer
T → real T.type = real
L → L1 id L1.in = L.in, addtype(id.entry,L.in)
L → id addtype(id.entry,L.in)
Symbol T is associated with a synthesized attribute type.
Symbol L is associated with an inherited attribute in.
16. S-Attributed Definitions
Syntax-directed definitions are used to specify syntax-
directed translations.
To create a translator for an arbitrary syntax-directed
definition can be difficult.
We would like to evaluate the semantic rules during parsing
(i.e. in a single pass, we will parse and we will also evaluate
semantic rules during the parsing).
We will look at two sub-classes of the syntax-directed
definitions:
S-Attributed Definitions: only synthesized attributes used
in the syntax-directed definitions.
L-Attributed Definitions: in addition to synthesized
attributes, we may also use inherited attributes in a
restricted fashion.
17. S-Attributed Definitions
To implement S-Attributed Definitions and L-Attributed
Definitions are easy (we can evaluate semantic rules in a
single pass during the parsing).
Implementations of S-attributed Definitions are a little bit
easier than implementations of L-Attributed Definitions
18. Bottom-Up Evaluation of S-Att Definitions
We put the values of the synthesized attributes of the
grammar symbols into a parallel stack.
When an entry of the parser stack holds a grammar
symbol X (terminal or non-terminal), the corresponding
entry in the parallel stack will hold the synthesized
attribute(s) of the symbol X.
We evaluate the values of the attributes during reductions.
A XYZ A.a=f(X.x,Y.y,Z.z) where all attributes are
synthesized.
19. Bottom-Up Evaluation of S-Att Definitions
A.a
.
A
.
Z.z
Y.y
X.x
.
Z
Y
X
.
stack parallel-stack
top
top
20. Bottom-Up Eval. of S-Att Definitions (Cont.)
Production Semantic Rules
L → E return print(val[top-1])
E → E1 + T val[ntop] = val[top-2] + val[top]
E → T
T → T1 * F val[ntop] = val[top-2] * val[top]
T → F
F → ( E ) val[ntop] = val[top-1]
F → digit
At each shift of digit, we also push digit.lexval into val-
stack.
At all other shifts, we do not put anything into val-stack
because other terminals do not have attributes (but we
increment the stack pointer for val-stack).
21. Bottom-Up Evaluation -- Example
At each shift of digit, we also push digit.lexval into val-stack.
stack val-stack input action semantic rule
0 5+3*4r s6 d.lexval(5) into val-stack
0d6 5 +3*4r F→d F.val=d.lexval–do nothing
0F4 5 +3*4r T→F T.val=F.val – do nothing
0T3 5 +3*4r E→T E.val=T.val – do nothing
0E2 5 +3*4r s8 push empty slot into val-stack
0E2+8 5- 3*4r s6 d.lexval(3) into val-stack
0E2+8d6 5-3 *4r F→d F.val=d.lexval – do nothing
0E2+8F4 5-3 *4r T→F T.val=F.val – do nothing
0E2+8T11 5-3 *4r s9 push empty slot into val-stack
0E2+8T11*9 5-3- 4r s6 d.lexval(4) into val-stack
0E2+8T11*9d6 5-3-4 r F→d F.val=d.lexval – do nothing
0E2+8T11*9F12 5-3-4 r T→T*F T.val=T1.val*F.val
0E2+8T11 5-12 r E→E+T E.val=E1.val*T.val
0E2 17 r s7 push empty slot into val-stack
0E2r7 17- $ L→Er print(17), pop empty slot from val-stack
0L1 17 $ acc
22. Top-Down Evaluation (of S-Att Definitions)
Productions Semantic Rules
A → B print(B.n0), print(B.n1)
B → 0 B1 B.n0=B1.n0+1, B.n1=B1.n1
B → 1 B1 B.n0=B1.n0, B.n1=B1.n1+1
B → B.n0=0, B.n1=0
where B has two synthesized attributes (n0 and n1).
23. L-Attributed Definitions
S-Attributed Definitions can be efficiently implemented.
We are looking for a larger (larger than S-Attributed
Definitions) subset of syntax-directed definitions which can
be efficiently evaluated.
L-Attributed Definitions
L-Attributed Definitions can always be evaluated by the
depth first visit of the parse tree.
This means that they can also be evaluated during the
parsing.
24. L-Attributed Definitions
A syntax-directed definition is L-attributed if each
inherited attribute of Xj, where 1jn, on the right side of
A → X1X2...Xn depends only on:
1. The attributes of the symbols X1,...,Xj-1 to the left of Xj in
the production and
2. the inherited attribute of A
Every S-attributed definition is L-attributed, the
restrictions only apply to the inherited attributes (not to
synthesized attributes).
25. Translation Schemes
In a syntax-directed definition, we do not say anything
about the evaluation times of the semantic rules (when the
semantic rules associated with a production should be
evaluated?).
A translation scheme is a context-free grammar in which:
Attributes are associated with the grammar symbols and
Semantic actions enclosed between braces {} are inserted
within the right sides of productions.
Ex: A → { ... } X { ... } Y { ... }
Semantic Actions
26. Translation Schemes
When designing a translation scheme, some restrictions
should be observed to ensure that an attribute value is
available when a semantic action refers to that attribute.
These restrictions (motivated by L-attributed definitions)
ensure that a semantic action does not refer to an attribute
that has not yet computed.
In translation schemes, we use semantic action
terminology instead of semantic rule terminology used in
syntax-directed definitions.
The position of the semantic action on the right side
indicates when that semantic action will be evaluated.
27. Translation Schemes for S-att Definitions
If our syntax-directed definition is S-attributed, the
construction of the corresponding translation scheme will
be simple.
Each associated semantic rule in a S-attributed syntax-
directed definition will be inserted as a semantic action into
the end of the right side of the associated production.
Production Semantic Rule
E → E1 + T E.val = E1.val + T.val a production of
a syntax directed definition
E → E1 + T { E.val = E1.val + T.val } the production of the
corresponding translation scheme
28. A Translation Scheme Example
A simple translation scheme that converts infix expressions
to the corresponding postfix expressions.
E → T R
R → + T { print(“+”) } R1
R →
T → id { print(id.name) }
a+b+c ab+c+
infix expression postfix expression
29. A Translation Scheme Example (Cont.)
The depth first traversal of the parse tree (executing the
semantic actions in that order) will produce the postfix
representation of the infix expression.
30. Inherited Att in Translation Schemes
If a translation scheme has to contain both synthesized
and inherited attributes, we have to observe the following
rules:
1. An inherited attribute of a symbol on the right side of a
production must be computed in a semantic action
before that symbol.
2. A semantic action must not refer to a synthesized
attribute of a symbol to the right of that semantic
action.
3. A synthesized attribute for the non-terminal on the left
can only be computed after all attributes it references
have been computed (we normally put this semantic
action at the end of the right side of the production).
31. Cont.
With a L-attributed syntax-directed definition, it is
always possible to construct a corresponding
translation scheme which satisfies these three
conditions (This may not be possible for a general
syntax-directed translation).
32. A Translation Scheme with Inherited Att
D → T id { addtype(id.entry,T.type), L.in = T.type }
L
T → int { T.type = integer }
T → real { T.type = real }
L → id { addtype(id.entry,L.in), L1.in = L.in } L1
L →
This is a translation scheme for an L-attributed
definitions.
33. Eliminating Left Recursion from Translation Scheme
A translation scheme with a left recursive grammar.
E → E1 + T { E.val = E1.val + T.val }
E → E1 - T { E.val = E1.val - T.val }
E → T { E.val = T.val }
T → T1 * F { T.val = T1.val * F.val }
T → F { T.val = F.val }
F → ( E ) { F.val = E.val }
F → digit { F.val = digit.lexval }
When we eliminate the left recursion from the grammar (to
get a suitable grammar for the top-down parsing) we also
have to change semantic actions
34. Eliminating Left Recursion (Cont.)
inherited attribute synthesized attribute
E → T { A.in=T.val } A { E.val=A.syn }
A → + T { A1.in=A.in+T.val } A1 { A.syn = A1.syn}
A → - T { A1.in=A.in-T.val } A1 { A.syn = A1.syn}
A → { A.syn = A.in }
T → F { B.in=F.val } B { T.val=B.syn }
B → * F { B1.in=B.in*F.val } B1 { B.syn = B1.syn}
B → { B.syn = B.in }
F → ( E ) { F.val = E.val }
F → digit { F.val = digit.lexval }
35. Eliminating Left Recursion (in general)
A → A1 Y { A.a = g(A1.a,Y.y) } a left recursive grammar with
A → X { A.a=f(X.x) } synthesized attributes (a,y,x).
eliminate left recursion
inherited attribute of the new non-terminal
synthesized attribute of the new non-terminal
A → X { R.in=f(X.x) } R { A.a=R.syn }
R → Y { R1.in=g(R.in,Y.y) } R1 { R.syn = R1.syn}
R → { R.syn = R.in }