ANTLR与unicode转义字符不匹配
我正在为类C语言编写解析器/解释器,需要解释转义字符。其中一个是unicode转义序列,模式为“\uxxx”,其中X是一些十六进制数 我的ANTLR规则如下所示:ANTLR与unicode转义字符不匹配,antlr,antlr3,Antlr,Antlr3,我正在为类C语言编写解析器/解释器,需要解释转义字符。其中一个是unicode转义序列,模式为“\uxxx”,其中X是一些十六进制数 我的ANTLR规则如下所示: public char returns [char c] : '\\"' { $c = '"'; } | '\\\\' { $c = '\\'; } | '\\/' { $c = '/'; } | '\\b' { $c = '\b'; } | '\\f' { $c = '\f'; }
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”,但我得到的是一个“/”,这是其他所有内容的回退规则
是否有一些神奇的jujuju正在使用片段和规则或我不知道的东西?正如Adam所提到的,
char
目前是一个解析器规则,但应该改为一个lexer规则,在这种情况下,您不能让它返回char
(lexer规则总是返回令牌的实例)
您可以使用标记的setText(…)
方法调整标记的内部文本,如下所示(假设Java是目标语言):
片段应该只在lexer规则中使用,但“char”看起来像一个解析器规则。啊,对了,我把HEXNUMBER作为HEXDIGIT的四项序列。不知道为什么ANTLR不抱怨在这种情况下HEXDIGIT和DIGIT之间的重叠。。。
// 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')
;