Hmm, what's a stack machine AST? I can't follow your description of the transform, what does "remove" mean here? I can remove all of the internal nodes of a tree, which leaves me with a soup of leaf nodes, but how is that an AST for a stack machine?
Hope that clears it up.
(Add (LoadConst 1) (LoadVar x))
The corresponding stack machine code might be: [PushConst 1, PushVar x, Add]
In what way was anything "removed" from the tree? enum Expr:
case Add(left: Expr, right: Expr)
case Lit(val: Double)
the corresponding stack machine instruction set is enum Expr:
case Add
case Lit(val: Double)
The transformation in this direction is purely syntactic: where you see that a case has a parameter of type Expr in the instruction set, you simply remove that parameter for the corresponding stack machine instruction.The transformation in the other direction is not purely syntactic as you have to know that, e.g., Add gets two parameters from the stack and add those parameters back in.
class Add : Node {
Node left;
Node right;
int interpret() {
int l = left.interpret();
int r = right.interpret();
return l + r;
}
}
You can turn it into: class Add : Node {
Node left;
Node right;
void compile(bc: ByteCode) {
left.compile(bc);
right.compile(bc);
bc.push(OP_ADD);
}
}
The inputs to OP_ADD are implicit, I guess that is what "remove" means?