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_liberal(self): matcher = Delayed() matcher += matcher | Any() assert isinstance(matcher.matcher.matchers[0], Delayed) matcher.config.clear().optimize_or(False) matcher.get_parse_string() # TODO - better test assert isinstance(matcher.matcher.matchers[0], TransformableWrapper)
def simple_grammar(self): ''' Test a simple example: letters introduce numbers in an indented block. ''' #basicConfig(level=DEBUG) number = Token(Digit()) letter = Token(Letter()) # the simplest whitespace grammar i can think of - lines are either # numbers (which are single, simple statements) or letters (which # mark the start of a new, indented block). block = Delayed() line = Or(Line(number), Line(letter) & block) > list # and a block is simply a collection of lines, as above block += Block(line[1:]) program = Trace(line[1:]) program.config.lines(block_policy=1) return program
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""")