def __new__(mcls, name, bases, dct): result = super().__new__(mcls, name, bases, dct) if name == 'Nonterm' or name == 'ListNonterm': return result if not result.__doc__: result.__doc__ = '%nonterm' for name, attr in result.__dict__.items(): if (name.startswith('reduce_') and isinstance(attr, types.FunctionType)): if attr.__doc__ is None: tokens = name.split('_') if name == 'reduce_empty': tokens = ['reduce', '<e>'] doc = r'%reduce {}'.format(' '.join(tokens[1:])) prec = getattr(attr, '__parsing_precedence__', None) if prec is not None: doc += ' [{}]'.format(prec) attr = lambda self, *args, meth=attr: meth(self, *args) attr.__doc__ = doc a = pctx.has_context(attr) a.__doc__ = attr.__doc__ setattr(result, name, a) return result
def __new__(mcls, name, bases, dct, *, type): result = super().__new__(mcls, name, bases, dct) assert type in keywords.keyword_types for token in keywords.by_type[type].values(): def method(inst, *kids): inst.val = kids[0].val method = context.has_context(method) method.__doc__ = "%%reduce %s" % token method.__name__ = 'reduce_%s' % token setattr(result, method.__name__, method) return result