私は .java ファイルに ANTLR 3 のパーサーとレクサーの Java ソース コードを持っており、すべてのルールなどの背後にある実際の文法を確認したいと考えています。
それは可能ですか?
一部の自動ツール(AFAIK)によるものではありません。ただし、生成されたソース ファイルのコメントには、元の文法のパーサーとレクサーの規則が含まれているため、自分で簡単にリバース エンジニアリングを行うことができます。
たとえば、次のダミー文法を取ります。
grammar T;
parse
: foo
| bar
| OTHER
;
foo : INT ;
bar : ALPHA ;
INT : '0'..'9'+ ;
ALPHA : ('a'..'z' | 'A'..'Z')+ ;
OTHER : . ;
そこからレクサーとパーサーを生成すると、パーサーは次のようになります。
public class TParser extends Parser {
// $ANTLR start "parse"
// T.g:3:1: parse : ( foo | bar | OTHER );
public final void parse() throws RecognitionException {
...
}
// $ANTLR end "parse"
// $ANTLR start "foo"
// T.g:9:1: foo : INT ;
public final void foo() throws RecognitionException {
...
}
// $ANTLR end "foo"
// $ANTLR start "bar"
// T.g:10:1: bar : ALPHA ;
public final void bar() throws RecognitionException {
...
}
// $ANTLR end "bar"
}
レクサーは次のようになります。
public class TLexer extends Lexer {
// $ANTLR start "INT"
public final void mINT() throws RecognitionException {
// T.g:12:7: ( ( '0' .. '9' )+ )
...
}
// $ANTLR end "INT"
// $ANTLR start "ALPHA"
public final void mALPHA() throws RecognitionException {
// T.g:13:7: ( ( 'a' .. 'z' | 'A' .. 'Z' )+ )
...
}
// $ANTLR end "ALPHA"
// $ANTLR start "OTHER"
public final void mOTHER() throws RecognitionException {
// T.g:14:7: ( . )
...
}
// $ANTLR end "OTHER"
}
ご覧のとおり、すべての文法規則は .java ソース ファイルのコメント内にあります。