Я просматривал документацию по ANTLR v3 (и мою достоверную копию "The Definitive ANTLR reference"), и я не могу найти чистый способ реализации escape-последовательностей в строковых литералах (сейчас я используя цель Java). Я надеялся, что смогу сделать что-то вроде:
fragment
ESCAPE_SEQUENCE
: '\\' '\'' { setText("'"); }
;
STRING
: '\'' (ESCAPE_SEQUENCE | ~('\'' | '\\'))* '\''
{
// strip the quotes from the resulting token
setText(getText().substring(1, getText().length() - 1));
}
;
Например, я бы хотел, чтобы входной токен "'Foo\'s House'
" стал строкой "Foo's House
".
К сожалению, вызов setText(...)
во фрагменте ESCAPE_SEQUENCE
устанавливает текст для всего токена STRING
, что явно не то, что я хочу.
Есть ли способ реализовать эту грамматику без добавления метода, позволяющего вернуться назад к полученной строке и вручную заменить escape-последовательности (например, на что-то вроде setText(escapeString(getText()))
в правиле STRING
)?