如何使用ANTLR语法排除字符/符号?

如何使用ANTLR语法排除字符/符号?,antlr,antlr3,Antlr,Antlr3,我正在尝试使用ANTLR为各种时间格式(12:300945,1:30-2:45,…)编写语法。到目前为止,只要我不输入语法文件中未定义的字符,它就可以像一个符咒一样工作 例如,我使用以下JUnit测试: final CharStream stream = new ANTLRStringStream("12:40-1300,15:123-18:59"); final TimeGrammarLexer lexer = new TimeGrammarLexer(stream);

我正在尝试使用ANTLR为各种时间格式(12:300945,1:30-2:45,…)编写语法。到目前为止,只要我不输入语法文件中未定义的字符,它就可以像一个符咒一样工作

例如,我使用以下JUnit测试:

    final CharStream stream = new ANTLRStringStream("12:40-1300,15:123-18:59");
    final TimeGrammarLexer lexer = new TimeGrammarLexer(stream);
    final CommonTokenStream tokenStream = new CommonTokenStream(lexer);
    final TimeGrammarParser parser = new TimeGrammarParser(tokenStream);

    try {
        final timeGrammar_return tree = parser.timeGrammar();
        fail();
    } catch (final Exception e) {
        assertNotNull(e);
    }
由于“15:123”无效,将引发异常(如预期的那样)。 但如果我尝试(“15:23a”),则不会抛出异常,ANTLR会将其视为有效输入

现在,如果我在语法中定义字符,ANTLR似乎会注意到它们,我再次得到我想要的异常:

  CHAR: ('a'..'z')|('A'..'Z');

但是我如何排除用户能够输入的元音、符号和其他东西(äöü{%&!)。所以基本上我在寻找某种语法,它说:匹配除“0..9,:-”之外的所有内容

您可以定义一个与您不需要的所有字符匹配的文本。如果您的任何规则中都不包含该文本,antlr将抛出非IABLEEException

对于unicode,这可能如下所示:

 UTF8 :  ('\u0000'..'\u002A'     // ! to * 
     | '\u002E'..'\u002F'           // . / 
     | '\u003B'..'\u00FF'           // ; < = > ? @ as well as letters brackets and stuff
     ) 
     ;
UTF8:('\u0000'..'\u002A'/!to*
|'\u002E'..'\u002F'/./
|'\u003B'..'\u00FF'//;<=>?@以及字母、括号等
) 
;

因此,基本上我在寻找一种语法,它说:匹配所有内容,但
“0..9,:-”

以下规则匹配除数字、
-
之外的任何单个字符:

Foo
  :  ~('0'..'9' | ',' | ':' | '-')
  ;
(lexer规则中的
~
对单个字符求反)

但是你可能想发布你的全部语法:我得到的印象是,还有一些事情你没有做得像他们应该做的那样。你的电话