mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-04-22 19:22:50 -06:00
GF.Grammar.Lookup.allParamValues now works for table types as well
This commit is contained in:
@@ -133,15 +133,20 @@ lookupParamValues gr c = do
|
|||||||
_ -> Bad $ render (ppQIdent Qualified c <+> text "has no parameter values defined")
|
_ -> Bad $ render (ppQIdent Qualified c <+> text "has no parameter values defined")
|
||||||
|
|
||||||
allParamValues :: SourceGrammar -> Type -> Err [Term]
|
allParamValues :: SourceGrammar -> Type -> Err [Term]
|
||||||
allParamValues cnc ptyp = case ptyp of
|
allParamValues cnc ptyp =
|
||||||
_ | Just n <- isTypeInts ptyp -> return [EInt i | i <- [0..n]]
|
case ptyp of
|
||||||
QC c -> lookupParamValues cnc c
|
_ | Just n <- isTypeInts ptyp -> return [EInt i | i <- [0..n]]
|
||||||
Q c -> lookupResDef cnc c >>= allParamValues cnc
|
QC c -> lookupParamValues cnc c
|
||||||
RecType r -> do
|
Q c -> lookupResDef cnc c >>= allParamValues cnc
|
||||||
|
RecType r -> do
|
||||||
let (ls,tys) = unzip $ sortByFst r
|
let (ls,tys) = unzip $ sortByFst r
|
||||||
tss <- mapM (allParamValues cnc) tys
|
tss <- mapM (allParamValues cnc) tys
|
||||||
return [R (zipAssign ls ts) | ts <- combinations tss]
|
return [R (zipAssign ls ts) | ts <- combinations tss]
|
||||||
_ -> Bad (render (text "cannot find parameter values for" <+> ppTerm Unqualified 0 ptyp))
|
Table pt vt -> do
|
||||||
|
pvs <- allParamValues cnc pt
|
||||||
|
vvs <- allParamValues cnc vt
|
||||||
|
return [V pt ts | ts <- combinations (replicate (length pvs) vvs)]
|
||||||
|
_ -> Bad (render (text "cannot find parameter values for" <+> ppTerm Unqualified 0 ptyp))
|
||||||
where
|
where
|
||||||
-- to normalize records and record types
|
-- to normalize records and record types
|
||||||
sortByFst = sortBy (\ x y -> compare (fst x) (fst y))
|
sortByFst = sortBy (\ x y -> compare (fst x) (fst y))
|
||||||
|
|||||||
Reference in New Issue
Block a user