1

これは、ANTLR4 の文法を簡略化したものです (定数 false を使用して、 false を返すメソッドを置き換えていることに注意してください)。

grammar AnnotProcessor;
    cppCompilationUnit:  content+ EOF;

    content: anything  
           | {false}? .; 

    anything: ANY_CHAR;

    ANY_CHAR: [_a-zA-Z0-9];

私のテスト ファイルには"hello"という単語が 1 つだけ含まれており、テスト結果は次のようになります。

D:\work\antlr4\work>java org.antlr.v4.runtime.misc.TestRig AnnotProcessor cppCompilationUnit -tree in.cpp
line 1:5 no viable alternative at input '<EOF>'
(cppCompilationUnit (content (anything h)) (content (anything e)) (content (anything l)) (content (anything l)) (content (anything o)))

D:\work\antlr4\work>java org.antlr.v4.runtime.misc.TestRig AnnotProcessor cppCompilationUnit -tokens in.cpp
[@0,0:0='h',<1>,1:0]
[@1,1:1='e',<1>,1:1]
[@2,2:2='l',<1>,1:2]
[@3,3:3='l',<1>,1:3]
[@4,4:4='o',<1>,1:4]
[@5,5:4='<EOF>',<-1>,1:5]
line 1:5 no viable alternative at input '<EOF>'

セマンティック述語 (ここではダミーですが) を代替として追加すると、「line 1:5 no viable alternative at input '< EOF >'」と言い続けるのはなぜですか? 偽のセマンティック述語を含む代替を削除すると、期待どおりにエラーが消えます。

PS: antlr-4.0-complete.jar を使用しています

4

1 に答える 1