mirror of
https://github.com/GrammaticalFramework/gf-core.git
synced 2026-05-22 17:42:51 -06:00
showExpr and linearize now refresh the printed variables if needed
This commit is contained in:
@@ -17,7 +17,8 @@ module PGF.Expr(Tree, BindType(..), Expr(..), Literal(..), Patt(..), Equation(..
|
|||||||
MetaId,
|
MetaId,
|
||||||
|
|
||||||
-- helpers
|
-- helpers
|
||||||
pMeta,pArg,pLit,freshName,ppMeta,ppLit,ppParens
|
pMeta,pArg,pLit,freshName,ppMeta,ppLit,ppParens,
|
||||||
|
freshBoundVars
|
||||||
) where
|
) where
|
||||||
|
|
||||||
import PGF.CId
|
import PGF.CId
|
||||||
@@ -235,10 +236,11 @@ pLit = liftM LStr (RP.readS_to_P reads)
|
|||||||
|
|
||||||
ppExpr :: Int -> [CId] -> Expr -> PP.Doc
|
ppExpr :: Int -> [CId] -> Expr -> PP.Doc
|
||||||
ppExpr d scope (EAbs b x e) = let (bs,xs,e1) = getVars [] [] (EAbs b x e)
|
ppExpr d scope (EAbs b x e) = let (bs,xs,e1) = getVars [] [] (EAbs b x e)
|
||||||
|
xs' = freshBoundVars scope xs
|
||||||
in ppParens (d > 1) (PP.char '\\' PP.<>
|
in ppParens (d > 1) (PP.char '\\' PP.<>
|
||||||
PP.hsep (PP.punctuate PP.comma (reverse (List.zipWith ppBind bs xs))) PP.<+>
|
PP.hsep (PP.punctuate PP.comma (reverse (List.zipWith ppBind bs xs'))) PP.<+>
|
||||||
PP.text "->" PP.<+>
|
PP.text "->" PP.<+>
|
||||||
ppExpr 1 (xs++scope) e1)
|
ppExpr 1 (xs' ++ scope) e1)
|
||||||
where
|
where
|
||||||
getVars bs xs (EAbs b x e) = getVars (b:bs) ((freshName x xs):xs) e
|
getVars bs xs (EAbs b x e) = getVars (b:bs) ((freshName x xs):xs) e
|
||||||
getVars bs xs e = (bs,xs,e)
|
getVars bs xs e = (bs,xs,e)
|
||||||
@@ -289,6 +291,15 @@ freshName x xs0 = loop 1 x
|
|||||||
| elem y xs = loop (i+1) (mkCId (show x++show i))
|
| elem y xs = loop (i+1) (mkCId (show x++show i))
|
||||||
| otherwise = y
|
| otherwise = y
|
||||||
|
|
||||||
|
-- refresh new vars xs in scope if needed. AR 2024-03-01
|
||||||
|
freshBoundVars :: [CId] -> [CId] -> [CId]
|
||||||
|
freshBoundVars scope xs = foldr fresh [] xs
|
||||||
|
where
|
||||||
|
fresh x xs' = mkCId (freshName (showCId x) xs') : xs'
|
||||||
|
freshName s xs' =
|
||||||
|
if elem (mkCId s) (xs' ++ scope)
|
||||||
|
then freshName (s ++ "'") xs'
|
||||||
|
else s
|
||||||
|
|
||||||
-----------------------------------------------------
|
-----------------------------------------------------
|
||||||
-- Computation
|
-- Computation
|
||||||
|
|||||||
@@ -81,7 +81,7 @@ linTree pgf cnc e = nub (map snd (lin Nothing 0 e [] [] e []))
|
|||||||
where
|
where
|
||||||
lp = lproductions cnc
|
lp = lproductions cnc
|
||||||
|
|
||||||
lin mb_cty n_fid e0 ys xs (EAbs _ x e) es = lin mb_cty n_fid e0 ys (x:xs) e es
|
lin mb_cty n_fid e0 ys xs (EAbs _ x e) es = lin mb_cty n_fid e0 ys (freshBoundVars (xs ++ ys) [x] ++ xs) e es --fresh: AR 2024
|
||||||
lin mb_cty n_fid e0 ys xs (EApp e1 e2) es = lin mb_cty n_fid e0 ys xs e1 (e2:es)
|
lin mb_cty n_fid e0 ys xs (EApp e1 e2) es = lin mb_cty n_fid e0 ys xs e1 (e2:es)
|
||||||
lin mb_cty n_fid e0 ys xs (EImplArg e) es = lin mb_cty n_fid e0 ys xs e es
|
lin mb_cty n_fid e0 ys xs (EImplArg e) es = lin mb_cty n_fid e0 ys xs e es
|
||||||
lin mb_cty n_fid e0 ys xs (ETyped e _) es = lin mb_cty n_fid e0 ys xs e es
|
lin mb_cty n_fid e0 ys xs (ETyped e _) es = lin mb_cty n_fid e0 ys xs e es
|
||||||
|
|||||||
Reference in New Issue
Block a user