-- SYNTAX3

type STRUCT3 = S SUM  L -- Non-Determinism (Lists)
              (S SUM  B -- Boolean operators
              (O ONLY N -- Numeric operators
              ))

type SYNTAX3 = REC STRUCT3

-- VALUE3

type VALUE3 =  SUM Bool
              (ONLY Int)

-- COMPUTE3

type COMPUTE3 = ErrT List

-- SEMANTICS3

type SEMANTICS3 = COMPUTE3 VALUE3
 
-- driver

parser3 :: TheParser SYNTAX3
parser3 = do { blanks ; parser }

parseWith3 :: (SYNTAX3 -> IO ()) -> [Char] -> IO ()
parseWith3 cont = parser3 `invokeWith` cont

unparse3 :: SYNTAX3 -> IO ()
unparse3 = fold

interpret3 :: SYNTAX3 -> SEMANTICS3
interpret3 = fold

run3 :: SEMANTICS3 -> IO ()
run3 = runIO

main3 :: IO ()
main3 = driver "3> " parseWith3 unparse3 interpret3 run3

