2010-09-02 7 views
4

Problème: impossible d'imprimer correctement le caractère Unicode.ANTLR: Balayage de caractères Unicode

Voici ma grammaire:

options { k=1; filter=true; 
// Allow any char but \uFFFF (16 bit -1) 
charVocabulary='\u0000'..'\uFFFE'; 
} 

ANYCHAR :'$' 
| '_' { System.out.println("Found underscore: "+getText()); } 
| 'a'..'z' { System.out.println("Found alpha: "+getText()); } 
| '\u0080'..'\ufffe' { System.out.println("Found unicode: "+getText()); } 
; 

extrait de code de la méthode principale invoquant le lexer:

public static void main(String[] args) { 
SimpleLexer simpleLexer = new SimpleLexer(System.in); 
while(true) { 
try { 
Token t = simpleLexer.nextToken(); 
System.out.println("Token : "+t); 

} catch(Exception e) {} 

} 
} 

Pour l'entrée "ठ", je reçois la sortie suivante:

Found unicode: 
Token : ["à",<5>,line=1,col=7] 
Found unicode: 
Token : ["¤",<5>,line=1,col=8] 
Found unicode: 
Token : [" ",<5>,line=1,col=9] 

Il semble que le lexer traite ch Unicode ar "ठ" comme trois caractères distincts. Mon but est de numériser et d'imprimer "ठ".

+1

pas lié à votre problème, mais je vous recommande de ne jamais « avaler » vos exceptions: quand les choses vont mal , vous n'avez aucune idée de ce qui s'est passé (et où). Au lieu de 'catch (Exception e) {}', faites au moins: 'catch (Exception e) {e.printStackTrace(); } ' –

+0

Vous avez raison monsieur :) Leçon pour moi: lire le code copié tout le chemin jusqu'à la fin avant de l'utiliser. – Jhakki

Répondre

5

Votre problème ne réside pas dans le lexeur généré par ANTLR, mais dans le flux Java que vous lui transmettez. Le flux lit les octets seulement (ne les interprète pas dans un encodage), et ce que vous voyez est une séquence UTF-8.

Si son ANTLR 3, vous pouvez utiliser le constructeur ANTLRInputStream qui prend un ancoding comme paramètre:

ANTLRInputStream (InputStream input, String encoding) throws IOException 
+0

Merci, c'était ça. En outre, j'ai réalisé que j'utilisais antlr.Tool, au lieu de org.antlr.Tool, et que cela ne générait pas l'implémentation de Lexer avec un constructeur qui prenait ANTLRInputStream. – Jhakki

+0

Je sais que c'est un coup de feu plus de 3 ans plus tard. Cependant, savez-vous comment faire quelque chose comme ça pour C# et ANTLR4? Il n'y a plus de constructeur qui utilise le codage du tout. – SomeoneRandom

+0

Ajouté réponse ici: http://stackoverflow.com/questions/28126507/antlr4-using-non-ascii-characters-in-token-rules/28129510#28129510 –

Questions connexes