2009-05-28 2 views
2

Il semble que flex ne supporte pas l'entrée UTF-8. Chaque fois que le scanner rencontre un caractère non-ASCII, il arrête de numériser comme s'il s'agissait d'un EOF.Comment faire un flex (scanner lexical) pour lire les caractères UTF-8?

Existe-t-il un moyen de forcer le flex à manger mes caractères UTF-8? Je ne veux pas que cela corresponde réellement aux caractères UTF-8, il suffit de les manger en utilisant le '.' modèle.

Une suggestion?

EDIT

La solution la plus simple serait:

TOUT [\ x00- \ xff]

et l'utilisation 'tout' au lieu de '' dans mes règles.

+0

Si cela fonctionne, super :) un support Unicode approprié serait bien. –

+0

D'accord. Je cours un autre problème maintenant, Flex vérifie "if (yychar <= YYEOF) {/ * scanning terminé * /}", mais mes caractères UTF-8 sont négatifs :( –

+0

Vous aurez des tonnes de problèmes. à l'interne, ce sera une mission de réécrire le code ecs, le générateur de table et les choses, peut-être mieux de repartir de zéro: P wanna help? –

Répondre

6

J'ai regardé ceci moi-même et j'ai lu la liste de diffusion de Flex pour voir si quelqu'un y avait pensé. Faire en sorte que Flex lise unicode est une tâche complexe ...

Le codage UTF-8 peut être effectué, et la plupart des autres codages (les 16) conduiront à des tables massives pilotant les automates.

Une méthode commune jusqu'à présent est:

Ce que je n'était tout simplement écrire des modèles qui correspondent à des caractères simples UTF-8 . Ils ressemblent quelque chose comme ce qui suit, mais vous voudrez peut-être relire la spécification UTF-8 parce que j'ai écrit cela il y a si longtemps.
Vous aurez bien sûr besoin de combiner ceux-ci puisque vous voulez des chaînes Unicode, pas seulement des caractères individuels.

UB [\200-\277] %% 
[\300-\337]{UB}     { do something } 
[\340-\357]{UB}{2}    { do something } 
[\360-\367]{UB}{3}    { do something } 
[\370-\373]{UB}{4}    { do something } 
[\374-\375]{UB}{5}    { do something } 

depuis la liste de diffusion.

Je peux envisager de créer un correctif approprié pour le support UTF-8 après l'avoir examiné plus en détail. La solution ci-dessus semble impossible à maintenir pour les gros fichiers .l. Et c'est vraiment moche! Vous pouvez utiliser des plages similaires pour créer un '.' Règle de substitution pour correspondre à tous les caractères ASCII et UTF-8, mais toujours plutôt moche.

espérons que cela aide!

1

écrire un characterclass de negatet pourrait aussi aider:

[\ n \ t] WHITESPACE de retour; [^ \ n \ t] retrun NON_WHITESPACE

Questions connexes