diff options
| author | aarne <aarne@cs.chalmers.se> | 2007-11-06 14:44:17 +0000 |
|---|---|---|
| committer | aarne <aarne@cs.chalmers.se> | 2007-11-06 14:44:17 +0000 |
| commit | 2b1d5a4d513970308f47c735212cbc253ec40961 (patch) | |
| tree | 2395299df4ba44d7cfb060b9294ea38f1dce63f4 /src/GF/GFCC | |
| parent | 693621ffbe9146f24ba75e073b6ce2e716c56a5e (diff) | |
Devel/GF3: experimentally putting together all functionalities for the first time
Diffstat (limited to 'src/GF/GFCC')
| -rw-r--r-- | src/GF/GFCC/API.hs | 9 | ||||
| -rw-r--r-- | src/GF/GFCC/DataGFCC.hs | 20 |
2 files changed, 21 insertions, 8 deletions
diff --git a/src/GF/GFCC/API.hs b/src/GF/GFCC/API.hs index a35faacb5..2abd0e09b 100644 --- a/src/GF/GFCC/API.hs +++ b/src/GF/GFCC/API.hs @@ -76,9 +76,10 @@ startCat :: MultiGrammar -> Category file2grammar f = do gfcc <- file2gfcc f - let fcfgs = convertGrammar gfcc - return (MultiGrammar gfcc - [(lang, buildFCFPInfo fcfg) | (CId lang,fcfg) <- fcfgs]) + return (MultiGrammar gfcc (gfcc2parsers gfcc)) + +gfcc2parsers gfcc = + [(lang, buildFCFPInfo fcfg) | (CId lang,fcfg) <- convertGrammar gfcc] file2gfcc f = readFileIf f >>= err (error) (return . mkGFCC) . pGrammar . myLexer @@ -117,6 +118,8 @@ categories mgr = [c | CId c <- Map.keys (cats (abstract (gfcc mgr)))] startCat mgr = "S" ---- +emptyMultiGrammar = MultiGrammar emptyGFCC [] + ------------ for internal use only linearThis = GF.GFCC.API.linearize diff --git a/src/GF/GFCC/DataGFCC.hs b/src/GF/GFCC/DataGFCC.hs index ab2710e4c..47a891083 100644 --- a/src/GF/GFCC/DataGFCC.hs +++ b/src/GF/GFCC/DataGFCC.hs @@ -96,12 +96,22 @@ printGFCC gfcc0 = compactPrintGFCC $ printTree $ Grm -- merge two GFCCs; fails is differens absnames; priority to second arg unionGFCC :: GFCC -> GFCC -> GFCC -unionGFCC one two = - if absname one == absname two - then one { +unionGFCC one two = case absname one of + CId "" -> two -- extending empty grammar + n | n == absname two -> one { -- extending grammar with same abstract concretes = Data.Map.union (concretes two) (concretes one), - cncnames = Data.List.union (cncnames two) (cncnames one)} - else one + cncnames = Data.List.union (cncnames two) (cncnames one) + } + _ -> one -- abstracts don't match ---- print error msg + +emptyGFCC :: GFCC +emptyGFCC = GFCC { + absname = CId "", + cncnames = [] , + abstract = error "empty grammar, no abstract", + concretes = empty + } + -- default map and filter are for Map here lmap = Prelude.map |
