2010-01-17 13 views
5

Ich versuche, alle Token in einem Text auszuwählen und müssen alle Ascii und Unicode-Zeichen übereinstimmen, also hier ist, wie ich sie ausgebreitet habe.Wie finde ich Unicode-Zeichen in antlr

fragment CHAR  : ('A'..'Z') | ('a'..'z'); 
fragment DIGIT : ('0'..'9'); 
fragment UNICODE : '\u0000'..'\u00FF'; 

Nun, wenn ich meine Token-Regel schreiben wie:

TOKEN : (CHAR|DIGIT|UNICODE)+; 

ich 'A' „Decision Eingang wie mithalten kann ".. 'Z'" mit mehreren Alternativen: 1, 3 Als Ergebnis wurden die Alternative (n) 3 für den Eingang " " deaktiviert. Die Entscheidung kann Eingaben wie "'0' .. '9'" unter Verwendung mehrerer Alternativen treffen: 2, 3 Als Ergebnis, Alternative (n) 3 wurden für diesen Eingang deaktiviert "

Und nichts wird abgestimmt: Und auch wenn ich es als

TOKEN : (UNICODE)+; 

Nichts schreiben wird abgestimmt.

Gibt es eine Möglichkeit, dies zu tun.

+3

‚\ u0000‘ .. ‚\ u00FF‘ umfasst nicht „alle Unicode-Zeichen“, es nur deckt die ersten 256. –

+0

Das auch. Das habe ich vermisst! –

+0

True, aber ich dachte, Java unterstützt noch nicht fünfstelligen Unicode. – Lezan

Antwort

5

Eine andere Sache zu prüfen, ob Sie zur Verwendung von Unicode planen, dass Sie die charvocabulary Option sollte zu sagen, dass Sie wollen in der Unicode-Bereich von 0 bis FFFE

options 
{ 
charVocabulary='\u0000'..'\uFFFE'; 
} 

der Standard Sie in der Regel in den Beispielen sehen Sie irgendwelche Zeichen ermöglichen, ist

options 
{ 
charVocabulary = '\3'..'\377'; 
} 

Um den oben genannten Punkt zu decken. Generell gilt: Wenn Sie sowohl den ASCII-Zeichenbereich 'A'..'Z' und die Unicode-Bereich benötigt man eine Unicode-Lexer Regel machen würde wie: '\u0080'..'\ufffe'

+1

Hinweis: Die Option "charVocabulary" ist nicht in antiRr3 verfügbar, da sie standardmäßig Unicode verwendet. –

5

Praktisch ist TOKEN: (UNICODE)+ völlig nutzlos.

Da alles ein Token-Zeichen ist, wenn Sie versuchen, eine solche Regel zu verwenden, um ein Java-Programm abzustimmen, wird es einfach das gesamte Programm abgleichen und es als ein großes Token zurückgeben.

Sie müssen Ihre Zeichen wirklich in verschiedene Gruppen zerlegen, wenn Sie Ihre Eingabe in aussagekräftige Fragmente zerlegen möchten.

Es könnte Ihnen helfen, einen Blick darauf zu werfen, wie die "Profis" es gemacht haben. Hier ist a BNF grammar for Java, und hier ist BNF for an identifier, die zeigt, wie sie sich die Mühe Gruppe heraus nahm

identifier 
    ::= "a..z,$,_" { "a..z,$,_,0..9,unicode character over 00C0" }