J'écris un programme qui va marquer le texte d'entrée en fonction de certaines règles spécifiques. J'utilise C++ pour cela.Marquez le texte en fonction de certaines règles spécifiques. Algorithme en C++
Règles
Letter 'a' should be converted to token 'V-A'
Letter 'p' should be converted to token 'C-PA'
Letter 'pp' should be converted to token 'C-PPA'
Letter 'u' should be converted to token 'V-U'
Ceci est juste un échantillon et en temps réel, j'ai autour de 500+ règles comme celui-ci. Si je fournis une entrée sous la forme 'appu', cela devrait ressembler à 'V-A + C-PPA + V-U'. J'ai mis en place un algorithme pour ce faire et je voulais m'assurer que je faisais la bonne chose.
algorithme
Toutes les règles seront conservés dans un fichier XML avec le mappage correspondant au jeton. Quelque chose comme
<rules>
<rule pattern="a" token="V-A" />
<rule pattern="p" token="C-PA" />
<rule pattern="pp" token="C-PPA" />
<rule pattern="u" token="V-U" />
</rules>
1 - Lorsque l'application démarre, lisez ce fichier xml et conserver les valeurs dans un 'std :: carte'. Ce sera disponible jusqu'à la fin de l'application (mise en œuvre de modèle singleton).
2 - Itérer les caractères de saisie. Pour chaque personnage, cherchez une correspondance. Si trouvé, devenez plus gourmand et cherchez plus de correspondances en prenant les caractères suivants du texte d'entrée. Faites-le jusqu'à ce que nous obtenions un non-match. Donc, pour le texte d'entrée 'appu', cherchez d'abord un résultat pour 'a'. Si trouvé, essayez d'obtenir plus de correspondance en prenant le caractère suivant du texte d'entrée. Donc, il va essayer de faire correspondre 'ap' et n'a trouvé aucun résultat. Donc ça revient juste.
3 - Remplacez la lettre 'a' du texte d'entrée car nous en avons reçu un jeton.
4 - Répétez les étapes 2 et 3 avec les caractères restants dans le texte d'entrée.
Voici une explication plus simple des étapes
input-text = 'appu'
tokens-generated=''
// First iteration
character-to-match = 'a'
pattern-found = true
// since pattern found, going recursive and check for more matches
character-to-match = 'ap'
pattern-found = false
tokens-generated = 'V-A'
// since no match found for 'ap', taking the first success and replacing it from input text
input-text = 'ppu'
// second iteration
character-to-match = 'p'
pattern-found = true
// since pattern found, going recursive and check for more matches
character-to-match = 'pp'
pattern-found = true
// since pattern found, going recursive and check for more matches
character-to-match = 'ppu'
pattern-found = false
tokens-generated = 'V-A + C-PPA'
// since no match found for 'ppu', taking the first success and replacing it from input text
input-text = 'u'
// third iteration
character-to-match = 'u'
pattern-found = true
tokens-generated = 'V-A + C-PPA + V-U' // we'r done!
Questions
1 - Est-ce algorithme semble très bien pour ce problème ou est-il une meilleure façon de résoudre ce problème?
2 - Si c'est la bonne méthode, std :: map est un bon choix ici? Ou dois-je créer mon propre conteneur clé/valeur?
3 - Existe-t-il une bibliothèque disponible qui peut générer une chaîne de caractères comme celle ci-dessus?
Toute aide serait appréciée
:)
Prenez-vous en compte le cas où vous avez un match long mais pas court? Par exemple, supposons que vous n'avez pas le modèle 'p'. Votre algorithme va-t-il trouver le modèle 'pp'?L'analyse de 'p' ne donnera pas une correspondance directe, mais vous devriez néanmoins continuer la récursivité. –
Oui. Il continuera la récursivité. –