问题描述
我正在为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}}。
wget -o --quiet https,://www.google.com
解决方法
正如注释中已经提到的那样,字符类内-
中的+-.
被解释为范围运算符。 ,
在该范围内。像这样逃避它:[a-zA-Z0-9@!$^%*&+\-.]+?
此外,词法分析器规则末尾的[ ... ]+?
将始终匹配单个字符。因此[a-zA-Z0-9@!$^%*&+\-.]+?
也可以写成[a-zA-Z0-9@!$^%*&+\-.]