summaryrefslogtreecommitdiff
path: root/src/GF/CF/PrLBNF.hs
diff options
context:
space:
mode:
authoraarne <aarne@cs.chalmers.se>2008-06-25 16:43:48 +0000
committeraarne <aarne@cs.chalmers.se>2008-06-25 16:43:48 +0000
commitb96b36f43de3e2f8b58d5f539daa6f6d47f25870 (patch)
tree0992334be13cec6538a1dea22fbbf26ad6bdf224 /src/GF/CF/PrLBNF.hs
parentfe367412e0aeb4ad5c02de68e6eca382e0f96984 (diff)
removed src for 2.9
Diffstat (limited to 'src/GF/CF/PrLBNF.hs')
-rw-r--r--src/GF/CF/PrLBNF.hs150
1 files changed, 0 insertions, 150 deletions
diff --git a/src/GF/CF/PrLBNF.hs b/src/GF/CF/PrLBNF.hs
deleted file mode 100644
index 4ba2019bc..000000000
--- a/src/GF/CF/PrLBNF.hs
+++ /dev/null
@@ -1,150 +0,0 @@
-----------------------------------------------------------------------
--- |
--- Module : PrLBNF
--- Maintainer : AR
--- Stability : (stable)
--- Portability : (portable)
---
--- > CVS $Date: 2005/06/17 14:15:16 $
--- > CVS $Author: bringert $
--- > CVS $Revision: 1.11 $
---
--- Printing CF grammars generated from GF as LBNF grammar for BNFC.
--- AR 26/1/2000 -- 9/6/2003 (PPrCF) -- 8/11/2003 -- 27/9/2004.
--- With primitive error messaging, by rules and rule tails commented out
------------------------------------------------------------------------------
-
-module GF.CF.PrLBNF (prLBNF,prBNF) where
-
-import GF.CF.CF
-import GF.CF.CFIdent
-import GF.Canon.AbsGFC
-import GF.Infra.Ident
-import GF.Grammar.PrGrammar
-import GF.Compile.ShellState
-import GF.Canon.GFC
-import GF.Canon.Look
-
-import GF.Data.Operations
-import GF.Infra.Modules
-
-import Data.Char
-import Data.List (nub)
-
-prLBNF :: Bool -> StateGrammar -> String
-prLBNF new gr = unlines $ pragmas ++ (map (prCFRule cs) rules')
- where
- cs = map IC ["Int","String"] ++ [catIdPlus c | (_,(c,_)) <- rules]
- cf = stateCF gr
- (pragmas,rules) = if new -- tries to treat precedence levels
- then mkLBNF (stateGrammarST gr) $ rulesOfCF cf
- else ([],rulesOfCF cf) -- "normal" behaviour
- rules' = concatMap expand rules
- expand (f,(c,its)) = [(f,(c,it)) | it <- combinations (map expIt its)]
- expIt i = case i of
- CFTerm (RegAlts ss) -> [CFTerm (RegAlts [s]) | s <- ss]
- _ -> [i]
-
--- | a hack to hide the LBNF details
-prBNF :: Bool -> StateGrammar -> String
-prBNF b = unlines . (map (unwords . unLBNF . drop 1 . words)) . lines . prLBNF b
- where
- unLBNF r = case r of
- "---":ts -> ts
- ";":"---":ts -> ts
- c:ts -> c : unLBNF ts
- _ -> r
-
---- | awful low level code without abstraction over label names etc
-mkLBNF :: CanonGrammar -> [CFRule] -> ([String],[CFRule])
-mkLBNF gr rules = (coercions, nub $ concatMap mkRule rules) where
- coercions = ["coercions" +++ prt_ c +++ show n +++ ";" |
- (_,ModMod m) <- modules gr,
- (c,CncCat (RecType ls) _ _) <- tree2list $ jments m,
- Lbg (L (IC "p")) (TInts n) <- ls
- ]
- precedences = [(f,(prec,assoc)) |
- (_,ModMod m) <- modules gr,
- (f,CncFun _ _ (R lin) _) <- tree2list $ jments m,
- (Just prec, Just assoc) <- [(
- lookup "p" [(lab,p) | Ass (L (IC lab)) (EInt p) <- lin],
- lookup "a" [(lab,a) | Ass (L (IC lab)) (Par (CIQ _ (IC a)) []) <- lin]
- )]
- ]
- precfuns = map fst precedences
- mkRule r@(fun@(CFFun (t, p)),(cat,its)) = case t of
- AC (CIQ _ c) -> case lookup c precedences of
- Just (prec,assoc) -> [(fun,(mkCat prec cat,mkIts cat prec assoc 0 its))]
- _ -> return r
- AD (CIQ _ c) -> case lookup c precedences of
- Just (prec,assoc) -> [(fun,(mkCat prec cat,mkIts cat prec assoc 0 its))]
- _ -> return r
- _ -> return r
- mkIts cat prec assoc i its = case its of
- CFTerm (RegAlts ["("]):n@(CFNonterm k):CFTerm (RegAlts [")"]):rest | k==cat ->
- mkIts cat prec assoc i $ n:rest -- remove variants with parentheses
- CFNonterm k:rest | k==cat ->
- CFNonterm (mkNonterm prec assoc i k) : mkIts cat prec assoc (i+1) rest
- it:rest -> it:mkIts cat prec assoc i rest
- [] -> []
-
- mkCat prec (CFCat ((CIQ m (IC c)),l)) = CFCat ((CIQ m (IC (c ++ show prec ++ "+"))),l)
- mkNonterm prec assoc i cat = mkCat prec' cat
- where
- prec' = case (assoc,i) of
- ("PL",0) -> prec
- ("PR",0) -> prec + 1
- ("PR",_) -> prec
- _ -> prec + 1
-
-catId ((CFCat ((CIQ _ c),l))) = c
-
-catIdPlus ((CFCat ((CIQ _ c@(IC s)),l))) = case reverse s of
- '+':cs -> IC $ reverse $ dropWhile isDigit cs
- _ -> c
-
-prCFRule :: [Ident] -> CFRule -> String
-prCFRule cs (fun,(cat,its)) =
- prCFFun cat fun ++ "." +++ prCFCat True cat +++ "::=" +++ --- err in cat -> in syntax
- unwords (map (prCFItem cs) its) +++ ";"
-
-prCFFun :: CFCat -> CFFun -> String
-prCFFun (CFCat (_,l)) (CFFun (t, p)) = case t of
- AC (CIQ _ x) -> let f = prId True x in (f ++ lab +++ f2 f +++ prP p)
- AD (CIQ _ x) -> let f = prId True x in (f ++ lab +++ f2 f +++ prP p)
- _ -> prErr True $ prt t
- where
- lab = prLab l
- f2 f = if null lab then "" else f
- prP = concatMap show
-
-prId b i = case i of
- IC "Int" -> "Integer"
- IC "#Var" -> "Ident"
- IC "Var" -> "Ident"
- IC "id_" -> "_"
- IC s@(c:_) | last s == '+' -> init s -- hack to save precedence information
- IC s@(c:_) | isUpper c -> s ++ if isDigit (last s) then "_" else ""
- _ -> prErr b $ prt i
-
-prLab i = case i of
- L (IC "s") -> "" ---
- L (IC "_") -> "" ---
- _ -> let x = prt i in "_" ++ x ++ if isDigit (last x) then "_" else ""
-
--- | just comment out the rest if you cannot interpret the function name in LBNF
--- two versions, depending on whether in the beginning of a rule or elsewhere;
--- in the latter case, error just terminates the rule
-prErr :: Bool -> String -> String
-prErr b s = (if b then "" else " ;") +++ "---" +++ s
-
-prCFCat :: Bool -> CFCat -> String
-prCFCat b (CFCat ((CIQ _ c),l)) = prId b c ++ prLab l ----
-
--- | if a category does not have a production of its own, we replace it by Ident
-prCFItem cs (CFNonterm c) = if elem (catIdPlus c) cs then prCFCat False c else "Ident"
-prCFItem _ (CFTerm a) = prRegExp a
-
-prRegExp (RegAlts tt) = case tt of
- [t] -> prQuotedString t
- _ -> prErr False $ prParenth (prTList " | " (map prQuotedString tt))