main.cpp 1.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. #include <iostream>
  2. #include <string>
  3. #include <fstream>
  4. #include "Parser.h"
  5. #include "Optimizer.h"
  6. #include "AssemblyGenerator.h"
  7. using namespace std;
  8. using zp::Parser;
  9. using zp::Optimizer;
  10. using zp::AssemblyGenerator;
  11. int main(int argc, char** argv)
  12. {
  13. string filename = "";
  14. for (int i = 1; i < argc; i++) {
  15. string arg = argv[i];
  16. if (arg == "") {
  17. }
  18. else if (arg[0] == '-') {
  19. }
  20. else {
  21. filename = arg;
  22. }
  23. }
  24. istream* in = &cin;
  25. ostream* out = &cout;
  26. if (filename != "") {
  27. in = new ifstream{filename.c_str(), fstream::in};
  28. out = new ofstream{(filename + ".s").c_str(), fstream::out};
  29. }
  30. Parser parser{ *in };
  31. unique_ptr<zp::Block> ast;
  32. try {
  33. ast = parser.parse();
  34. }
  35. catch(zp::ParserException& pe) {
  36. cerr << "Error: " << pe.what() << endl;
  37. return 1;
  38. }
  39. Optimizer optimizer;
  40. auto ir = ast->accept(optimizer);
  41. AssemblyGenerator ag{ *out };
  42. ir->accept(ag);
  43. ag.finish();
  44. if (filename != "") {
  45. dynamic_cast<ifstream*> (in)->close();
  46. dynamic_cast<ofstream*> (out)->close();
  47. delete in;
  48. delete out;
  49. in = &cin;
  50. out = &cout;
  51. }
  52. }