# File lib/treetop/compiler/metagrammar.rb, line 2492
      def _nt_node_class_expression
        start_index = index
        if node_cache[:node_class_expression].has_key?(index)
          cached = node_cache[:node_class_expression][index]
          @index = cached.interval.end if cached
          return cached
        end

        i0 = index
        i1, s1 = index, []
        r2 = _nt_space
        s1 << r2
        if r2
          if input.index('<', index) == index
            r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure('<')
            r3 = nil
          end
          s1 << r3
          if r3
            s4, i4 = [], index
            loop do
              i5, s5 = index, []
              i6 = index
              if input.index('>', index) == index
                r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
                @index += 1
              else
                terminal_parse_failure('>')
                r7 = nil
              end
              if r7
                r6 = nil
              else
                self.index = i6
                r6 = instantiate_node(SyntaxNode,input, index...index)
              end
              s5 << r6
              if r6
                if index < input_length
                  r8 = instantiate_node(SyntaxNode,input, index...(index + 1))
                  @index += 1
                else
                  terminal_parse_failure("any character")
                  r8 = nil
                end
                s5 << r8
              end
              if s5.last
                r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
                r5.extend(NodeClassExpression0)
              else
                self.index = i5
                r5 = nil
              end
              if r5
                s4 << r5
              else
                break
              end
            end
            if s4.empty?
              self.index = i4
              r4 = nil
            else
              r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
            end
            s1 << r4
            if r4
              if input.index('>', index) == index
                r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
                @index += 1
              else
                terminal_parse_failure('>')
                r9 = nil
              end
              s1 << r9
            end
          end
        end
        if s1.last
          r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
          r1.extend(NodeClassExpression1)
          r1.extend(NodeClassExpression2)
        else
          self.index = i1
          r1 = nil
        end
        if r1
          r0 = r1
        else
          if input.index('', index) == index
            r10 = instantiate_node(SyntaxNode,input, index...(index + 0))
            r10.extend(NodeClassExpression3)
            @index += 0
          else
            terminal_parse_failure('')
            r10 = nil
          end
          if r10
            r0 = r10
          else
            self.index = i0
            r0 = nil
          end
        end

        node_cache[:node_class_expression][start_index] = r0

        return r0
      end