def test_loop(self): matcher = Delayed() matcher += (Any() | matcher) > append('x') matcher.config.clear().compose_transforms() parser = matcher.get_parse() result = parser('a')[0] assert result == 'ax', result assert isinstance(parser.matcher, Delayed)
def test_str(self): class Term(Node): pass class Factor(Node): pass class Expression(Node): pass expression = Delayed() number = Digit()[1:,...] > 'number' term = (number | '(' / expression / ')') > Term muldiv = Any('*/') > 'operator' factor = (term / (muldiv / term)[0::]) > Factor addsub = Any('+-') > 'operator' expression += (factor / (addsub / factor)[0::]) > Expression description = repr(expression) self.assert_same(description, r'''Delayed(matcher=Transform:<apply>( TransformableTrampolineWrapper<And:<>>( Transform:<apply>( TransformableTrampolineWrapper<And:<>>( Transform:<apply>( TransformableTrampolineWrapper<Or:<>>( Transform:<apply>( Transform:<add>( TrampolineWrapper<DepthFirst>( start=1, stop=None, rest=FunctionWrapper<Any:<>>('0123456789'), first=FunctionWrapper<Any:<>>('0123456789')), TransformationWrapper(<add>)), TransformationWrapper(<apply>)), TransformableTrampolineWrapper<And:<>>( TransformableTrampolineWrapper<And:<>>( FunctionWrapper<Literal:<>>('('), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), [Delayed]), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), FunctionWrapper<Literal:<>>(')'))), TransformationWrapper(<apply>)), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=TransformableTrampolineWrapper<And:<>>( Transform:<apply>( FunctionWrapper<Any:<>>('*/'), TransformationWrapper(<apply>)), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), Transform:<apply>( TransformableTrampolineWrapper<Or:<>>( Transform:<apply>( Transform:<add>( TrampolineWrapper<DepthFirst>( start=1, stop=None, rest=FunctionWrapper<Any:<>>('0123456789'), first=FunctionWrapper<Any:<>>('0123456789')), TransformationWrapper(<add>)), TransformationWrapper(<apply>)), TransformableTrampolineWrapper<And:<>>( TransformableTrampolineWrapper<And:<>>( FunctionWrapper<Literal:<>>('('), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), [Delayed]), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), FunctionWrapper<Literal:<>>(')'))), TransformationWrapper(<apply>))), first=TransformableTrampolineWrapper<And:<>>( Transform:<apply>( FunctionWrapper<Any:<>>('*/'), TransformationWrapper(<apply>)), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), Transform:<apply>( TransformableTrampolineWrapper<Or:<>>( Transform:<apply>( Transform:<add>( TrampolineWrapper<DepthFirst>( start=1, stop=None, rest=FunctionWrapper<Any:<>>('0123456789'), first=FunctionWrapper<Any:<>>('0123456789')), TransformationWrapper(<add>)), TransformationWrapper(<apply>)), TransformableTrampolineWrapper<And:<>>( TransformableTrampolineWrapper<And:<>>( FunctionWrapper<Literal:<>>('('), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), [Delayed]), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), FunctionWrapper<Literal:<>>(')'))), TransformationWrapper(<apply>))))), TransformationWrapper(<apply>)), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=TransformableTrampolineWrapper<And:<>>( Transform:<apply>( FunctionWrapper<Any:<>>('+-'), TransformationWrapper(<apply>)), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), Transform:<apply>( TransformableTrampolineWrapper<And:<>>( Transform:<apply>( TransformableTrampolineWrapper<Or:<>>( Transform:<apply>( Transform:<add>( TrampolineWrapper<DepthFirst>( start=1, stop=None, rest=FunctionWrapper<Any:<>>('0123456789'), first=FunctionWrapper<Any:<>>('0123456789')), TransformationWrapper(<add>)), TransformationWrapper(<apply>)), TransformableTrampolineWrapper<And:<>>( TransformableTrampolineWrapper<And:<>>( FunctionWrapper<Literal:<>>('('), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), [Delayed]), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), FunctionWrapper<Literal:<>>(')'))), TransformationWrapper(<apply>)), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=TransformableTrampolineWrapper<And:<>>( Transform:<apply>( FunctionWrapper<Any:<>>('*/'), TransformationWrapper(<apply>)), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), Transform:<apply>( TransformableTrampolineWrapper<Or:<>>( Transform:<apply>( Transform:<add>( TrampolineWrapper<DepthFirst>( start=1, stop=None, rest=FunctionWrapper<Any:<>>('0123456789'), first=FunctionWrapper<Any:<>>('0123456789')), TransformationWrapper(<add>)), TransformationWrapper(<apply>)), TransformableTrampolineWrapper<And:<>>( TransformableTrampolineWrapper<And:<>>( FunctionWrapper<Literal:<>>('('), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), [Delayed]), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), FunctionWrapper<Literal:<>>(')'))), TransformationWrapper(<apply>))), first=TransformableTrampolineWrapper<And:<>>( Transform:<apply>( FunctionWrapper<Any:<>>('*/'), TransformationWrapper(<apply>)), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), Transform:<apply>( TransformableTrampolineWrapper<Or:<>>( Transform:<apply>( Transform:<add>( TrampolineWrapper<DepthFirst>( start=1, stop=None, rest=FunctionWrapper<Any:<>>('0123456789'), first=FunctionWrapper<Any:<>>('0123456789')), TransformationWrapper(<add>)), TransformationWrapper(<apply>)), TransformableTrampolineWrapper<And:<>>( TransformableTrampolineWrapper<And:<>>( FunctionWrapper<Literal:<>>('('), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), [Delayed]), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), FunctionWrapper<Literal:<>>(')'))), TransformationWrapper(<apply>))))), TransformationWrapper(<apply>))), first=TransformableTrampolineWrapper<And:<>>( Transform:<apply>( FunctionWrapper<Any:<>>('+-'), TransformationWrapper(<apply>)), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), Transform:<apply>( TransformableTrampolineWrapper<And:<>>( Transform:<apply>( TransformableTrampolineWrapper<Or:<>>( Transform:<apply>( Transform:<add>( TrampolineWrapper<DepthFirst>( start=1, stop=None, rest=FunctionWrapper<Any:<>>('0123456789'), first=FunctionWrapper<Any:<>>('0123456789')), TransformationWrapper(<add>)), TransformationWrapper(<apply>)), TransformableTrampolineWrapper<And:<>>( TransformableTrampolineWrapper<And:<>>( FunctionWrapper<Literal:<>>('('), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), [Delayed]), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), FunctionWrapper<Literal:<>>(')'))), TransformationWrapper(<apply>)), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=TransformableTrampolineWrapper<And:<>>( Transform:<apply>( FunctionWrapper<Any:<>>('*/'), TransformationWrapper(<apply>)), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), Transform:<apply>( TransformableTrampolineWrapper<Or:<>>( Transform:<apply>( Transform:<add>( TrampolineWrapper<DepthFirst>( start=1, stop=None, rest=FunctionWrapper<Any:<>>('0123456789'), first=FunctionWrapper<Any:<>>('0123456789')), TransformationWrapper(<add>)), TransformationWrapper(<apply>)), TransformableTrampolineWrapper<And:<>>( TransformableTrampolineWrapper<And:<>>( FunctionWrapper<Literal:<>>('('), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), [Delayed]), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), FunctionWrapper<Literal:<>>(')'))), TransformationWrapper(<apply>))), first=TransformableTrampolineWrapper<And:<>>( Transform:<apply>( FunctionWrapper<Any:<>>('*/'), TransformationWrapper(<apply>)), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), Transform:<apply>( TransformableTrampolineWrapper<Or:<>>( Transform:<apply>( Transform:<add>( TrampolineWrapper<DepthFirst>( start=1, stop=None, rest=FunctionWrapper<Any:<>>('0123456789'), first=FunctionWrapper<Any:<>>('0123456789')), TransformationWrapper(<add>)), TransformationWrapper(<apply>)), TransformableTrampolineWrapper<And:<>>( TransformableTrampolineWrapper<And:<>>( FunctionWrapper<Literal:<>>('('), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), [Delayed]), Transform:<add>( TrampolineWrapper<DepthFirst>( start=0, stop=None, rest=FunctionWrapper<Any:<>>(' \t'), first=FunctionWrapper<Any:<>>(' \t')), TransformationWrapper(<add>)), FunctionWrapper<Literal:<>>(')'))), TransformationWrapper(<apply>))))), TransformationWrapper(<apply>))))), TransformationWrapper(<apply>)))''') parser = expression.get_parse() description = parser.matcher.tree() self.assert_same(description, r"""TransformableTrampolineWrapper +- Transform | +- Delayed | | `- matcher TransformableTrampolineWrapper | | +- TransformableTrampolineWrapper | | | +- TransformableTrampolineWrapper | | | | +- NfaRegexp | | | | | +- Sequence(...) | | | | | `- alphabet <Unicode> | | | | `- TransformableTrampolineWrapper | | | | +- FunctionWrapper | | | | | `- '(' | | | | +- NfaRegexp | | | | | +- Sequence(...) | | | | | `- alphabet <Unicode> | | | | +- Transform | | | | | +- <loop> | | | | | `- TransformationWrapper(<apply>) | | | | +- NfaRegexp | | | | | +- Sequence(...) | | | | | `- alphabet <Unicode> | | | | `- FunctionWrapper | | | | `- ')' | | | +- NfaRegexp | | | | +- Sequence(...) | | | | `- alphabet <Unicode> | | | `- TrampolineWrapper | | | +- start 0 | | | +- stop None | | | +- rest TransformableTrampolineWrapper | | | | +- FunctionWrapper | | | | | `- '*/' | | | | +- NfaRegexp | | | | | +- Sequence(...) | | | | | `- alphabet <Unicode> | | | | `- TransformableTrampolineWrapper | | | | +- NfaRegexp | | | | | +- Sequence(...) | | | | | `- alphabet <Unicode> | | | | `- TransformableTrampolineWrapper | | | | +- FunctionWrapper | | | | | `- '(' | | | | +- NfaRegexp | | | | | +- Sequence(...) | | | | | `- alphabet <Unicode> | | | | +- Transform | | | | | +- <loop> | | | | | `- TransformationWrapper(<apply>) | | | | +- NfaRegexp | | | | | +- Sequence(...) | | | | | `- alphabet <Unicode> | | | | `- FunctionWrapper | | | | `- ')' | | | `- first TransformableTrampolineWrapper | | | +- FunctionWrapper | | | | `- '*/' | | | +- NfaRegexp | | | | +- Sequence(...) | | | | `- alphabet <Unicode> | | | `- TransformableTrampolineWrapper | | | +- NfaRegexp | | | | +- Sequence(...) | | | | `- alphabet <Unicode> | | | `- TransformableTrampolineWrapper | | | +- FunctionWrapper | | | | `- '(' | | | +- NfaRegexp | | | | +- Sequence(...) | | | | `- alphabet <Unicode> | | | +- Transform | | | | +- <loop> | | | | `- TransformationWrapper(<apply>) | | | +- NfaRegexp | | | | +- Sequence(...) | | | | `- alphabet <Unicode> | | | `- FunctionWrapper | | | `- ')' | | +- NfaRegexp | | | +- Sequence(...) | | | `- alphabet <Unicode> | | `- TrampolineWrapper | | +- start 0 | | +- stop None | | +- rest TransformableTrampolineWrapper | | | +- FunctionWrapper | | | | `- '+-' | | | +- NfaRegexp | | | | +- Sequence(...) | | | | `- alphabet <Unicode> | | | `- TransformableTrampolineWrapper | | | +- TransformableTrampolineWrapper | | | | +- NfaRegexp | | | | | +- Sequence(...) | | | | | `- alphabet <Unicode> | | | | `- TransformableTrampolineWrapper | | | | +- FunctionWrapper | | | | | `- '(' | | | | +- NfaRegexp | | | | | +- Sequence(...) | | | | | `- alphabet <Unicode> | | | | +- Transform | | | | | +- <loop> | | | | | `- TransformationWrapper(<apply>) | | | | +- NfaRegexp | | | | | +- Sequence(...) | | | | | `- alphabet <Unicode> | | | | `- FunctionWrapper | | | | `- ')' | | | +- NfaRegexp | | | | +- Sequence(...) | | | | `- alphabet <Unicode> | | | `- TrampolineWrapper | | | +- start 0 | | | +- stop None | | | +- rest TransformableTrampolineWrapper | | | | +- FunctionWrapper | | | | | `- '*/' | | | | +- NfaRegexp | | | | | +- Sequence(...) | | | | | `- alphabet <Unicode> | | | | `- TransformableTrampolineWrapper | | | | +- NfaRegexp | | | | | +- Sequence(...) | | | | | `- alphabet <Unicode> | | | | `- TransformableTrampolineWrapper | | | | +- FunctionWrapper | | | | | `- '(' | | | | +- NfaRegexp | | | | | +- Sequence(...) | | | | | `- alphabet <Unicode> | | | | +- Transform | | | | | +- <loop> | | | | | `- TransformationWrapper(<apply>) | | | | +- NfaRegexp | | | | | +- Sequence(...) | | | | | `- alphabet <Unicode> | | | | `- FunctionWrapper | | | | `- ')' | | | `- first TransformableTrampolineWrapper | | | +- FunctionWrapper | | | | `- '*/' | | | +- NfaRegexp | | | | +- Sequence(...) | | | | `- alphabet <Unicode> | | | `- TransformableTrampolineWrapper | | | +- NfaRegexp | | | | +- Sequence(...) | | | | `- alphabet <Unicode> | | | `- TransformableTrampolineWrapper | | | +- FunctionWrapper | | | | `- '(' | | | +- NfaRegexp | | | | +- Sequence(...) | | | | `- alphabet <Unicode> | | | +- Transform | | | | +- <loop> | | | | `- TransformationWrapper(<apply>) | | | +- NfaRegexp | | | | +- Sequence(...) | | | | `- alphabet <Unicode> | | | `- FunctionWrapper | | | `- ')' | | `- first TransformableTrampolineWrapper | | +- FunctionWrapper | | | `- '+-' | | +- NfaRegexp | | | +- Sequence(...) | | | `- alphabet <Unicode> | | `- TransformableTrampolineWrapper | | +- TransformableTrampolineWrapper | | | +- NfaRegexp | | | | +- Sequence(...) | | | | `- alphabet <Unicode> | | | `- TransformableTrampolineWrapper | | | +- FunctionWrapper | | | | `- '(' | | | +- NfaRegexp | | | | +- Sequence(...) | | | | `- alphabet <Unicode> | | | +- Transform | | | | +- <loop> | | | | `- TransformationWrapper(<apply>) | | | +- NfaRegexp | | | | +- Sequence(...) | | | | `- alphabet <Unicode> | | | `- FunctionWrapper | | | `- ')' | | +- NfaRegexp | | | +- Sequence(...) | | | `- alphabet <Unicode> | | `- TrampolineWrapper | | +- start 0 | | +- stop None | | +- rest TransformableTrampolineWrapper | | | +- FunctionWrapper | | | | `- '*/' | | | +- NfaRegexp | | | | +- Sequence(...) | | | | `- alphabet <Unicode> | | | `- TransformableTrampolineWrapper | | | +- NfaRegexp | | | | +- Sequence(...) | | | | `- alphabet <Unicode> | | | `- TransformableTrampolineWrapper | | | +- FunctionWrapper | | | | `- '(' | | | +- NfaRegexp | | | | +- Sequence(...) | | | | `- alphabet <Unicode> | | | +- Transform | | | | +- <loop> | | | | `- TransformationWrapper(<apply>) | | | +- NfaRegexp | | | | +- Sequence(...) | | | | `- alphabet <Unicode> | | | `- FunctionWrapper | | | `- ')' | | `- first TransformableTrampolineWrapper | | +- FunctionWrapper | | | `- '*/' | | +- NfaRegexp | | | +- Sequence(...) | | | `- alphabet <Unicode> | | `- TransformableTrampolineWrapper | | +- NfaRegexp | | | +- Sequence(...) | | | `- alphabet <Unicode> | | `- TransformableTrampolineWrapper | | +- FunctionWrapper | | | `- '(' | | +- NfaRegexp | | | +- Sequence(...) | | | `- alphabet <Unicode> | | +- Transform | | | +- <loop> | | | `- TransformationWrapper(<apply>) | | +- NfaRegexp | | | +- Sequence(...) | | | `- alphabet <Unicode> | | `- FunctionWrapper | | `- ')' | `- TransformationWrapper(<apply>) `- True""")