1
0
forked from GitHub/gf-core

added option -output-format=java for producing code for embedded grammars in Java

This commit is contained in:
Krasimir Angelov
2017-08-29 20:53:47 +02:00
parent 03479648ad
commit 1e4ab95e41
4 changed files with 49 additions and 0 deletions

View File

@@ -195,6 +195,7 @@ Library
GF.Compile.Multi
GF.Compile.Optimize
GF.Compile.PGFtoHaskell
GF.Compile.PGFtoJava
GF.Haskell
GF.Compile.ConcreteToHaskell
GF.Compile.PGFtoJS

View File

@@ -3,6 +3,7 @@ module GF.Compile.Export where
import PGF
import PGF.Internal(ppPGF)
import GF.Compile.PGFtoHaskell
import GF.Compile.PGFtoJava
import GF.Compile.PGFtoProlog
import GF.Compile.PGFtoLProlog
import GF.Compile.PGFtoJS
@@ -37,6 +38,7 @@ exportPGF opts fmt pgf =
FmtJavaScript -> multi "js" pgf2js
FmtPython -> multi "py" pgf2python
FmtHaskell -> multi "hs" (grammar2haskell opts name)
FmtJava -> multi "java" (grammar2java opts name)
FmtProlog -> multi "pl" grammar2prolog
FmtLambdaProlog -> multi "mod" grammar2lambdaprolog_mod ++ multi "sig" grammar2lambdaprolog_sig
FmtBNF -> single "bnf" bnfPrinter

View File

@@ -0,0 +1,44 @@
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 =
[
"",
"}"
]

View File

@@ -90,6 +90,7 @@ data OutputFormat = FmtPGFPretty
| FmtJavaScript
| FmtPython
| FmtHaskell
| FmtJava
| FmtProlog
| FmtLambdaProlog
| FmtByteCode
@@ -475,6 +476,7 @@ outputFormatsExpl =
(("js", FmtJavaScript),"JavaScript (whole grammar)"),
(("python", FmtPython),"Python (whole grammar)"),
(("haskell", FmtHaskell),"Haskell (abstract syntax)"),
(("java", FmtJava),"Java (abstract syntax)"),
(("prolog", FmtProlog),"Prolog (whole grammar)"),
(("lambda_prolog",FmtLambdaProlog),"LambdaProlog (abstract syntax)"),
(("lp_byte_code", FmtByteCode),"Bytecode for Teyjus (abstract syntax, experimental)"),