我对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] ;
Run Code Online (Sandbox Code Playgroud)
我正在尝试解析以下字符串
ab-cd[0-9]
Run Code Online (Sandbox Code Playgroud)
代码解析ab-cd左边的部分,它将在我的应用程序中被视为文字字符串.然后它解析[0-9]为一个字符集,在这种情况下将转换为任何数字.我的语法对我有用,除了我不喜欢(CHAR | DASH)+作为解析器规则时,它只是被视为一个令牌.我宁愿lexer创建一个STRING令牌并给我以下令牌:
"ab-cd" "[" "0" "-" "9" "]"
Run Code Online (Sandbox Code Playgroud)
而不是这些
"ab" "-" "cd" "[" "0" "-" "9" "]"
Run Code Online (Sandbox Code Playgroud)
我看过其他例子,但一直无法弄清楚.通常其他示例在这些字符串文字周围有引号,或者它们有空格来帮助分隔输入.我想避免两者.这可以用词法规则来完成,还是我需要继续在解析器规则中处理它,就像我正在做的那样?
在ANTLR 4中,您可以使用词法分析器模式.
STRING : [a-z-]+;
LBRACK : '[' -> pushMode(CharSet);
mode CharSet;
DASH : '-';
NUMBER : [0-9]+;
RBRACK : ']' -> popMode;
Run Code Online (Sandbox Code Playgroud)
解析一个[字符后,词法分析器将以模式运行,CharSet直到]到达一个字符并popMode执行该命令.