2011-06-09 50 views
0

我想確保至少一個字符包括在使用通配符ANTLR3:確保字符出現在至少在一個地方

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

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

使用這甚至單個的文本?被我接受,因爲我希望它失敗。所以只有至少有一個字符應該被傳遞的序列。

我需要的是a?,?a,?a?,a?a等通過。只有?,??等應該會失敗。即至少應該有一個字符,而不僅僅是WILDCARD_QUESTION。角色可以位於通配符的任一側。

回答

1

兩個規則,一個領導通配符和一個領導人物做它:

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

想你的解決方案antlrWorks和它打破w^?? m×n個進入第一後部分輸入?以下我的解決方案不會那樣做。我可能仍然是錯的,但它似乎做我想要的工作。需要進一步測試 – Puneet 2011-06-10 06:38:38

+0

我很確定這兩種解決方案都是相同的。你可以使用它的每一個...但在_my_的意見我的解決方案有點更清晰;)。 – Arne 2011-06-10 06:44:27

+0

同意。我感覺同樣的事情,甚至會批准你的答案。但是當我檢查AntlrWorks時,這些差異就出現了。也許你可以檢查並確認? – Puneet 2011-06-10 08:26:17

0

改變的代碼讀取

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

這似乎解決了問題。

相關問題