Get basic G-machine compilation working.
This commit is contained in:
89
src/gmachine.cpp
Normal file
89
src/gmachine.cpp
Normal file
@@ -0,0 +1,89 @@
|
||||
#include "gmachine.hpp"
|
||||
#include <iostream>
|
||||
|
||||
namespace lily {
|
||||
std::ostream& operator<<(std::ostream& os, instruction& inst) {
|
||||
inst.to_stream(os);
|
||||
return os;
|
||||
}
|
||||
|
||||
std::ostream& instruction_slide::to_stream(std::ostream& os) {
|
||||
os << "slide(" << amount << ")";
|
||||
return os;
|
||||
}
|
||||
|
||||
std::ostream& instruction_alloc::to_stream(std::ostream& os) {
|
||||
os << "alloc(" << amount << ")";
|
||||
return os;
|
||||
}
|
||||
|
||||
std::ostream& instruction_pop::to_stream(std::ostream& os) {
|
||||
os << "pop(" << amount << ")";
|
||||
return os;
|
||||
}
|
||||
|
||||
std::ostream& instruction_unwind::to_stream(std::ostream& os) {
|
||||
os << "unwind";
|
||||
return os;
|
||||
}
|
||||
|
||||
std::ostream& instruction_push_global::to_stream(std::ostream& os) {
|
||||
os << "pushglobal(" << name << ")";
|
||||
return os;
|
||||
}
|
||||
|
||||
std::ostream& instruction_push_int::to_stream(std::ostream& os) {
|
||||
os << "pushint(" << value << ")";
|
||||
return os;
|
||||
}
|
||||
|
||||
std::ostream& instruction_push_str::to_stream(std::ostream& os) {
|
||||
os << "pushstr(" << str << ")";
|
||||
return os;
|
||||
}
|
||||
|
||||
std::ostream& instruction_push::to_stream(std::ostream& os) {
|
||||
os << "push(" << offset << ")";
|
||||
return os;
|
||||
}
|
||||
|
||||
std::ostream& instruction_mkapp::to_stream(std::ostream& os) {
|
||||
os << "mkapp";
|
||||
return os;
|
||||
}
|
||||
|
||||
std::ostream& instruction_eval::to_stream(std::ostream& os) {
|
||||
os << "eval";
|
||||
return os;
|
||||
}
|
||||
|
||||
std::ostream& instruction_op::to_stream(std::ostream& os) {
|
||||
os << "op(" << op_supercombinator(op) << ")";
|
||||
return os;
|
||||
}
|
||||
|
||||
std::ostream& instruction_cond::to_stream(std::ostream& os) {
|
||||
os << "cond";
|
||||
return os;
|
||||
}
|
||||
|
||||
std::ostream& instruction_update::to_stream(std::ostream& os) {
|
||||
os << "update(" << offset << ")";
|
||||
return os;
|
||||
}
|
||||
|
||||
std::ostream& instruction_pack::to_stream(std::ostream& os) {
|
||||
os << "pack(" << constructor << ", " << arity << ")";
|
||||
return os;
|
||||
}
|
||||
|
||||
std::ostream& instruction_split::to_stream(std::ostream& os) {
|
||||
os << "split(" << arity << ")";
|
||||
return os;
|
||||
}
|
||||
|
||||
std::ostream& instruction_jump::to_stream(std::ostream& os) {
|
||||
os << "jump";
|
||||
return os;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user