main.cpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  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. string outfilename = "";
  15. bool outputAssembly = false;
  16. for (int i = 1; i < argc; i++) {
  17. string arg = argv[i];
  18. if (arg == "") {
  19. }
  20. else if (arg[0] == '-') {
  21. if (arg == "-o" && argc > i + 1) {
  22. outfilename = argv[i + 1];
  23. i++;
  24. }
  25. else if (arg == "-S") {
  26. outputAssembly = true;
  27. }
  28. }
  29. else {
  30. filename = arg;
  31. }
  32. }
  33. istream* in = &cin;
  34. ostream* out = &cout;
  35. if (filename != "") {
  36. in = new ifstream{filename.c_str(), fstream::in};
  37. out = new ofstream{(filename + ".s").c_str(), fstream::out};
  38. }
  39. Parser parser{ *in };
  40. unique_ptr<zp::Block> ast;
  41. try {
  42. ast = parser.parse();
  43. }
  44. catch(zp::ParserException& pe) {
  45. cerr << "Error: " << pe.what() << endl;
  46. return 1;
  47. }
  48. Optimizer optimizer;
  49. auto ir = ast->accept(optimizer);
  50. AssemblyGenerator ag{ *out };
  51. ir->accept(ag);
  52. ag.finish();
  53. if (filename != "") {
  54. dynamic_cast<ifstream*> (in)->close();
  55. dynamic_cast<ofstream*> (out)->close();
  56. delete in;
  57. delete out;
  58. in = &cin;
  59. out = &cout;
  60. }
  61. }