/*
 * notbb.c
 *
 *  Created on: 14/mar/2015
 *      Author: Marco
 */

/*
   Implementazione di un automa a stati finiti.

   Decide se una stringa su X={a,b} NON contiene due a consecutive
 */

#include <stdio.h>
#include <stdlib.h>


		/* alfabeto */

#define ALFABETO 2               /* X={a,b} */
#define a 0
#define b 1
#define ERRORE -1              /* simboli non appartenenti a X */
#define MAX_LENGTH 100           /* lunghezza massima parola */
		/* stati */

#define NUMSTATI 3

enum Stato {q0,q1,q2};

/*
q0 = parole su X = {a,b} che non contengono due o pių a consecutive e terminano per b;
q1 = parole su X = {a,b} che non contengono due o pių a consecutive e terminano per a;
q2 = parole su X = {a,b} che contengono due o pių a consecutive (stato pozza);
 */


enum Stato transizione[ALFABETO][NUMSTATI] =
{
  {q1,q2,q2},	/* riga transizioni per a */
  {q0,q0,q2},	/* riga transizioni per b */
};


int convertiinalfabeto (char c)
{
	int simbolo;
	switch(c)
 	{
		case 'a':
			simbolo=0;
			break;
		case 'b':
			simbolo=1;
			break;
		default:
			simbolo=ERRORE; /* letto un simbolo fuori alfabeto */
	}
	return simbolo;
}


int finale(enum Stato s)
{

   return ((s==q0)||(s==q1));
}

void stampatransizione(char letto, enum Stato corrente, enum Stato successivo)
{
	printf("simbolo letto: ");
	printf("%c\n",letto);
	printf("stato corrente: %d",corrente);
	printf(" -> stato successivo: %d",successivo);
	printf("\n");
}

	/* implementazione dell'automa a stati finiti */

int scan(char* word)
{
  enum Stato currentstate = q0;
  int accepted=finale(currentstate); /* inizialmente l'accettazione dipende da q0 */
  int continua=1;
  int currentsymbol;			/* carattere in ingresso (convertito) */
  			/* stato */
  enum Stato nextstate;
  int i=0;
  while (word[i] != '\n' && continua) {
    currentsymbol=convertiinalfabeto(word[i]);
	if (currentsymbol==ERRORE) continua=0;
		else
		nextstate=transizione[currentsymbol][currentstate];
	stampatransizione(word[i],currentstate,nextstate);
	currentstate=nextstate;
	i++;
  }
  if (continua) accepted=finale(nextstate);
     else accepted=0;
  return accepted;
}

void stamparisultato(int accettata)
{
	if (accettata) printf("PAROLA ACCETTATA\n");
			else printf("PAROLA NON ACCETTATA\n");
}


int main(int argc, char* argv[])
{
	char parola[MAX_LENGTH+1]; /* fine riga */
	 char* filename = argv[1];
	 FILE* file;

	 file = fopen(filename,"r");
	 if (file == NULL)
	 {
	      printf("file inesistente");
	      system("PAUSE");
	      return -1;
	 }


	 while (!feof(file))
	 {
	     if (fgets(parola,MAX_LENGTH,file))
	     {
		     /* l'ultimo carattere di parola č null*/
	    	 int risultato=0;
	    	 risultato=scan(parola);
	    	 printf ("%s\n",parola);
	         stamparisultato(risultato);
	     }
	 }
	 fclose(file);
	 system("PAUSE");
	 return 0;
}



