Costruire un automa a stati finiti deterministici per un determinato regex

3

Ho un paio di domande d'esame per la mia classe di compilatori e volevo controllare se le mie soluzioni fossero corrette.

La prima domanda è:

Consider a language in which numbers start with an optional minus sign, followed by one or more decimal digits, followed by an optional decimal point. If the number contains a decimal point it is followed by one or more further decimal digits. Express the syntax of numbers in this language as a regular expression.

E per la mia risposta:

("-")? ["0"-"9"]+ ("."["0"-"9"]+)?

La seconda domanda è:

Construct a deterministic finite state automaton for recognising the numbers as described in Question 1

E la mia risposta è:

Dove lo stato 2,4,5 e 6 sono terminali.

Queste soluzioni sono corrette? Non sono sicuro di come dovrebbe essere il DFA e le sue differenze rispetto a un NFA.

Grazie!

    
posta TomSelleck 01.01.2013 - 20:09
fonte

1 risposta

7

No, il tuo automa finito deterministico non è corretto. La tua espressione regolare è.

Il problema nel tuo DFA è la dichiarazione di 5 e 6 come nodi terminali. Un banco di prova come "0". sarà accettato dal tuo DFA anche se non dovrebbe.

Valori facoltativi

Voglio sottolineare come è possibile modellare una struttura generale che include valori opzionali. Prendiamo ad esempio un'espressione regolare come "a? B". L'idea ora è creare due rami. Uno include l'elemento opzionale "a" e l'altro lo esclude. Il ramo di inclusione si fonde con l'altro con il primo valore che è obbligatorio di nuovo.

Unaopiùvolte

Comesecondaidea:comemodelliamoquantitàcome"una o più volte"? Dobbiamo creare un vantaggio che richiede di leggere il simbolo "a" una volta sola. Dopodiché creiamo un self-loop che legge il simbolo tutte le volte necessarie (possibilmente zero).

Applicandoquesteideealtuoautomafinitodeterministico,otteniamoquantosegue:

Automazioni finite non deterministiche

Un automa diventa non deterministico se ci sono due bordi con la stessa etichetta che inizia dallo stesso vertice. Nell'esempio seguente, iniziando con il vertice "4" e leggendo l'input "0", non si saprà quale percorso accetterà la stringa di input (a sinistra o in basso) e procederà in modo non deterministico.

    
risposta data 01.01.2013 - 20:43
fonte

Leggi altre domande sui tag