-- A (typed) tree language for Cool abstract syntax trees module COOL[] begin type Symbol; type Boolean; phylum Program; phylum Class_; phylum Classes = LIST[Class_]; phylum Feature; phylum Features = LIST[Feature]; phylum Formal; phylum Formals = LIST[Formal]; phylum Expression; phylum Expressions = LIST[Expression]; phylum Case; phylum Cases = LIST[Case]; constructor program(classes : Classes) : Program; constructor class_(name : Symbol; parent: Symbol; features : Features; filename : Symbol): Class_; -- Features: constructor method(name : Symbol; formals : Formals; return_type : Symbol; expr: Expression) : Feature; constructor attr(name, type_decl : Symbol; init : Expression) : Feature; -- Formals constructor formal(name, type_decl: Symbol) : Formal; -- Case constructor branch(name, type_decl: Symbol; expr: Expression): Case; -- Expressions constructor assign(name : Symbol; expr : Expression) : Expression; constructor static_dispatch(expr: Expression; type_name : Symbol; name : Symbol; actual : Expressions) : Expression; constructor dispatch(expr : Expression; name : Symbol; actual : Expressions) : Expression; constructor cond(pred, then_exp, else_exp : Expression): Expression; constructor loop(pred, body: Expression) : Expression; constructor typcase(expr: Expression; cases: Cases): Expression; constructor block(body: Expressions) : Expression; constructor let(identifier, type_decl: Symbol; init, body: Expression): Expression; constructor plus(e1, e2: Expression) : Expression; constructor sub(e1, e2: Expression) : Expression; constructor mul(e1, e2: Expression) : Expression; constructor divide(e1, e2: Expression) : Expression; constructor neg(e1: Expression) : Expression; constructor lt(e1, e2: Expression) : Expression; constructor eq(e1, e2: Expression) : Expression; constructor leq(e1, e2: Expression) : Expression; constructor comp(e1: Expression) : Expression; constructor int_const(token: Symbol) : Expression; constructor bool_const(val: Boolean) : Expression; constructor string_const(token: Symbol) : Expression; constructor new_(type_name: Symbol): Expression; constructor isvoid(e1: Expression): Expression; constructor no_expr(): Expression; constructor object(name: Symbol): Expression; end;