diff options
| author | Thomas Hallgren <th-github@altocumulus.org> | 2019-01-17 21:04:08 +0100 |
|---|---|---|
| committer | Thomas Hallgren <th-github@altocumulus.org> | 2019-01-17 21:04:08 +0100 |
| commit | fc1b51aa95ec9e1a628b1255722202472484ee37 (patch) | |
| tree | 3872d49c6264f35cc2a6909de44dca53f0858351 /src/compiler/GF/Compiler.hs | |
| parent | 5fe963dd023c59d3084262bb17f8b53b093aa1ed (diff) | |
Adding -output-format canonical_gf
This output format converts a GF grammar to a "canonical" GF grammar. A
canonical GF grammar consists of
- one self-contained module for the abstract syntax
- one self-contained module per concrete syntax
The concrete syntax modules contain param, lincat and lin definitions,
everything else has been eliminated by the partial evaluator, including
references to resource library modules and functors. Record types
and tables are retained.
The -output-format canonical_gf option writes canonical GF grammars to a
subdirectory "canonical/". The canonical GF grammars are written as
normal GF ".gf" source files, which can be compiled with GF in the normal way.
The translation to canonical form goes via an AST for canonical GF grammars,
defined in GF.Grammar.Canonical. This is a simple, self-contained format that
doesn't cover everyting in GF (e.g. omitting dependent types and HOAS), but it
is complete enough to translate the Foods and Phrasebook grammars found in
gf-contrib. The AST is based on the GF grammar "GFCanonical" presented here:
https://github.com/GrammaticalFramework/gf-core/issues/30#issuecomment-453556553
The translation of concrete syntax to canonical form is based on the
previously existing translation of concrete syntax to Haskell, implemented
in module GF.Compile.ConcreteToHaskell. This module could now be reimplemented
and simplified significantly by going via the canonical format. Perhaps exports
to other output formats could benefit by going via the canonical format too.
There is also the possibility of completing the GFCanonical grammar
mentioned above and using GF itself to convert canonical GF grammars to
other formats...
Diffstat (limited to 'src/compiler/GF/Compiler.hs')
| -rw-r--r-- | src/compiler/GF/Compiler.hs | 25 |
1 files changed, 17 insertions, 8 deletions
diff --git a/src/compiler/GF/Compiler.hs b/src/compiler/GF/Compiler.hs index aa7b80268..334bbd592 100644 --- a/src/compiler/GF/Compiler.hs +++ b/src/compiler/GF/Compiler.hs @@ -7,6 +7,7 @@ import GF.Compile as S(batchCompile,link,srcAbsName) import GF.CompileInParallel as P(parallelBatchCompile) import GF.Compile.Export import GF.Compile.ConcreteToHaskell(concretes2haskell) +import GF.Compile.ConcreteToCanonical(concretes2canonical) import GF.Compile.CFGtoPGF import GF.Compile.GetGrammar import GF.Grammar.BNFC @@ -17,7 +18,7 @@ import GF.Infra.UseIO import GF.Infra.Option import GF.Data.ErrM import GF.System.Directory -import GF.Text.Pretty(render) +import GF.Text.Pretty(render,render80) import Data.Maybe import qualified Data.Map as Map @@ -47,7 +48,7 @@ mainGFC opts fs = do compileSourceFiles :: Options -> [FilePath] -> IOE () compileSourceFiles opts fs = do output <- batchCompile opts fs - cncs2haskell output + exportCncs output unless (flag optStopAfterPhase opts == Compile) $ linkGrammars opts output where @@ -55,15 +56,23 @@ compileSourceFiles opts fs = batchCompile' opts fs = do (t,cnc_gr) <- S.batchCompile opts fs return (t,[cnc_gr]) - cncs2haskell output = - when (FmtHaskell `elem` flag optOutputFormats opts && - haskellOption opts HaskellConcrete) $ - mapM_ cnc2haskell (snd output) + exportCncs output = + do when (FmtHaskell `elem` ofmts && haskellOption opts HaskellConcrete) $ + mapM_ cnc2haskell (snd output) + when (FmtCanonicalGF `elem` ofmts) $ + mapM_ cnc2canonical (snd output) + where + ofmts = flag optOutputFormats opts cnc2haskell (cnc,gr) = - mapM_ writeHs $ concretes2haskell opts (srcAbsName gr cnc) gr + do mapM_ writeExport $ concretes2haskell opts (srcAbsName gr cnc) gr - writeHs (path,s) = writing opts path $ writeUTF8File path s + cnc2canonical (cnc,gr) = + do createDirectoryIfMissing False "canonical" + mapM_ (writeExport.fmap render80) $ + concretes2canonical opts (srcAbsName gr cnc) gr + + writeExport (path,s) = writing opts path $ writeUTF8File path s -- | Create a @.pgf@ file (and possibly files in other formats, if specified |
