文法宣言がある言語。

syntax {
 expr := op expr expr
      -> eval_expr(op, value_of(expr), value_of(expr))
    | '(' expr ')'
      -> expr
    ;
 
 op  := '+' -> ...
    | '*' -> ...
    ;
 :
};

* (+ 1 2) (+ 3 4)