#include "JetParser.h" #include "JetCodegen.h" #include #include #include int main(int argc, char **argv) { if (argc < 3) { std::cerr << "usage: jetc " << std::endl; return 1; } std::ifstream in(argv[1]); if (!in) { std::cerr << "jetc: cannot open " << argv[1] << std::endl; return 1; } std::ostringstream ss; ss << in.rdbuf(); std::string src = ss.str(); // Skip a leading shebang line, mirroring jet-2.0.cpp's own data.goeol() // call (run before it constructs the top-level __jet tag) so a // "#!../jet-2.0" first line doesn't get compiled in as literal output. if (src.rfind("#!", 0) == 0) { size_t nl = src.find('\n'); src = (nl == std::string::npos) ? std::string() : src.substr(nl + 1); } try { jetc::Parser parser(src); auto nodes = parser.parseNodes(); jetc::Codegen codegen; std::string cpp = codegen.generate(nodes, std::string("compiled from ") + argv[1]); std::ofstream outFile(argv[2]); outFile << cpp; outFile.close(); std::cout << "jetc: wrote " << argv[2] << std::endl; } catch (std::exception &e) { std::cerr << "jetc: " << e.what() << std::endl; return 1; } return 0; }