summaryrefslogtreecommitdiff
path: root/src/GF/Grammar
diff options
context:
space:
mode:
authoraarne <unknown>2003-11-05 14:42:29 +0000
committeraarne <unknown>2003-11-05 14:42:29 +0000
commit49c17be41a7d572d27df74eb7351b672e85953a1 (patch)
tree2856b2b2af3c3d6adea285dcb42173b920751897 /src/GF/Grammar
parented1d2a2954a3c955625cf210905a67e0683c8411 (diff)
working with interfaces
Diffstat (limited to 'src/GF/Grammar')
-rw-r--r--src/GF/Grammar/Compute.hs6
-rw-r--r--src/GF/Grammar/Lookup.hs55
2 files changed, 36 insertions, 25 deletions
diff --git a/src/GF/Grammar/Compute.hs b/src/GF/Grammar/Compute.hs
index 1f1eba28c..3dd90012d 100644
--- a/src/GF/Grammar/Compute.hs
+++ b/src/GF/Grammar/Compute.hs
@@ -129,10 +129,12 @@ computeTerm gr = comp where
(K a, Alts (d,vs)) -> do
let glx = Glue x
comp g $ Alts (glx d, [(glx v,c) | (v,c) <- vs])
- (Alts _, K a) -> do
- x' <- strsFromTerm x
+ (Alts _, K a) -> checks [do
+ x' <- strsFromTerm x -- this may fail when compiling opers
return $ variants [
foldr1 C (map K (str2strings (glueStr v (str a)))) | v <- x']
+ ,return $ Glue x y
+ ]
_ -> do
mapM_ checkNoArgVars [x,y]
r <- composOp (comp g) t
diff --git a/src/GF/Grammar/Lookup.hs b/src/GF/Grammar/Lookup.hs
index 83d6787ef..684b08cff 100644
--- a/src/GF/Grammar/Lookup.hs
+++ b/src/GF/Grammar/Lookup.hs
@@ -10,19 +10,23 @@ import Monad
-- lookup in resource and concrete in compiling; for abstract, use Look
lookupResDef :: SourceGrammar -> Ident -> Ident -> Err Term
-lookupResDef gr m c = do
- mi <- lookupModule gr m
- case mi of
- ModMod mo -> do
- info <- lookupInfo mo c
- case info of
- ResOper _ (Yes t) -> return $ qualifAnnot m t
- ResOper _ Nope -> return $ Q m c
- AnyInd _ n -> lookupResDef gr n c
- ResParam _ -> return $ QC m c
- ResValue _ -> return $ QC m c
- _ -> Bad $ prt c +++ "is not defined in resource" +++ prt m
- _ -> Bad $ prt m +++ "is not a resource"
+lookupResDef gr = look True where
+ look isTop m c = do
+ mi <- lookupModule gr m
+ case mi of
+ ModMod mo -> do
+ info <- lookupInfo mo c
+ case info of
+ ResOper _ (Yes t) -> return $ qualifAnnot m t
+ ResOper _ Nope -> return (Q m c) ---- if isTop then lookExt m c
+ ---- else prtBad "cannot find in exts" c
+ AnyInd _ n -> look False n c
+ ResParam _ -> return $ QC m c
+ ResValue _ -> return $ QC m c
+ _ -> Bad $ prt c +++ "is not defined in resource" +++ prt m
+ _ -> Bad $ prt m +++ "is not a resource"
+ lookExt m c =
+ checks ([look False n c | n <- allExtensions gr m] ++ [return (Q m c)])
lookupResType :: SourceGrammar -> Ident -> Ident -> Err Type
lookupResType gr m c = do
@@ -40,16 +44,21 @@ lookupResType gr m c = do
_ -> Bad $ prt m +++ "is not a resource"
lookupParams :: SourceGrammar -> Ident -> Ident -> Err [Param]
-lookupParams gr m c = do
- mi <- lookupModule gr m
- case mi of
- ModMod mo -> do
- info <- lookupInfo mo c
- case info of
- ResParam (Yes ps) -> return ps
- AnyInd _ n -> lookupParams gr n c
- _ -> Bad $ prt c +++ "has no parameters defined in resource" +++ prt m
- _ -> Bad $ prt m +++ "is not a resource"
+lookupParams gr = look True where
+ look isTop m c = do
+ mi <- lookupModule gr m
+ case mi of
+ ModMod mo -> do
+ info <- lookupInfo mo c
+ case info of
+ ResParam (Yes ps) -> return ps
+ ---- ResParam Nope -> if isTop then lookExt m c
+ ---- else prtBad "cannot find params in exts" c
+ AnyInd _ n -> look False n c
+ _ -> Bad $ prt c +++ "has no parameters defined in resource" +++ prt m
+ _ -> Bad $ prt m +++ "is not a resource"
+ lookExt m c =
+ checks [look False n c | n <- allExtensions gr m]
lookupParamValues :: SourceGrammar -> Ident -> Ident -> Err [Term]
lookupParamValues gr m c = do