module GF.Compile.PGFtoJava (grammar2java) where
import PGF
import Data.Maybe(maybe)
import Data.List(intercalate)
import GF.Infra.Option
grammar2java :: Options
-> String
-> 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 =
[
"",
"}"
]