Syntax Directed Translation

Similar documents
Syntax-Directed Translation Part II

Syntax-Directed Translation

Syntax-Directed Translation. Concepts Introduced in Chapter 5. Syntax-Directed Definitions

Compilers. 5. Attributed Grammars. Laszlo Böszörmenyi Compilers Attributed Grammars - 1

Syntax-Directed Translation

Syntax-Directed Translation Part I

Intermediate Code Generation

Intermediate Code Generation

CSE302: Compiler Design

5. Syntax-Directed Definitions & Type Analysis

Abstract Syntax Trees Synthetic and Inherited Attributes

[Syntax Directed Translation] Bikash Balami

COMPILER CONSTRUCTION (Evaluation Orders for SDD s)

Syntax-Directed Translation. Introduction

Syntax-Directed Translation. CS Compiler Design. SDD and SDT scheme. Example: SDD vs SDT scheme infix to postfix trans

Syntax-Directed Translation

Syntactic Directed Translation

Syntax-Directed Translation

Principles of Programming Languages

Principles of Programming Languages

Chapter 4. Action Routines

10/18/18. Outline. Semantic Analysis. Two types of semantic rules. Syntax vs. Semantics. Static Semantics. Static Semantics.

CS 406: Syntax Directed Translation

UNIT-3. (if we were doing an infix to postfix translator) Figure: conceptual view of syntax directed translation.

Syntax Directed Translation

COP5621 Exam 3 - Spring 2005

A programming language requires two major definitions A simple one pass compiler

Chapter 4 :: Semantic Analysis

A Simple Syntax-Directed Translator

Semantic Analysis computes additional information related to the meaning of the program once the syntactic structure is known.

Abstract Syntax Tree

Semantic Analysis Attribute Grammars

Summary: Semantic Analysis

NARESHKUMAR.R, AP\CSE, MAHALAKSHMI ENGINEERING COLLEGE, TRICHY Page 1

Compiler Principle and Technology. Prof. Dongming LU April 15th, 2019

CS 2210 Sample Midterm. 1. Determine if each of the following claims is true (T) or false (F).

Syntax-Directed Translation

COP4020 Programming Languages. Semantics Prof. Robert van Engelen

We now allow any grammar symbol X to have attributes. The attribute a of symbol X is denoted X.a

Imperative Paradigm. Syntax. Role of Programming Languages. Expressions. Expressions. Role of Programming Languages. Symbols.

Programming Languages

Syntax-directed translation. Context-sensitive analysis. What context-sensitive questions might the compiler ask?

LR Parsing LALR Parser Generators

Semantic analysis and intermediate representations. Which methods / formalisms are used in the various phases during the analysis?

COP4020 Programming Languages. Semantics Robert van Engelen & Chris Lacher

COMP-421 Compiler Design. Presented by Dr Ioanna Dionysiou

Abstract Syntax Trees & Top-Down Parsing

Semantic Analysis with Attribute Grammars Part 3

Compilers. Compiler Construction Tutorial The Front-end

UNIT IV INTERMEDIATE CODE GENERATION

COP4020 Spring 2011 Midterm Exam

Abstract Syntax Trees & Top-Down Parsing

Abstract Syntax Trees & Top-Down Parsing

SYED AMMAL ENGINEERING COLLEGE (An ISO 9001:2008 Certified Institution) Dr. E.M. Abdullah Campus, Ramanathapuram

Context-sensitive analysis. Semantic Processing. Alternatives for semantic processing. Context-sensitive analysis

RYERSON POLYTECHNIC UNIVERSITY DEPARTMENT OF MATH, PHYSICS, AND COMPUTER SCIENCE CPS 710 FINAL EXAM FALL 96 INSTRUCTIONS

Intermediate Code Generation

Lecture 14 Sections Mon, Mar 2, 2009

Semantic Analysis with Attribute Grammars Part 1

Semantic analysis. Syntax tree is decorated with typing- and other context dependent

PART 4 - SYNTAX DIRECTED TRANSLATION. F. Wotawa TU Graz) Compiler Construction Summer term / 309

VIVA QUESTIONS WITH ANSWERS

Static and Dynamic Semantics

Syntax Directed Translation

Acknowledgement. CS Compiler Design. Intermediate representations. Intermediate representations. Semantic Analysis - IR Generation

10/26/17. Attribute Evaluation Order. Attribute Grammar for CE LL(1) CFG. Attribute Grammar for Constant Expressions based on LL(1) CFG

LR Parsing LALR Parser Generators

Semantic Analysis. Role of Semantic Analysis

Compiler Construction

CSCI Compiler Design

Theory of Compilation Erez Petrank. Lecture 7: Intermediate Representation Part 2: Backpatching

Chapter 6 Intermediate Code Generation

Faculty of Electrical Engineering, Mathematics, and Computer Science Delft University of Technology

CSCI Compiler Design

THEORY OF COMPILATION

CSC 467 Lecture 13-14: Semantic Analysis

Parsing Techniques. AST Review. AST Data Structures. LL AST Construction. AST Construction CS412/CS413. Introduction to Compilers Tim Teitelbaum

Semantic Analysis. CSE 307 Principles of Programming Languages Stony Brook University

QUESTIONS RELATED TO UNIT I, II And III

Syntax-Directed Translation. Lecture 14

Attribute Grammars. Attribute Grammars

Structure of a compiler. More detailed overview of compiler front end. Today we ll take a quick look at typical parts of a compiler.

Compiler Construction

4. Semantic Processing and Attributed Grammars

Context-Free Grammar. Concepts Introduced in Chapter 2. Parse Trees. Example Grammar and Derivation

Parsing. Rupesh Nasre. CS3300 Compiler Design IIT Madras July 2018

CS606- compiler instruction Solved MCQS From Midterm Papers

ΕΠΛ323 - Θεωρία και Πρακτική Μεταγλωττιστών. Lecture 8a Syntax-directed Transla1on Elias Athanasopoulos

Syntax Analysis Part IV

Chapter 2: Syntax Directed Translation and YACC

Compiler Design Aug 1996

More On Syntax Directed Translation

The analysis part breaks up the source program into constituent pieces and creates an intermediate representation of the source program.

About the Authors... iii Introduction... xvii. Chapter 1: System Software... 1

Parsing Techniques. AST Review. AST Data Structures. Implicit AST Construction. AST Construction CS412/CS413. Introduction to Compilers Tim Teitelbaum

Compilers. Type checking. Yannis Smaragdakis, U. Athens (original slides by Sam

Wednesday, September 9, 15. Parsers

Parsers. What is a parser. Languages. Agenda. Terminology. Languages. A parser has two jobs:

COP5621 Exam 4 - Spring 2005

COS 320. Compiling Techniques

Transcription:

Syntax Directed Translation Rupesh Nasre. CS3300 Compiler Design IIT Madras Aug 2015

Character stream Lexical Analyzer Machine-Independent Code Optimizer F r o n t e n d Token stream Syntax Analyzer Syntax tree Semantic Analyzer Intermediate representation Code Generator Target machine code Machine-Dependent Code Optimizer B a c k e n d Syntax tree Target machine code Intermediate Code Generator Intermediate representation Symbol Table 2

Role of SDT To associate actions with productions To associate attributes with non-terminals To create implicit or explicit syntax tree To perform semantic analysis essentially, to add life to the skeleton. 3

Example E E + T $$.code = ; strcat($$.code, $1.code); strcat($$.code, $3.code); strcat($$.code, + ); SDD E E + T { printf( + ); } Productions Actions Attributes SDT SDTs may be viewed as implementations of SDDs and are important from efficiency perspective. 4

Syntax Directed Definition An SDD is a CFG with attributes and rules. Attributes are associated with grammar symbols. Rules are associated with productions. An SDD specifies the semantics of productions. It does not enforce a specific way of achieving the semantics. 5

Syntax Directed Translation An SDT is done by attaching rules or program fragments to productions. The order induced by the syntax analysis produces a translation of the input program. 6

Attributes Inherited In terms of the attributes of the node, its parent and siblings. e.g., int x, y, z; or Ishu's nested scoping Synthesized In terms of the attributes of the node and its children. e.g., a + b * c or most of the constructs from your assignments 7

SDD for Calculator Parse Tree Input string 3 * 5 + 4 $ ** + 4 3 55 Sr. No. SDD Production Semantic Rules 1 E' E $ E'.val = E.val 2 E E 1 + T E.val = E 1.val + T.val 3 E T... 4 T T 1 * F... 5 T F... 6 F (E)... 7 F digit F.val = digit.lexval Annotated Parse Tree E'.val = 19 E.val = 19 $ E.val = 15 + T.val = 4 T.val = 15 F.val = 4 T.val = 3 * F.val = 5 F.val = 3 digit.lexval = 5 digit.lexval = 3 digit.lexval = 4 8

Order of Evaluation If there are only synthesized attributes in the SDD, there exists an evaluation order. Any bottom-up order would do; for instance, post-order. Helpful for LR parsing. How about when the attributes are both synthesized as well as inherited? How about when the attributes are only inherited? Inherited Synthesized

Order of Evaluation A A.s Inherited B B.i Production Semantic Rule A B A.s = B.i; B.i = A.s + 1; This SDD uses a combination of synthesized and inherited attributes. A.s (head) is defined in terms of B.i (body nonterminal). Hence, it is synthesized. B.i (body non-terminal) is defined in terms of A.s (head). Hence, it is inherited. There exists a circular dependency between their evaluations. In practice, subclasses of SDDs required for our purpose do have an order. Synthesized

Classwork Write semantic rules for the following grammar. It computes terms like 3 * 5 and 3 * 5 * 7. Is * left or right-associative? Can you make it left? Now write the annotated parse tree for 3 * 5. Sr. No. Production 1 T F T' 2 T' * F T' 1 3 T' ε 4 F digit Semantic Rules T'.inh = F.val T.val = T'.syn T' 1.inh = T'.inh * F.val T'.syn = T' 1.syn T'.syn = T'.inh ε F.val = digit.lexval

Classwork T.val = 15 F.val = 3 T'.inh = 3 T'.syn = 15 digit.lexval = 3 * F.val = 5 T' 1.inh = 15 T' 1.syn = 15 digit.lexval = 5 ε Sr. No. Production 1 T F T' 2 T' * F T' 1 3 T' ε 4 F digit Semantic Rules T'.inh = F.val T.val = T'.syn T' 1.inh = T'.inh * F.val T'.syn = T' 1.syn T'.syn = T'.inh ε F.val = digit.lexval

Classwork T.val = 15 F.val = 3 T'.inh = 3 T'.syn = 15 digit.lexval = 3 * F.val = 5 T' 1.inh = 15 T' 1.syn = 15 digit.lexval = 5 ε What is is the the order in in which rules are are evaluated? Sr. No. Production 1 T F T' 2 T' * F T' 1 3 T' ε 4 F digit Semantic Rules T'.inh = F.val T.val = T'.syn T' 1.inh = T'.inh * F.val T'.syn = T' 1.syn T'.syn = T'.inh ε F.val = digit.lexval

Dependency Graph T.val = 15 F.val = 3 T'.inh = 3 T'.syn = 15 digit.lexval = 3 * F.val = 5 T' 1.inh = 15 T' 1.syn = 15 digit.lexval = 5 ε A dependency graph depicts the flow of information amongst attributes. An edge attr1 attr2 means that the value of attr1 is needed to compute attr2. Thus, allowable evaluation orders are those sequences of rules N1, N2,, Nk such that if Ni Nj, then i < j. What are such allowable orders? Topological sort What about cycles?

Order of Evaluation If there are only synthesized attributes in the SDD, there exists an evaluation order. Any bottom-up order would do; for instance, post-order. Helpful for LR parsing. S-attributed Inherited How about when the attributes are both synthesized as well as inherited? How about when the attributes are only inherited? Synthesized

SDD for Calculator Parse Tree Input string 3 * 5 + 4 $ S-attributed ** + 4 3 55 Sr. No. SDD Production Semantic Rules 1 E' E $ E'.val = E.val 2 E E 1 + T E.val = E 1.val + T.val 3 E T... 4 T T 1 * F... 5 T F... 6 F (E)... 7 F digit F.val = digit.lexval Annotated Parse Tree E'.val = 19 E.val = 19 $ E.val = 15 + T.val = 4 T.val = 15 F.val = 4 T.val = 3 + F.val = 5 F.val = 3 digit.lexval = 5 digit.lexval = 3 digit.lexval = 4 16

S-attributed SDD Every attribute is synthesized. A topological evaluation order is well-defined. Any bottom-up order of the parse tree nodes. In practice, preorder is used. preorder(n) { for (each child C of N, from the left) preorder(c) evaluate attributes of N } Can we we allow more orderings? 17

Issues with S-attributed SDD It is too strict! There exist reasonable non-cyclic orders that it disallows. If a non-terminal uses attributes of its parent only (no sibling attributes) If a non-terminal uses attributes of its left-siblings only (and not of right siblings). The rules may use information from above and from left. L-attributed 18

L-attributed SDD Each attribute must be either synthesized, or inherited, but with restriction. For production A X1 X2 Xn with inherited attributed Xi.a computed by an action; then the rule may use only inherited attributes of A. either inherited or synthesized attributes of X1, X2,, Xi-1. inherited or synthesized attributes of Xi with no cyclic dependence. L is for left-to-right. Have you seen any such SDD? 19

Example of L-attributed SDD Sr. No. Production 1 T F T' 2 T' * F T' 1 3 T' ε 4 F digit Semantic Rules T'.inh = F.val T.val = T'.syn T' 1.inh = T'.inh * F.val T'.syn = T' 1.syn T'.syn = T'.inh ε F.val = digit.lexval T.val = 15 F.val = 3 T'.inh = 3 T'.syn = 15 digit.lexval = 3 * F.val = 5 T' 1.inh = 15 T' 1.syn = 15 digit.lexval = 5 ε 20

Example of non-l-attributed SDD Production A B C Semantic rule A.s = B.b; B.i = C.c + A.s First rule uses synthesized attributes. Second rule has inherited attributes. However, B's attribute is dependent on C's attribute, which is on the right. Hence, it is not L-attributed SDD. S L.. L L L L B B B 0 1 Classwork: What does this grammar generate? Design L-attributed SDD to compute S.val, the decimal value of an input string. For instance, 101.101 should output 5.625. Idea: Use an inherited attribute L.side that tells which side (left or right) of the decimal point a bit is on. 21

SDT Applications Creating an explicit syntax tree. e.g., a 4 + c p1 = new Leaf(id a ); p2 = new Leaf(num 4 ); p3 = new Op(p1, '-', p2); p4 = new Leaf(id c ); p5 = new Op(p3, '+', p4); Production E E + T E E - T E T T ( E ) T id T num Semantic Rules $$.node = new Op($1.node, '+', $3.node) $$.node = new Op($1.node, '-', $3.node) $$.node = $1.node $$.node = $2.node $$.node = new Leaf($1) $$.node = new Leaf($1) -- a 4 + cc 22

SDT Applications Creating an explicit syntax tree. e.g., a 4 + c Classwork: + -- cc a 4 Generate syntax tree using the following grammar. Production E T E' E' + T E' 1 E' - T E' 1 E' ε T ( E ) T id T num $$.node = $2.syn $2.inh = $1.node Semantic Rules $3.inh = new Op($$.inh, '+', $2.node) $$.syn = $3.syn $3.inh = new Op($$.inh, '-', $2.node) $$.syn = $3.syn $$.syn = $$.inh $$.node = $2.node $$.node = new Leaf($1) $$.node = new Leaf($1) 23

SDT Applications Finding type expressions int a[2][3] is array of 2 arrays of 3 integers. in functional style: array(2, array(3, int)) array Production T B id C Semantic Rules T.t = C.t C.i = B.t 22 array B int B float B.t = int B.t = float 33 int int C [ num ] C 1 C.t = array(num, C 1.t) C 1.i = C.i C ε C.t = C.i Classwork: Write productions and and semantic rules for for creating type expressions from array declarations. 24

SDD for Calculator Sr. No. Production Semantic Rules 1 E' E $ E'.val = E.val 2 E E 1 + T E.val = E 1.val + T.val 3 E T... 4 T T 1 * F... 5 T F... 6 F (E)... 7 F digit F.val = digit.lexval 25

SDT for Calculator Sr. No. Production Semantic Rules 1 E' E $ print(e.val) 2 E E 1 + T E.val = E 1.val + T.val 3 E T... 4 T T 1 * F... 5 T F... 6 F (E)... 7 F digit F.val = digit.lexval 26

SDT for Calculator Postfix SDT E' E $ { print(e.val); } E E 1 + T { E.val = E 1.val + T.val; } E T... T T 1 * F... T F... F (E)... F digit { F.val = digit.lexval; } SDTs with all the actions at the right ends of the production bodies are called postfix SDTs. Only synthesized attributes are useful here. Can be implemented during LR parsing by executing actions when reductions occur. The attribute values can be put on a stack and can be retrieved. 27

Parsing Stack A X Y Z X Y Z X.x Y.y Z.z State / grammar symbol Synthesized attribute stack top Compare with $1, $2, in Yacc. Production Actions E' E $ { print(stack[top 1].val); --top; } E E 1 + T { stack[top 2].val += stack[top].val; top -= 2; } E T { stack[top].val = stack[top].val; } T T 1 * F { stack[top 2].val *= stack[top].val; top -= 2; } T F { stack[top].val = stack[top].val; } F (E) { stack[top 2].val = stack[top 1].val; top -= 2; } F digit { stack[top].val = stack[top].val; } 28

Actions within Productions Actions may be placed at any position within production body. Considered as empty non-terminals called markers. For production B X {action} Y, action is performed as soon as X appears on top of the parsing stack in bottom-up parsing. just before expanding Y in top-down parsing if Y is a nonterminal. just before we check for Y on the input in top-down parsing if Y is a terminal. SDTs that can be implemented during parsing are Postfix SDTs (S-attributed definitions) SDTs implementing L-attributed definitions Classwork: Write SDT for for infix-to-prefix translation. 29

Infix-to-Prefix What is the issue with this SDT? The SDT has shift-reduce conflicts. Recall that each marker is an empty non-terminal. Thus, the parser doesn't know whether to shift or shift or reduce on seeing a digit. E' E $ E { print '+'; } E1 + T E T T { print '*'; } T1 * F T F F (E) F digit { print digit.lexval; } Classwork: Write SDT for for infix-to-prefix translation. 30

Code Generation for while We want to generate code for while-construct S while ( C ) S 1 We assume that code for S 1 and C are available. We also (for now) generate a single code string. Classwork: What all do we require to generate this code? This would give us an idea of what attributes we need and their types. label label L1: L1: C if if true true jump jump L2 L2 else else L3 L3 label label L2: L2: S 1 1 jump jump L1 L1 label label L3: L3: C.code S 1.code S.next S 31

Code Generation for while Assume we have the following mechanism. newlabel() returns a new label name. You may have used a similar one for temporaries. Each statement has an attribute next, that points to the next statement to be executed. Each conditional has two branches true and false. Each non-terminal has an attribute code. 32

SDD for while S while ( C ) S L1 1 L1 = newlabel(); SDT L2 L2 = newlabel(); S 1.next 1.next = L1; L1; C.false = S.next; C.true C.true = L2; L2; S.code = label + L1 L1 + C.code + label + L2 L2 + S 1.code; 1 S while ( { L1 = newlabel(); L2 = newlabel(); C. false = S.next; C.true = L2; } C ) { S 1.next = L2; } S 1 { S.code = label + L1 + C.code + label + L2 + S 1.code; } What is is the type of of this SDD? 33

SDD for while S while ( C ) S L1 1 L1 = newlabel(); SDT L2 L2 = newlabel(); S 1.next 1.next = L1; L1; C.false = S.next; C.true C.true = L2; L2; S.code = label + L1 L1 + C.code + label + L2 L2 + S 1.code; 1 S while ( { L1 = newlabel(); L2 = newlabel(); C. false = S.next; C.true = L2; print( label, L1); } C ) { S 1.next = L2; print( label, L2); } S 1 On-the-fly code generation What is is the type of of this SDD? 34

Homework Exercises 5.5.5 from ALSU book. 35