summaryrefslogtreecommitdiff
path: root/src/GF/Canon
diff options
context:
space:
mode:
Diffstat (limited to 'src/GF/Canon')
-rw-r--r--src/GF/Canon/AbsToBNF.hs32
1 files changed, 32 insertions, 0 deletions
diff --git a/src/GF/Canon/AbsToBNF.hs b/src/GF/Canon/AbsToBNF.hs
new file mode 100644
index 000000000..71845971c
--- /dev/null
+++ b/src/GF/Canon/AbsToBNF.hs
@@ -0,0 +1,32 @@
+module GF.Canon.AbsToBNF where
+
+import GF.Grammar.SGrammar
+import GF.Data.Operations
+import GF.Infra.Option
+import GF.Canon.GFC (CanonGrammar)
+
+abstract2bnf :: CanonGrammar -> String
+abstract2bnf = sgrammar2bnf . gr2sgr noOptions emptyProbs
+
+sgrammar2bnf :: SGrammar -> String
+sgrammar2bnf = unlines . map (prBNFRule . mkBNF) . allRules
+
+prBNFRule :: BNFRule -> String
+prBNFRule = id
+
+type BNFRule = String
+
+mkBNF :: SRule -> BNFRule
+mkBNF (pfun,(args,cat)) =
+ fun ++ "." +++ gfId cat +++ "::=" +++ rhs +++ ";"
+ where
+ fun = gfId (snd pfun)
+ rhs = case args of
+ [] -> prQuotedString (snd pfun)
+ _ -> unwords (map gfId args)
+
+gfId i = case i of
+ "Int" -> "Integer"
+ "String" -> i
+ "Float" -> "Double"
+ _ -> "G" ++ i ++ "_"