diff options
| author | aarne <unknown> | 2004-09-23 14:41:42 +0000 |
|---|---|---|
| committer | aarne <unknown> | 2004-09-23 14:41:42 +0000 |
| commit | 2c60a2d82a0d7b90924e7dbbcacf36afb8549d17 (patch) | |
| tree | 0a04734e741c294cb9f58cfdcafa2ff2b55894dd /src/GF/Grammar | |
| parent | d5b4230d6dbee8c03eedf8d181dfa2badf1a954b (diff) | |
Ints n
Diffstat (limited to 'src/GF/Grammar')
| -rw-r--r-- | src/GF/Grammar/AppPredefined.hs | 5 | ||||
| -rw-r--r-- | src/GF/Grammar/Lookup.hs | 2 | ||||
| -rw-r--r-- | src/GF/Grammar/MMacros.hs | 12 | ||||
| -rw-r--r-- | src/GF/Grammar/Macros.hs | 1 | ||||
| -rw-r--r-- | src/GF/Grammar/PatternMatch.hs | 1 |
5 files changed, 20 insertions, 1 deletions
diff --git a/src/GF/Grammar/AppPredefined.hs b/src/GF/Grammar/AppPredefined.hs index 7ff479df0..f92cb6bc1 100644 --- a/src/GF/Grammar/AppPredefined.hs +++ b/src/GF/Grammar/AppPredefined.hs @@ -15,16 +15,18 @@ isInPredefined = err (const True) (const False) . typPredefined typPredefined :: Ident -> Err Type typPredefined c@(IC f) = case f of "Int" -> return typePType + "Ints" -> return $ mkFunType [cnPredef "Int"] typePType "PBool" -> return typePType "PFalse" -> return $ cnPredef "PBool" "PTrue" -> return $ cnPredef "PBool" "dp" -> return $ mkFunType [cnPredef "Int",typeTok] typeTok "drop" -> return $ mkFunType [cnPredef "Int",typeTok] typeTok "eqInt" -> return $ mkFunType [cnPredef "Int",cnPredef "Int"] (cnPredef "PBool") + "lessInt"-> return $ mkFunType [cnPredef "Int",cnPredef "Int"] (cnPredef "PBool") "eqStr" -> return $ mkFunType [typeTok,typeTok] (cnPredef "PBool") "length" -> return $ mkFunType [typeTok] (cnPredef "Int") "occur" -> return $ mkFunType [typeTok,typeTok] (cnPredef "PBool") - "plus" -> return $ mkFunType [cnPredef "Int",cnPredef "Int"] (cnPredef "PInt") + "plus" -> return $ mkFunType [cnPredef "Int",cnPredef "Int"] (cnPredef "Int") ---- "read" -> (P : Type) -> Tok -> P ---- "show" -> (P : Type) -> P -> Tok "take" -> return $ mkFunType [cnPredef "Int",typeTok] typeTok @@ -51,6 +53,7 @@ appPredefined t = case t of ("eqStr",K s, K t) -> if s == t then predefTrue else predefFalse ("occur",K s, K t) -> if substring s t then predefTrue else predefFalse ("eqInt",EInt i, EInt j) -> if i==j then predefTrue else predefFalse + ("lessInt",EInt i, EInt j) -> if i<j then predefTrue else predefFalse ("plus", EInt i, EInt j) -> EInt $ i+j ("show", _, t) -> K $ prt t ("read", _, K s) -> str2tag s --- because of K, only works for atomic tags diff --git a/src/GF/Grammar/Lookup.hs b/src/GF/Grammar/Lookup.hs index f735730df..19dc4cda1 100644 --- a/src/GF/Grammar/Lookup.hs +++ b/src/GF/Grammar/Lookup.hs @@ -78,6 +78,8 @@ lookupFirstTag gr m c = do allParamValues :: SourceGrammar -> Type -> Err [Term] allParamValues cnc ptyp = case ptyp of + App (Q (IC "Predef") (IC "Ints")) (EInt n) -> + return [EInt i | i <- [0..n]] QC p c -> lookupParamValues cnc p c RecType r -> do let (ls,tys) = unzip r diff --git a/src/GF/Grammar/MMacros.hs b/src/GF/Grammar/MMacros.hs index 15e9b3c45..617e76437 100644 --- a/src/GF/Grammar/MMacros.hs +++ b/src/GF/Grammar/MMacros.hs @@ -272,3 +272,15 @@ string2var :: String -> Ident string2var s = case s of c:'_':i -> identV (readIntArg i,[c]) --- _ -> zIdent s + +-- reindex variables so that they tell nesting depth level + +reindexTerm :: Term -> Term +reindexTerm = qualif (0,[]) where + qualif dg@(d,g) t = case t of + Abs x b -> let x' = ind x d in Abs x' $ qualif (d+1, (x,x'):g) b + Prod x a b -> let x' = ind x d in Prod x' (qualif dg a) $ qualif (d+1, (x,x'):g) b + Vr x -> Vr $ look x g + _ -> composSafeOp (qualif dg) t + look x = maybe x id . lookup x --- if x is not in scope it is unchanged + ind x d = identC $ prIdent x ++ "_" ++ show d diff --git a/src/GF/Grammar/Macros.hs b/src/GF/Grammar/Macros.hs index b2786e4c4..f11b9bbe9 100644 --- a/src/GF/Grammar/Macros.hs +++ b/src/GF/Grammar/Macros.hs @@ -271,6 +271,7 @@ typeStrs = srt "Strs" typeString = constPredefRes "String" typeInt = constPredefRes "Int" +typeInts i = App (constPredefRes "Ints") (EInt i) constPredefRes s = Q (IC "Predef") (zIdent s) diff --git a/src/GF/Grammar/PatternMatch.hs b/src/GF/Grammar/PatternMatch.hs index ecc34709b..61f6a300d 100644 --- a/src/GF/Grammar/PatternMatch.hs +++ b/src/GF/Grammar/PatternMatch.hs @@ -79,6 +79,7 @@ isInConstantForm trm = case trm of R r -> all (isInConstantForm . snd . snd) r K _ -> True Alias _ _ t -> isInConstantForm t + EInt _ -> True _ -> False ---- isInArgVarForm trm varsOfPatt :: Patt -> [Ident] |
