Professional Documents
Culture Documents
Nfla 2
Nfla 2
#include "AFN.h"
AFN::AFN()
{
///ctor
StareInit = -1 ;
nrchr = 0 ;
nrstf = 0 ;
chr[nrchr] = '\0' ;
}
AFN::~AFN()
{
///dtor
StareInit = -1 ;
nrchr = 0 ;
nrstf = 0 ;
}
void citire_automat( AFN *&T , int &n , int &q , int *&StF , int &nr , char
alfabet[100] ) {
int i, j, x;
ifstream f( "C:\\Users\\Andrei\\Documents\\GitHub\\LFA-Tema2\\automat.ini" ) ;
/**
* citim alfabetul
*/
cout << "Alfabetul = " ;
cin >> alfabet ;
/** Citim starea initiala */
f >> i ;
q = i ;
/** Citim nr de stari finale */
f >> i ;
nr = i ;
StF = new int[nr+1] ;
/** Citim starile finale */
for( i = 0 ; i < nr ; i++ )
f >> StF[i] ;
/** Citim nr total de stari */
f >> i ;
n = i ;
T = new AFN[n+1] ;
for( i = 0 ; i < n ; i++ ){
T[i].StareInit = i+1 ;
/**Citim nr de caractere cu care putem pleca din starea i+1 */
f >> T[i].nrchr ;
T[i].StareFin.resize(T[i].nrchr) ;
/** Citim caracterele cu care putem realiza tranzitii */
for( j = 0 ; j < T[i].nrchr ; j++ ){
/** Citim caracterul j+1 pentru starea curenta */
f >> T[i].chr[j];
/** Citim starile in care putem ajunge cu caracterul curent , pana la
intalnirea valorii -1 */
f >> x ;
while( x!=-1 ){
T[i].StareFin[j].push_back( x ) ;
f >> x ;
}
}
}
cout << "Automat citit!" << '\n' ;
}
vector < int > delta( AFN *T , int nrStari , int stare , char character ) {
inchidere(T, nrStari);
vector<int> temp1, temp2;
temp1.resize(static_cast<unsigned int>(nrStari + 1));
temp2.resize(static_cast<unsigned int>(nrStari + 1));
for( int i = 0 ; i <= nrStari ; i++ ){
temp1.pop_back();
temp2.pop_back();
}
for (auto iterator = T[stare].Inchidere.begin(); iterator !=
T[stare].Inchidere.end(); iterator++) {
for (int i = 0; i < T[*iterator].nrchr; i++)
if (T[*iterator].chr[i] == character) {
list<int> L = T[*iterator].StareFin[i];
while (!L.empty()) {
int x = L.front();
if(isNotYet( temp1 , x )) temp1.push_back(x);
L.pop_front();
}
}
}
for (auto iterator = temp1.begin(); iterator != temp1.end(); iterator++)
temp2 = concatenate(temp2, T[*iterator].Inchidere);
return temp2;
}