No, non praticamente comunque. Una macchina a stati finiti normalmente ricorda solo un pezzo di dati: il suo stato attuale.
Una tipica applicazione di un FSM è il lexing o l'analisi. Ad esempio, quando stiamo facendo lexing, è (normalmente) abbastanza facile codificare le azioni per ogni possibile input in termini di uno stato corrente e il valore dell'input.
Ad esempio, potremmo avere uno stato NUMBER in cui stiamo leggendo le cifre di un numero. Se il prossimo carattere che leggiamo è una cifra, restiamo nello stato NUMBER. Se si tratta di uno spazio o di una scheda, restituiremo le cifre e quindi passeremo a qualche stato di WHITE_SPACE o qualcosa del genere.
Ora, è certamente vero che in un tipico FSM (specialmente uno che è implementato nel software) ci ritroviamo con frammenti che tecnicamente non si adattano perfettamente ad un FSM mescolato con lo stesso FSM. Ad esempio, quando stiamo leggendo cifre di un numero, salvi frequentemente la posizione della prima cifra, quindi quando arrivi alla fine puoi facilmente calcolare il valore del numero.
Lo stesso FSM ha alcune limitazioni: non ha un meccanismo di conteggio. Si consideri, ad esempio, un linguaggio che utilizza "/ " per iniziare un commento e " /" per terminare un commento. Il suo lexer avrebbe probabilmente uno stato COMMENTO che è entrato quando ha visto un token '/ '. A questo punto non ha alcun modo (a parte aggiungere un altro stato come COMMENT2) per rilevare un altro "/ " e rendersi conto che si tratta di un commento annidato. Piuttosto, nello stato dei commenti, riconoscerà */
come dicendo di lasciare lo stato dei commenti e qualsiasi altra cosa lo lascia nello stato dei commenti.
Come già detto, potresti certamente includere uno stato COMMENT2 per un commento nidificato, e in quello, uno stato COMMENT3 e così via. Ad un certo punto, tuttavia, ti stancherai di aggiungere altri stati e questo determinerà la profondità massima di annidamento che ammetti per i commenti. Con qualche altra forma di parser (vale a dire, non una macchina a stati puri, ma qualcosa che ha un po 'di memoria per lasciarla contare) puoi semplicemente tenere traccia direttamente della profondità di annidamento, così rimani nello stato COMMENT fino a raggiungere un token commento vicino che bilancia il primo, quindi il tuo contatore torna a 0 e lasci lo stato COMMENT.
Come ho detto, tuttavia, quando aggiungi un segnalino come quello, ciò che hai non è più un vero FSM. Allo stesso tempo, è in realtà piuttosto vicino - in particolare, abbastanza vicino da poter simulare il contatore semplicemente aggiungendo altri stati.
In un caso tipico, tuttavia, quando qualcuno parla dell'implementazione di un FSM nel software, lo manterrà ragionevolmente "puro". In particolare, il software reagirà all'ingresso corrente in base solo allo stato corrente e al valore dell'input stesso. Se la reazione dipende da molto altro, di solito non la chiameranno una macchina a stati (almeno se sanno di cosa stanno parlando).