4

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

1 回答 1

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

于 2013-06-01T12:32:13.577 回答