其他令牌中的ANTLR 4词法分析器

时间:2013-05-10 15:39:53

标签: 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,它将被视为我的应用程序中的文字字符串。然后它将[0-9]解析为一个字符集,在这种情况下将转换为任何数字。我的语法对我有用,除了我不喜欢将(CHAR | DASH)+作为解析器规则时,它只是被视为一个令牌。我宁愿lexer创建一个STRING令牌并给我以下令牌:

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

而不是这些

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

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

1 个答案:

答案 0 :(得分:7)

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

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

mode CharSet;

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

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