Professional Documents
Culture Documents
3/3/2018
John Roberts
2
Overview
• Review Algorithm
• Trace Example
• Rendering
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)
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)
• 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
0 1: Program
1 2: Block
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
0 1: Program
1 2: Block
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
0 1: Program
1 2: Block
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
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
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
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
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
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 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
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
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
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
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
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
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
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
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
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
32
Setup
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
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