2009-12-17 4 views
2

J'utilise spirit classic depuis un moment et j'ai récemment commencé à apprendre v2. Les deux sont faciles à utiliser et assez puissant pour gérer l'analyse modérée problème.Comment changer le type de caractère interne de l'analyseur?

Dans ces jours idylliques avec l'esprit classique et les caractères ascii, le travail est simplement en adaptant une forme EBNF à LL. Mais finalement, je dois traiter avec l'i18n.

Ma pensée est vraiment brute. Créez un itérateur avant qui répète sur le flux d'octets de texte d'entrée de tout codage. L'itérateur gère le travail de conversion d'encodage et alimente l'analyseur avec l'unité de code utf16/32 (l'itérateur peut être facilement implémenté par iconv ou icu4c).

Le type d'unité de code doit être le type de caractère interne traité par l'analyseur. Mais après avoir lu le document, je n'ai trouvé que plusieurs primitives , les modèles d'itérateur ont un paramètre char_t explicite. Est-ce que signifie que je dois reformuler ces nombres, directives, scanners, et etc.?

J'ai également vérifié le document v2. Il offre un moyen d'espace de nom pour rendre tout cohérent , mais toujours pas trop sur la façon explicite de changer le type de caractère interne. Encore une fois, j'ai cherché dans l'archive de la liste de diffusion, mais il me semble que ces messages liés à l'encodage Unicode et autres sont toujours en l'air. Quelqu'un m'a dit que l'esprit pouvait encore fonctionner à travers ces fichiers avec un encodage différent. J'ai donc testé l'analyseur en utilisant des fichiers avec un encodage différent mais avec le même contenu. Plusieurs fichiers codés MBCS ont réussi le test, et un fichier utf8 a également été transmis. Mais l'autre encodage a échoué la plupart du temps.

Répondre

1

Je suppose que vous avez déjà trouvé char_ et character encoding namespace sur le site web de Boost Spirit.

La dernière page comprend le commentaire utile

« Nous avons un espace de noms pour chaque caractère Esprit sera mis à l'appui. Cela inclut ascii, ISO8859_1, standard et standard_wide (et dans l'avenir, unicode). » En d'autres termes, boost spirit ne supporte pas vraiment unicode pour le moment. C'est sur leur liste TODO.

En attendant, vous pouvez essayer une solution de contournement kludgy comme ceci:

my_tag_ = lit("<") >> byte_ >> lit(">"); 

qui correspondra à une chaîne binaire qui arrive à apparaître entre crochets, à condition de ne pas utiliser un filtre dépendant charset dessus .

Questions connexes