我有以下要与规则匹配的字符串stringLiteral:
"D:\\Downloads\\Java\\MyFile"
我的语法是文件: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:\Downloads\ANTLR\String.g4 line 26:5 mismatched character '<EOF>' expecting '"'
error(50): D:\Downloads\ANTLR\String.g4:26:5: syntax error: '<EOF>' came as a complete surprise to me while looking for rule element
答案 0 :(得分:4)
在角色类中,您只需要转义反斜杠:
以下是非法,它会转义]
:
[\]
以下内容与反斜杠匹配:
[\\]
以下内容与引用相符:
["]
以下匹配反斜杠或引号:
[\\"]
在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
必须是词法分析器规则!