词法定义中有一些与通配符“.”有关的注意事项,下面给出一个示例。
d : C ANY PLUS;
C : 'c';
PLUS : '+';
ANY : ( options {greedy=false;} : . ) *;
这个文法是要匹配输入字符“c”和“+”,字符“c”与“+”之间可以是一些不确定的内容所以用通配符“.”进行匹配,如前面学到的应该使用greedy=false设置。但是此文法运行时会出现死循环情况。我们可以使用其它方法改写定义,由于字符“c”与“+”之间不应该出现“c”与“+”字符,所以ANY规则可以修改成以下的定义方法。
ANY : ~(C | PLUS)*;
不过如何正确使用“.”通配符呢?在使用通配符定义规则时要在当前的规则中明确的指定开始和结束字符。前面的示例中定义/**/注释时就是指定了开始结束字符。本示例只能改成:
d : CANYPLUS;
CANYPLUS : ‘c’ (options {greedy=false;} : . ) * ‘+’;
所以“.”的使用范围是有限的。