content: {-# OPTIONS_GHC -fglasgow-exts -cpp #-}
  import Text.ParserCombinators.Parsec hiding (label)
  import qualified Data.Map as Map
  import System.IO hiding (getContents,putStrLn,print,putStr)
  import Prelude hiding (getContents,putStrLn,print,putStr)
  import System.IO.UTF8
  import Debug.Trace
  import System.Console.GetOpt
  import System.Environment
  import M0ld.M0ld (prettyPrintBytecode)
  import M0ld.Yeast (compileToYeast)
  import M0ld.JS (compileToJS)
  import M0ld.C (dumpToC)
  import M0ld.AST
  import M0ld.Parser
  #ifdef EMBED_SMOP
  import M0ld.Eval
  #endif
  
  #ifdef EMBED_SMOP
  eval code = evalM0ld code 
  #else
  eval code = putStrLn "--exec use ./Setup configure --user --flags=SMOP"
  #endif
  spec = [("print-bytecode","print resulting mold bytecode in a human readable form"),
              ("exec","execute the m0le"),
              ("js","compile down to js"),
              ("yeast-funcs","compile down to a yeast frame (the functions for the frame)"),
              ("yeast-create","compile down to a yeast frame (the expression to create the frame)")]
  main = do
      args <- getArgs
      let (options,nonoptions,errors) = getOpt RequireOrder (map (\(opt,desc) -> Option [] [opt] (NoArg opt) desc) spec) args
      mapM putStr errors
      hFlush stdout
      code <- getContents
      if elem "yeast-create" options then let 
              (funcs,lost,_) = compileToYeast ("foo",0) $ parseM0ld code in
              putStrLn lost
          else if elem "yeast-funcs" options then let 
              (funcs,lost,_) = compileToYeast ("foo",0) $ parseM0ld code in
                  putStrLn $ (concat funcs)
          else if elem "js" options then putStrLn $ compileToJS $ parseM0ld code
          else if elem "print-bytecode" options
          then putStrLn $ prettyPrintBytecode "" $ parseM0ld code
          else if elem "exec" options then eval code
          else putStrLn $ dumpToC $ parseM0ld code
  