#ifndef PARSER_H
#define PARSER_H

#include "lexer.h"
#include "parser_aux.h"
#include "parser_expresion.h"
#include "parser_sentencia.h"
#include <vector>

struct declaracion_funcion {
   expresion* tipo;
   token nombre;
   std::vector<sentencia_declaracion> parametros;
   std::vector<sentencia*> cuerpo;

   declaracion_funcion(expresion* t, token n, const std::vector<sentencia_declaracion>& p, const std::vector<sentencia*>& c)
   : tipo(t), nombre(n), parametros(p), cuerpo(c) {
   }
};

struct arbol_sintactico {
   std::vector<declaracion_funcion> funciones;
};

std::vector<sentencia_declaracion> parser_lista_params(const token*& p) {
   // tarea 5
}

declaracion_funcion parser_funcion(const token*& p) {
   expresion* tipo = parser_expr(p);
   token nombre = espera(p, IDENTIFICADOR);
   espera(p, PARENTESIS_IZQ);
   std::vector<sentencia_declaracion> params = parser_lista_params(p);
   espera(p, PARENTESIS_DER);
   std::vector<sentencia*> cuerpo = parser_bloque(p);
   return { tipo, nombre, params, cuerpo };
}

arbol_sintactico parser(const std::vector<token>& tokens) {
   arbol_sintactico arbol;
   const token* p = &tokens[0];
   while (p->tipo != FIN_ARCHIVO) {
      arbol.funciones.push_back(parser_funcion(p));
   }
   return arbol;
}

#endif
