Piszę parser/interpreter dla języka podobnego do C i muszę zinterpretować znaki ucieczki. Jednym z nich jest sekwencja unicode z tym wzorcem „\uXXXX”, gdzie X jest liczbą szesnastkową.
Moje zasady ANTLR wyglądają tak:
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')
Podaję mu ten ciąg „ሴ”, dla którego oczekuję „e”, ale zamiast tego otrzymuję „/”, który jest regułą awaryjną dla wszystkiego innego.
Czy dzieje się jakieś magiczne juju z fragmentami i zasadami, czy coś, czego nie jestem świadomy?