1
0
forked from GitHub/gf-core

Pass test with FoodsFin, by forcibly resorting record fields to make s first

This commit is contained in:
John J. Camilleri
2021-02-15 00:43:53 +01:00
parent d563abb928
commit 109822675b

View File

@@ -15,7 +15,7 @@ import GF.Text.Pretty (pp, render)
import qualified Control.Monad.State as CMS import qualified Control.Monad.State as CMS
import Control.Monad (unless, forM_) import Control.Monad (unless, forM_)
import Data.Either (lefts, rights) import Data.Either (lefts, rights)
import Data.List (elemIndex, find, groupBy) import Data.List (elemIndex, find, groupBy, sortBy)
import qualified Data.Map as Map import qualified Data.Map as Map
import Data.Maybe (catMaybes) import Data.Maybe (catMaybes)
import Text.Printf (printf) import Text.Printf (printf)
@@ -90,10 +90,17 @@ mkCanon2lpgf opts gr am = do
term = foldl L.LFProjection tuple (L.LFInt (pidIx+1):pids') term = foldl L.LFProjection tuple (L.LFInt (pidIx+1):pids')
return term return term
C.PredefValue (C.PredefId "BIND") -> return L.LFBind C.PredefValue (C.PredefId pid) -> case pid of
"BIND" -> return L.LFBind
-- "SOFT_BIND" ->
-- "SOFT_SPACE" ->
-- "CAPIT" ->
-- "ALL_CAPIT" ->
_ -> Left $ printf "Unknown predef function: %s" pid
C.RecordValue rrvs -> do C.RecordValue rrvs -> do
ts <- sequence [ val2lin lv | C.RecordRow lid lv <- rrvs ] let rrvs' = sortRecordRows rrvs
ts <- sequence [ val2lin lv | C.RecordRow lid lv <- rrvs' ]
return $ L.LFTuple ts return $ L.LFTuple ts
C.TableValue lt trvs | isRecordType lt -> go trvs C.TableValue lt trvs | isRecordType lt -> go trvs
@@ -203,6 +210,22 @@ mkParamTuples defs = map (\def -> CMS.evalState (mk' def) 1) defs
] ]
return $ L.LFTuple ns return $ L.LFTuple ns
-- | Always put 's' reocord field first, then sort alphabetically
-- This seems to be done inconsistently in the canonical format
-- Based on GF.Granmar.Macros.sortRec
sortRecord :: C.LinValue -> C.LinValue
sortRecord (C.RecordValue rrvs) = C.RecordValue (sortRecordRows rrvs)
sortRecord lv = lv
sortRecordRows :: [C.RecordRowValue] -> [C.RecordRowValue]
sortRecordRows = sortBy ordLabel
where
ordLabel (C.RecordRow (C.LabelId l1) _) (C.RecordRow (C.LabelId l2) _) =
case (l1,l2) of
("s",_) -> LT
(_,"s") -> GT
(s1,s2) -> compare s1 s2
isParamType :: C.LinType -> Bool isParamType :: C.LinType -> Bool
isParamType (C.ParamType _) = True isParamType (C.ParamType _) = True
isParamType _ = False isParamType _ = False
@@ -249,9 +272,20 @@ ppCanonical = putStrLn . render . pp
dumpCanonical :: C.Grammar -> IO () dumpCanonical :: C.Grammar -> IO ()
dumpCanonical (C.Grammar ab cncs) = do dumpCanonical (C.Grammar ab cncs) = do
putStrLn "" putStrLn ""
let (C.Abstract modId flags cats funs) = ab
print modId
mapM_ print cats
putStrLn ""
mapM_ print funs
putStrLn ""
forM_ cncs $ \(C.Concrete modId absModId flags params lincats lindefs) -> do forM_ cncs $ \(C.Concrete modId absModId flags params lincats lindefs) -> do
print modId
mapM_ print params mapM_ print params
putStrLn "" putStrLn ""
mapM_ print lincats
putStrLn ""
mapM_ print lindefs mapM_ print lindefs
putStrLn "" putStrLn ""