我正在为类C语言编写解析器/解释器,我需要解释转义字符。其中一个是具有此模式“\ uXXXX”的unicode转义序列,其中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',但我得到一个'/',这是其他一切的后备规则。
是否有一些神奇的juju正在进行碎片和规则或我不知道的事情?
答案 0 :(得分:1)
正如Adam所提到的,char
目前是一个解析器规则,但应该成为词法分析器规则,在这种情况下你不能让它返回char
(lexer规则总是返回Token
的实例!)。
您可以使用setText(...)
方法调整令牌的内部文本(假设Java是目标语言):
// lexer rules start with a capital!
Char
: '\\"' { setText("\""); }
| '\\\\' { setText("\\"); }
| '\\/' { setText("/"); }
| '\\b' { setText("\b"); }
| '\\f' { setText("\f"); }
| '\\n' { setText("\n"); }
| '\\r' { setText("\r"); }
| '\\t' { setText("\t"); }
| '\\u' HEXDIGIT HEXDIGIT HEXDIGIT HEXDIGIT
{
String hex = getText();
int i = Integer.parseInt(hex.substring(2), 16);
setText(hex + " base 10 = " + i);
}
| ~('\\' | '"')
;
fragment HEXDIGIT
: ('0'..'9'|'a'..'f'|'A'..'F')
;