1 Beyond syntax analysis An identifier named x has been recognized. Is x a scalar, array or function? How big is x? If x is a function, how many and what.

Slides:



Advertisements
Similar presentations
Chapter 2-2 A Simple One-Pass Compiler
Advertisements

Semantics Static semantics Dynamic semantics attribute grammars
Chapter 5 Syntax-Directed Translation. Translation of languages guided by context-free grammars. Attach attributes to the grammar symbols. Values of the.
Chapter 5 Syntax Directed Translation. Outline Syntax Directed Definitions Evaluation Orders of SDD’s Applications of Syntax Directed Translation Syntax.
1 Error detection in LR parsing Errors are discovered when a slot in the action table is blank. Canonical LR(1) parsers detect and report the error as.
1 Semantic Processing. 2 Contents Introduction Introduction A Simple Compiler A Simple Compiler Scanning – Theory and Practice Scanning – Theory and Practice.
1 CMPSC 160 Translation of Programming Languages Fall 2002 Lecture-Modules slides derived from Tevfik Bultan, Keith Cooper, and Linda Torczon Department.
Abstract Syntax Tree (AST)
Syntax Directed Translation
Context-sensitive Analysis. Beyond Syntax There is a level of correctness that is deeper than grammar fie(a,b,c,d) int a, b, c, d; { … } fee() { int f[3],g[0],
Syntax-Directed Translation Context-free grammar with synthesized and/or inherited attributes. The showing of values at nodes of a parse tree is called.
CH4.1 CSE244 Bottom Up Translation (revisited) Aggelos Kiayias Computer Science & Engineering Department The University of Connecticut 371 Fairfield Road,
CH4.1 CSE244 Syntax Directed Translation Aggelos Kiayias Computer Science & Engineering Department The University of Connecticut 371 Fairfield Road, Unit.
CH4.1 CSE244 Bottom Up Translation Aggelos Kiayias Computer Science & Engineering Department The University of Connecticut 371 Fairfield Road, Unit 1155.
Syntax-Directed Translation
CS784 (Prasad)L167AG1 Attribute Grammars Attribute Grammar is a Framework for specifying semantics and enables Modular specification.
Copyright © 2005 Elsevier Chapter 4 :: Semantic Analysis Programming Language Pragmatics Michael L. Scott.
2.2 A Simple Syntax-Directed Translator Syntax-Directed Translation 2.4 Parsing 2.5 A Translator for Simple Expressions 2.6 Lexical Analysis.
Chapter 5 Syntax-Directed Translation Section 0 Approaches to implement Syntax-Directed Translation 1、Basic idea Guided by context-free grammar (Translating.
CSc 453 Semantic Analysis Saumya Debray The University of Arizona Tucson.
Topic #5: Translations EE 456 – Compiling Techniques Prof. Carl Sable Fall 2003.
Syntax-Directed Translation
1 Semantic Analysis Aaron Bloomfield CS 415 Fall 2005.
Semantic Analysis1 Checking what parsers cannot.
Topic: Syntax Directed Translations
COP4020 Programming Languages Semantics Prof. Xin Yuan.
Lesson 11 CDT301 – Compiler Theory, Spring 2011 Teacher: Linus Källberg.
Overview of Previous Lesson(s) Over View  An ambiguous grammar which fails to be LR and thus is not in any of the classes of grammars i.e SLR, LALR.
1 Semantic Analysis. 2 Semantic Analyzer Attribute Grammars Syntax Tree Construction Top-Down Translators Bottom-Up Translators Recursive Evaluators Type.
Chapter 5: Syntax directed translation –Use the grammar to direct the translation The grammar defines the syntax of the input language. Attributes are.
Semantic Analysis CPSC 388 Ellen Walker Hiram College.
Chapter 5. Syntax-Directed Translation. 2 Fig Syntax-directed definition of a simple desk calculator ProductionSemantic Rules L  E n print ( E.val.
Review: Syntax directed translation. –Translation is done according to the parse tree. Each production (when used in the parsing) is a sub- structure of.
Overview of Previous Lesson(s) Over View  In syntax-directed translation 1 st we construct a parse tree or a syntax tree then compute the values of.
1 Syntax-Directed Translation Part I Chapter 5 COP5621 Compiler Construction Copyright Robert van Engelen, Florida State University, 2007.
1 Syntax-Directed Translation We associate information with the programming language constructs by attaching attributes to grammar symbols. 2.Values.
國立台灣大學 資訊工程學系 薛智文 98 Spring Syntax-Directed Translation (textbook ch#5.1–5.6, 4.8, 4.9 )
Syntax Directed Definition and Syntax directed Translation
Syntax-Directed Definitions and Attribute Evaluation Compiler Design Lecture (02/18/98) Computer Science Rensselaer Polytechnic.
Copyright © 2009 Elsevier Chapter 4 :: Semantic Analysis Programming Language Pragmatics Michael L. Scott.
Chapter 8: Semantic Analyzer1 Compiler Designs and Constructions Chapter 8: Semantic Analyzer Objectives: Syntax-Directed Translation Type Checking Dr.
SDTs used to implement SDDs A non-cyclic SDD (having definitions of attributes) can always be implemented by a SDT (having actions that assign values to.
Semantic Analysis Attribute Grammar. Semantic Analysis  Beyond context free grammar  Is x declared before it is used?  Is x declared but never used?
CSE 420 Lecture Program is lexically well-formed: ▫Identifiers have valid names. ▫Strings are properly terminated. ▫No stray characters. Program.
CS 404Ahmed Ezzat 1 CS 404 Introduction to Compiler Design Lecture Ahmed Ezzat.
LECTURE 10 Semantic Analysis. REVIEW So far, we’ve covered the following: Compilation methods: compilation vs. interpretation. The overall compilation.
Chapter4 Syntax-Directed Translation Introduction : 1.In the lexical analysis step, each token has its attribute , e.g., the attribute of an id is a pointer.
CS 404Ahmed Ezzat 1 CS 404 Introduction to Compiler Design Lecture 9 Ahmed Ezzat Semantic Analysis.
Semantic analysis Jakub Yaghob
Semantics Analysis.
Syntax-Directed Translation
Context-Sensitive Analysis
A Simple Syntax-Directed Translator
Constructing Precedence Table
Chapter 5 Syntax Directed Translation
Ch. 4 – Semantic Analysis Errors can arise in syntax, static semantics, dynamic semantics Some PL features are impossible or infeasible to specify in grammar.
Syntax-Directed Translation Part I
CS 3304 Comparative Languages
Chapter 5. Syntax-Directed Translation
Syntax-Directed Translation Part I
Syntax-Directed Translation Part I
Compilers Principles, Techniques, & Tools Taught by Jing Zhang
Chapter 4 Action Routines.
Syntax-Directed Translation Part I
SYNTAX DIRECTED DEFINITION
Syntax-Directed Translation Part I
COP4020 Programming Languages
COP4020 Programming Languages
Chapter 5 Syntax Directed Translation
Presentation transcript:

1 Beyond syntax analysis An identifier named x has been recognized. Is x a scalar, array or function? How big is x? If x is a function, how many and what type of arguments does it take? Is x declared before being used? Where can x be stored? Is the expression x+y type-consistent? Semantic analysis is the phase where we collect information about the types of expressions and check for type related errors. The more information we can collect at compile time, the less overhead we have at run time.

2 Semantic analysis Collecting type information may involve "computations" What is the type of x+y given the types of x and y? Tool: attribute grammars Each grammar symbol has a number of associated attributes: The type of a variable or expression The value of a variable or expression The code for a statement Etc. The grammar is augmented with special equations (called semantic actions) that specify how the values of attributes are computed from other attributes. The process of using semantic actions to evaluate attributes is called syntax-directed translation.

3 Attribute grammars ProductionSemantic rule D  T LL.in = T.type T  int T.type = integer T  charT.type = character L  L 1, idL 1.in = L.in addtype (id.index, L.in) L  idaddtype (id.index, L.in) Example 1: Grammar of declarations Computing the type attribute.

4 Attribute grammars ProductionSemantic rule N  S Lif (S.neg) print('-'); else print('+'); print(L.val); S  +S.neg = 0 S  –S.neg = 1 L  L 1 BL.val = 2*L 1.val+B.val L  BL.val = B.val B  0B.val = 0*2 0 B  1B.val = 1*2 0 Example 2: Grammar of signed binary numbers Computing the value of a number

5 Attribute grammars The attribute for each non-terminal is a node of the tree. Notes: yylval is assumed to be a node (leaf) created during scanning. The production E  (E 1 ) does not create a new node as it is not needed. ProductionSemantic rule E  E 1 +E 2 E.node = new PlusNode(E 1.node,E 2.node) E  numE.node = num.yylval E  (E 1 )E.node = E 1.node Example 3: Grammar of expressions Creating an AST

6 Evaluating attributes The time when an attribute is evaluated often depends on the language. Static attributes are those that are evaluated during compilation. E.g. code Dynamic attributes are those that are evaluated at runtime E.g. a variable's type in a dynamically typed language. We are interested in static attributes. An attribute equation can be seen as a function: L  L 1, BL.val = 2*L 1.val+B.val L.val = f(L 1.val, B.val) To compute the function, its arguments must already have been evaluated.

7 Evaluating attributes Semantic analysis can be performed during parsing. Alternatively, we may wait until the parse is complete (and a parse tree has been created) and then traverse the tree and perform semantic analysis This is potentially easier It requires a second pass.

8 Evaluating attributes Method 1: Using a dependence graph Each rule implicitly defines a set of dependences Each attribute's value depends on the values of other attributes. These dependences form an attribute-dependence graph. Attributed parse tree = parse tree annotated with attribute rules (i.e. the dependence graph is superimposed on the parse tree) Some dependences flow upward The attributes of a node depend on those of its children We call those synthesized attributes. Some dependences flow downward The attributes of a node depend on those of its parent or siblings. We call those inherited attributes.

9 Attribute grammars ProductionSemantic rule E  E 1 +E 2 E.val = E 1.val+E 2.val E  numE.val = num.yylval E  (E 1 )E.val = E 1.val E E E ( E ) + E + num E attribute-dependence graph

10 Evaluating attributes Given a dependence graph, the attributes can be evaluated in topological order. This can only work when the dependence graph is acyclic. Circular dependencies may appear due to features such as goto It is possible to test for circularity.

11 Evaluating attributes Method 2: Rule-based At compiler construction time Analyze rules Determine ordering based on grammatical structure (parse tree)

12 Attribute grammars We are interested in two kinds of attribute grammars: S-attributed grammars All attributes are synthesized L-attributed grammars Attributes may be synthesized or inherited, AND Inherited attributes of a non-terminal only depend on the parent or the siblings to the left of that non-terminal. This way it is easy to evaluate the attributes by doing a depth-first traversal of the parse tree. Idea (useful for rule-based evaluation) Embed the semantic actions within the productions to impose an evaluation order.

13 Embedding rules in productions Synthesized attributes depend on the children of a non-terminal, so they should be evaluated after the children have been parsed. Inherited attributes that depend on the left siblings of a non- terminal should be evaluated right after the siblings have been parsed. Inherited attributes that depend on the parent of a non-terminal are typically passed along through copy rules (more later). D  T {L.in = T.type} L T  int {T.type = integer} T  char {T.type = character} L  {L 1.in = L.in} L 1, id {L.action = addtype (id.index, L.in)} L  id {L.action = addtype (id.index, L.in)} L.in is inherited and evaluated after parsing T but before L T.type is synthesized and evaluated after parsing int

14 Rule evaluation in top-down parsing Recall that a predictive parser is implemented as follows: There is a routine to recognize each lhs. This contains calls to routines that recognize the non-terminals or match the terminals on the rhs of a production. We can pass the attributes as parameters (for inherited) or return values (for synthesized). Example: D  T {L.in = T.type} L T  int {T.type = integer} The routine for T will return the value T.type The routine for L, will have a parameter L.in The routine for D will call T(), get its value and pass it into L()

15 Rule evaluation in bottom-up parsing S-attributed grammars All attributes are synthesized Rules can be evaluated bottom-up Keep the values in the stack Whenever a reduction is made, pop corresponding attributes, compute new ones, push them onto the stack Example: Implement a desk calculator using an LR parser Grammar: ProductionSemantic rule L  E \nprint(E.val) E  E 1 + TE.val = E 1.val+T.val E  TE.val = T.val T  T 1 * FT.val = T 1.val*F.val T  FT.val = F.val F  (E)F.val = E.val F  digitF.val = yylval

16 Rule evaluation in bottom-up parsing ProductionSemantic rule Stack operation L  E \nprint(E.val) E  E 1 + TE.val = E 1.val+T.val val[newtop]=val[top-2]+val[top] E  TE.val = T.val T  T 1 * FT.val = T 1.val+F.val val[newtop]=val[top-2]*val[top] T  FT.val = F.val F  (E)F.val = E.val val[ntop]=val[top-1] F  digitF.val = yylval

17 How can we inherit attributes on the stack? (L-attributed only) Use copy rules Consider A  XY where X has a synthesized attribute s. Parse X. X.s will be on the stack before we go on to parse Y. Y can "inherit" X.s using copy rule Y.i = X.s where i is an inherited attribute of Y. Actually, we can just use X.s wherever we need Y.i, since X.s is already on the stack. Example: back to the type declaration grammar: ProductionSemantic rule Stack operation D  T LL.in = T.type T  int T.type = integer val[ntop]=integer T  charT.type = character val[ntop]=character L  L 1, idL 1.in = L.in addtype (id.index, L.in) addtype(val[top], val[top-3]) L  idaddtype (id.index, L.in) addtype(val[top], val[top-1]) Rule evaluation in bottom-up parsing

18 Problem w/ inherited attributes: What if we cannot predict the position of an attribute on the stack? For example: case 1: S  aAC After we parse A, we have A.s at the top of the stack. Then, we parse C. Since C.i=A.s, we could just use the top of the stack when we need C.i case 2: S  aABC After we parse AB, we have B's attribute at the top of the stack and A.s below that. Then, we parse C. But now, A.s is not at the top of the stack. A.s is not always at the same place! ProductionSemantic rule S  aACC.i = A.s S  bABC C.i = A.s C  cC.s = f(C.i) Rule evaluation in bottom-up parsing

19 Solution: Modify the grammar. We want C.i to be found at the same place every time Insert a new non-terminal and copy C.i again: Now, by the time we parse C, A.s will always be two slots down in the stack. So we can compute C.s by using stack[top-1] ProductionSemantic rule S  aACC.i = A.s S  bABMC M.i=A.s, C.i = M.s C  cC.s = f(C.i) M   M.s = M.i Rule evaluation in bottom-up parsing

20 Attribute grammars Attribute grammars have several problems Non-local information needs to be explicitly passed down with copy rules, which makes the process more complex In practice there are large numbers of attributes and often the attributes themselves are large. Storage management becomes an important issue then. The compiler must traverse the attribute tree whenever it needs information (e.g. during a later pass) However, our discussion of rule evaluation gives us an idea for a simplified approach: Have actions organized around the structure of the grammar Constrain attribute flow to one direction. Allow only one attribute per grammar symbol. Practical application: BISON

21 In practice: bison In Bison, $$ is used for the lhs non-terminal, $1, $2, $3,... are used for the non-terminals on the rhs, (left-to-right order) Example: Expr : Expr TPLUS Expr { $$ = $1+$3;} Example: Expr: Expr TPLUS Expr {$$ = new ExprNode($1, $3);}