diff options
| author | aarne <aarne@cs.chalmers.se> | 2007-11-28 12:01:38 +0000 |
|---|---|---|
| committer | aarne <aarne@cs.chalmers.se> | 2007-11-28 12:01:38 +0000 |
| commit | 813e899ebb4280112f6c81ad582f2e6059db192e (patch) | |
| tree | fb8d7b961df7c3b85dc5c1083672e5b0ea60030c /src/GF/Devel/Lookup.hs | |
| parent | 5257fd963eaf9a38fce3c96479f9ee19ed88104a (diff) | |
lookup module separated
Diffstat (limited to 'src/GF/Devel/Lookup.hs')
| -rw-r--r-- | src/GF/Devel/Lookup.hs | 58 |
1 files changed, 58 insertions, 0 deletions
diff --git a/src/GF/Devel/Lookup.hs b/src/GF/Devel/Lookup.hs new file mode 100644 index 000000000..c2f60f743 --- /dev/null +++ b/src/GF/Devel/Lookup.hs @@ -0,0 +1,58 @@ +module GF.Devel.Lookup where + +import GF.Devel.Modules +import GF.Devel.Judgements +import GF.Devel.Terms +import GF.Infra.Ident + +import GF.Data.Operations + +import Data.Map + +-- look up fields for a constant in a grammar + +lookupJField :: (Judgement -> a) -> GF -> Ident -> Ident -> Err a +lookupJField field gf m c = do + j <- lookupJudgement gf m c + return $ field j + +lookupJForm :: GF -> Ident -> Ident -> Err JudgementForm +lookupJForm = lookupJField jform + +-- the following don't (need to) check that the jment form is adequate + +lookupCatContext :: GF -> Ident -> Ident -> Err Context +lookupCatContext gf m c = do + ty <- lookupJField jtype gf m c + return [] ---- context of ty + +lookupFunType :: GF -> Ident -> Ident -> Err Term +lookupFunType = lookupJField jtype + +lookupLin :: GF -> Ident -> Ident -> Err Term +lookupLin = lookupJField jlin + +lookupLincat :: GF -> Ident -> Ident -> Err Term +lookupLincat = lookupJField jlin + +lookupParamValues :: GF -> Ident -> Ident -> Err [Term] +lookupParamValues gf m c = do + j <- lookupJudgement gf m c + case jdef j of + V _ ts -> return ts + _ -> raise "no parameter values" + +-- infrastructure for lookup + +lookupIdent :: GF -> Ident -> Ident -> Err (Either Judgement Ident) +lookupIdent gf m c = do + mo <- maybe (raise "module not found") return $ mlookup m (gfmodules gf) + maybe (Bad "constant not found") return $ mlookup c (mjments mo) + +lookupJudgement :: GF -> Ident -> Ident -> Err Judgement +lookupJudgement gf m c = do + eji <- lookupIdent gf m c + either return (\n -> lookupJudgement gf n c) eji + +mlookup = Data.Map.lookup + |
