为什么逗号“,”会在antlr lexer的[]类型表达式中计数

问题描述

我正在为bash脚本编写语法。我在标记“,”符号时遇到问题。以下语法将其标记<BLOB>,而我希望将其标记<OTHER>

grammar newgram;

code                : KEY (BLOB)+   (EOF | '\n')+;

KEY                 : 'wget';

BLOB                : [a-zA-Z0-9@!$^%*&+-.]+?;

OTHER               : .;

但是,如果我将BLOB设为[a-zA-Z0-9@!$^%*&+.-]+?;,则将其标记<OTHER>

我不明白为什么会这样发生。

在前一种情况下,字符:/也被标记<OTHER>,因此我看不到,标记为{{ 1}}。

输入我正在标记<BLOB> 我收到的上述语法输出

wget -o --quiet https,://www.google.com

解决方法

正如注释中已经提到的那样,字符类内-中的+-.被解释为范围运算符。 ,在该范围内。像这样逃避它:[a-zA-Z0-9@!$^%*&+\-.]+?

此外,词法分析器规则末尾的[ ... ]+?将始终匹配单个字符。因此[a-zA-Z0-9@!$^%*&+\-.]+?也可以写成[a-zA-Z0-9@!$^%*&+\-.]