forked from GitHub/gf-core
Fix a problem with pattern macros in pre { } expressions
The old partial evaluator has special rules to convert pattern macros in
pre { } expressions. These rules were missing in the new partial evaluator.
This commit is contained in:
@@ -436,12 +436,14 @@ value2term loc xs v0 =
|
|||||||
VC v1 v2 -> C (v2t v1) (v2t v2)
|
VC v1 v2 -> C (v2t v1) (v2t v2)
|
||||||
VS v1 v2 -> S (v2t v1) (v2t v2)
|
VS v1 v2 -> S (v2t v1) (v2t v2)
|
||||||
VP v l -> P (v2t v) l
|
VP v l -> P (v2t v) l
|
||||||
|
VPatt p -> EPatt p -- hmm
|
||||||
|
-- VPattType v -> ...
|
||||||
VAlts v vvs -> Alts (v2t v) (mapBoth v2t vvs)
|
VAlts v vvs -> Alts (v2t v) (mapBoth v2t vvs)
|
||||||
VStrs vs -> Strs (map v2t vs)
|
VStrs vs -> Strs (map v2t vs)
|
||||||
-- VGlue v1 v2 -> Glue (v2t v1) (v2t v2)
|
-- VGlue v1 v2 -> Glue (v2t v1) (v2t v2)
|
||||||
VExtR v1 v2 -> ExtR (v2t v1) (v2t v2)
|
VExtR v1 v2 -> ExtR (v2t v1) (v2t v2)
|
||||||
VError err -> Error err
|
VError err -> Error err
|
||||||
_ -> bug ("value2term "++show loc++" "++show v0)
|
_ -> bug ("value2term "++show loc++" : "++show v0)
|
||||||
where
|
where
|
||||||
v2t = value2term loc xs
|
v2t = value2term loc xs
|
||||||
v2t' x f = value2term loc (x:xs) (f (gen xs))
|
v2t' x f = value2term loc (x:xs) (f (gen xs))
|
||||||
|
|||||||
@@ -374,12 +374,22 @@ convertTerm opts sel ctype (K t) = return (CStr [SymKS [t]])
|
|||||||
convertTerm opts sel ctype Empty = return (CStr [])
|
convertTerm opts sel ctype Empty = return (CStr [])
|
||||||
convertTerm opts sel ctype (Alts s alts)
|
convertTerm opts sel ctype (Alts s alts)
|
||||||
= return (CStr [SymKP (strings s) [Alt (strings u) (strings v) | (u,v) <- alts]])
|
= return (CStr [SymKP (strings s) [Alt (strings u) (strings v) | (u,v) <- alts]])
|
||||||
where
|
where
|
||||||
strings (K s) = [s]
|
strings (K s) = [s]
|
||||||
strings (C u v) = strings u ++ strings v
|
strings (C u v) = strings u ++ strings v
|
||||||
strings (Strs ss) = concatMap strings ss
|
strings (Strs ss) = concatMap strings ss
|
||||||
strings Empty = [] -- ??
|
strings (EPatt p) = getPatts p
|
||||||
strings t = bug $ "strings "++show t
|
strings Empty = [] -- ??
|
||||||
|
strings t = bug $ "strings "++show t
|
||||||
|
|
||||||
|
getPatts p =
|
||||||
|
case p of
|
||||||
|
PAlt a b -> getPatts a ++ getPatts b
|
||||||
|
PString s -> [s]
|
||||||
|
PSeq a b -> [s ++ t | s <- getPatts a, t <- getPatts b]
|
||||||
|
_ -> ppbug $ hang (text "not valid pattern in pre expression:")
|
||||||
|
4
|
||||||
|
(ppPatt Unqualified 0 p)
|
||||||
|
|
||||||
convertTerm opts sel@(CProj l _) ctype (ExtR t1 t2@(R rs2))
|
convertTerm opts sel@(CProj l _) ctype (ExtR t1 t2@(R rs2))
|
||||||
| l `elem` map fst rs2 = convertTerm opts sel ctype t2
|
| l `elem` map fst rs2 = convertTerm opts sel ctype t2
|
||||||
|
|||||||
Reference in New Issue
Block a user