def collectRules(self): custom_ops = {} for name in dir(self): if name.startswith('op_'): precedence = int(name[3:6]) existing = custom_ops.get(precedence) if existing is None: custom_ops[precedence] = [name] else: existing.append(name) precedences = set(operators_by_prec.keys() + custom_ops.keys()) precedences = sorted(precedences) for precedence in precedences: builtin = operators_by_prec.get(precedence, []) for operator in builtin: def p_op(args, operator=operator): return operator.parse(args) p_op.__name__ = 'p_zzzz_%.4d' % precedence #(1000-precedence) rule = operator.get_rule() p_op = parsing_static(p_op) self.addRule(rule, p_op) custom = custom_ops.get(precedence, []) for name in custom: func = getattr(self, name) doc = func.__doc__ def p_op(args, func=func): return func(args) p_op.__name__ = 'p_zzzz_%.4d_%s' % (precedence, name) p_op = parsing_static(p_op) self.addRule(doc, p_op) @parsing_static def p_binary_op(args): return args[0] rule = '' for operator in binary_operators: rule += u'binary_op ::= %s\n' % operator self.addRule(rule, p_binary_op) GenericParser.collectRules(self)
def parse(self, tokens): result = GenericParser.parse(self, tokens) result = result.post_parse() return result
def __init__(self): GenericParser.__init__(self, start='expr')