Я пишу синтаксический анализатор / интерпретатор для C-подобного языка, и мне нужно интерпретировать экранированные символы. Одна из них - это последовательность с экранированием Unicode с этим шаблоном «\ uXXXX», где X - некоторое шестнадцатеричное число.
Мои правила ANTLR выглядят так:
public char returns [char c]
: '\\"' { $c = '"'; }
| '\\\\' { $c = '\\'; }
| '\\/' { $c = '/'; }
| '\\b' { $c = '\b'; }
| '\\f' { $c = '\f'; }
| '\\n' { $c = '\n'; }
| '\\r' { $c = '\r'; }
| '\\t' { $c = '\t'; }
| '\\u' HEXDIGIT HEXDIGIT HEXDIGIT HEXDIGIT { $c = 'e'; }
| ~('\\' | '"') { $c = '/'; }
;
fragment HEXDIGIT
: ('0'..'9'|'a'..'f'|'A'..'F')
Я скармливаю ему эту строку «\ u1234», для которой ожидаю «е», но вместо этого получаю «/», которое является резервным правилом для всего остального.
Есть ли какое-то волшебство с фрагментами и правилами или что-то, о чем я не знаю?