簡単に解析できると思った簡単な文法テストを次に示しますが、すぐに「不一致の入力」が表示され、Antlr が何を探しているのかわかりません。
入力:
# include "something" program TEST1 { BLAH BLAH }
私の文法:
grammar ProgHeader;
program: header* prog EOF ;
header: '#' ( include | define ) ;
include: 'include' string ;
define: 'define' string string? ;
string: '"' QTEXT '"' ;
prog: 'program' QTEXT '{' BLOCK '}' ;
QTEXT: ~[\r\n\"]+ ;
BLOCK: ~[}]+ ; // don't care, example block
WS: [ \t\r\n] -> skip ;
出力エラー メッセージ:
line 1:0 mismatched input '# include "something" program TEST1 { BLAH BLAH '
expecting {'program', '#'}
「#」を探していると表示され、入力の最初に 1 つあるため、これは本当に混乱します。解析ツリーも捨てました。「プログラム」ルールで、一番上にスタックしているように見えます。
(program # include "something" program TEST1 { BLAH BLAH } )
ハーフ?
重要な場合は、このテスト ケースを実行する完全なプログラムを次に示します (重要ではないと思います。上記の情報で十分ですが、ここにあります)。
package antlrtests;
import antlrtests.grammars.*;
import org.antlr.v4.runtime.*;
import org.antlr.v4.runtime.tree.*;
/**
*
* @author Brenden Towey
*/
public class ProgHeaderTest {
private String[] testVectors = {
"# include \"something\" program TEST1 { BLAH BLAH } ",
};
public void runTests() {
for( String test : testVectors )
simpleTest( test );
}
private void simpleTest( String test ) {
ANTLRInputStream ains = new ANTLRInputStream( test );
ProgHeaderLexer wpl = new ProgHeaderLexer( ains );
CommonTokenStream tokens = new CommonTokenStream( wpl );
ProgHeaderParser wikiParser = new ProgHeaderParser( tokens );
ParseTree parseTree = wikiParser.program();
System.out.println( "'" + test + "': " + parseTree.toStringTree(
wikiParser ) );
}
}
そして完全な出力:
run:
line 1:0 mismatched input '# include "something" program TEST1 { BLAH BLAH ' expecting {'program', '#'}
'# include "something" program TEST1 { BLAH BLAH } ': (program # include "something" program TEST1 { BLAH BLAH } )
BUILD SUCCESSFUL (total time: 0 seconds)