2

私はツリー文法を持っています。文法の一部を以下に示します

transitions
    :'transitions' '=' INT ('(' INT ',' INT ')') + ';' -> ^(TRANSITIONS INT INT INT*)
    ;

これがツリーパーサー文法のそれぞれの部分です。

transitions
    :^(TRANSITIONS INT INT INT*)
    {System.out.println("");}
    ;

私は+書き換えルールを使用しましたが、それは基本的に繰り返しです。上記の文法では、ユーザーは最小 3 つの整数値を入力しています。

  transitions 1 (5,0)

2 番目に可能な入力

transitions 2 (5,0) (5,1)

3 番目に可能な入力

transitions 3 (5,0) (5,1) (5,2)

等々。
最初の整数は、存在する整数のペアの数を決定します。問題は、パーサー文法でこれらの整数入力にアクセスする方法と、上記の println ステートメントでこれらを印刷する方法です。

私の質問ANTLR Java test file can't create object of tree grammar for the complete grammar for I have written. を参照してください。

4

1 に答える 1

2

別のルールで数字の「ペア」を保持することをお勧めします。

パーサー文法

transitions
 : 'transitions' '=' INT pair+ ';' -> ^(TRANSITIONS INT pair+)
 ;

pair
 : '(' INT ',' INT ')' -> ^(PAIR INT INT)
 ;

木の文法

transitions
 : ^(TRANSITIONS INT pair+) {System.out.println("transitions.INT=" + $INT.text);}
 ;

pair
 : ^(PAIR a=INT b=INT) {System.out.println("pair=" + $a.text + ", " + $b.text);}
 ;

編集

簡単なデモ:

grammar T;

options {
  output=AST;
  ASTLabelType=CommonTree;
}

tokens {
  TRANSITIONS;
  PAIR;
}

parse
 : transitions EOF!
   {
     CommonTree root = $transitions.tree;

     int count = root.getChildCount();

     Tree child1 = root.getChild(0);
     Tree child2 = root.getChild(1);
     Tree child3 = root.getChild(2);
     Tree child4 = root.getChild(3);

     System.out.println("root=" + root.getToken().getText() + " has " + count + " child nodes:");
     System.out.println(" - child1=" + child1.toStringTree());
     System.out.println(" - child2=" + child2.toStringTree());
     System.out.println(" - child3=" + child3.toStringTree());
     System.out.println(" - child4=" + child3.toStringTree());

     String secondValueFromLastPair = child4.getChild(1).getText();
     System.out.println("\nsecondValueFromLastPair=" + secondValueFromLastPair);
   }
 ;

transitions
 : 'transitions' '=' INT pair+ ';' -> ^(TRANSITIONS INT pair+)
 ;

pair
 : '(' INT ',' INT ')' -> ^(PAIR INT INT)
 ;

INT   : '0'..'9'+;
SPACE : ' ' {skip();};

入力を解析する"transitions = 3(5,0) (5,1) (5,2);"と、次のようにコンソールに出力されます。

root=TRANSITIONS には 4 つの子ノードがあります。
 - 子1=3
 - child2=(ペア 5 0)
 - child3=(ペア 5 1)
 - child4=(ペア 5 1)

secondValueFromLastPair=2
于 2012-10-24T20:43:11.150 に答える