Remove TODOS from part 5 of compiler series
This commit is contained in:
parent
3bce9743e5
commit
e3fd13c0c1

@ 272,8 +272,29 @@ the thing we apply it to. We then create a new node on the heap


that is an `NApp` node, with its two children being the nodes we popped off.


Finally, we push it onto the stack.




Let's try use these instructions to get a feel for it.


{{< todo >}}Add an example, probably without notation.{{< /todo >}}


Let's try use these instructions to get a feel for it. In


order to conserve space, let's use \\(\\text{G}\\) for PushGlobal,


\\(\\text{I}\\) for PushInt, and \\(\\text{A}\\) for PushApp.


Let's say we want to construct a graph for `double 326`. We'll


use the instructions \\(\\text{I} \; 326\\), \\(\\text{G} \; \\text{double}\\),


and \\(\\text{A}\\). Let's watch these instructions play out:


$$


\\begin{align}


[\\text{I} \; 326, \\text{G} \; \text{double}, \\text{A}] & \\quad s \\quad & d \\quad & h \\quad & m[\\text{double} : a\_d] \\\\\\


[\\text{G} \; \text{double}, \\text{A}] & \\quad a\_1 : s \\quad & d \\quad & h[a\_1 : \\text{NInt} \; 326] \\quad & m[\\text{double} : a\_d] \\\\\\


[\\text{A}] & \\quad a\_d, a\_1 : s \\quad & d \\quad & h[a\_1 : \\text{NInt} \; 326] \\quad & m[\\text{double} : a\_d] \\\\\\


[] & \\quad a\_2 : s \\quad & d \\quad & h[\\substack{\\begin{aligned}a\_1 & : \\text{NInt} \; 326 \\\\ a\_2 & : \\text{NApp} \; a\_d \; a\_1 \\end{aligned}}] \\quad & m[\\text{double} : a\_d] \\\\\\


\\end{align}


$$


How did we come up with these instructions? We'll answer this question with


more generality later, but let's take a look at this particular expression


right now. We know it's an application, so we'll be using MkApp eventually.


We also know that MkApp expects two values on top of the stack from


which to make an application. The node on top has to be the function, and the next


node is the value to be passed into that function. Since a stack is firstinlastout,


for the function (`double`, in our case) to be on top, we need


to push it last. Thus, we push `double` first, then 326. Finally,


we call MkApp now that the stack is in the right state.




Having defined instructions to __build__ graphs, it's now time


to move on to instructions to __reduce__ graphs  after all,



@ 566,6 +587,9 @@ We can allocate an indirection on the stack, and call Update on it when


we've constructed a node. While we're constructing the tree, we can


refer to the indirection when a selfreference is required.




That's it for the instructions. Next up, we have to convert our expression


trees into such instructions. However, this has already gotten pretty long,


so we'll do it in the next post.


That's it for the instructions. Knowing them, however, doesn't


tell us what to do with our `ast` structs. We'll need to define


rules to translate trees into these instructions, and I've already


alluded to this when we went over `double 326`.


However, this has already gotten pretty long,


so we'll do it in the next post: (link me!)




Loading…
Reference in New Issue