¬<><∪∪は次の特徴を持ったコンパイラ・コンパイラです。
"/*" ( ANY_CHARACTER* - ( ANY_CHARACTER* "*/" ANY_CHARACTER* ) ) "*/"
Addition -> Expression { operand1:expression "+" operand2:term }
Addition ::= expression "+" term
を意味すると同時に、パースの結果をinterface Addition extends Expression { Expression operand1(); Expression operand2(); }
operand1
やoperand2
は、ノードの特定の子をラベル付けする働きがあり、1 * (2 + 3)
は次のように表現されます。
具象構文木は、非終端記号のインスタンスをノードとし、終端記号のインスタンスを葉とする木だと考えることができます。¬<><∪∪における抽象構文木とは、具象構文木から一部のノードを取り除いたものです。取り除かれたノードの子供は、取り除かれたノードの親のノードの子供になります。¬<><∪∪では、ノードを取り除くかどうかは、インスタンスごとにではなく、非終端記号ごとに選択されます。¬<><∪∪では、BNFのプロダクション LHS ::= RHS
に相当する表記は LHS { RHS }
と LHS = RHS;
の2種類があり、後者はノードを構文木から取り除くことを意味します(上の例では、expression
や term
は expression = Addition | Subtraction | term ;
のように定義されていることを想定しています)。後者の等号を用いた表記は、直感的には、左辺の識別子を右辺の式で置き換えるシンタックスシュガーに近いものです(ただし、自己埋め込みが可能です)。抽象構文木のノードは、そのノードをインスタンスとする非終端記号と同名のインターフェイスのオブジェクトで表現され、インターフェイス間に継承関係を設定することができます。ノードの特定の子を、上の operand1
のように、ラベル付けし、インスタンスメソッドによって得ることができます。その戻り値は、ラベル付けされる可能性のあるノードの共通の親の型、あるいは、複数をラベル付けする可能性がある場合 java.util.List
になります(例えば label:expression ( "," label:expression )*
)。