He estado buscando en la documentación de ANTLR v3 (y en mi fiel copia de "La referencia definitiva ANTLR"), y parece que no puedo encontrar una manera limpia de implementar secuencias de escape en literales de cadenas (actualmente estoy usando el objetivo de Java). Tenía la esperanza de ser capaz de hacer algo como:Cómo manejar secuencias de escape en literales de cadena en ANTLR 3?
fragment
ESCAPE_SEQUENCE
: '\\' '\'' { setText("'"); }
;
STRING
: '\'' (ESCAPE_SEQUENCE | ~('\'' | '\\'))* '\''
{
// strip the quotes from the resulting token
setText(getText().substring(1, getText().length() - 1));
}
;
Por ejemplo, me gustaría que el token de entrada "'Foo\'s House'
" para convertirse en la cadena "Foo's House
".
Desafortunadamente, la llamada setText(...)
en el fragmento ESCAPE_SEQUENCE
establece el texto para el token completo STRING
, que obviamente no es lo que quiero.
¿Hay alguna manera de implementar esta gramática sin agregar un método para volver a través de la cadena resultante y reemplazar manualmente las secuencias de escape (por ejemplo, con algo como setText(escapeString(getText()))
en la regla)?
Usé este enfoque, pero tenga en cuenta que tuve que agregar "getText()" en lugar de "escaped.getText()" en cada paso. El fragmento escribe el texto sin esparcir en todo el token de STRING, que getText() devuelve. Para mí, escaped.getText() devuelve el fragmento original con las barras invertidas intactas. –