2015-01-24 15 views
5

Auf Seite 74 des ANTRL4 Buchs heißt es, dass jedes Unicode-Zeichen kann einfach in einer Grammatik verwendet werden, indem seinen Codepunkt auf diese Weise festgelegt wird:ANTLR4: Die Verwendung von nicht-ASCII-Zeichen in Token Regeln

'\uxxxx' 

wo xxxx ist der Hexadezimalwert für den Unicode-Codepunkt.

So habe ich diese Technik in einer Token-Regel für eine ID-Token:

grammar ID; 

id : ID EOF ; 

ID : ('a' .. 'z' | 'A' .. 'Z' | '\u0100' .. '\u017E')+ ; 
WS : [ \t\r\n]+ -> skip ; 

Wenn ich diesen Eingang zu analysieren versucht:

Gŭnter 

ANTLR einen Fehler wirft, sagte, dass es nicht erkennen ŭ. (Das ŭ Zeichen ist hex 016D, also liegt es innerhalb des angegebenen Bereichs.)

Was mache ich bitte falsch?

Antwort

7

ANTLR ist bereit, 16-Bit-Zeichen zu akzeptieren, aber viele Gebietsschemas lesen standardmäßig Zeichen als Byte (8 Bit) ein. Sie müssen die entsprechende Codierung angeben, wenn Sie mithilfe der Java-Bibliotheken aus der Datei lesen. Wenn Sie die TestRig verwenden, vielleicht über alias/script grun, dann verwenden Sie das Argument -encoding utf-8 oder was auch immer. Wenn Sie sich den Quellcode dieser Klasse ansehen, sehen Sie den folgenden Mechanismus:

InputStream is = new FileInputStream(inputFile); 
Reader r = new InputStreamReader(is, encoding); // e.g., euc-jp or utf-8 
ANTLRInputStream input = new ANTLRInputStream(r); 
XLexer lexer = new XLexer(input); 
CommonTokenStream tokens = new CommonTokenStream(lexer); 
... 
+0

Vielen Dank! Ich versuchte, das -encoding-Flag beim Aufruf von TestRig: java org.antlr.v4.runtime.misc.TestRig -coding UTF-8 ID.g4 Allerdings führte dies zu diesem Fehler: Kann-Encoding als Lexer nicht laden oder Parser Vorschläge? –

+1

verwenden Sie nicht TestRig auf Ihrer Grammatik. Dafür ist Antlr da. –

+0

Hallo! Immer noch kein Erfolg. Hier ist, was ich getan habe: (1) java org.antlr.v4.Tool -encoding UTF-8 ID.g4 (2) javac * .java (3) java org.antlr.v4.runtime.misc.TestRig ID id -gui