我正在尝试使用 ANTLR 为各种时间格式(12:30、0945、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,:-”
最佳答案
...
So basically I'm looking for some kind of syntax that says: match everything BUT"0..9,:-"
以下规则匹配除数字之外的任何单个字符,
,
, :
和 -
:Foo
: ~('0'..'9' | ',' | ':' | '-')
;
(
~
否定词法分析器规则中的单个字符)但是您可能想要发布您的整个语法:我的印象是还有一些其他事情您没有做,因为它们应该做。您的来电。
关于antlr - 如何使用 ANTLR 语法排除字符/符号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3211606/