ANTLR3:确保角色至少出现在一个位置

ANTLR3:确保角色至少出现在一个位置,antlr,antlr3,Antlr,Antlr3,我试图确保文本中至少包含一个带有通配符的字符 fragment CHARACTER : ('a'..'z'|'0'..'9'|'-'|'&'|'@'|'$'|'%'|'.'|':'); fragment WILDCARD_QUESTION : ('?'); WILD_STRING : (CHARACTER)* ( (WILDCARD_QUESTION) (CHARACTER)* )+; 用这个,哪怕是一个?在我希望

我试图确保文本中至少包含一个带有通配符的字符

fragment CHARACTER : ('a'..'z'|'0'..'9'|'-'|'&'|'@'|'$'|'%'|'.'|':'); 
fragment WILDCARD_QUESTION  : ('?'); 

WILD_STRING 
   : (CHARACTER)* 
     ( 
       (WILDCARD_QUESTION) 
       (CHARACTER)* 
     )+;
用这个,哪怕是一个?在我希望失败的地方被接受。因此,只能传递至少一个字符的序列

我需要的是让
a?
a
a
a
等通过。只有
等才会失败。ie应该至少有一个字符,而不仅仅是通配符问题。该字符可以位于通配符的任意一侧。

将代码更改为只读

    WILD_STRING 
       : (((WILDCARD_QUESTION)+(CHARACTER))|((CHARACTER)+(WILDCARD_QUESTION)))
(WILDCARD_QUESTION|CHARACTER)*
       ; 

这似乎解决了这个问题。

使用两条规则,一条用于前导通配符,另一条用于前导字符:

WILD_STRING : (WILDCARD_QUESTION)+ CHARACTER (CHARACTER | WILDCARD_QUESTION)*
            | (CHARACTER)+ WILDCARD_QUESTION (CHARACTER | WILDCARD_QUESTION)*
            ;

在antlrWorks中尝试了您的解决方案,它在第一个?我下面的解决方案没有做到这一点。我可能还是错了,但它似乎做了我想要的工作。需要进一步测试我很确定这两种解决方案以相同的方式匹配。你可以使用它的每一个。。。但在我看来,我的解决方案更为明确。同意。我也有同样的感觉,甚至会同意你的回答。但当我在AntlrWorks登记时,这些差异出现了。也许你可以检查确认一下?