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 }