9

我对 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)+在它被简单地视为标记时作为解析器规则。我宁愿词法分析器创建一个STRING标记并给我以下标记:

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

而不是这些

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

我查看了其他示例,但无法弄清楚。通常,其他示例在此类字符串文字周围有引号,或者它们有空格来帮助分隔输入。我想避免两者。这可以通过词法分析器规则来完成,还是我需要像我正在做的那样继续在解析器规则中处理它?

4

1 回答 1

8

在 ANTLR 4 中,您可以为此使用词法分析器模式。

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

mode CharSet;

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

解析一个[字符后,词法分析器将在模式下运行,CharSet直到]到达一个字符并popMode执行命令。

于 2013-05-10T16:26:21.483 回答