packages feed

ruler-core-1.0: examples/EvalAsAg.rul

{
{-# LANGUAGE BangPatterns #-}
module Eval where

import Control.Monad.Error
}

data Expr
  con Int
    x :: Int
  con Plus
    l : Expr
    r : Expr

itf Expr
  visit eval
    inh ast :: Expr
    syn val :: Int

datasem Expr monad IO
  clause Int
    loc.z = 3
    lhs.val = loc.x
  clause Plus
    invoke eval of l
    invoke eval of r
    lhs.val = l.val + r.val


{
test :: Expr -> IO Int
test exp = do
  let inh = Inh_Expr_eval { ast_Inh_Expr = exp }
  syn <- invoke_Expr_eval dnt_Expr inh
  let x = val_Syn_Expr syn
  return x

main :: IO ()
main = do let exp = Expr_Plus (Expr_Int 1) (Expr_Plus (Expr_Int 2) (Expr_Int 3))
          x <- test exp
          putStrLn $ show x
}