Example #1
0
 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)
Example #2
0
 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)
Example #3
0
 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
Example #4
0
    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""")