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

标签 antlr antlr3

我正在尝试使用 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/

相关文章:

java - antlr4 Java获取标记图?

antlr3 - 如何在命令行中运行ANTLR 3.4?

java - 获取 ANTLR3 中复合规则的词位

asp.net-mvc - 更新部署文件后 Antlr3.runtime 访问被拒绝

error-handling - “no viable alternative”消息如何重定向?

javascript - ANTLR:如何在算术运算中允许 boolean 值

java - ANTLR:有一个简单的例子吗?

nlp - Antlr 与 Jython 中的 NLTK

eclipse - Eclipse 不自动生成解析器和词法分析器文件

java - Antlr3 解析表达式时报 java.lang.OutOfMemoryError