¬<><∪∪は次の特徴を持ったコンパイラ・コンパイラです。
"/*" ( 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
は、expression
や term
に対応する式オブジェクトを返します。1 * (2 + 3)
は次のように表現されます。
具象構文木は、終端記号のインスタンスを葉とし、非終端記号のインスタンスを葉以外のノードとする木だと考えることができます。¬<><∪∪における抽象構文木とは、具象構文木から一部のノードを取り除いたものです。取り除かれたノードの子供は、取り除かれたノードの親のノードの子供になります。¬<><∪∪では、ノードを取り除くかどうかは、インスタンスごとにではなく、非終端記号ごとに選択されます。¬<><∪∪では、BNFのプロダクション LHS ::= RHS
に相当する表記は LHS { RHS }
と LHS = RHS;
の2種類があり、後者で定義される非終端記号のインスタンスを構文木から取り除きます。具体的には、次の¬<><∪∪コード(部分)
expression = Addition | Subtraction | term ; Addition -> Expression { operand1:expression "+" operand2:term } Subtraction -> Expression { operand1:expression "-" operand2:term } term = Multiplication | Division | factor ; Multiplication -> Expression { operand1:term "*" operand2:factor } Division -> Expression { operand1:term "/" operand2:factor } factor = "(" $label:expression ")" | $label:Number ; Number -> Expression { value:INTEGER }
に基づき作られる 1 * (2 + 3)
の具象構文木は次のようになり、LHS = RHS;
の形式で定義される非終端記号(破線の矩形で表されています)を取り除くことで、前述の抽象構文木が得られます。