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より確実にきれいな感じ。