mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-05-17 15:12:50 -06:00
cleanup
This commit is contained in:
@@ -15,7 +15,6 @@
|
||||
module GF.Grammar.BNFC(BNFCRule(..), BNFCSymbol, Symbol(..), CFTerm(..), bnfc2cf) where
|
||||
|
||||
import GF.Grammar.CFG
|
||||
import PGF (Token, mkCId)
|
||||
import Data.List (partition)
|
||||
|
||||
type IsList = Bool
|
||||
@@ -64,12 +63,12 @@ transformRules sepMap (BNFCCoercions c num) = rules ++ [lastRule]
|
||||
lastRule = Rule (c',[0]) ss rn
|
||||
where c' = c ++ show num
|
||||
ss = [Terminal "(", NonTerminal (c,[0]), Terminal ")"]
|
||||
rn = CFObj (mkCId $ "coercion_" ++ c) []
|
||||
rn = CFObj ("coercion_" ++ c) []
|
||||
|
||||
fRules c n = Rule (c',[0]) ss rn
|
||||
where c' = if n == 0 then c else c ++ show n
|
||||
ss = [NonTerminal (c ++ show (n+1),[0])]
|
||||
rn = CFObj (mkCId $ "coercion_" ++ c') []
|
||||
rn = CFObj ("coercion_" ++ c') []
|
||||
|
||||
transformSymb :: SepMap -> BNFCSymbol -> (String, ParamCFSymbol)
|
||||
transformSymb sepMap s = case s of
|
||||
@@ -94,7 +93,7 @@ createListRules' ne isSep symb c = ruleBase : ruleCons
|
||||
then [NonTerminal (c,[0]) | ne]
|
||||
else [NonTerminal (c,[0]) | ne] ++
|
||||
[Terminal symb | symb /= "" && ne]
|
||||
rn = CFObj (mkCId $ "Base" ++ c) []
|
||||
rn = CFObj ("Base" ++ c) []
|
||||
ruleCons
|
||||
| isSep && symb /= "" && not ne = [Rule ("List" ++ c,[1]) smbs0 rn
|
||||
,Rule ("List" ++ c,[1]) smbs1 rn]
|
||||
@@ -107,4 +106,4 @@ createListRules' ne isSep symb c = ruleBase : ruleCons
|
||||
smbs = [NonTerminal (c,[0])] ++
|
||||
[Terminal symb | symb /= ""] ++
|
||||
[NonTerminal ("List" ++ c,[0])]
|
||||
rn = CFObj (mkCId $ "Cons" ++ c) []
|
||||
rn = CFObj ("Cons" ++ c) []
|
||||
|
||||
@@ -22,8 +22,7 @@ import GF.Infra.Option
|
||||
import GF.Infra.UseIO(MonadIO(..))
|
||||
import GF.Grammar.Grammar
|
||||
|
||||
import PGF() -- Binary instances
|
||||
import PGF.Internal(Literal(..),Symbol(..))
|
||||
import PGF2.Internal(Literal(..),Symbol(..))
|
||||
|
||||
-- Please change this every time when the GFO format is changed
|
||||
gfoVersion = "GF04"
|
||||
|
||||
@@ -4,10 +4,11 @@
|
||||
--
|
||||
-- Context-free grammar representation and manipulation.
|
||||
----------------------------------------------------------------------
|
||||
module GF.Grammar.CFG where
|
||||
module GF.Grammar.CFG(Cat,Token, module GF.Grammar.CFG) where
|
||||
|
||||
import GF.Data.Utilities
|
||||
import PGF
|
||||
import PGF2(Fun,Cat)
|
||||
import PGF2.Internal(Token)
|
||||
import GF.Data.Relation
|
||||
|
||||
import Data.Map (Map)
|
||||
@@ -20,8 +21,6 @@ import qualified Data.Set as Set
|
||||
-- * Types
|
||||
--
|
||||
|
||||
type Cat = String
|
||||
|
||||
data Symbol c t = NonTerminal c | Terminal t
|
||||
deriving (Eq, Ord, Show)
|
||||
|
||||
@@ -39,12 +38,12 @@ data Grammar c t = Grammar {
|
||||
deriving (Eq, Ord, Show)
|
||||
|
||||
data CFTerm
|
||||
= CFObj CId [CFTerm] -- ^ an abstract syntax function with arguments
|
||||
= CFObj Fun [CFTerm] -- ^ an abstract syntax function with arguments
|
||||
| CFAbs Int CFTerm -- ^ A lambda abstraction. The Int is the variable id.
|
||||
| CFApp CFTerm CFTerm -- ^ Application
|
||||
| CFRes Int -- ^ The result of the n:th (0-based) non-terminal
|
||||
| CFVar Int -- ^ A lambda-bound variable
|
||||
| CFMeta CId -- ^ A metavariable
|
||||
| CFMeta Fun -- ^ A metavariable
|
||||
deriving (Eq, Ord, Show)
|
||||
|
||||
type CFSymbol = Symbol Cat Token
|
||||
@@ -232,7 +231,7 @@ uniqueFuns = snd . mapAccumL uniqueFun Set.empty
|
||||
uniqueFun funs (Rule cat items (CFObj fun args)) = (Set.insert fun' funs,Rule cat items (CFObj fun' args))
|
||||
where
|
||||
fun' = head [fun'|suffix<-"":map show ([2..]::[Int]),
|
||||
let fun'=mkCId (showCId fun++suffix),
|
||||
let fun'=fun++suffix,
|
||||
not (fun' `Set.member` funs)]
|
||||
|
||||
-- | Gets all rules in a CFG.
|
||||
@@ -310,12 +309,12 @@ prProductions prods =
|
||||
prCFTerm :: CFTerm -> String
|
||||
prCFTerm = pr 0
|
||||
where
|
||||
pr p (CFObj f args) = paren p (showCId f ++ " (" ++ concat (intersperse "," (map (pr 0) args)) ++ ")")
|
||||
pr p (CFObj f args) = paren p (f ++ " (" ++ concat (intersperse "," (map (pr 0) args)) ++ ")")
|
||||
pr p (CFAbs i t) = paren p ("\\x" ++ show i ++ ". " ++ pr 0 t)
|
||||
pr p (CFApp t1 t2) = paren p (pr 1 t1 ++ "(" ++ pr 0 t2 ++ ")")
|
||||
pr _ (CFRes i) = "$" ++ show i
|
||||
pr _ (CFVar i) = "x" ++ show i
|
||||
pr _ (CFMeta c) = "?" ++ showCId c
|
||||
pr _ (CFMeta c) = "?" ++ c
|
||||
paren 0 x = x
|
||||
paren 1 x = "(" ++ x ++ ")"
|
||||
|
||||
@@ -323,12 +322,12 @@ prCFTerm = pr 0
|
||||
-- * CFRule Utilities
|
||||
--
|
||||
|
||||
ruleFun :: Rule c t -> CId
|
||||
ruleFun :: Rule c t -> Fun
|
||||
ruleFun (Rule _ _ t) = f t
|
||||
where f (CFObj n _) = n
|
||||
f (CFApp _ x) = f x
|
||||
f (CFAbs _ x) = f x
|
||||
f _ = mkCId ""
|
||||
f _ = ""
|
||||
|
||||
-- | Check if any of the categories used on the right-hand side
|
||||
-- are in the given list of categories.
|
||||
@@ -336,7 +335,7 @@ anyUsedBy :: Eq c => [c] -> Rule c t -> Bool
|
||||
anyUsedBy cs (Rule _ ss _) = any (`elem` cs) (filterCats ss)
|
||||
|
||||
mkCFTerm :: String -> CFTerm
|
||||
mkCFTerm n = CFObj (mkCId n) []
|
||||
mkCFTerm n = CFObj n []
|
||||
|
||||
ruleIsNonRecursive :: Ord c => Set c -> Rule c t -> Bool
|
||||
ruleIsNonRecursive cs = noCatsInSet cs . ruleRhs
|
||||
|
||||
@@ -16,7 +16,6 @@ module GF.Grammar.EBNF (EBNF, ERule, ERHS(..), ebnf2cf) where
|
||||
|
||||
import GF.Data.Operations
|
||||
import GF.Grammar.CFG
|
||||
import PGF (mkCId)
|
||||
|
||||
type EBNF = [ERule]
|
||||
type ERule = (ECat, ERHS)
|
||||
@@ -40,7 +39,7 @@ ebnf2cf :: EBNF -> [ParamCFRule]
|
||||
ebnf2cf ebnf =
|
||||
[Rule cat items (mkCFF i cat) | (i,(cat,items)) <- zip [0..] (normEBNF ebnf)]
|
||||
where
|
||||
mkCFF i (c,_) = CFObj (mkCId ("Mk" ++ c ++ "_" ++ show i)) []
|
||||
mkCFF i (c,_) = CFObj ("Mk" ++ c ++ "_" ++ show i) []
|
||||
|
||||
normEBNF :: EBNF -> [CFJustRule]
|
||||
normEBNF erules = let
|
||||
|
||||
@@ -64,7 +64,7 @@ module GF.Grammar.Grammar (
|
||||
Location(..), L(..), unLoc, noLoc, ppLocation, ppL,
|
||||
|
||||
-- ** PMCFG
|
||||
PMCFG(..), Production(..), FId, FunId, SeqId, LIndex, Sequence
|
||||
PMCFG(..), Production(..), FId, FunId, SeqId, LIndex
|
||||
) where
|
||||
|
||||
import GF.Infra.Ident
|
||||
@@ -73,7 +73,8 @@ import GF.Infra.Location
|
||||
|
||||
import GF.Data.Operations
|
||||
|
||||
import PGF.Internal (FId, FunId, SeqId, LIndex, Sequence, BindType(..))
|
||||
import PGF2(LIndex, BindType(..))
|
||||
import PGF2.Internal(FId, FunId, SeqId, Symbol)
|
||||
|
||||
import Data.Array.IArray(Array)
|
||||
import Data.Array.Unboxed(UArray)
|
||||
@@ -99,7 +100,7 @@ data ModuleInfo = ModInfo {
|
||||
mopens :: [OpenSpec],
|
||||
mexdeps :: [ModuleName],
|
||||
msrc :: FilePath,
|
||||
mseqs :: Maybe (Array SeqId Sequence),
|
||||
mseqs :: Maybe (Array SeqId [Symbol]),
|
||||
jments :: Map.Map Ident Info
|
||||
}
|
||||
|
||||
|
||||
@@ -24,7 +24,6 @@ import GF.Grammar.Lexer
|
||||
import GF.Compile.Update (buildAnyTree)
|
||||
import Data.List(intersperse)
|
||||
import Data.Char(isAlphaNum)
|
||||
import PGF(mkCId)
|
||||
|
||||
}
|
||||
|
||||
@@ -624,7 +623,7 @@ ListCFRule
|
||||
|
||||
CFRule :: { [BNFCRule] }
|
||||
CFRule
|
||||
: Ident '.' Ident '::=' ListCFSymbol ';' { [BNFCRule (showIdent $3) $5 (CFObj (mkCId (showIdent $1)) [])]
|
||||
: Ident '.' Ident '::=' ListCFSymbol ';' { [BNFCRule (showIdent $3) $5 (CFObj (showIdent $1) [])]
|
||||
}
|
||||
| Ident '::=' ListCFRHS ';' { let { cat = showIdent $1;
|
||||
mkFun cat its =
|
||||
@@ -637,7 +636,7 @@ CFRule
|
||||
Terminal c -> filter isAlphaNum c;
|
||||
NonTerminal (t,_) -> t
|
||||
}
|
||||
} in map (\rhs -> BNFCRule cat rhs (CFObj (mkCId (mkFun cat rhs)) [])) $3
|
||||
} in map (\rhs -> BNFCRule cat rhs (CFObj (mkFun cat rhs) [])) $3
|
||||
}
|
||||
| 'coercions' Ident Integer ';' { [BNFCCoercions (showIdent $2) $3]}
|
||||
| 'terminator' NonEmpty Ident String ';' { [BNFCTerminator $2 (showIdent $3) $4] }
|
||||
|
||||
@@ -23,19 +23,16 @@ module GF.Grammar.Printer
|
||||
, getAbs
|
||||
) where
|
||||
|
||||
import PGF2 as PGF2
|
||||
import PGF2.Internal as PGF2
|
||||
import GF.Infra.Ident
|
||||
import GF.Infra.Option
|
||||
import GF.Grammar.Values
|
||||
import GF.Grammar.Grammar
|
||||
|
||||
import PGF.Internal (ppMeta, ppLit, ppFId, ppFunId, ppSeqId, ppSeq)
|
||||
|
||||
import GF.Text.Pretty
|
||||
import Data.Maybe (isNothing)
|
||||
import Data.List (intersperse)
|
||||
import qualified Data.Map as Map
|
||||
--import qualified Data.IntMap as IntMap
|
||||
--import qualified Data.Set as Set
|
||||
import qualified Data.Array.IArray as Array
|
||||
|
||||
data TermPrintQual
|
||||
@@ -362,3 +359,39 @@ getLet (Let l e) = let (ls,e') = getLet e
|
||||
in (l:ls,e')
|
||||
getLet e = ([],e)
|
||||
|
||||
ppFunId funid = pp 'F' <> pp funid
|
||||
ppSeqId seqid = pp 'S' <> pp seqid
|
||||
|
||||
ppFId fid
|
||||
| fid == PGF2.fidString = pp "CString"
|
||||
| fid == PGF2.fidInt = pp "CInt"
|
||||
| fid == PGF2.fidFloat = pp "CFloat"
|
||||
| fid == PGF2.fidVar = pp "CVar"
|
||||
| fid == PGF2.fidStart = pp "CStart"
|
||||
| otherwise = pp 'C' <> pp fid
|
||||
|
||||
ppMeta :: Int -> Doc
|
||||
ppMeta n
|
||||
| n == 0 = pp '?'
|
||||
| otherwise = pp '?' <> pp n
|
||||
|
||||
ppLit (PGF2.LStr s) = pp (show s)
|
||||
ppLit (PGF2.LInt n) = pp n
|
||||
ppLit (PGF2.LFlt d) = pp d
|
||||
|
||||
ppSeq (seqid,seq) =
|
||||
ppSeqId seqid <+> pp ":=" <+> hsep (map ppSymbol seq)
|
||||
|
||||
ppSymbol (PGF2.SymCat d r) = pp '<' <> pp d <> pp ',' <> pp r <> pp '>'
|
||||
ppSymbol (PGF2.SymLit d r) = pp '{' <> pp d <> pp ',' <> pp r <> pp '}'
|
||||
ppSymbol (PGF2.SymVar d r) = pp '<' <> pp d <> pp ',' <> pp '$' <> pp r <> pp '>'
|
||||
ppSymbol (PGF2.SymKS t) = doubleQuotes (pp t)
|
||||
ppSymbol PGF2.SymNE = pp "nonExist"
|
||||
ppSymbol PGF2.SymBIND = pp "BIND"
|
||||
ppSymbol PGF2.SymSOFT_BIND = pp "SOFT_BIND"
|
||||
ppSymbol PGF2.SymSOFT_SPACE= pp "SOFT_SPACE"
|
||||
ppSymbol PGF2.SymCAPIT = pp "CAPIT"
|
||||
ppSymbol PGF2.SymALL_CAPIT = pp "ALL_CAPIT"
|
||||
ppSymbol (PGF2.SymKP syms alts) = pp "pre" <+> braces (hsep (punctuate (pp ';') (hsep (map ppSymbol syms) : map ppAlt alts)))
|
||||
|
||||
ppAlt (syms,ps) = hsep (map ppSymbol syms) <+> pp '/' <+> hsep (map (doubleQuotes . pp) ps)
|
||||
|
||||
Reference in New Issue
Block a user