summaryrefslogtreecommitdiff
path: root/src/compiler/GF/Command/TreeOperations.hs
diff options
context:
space:
mode:
authoraarne <aarne@chalmers.se>2013-11-05 17:28:47 +0000
committeraarne <aarne@chalmers.se>2013-11-05 17:28:47 +0000
commitaba666c5bc7a46cdc7de7e2a36869456c34909bd (patch)
treea5b8f7a8f8ba8a7778d4bf72c388fb0a5b8853ad /src/compiler/GF/Command/TreeOperations.hs
parent3814841d7d3b77b3f033cb98c1c0a04ac39435d7 (diff)
linearization by chunks in the GF shell: a new command 'lc' needed because 'l' requires type checking and trees with metavariable function heads don't type check. This will hopefully be a temporary command.
Diffstat (limited to 'src/compiler/GF/Command/TreeOperations.hs')
-rw-r--r--src/compiler/GF/Command/TreeOperations.hs14
1 files changed, 13 insertions, 1 deletions
diff --git a/src/compiler/GF/Command/TreeOperations.hs b/src/compiler/GF/Command/TreeOperations.hs
index bf8882802..220c8f561 100644
--- a/src/compiler/GF/Command/TreeOperations.hs
+++ b/src/compiler/GF/Command/TreeOperations.hs
@@ -1,6 +1,7 @@
module GF.Command.TreeOperations (
treeOp,
- allTreeOps
+ allTreeOps,
+ treeChunks
) where
import PGF
@@ -30,6 +31,8 @@ allTreeOps pgf = [
Left $ concatMap subtrees)),
("funs",("return all fun functions appearing in the tree, with duplications",
Left $ concatMap funNodes))
+--- ("chunks",("return all chunks, i.e. maximal subtrees where the top node is not a metavariable",
+--- Left $ concatMap treeChunks)) --- a tree with ? head does not type check anyway AR 5/11/2013
]
largest :: [Expr] -> [Expr]
@@ -42,6 +45,15 @@ smallest = sortBy (\t u -> compare (size t) (size u)) where
EApp e1 e2 -> size e1 + size e2 + 1
_ -> 1
+treeChunks :: Expr -> [Expr]
+treeChunks = snd . cks where
+ cks t = case unAppForm t of
+ (EFun f, ts) -> case unzip (map cks ts) of
+ (bs,_) | and bs -> (True, [t])
+ (_,cts) -> (False,concat cts)
+ (EMeta _, ts) -> (False,concatMap (snd . cks) ts)
+ _ -> (True, [t])
+
subtrees :: Expr -> [Expr]
subtrees t = t : case unApp t of
Just (f,ts) -> concatMap subtrees ts