2009-04-20 8 views
3

Je crée une grammaire en utilisant JavaCC et j'ai rencontré un petit problème. J'essaie de permettre à tout caractère valide dans l'ensemble étendu ASCII d'être reconnu par le compilateur résultant. Après avoir examiné les mêmes exemples de javacc (principalement l'exemple montrant la JavaCC Grammer lui-même), je mis en place le jeton suivant pour reconnaître mes personnages:Reconnaissance de caractères étendus en utilisant JAVACC

< CHARACTER: 

    ( (~["'"," ","\\","\n","\r"]) 
    | ("\\" 
     (["n","t","b","r","f","\\","'","\""] 
     | ["0"-"7"] (["0"-"7"])? 
     | ["0"-"3"] ["0"-"7"] ["0"-"7"] 
     ) 
    ) 
) 

> 

Si je comprends cela correctement, il devrait être mise en correspondance sur la représentation octal de tous les caractères ASCII, de 0 à 377 (qui couvre les 256 caractères de l'ensemble ASCII étendu). Cela fonctionne comme prévu pour tous les caractères du clavier (a-z, 0-9,?,./Etc) et même pour la plupart des caractères spéciaux (©, ¬ ®). Cependant, chaque fois que j'essaie d'analyser le symbole 'trademark' (™) mon analyseur jette continuellement une exception de fin de fichier, indiquant qu'il est incapable de reconnaître le symbole. Existe-t-il un moyen évident d'améliorer ma définition d'un personnage pour permettre l'acceptation du symbole de la marque?

Répondre

1

Il s'est avéré que ce que je voulais que ma grammaire fasse était d'accepter tous les caractères Unicode valides et non ASCII, le symbole ™ fait partie de la spécification Unicode et non d'un jeu de caractères ASCII étendu. Modification de mon jeton pour un caractère valide tel que décrit ci-dessous a résolu mon problème: (Un être unicode valide du Format- U + 00FF)

< CHARACTER:( (~["'"," ","\\","\n","\r"]) 
| ("\\" 
    (["n","t","b","r","f","\\","'","\""] 
    | ["u","U"]["+"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"]["0"-"9","a"-"f","A"-"F"] 
    ) 
))> 
0

J'ai eu un problème similaire pour reconnaître des symboles spéciaux d'un fichier texte (soit CP1252 ou encodé ISO-8859-1) qui a été lu dans une chaîne avant l'analyse. Ma solution a été d'ajouter la UNICODE_INPUT à l'en-tête de la grammaire:

options { 
    UNICODE_INPUT=true; 
} 

bossé comme un jeu d'enfant.

Plus d'informations sur les options JavaCC: http://javacc.java.net/doc/javaccgrm.html

Questions connexes