Principles of Programming Languages

Similar documents
Principles of Programming Languages

Syntax-Directed Translation Part I

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 Part II

Syntax-Directed Translation

Syntax-Directed Translation

Syntax-Directed Translation

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

Syntax-Directed Translation. Introduction

[Syntax Directed Translation] Bikash Balami

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

CSE302: Compiler Design

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

Syntax Directed Translation

Abstract Syntax Tree

Semantic Analysis Attribute Grammars

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

Compila(on /15a Lecture 6. Seman(c Analysis Noam Rinetzky

Lecture 14 Sections Mon, Mar 2, 2009

Syntax Directed Translation

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

Syntax-Directed Translation

Abstract Syntax Trees & Top-Down Parsing

Abstract Syntax Trees & Top-Down Parsing

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

Abstract Syntax Trees & Top-Down Parsing

COP5621 Exam 3 - Spring 2005

Abstract Syntax Trees Synthetic and Inherited Attributes

EDA180: Compiler Construc6on Context- free grammars. Görel Hedin Revised:

Summary: Semantic Analysis

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

Announcements. Working in pairs is only allowed for programming assignments and not for homework problems. H3 has been posted

COP4020 Programming Languages. Semantics Prof. Robert van Engelen

Syntax-Directed Translation

COMP-421 Compiler Design. Presented by Dr Ioanna Dionysiou

5. Syntax-Directed Definitions & Type Analysis

Error Handling Syntax-Directed Translation Recursive Descent Parsing

Syntax-Directed Translation. Lecture 14

Lecture Compiler Construction

COMPILER CONSTRUCTION (Evaluation Orders for SDD s)

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

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

EDA180: Compiler Construc6on. Top- down parsing. Görel Hedin Revised: a

COP4020 Programming Languages. Semantics Robert van Engelen & Chris Lacher

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

COP4020 Programming Assignment 2 Spring 2011

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

More On Syntax Directed Translation

Building Compilers with Phoenix

Programming Languages

Error Handling Syntax-Directed Translation Recursive Descent Parsing

Question Bank. 10CS63:Compiler Design

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

Error Handling Syntax-Directed Translation Recursive Descent Parsing

Principles of Programming Languages

A Simple Syntax-Directed Translator

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

COP4020 Programming Assignment 2 - Fall 2016

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

Syntax and Grammars 1 / 21

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

Syntactic Directed Translation

Compiler construction in4303 lecture 3

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

Static and Dynamic Semantics

JavaCC Parser. The Compilation Task. Automated? JavaCC Parser

Evaluation of Semantic Actions in Predictive Non- Recursive Parsing

LR Parsing LALR Parser Generators

Chapter 4. Action Routines

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

The Compiler So Far. Lexical analysis Detects inputs with illegal tokens. Overview of Semantic Analysis

Syntax Directed Translation

4 (c) parsing. Parsing. Top down vs. bo5om up parsing

Recursive Descent Parsers

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

Semantic Analysis with Attribute Grammars Part 3

Chapter 4 :: Semantic Analysis

CSE 130 Programming Language Principles & Paradigms Lecture # 5. Chapter 4 Lexical and Syntax Analysis

LECTURE 3. Compiler Phases

Anatomy of a Compiler. Overview of Semantic Analysis. The Compiler So Far. Why a Separate Semantic Analysis?

Compiler construction lecture 3

COP4020 Spring 2011 Midterm Exam

Wednesday, September 9, 15. Parsers

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

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

Computer Science Department Carlos III University of Madrid Leganés (Spain) David Griol Barres

Advanced Topics in MNIT. Lecture 1 (27 Aug 2015) CADSL

The Parsing Problem (cont d) Recursive-Descent Parsing. Recursive-Descent Parsing (cont d) ICOM 4036 Programming Languages. The Complexity of Parsing

Error Handling Syntax-Directed Translation Recursive Descent Parsing. Lecture 6

Chapter 4. Lexical and Syntax Analysis

Lexical and Syntax Analysis. Top-Down Parsing

Principles of Programming Languages

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

CS 406: Syntax Directed Translation

CS 314 Principles of Programming Languages

Prof. Mohamed Hamada Software Engineering Lab. The University of Aizu Japan

4. Semantic Processing and Attributed Grammars

4. Lexical and Syntax Analysis

Ways to implement a language

Transcription:

Principles of Programming Languages h"p://www.di.unipi.it/~andrea/dida2ca/plp- 14/ Prof. Andrea Corradini Department of Computer Science, Pisa Lesson 11! Syntax- Directed Transla>on

The Structure of the Front- End Source Program (Character stream) Lexical analyzer Token stream Parser Syntax- directed translator Develop parser and code generator for translator Intermediate representation Syntax defini>on (BNF grammar) IR specifica>on 2

Syntax- Directed Transla>on Briefly introduced in the first lectures General technique to manipulate programs, based on context- free grammars Tightly bound with parsing Will be used for sta>c analysis (type checking) and (intermediate) code genera>on Several other uses: Genera>on of abstract syntax trees Evalua>on of expressions Implementa>on of Domain Specific Languages (see example on typeseung math formulas in the book) Partly supported by parser generators like Yacc 3

Syntax- Directed Transla>on We will consider: Syntax- Directed Defini>ons (A"ribute Grammars) Syntax- Directed Transla>on Schemes Transla>on evaluated on the parse tree Transla>on evaluated during parsing 4

Syntax- Directed Defini>ons A syntax- directed defini6on (or a"ribute grammar) is a context free grammar where: Terminals and nonterminals have a"ributes holding values Produc>ons have associated seman6c rules, which set the values of ayributes Each grammar symbol can have any number of ayributes AYribute val of symbol X is denoted X.val A seman>c rule of a produc>on A α has the form b := f(c 1,c 2,,c k ) where b,c 1,c 2,,c k are ayributes of A or of the symbols in α 5

AYributes An annotated parse tree is a parse tree where all ayributes of nodes have the corresponding value AYribute values may represent Numbers (literal constants) Strings (literal constants) Intermediate program representa>ons (pointers to) nodes of abstract syntax tree (pointers to) strings represen>ng the intermediate code Memory loca>ons, such as a frame index of a local variable or func>on argument A data type for type checking of expressions Scoping informa>on for local declara>ons 6

Synthesized vs. Inherited AYributes Given a produc>on A α and a seman>c rule b := f(c 1,c 2,,c k ) if b is an ayribute of A then it is a synthesized ayribute of A if b is an ayribute of a symbol B in α then it is an inherited ayribute B Note: terminal symbols have only synthesized ayributes Production Semantic Rule inherited D T L T int L id L.in := T.type T.type := integer := L.in synthesized 7

S- AYributed Defini>ons A syntax- directed defini>on that uses synthesized ayributes exclusively is called an S- a"ributed defini6on (or S- a"ributed grammar) A parse tree of an S- ayributed defini>on can be annotated with a single boyom- up traversal Given a parse tree, any postorder depth- first traversal algorithm can be used to execute the seman>c rules and assign ayribute values In some cases ayributes can be evaluated during parsing, without building the parse tree explicitly [Yacc/Bison only support S- ayributed defini>ons] 8

Example: evalua>ng expressions with synthesized ayributes Productions L E n E E 1 + T E T T T 1 * F T F F ( E ) F digit Semantic Rules L.val := E.val E.val := E 1.val + T.val E.val := T.val T.val := T 1.val * F.val T.val := F.val F.val := E.val F.val := digit.lexval A Syntax- Directed Defini6on (SDD) or A"ribute Grammar 9

Example: An Annotated Parse Tree Productions Semantic Rule L E n E E 1 + T E T T T 1 * F T F F ( E ) F digit L.val := E.val E.val := E 1.val + T.val E.val := T.val T.val := T 1.val * F.val T.val := F.val F.val := E.val F.val := digit.lexval E.val = 14 E.val = 16 L.val = 16 T.val = 2 E.val = 9 T.val = 5 F.val = 5 T.val = 9 F.val = 5 F.val = 9 9 + 5 + 2 n 10

Annota>ng a Parse Tree with Depth- First Post- Order Traversals procedure visit(n : node); begin for each child m of n, from left to right do visit(m); evaluate semantic rules at node n end 11

Depth- First Traversals (Example) Note: right- to- leb traversal works as well L.val = 16 E.val = 16 E.val = 14 E.val = 9 T.val = 5 T.val = 9 F.val = 5 F.val = 9 T.val = 2 F.val = 5 Semantic Rules L.val := E.val E.val := E 1.val + T.val E.val := T.val T.val := T 1.val * F.val T.val := F.val F.val := E.val F.val := digit.lexval 9 + 5 + 2 n 12

Example: genera>on of Abstract Syntax Trees A parse tree is called a concrete syntax tree An abstract syntax tree (AST) is defined by the compiler writer as a more convenient intermediate representa>on E E + T T T * id id id Concrete syntax tree + id * id id Abstract syntax tree 13

S- AYributed Defini>ons for Genera>ng Abstract Syntax Trees Production E E 1 + T E E 1 - T E T T T 1 * id T T 1 / id T id Semantic Rule E.nptr := mknode( +, E 1.nptr, T.nptr) E.nptr := mknode( -, E 1.nptr, T.nptr) E.nptr := T.nptr T.nptr := mknode( *, T 1.nptr, mkleaf(id, id.entry)) T.nptr := mknode( /, T 1.nptr, mkleaf(id, id.entry)) T.nptr := mkleaf(id, id.entry) 14

Genera>ng Abstract Syntax Trees Synthesize AST E.nptr E.nptr + T.nptr T.nptr T.nptr * id id id + id * id id 15

Example AYribute Grammar with Synthesized + Inherited AYributes Grammar genera>ng declara>on of typed variables Limited side- effect: The ayributes add typing informa>on to the symbol table via side effects Inherited ayributes allow to handle informa>on that does not respect the tree structure Production D T L T int T real L L 1, id L id Semantic Rule Synthesized: T.type, id.entry L.in := T.type Inherited: L.in T.type := integer T.type := real L 1.in := L.in; addtype(id.entry, L.in) addtype(id.entry, L.in) 16

Evalua>on order of ayributes In presence of inherited ayributes, it is not obvious in what order the ayributes should be evaluated AYributes of a nonterminal in a produc>on may depend in an arbitrary way on ayributes of other symbols The evalua>on order must be consistent with such dependencies If the dependencies are circular, there is no way to evaluate the ayributes Side- effect rules are interpreted as defini>on of dummy synthesized ayributes of the head symbol 17

Dependency Graphs for AYributed Parse Trees Given a parse tree, consider as nodes all its ayributes Represent graphically the dependencies induced by seman>c rules A X Y A.a X.x Y.y A.a := f(x.x, Y.y) synthesized Direction of value dependence A.a X.x Y.y A.a X.x := f(a.a, Y.y) inherited X.x Y.y Y.y := f(a.a, X.x) inherited 18

Dependency Graphs with Cycles? Edges in the dependency graph determine the evalua>on order for ayribute values Dependency graphs cannot be cyclic: no evalua>on order is possible X.x A.a Y.y A.a := f(x.x) X.x := f(y.y) Y.y := f(a.a) Error: cyclic dependence 19

Example Annotated Parse Tree D T L T int T real L L 1, id L id L.in := T.type T.type := integer T.type := real L 1.in := L.in; addtype(id.entry, L.in) addtype(id.entry, L.in) real id, id, id T 1.type = real D L 1.in = real real L 2.in = real, id 3.entry L 3.in = real id 1.entry, id 2.entry Dummy synthesized ayribute of L induced by side- effect ac>ons 20

Example Annotated Parse Tree with Dependency Graph D T L T int T real L L 1, id L id L.in := T.type T.type := integer T.type := real L 1.in := L.in; addtype(id.entry, L.in) addtype(id.entry, L.in) real id, id, id T 1.type = real D L 1.in = real real L 2.in = real, id 3.entry L 3.in = real id 1.entry, id 2.entry Dependencies induced by side- effect ac>ons 21

Evalua>on Order A topological sort of a directed acyclic graph (DAG) is any ordering m 1, m 2,, m n of the nodes of the graph, such that if m i m j is an edge, then m i appears before m j Any topological sort of a dependency graph gives a valid evalua>on order of the seman>c rules 22

Example Parse Tree with Topologically Sorted Actions T 1.type = real real L 3.in = real 9 10 1 id 1.entry D L 2.in = real L 1.in = real 4 5 6 7 8, 2, id 2.entry 3 id 3.entry Topological sort: 1. Get id 1.entry 2. Get id 2.entry 3. Get id 3.entry 4. T 1.type= real 5. L 1.in=T 1.type 6. addtype(id 3.entry, L 1.in) 7. L 2.in=L 1.in 8. addtype(id 2.entry, L 2.in) 9. L 3.in=L 2.in 10. addtype(id 1.entry, L 3.in) 23

Evalua>on Methods Parse- tree methods: for each input, build the parse tree and the dependency graph, and determine an evalua>on order from a topological sort Rule- base methods the evalua>on order is pre- determined from the seman>c rules Oblivious methods the evalua>on order is fixed and seman>c rules must be (re)wriyen to support the evalua>on order (for example S- ayributed defini>ons) 24

L- AYributed Defini>ons A syntax- directed defini>on is L- a"ributed if each inherited ayribute of X j on the right side of A X 1 X 2 X n depends only on 1. the ayributes of the symbols X 1, X 2,, X j- 1 2. the inherited ayributes of A 3. the ayributes of X j, in a non- circular way Possible dependences of inherited ayributes A.a X 1.x X 2.x 25

L- AYributed Defini>ons (cont d) L- ayributed defini>ons allow for a natural order of evalua>ng ayributes: depth- first and leb to right A X Y X.i:=A.i X A Y Y.i:=X.s A.s:=Y.s X.i := A.i Y.i := X.s A.s := Y.s Note: every S- ayributed syntax- directed defini>on is also L- ayributed (since it doesn t have any inherited ayribute) 26

Syntax- Directed Transla>on Schemes Translation Schemes provide an alternative notation for Syntax-Directed Definitions and are more expressive in general The semantic rules include arbitrary side-effects and can be suitably embedded into productions SDD s can be evaluated in any order compatible with the dependencies, SDT s should be evaluated left-to-right SDT s can always be implemented by building the parse tree first, and then performing the actions in left-to-right depth-first order In several cases they can be implemented during parsing, without building the whole parse tree first 27

Syntax- Directed Transla>on Schemes A production of a translation scheme and corresponding node in a parse tree: rest rest + term { print( + ) } rest Embedded semantic action + term { print( + ) } rest Possible implementation: Build the parse tree ignoring semantic actions Add semantic actions in the right place below nonterminals Visit the tree in depth-first, pre-order left-to-right traversal executing all actions 28

Posnix Transla>on Schemes If the grammar is LR (thus can be parsed boyom- up) and the SDD is S- ayributed (synthesized ayributes only), seman>c ac>ons can be placed at the end of the produc>ons They are executed when the body is reduced to the head SDTs where all ac>ons are at the end of produc>ons are called posnix SDTs 29

Example Transla>on Scheme for Posnix Nota>on expr expr + term expr expr - term expr term term 0 term 1 term 9 { print( + ) } { print( - ) } { print( 0 ) } { print( 1 ) } { print( 9 ) } 30

Example Transla>on Scheme (cont d) expr term 9 expr { print( + ) } expr + term { print( 2 ) } { print( - ) } - term 2 { print( 5 ) } 5 { print( 9 ) } Translates 9-5+2 into postfix 95-2+ 31

Implementa>on of Posnix SDTs Posnix SDTs can be implemented during LR parsing The ac>ons are executed when reduc>ons occur The ayributes of grammar symbols can be put on the stack, together with the symbol or the state corresponding to it Since all ayributes are synthesized, the ayribute for the head can be computed when the reduc>on occurs, because all ayributes of symbols in the body are already computed 32

Using Transla>on Schemes for L- AYributed Defini>ons An L- ayributed SDD for a grammar that can be parsed top- down (LL) can be implemented using Transla>on Schemes 1. Embed ac>ons that compute inherited a"ributes for nonterminal A immediately before A Note that in leb- to- right parsing, all ayributes on which the inherited ayribute may depend are evaluated already 2. Place ac>ons that compute a synthesized a"ribute for the head of a produc>on at the end of the body of that produc>on We consider some ways of implemen>ng the resul>ng SDTs during parsing, both top- down and boyom- up 33

Using Transla>on Schemes for L- AYributed Defini>ons Production D T L T int T real L L 1, id L id Semantic Rule L.in := T.type T.type := integer T.type := real L 1.in := L.in; addtype(id.entry, L.in) addtype(id.entry, L.in) Translation Scheme D T { L.in := T.type } L T int { T.type := integer } T real { T.type := real } L { L 1.in := L.in } L 1, id { addtype(id.entry, L.in) } L id { addtype(id.entry, L.in) } 34

Implemen>ng L- AYributed Defini>ons in Recursive- Descent Parsers Recap of Recursive Descent Parsing Grammar must be LL(1) Every nonterminal has one (recursive) procedure When a nonterminal has mul>ple produc>ons, the input look- ahead is used to choose one Note: the procedures have no parameters and no result expr term rest rest + term rest - term rest ε term id procedure rest(); begin if lookahead in FIRST(+ term rest) then match( + ); term(); rest() else if lookahead in FIRST(- term rest) then match( - ); term(); rest() else if lookahead in FOLLOW(rest) then return else error() end; 35

Implemen>ng L- AYributed Defini>ons in Recursive- Descent Parsers Attributes are passed as arguments to procedures (inherited) or returned (synthesized) Procedures store computed attributes in local variables D T { L.in := T.type } L T int { T.type := integer } T real { T.type := real } void D() { Type Ttype = T(); Type Lin = Ttype; L(Lin); } Type T() { Type Ttype; if (lookahead == INT) { Ttype = TYPE_INT; match(int); } else if (lookahead == REAL) { Ttype = TYPE_REAL; match(real); } else error(); return Ttype; } void L(Type Lin) { } Output: synthesized attribute Input: inherited attribute 36

Implemen>ng L- AYributed Defini>ons in Top- Down Table- Driven Parsers The stack will contain, besides grammar symbols, ac6on- records and synthesize- records Inherited ayributes of A are placed in A s record The code compu>ng them is in a record above A Synthesized ayributes of A are placed in a record just below A input a + b $ It may be necessary to make copies of ayributes to avoid that they are popped when s>ll needed X Y Z Predic>ve parsing program (driver) output $ stack Parsing table M 37

Implemen>ng L- AYributed Defini>ons for LL grammars in BoYom- Up Parsers Remove any embedded ac>on with marking nonterminal: A α { act } β becomes A α N β N ε { act } where act : Copies as inherited ayributes of N any ayribute of A, α needed by act Computes ayributes like act, making them synthesized for N Fact: if the start grammar was LL, the new one is LR Note: act accesses ayributes out of its produc>on! This works, as they are (deeper) in the LR stack 38