This repository has been archived by the owner on Feb 19, 2020. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 82
/
Debinarizer.scala
63 lines (53 loc) · 2.34 KB
/
Debinarizer.scala
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
package epic.trees
import java.io.ObjectStreamException
/**
* Class that turns BinarizedTrees into normal trees. Should
* replace unary chains in addition to removing intermediates.
*
* @author dlwh
**/
trait Debinarizer[L] extends (BinarizedTree[L] => Tree[L]) with Serializable
object Debinarizer {
@SerialVersionUID(1L)
implicit object AnnotatedLabelDebinarizer extends Debinarizer[AnnotatedLabel] {
def apply(t: BinarizedTree[AnnotatedLabel]): Tree[AnnotatedLabel] = {
Trees.debinarize(replaceUnaries(t), {(_: AnnotatedLabel).isIntermediate}).map(_.baseAnnotatedLabel)
}
def replaceUnaries(t: Tree[AnnotatedLabel]): Tree[AnnotatedLabel] = t match {
case UnaryTree(a, child, chain, span) if a.label == child.label.label && chain.isEmpty =>
replaceUnaries(child)
case UnaryTree(a, child, chain, span) =>
val deunaried = replaceUnaries(child).asInstanceOf[BinarizedTree[AnnotatedLabel]]
val withChain = chain.foldRight(deunaried){ (label, child) =>
UnaryTree(AnnotatedLabel(label), child, IndexedSeq.empty, span)
}
UnaryTree(a,withChain, IndexedSeq.empty, t.span)
case t@BinaryTree(a, lchild, rchild, span) =>
BinaryTree(a,
replaceUnaries(lchild).asInstanceOf[BinarizedTree[AnnotatedLabel]],
replaceUnaries(rchild).asInstanceOf[BinarizedTree[AnnotatedLabel]], t.span)
case _ => t
}
}
@SerialVersionUID(1L)
implicit object StringDebinarizer extends Debinarizer[String] {
def apply(t: BinarizedTree[String]): Tree[String] = {
Trees.debinarize(Trees.deannotate(replaceUnaries(t)))
}
def replaceUnaries(t: Tree[String]): Tree[String] = t match {
case UnaryTree(a, child, chain, span) if a == child.label && chain.isEmpty =>
replaceUnaries(child)
case UnaryTree(a, child, chain, span) =>
val deunaried = replaceUnaries(child).asInstanceOf[BinarizedTree[String]]
val withChain = chain.foldRight(deunaried){ (label, child) =>
UnaryTree(label, child, IndexedSeq.empty, span)
}
UnaryTree(a,withChain, IndexedSeq.empty, t.span)
case t@BinaryTree(a, lchild, rchild, span) =>
BinaryTree(a,
replaceUnaries(lchild).asInstanceOf[BinarizedTree[String]],
replaceUnaries(rchild).asInstanceOf[BinarizedTree[String]], t.span)
case _ => t
}
}
}