39 lines
1.1 KiB
C++
39 lines
1.1 KiB
C++
|
#include <emit.hh>
|
||
|
#include <iostream>
|
||
|
|
||
|
namespace xlang {
|
||
|
|
||
|
EmitListener::EmitListener(std::string_view outputfile) : output{outputfile} {}
|
||
|
|
||
|
void EmitListener::enterFile(xlangParser::FileContext *ctx) {
|
||
|
output << "data $printformat = { b \"%ld\\n\", b 0 }" << std::endl;
|
||
|
(void)ctx;
|
||
|
}
|
||
|
|
||
|
void EmitListener::enterFunction(xlangParser::FunctionContext *ctx) {
|
||
|
output << std::endl
|
||
|
<< "export function w $" << ctx->Identifier()->getSymbol()->getText()
|
||
|
<< "()" << std::endl
|
||
|
<< "{" << std::endl
|
||
|
<< "@start" << std::endl;
|
||
|
}
|
||
|
|
||
|
void EmitListener::exitFunction(xlangParser::FunctionContext *ctx) {
|
||
|
output << " ret 0" << std::endl << "}" << std::endl;
|
||
|
(void)ctx;
|
||
|
}
|
||
|
|
||
|
void EmitListener::exitStatement(xlangParser::StatementContext *ctx) {
|
||
|
if (ctx->Print()) {
|
||
|
output << " call $printf(l $printformat, ..., w %v)" << std::endl;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
void EmitListener::exitFactor(xlangParser::FactorContext *ctx) {
|
||
|
if (auto integer = ctx->Integer()) {
|
||
|
output << " %v = w copy " << integer->getSymbol()->getText() << std::endl;
|
||
|
}
|
||
|
}
|
||
|
|
||
|
} // namespace xlang
|