Question

Ma situation: Spirit, je suis un novice, je dois utiliser VC6 et j'utilise donc Spirit 1.6.4.

J'ai une ligne qui ressemble à ceci:

//The Description;DESCRIPTION;;

Je souhaite insérer le texte DESCRIPTION dans une chaîne si la ligne commence par // la description; .

J'ai quelque chose qui fonctionne mais qui n'a pas l'air élégant à mes yeux:

vector<char> vDescription; // std::string doesn't work due to missing ::clear() in VC6's STL implementation
if(parse(chars,
    // Begin grammar
    (
       as_lower_d["//the description;"]
    >> (+~ch_p(';'))[assign(vDescription)]
    ),
    // End grammar
    space_p).hit)
{
    const string desc(vDescription.begin(), vDescription.end());
}

J'aimerais beaucoup plus assigner tous les caractères imprimables jusqu'au prochain ';' , mais ce qui suit ne fonctionnera pas car parse (...). hit == false

parse(chars,
        // Begin grammar
        (
           as_lower_d["//the description;"]
        >> (+print_p)[assign(vDescription)]
        >> ';'
        ),
        // End grammar
        space_p).hit)

Comment puis-je le frapper?

Était-ce utile?

La solution

Vous pouvez essayer d'utiliser confix_p :

confix_p(as_lower_d["//the description;"],
         (+print_p)[assign(vDescription)],
         ch_p(';')
        )

Cela devrait être équivalent à la réponse de Fred .

La raison pour laquelle votre code échoue est que print_p est gourmand . L'analyseur + print_p utilisera des caractères jusqu'à ce qu'il rencontre la fin de la saisie ou un caractère non imprimable. Le point-virgule est imprimable, donc print_p le réclame. Votre entrée est épuisée, la variable est affectée et la correspondance échoue & # 8212; il ne reste plus rien pour le dernier point-virgule de votre analyseur.

La réponse de Fred construit un nouvel analyseur, (print_p - ';') , qui correspond à tout ce que print_p fait, à l'exception des points-virgules. "Correspond à tout sauf à X , puis à X ". est un modèle courant, donc confix_p est fourni comme raccourci pour la construction de ce type d’analyseur. La documentation suggère de l'utiliser pour analyser les commentaires de style C ou Pascal, mais ce n'est pas obligatoire.

Pour que votre code fonctionne, Spirit doit reconnaître que le print_p glouton correspond trop, puis en arrière pour permettre de faire correspondre moins. Mais bien que Spirit revienne en arrière, il ne reviendra pas en arrière au "milieu". de ce qu'un sous-analyseur correspondrait goulument autrement. Il reviendra au "point de choix" suivant. mais votre grammaire n'en a pas. Voir Retour en arrière et cupidité RD dans la documentation de Spirit.

Autres conseils

Vous n'obtenez pas de succès parce que ';' correspond à print_p. Essayez ceci:

parse(chars,
    // Begin grammar
    (
       as_lower_d["//the description;"]
    >> (+(print_p-';'))[assign(vDescription)]
    >> ';'
    ),
    // End grammar
    space_p).hit)
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top