AFD = Automate Fini Déterministe
( DFA = Determinist Finite Automaton )
Un AFD reconnait un ou plusieurs tokens. Il est créé depuis un AFN ou par aggrégation d'AFD.
l'ε-Closure d'un état d'un AFN contient :
Les états ayant des lignes identiques dans la matrice sont regroupés en un état... enfin presque :
Π composé d'au moins deux groupes :
Πnew = Π PourChaque( groupe G de Πnew ) partagé groupe G en sous-groupe de façon à ce que deux états sont dans le même sous-groupe si et seulement si pour tous les symboles, ces états pointent vers le même groupe de Π replacé G dans Πnew par l'ensemble des sous-groupes formé
Πnew est différent de Π AFD avant et après réduction du nombre d'état:
\Symbole | a | b | c | d |
|---|---|---|---|---|
| 1 | 2 | 3 | 4 | 5 |
| 2 | 1 | 0 | 0 | 0 |
| 3 | 1 | 0 | 0 | 0 |
| 4 | 1 | 0 | 0 | 0 |
| 5 | 1 | 0 | 0 | 0 |
\Symbole | a | b | c | d |
|---|---|---|---|---|
| 1 | 2 | 2 | 2 | 2 |
| 2 | 1 | 0 | 0 | 0 |
Les symboles ayant des colonnes identiques dans la matrice sont regroupés dans un ensemble de caractères.
AFD avant et après réduction de l'alphabet:
\Symbole | a | b | c | d |
|---|---|---|---|---|
| 1 | 2 | 2 | 2 | 4 |
| 2 | 2 | 2 | 2 | 3 |
| 3 | 2 | 2 | 2 | 4 |
| 4 | 2 | 2 | 2 | 4 |
\Symbole | [abc] | d |
|---|---|---|
| 1 | 2 | 4 |
| 2 | 2 | 3 |
| 3 | 2 | 4 |
| 4 | 2 | 4 |
Résolution des ambiguïtés:
Exemple d'implémentation recherchant la plus grande chaîne pouvant être trouvée:
function match( oDFA, sText, nIndex ){
var nState = oDFA.I, nStartIndex, nCurrentIndex, oMatched
nStartIndex = nCurrentIndex = nIndex || 0
while( nState = oDFA.nextState( nState, sText.charAt( nCurrentIndex++ ))){
if( oDFA.haveFinalState( nState )){
oMatched={ start:nStartIndex, end:nCurrentIndex }
}
}
return oMatched
}
Premier arrivé...
function searchToken( aTokens, sText, nIndex ){
var oMatched
for(var i=0; aTokens[i]; i++ )
if( oMatched = match( aTokens[i], sText, nIndex ))
return oMatched // ...first found
}