2

私は .java ファイルに ANTLR 3 のパーサーとレクサーの Java ソース コードを持っており、すべてのルールなどの背後にある実際の文法を確認したいと考えています。

それは可能ですか?

4

1 に答える 1

4

一部の自動ツール(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 ソース ファイルのコメント内にあります。

于 2013-01-25T22:31:50.070 に答える