-- AG Test File { module Example where } { data Expr = Plus Expr Expr | Const Int | Funny } interface Eval visit select inputs e :: {Expr} visit compute outputs v :: {Int} visit funny outputs z :: {Char} { eval_expr = {{ sem :: Eval production visit select clause match { Const @loc.x } = { @lhs.e } visit compute clause eval { @lhs.v } = { @loc.x } visit funny clause eval { @lhs.z } = { 'a' } production visit select clause match { Plus @loc.e1 @loc.e2 } = { @lhs.e } visit compute clause child k1 :: Eval = { eval_expr } child k1 : select = { id } child k1 : compute = { id} child k2 :: Eval = { eval_expr } child k2 : select = { id } child k2 : compute = { id } eval { @k1.e} = { @loc.e1 } eval { @k2.e} = { @loc.e2 } eval { @lhs.v } = { @k1.v + @k2.v } visit funny clause eval { @lhs.z } = { 'b' } production visit select clause visit compute external { Just (Eval_funny (Just 'c'), 2) } visit funny }} main = let e = Plus (Plus (Const 1) (Const 2)) (Const 3) inh = Inh_Eval_select { e_Inh_Eval_select = e } syn = wrap_Eval_select eval_expr inh v = v_Syn_Eval_select syn z = z_Syn_Eval_select syn in putStrLn (z : show v) }