diff options
| author | aarne <aarne@cs.chalmers.se> | 2006-10-01 15:41:32 +0000 |
|---|---|---|
| committer | aarne <aarne@cs.chalmers.se> | 2006-10-01 15:41:32 +0000 |
| commit | e97bbc054f3542e65ecf28d01067a1677fa58644 (patch) | |
| tree | c4d4f6f3b1a47b3c28512650a58d7549add9e841 /src/GF/Compile/GrammarToCanon.hs | |
| parent | 35e17afb3858fb2b9a1792d8ab684b77ecb3d56c (diff) | |
gfcc compilation: know bugs fixed
Diffstat (limited to 'src/GF/Compile/GrammarToCanon.hs')
| -rw-r--r-- | src/GF/Compile/GrammarToCanon.hs | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/GF/Compile/GrammarToCanon.hs b/src/GF/Compile/GrammarToCanon.hs index 089773824..e7da9281d 100644 --- a/src/GF/Compile/GrammarToCanon.hs +++ b/src/GF/Compile/GrammarToCanon.hs @@ -31,7 +31,7 @@ import GF.Canon.MkGFC import qualified GF.Canon.PrintGFC as P import Control.Monad -import Data.List (nub) +import Data.List (nub,sortBy) -- compilation of optimized grammars to canonical GF. AR 5/10/2001 -- 12/5/2003 @@ -155,6 +155,13 @@ redType = redTerm redTerm :: Type -> Err G.Exp redTerm t = return $ rtExp t +-- to normalize records and record types +sortByLabel :: (a -> Label) -> [a] -> [a] +sortByLabel f = sortBy (\ x y -> compare (f x) (f y)) + +sortByFst :: Ord a => [(a,b)] -> [(a,b)] +sortByFst = sortBy (\ x y -> compare (fst x) (fst y)) + -- resource redParam :: Param -> Err G.ParDef @@ -180,7 +187,7 @@ redCType t = case t of let (ls,ts) = unzip lbs ls' = map redLabel ls ts' <- mapM redCType ts - return $ G.RecType $ map (uncurry G.Lbg) $ zip ls' ts' + return $ G.RecType $ map (uncurry G.Lbg) $ sortByFst $ zip ls' ts' Table p v -> liftM2 G.Table (redCType p) (redCType v) Q m c -> liftM G.Cn $ redQIdent (m,c) QC m c -> liftM G.Cn $ redQIdent (m,c) @@ -208,7 +215,7 @@ redCTerm t = case t of let (ls,tts) = unzip rs ls' = map redLabel ls ts <- mapM (redCTerm . snd) tts - return $ G.R $ map (uncurry G.Ass) $ zip ls' ts + return $ G.R $ map (uncurry G.Ass) $ sortByFst $ zip ls' ts RecType [] -> return $ G.R [] --- comes out in parsing P tr l -> do tr' <- redCTerm tr @@ -260,7 +267,7 @@ redPatt p = case p of let (ls,tts) = unzip rs ls' = map redLabel ls ts <- mapM redPatt tts - return $ G.PR $ map (uncurry G.PAss) $ zip ls' ts + return $ G.PR $ map (uncurry G.PAss) $ sortByFst $ zip ls' ts PT _ q -> redPatt q PInt i -> return $ G.PI i PFloat i -> return $ G.PF i |
