#include "codegen.h"
#include "debug.h"
#include "error.h"
#include "lexer.h"
#include "parser.h"
#include "semantico.h"
#include <iostream>
#include <string>

int main( ) {
   std::string entrada, linea;
   while (std::getline(std::cin, linea)) {
      entrada += linea;
      entrada += "\n";
   }

   try {
      std::vector<token> tokens = lexer(entrada);
      arbol_sintactico arbol = parser(tokens);
      tabla_simbolos tabla = semantico(tokens, arbol);
      std::string salida = codegen(arbol, tabla);
      std::cout << salida;
   } catch (const error& e) {
      auto [linea, columna] = linea_columna(entrada, e.vista);
      std::cout << "ERROR " << linea + 1 << ":" << columna + 1 << "\n";
      std::cout << e.mensaje << "\n";
   }
}
