#include <stdio.h>
#include <stdlib.h>
#include "analyseur_lexical.h"
#include "analyseur_syntaxyque.h"
#include "affiche_arbre_abstrait.h"
#include "parcours.h"
#include "symboles.h"

#define A_LEXI 1
#define A_SYNT 2
#define A_ABST 3
#define A_SYMB 4
#define A_MIPS 5

extern int uniteCourante;
extern int afficheSyntaxyque;
extern int afficheDico;
extern int afficheMips;

char yytext[100];
FILE *yyin;
n_prog *p;

void usage()
{
	printf("Usage:\n");
	printf("./compilateur-l -l fileName\n");
	printf("./compilateur-l -s fileName\n");
	printf("./compilateur-l -a fileName\n");
	printf("./compilateur-l -t fileName\n");
	printf("./compilateur-l -m fileName\n");
	printf("./compilateur-l fileName\n");
	exit (8);
}


int main(int argc, char **argv) { 

	int sortie = A_MIPS;
	while ((argc > 1) && (argv[1][0] == '-'))
	{
		switch (argv[1][1])
		{
			case 'l':
				sortie = A_LEXI;
				break;
			
			case 's':
				sortie = A_SYNT;
				break;
			
			case 'a':
				sortie = A_ABST;
				break;
			
			case 't':
				sortie = A_SYMB;
				break;

			case 'm':
				sortie = A_MIPS;
				break;

			default:
				printf("Wrong Argument: %s\n", argv[1]);
				usage();
		}

		++argv;
		--argc;
	}

	yyin = fopen(argv[argc-1], "r");
	if(yyin == NULL){
		fprintf(stderr, "impossible d'ouvrir le fichier %s\n", argv[2]);
		exit(1);
	}

	switch (sortie)
	{
		case A_LEXI:
			test_yylex_internal(yyin);
			break;
		
		case A_SYNT:
			initialise_premiers();
			initialise_suivants();
			afficheSyntaxyque = 1;
			uniteCourante = yylex();
			programme();
			break;
		
		case A_ABST:
			initialise_premiers();
			initialise_suivants();
			uniteCourante = yylex();
			p = programme();
			affiche_n_prog(p);
			break;
		
		case A_SYMB:
			initialise_premiers();
			initialise_suivants();
			afficheDico = 1;
			uniteCourante = yylex();
			p = programme();
			parcours_table(p);
			break;

		case A_MIPS:
			initialise_premiers();
			initialise_suivants();
			afficheMips = 1;
			uniteCourante = yylex();
			p = programme();
			parcours_table(p);
			break;

		default:
			printf("Wrong Argument\n");
			usage();
	}

	uniteCourante = yylex();
	if(uniteCourante != FIN) {
		printf("Erreur EOF");
	}

	return 0;
}