この形式のファイルを読み取るための単純な構成ファイルリーダーを構築しようとしています。
A .-
B -...
C -.-.
D -..
E .
これは私がこれまでに持っている文法です:
grammar def;
@header {
package mypackage.parser;
}
@lexer::header { package mypackage.parser; }
file
: line+;
line : ID WS* CODE NEWLINE;
ID : ('A'..'Z')*
;
CODE : ('-'|'.')*;
COMMENT
: '//' ~('\n'|'\r')* '\r'? '\n' {$channel=HIDDEN;}
| '/*' ( options {greedy=false;} : . )* '*/' {$channel=HIDDEN;}
;
WS : ( ' '
| '\t'
) {$channel=HIDDEN;}
;
NEWLINE:'\r'? '\n' ;
そしてこれは私のテストリグです(junit4)
@Test
public void BasicGrammarCheckGood() {
String CorrectlyFormedLine="A .-;\n";
ANTLRStringStream input;
defLexer lexer;
defParser parser;
input = new ANTLRStringStream(CorrectlyFormedLine);
lexer = new defLexer(input);
CommonTokenStream tokens = new CommonTokenStream(lexer);
parser = new defParser(tokens);
try {
parser.line();
}
catch(RecognitionException re) { fail(re.getMessage()); }
}
修正されたフォーマットされた文字列を使用してこのテストを正しく実行すると、コードは例外や出力なしで終了します。
ただし、「xA .-; \ n」のような無効な文字列をパーサーにフィードすると、コードはしばらく回転し、「Javaヒープスペース」で終了します。
(トップレベルのルール「ファイル」でテストを開始すると、同じ結果が得られます。「行1:0の不一致の入力」の追加の(繰り返される)出力がCODEを期待しています)
ここで何が問題になっていますか?無効な出力に対して「RecognitionException」が発生することはありませんか?
編集:ここにアドバイスが提供された後、これが私の文法ファイル(フラグメント)です-これにより、「Javaヒープスペース」の問題が回避されます。
file
: line+ EOF;
line : ID WS* CODE NEWLINE;
ID : ('A'..'Z')('A'..'Z')*
;
CODE : ('-'|'.')('-'|'.')*;