You are on page 1of 12

1

10.5. Assignment 3 Algorithm

3/3/2018

John Roberts

2
Overview
• Review Algorithm

• Trace Example

• Rendering

3 This will be implemented in OffsetVisitor.java

Algorithm I recommend creating a HashTable of AST -> Offset, where Offset records
• Perform a post order traversal information like x offset, depth, etc.
• When we visit a node we will create or update the
position it will be rendered (x offset and depth)

• The result should be a set of positions for each node

• What are the implementation implications? Where do we


traverse? Do we need anything else?
4
Algorithm - Setup

• Start by creating an array to track the next available


offset at each level.

• For our implementation, we may assume a max depth


of 100 - no need to dynamically discover depth

5 Note that when we say node, we are talking about an AST


Algorithm - Base Case

• If the current node has no children, then that node’s


offset is the next available offset for that node’s level

• Record the node’s offset, and update the next available


offset (adding 2 is a good update)

6
Algorithm - Update Parent

• After visiting all of a node’s children, calculate that parent node’s offset:

Offset = (rightmost child’s offset + leftmost
child’s offset) / 2

• If Offset < next available offset for this node’s level, recursively
shift all child node’s offsets by 

(next available offset for this node’s level -
Offset)

• Remember to update the next available offset at each level as


children are updated!

• Set this node’s offset to be the max of Offset or next available offset
for this node’s level, and update next available offset for this level
7
Overview
• Review Algorithm

• Trace Example

• Rendering

Level Offset Level Offset


8
0 0 0 0
1 0 1 0
2 0 2 0
3 0 3 0
4 0 4 0
5 0 5 0

0 1: Program

1 2: Block

2 5: Decl 8: Decl 10: Assign 17: Assign

3 3: IntType 4: Id: i 6: IntType 7: Id: j 9: Id: i 14: AddOp 16: Id: j 19: Call

18: Id:
4 12: AddOp 15: Int: 7
write
20: Id: i

5 11: Id: i 13: Id: j

Level Offset Level Offset


9 Visit 3, set offset as 0, update next available offset at level 3 to 2
0 0 0 0
1 0 1 0
2 0 2 0
3 0 3 2
4 0 4 0
5 0 5 0

0 1: Program

1 2: Block

2 5: Decl 8: Decl 10: Assign 17: Assign

3 3: IntType 4: Id: i 6: IntType 7: Id: j 9: Id: i 14: AddOp 16: Id: j 19: Call

0
18: Id:
4 12: AddOp 15: Int: 7
write
20: Id: i

5 11: Id: i 13: Id: j


Level Offset Level Offset
10 Visit 4, set offset as 2, update next available offset at level 3 to 4
0 0 0 0
1 0 1 0
2 0 2 0
3 2 3 4
4 0 4 0
5 0 5 0

0 1: Program

1 2: Block

2 5: Decl 8: Decl 10: Assign 17: Assign

3 3: IntType 4: Id: i 6: IntType 7: Id: j 9: Id: i 14: AddOp 16: Id: j 19: Call

0 2
18: Id:
4 12: AddOp 15: Int: 7
write
20: Id: i

5 11: Id: i 13: Id: j

Level Offset Level Offset


11 Visit 5, calculate offset as (2+0)/2 = 1, update next available offset at level 2 to
0
1
0
0
0
1
0
0 3
2 0 2 3
3 4 3 4
4 0 4 0
5 0 5 0

0 1: Program

1 2: Block

1
2 5: Decl 8: Decl 10: Assign 17: Assign

3 3: IntType 4: Id: i 6: IntType 7: Id: j 9: Id: i 14: AddOp 16: Id: j 19: Call

0 2
18: Id:
4 12: AddOp 15: Int: 7
write
20: Id: i

5 11: Id: i 13: Id: j

Level Offset Level Offset


12 Visit 6, set offset as 4, update next available offset at level 3 to 6
0 0 0 0
1 0 1 0
2 3 2 3
3 4 3 6
4 0 4 0
5 0 5 0

0 1: Program

1 2: Block

1
2 5: Decl 8: Decl 10: Assign 17: Assign

3 3: IntType 4: Id: i 6: IntType 7: Id: j 9: Id: i 14: AddOp 16: Id: j 19: Call

0 2 4
18: Id:
4 12: AddOp 15: Int: 7
write
20: Id: i

5 11: Id: i 13: Id: j


Level Offset Level Offset
13 Visit 7, set offset as 6, update next available offset at level 3 to 8
0 0 0 0
1 0 1 0
2 3 2 3
3 6 3 8
4 0 4 0
5 0 5 0

0 1: Program

1 2: Block

1
2 5: Decl 8: Decl 10: Assign 17: Assign

3 3: IntType 4: Id: i 6: IntType 7: Id: j 9: Id: i 14: AddOp 16: Id: j 19: Call

0 2 4 6
18: Id:
4 12: AddOp 15: Int: 7
write
20: Id: i

5 11: Id: i 13: Id: j

Level Offset Level Offset


14 Visit 8, calculate offset as (6+4)/2 = 5, update next available offset at level 2 to
0
1
0
0
0
1
0
0 7
2 3 2 7
3 8 3 8
4 0 4 0
5 0 5 0

0 1: Program

1 2: Block

1 5
2 5: Decl 8: Decl 10: Assign 17: Assign

3 3: IntType 4: Id: i 6: IntType 7: Id: j 9: Id: i 14: AddOp 16: Id: j 19: Call

0 2 4 6
18: Id:
4 12: AddOp 15: Int: 7
write
20: Id: i

5 11: Id: i 13: Id: j

Level Offset Level Offset


15 Visit 9, set offset as 8, update next available offset at level 3 to 10
0 0 0 0
1 0 1 0
2 7 2 7
3 8 3 10
4 0 4 0
5 0 5 0

0 1: Program

1 2: Block

1 5
2 5: Decl 8: Decl 10: Assign 17: Assign

3 3: IntType 4: Id: i 6: IntType 7: Id: j 9: Id: i 14: AddOp 16: Id: j 19: Call

0 2 4 6 8
18: Id:
4 12: AddOp 15: Int: 7
write
20: Id: i

5 11: Id: i 13: Id: j


Level Offset Level Offset
16 Visit 11, set offset as 0, update next available offset at level 5 to 2
0 0 0 0
1 0 1 0
2 7 2 7
3 10 3 10
4 0 4 0
5 0 5 2

0 1: Program

1 2: Block

1 5
2 5: Decl 8: Decl 10: Assign 17: Assign

3 3: IntType 4: Id: i 6: IntType 7: Id: j 9: Id: i 14: AddOp 16: Id: j 19: Call

0 2 4 6 8
18: Id:
4 12: AddOp 15: Int: 7
write
20: Id: i

0
5 11: Id: i 13: Id: j

Level Offset Level Offset


17 Visit 13, set offset as 2, update next available offset at level 5 to 4
0 0 0 0
1 0 1 0
2 7 2 7
3 10 3 10
4 0 4 0
5 2 5 4

0 1: Program

1 2: Block

1 5
2 5: Decl 8: Decl 10: Assign 17: Assign

3 3: IntType 4: Id: i 6: IntType 7: Id: j 9: Id: i 14: AddOp 16: Id: j 19: Call

0 2 4 6 8
18: Id:
4 12: AddOp 15: Int: 7
write
20: Id: i

0 2
5 11: Id: i 13: Id: j

Level Offset Level Offset


18 Visit 12, calculate offset as (2+0)/2 = 1, update next available offset at level 4
0
1
0
0
0
1
0
0 to 3
2 7 2 7
3 10 3 10
4 0 4 3
5 4 5 4

0 1: Program

1 2: Block

1 5
2 5: Decl 8: Decl 10: Assign 17: Assign

3 3: IntType 4: Id: i 6: IntType 7: Id: j 9: Id: i 14: AddOp 16: Id: j 19: Call

0 2 4 6 8 1
18: Id:
4 12: AddOp 15: Int: 7
write
20: Id: i

0 2
5 11: Id: i 13: Id: j
Level Offset Level Offset
19 Visit 15, set offset as 3, update next available offset at level 4 to 5
0 0 0 0
1 0 1 0
2 7 2 7
3 10 3 10
4 3 4 5
5 4 5 4

0 1: Program

1 2: Block

1 5
2 5: Decl 8: Decl 10: Assign 17: Assign

3 3: IntType 4: Id: i 6: IntType 7: Id: j 9: Id: i 14: AddOp 16: Id: j 19: Call

0 2 4 6 8 1 3
18: Id:
4 12: AddOp 15: Int: 7
write
20: Id: i

0 2
5 11: Id: i 13: Id: j

Level Offset Level Offset


20 Visit 14, calculate offset as (3+1)/2 = 2

0
1
0
0
0
1
0
0
set offset to next available, 10
2
3
7
10
2
3
7
10
2 < 10, so update children by next available - calculated = 10 - 2 = 8

4
5
5
4
4
5
5
4
Update next available offset at level 3 to 12
0 1: Program

1 2: Block

1 5
2 5: Decl 8: Decl 10: Assign 17: Assign

3 3: IntType 4: Id: i 6: IntType 7: Id: j 9: Id: i 14: AddOp 16: Id: j 19: Call

0 2 4 6 8 1 10 3
18: Id:
4 12: AddOp 15: Int: 7
write
20: Id: i

0 2
5 11: Id: i 13: Id: j

Level Offset Level Offset


21 Visit 14, calculate offset as (3+1)/2 = 2

0
1
0
0
0
1
0
0 set offset to next available, 10

2
3
7
10
2
3
7
12
2 < 10, so update children by next available - calculated = 10 - 2 = 8
4
5
3
4
4
5
13
12
(updating next available at each level as the child is updated)
Update next available offset at level 3 to 12
0 1: Program

1 2: Block

1 5
2 5: Decl 8: Decl 10: Assign 17: Assign

3 3: IntType 4: Id: i 6: IntType 7: Id: j 9: Id: i 14: AddOp 16: Id: j 19: Call

0 2 4 6 8 9 10 11
18: Id:
4 12: AddOp 15: Int: 7
write
20: Id: i

8 10
5 11: Id: i 13: Id: j
Level Offset Level Offset
22 Visit 10, calculate offset as (10+8)/2 = 9, update next available offset at level 2
0
1
0
0
0
1
0
0 to 11
2 7 2 11
3 12 3 12
4 13 4 13
5 12 5 12

0 1: Program

1 2: Block

1 5 9
2 5: Decl 8: Decl 10: Assign 17: Assign

3 3: IntType 4: Id: i 6: IntType 7: Id: j 9: Id: i 14: AddOp 16: Id: j 19: Call

0 2 4 6 8 9 10 11
18: Id:
4 12: AddOp 15: Int: 7
write
20: Id: i

8 10
5 11: Id: i 13: Id: j

Level Offset Level Offset


23 Visit 16, set offset as 12, update next available offset at level 3 to 14
0 0 0 0
1 0 1 0
2 11 2 11
3 12 3 14
4 13 4 13
5 12 5 12

0 1: Program

1 2: Block

1 5 9
2 5: Decl 8: Decl 10: Assign 17: Assign

3 3: IntType 4: Id: i 6: IntType 7: Id: j 9: Id: i 14: AddOp 16: Id: j 19: Call

0 2 4 6 8 9 10 11 12
18: Id:
4 12: AddOp 15: Int: 7
write
20: Id: i

8 10
5 11: Id: i 13: Id: j

Level Offset Level Offset


24 Visit 18, set offset as 13, update next available offset at level 4 to 15
0 0 0 0
1 0 1 0
2 11 2 11
3 14 3 14
4 13 4 15
5 12 5 12

0 1: Program

1 2: Block

1 5 9
2 5: Decl 8: Decl 10: Assign 17: Assign

3 3: IntType 4: Id: i 6: IntType 7: Id: j 9: Id: i 14: AddOp 16: Id: j 19: Call

0 2 4 6 8 9 10 11 12 13
18: Id:
4 12: AddOp 15: Int: 7
write
20: Id: i

8 10
5 11: Id: i 13: Id: j
Level Offset Level Offset
25 Visit 20, set offset as 15, update next available offset at level 4 to 17
0 0 0 0
1 0 1 0
2 11 2 11
3 14 3 14
4 15 4 17
5 12 5 12

0 1: Program

1 2: Block

1 5 9
2 5: Decl 8: Decl 10: Assign 17: Assign

3 3: IntType 4: Id: i 6: IntType 7: Id: j 9: Id: i 14: AddOp 16: Id: j 19: Call

0 2 4 6 8 9 10 11 12 13 15
18: Id:
4 12: AddOp 15: Int: 7
write
20: Id: i

8 10
5 11: Id: i 13: Id: j

Level Offset Level Offset


26 Visit 19, calculate offset as (15+13)/2 = 14, update next available offset at
0
1
0
0
0
1
0
0 level 3 to 16
2 11 2 11
3 14 3 16
4 17 4 17
5 12 5 12

0 1: Program

1 2: Block

1 5 9
2 5: Decl 8: Decl 10: Assign 17: Assign

3 3: IntType 4: Id: i 6: IntType 7: Id: j 9: Id: i 14: AddOp 16: Id: j 19: Call

0 2 4 6 8 9 10 11 12 13 14 15
18: Id:
4 12: AddOp 15: Int: 7
write
20: Id: i

8 10
5 11: Id: i 13: Id: j

Level Offset Level Offset


27 Visit 17, calculate offset as (14+12)/2 = 13, update next available offset at
0
1
0
0
0
1
0
0 level 2 to 15
2 11 2 15
3 16 3 16
4 17 4 17
5 12 5 12

0 1: Program

1 2: Block

1 5 9 13
2 5: Decl 8: Decl 10: Assign 17: Assign

3 3: IntType 4: Id: i 6: IntType 7: Id: j 9: Id: i 14: AddOp 16: Id: j 19: Call

0 2 4 6 8 9 10 11 12 13 14 15
18: Id:
4 12: AddOp 15: Int: 7
write
20: Id: i

8 10
5 11: Id: i 13: Id: j
Level Offset Level Offset
28 Visit 2, calculate offset as (13+1)/2 = 7, update next available offset at level 1
0
1
0
0
0
1
0
9 to 9
2 15 2 15
3 16 3 16
4 17 4 17
5 12 5 12

0 1: Program

1 2: Block

7
1 5 9 13
2 5: Decl 8: Decl 10: Assign 17: Assign

3 3: IntType 4: Id: i 6: IntType 7: Id: j 9: Id: i 14: AddOp 16: Id: j 19: Call

0 2 4 6 8 9 10 11 12 13 14 15
18: Id:
4 12: AddOp 15: Int: 7
write
20: Id: i

8 10
5 11: Id: i 13: Id: j

Level Offset Level Offset


29 Visit 1, calculate offset as (7+7)/2 = 7, update next available offset at level 0 to
0
1
0
9
0
1
9
9 9
2 15 2 15
3 16 3 16
4 17 4 17
5 12 5 12

0 1: Program

1 2: Block

7
1 5 9 13
2 5: Decl 8: Decl 10: Assign 17: Assign

3 3: IntType 4: Id: i 6: IntType 7: Id: j 9: Id: i 14: AddOp 16: Id: j 19: Call

0 2 4 6 8 9 10 11 12 13 14 15
18: Id:
4 12: AddOp 15: Int: 7
write
20: Id: i

8 10
5 11: Id: i 13: Id: j

30
Overview
• Review Algorithm

• Trace Example

• Rendering
31
Rendering

• The result of the OffsetVisitor should be an object


that contains a mapping of nodes to positions (x offset
and depth)

• This (either the result, or the OffsetVisitor) should


be passed to the DrawOffsetVisitor

32
Setup

• To render the nodes, we will once again traverse the AST

• Before rendering, we need to know the size of the canvas


we will be drawing on

• We know the maximum offset (15) from


OffsetVisitor (it could track this number as it
updates)

• We know the maximum depth (5) from


OffsetVisitor (it could track this number as it visits)

33 How can we determine a width? Have a constant node width, and multiple
Setup that by (1 + max offset)

0
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
How can we determine a height? Have a constant node height, and multiply
1
that by (1 + max depth) - we may want to add some padding, which involves
2 a little more math!
3

5
34
Rendering

• If we know the width and height of each node (and any


padding between nodes), we can calculate the position a
node should be rendered

35
Rendering
0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15

1
0 Program

2
1 Block

5 8 10 17
2 Decl Decl Assign Assign

3 4 6 7 9 14 16 19
3 IntType Id: i IntType Id: j Id: i AddOp Id: j Call

12 15 18 20
4 AddOp Int: 7 Id: write Id: i

11 13
5 Id: i Id: j

36
Rendering

• If we know the location of a node, we can calculate its


mid-point, and its bottom edge, and draw a line from that
point to the mid-point and top edge of each child

You might also like