content: module GF.Compile.PGFtoJava (grammar2java) where
  
  import PGF
  import Data.Maybe(maybe)
  import Data.List(intercalate)
  import GF.Infra.Option
  
  -- | the main function
  grammar2java :: Options
                  -> String  -- ^ Module name.
                  -> PGF
                  -> String
  grammar2java opts name gr = unlines $  
    javaPreamble name ++ methods ++ javaEnding
    where
      methods = [javaMethod gr fun | fun <- functions gr]
  
  javaPreamble name =
   [
    "import org.grammaticalframework.pgf.*;",
    "",
    "public class " ++ name ++ " {",
    ""
   ]
   
  javaMethod gr fun =
    "  public static Expr "++name++"("++arg_decls++") { return new Expr("++show name++args++"); }"
    where
      name  = showCId fun
      arity = maybe 0 getArrity (functionType gr fun)
      vars  = ['e':show i | i <- [1..arity]]
      
      arg_decls = intercalate "," ["Expr "++v | v <- vars]
      args      = if null vars then ",new Expr[] {}" else ","++intercalate "," vars
  
      getArrity ty = length hypos
        where
          (hypos,_,_) = unType ty
  
  javaEnding =
   [
    "",
    "}"
   ]
  