2010-01-17 21 views
5

? Estoy tratando de seleccionar todos los tokens en un texto y necesito unir todos los caracteres Ascii y Unicode, así es como los he expuesto.¿Cómo puedo unir los caracteres unicode en antlr

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

Ahora si escribo mi regla token como:

TOKEN : (CHAR|DIGIT|UNICODE)+; 

consigo "Decisión puede igualar entrada como " 'A' .. 'Z'" utilizando múltiples alternativas: 1, 3 Como resultado, la (s) alternativa (s) 3 fueron deshabilitadas para esa entrada " " La decisión puede hacer coincidir la entrada como "'0' .. '9'" usando múltiples alternativas: 2, 3 Como resultado, alternativa (s) 3 fueron deshabilitados para esa entrada "

Y nada se iguala: Y también si lo escribo como

TOKEN : (UNICODE)+; 

nada se emparejado.

¿Hay alguna manera de hacerlo?

+3

'\ u0000' .. '\ u00FF' no cubren "todos los caracteres Unicode", sólo cubre los primeros 256. –

+0

Eso también. ¡Me lo perdí! –

+0

Es cierto, pero pensé que Java aún no es compatible con Unicode de cinco dígitos. – Lezan

Respuesta

5

Otra cosa a tener en cuenta si usted está planeando sobre el uso de Unicode es que debe establecer la opción charvocabulary decir que desea permitir que cualquier caracter en el rango de 0 a través de Unicode FFFE

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

el valor predeterminado que se suele ver en los ejemplos es

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

Para cubrir el punto anterior. En general, si se necesitaba tanto el rango de caracteres ASCII 'A'..'Z' y el rango Unicode que serías una norma Unicode lexer como: '\u0080'..'\ufffe'

+1

Nota: La opción "charVocabulary" no está disponible en antlr3 ya que usa unicode de forma predeterminada. –

5

En términos prácticos, TOKEN: (UNICODE)+ es completamente inútil.

Dado que todo es un carácter simbólico, si intenta utilizar una regla tal para que coincida con un programa Java, por ejemplo, simplemente coincidirá con el programa completo y se lo devolverá como un token grande.

Realmente necesita dividir sus caracteres en diferentes grupos si desea dividir su entrada en fragmentos significativos.

Podría ayudarlo a observar cómo lo han logrado los "profesionales". Aquí es a BNF grammar for Java, y aquí es BNF for an identifier, lo que demuestra cómo tomaron la molestia de grupo a cabo

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