次の文法を実行すると:
test : WORD+;
WORD : ('a'..'z')+;
WS : ' '+ {$channel = HIDDEN;};
そして私は入力「?test」を与えますなぜantlrはこれを有効な入力として受け入れるのですか?('a' ..'z')は小文字のアルファベット内の文字にのみ一致すると思いましたか?
投稿した文法で入力文字列を解析すると、ANTLRはエラーを生成します。?test
よくあることですが、エラーは ANTLR で使用されているツールにあります (残念ながら、ANTLRWorks でもよく発生します!)。
自分で(適切に)テストするには、ファイルを作成しますTest.g
:
grammar Test;
test : WORD+;
WORD : ('a'..'z')+;
WS : ' '+ {$channel = HIDDEN;};
とファイルMain.java
:
import org.antlr.runtime.*;
public class Main {
public static void main(String[] args) throws Exception {
ANTLRStringStream in = new ANTLRStringStream("?test");
TestLexer lexer = new TestLexer(in);
CommonTokenStream tokens = new CommonTokenStream(lexer);
TestParser parser = new TestParser(tokens);
parser.test();
}
}
ANTLR 3.2 JARのコピーを同じディレクトリにダウンロードします。
レクサーとパーサーを生成します。
java -cp antlr-3.2.jar org.antlr.Tool Test.g
すべての Java ソース ファイルをコンパイルします。
javac -cp antlr-3.2.jar *.java
Main クラスを実行します。
java -cp .:antlr-3.2.jar Main
( Windows の場合は を に:
置き換えてください!);
次のエラー メッセージが表示されます。
line 1:0 no viable alternative at character '?'