4

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、:-」

4

2 に答える 2

5

...
つまり、基本的には、次のような構文を探しています:すべてに一致しますが、"0..9,:-"

次のルールは、数字、、、および を除く任意の 1 文字に一致,:ます-

Foo
  :  ~('0'..'9' | ',' | ':' | '-')
  ;

(~レクサールール内の単一文字を否定します)

しかし、文法全体を投稿したくなるかもしれません: あなたがやるべきだったのに、あなたがしていないことが他にもいくつかあるような気がします。あなたの電話。

于 2010-07-12T18:27:39.260 に答える
2

不要なすべての文字に一致するリテラルを定義できます。このリテラルがどのルールにも含まれていない場合、antlr は NonViableException をスローします。

ユニコードの場合、これは次のようになります。

 UTF8 :  ('\u0000'..'\u002A'     // ! to * 
     | '\u002E'..'\u002F'           // . / 
     | '\u003B'..'\u00FF'           // ; < = > ? @ as well as letters brackets and stuff
     ) 
     ;
于 2010-07-09T10:07:52.107 に答える