summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authoraarne <aarne@chalmers.se>2013-03-12 14:58:06 +0000
committeraarne <aarne@chalmers.se>2013-03-12 14:58:06 +0000
commit78b3487cb73f7efa98b0340b53f87d99095bd10e (patch)
treeef366e72c790d3129b70d49e14225cd824e7e37c /src
parentca3716857c58694b5ad9fcc8bf3a077c45709def (diff)
command pt -subtrees that analyses a tree into the set of subtrees. Using pt -subtrees <bigtree> | l -treebank for debugging the lin of a big tree
Diffstat (limited to 'src')
-rw-r--r--src/compiler/GF/Command/TreeOperations.hs13
1 files changed, 12 insertions, 1 deletions
diff --git a/src/compiler/GF/Command/TreeOperations.hs b/src/compiler/GF/Command/TreeOperations.hs
index b9ec7f538..330c82593 100644
--- a/src/compiler/GF/Command/TreeOperations.hs
+++ b/src/compiler/GF/Command/TreeOperations.hs
@@ -20,10 +20,17 @@ allTreeOps pgf = [
Right $ \f -> map (transfer pgf f))),
("paraphrase",("paraphrase by using semantic definitions (def)",
Left $ nub . concatMap (paraphrase pgf))),
+ ("largest",("sort trees from largest to smallest, in number of nodes",
+ Left $ largest)),
("smallest",("sort trees from smallest to largest, in number of nodes",
- Left $ smallest))
+ Left $ smallest)),
+ ("subtrees",("return all fully applied subtrees (stopping at abstractions), by default sorted from the largest",
+ Left $ concatMap subtrees))
]
+largest :: [Expr] -> [Expr]
+largest = reverse . smallest
+
smallest :: [Expr] -> [Expr]
smallest = sortBy (\t u -> compare (size t) (size u)) where
size t = case t of
@@ -31,6 +38,10 @@ smallest = sortBy (\t u -> compare (size t) (size u)) where
EApp e1 e2 -> size e1 + size e2 + 1
_ -> 1
+subtrees :: Expr -> [Expr]
+subtrees t = t : case unApp t of
+ Just (f,ts) -> concatMap subtrees ts
+ _ -> [] -- don't go under abstractions
--- simple-minded transfer; should use PGF.Expr.match