如何在ANTLR 4字符串匹配中排除“和\?

时间:2013-06-01 12:21:31

标签: antlrworks antlr4

我有以下要与规则匹配的字符串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

1 个答案:

答案 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必须是词法分析器规则!