Top Banner
CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak www.cs.sjsu.edu/~mak 1
39

CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Jan 03, 2016

Download

Documents

Gerard Ryan
Welcome message from author
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
Page 1: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

1

CS 153: Concepts of Compiler DesignSeptember 9 Class Meeting

Department of Computer ScienceSan Jose State University

Fall 2015Instructor: Ron Mak

www.cs.sjsu.edu/~mak

Page 2: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

2

Assignment #2

Add a Java scanner to the code from Chapter 3. New wci.frontend.java package. Leave the Pascal scanner intact and operational.

See http://www.cs.sjsu.edu/~mak/CS153/assignments/2/Assignment2.pdf

Team project Due Friday, September 18

Page 3: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

3

The Symbol Table Stack Whichever symbol table is

on top of the stack is the local symbol table.

The first symbol table created (the one at the bottom of the stack) is the global symbol table. It stores the predefined

information, such as entries for the names of the standard types integer, real, char, and boolean.

During the translation process, symbol tables are pushed onto and popped off the stack … … as the parser enters and exits

nested procedures, functions, record types, etc.

Globalsymbol table

Page 4: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

4

Symbol Table Interfaces Key operations

Enter into the local symbol table, the table currently at the top of the stack.

Look up (search for) an entry only in the local symbol table.

Look up an entry in all the symbol tables in the stack. Search from the top (the

local) table down to the bottom (global) table.

Each symbol table has a nesting level. 0: global 1: program 2: top-level procedure 3: nested procedure, etc.

Page 5: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

5

Symbol Table Components Implementation

Implementation classes are defined in package intermediate.symtabimpl

A SymTabStackImpl object can own zero or more SymTab objects.

A SymTabImpl object can own zero or more SymTabEntry objects.

A SymTabEntryImpl object maintains a reference to the SymTab object that contains it.

Page 6: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

6

Symbol Table Entry Implementation

Implement a symbol table entry as a Java hash map: extends HashMap<SymTabKey, Object> implements SymTabEntry

Most flexibility in what we can store in each entry. Key: attribute key (an enumerated type) Value: attribute value (an arbitrary object)

public void setAttribute(SymTabKey key, Object value){ put(key, value);}

public Object getAttribute(SymTabKey key){ return get(key);}

Page 7: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

7

What to Store in Each Symbol Table Entry Each symbol table entry is designed to store

information about an identifier. The attribute keys indicate what information

we will store for each type of identifier. Store common information in fixed fields (e.g., lineNumbers)

and store identifier type-specific information as attributes.

public enum SymTabKeyImpl implements SymTabKey{ // Constant. CONSTANT_VALUE,

// Procedure or function. ROUTINE_CODE, ROUTINE_SYMTAB, ROUTINE_ICODE, ROUTINE_PARMS, ROUTINE_ROUTINES,

// Variable or record field value. DATA_VALUE}

Page 8: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

8

Modifications to Class PascalParserTDwhile (!((token = nextToken()) instanceof EofToken)) { TokenType tokenType = token.getType();

// Cross reference only the identifiers. if (tokenType == IDENTIFIER) { String name = token.getText().toLowerCase();

// If it's not already in the symbol table, // create and enter a new entry for the identifier. SymTabEntry entry = symTabStack.lookup(name); if (entry == null) { entry = symTabStack.enterLocal(name); }

// Append the current line number to the entry. entry.appendLineNumber(token.getLineNumber()); }

else if (tokenType == ERROR) { errorHandler.flag(token, (PascalErrorCode) token.getValue(), this); }}

Page 9: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

9

Cross-Reference Listing

A cross-reference listing verifies the symbol table code:java -classpath classes Pascal compile -x newton.pas

Modifications to the main Pascal class:parser.parse();iCode = parser.getICode();symTabStack = parser.getSymTabStack();

if (xref) { CrossReferencer crossReferencer = new CrossReferencer(); crossReferencer.print(symTabStack);}

backend.process(iCode, symTabStack);source.close();

A new utility class CrossReferencer generates the cross-reference listing.

Demo

Page 10: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

10

Cross-Reference Listing Output001 PROGRAM newton (input, output);002 003 CONST004 EPSILON = 1e-6;005 006 VAR007 number : integer;008 root, sqRoot : real;009 010 BEGIN011 REPEAT012 writeln;013 write('Enter new number (0 to quit): ');014 read(number);

...

035 UNTIL number = 0036 END.

36 source statements. 0 syntax errors. 0.06 seconds total parsing time.

Page 11: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

11

Cross-Reference Listing Output, cont’d

===== CROSS-REFERENCE TABLE =====

Identifier Line numbers ---------- ------------ abs 031 033epsilon 004 033input 001integer 007newton 001number 007 014 016 017 019 023 024 029 033 035output 001read 014real 008root 008 027 029 029 029 030 031 033sqr 033sqroot 008 023 024 031 031sqrt 023write 013writeln 012 017 020 024 025 030

0 instructions generated. 0.00 seconds total code generation time.

Page 12: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

12

Quick Review of the Framework

FROM:

TO:

Next topic:Parsing assignment statements

and expressions, andgenerating parse trees.

Page 13: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

13

Pascal Statement Syntax Diagrams

Page 14: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

14

Pascal Statement Syntax Diagrams, cont’d

For now,greatly simplified!

Page 15: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

15

Parse Tree: Conceptual Design

BEGIN alpha := -88; beta := 99; result := alpha + 3/(beta – gamma) + 5END

More accurately called anabstract syntax tree (AST).

Page 16: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

16

Parse Tree: Conceptual Design

At the conceptual design level, we don’t care how we implement the tree.

This should remind you of how we first designed the symbol table.

Page 17: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

17

Parse Tree: Basic Tree Operations

Create a new node. Create a copy of a node. Set and get the root node of a parse tree. Set and get an attribute value in a node. Add a child node to a node. Get the list of a node’s child nodes. Get a node’s parent node.

Page 18: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

18

Intermediate Code Interfaces

Goal: Keep it sourcelanguage-independent.

Page 19: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

19

Intermediate Code Implementations

Page 20: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

20

An Intermediate Code Factory Class

public class ICodeFactory{ public static ICode createICode() { return new ICodeImpl(); }

public static ICodeNode createICodeNode(ICodeNodeType type) { return new ICodeNodeImpl(type); }}

Page 21: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

21

Coding to the Interfaces (Again)

// Create the ASSIGN node.ICodeNode assignNode = ICodeFactory.createICodeNode(ASSIGN);

// Create the VARIABLE node (left-hand side).ICodeNode variableNode = ICodeFactory.createICodeNode(VARIABLE);

// Adopt the VARIABLE node as the first child.assignNode.addChild(variableNode);

Page 22: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

22

Intermediate Code (ICode) Node Typespublic enum ICodeNodeTypeImpl implements ICodeNodeType{ // Program structure PROGRAM, PROCEDURE, FUNCTION,

// Statements COMPOUND, ASSIGN, LOOP, TEST, CALL, PARAMETERS, IF, SELECT, SELECT_BRANCH, SELECT_CONSTANTS, NO_OP,

// Relational operators EQ, NE, LT, LE, GT, GE, NOT,

// Additive operators ADD, SUBTRACT, OR, NEGATE,

// Multiplicative operators MULTIPLY, INTEGER_DIVIDE, FLOAT_DIVIDE, MOD, AND,

// Operands VARIABLE, SUBSCRIPTS, FIELD, INTEGER_CONSTANT, REAL_CONSTANT, STRING_CONSTANT, BOOLEAN_CONSTANT,}

Do not confusenode types (ASSIGN, ADD, etc.)

with data types (integer, real, etc.).

We use the enumerated typeICodeNodeTypeImpl for node typeswhich is different from the enumeratedtype PascalTokenType to help maintainsource language independence.

Page 23: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

23

Intermediate Code Node Implementation

Each node is a HashMap<ICodeKey, Object>. Each node has an ArrayList<ICodeNode> of child nodes.

public class ICodeNodeImpl extends HashMap<ICodeKey, Object> implements ICodeNode{ private ICodeNodeType type; // node type private ICodeNode parent; // parent node private ArrayList<ICodeNode> children; // children array list

public ICodeNodeImpl(ICodeNodeType type) { this.type = type; this.parent = null; this.children = new ArrayList<ICodeNode>(); } ...}

Page 24: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

24

A Parent Node Adopts a Child Node

When a parent node adds a child node, we can say that the parent node “adopts” the child node.

Keep the parse tree implementation simple!

public ICodeNode addChild(ICodeNode node){ if (node != null) { children.add(node); ((ICodeNodeImpl) node).parent = this; }

return node;}

Page 25: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

25

What Attributes to Store in a Node?

Not much! Not every node will have these attributes. LINE: statement line number ID: symbol table entry of an identifier VALUE: data value

Most of the information about what got parsed is encoded in the node type and in the tree structure.

public enum ICodeKeyImpl implements ICodeKey{ LINE, ID, VALUE;}

Page 26: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

26

Statement Parser Class

Class StatementParser is a subclass of PascalParserTD which is a subclass of Parser.

Its parse() method builds a part of the parse tree and returns the root node of the newly built subtree.

Page 27: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

27

Statement Parser Subclasses StatementParser itself

has subclasses: CompoundStatement-

Parser AssignmentStatement-

Parser ExpressionParser

The parse() method of each subclass returns the root node of the subtree that it builds.

Note the dependency relationships among StatementParser and its subclasses.

Page 28: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

28

Building a Parse Tree

Each parse() method builds a subtree and returns the root node of the new subtree.

The caller of the parse() method adopts the subtree’s root node as a child of the subtree that the caller is building.

The caller then returns the root node of its subtree to its caller.

This process continues until the entire source has been parsed and we have the entire parse tree.

Page 29: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

29

Building a Parse Tree

Example: BEGIN alpha := 10; beta := 20END

1. CompoundStatementParser’s parse()method creates a COMPOUND node.

2. AssignmentStatementParser’s parse()method creates an ASSIGN node and a VARIABLE node, which the ASSIGN node adopts as its first child.

Page 30: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

30

Building a Parse Tree

3. ExpressionParser’s parse() method creates an INTEGER CONSTANT node which the ASSIGN node adopts as its second child.

4. The COMPOUND node adopts the ASSIGN node as its first child.

BEGIN alpha := 10; beta := 20END

Page 31: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

31

Building a Parse Tree5. Another set of calls to the parse() methods of AssignmentStatementParser and ExpressionParser builds another assignment statement subtree.

6. The COMPOUND node adopts the subtree as its second child.

BEGIN alpha := 10; beta := 20END

Page 32: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

32

Pascal Expression Syntax Diagrams

Page 33: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

33

Expression Syntax Diagrams, cont’d

Page 34: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

34

Expression Syntax Diagrams, cont’d

Page 35: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

35

Pascal’s Operator Precedence Rules

Level Operators

1 (factor: highest) NOT

2 (term) multiplicative: * / DIV MOD AND

3 (simple expression) additive: + - OR

4 (expression: lowest) relational: = <> < <= > >=

If there are no parentheses: Higher level operators execute before the lower level ones. Operators at the same level execute from left to right.

Because the factor syntax diagram defines parenthesized expressions, parenthesized expressions always execute first, from the most deeply nested outwards.

Page 36: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

36

Example Decomposition

alpha + 3/(beta – gamma) + 5

Page 37: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

37

Parsing Expressions

Pascal statement parser subclass ExpressionParser has methods that correspond to the expression syntax diagrams: parseExpression() parseSimpleExpression() parseTerm() parseFactor()

Each parse method returnsthe root of the subtree that it builds. Therefore, ExpressionParser’s

parse() method returns the root of the entire expression subtree.

Page 38: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

38

Parsing Expressions, cont’d

Pascal’s operator precedence rules determine the order in which the parse methods are called. The parse tree that ExpressionParser builds

determines the order of evaluation. Example: 32 + centigrade/ratio

Do a postorder traversalof the parse tree.

Visit the left subtree,

visit the right subtree,then visit the root.

Page 39: CS 153: Concepts of Compiler Design September 9 Class Meeting Department of Computer Science San Jose State University Fall 2015 Instructor: Ron Mak mak.

Computer Science Dept.Fall 2015: September 9

CS 153: Concepts of Compiler Design© R. Mak

39

Parsing Expressions, cont’d Example: a+b+c+d+e