0

ANTLR: 簡単な例はありますか? 、antlr3に関する質問、受け入れられた回答には次の文法があります:

grammar Exp;

eval returns [double value]
    :    exp=additionExp {$value = $exp.value;}
    ;

additionExp returns [double value]
    :    m1=multiplyExp       {$value =  $m1.value;} 
         ( '+' m2=multiplyExp {$value += $m2.value;} 
         | '-' m2=multiplyExp {$value -= $m2.value;}
         )* 
    ;

multiplyExp returns [double value]
    :    a1=atomExp       {$value =  $a1.value;}
         ( '*' a2=atomExp {$value *= $a2.value;} 
         | '/' a2=atomExp {$value /= $a2.value;}
         )* 
    ;

atomExp returns [double value]
    :    n=Number                {$value = Double.parseDouble($n.text);}
    |    '(' exp=additionExp ')' {$value = $exp.value;}
    ;

Number
    :    ('0'..'9')+ ('.' ('0'..'9')+)?
    ;

WS  
    :   (' ' | '\t' | '\r'| '\n') {$channel=HIDDEN;}

この属性を使用し$valueて、解析ツリーに情報を渡します。

私はantlr4と同じことをしたい。$value属性がなくなったようです。カスタム属性をルールに追加して、解析ツリーに情報を渡すにはどうすればよいですか? それが私が望むことを達成するための正しいメカニズムではない場合、同様のことを達成するためにどのようなメカニズムがありますか?


次のように、ローカルを使用してみました。

/* Store each row in an ArrayList */
row
  locals [
  ArrayList<String> cells = null
  ]
  : partial_row RowSeparator
  {
    $cells = $partial_row.cells;
  }
  ;

partial_row
  locals [
    ArrayList<String> cells = null
  ]
  : Cell
  { 
    $cells = new java.util.ArrayList<String>();
    $cells.add($Cell.text);
  }
  | partial_row Cell
  {
    $cells = $partial_row.cells;
    $cells.add($Cell.text);
  }
  ;

しかし、これは機能せず、次のエラーが表示されます。

error(65): csce322a1p2.g:70:24: unknown attribute 'cells' for rule 'partial_row' in '$partial_row.cells'
4

2 に答える 2

1

地元ではなく「リターン」を求めていると思います。また、それはうまくいくはずです。私のテストは動作します:

行ローカル [ ArrayList セル = null ] : AB { $cells = $A; };

于 2013-10-12T15:35:02.437 に答える
0

の代わりに、 and を使用しlocalsたい:@initreturns

row returns [java.util.ArrayList<String> cells]
  @init {
    java.util.ArrayList<String> cells = null;
  }
  : partial_row RowSeparator
  {
    $cells = $partial_row.cells;
  }
  ;

partial_row returns [java.util.ArrayListArrayList<String> cells]
  @init {
  java.util.ArrayListArrayList<String> cells = null;
  }
  : Cell
  { 
    $cells = new java.util.ArrayList<String>();
    $cells.add($Cell.text);
  }
  | partial_row Cell
  {
    $cells = $partial_row.cells;
    $cells.add($Cell.text);
  }
  ;
于 2013-10-12T03:01:02.890 に答える