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登记时,这些差异出现了。也许你可以检查确认一下?