1

私は、他の誰かが書いている ANTLR 文法用の Java アナライザーを作成中です。

ANTLR ファイルを結合して、元の文法 (.g) ファイルとは別のファイルを介して、括弧で囲まれた Java コードを ANTLR で生成された Java ファイルに追加することはできますか? 複合文法を調査しましたが、既存の文法を結合されたレクサー/パーサーとしてインポートできるようには見えません。

たとえば、次のようなことができますか。

Grammar.g

grammar Grammar;

statement   : first=WORD ';' ;
WORD        : ('A'..'z')* ;

JavaGrammar.g

grammar JavaGrammar;
imports Grammar;

@header {
    package pkg;
    import Container;
}

@lexer::header {
    package pkg;
}

@members{
    Container c = null;
    public void setContainer(Container c) { this.c = c; }

    @Override
    protected Object recoverFromMismatchedToken(IntStream input, int ttype, BitSet follow) throws RecognitionException {
      throw new MismatchedTokenException(ttype, input);
    }

    @Override
    public Object recoverFromMismatchedSet(IntStream input, RecognitionException e, BitSet follow) throws RecognitionException {
      throw e;
    }
}

@rulecatch {
    catch (RecognitionException e) {
        throw e;
    }
}

jStatement: statement { if(c!=null) c.add($first.text); } ;
4

1 に答える 1

0

結合された文法をインポートすることはできません(それはimport、ところで、では​​ありません)。importsANTLR ウィキを参照してください。

結合された文法は、結合された文法をインポートしない場合があることに注意してください。これはインポートの深さを制限しているように見えるかもしれませんが、そうではありません。パーサー文法は、依存するレクサー文法を明示的にインポートする必要はありません。これは、依存文法を「接着」するルート複合文法で一度だけ行われます。

-- http://www.antlr.org/wiki/display/ANTLR3/Composite+Grammers

firstまた、ラベルが存在するstatementルールの外で(ルール内の) ラベルを使用することはできません。

あなたができることはこれです:

ファイル: Lg

lexer grammar L;

WORD : ('A'..'z')* ;
SCOL : ';';

ファイル: Pg

parser grammar P;

statement returns[String first, String last]
 : WORD SCOL
   {
     $first = $WORD.text;
     $last = $SCOL.text;
   }
 ;

ファイル: JavaGrammar.g

grammar JavaGrammar;

import P, L;

@parser::members {
  public static void main(String[] args) throws Exception {
    L lexer = new L(new ANTLRStringStream("SO;"));
    JavaGrammarParser parser = new JavaGrammarParser(new CommonTokenStream(lexer));
    parser.jStatement(); 
  }
}

jStatement
 : statement 
   {
     System.out.println("statement       = '" + $statement.text + "'\n" + 
                        "statement.first = '" + $statement.first + "'\n" + 
                        "statement.last  = '" + $statement.last + "'");
   } 
 ;

main メソッドを使用してクラスを実行します。

java -cp antlr-3.3-complete.jar org.antlr.Tool *.g
javac -cp antlr-3.3-complete.jar *.java
java -cp .:antlr-3.3-complete.jar JavaGrammarParser

次のようにコンソールに表示されます。

statement       = 'SO;'
statement.first = 'SO'
statement.last  = ';'
于 2012-07-19T07:03:10.207 に答える