我有下面的字符串,我想匹配的规则,stringLiteral:
"D:\Downloads\Java\MyFile"
我的语法是file: String。G4,如下:
grammar String;
fragment
HexDigit : ('0'..'9'|'a'..'f'|'A'..'F') ;
stringLiteral
: '"' ( EscapeSequence | XXXXX )* '"'
;
fragment
EscapeSequence
: '\' ('b'|'t'|'n'|'f'|'r'|'"'|'''|'\')
| UnicodeEscape
| OctalEscape
;
fragment
OctalEscape
: '\' ('0'..'3') ('0'..'7') ('0'..'7')
| '\' ('0'..'7') ('0'..'7')
| '\' ('0'..'7')
;
fragment
UnicodeEscape
: '\' 'u' HexDigit HexDigit HexDigit HexDigit
;
我应该在XXXXX位置放什么来匹配任何不是或"?
我尝试了以下操作,但都不起作用:
~['\'"']
~['\'"']
~["]
~["\]
~('"'|'\')
~[\"]
我正在使用ANTLRWorks 2来尝试这个。错误如下:
D:DownloadsANTLRString.g4 line 26:5 mismatched character '<EOF>' expecting '"'
error(50): D:DownloadsANTLRString.g4:26:5: syntax error: '<EOF>' came as a complete surprise to me while looking for rule element
在字符类中,只需要转义反斜杠:
下面的是非法的,它转义了]
:
[]
下面匹配一个反斜杠:
[\]
下面匹配一个引号:
["]
下面匹配反斜杠或引号:
[\"]
在v4样式中,您的语法看起来像这样:
grammar String;
/* other rules */
StringLiteral
: '"' ( EscapeSequence | ~[\"] )* '"'
;
fragment
HexDigit
: [0-9a-fA-F]
;
fragment
EscapeSequence
: '\' [btnfr"'\]
| UnicodeEscape
| OctalEscape
;
fragment
OctalEscape
: '\' [0-3] [0-7] [0-7]
| '\' [0-7] [0-7]
| '\' [0-7]
;
fragment
UnicodeEscape
: '\' 'u' HexDigit HexDigit HexDigit HexDigit
;
注意不能在解析器规则中使用片段:StringLiteral
必须是词法分析器规则!