Actualmente estoy trabajando en un generador de escáner. El generador ya funciona bien. Pero al usar clases de caracteres, el algoritmo se vuelve muy lento.Algoritmo eficiente para convertir un conjunto de caracteres en nfa/dfa
El generador de escáner produce un escáner para archivos codificados en UTF8. Debe admitirse el rango completo de caracteres (0x000000 a 0x10ffff).
Si utilizo juegos de caracteres grandes, como cualquier operador '.' o la propiedad Unicode {L}, la nfa (y también la dfa) contiene muchos estados (> 10000). Por lo tanto, la conversión para nfa a dfa y crear el dfa mínimo lleva mucho tiempo (incluso si el dfa mínimo de salida contiene solo unos pocos estados).
Aquí está mi implementación actual de crear un conjunto de caracteres como parte de la 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;
}
¿Alguien sabe cómo implementar la función de manera mucho más eficiente para crear solo los estados necesarios?
EDIT:
Para ser más específicos que necesito una función como:
List<Set<byte>[]> Convert(Set<int> characters)
{
???????
}
una función de ayuda para convertir un personaje (int) para un byte de codificación UTF-8 [] se define como:
byte[] EncodeCharacter(int character)
{ ... }
¿Está creando un xFA para la entrada _byte_? ¿No sería mucho más fácil (y más confiable) operar con chalecos (Utf16)? –
No creo, el tamaño de la (s) tabla (s) de búsqueda aumentaría (n) al usar caracteres de 16 bits. Además, el archivo de entrada típico sería más grande si se usa utf16 (en comparación con utf8). – raisyn
Lo siento, ¡lo he entendido mal! Aceptar cualquier codificación sería una buena opción para la versión futura. Pero para hacerlo simple, creo que es más fácil implementar solo una codificación, y UTF-8 parece ser el mejor para mí. – raisyn