import tpg class Leaf(object): def __init__(self, label): self.label = label def __str__(self): return self.label class Internal(object): def __init__(self, label, subtrees): self.label = label self.subtrees = subtrees def __str__(self): return '(%s)%s' % (','.join(str(st) for st in self.subtrees),self.label) class Branch(object): def __init__(self, subtree, length): self.subtree = subtree self.length = length def __str__(self): return '%s:%s' % (str(self.subtree),str(self.length)) class Parser(tpg.Parser): r""" separator space '\s+' ; token label '[^,:;() \t\n]+' ; START/tree -> Subtree/tree ';' ; Subtree/tree -> Internal/tree | Leaf/tree ; Leaf/leaf -> Name/name $ leaf = Leaf(name) ; Internal/tree -> '\(' BranchList/st '\)' Name/n $ tree = Internal(n,st) ; BranchList/blist -> Branch/b (',' BranchList/bl $ blist = bl+[b] $ )+ | Branch/branch $ blist = [branch] ; Branch/branch -> Subtree/st Length/l $ branch = Branch(st,l) ; Name/name -> label/name | Empty $ name = "" ; Length/length -> ':' Number/length | Empty $ length = 0 ; Number/n -> label/l $ n = float(l) ; Empty -> ; """