ANTLR(6) - 属性文法

合成属性と継承属性が使える模様。

grammar Attributes;

@header {
package research;
}

@lexer::header {
package research;
}

start
  : left=a right=a add[left, right]
    {
      System.out.println($add.result + " = " + $add.value);
    }
  ;

a returns[int result]
  : '100' { $result = 100; }
  | '200' { $result = 200; }
  ;

add
    [int left, int right]
    returns [String result, int value]
  : '+'
    {
      $result = $left + " + " + $right;
      $value = $left + $right;
    }
  ;

WS
  : ( ' ' | '\t' | '\r' | '\n' ) { skip(); }
  ;
  • [ルールの定義]: [,...] returns[,...] : ...
    • ルールに継承属性と合成属性を宣言
  • [ルールの利用]: [,...]
    • ルールの呼び出し時に継承属性を付与
  • [Action] { ...; ... $hoge. ...; }
    • 継承属性を利用
  • [Action] { ... $ = ...; }
    • 合成属性を設定

yaccより確実にきれいな感じ。