class RuleInterpreter(Interpreter): norule = Node() def __init__(self, rule): self.rule = Node() self.appendrule(rule) Interpreter.__init__(self) def appendrule(self, rule): shorp = Shorp() shorp.add(rule) self.rule.addChilds(shorp.parse().getChilds(), '+') def matchrule(self, name): rules = self.rule.getChilds() matchr = None for r in rules: if r.getAttr('+') == name: matchr = r break elif r.getAttr('+') == '': matchr = r return matchr def interpretimpl(self, node, intent=-1): if intent<0: rule = self.norule ruletpl = '' else: rulename = node.getAttr('+') rule = self.matchrule(rulename) if rule == None: rule = self.norule ruletpl = rule.getAttr(':') node = self.normalize(node, rule) return getattr(self, 'rule_%s'%ruletpl)(node, rule, intent) def rule_(self, node, rule, intent): text = '' childs = node.getChilds() for child in childs: text += self.interpret(child, intent+1) return text def normalize(self, node, rule): return node
def __init__(self, rule): self.rule = Node() self.appendrule(rule) Interpreter.__init__(self)