Я пишу синтаксический анализатор / интерпретатор для языка, подобного C, и мне нужно интерпретировать экранированные символы. Одна из них - это экранированная Юникодом последовательность с этим шаблоном "\ 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", для которой я ожидаю 'e', но вместо этого я получаю '/', что является запасным правилом для всего остального.
Есть ли какое-то волшебное джиу с фрагментами и правилами или что-то, о чем я не знаю?