Antlr4 ANTLR 4 lexer令牌在其他令牌中

Antlr4 ANTLR 4 lexer令牌在其他令牌中,antlr4,Antlr4,我对ANTLR 4有以下语法: grammar Pattern; //parser rules parse : string LBRACK CHAR DASH CHAR RBRACK ; string : (CHAR | DASH)+ ; //lexer rules DASH : '-' ; LBRACK : '[' ; RBRACK : ']' ; CHAR : [A-Za-z0-9] ; 我正试图解析以下字符串 ab-cd[0-9] 代码解析出左边的ab cd,

我对ANTLR 4有以下语法:

grammar Pattern;

//parser rules
parse   : string LBRACK CHAR DASH CHAR RBRACK ;
string  : (CHAR | DASH)+ ;

//lexer rules
DASH    : '-' ;
LBRACK  : '[' ;
RBRACK  : ']' ;
CHAR    : [A-Za-z0-9] ;
我正试图解析以下字符串

ab-cd[0-9]
代码解析出左边的
ab cd
,在我的应用程序中将其视为文本字符串。然后它将
[0-9]
解析为一个字符集,在本例中,该字符集将转换为任何数字。我的语法对我来说是有效的,但我不喜欢将
(CHAR | DASH)+
作为语法分析器规则,因为它只是被当作一个标记。我希望lexer创建一个
字符串
标记,并给我以下标记:

"ab-cd" "[" "0" "-" "9" "]"
而不是这些

"ab" "-" "cd" "[" "0" "-" "9" "]"

我看过其他的例子,但还没有弄明白。通常,其他示例在此类字符串文本周围有引号,或者有空格来帮助分隔输入。我想避免两者。这可以通过lexer规则来实现,还是需要像我现在这样继续在解析器规则中处理它?

在ANTLR 4中,可以使用lexer模式来实现这一点

STRING : [a-z-]+;
LBRACK : '[' -> pushMode(CharSet);

mode CharSet;

DASH : '-';
NUMBER : [0-9]+;
RBRACK : ']' -> popMode;

解析
[
字符后,lexer将在模式
字符集
下运行,直到到达
]
字符并执行
popMode
命令。

感谢您的帮助。像这样设置次Kenizer听起来是一个完美的解决方案。尽管声明
词法模式仅在lexer语法中允许,但我还是遇到了一个错误。我可以将我的语法声明为
lexer grammar IdPattern,但我不能使用解析器规则。我缺少什么?您需要为您的lexer使用
lexer语法
,为您的解析器使用单独的
解析器语法
(在单独的文件中)。以下是一个可以帮助其他人的链接: