2009-06-01 8 views
8

J'essaye de faire un analyseur de Bison pour manipuler des caractères UTF-8. Je ne veux pas que l'analyseur interprète réellement les valeurs de caractères Unicode, mais je veux qu'il analyse la chaîne UTF-8 comme une séquence d'octets.Can Bison peut-il analyser les caractères UTF-8?

En ce moment, Bison génère le code suivant qui est problématique:

if (yychar <= YYEOF) 
    { 
     yychar = yytoken = YYEOF; 
     YYDPRINTF ((stderr, "Now at end of input.\n")); 
    } 

Le problème est que le nombre d'octets de la chaîne UTF-8 aura une valeur négative, et Bison interprète des valeurs négatives comme EOF, et s'arrête.

Y a-t-il un moyen de contourner cela?

Répondre

8

bison oui, flex no. La fois où j'ai eu besoin d'un analyseur de bisons pour travailler avec des fichiers codés en UTF-8, j'ai fini par écrire ma propre fonction yylex.

modifier: Pour vous aider, j'ai utilisé beaucoup des opérations Unicode disponibles dans glib (il y a un type gunicode et certaines fonctions de manipulation de fichiers/chaîne que je trouve utile).

+0

Eh bien, mon lexer gère très bien les caractères UTF-8, mais l'analyseur Bison arrête l'analyse dès qu'il voit une valeur négative. S'il vous plaît donnez votre avis. –

+0

Lisez-vous votre fichier 1 octet à la fois? ou 1 caractère encodé utf-8 à la fois? – eduffy

+0

1 octet à la fois. –

4

flex étant le problème ici, vous pouvez jeter un oeil à zlex.

+0

C'est un projet intéressant, mais qui ne résoudrait pas exactement le problème abordé dans cette question. Les caractères de 16 bits sont différents des caractères codés en UTF-8 (d'une part, UTF-8 peut avoir une longueur de 4 octets). – eduffy

0

Ceci est une question d'il y a 4 ans, mais je suis confronté aux mêmes problèmes et j'aimerais partager mes idées.

Le problème est qu'en UTF-8 vous ne savez pas combien d'octets lire. Comme suggéré ci-dessus, vous pouvez utiliser votre propre lexer et lui demander de lire des lignes entières ou de lire 4 octets à chaque fois. Puis extrayez le caractère UTF-8 de cela, et lisez plus d'octets pour terminer à 4 octets.

+0

Bien que vous ne connaissiez pas le nombre d'octets à lire par caractère tant que vous ne les avez pas lus, vous n'avez probablement pas besoin de le savoir. Pour bien marquer le flux d'octets, tout ce que vous devez vraiment savoir, c'est ce que les modèles d'octets sont significatifs en tant que mots-clés, délimiteurs, etc. Le lexer n'a pas besoin d'interpréter autre chose; il recueille juste des séquences d'octets en jetons. Même si vous souhaitez renvoyer les jetons de caractères littéraux à l'appelant, il est possible d'écrire des règles de modèle lexicales qui correspondent à des séquences de code UTF-8 valides et d'utiliser celles-ci pour analyser correctement les caractères multi-octets entrants. –