Attualmente sto lavorando su un generatore di scanner. Il generatore funziona già correttamente. Ma quando si usano classi di caratteri l'algoritmo diventa molto lento.Algoritmo efficiente per convertire un set di caratteri in un nfa/dfa
Il generatore di scanner produce uno scanner per i file codificati UTF8. L'intera gamma di caratteri (da 0x000000 a 0x10ffff) deve essere supportata.
Se utilizzo set di caratteri di grandi dimensioni, come qualsiasi operatore '.' o la proprietà unicode {L}, il nfa (e anche il dfa) contiene molti stati (> 10000). Quindi la conversione di nfa in dfa e creare il minimo dfa richiede molto tempo (anche se l'output minimo dfa contiene solo alcuni stati).
Ecco la mia attuale implementazione della creazione di un set di caratteri parte del nfa.
void CreateNfaPart(int startStateIndex, int endStateIndex, Set<int> characters)
{
transitions[startStateIndex] = CreateEmptyTransitionsArray();
foreach (int character in characters) {
// get the utf8 encoded bytes for the character
byte[] encoded = EncodingHelper.EncodeCharacter(character);
int tStartStateIndex = startStateIndex;
for (int i = 0; i < encoded.Length - 1; i++) {
int tEndStateIndex = transitions[tStartStateIndex][encoded[i]];
if (tEndStateIndex == -1) {
tEndStateIndex = CreateState();
transitions[tEndStateIndex] = CreateEmptyTransitionsArray();
}
transitions[tStartStateIndex][encoded[i]] = tEndStateIndex;
tStartStateIndex = tEndStateIndex;
}
transitions[tStartStateIndex][encoded[encoded.Length - 1]] = endStateIndex;
}
Qualcuno sa come implementare la funzione in modo molto più efficiente per creare solo gli stati necessari?
EDIT:
Per essere più precisi devo una funzione come:
List<Set<byte>[]> Convert(Set<int> characters)
{
???????
}
una funzione di supporto per convertire un carattere (int) per un byte UTF8 [] è definito come:
byte[] EncodeCharacter(int character)
{ ... }
Si sta creando un xFA per l'input _byte_? Non sarebbe molto più facile (e più affidabile) operare su caratteri (Utf16)? –
Non penso, la dimensione della tabella di ricerca aumenterebbe quando si usano caratteri a 16 bit. Anche il tipico file di input sarebbe più grande se si utilizza utf16 (in confronto con utf8). – raisyn
Mi dispiace, ho frainteso! Accettare qualsiasi codifica sarebbe una buona opzione per la versione futura. Ma per semplificare, penso che sia più semplice implementare solo una codifica e UTF-8 mi sembra la giusta scelta. – raisyn