48
1 Introduction to Compiling - Part 2 © Harry H. Porter, 2005 Infix / Postfix Notation Consider Binary Operators Infix Notation: operand operator operand Can be ambiguous! X + (Y - Z) X + Y - Z (X + Y) - Z Need rules of precedence, associativity, parentheses. Postfix Notation: operand operand operator Eliminates ambiguity! X Y Z - + X Y + Z - Assumption: No confusion about how many operands an operator requires. binary- versus unary- Infix: X + -(Y - Z) X + (Y - -Z) Postfix: X Y Z - bin - un + X Y Z - un - bin + means (X + Y) - Z means X + (Y - Z) 2 Introduction to Compiling - Part 2 © Harry H. Porter, 2005 Converting Expressions to Postfix Let E be an infix expression. Define POSTFIX(E) to be the same expression in postfix. (Ignore unary operators.) • If E is a variable or constant... then POSTFIX ( E ) = E If E is of the form E 1 op E 2 ... then POSTFIX ( E 1 op E 2 ) = POSTFIX ( E 1 ) || POSTFIX ( E 2 ) || op • If E is of the form ( E 1 ) ... then POSTFIX ( ( E 1 ) ) = POSTFIX ( E 1 ) String concatenation

Infix / Postfix Notation Converting Expressions to Postfix

  • Upload
    vanliem

  • View
    320

  • Download
    12

Embed Size (px)

Citation preview

Page 1: Infix / Postfix Notation Converting Expressions to Postfix

1

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Infix / Postfix Notation

Consider Binary Operators

Infix Notation: operand operator operand

Can be ambiguous!X + (Y - Z)

X + Y - Z(X + Y) - Z

Need rules of precedence, associativity, parentheses.

Postfix Notation: operand operand operator

Eliminates ambiguity!X Y Z - +X Y + Z -

Assumption: No confusion about how many operands an operator requires.binary- versus unary-

Infix: X + -(Y - Z) X + (Y - -Z)

Postfix: X Y Z -bin -un + X Y Z -un -bin +

means (X + Y) - Z

means X + (Y - Z)

2

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Converting Expressions to Postfix

Let E be an infix expression.

Define POSTFIX(E) to be the same expression in postfix.

(Ignore unary operators.)

• If E is a variable or constant...

then POSTFIX ( E ) = E

• If E is of the form E1 op E2 ...

then POSTFIX ( E1 op E2 ) = POSTFIX ( E1 ) || POSTFIX ( E2 ) || op

• If E is of the form ( E1 ) ...

then POSTFIX ( ( E1 ) ) = POSTFIX ( E1 )String concatenation

Page 2: Infix / Postfix Notation Converting Expressions to Postfix

3

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Syntax-Directed Translation

Problem/Goal:

Translate infix expressions into postfix.

The input is described by a CFG.

Approach:

Start with the grammar.

Each production is augmented with semantic rules.

Each non-terminal has an associated attribute.

Expr . trans

Semantic rules added to grammar productions

...tell how to compute the attributes’ values.

trans = “a b + c +”;

Attribute has a name

and a valueNon-terminal

4

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

An Example Attribute Grammar

CFG Grammar

Expr ! Expr + Term

! Expr - Term

! Term

Term ! ID

Terminals:

“+”, “-”, ID

Token attribute: ID.svalue

Non-terminals:

Expr

Term

Attributes:

Expr.t

Term.s

Attribute Values:

Strings, e.g., “x y + z -”

Concatenation: ||

Page 3: Infix / Postfix Notation Converting Expressions to Postfix

5

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Attribute Grammar

Expr ! Expr + Term

Expr ! Expr - Term

Expr ! Term

Term ! ID

6

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Attribute Grammar

Expr0 ! Expr1 + Term

Expr0 ! Expr1 - Term

Expr0 ! Term

Term ! ID

Subscripts added

...to tell different

non-terminals apart

Page 4: Infix / Postfix Notation Converting Expressions to Postfix

7

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Attribute Grammar

Expr0 ! Expr1 + Term Expr0.t = Expr1.t || Term.s || “+”;

Expr0 ! Expr1 - Term Expr0.t = Expr1.t || Term.s || “-”;

Expr0 ! Term Expr0.t = Term.s;

Term ! ID Term.s = ID.svalue;

8

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Example

Translate: “X - Y + W”

Step 1: Find a parse tree

Expr0 ! Expr1 + Term

Expr0 ! Expr1 - Term

Expr0 ! Term

Term ! ID

Page 5: Infix / Postfix Notation Converting Expressions to Postfix

9

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Example

Translate: “X - Y + W”

Step 1: Find a parse treeExpr

Expr

Expr

Term

Term

Term

ID svalue = “X”

ID svalue = “W”

ID svalue = “Y”

+

-

Expr0 ! Expr1 + Term

Expr0 ! Expr1 - Term

Expr0 ! Term

Term ! ID

10

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Example

Translate: “X - Y + W”

Step 1: Find a parse tree

Step 2: Compute the attribute values

Expr t =

Expr t =

Expr t =

Term s =

Term s =

Term s =

ID svalue = “X”

ID svalue = “W”

ID svalue = “Y”

+

-

Expr0 ! Expr1 + Term

Expr0 ! Expr1 - Term

Expr0 ! Term

Term ! ID

Page 6: Infix / Postfix Notation Converting Expressions to Postfix

11

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Example

Translate: “X - Y + W”

Step 1: Find a parse tree

Step 2: Compute the attribute values

Expr t =

Expr t =

Expr t =

Term s = “W”

Term s = “Y”

Term s = “X”

ID svalue = “X”

ID svalue = “W”

ID svalue = “Y”

+

-

Use the rule:

Term ! ID Term.s = ID.svalue;

Expr0 ! Expr1 + Term

Expr0 ! Expr1 - Term

Expr0 ! Term

Term ! ID

12

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Example

Translate: “X - Y + W”

Step 1: Find a parse tree

Step 2: Compute the attribute values

Expr t =

Expr t = “X”

Expr t =

Term s = “W”

Term s = “Y”

Term s = “X”

ID svalue = “X”

ID svalue = “W”

ID svalue = “Y”

+

-

Use the rule:

Expr0 ! Term Expr0.t = Term.s;

Expr0 ! Expr1 + Term

Expr0 ! Expr1 - Term

Expr0 ! Term

Term ! ID

Page 7: Infix / Postfix Notation Converting Expressions to Postfix

13

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Example

Translate: “X - Y + W”

Step 1: Find a parse tree

Step 2: Compute the attribute values

Expr t =

Expr t = “X”

Expr t = “X Y -”

Term s = “W”

Term s = “Y”

Term s = “X”

ID svalue = “X”

ID svalue = “W”

ID svalue = “Y”

+

-

Use the rule:

Expr0 ! Expr1 - Term

Expr0.t = Expr1.t || Term.s || “-”;

Expr0 ! Expr1 + Term

Expr0 ! Expr1 - Term

Expr0 ! Term

Term ! ID

14

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Example

Translate: “X - Y + W”

Step 1: Find a parse tree

Step 2: Compute the attribute values

Expr t = “X Y - W +”

Expr t = “X”

Expr t = “X Y -”

Term s = “W”

Term s = “Y”

Term s = “X”

ID svalue = “X”

ID svalue = “W”

ID svalue = “Y”

+

-

Use the rule:

Expr0 ! Expr1 + Term

Expr0.t = Expr1.t || Term.s || “+”;

Expr0 ! Expr1 + Term

Expr0 ! Expr1 - Term

Expr0 ! Term

Term ! ID

Page 8: Infix / Postfix Notation Converting Expressions to Postfix

15

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Example

Translate: “X - Y + W”

Step 1: Find a parse tree

Step 2: Compute the attribute values

Expr t = “X Y - W +”

Expr t = “X”

Expr t = “X Y -”

Term s = “W”

Term s = “Y”

Term s = “X”

ID svalue = “X”

ID svalue = “W”

ID svalue = “Y”

+

-

Expr0 ! Expr1 + Term

Expr0 ! Expr1 - Term

Expr0 ! Term

Term ! ID

16

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Synthesized v. Inherited

Synthesized Attributes(see previous example)

Compute the attributes bottom-up

From leaves toward root

Example Semantic Rule:

Expr0 ! Expr1 - Term Expr0.t = Expr1.t || Term.s || “-”;

All rules compute the attribute of the left-hand side

... as a function of the attributes from the right-hand side.

X ! A B C X.t = f(A.t, B.t, C.t);

Information flows up the tree.

A Bottom-Up Approach

Inherited AttributesInformation flows down the tree

Example:

X ! A B C B.t = f(X.t);

A Top-Down Approach

Page 9: Infix / Postfix Notation Converting Expressions to Postfix

17

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Depth-First Traversal

function Visit (N: Node) for each child of N do Visit (child) endFor ”process” NendFunction

Sythesized AttributesEvaluate children first

Then move up the tree

... and take care of parents’ attributes

A

B C

FD E G

18

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Translator Schemes

Embed semantic actions into grammar rules.

Example

X ! A { print(“+”) } B { print(“.”) } C

Enclose actions in braces { ... }

Arbitrary code (e.g., Java statements)

Page 10: Infix / Postfix Notation Converting Expressions to Postfix

19

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Translator Schemes

Embed semantic actions into grammar rules.

Example

X ! A { print(“+”) } B { print(“.”) } C

Enclose actions in braces { ... }

Arbitrary code (e.g., Java statements)

How to execute?

Step 1: Construct a parse tree

Add the actions to the parse tree

X

A B C{ print(“.”) }{ print(“+”) }

20

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Translator Schemes

Embed semantic actions into grammar rules.

Example

X ! A { print(“+”) } B { print(“.”) } C

Enclose actions in braces { ... }

Arbitrary code (e.g., Java statements)

How to execute?

Step 1: Construct a parse tree

Add the actions to the parse tree

Step 2: Perform a depth-first traversal

Execute actions as they are encountered in traversal

X

A B C{ print(“.”) }{ print(“+”) }

Page 11: Infix / Postfix Notation Converting Expressions to Postfix

21

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Example: Convert Infix Expressions to Postfix

Expr ! Expr + Term { print(“+”) }

Expr ! Expr - Term { print(“-”) }

Expr ! Term

Term ! ID { print(ID.svalue) }

22

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Example: Convert Infix Expressions to Postfix

Expr ! Expr + Term { print(“+”) }

Expr ! Expr - Term { print(“-”) }

Expr ! Term

Term ! ID { print(ID.svalue) }

Expr

Expr

Expr Term

Term

Term

ID sval=“X”

ID sval=“W”

ID sval=“Y”

+

-

print(“+”)

print(“-”)

print(“Y”)

print(“X”)

print(“W”)

Example

Source: X - Y + W

Output: X Y - W +

Page 12: Infix / Postfix Notation Converting Expressions to Postfix

23

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Assume we have a translator scheme...

Assume we have a parser...

Can we execute the actions while we do the parsing?

24

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Assume we have a translator scheme...

Assume we have a parser...

Can we execute the actions while we do the parsing?

Depth-first traversal ! Recursive descent parser!

Page 13: Infix / Postfix Notation Converting Expressions to Postfix

25

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Assume we have a translator scheme...

Assume we have a parser...

Can we execute the actions while we do the parsing?

Depth-first traversal ! Recursive descent parser!

Example:

Expr ! Expr + Term { print(“+”) }

! Expr - Term { print(“-”) }

! Term

Term! ID { print(ID.svalue) }

26

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Assume we have a translator scheme...

Assume we have a parser...

Can we execute the actions while we do the parsing?

Depth-first traversal ! Recursive descent parser!

Example:

Expr ! Expr + Term { print(“+”) }

! Expr - Term { print(“-”) }

! Term

Term! ID { print(ID.svalue) }

First, we’ll need to eliminate left-recursion:

Expr ! Term Rest

Rest ! + Term { print(“+”) } Rest

! - Term { print(“-”) } Rest

! "

Term! ID { print(ID.svalue) }

Page 14: Infix / Postfix Notation Converting Expressions to Postfix

27

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Implementation

Expr ! Term Rest

Rest ! + Term { print(“+”) } Rest

! - Term { print(“-”) } Rest

! "

Term ! ID { print(ID.svalue) }

function ParseExpr () ParseTerm () ParseRest ()endFunction

28

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Implementation

Expr ! Term Rest

Rest ! + Term { print(“+”) } Rest

! - Term { print(“-”) } Rest

! "

Term ! ID { print(ID.svalue) }

function ParseTerm () if nextToken == ID then s = token.svalue MustHave (ID) print (s) else Error “Expecting ID” endIfendFunction

Page 15: Infix / Postfix Notation Converting Expressions to Postfix

29

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Implementation

Expr ! Term Rest

Rest ! + Term { print(“+”) } Rest

! - Term { print(“-”) } Rest

! "

Term ! ID { print(ID.svalue) }

function ParseRest () if nextToken == ‘+’ then MustHave (‘+’) ParseTerm () print (“+”) ParseRest () elseIf nextToken == ‘-’ then MustHave (‘-’) ParseTerm () print (“-”) ParseRest () else // Epsilon -- do nothing endIfendFunction

30

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Repeating...

function ParseExpr () ParseTerm () ParseRest ()endFunction

function ParseRest () if nextToken == ‘+’ then MustHave (‘+’) ParseTerm () print (“+”) ParseRest () elseIf nextToken == ‘-’ then MustHave (‘-’) ParseTerm () print (“-”) ParseRest () else // Epsilon -- do nothing endIfendFunction

Page 16: Infix / Postfix Notation Converting Expressions to Postfix

31

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Optimizing “Tail Recursion”

function ParseExpr () ParseTerm () ParseRest ()endFunction

function ParseRest () if nextToken == ‘+’ then MustHave (‘+’) ParseTerm () print (“+”) ParseRest () elseIf nextToken == ‘-’ then MustHave (‘-’) ParseTerm () print (“-”) ParseRest () else // Epsilon -- do nothing endIfendFunction

function ParseRest () while true if nextToken == ‘+’ then MustHave (‘+’) ParseTerm () print (“+”) elseIf nextToken == ‘-’ then MustHave (‘-’) ParseTerm () print (“-”) else return endIf endWhileendFunction

32

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

In-Lining...

function ParseExpr () ParseTerm () ParseRest ()endFunction

function ParseRest () if nextToken == ‘+’ then MustHave (‘+’) ParseTerm () print (“+”) ParseRest () elseIf nextToken == ‘-’ then MustHave (‘-’) ParseTerm () print (“-”) ParseRest () else // Epsilon -- do nothing endIfendFunction

function ParseExpr () ParseTerm () while true if nextToken == ‘+’ then MustHave (‘+’) ParseTerm () print (“+”) elseIf nextToken == ‘-’ then MustHave (‘-’) ParseTerm () print (“-”) else return endIf endWhileendFunction

Page 17: Infix / Postfix Notation Converting Expressions to Postfix

33

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Generating Target CodeOutput of compiler

•!Assembly code (e.g., SPARC code)

•!Machine code (e.g., 0x3b4E0F0F...)

•!“Bytecodes” (e.g., PUSH, POP, GOTO, ...)

34

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Generating Target CodeOutput of compiler

•!Assembly code (e.g., SPARC code)

•!Machine code (e.g., 0x3b4E0F0F...)

•!“Bytecodes” (e.g., PUSH, POP, GOTO, ...)

Bytecodes

Higher level than machine-specific code.

Example: Java Bytecodes

Software to execute the instructions

Interpreter (aka: “Virtual Machine”, “Emulator”)

Or translate the bytecodes into machine-specific code

“Just-in-time” compilers

Page 18: Infix / Postfix Notation Converting Expressions to Postfix

35

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Generating Target CodeOutput of compiler

•!Assembly code (e.g., SPARC code)

•!Machine code (e.g., 0x3b4E0F0F...)

•!“Bytecodes” (e.g., PUSH, POP, GOTO, ...)

Bytecodes

Higher level than machine-specific code.

Example: Java Bytecodes

Software to execute the instructions

Interpreter (aka: “Virtual Machine”, “Emulator”)

Or translate the bytecodes into machine-specific code

“Just-in-time” compilers

Abstract Stack Machine

A virtual machine architecture

Based on a stack

Can be used as intermediate code

Front-end

Back-end

Source

Intermediate

Representation

Code for SPARC

Code for

Abstract Stack Machine

Replace with back-end

For Intel, Power-PC, ...

36

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Abstract Stack Machine

• Limited / simple instruction set

• No registers

• Stack of data values

• Program memory

• Data memory

( 3 + ( 6 - X ) )

3 6 X - +

PUSH 3PUSH 6PUSH XSUBTRACTADD

Runtime

Stack

Program

17

5

350

Data

MemoryW:X:Y:

...

...

Page 19: Infix / Postfix Notation Converting Expressions to Postfix

37

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Abstract Stack Machine

• Limited / simple instruction set

• No registers

• Stack of data values

• Program memory

• Data memory

( 3 + ( 6 - X ) )

3 6 X - +

PUSH 3PUSH 6PUSH XSUBTRACTADD

3

Runtime

Stack

Program

17

5

350

Data

MemoryW:X:Y:

...

...

38

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Abstract Stack Machine

• Limited / simple instruction set

• No registers

• Stack of data values

• Program memory

• Data memory

( 3 + ( 6 - X ) )

3 6 X - +

PUSH 3PUSH 6PUSH XSUBTRACTADD

6

3

Runtime

Stack

Program

17

5

350

Data

MemoryW:X:Y:

...

...

Page 20: Infix / Postfix Notation Converting Expressions to Postfix

39

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Abstract Stack Machine

• Limited / simple instruction set

• No registers

• Stack of data values

• Program memory

• Data memory

( 3 + ( 6 - X ) )

3 6 X - +

PUSH 3PUSH 6PUSH XSUBTRACTADD

5

6

3

Runtime

Stack

Program

17

5

350

Data

MemoryW:X:Y:

...

...

40

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Abstract Stack Machine

• Limited / simple instruction set

• No registers

• Stack of data values

• Program memory

• Data memory

( 3 + ( 6 - X ) )

3 6 X - +

PUSH 3PUSH 6PUSH XSUBTRACTADD

1

3

Runtime

Stack

Program

17

5

350

Data

MemoryW:X:Y:

...

...

Page 21: Infix / Postfix Notation Converting Expressions to Postfix

41

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Abstract Stack Machine

• Limited / simple instruction set

• No registers

• Stack of data values

• Program memory

• Data memory

( 3 + ( 6 - X ) )

3 6 X - +

PUSH 3PUSH 6PUSH XSUBTRACTADD

4

Runtime

Stack

Program

17

5

350

Data

MemoryW:X:Y:

...

...

42

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

L-Values versus R-Values

L-Value:

•!Need the variable’s location.

R-Value:

•!Need the variable’s value.

Example:

x = y * (z + 5);

Page 22: Infix / Postfix Notation Converting Expressions to Postfix

43

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

L-Values versus R-Values

L-Value:

•!Need the variable’s location.

R-Value:

•!Need the variable’s value.

Example:

x = y * (z + 5);

R-ValueL-Value

R-Value

44

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

L-Values versus R-Values

L-Value:

•!Need the variable’s location.

R-Value:

•!Need the variable’s value.

Example:

x = y * (z + 5);

Example:

p.computeTaxes (x);

Page 23: Infix / Postfix Notation Converting Expressions to Postfix

45

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

L-Values versus R-Values

L-Value:

•!Need the variable’s location.

R-Value:

•!Need the variable’s value.

Example:

x = y * (z + 5);

Example:

p.computeTaxes (x);

R-ValueR-Value

46

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

L-Values versus R-Values

L-Value:

•!Need the variable’s location.

R-Value:

•!Need the variable’s value.

Example:

x = y * (z + 5);

Example:

p.computeTaxes (x);

Example:

for i = 1 to 100 do ...

Page 24: Infix / Postfix Notation Converting Expressions to Postfix

47

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

L-Values versus R-Values

L-Value:

•!Need the variable’s location.

R-Value:

•!Need the variable’s value.

Example:

x = y * (z + 5);

Example:

p.computeTaxes (x);

Example:

for i = 1 to 100 do ...

L-Value

48

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

L-Values versus R-Values

L-Value:

•!Need the variable’s location.

R-Value:

•!Need the variable’s value.

Example:

x = y * (z + 5);

Example:

p.computeTaxes (x);

Example:

for i = 1 to 100 do ...

Example:

read(x);

Page 25: Infix / Postfix Notation Converting Expressions to Postfix

49

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

L-Values versus R-Values

L-Value:

•!Need the variable’s location.

R-Value:

•!Need the variable’s value.

Example:

x = y * (z + 5);

Example:

p.computeTaxes (x);

Example:

for i = 1 to 100 do ...

Example:

read(x);

L-Value

50

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Stack Machine Instructions

Arithmetic InstructionsADDSUBMULTDIV

...etc...

Stack/Data Manipulation InstructionsPUSH NRVALUE NLVALUE NASSIGNPOPCOPY

Flow of Control InstructionsGOTO LLABEL LGOFALSE LGOTRUE LHALT

Page 26: Infix / Postfix Notation Converting Expressions to Postfix

51

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Stack Machine Instructions

Arithmetic InstructionsADDSUBMULTDIV

...etc...

Stack/Data Manipulation InstructionsPUSH NRVALUE NLVALUE NASSIGNPOPCOPY

Flow of Control InstructionsGOTO LLABEL LGOFALSE LGOTRUE LHALT

...

top Stack

17

5

350

100:101:102:

...

...

Data Memory

52

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Stack Machine Instructions

Arithmetic InstructionsADDSUBMULTDIV

...etc...

Stack/Data Manipulation InstructionsPUSH NRVALUE NLVALUE NASSIGNPOPCOPY

Flow of Control InstructionsGOTO LLABEL LGOFALSE LGOTRUE LHALT

...

23

...

toptop

Before

17

5

350

100:101:102:

...

...

17

5

350

100:101:102:

...

...

After

...PUSH 23...

Page 27: Infix / Postfix Notation Converting Expressions to Postfix

53

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Stack Machine Instructions

Arithmetic InstructionsADDSUBMULTDIV

...etc...

Stack/Data Manipulation InstructionsPUSH NRVALUE NLVALUE NASSIGNPOPCOPY

Flow of Control InstructionsGOTO LLABEL LGOFALSE LGOTRUE LHALT

...

result

...

top

top

Before

17

5

350

100:101:102:

...

...

17

5

350

100:101:102:

...

...

After

...PUSH ...X...PUSH ...Y...SUB...

X

Y

54

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Stack Machine Instructions

Arithmetic InstructionsADDSUBMULTDIV

...etc...

Stack/Data Manipulation InstructionsPUSH NRVALUE NLVALUE NASSIGNPOPCOPY

Flow of Control InstructionsGOTO LLABEL LGOFALSE LGOTRUE LHALT

...

350

...

toptop

Before

17

5

350

100:101:102:

...

...

17

5

350

100:101:102:

...

...

After

...RVALUE 102...

Page 28: Infix / Postfix Notation Converting Expressions to Postfix

55

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Stack Machine Instructions

Arithmetic InstructionsADDSUBMULTDIV

...etc...

Stack/Data Manipulation InstructionsPUSH NRVALUE NLVALUE NASSIGNPOPCOPY

Flow of Control InstructionsGOTO LLABEL LGOFALSE LGOTRUE LHALT

...

102

...

toptop

Before

17

5

350

100:101:102:

...

...

17

5

350

100:101:102:

...

...

After

...LVALUE 102...

56

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Stack Machine Instructions

Arithmetic InstructionsADDSUBMULTDIV

...etc...

Stack/Data Manipulation InstructionsPUSH NRVALUE NLVALUE NASSIGNPOPCOPY

Flow of Control InstructionsGOTO LLABEL LGOFALSE LGOTRUE LHALT

...

...

top

top

Before

17

5

350

100:101:102:

...

...

17

5

XXX

100:101:102:

...

...

After

...LVALUE 102PUSH XXXASSIGN...

102

XXX

Page 29: Infix / Postfix Notation Converting Expressions to Postfix

57

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Stack Machine Instructions

Arithmetic InstructionsADDSUBMULTDIV

...etc...

Stack/Data Manipulation InstructionsPUSH NRVALUE NLVALUE NASSIGNPOPCOPY

Flow of Control InstructionsGOTO LLABEL LGOFALSE LGOTRUE LHALT

...

...

top

top

Before

17

5

350

100:101:102:

...

...

17

5

350

100:101:102:

...

...

After

...POP...

456

58

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Stack Machine Instructions

Arithmetic InstructionsADDSUBMULTDIV

...etc...

Stack/Data Manipulation InstructionsPUSH NRVALUE NLVALUE NASSIGNPOPCOPY

Flow of Control InstructionsGOTO LLABEL LGOFALSE LGOTRUE LHALT

...

...

toptop

Before

17

5

350

100:101:102:

...

...

17

5

350

100:101:102:

...

...

After

...COPY...

456 456

456

Page 30: Infix / Postfix Notation Converting Expressions to Postfix

59

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Flow of Control

Option 1: Absolute Addresses ... 1004: PUSH 123 1005: SUB 1006: GOTO 1004 ...

60

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Flow of Control

Option 1: Absolute Addresses ... 1004: PUSH 123 1005: SUB 1006: GOTO 1004 ...

Assembly Code: ...MyLab: PUSH 123 SUB GOTO MyLab ...

Page 31: Infix / Postfix Notation Converting Expressions to Postfix

61

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Flow of Control

Option 1: Absolute Addresses ... 1004: PUSH 123 1005: SUB 1006: GOTO 1004 ...

Option 2: Relative Addresses ... 1004: PUSH 123 1005: SUB 1006: GOTO -2 ...

62

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Flow of Control

Option 1: Absolute Addresses ... 1004: PUSH 123 1005: SUB 1006: GOTO 1004 ...

Option 2: Relative Addresses ... 1004: PUSH 123 1005: SUB 1006: GOTO -2 ...

This code can

be relocated!!!

Page 32: Infix / Postfix Notation Converting Expressions to Postfix

63

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Flow of Control

Option 1: Absolute Addresses ... 1004: PUSH 123 1005: SUB 1006: GOTO 1004 ...

Option 2: Relative Addresses ... 1004: PUSH 123 1005: SUB 1006: GOTO -2 ...

Option 3: Symbolic Labels ... 1003: LABEL MyLab 1004: PUSH 123 1005: SUB 1006: GOTO MyLab ...

64

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Flow of Control

Option 1: Absolute Addresses ... 1004: PUSH 123 1005: SUB 1006: GOTO 1004 ...

Option 2: Relative Addresses ... 1004: PUSH 123 1005: SUB 1006: GOTO -2 ...

Option 3: Symbolic Labels ... 1003: LABEL MyLab 1004: PUSH 123 1005: SUB 1006: GOTO MyLab ...

... MyLab: PUSH 123 SUB GOTO MyLab ...

Page 33: Infix / Postfix Notation Converting Expressions to Postfix

65

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Stack Machine Instructions

Arithmetic InstructionsADDSUBMULTDIV

...etc...

Stack/Data Manipulation InstructionsPUSH NRVALUE NLVALUE NASSIGNPOPCOPY

Flow of Control InstructionsGOTO LLABEL LGOFALSE LGOTRUE LHALT

...

...

top

Before

17

5

350

100:101:102:

...

...

17

5

350

100:101:102:

...

...

After

top0

Boolean values can be

pushed onto stack:

0 = FALSE

Any other = TRUE

66

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Example

Source Code:

x = ( y + 2 ) * ( 3 - z ) ;

Postfix:

x y 2 + 3 z - * =

Instruction Memory:...LVALUE 451RVALUE 452PUSH 2ADDPUSH 3RVALUE 453SUBMULTASSIGN...

Runtime

Stack

300

4

1

Data

Memory451:452:453:

...

...

X

Y

Z

Page 34: Infix / Postfix Notation Converting Expressions to Postfix

67

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Example

Source Code:

x = ( y + 2 ) * ( 3 - z ) ;

Postfix:

x y 2 + 3 z - * =

Instruction Memory:...LVALUE 451RVALUE 452PUSH 2ADDPUSH 3RVALUE 453SUBMULTASSIGN...

451

Runtime

Stack

300

4

1

Data

Memory451:452:453:

...

...

X

Y

Z

68

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Example

Source Code:

x = ( y + 2 ) * ( 3 - z ) ;

Postfix:

x y 2 + 3 z - * =

Instruction Memory:...LVALUE 451RVALUE 452PUSH 2ADDPUSH 3RVALUE 453SUBMULTASSIGN...

4

451

Runtime

Stack

300

4

1

Data

Memory451:452:453:

...

...

X

Y

Z

Page 35: Infix / Postfix Notation Converting Expressions to Postfix

69

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Example

Source Code:

x = ( y + 2 ) * ( 3 - z ) ;

Postfix:

x y 2 + 3 z - * =

Instruction Memory:...LVALUE 451RVALUE 452PUSH 2ADDPUSH 3RVALUE 453SUBMULTASSIGN...

2

4

451

Runtime

Stack

300

4

1

Data

Memory451:452:453:

...

...

X

Y

Z

70

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Example

Source Code:

x = ( y + 2 ) * ( 3 - z ) ;

Postfix:

x y 2 + 3 z - * =

Instruction Memory:...LVALUE 451RVALUE 452PUSH 2ADDPUSH 3RVALUE 453SUBMULTASSIGN...

6

451

Runtime

Stack

300

4

1

Data

Memory451:452:453:

...

...

X

Y

Z

Page 36: Infix / Postfix Notation Converting Expressions to Postfix

71

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Example

Source Code:

x = ( y + 2 ) * ( 3 - z ) ;

Postfix:

x y 2 + 3 z - * =

Instruction Memory:...LVALUE 451RVALUE 452PUSH 2ADDPUSH 3RVALUE 453SUBMULTASSIGN...

3

6

451

Runtime

Stack

300

4

1

Data

Memory451:452:453:

...

...

X

Y

Z

72

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Example

Source Code:

x = ( y + 2 ) * ( 3 - z ) ;

Postfix:

x y 2 + 3 z - * =

Instruction Memory:...LVALUE 451RVALUE 452PUSH 2ADDPUSH 3RVALUE 453SUBMULTASSIGN...

3

6

451

Runtime

Stack

300

4

1

Data

Memory451:452:453:

...

...

X

Y

Z

1

Page 37: Infix / Postfix Notation Converting Expressions to Postfix

73

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Example

Source Code:

x = ( y + 2 ) * ( 3 - z ) ;

Postfix:

x y 2 + 3 z - * =

Instruction Memory:...LVALUE 451RVALUE 452PUSH 2ADDPUSH 3RVALUE 453SUBMULTASSIGN...

2

6

451

Runtime

Stack

300

4

1

Data

Memory451:452:453:

...

...

X

Y

Z

74

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Example

Source Code:

x = ( y + 2 ) * ( 3 - z ) ;

Postfix:

x y 2 + 3 z - * =

Instruction Memory:...LVALUE 451RVALUE 452PUSH 2ADDPUSH 3RVALUE 453SUBMULTASSIGN...

12

451

Runtime

Stack

300

4

1

Data

Memory451:452:453:

...

...

X

Y

Z

Page 38: Infix / Postfix Notation Converting Expressions to Postfix

75

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Example

Source Code:

x = ( y + 2 ) * ( 3 - z ) ;

Postfix:

x y 2 + 3 z - * =

Instruction Memory:...LVALUE 451RVALUE 452PUSH 2ADDPUSH 3RVALUE 453SUBMULTASSIGN...

Runtime

Stack

12

4

1

Data

Memory451:452:453:

...

...

X

Y

Z

76

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Producing Translations

Target: Code for Abstract Stack Machine

ParseExpr ()

Parses an expression

... and produces the code for it.

ParseStmt ()

Parses a statement

... and produces the code for it

... using ParseExpr and ParseStmt recursively.

Assignment Stmt:

ID = Expr ;

Translation:LVALUE ID

... Code for Expr...ASSIGN

For example: (X-3)*Y

RVALUE X PUSH 3 SUB RVALUE Y MULT

Page 39: Infix / Postfix Notation Converting Expressions to Postfix

77

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Translating a WHILE statement

Source:

...

while Expr do

Stmts

endWhile

...

Translation:...LABEL Lab_43

... Code for Expr...GOFALSE Lab_44

... Code for Stmts...GOTO Lab_43LABEL Lab_44

...

Generating Unique Labels Function called: NewLabel

Returns a hitherto unused label.

Example:Lab_17

Lab_18

Lab_19...

78

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Helper Function: EMIT()

Function: Emit()

Passed:

•!An op-code

•!Additional argument, if any

Writes one instruction to the output.

•!To “stdout”

•!To internal storage area

! internal representation ! target code ! output file

Example of compiler code:...lab = NewLabel ();Emit (“label”, lab);...Emit (“goto”, lab);...

Page 40: Infix / Postfix Notation Converting Expressions to Postfix

79

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Translating Statements

Stmt ! ID “=” Expr “;”

! while Expr do Stmts endWhile

! if Expr then Stmts else Stmts endIf

! ...

Expr ! ...

80

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Translating Statements

Stmt ! ID “=” Expr “;”

! while Expr do Stmts endWhile

! if Expr then Stmts else Stmts endIf

! ...

Expr ! ...

Source:

W = X + Y + Z;

Code:

LVALUE W RVALUE X RVALUE Y RVALUE Z ADD ADD ASSIGN

Emitted

by

ParseExpr

Expr

Page 41: Infix / Postfix Notation Converting Expressions to Postfix

81

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Translating Statements

Stmt ! ID “=” Expr “;”

! while Expr do Stmts endWhile

! if Expr then Stmts else Stmts endIf

! ...

Expr ! ...

Translation Scheme for ASSIGN-STMT:

Stmt ! ID

{ Emit (“LVALUE”, ID.svalue) }

“=”

Expr

{ Emit (“ASSIGN”) }

“;”

Source:

W = X + Y + Z;

Code:

LVALUE W RVALUE X RVALUE Y RVALUE Z ADD ADD ASSIGN

Emitted

by

ParseExpr

Expr

82

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Translating Statements

Stmt ! ID “=” Expr “;”

! while Expr do Stmts endWhile

! if Expr then Stmts else Stmts endIf

! ...

Expr ! ...Source:

while A-B do

X=Y;

endWhile

Code:

LABEL Lab_4 RVALUE A RVALUE B SUB GOFALSE Lab_5 LVALUE X RVALUE Y ASSIGN GOTO Lab_4 LABEL Lab_5

Emitted

by

ParseExpr

Emitted

by

ParseStmts

Page 42: Infix / Postfix Notation Converting Expressions to Postfix

83

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Translating Statements

Stmt ! ID “=” Expr “;”

! while Expr do Stmts endWhile

! if Expr then Stmts else Stmts endIf

! ...

Expr ! ...

Translation Scheme for WHILE-STMT:

Stmt ! while

{ topLabel = NewLabel()bottomLabel = NewLabel()Emit (“LABEL”, topLabel) }

Expr

{ Emit (“GOFALSE”, bottomLabel) }

do Stmts endWhile

{ Emit (“GOTO”, topLabel)Emit (“LABEL”, bottomLabel) }

Source:

while A-B do

X=Y;

endWhile

Code:

LABEL Lab_4 RVALUE A RVALUE B SUB GOFALSE Lab_5 LVALUE X RVALUE Y ASSIGN GOTO Lab_4 LABEL Lab_5

Emitted

by

ParseExpr

Emitted

by

ParseStmts

84

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

function ParseStmt () var topLabel, bottomLabel: String if nextToken == ID then Emit (“LVALUE”, token.svalue) MustHave (ID) MustHave (“=”) ParseExpr () Emit (“ASSIGN”) MustHave (“;”) elseIf nextToken == WHILE then MustHave (WHILE) topLabel = NewLabel () bottomLabel = NewLabel () Emit (“LABEL”, topLabel) ParseExpr () Emit (“GOFALSE”, bottomLabel) MustHave (DO) ParseStmts () MustHave (ENDWHILE) Emit (“GOTO”, topLabel) Emit (“LABEL”, bottomLabel) elseIf ... endIfendFunction

Stmt ! ID

{ Emit(“LVALUE”,ID.svalue) }

“=”

Expr

{ Emit(“ASSIGN”) }

“;”

Stmt ! while

{ topLabel = NewLabel() bottomLabel = NewLabel() Emit(“LABEL”,topLabel) }

Expr

{ Emit(“GOFALSE”,bottomLabel)}

do Stmts endWhile

{ Emit(“GOTO”,topLabel) Emit(“LABEL”,bottomLabel) }

Page 43: Infix / Postfix Notation Converting Expressions to Postfix

85

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Short-Circuit Operators

if (i <= max) and (a[i] == -1) then ...

Do we need to evaluate the second expression?

b = Expr1 and Expr2

b = if Expr1 then Expr2 else FALSE endIf

86

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Short-Circuit Operators

if (i <= max) and (a[i] == -1) then ...

Do we need to evaluate the second expression?

b = Expr1 and Expr2

b = if Expr1 then Expr2 else FALSE endIf

Translation:... ... Code for Expr1...COPYGOFALSE Lab_43POP ... Code for Expr2...LABEL Lab_43

...

Page 44: Infix / Postfix Notation Converting Expressions to Postfix

87

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Short-Circuit Operators

if (i <= max) and (a[i] == -1) then ...

Do we need to evaluate the second expression?

b = Expr1 and Expr2

b = if Expr1 then Expr2 else FALSE endIf

Translation:... ... Code for Expr1...COPYGOFALSE Lab_43POP ... Code for Expr2...LABEL Lab_43

...

true

...

Case 1: Expr-1 is true:

88

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Short-Circuit Operators

if (i <= max) and (a[i] == -1) then ...

Do we need to evaluate the second expression?

b = Expr1 and Expr2

b = if Expr1 then Expr2 else FALSE endIf

Translation:... ... Code for Expr1...COPYGOFALSE Lab_43POP ... Code for Expr2...LABEL Lab_43

...

true

...

Case 1: Expr-1 is true:

true

Page 45: Infix / Postfix Notation Converting Expressions to Postfix

89

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Short-Circuit Operators

if (i <= max) and (a[i] == -1) then ...

Do we need to evaluate the second expression?

b = Expr1 and Expr2

b = if Expr1 then Expr2 else FALSE endIf

Translation:... ... Code for Expr1...COPYGOFALSE Lab_43POP ... Code for Expr2...LABEL Lab_43

...

true

...

Case 1: Expr-1 is true:

90

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Short-Circuit Operators

if (i <= max) and (a[i] == -1) then ...

Do we need to evaluate the second expression?

b = Expr1 and Expr2

b = if Expr1 then Expr2 else FALSE endIf

Translation:... ... Code for Expr1...COPYGOFALSE Lab_43POP ... Code for Expr2...LABEL Lab_43

...

...

Case 1: Expr-1 is true:

Page 46: Infix / Postfix Notation Converting Expressions to Postfix

91

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Short-Circuit Operators

if (i <= max) and (a[i] == -1) then ...

Do we need to evaluate the second expression?

b = Expr1 and Expr2

b = if Expr1 then Expr2 else FALSE endIf

Translation:... ... Code for Expr1...COPYGOFALSE Lab_43POP ... Code for Expr2...LABEL Lab_43

...

Expr-2

...

Case 1: Expr-1 is true:

92

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Short-Circuit Operators

if (i <= max) and (a[i] == -1) then ...

Do we need to evaluate the second expression?

b = Expr1 and Expr2

b = if Expr1 then Expr2 else FALSE endIf

Translation:... ... Code for Expr1...COPYGOFALSE Lab_43POP ... Code for Expr2...LABEL Lab_43

...

false

...

Case 2: Expr-1 is false:

Page 47: Infix / Postfix Notation Converting Expressions to Postfix

93

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Short-Circuit Operators

if (i <= max) and (a[i] == -1) then ...

Do we need to evaluate the second expression?

b = Expr1 and Expr2

b = if Expr1 then Expr2 else FALSE endIf

Translation:... ... Code for Expr1...COPYGOFALSE Lab_43POP ... Code for Expr2...LABEL Lab_43

...

false

...

Case 2: Expr-1 is false:

false

94

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Short-Circuit Operators

if (i <= max) and (a[i] == -1) then ...

Do we need to evaluate the second expression?

b = Expr1 and Expr2

b = if Expr1 then Expr2 else FALSE endIf

Translation:... ... Code for Expr1...COPYGOFALSE Lab_43POP ... Code for Expr2...LABEL Lab_43

...

false

...

Case 2: Expr-1 is false:

Page 48: Infix / Postfix Notation Converting Expressions to Postfix

95

Introduction to Compiling - Part 2

© Harry H. Porter, 2005

Short-Circuit Operators

And

b = Expr1 and Expr2

Or

b = Expr1 or Expr2

Conditional (ternary) operator

b = Expr1 ? Expr2 : Expr3

Means: b = (if Expr1 then Expr2 else Expr3 endIf)

Same as: if Expr1 then b = Expr2else b = Expr3endIf