module Arithmetic

def _nt_additive

def _nt_additive
  start_index = index
  cached = node_cache[:additive][index]
  if cached
    @index = cached.interval.end
    return cached
  end
  
  i0 = index
  i1, s1 = index, []
  r2 = _nt_multitive
  s1 << r2
  if r2.success?
    r3 = _nt_space
    s1 << r3
    if r3.success?
      r4 = _nt_additive_op
      s1 << r4
      if r4.success?
        r5 = _nt_space
        s1 << r5
        if r5.success?
          r6 = _nt_additive
          s1 << r6
        end
      end
    end
  end
  if s1.last.success?
    r1 = (BinaryOperation).new(input, i1...index, s1)
    r1.extend(Additive0)
  else
    self.index = i1
    r1 = ParseFailure.new(input, i1)
  end
  if r1.success?
    r0 = r1
  else
    r7 = _nt_multitive
    if r7.success?
      r0 = r7
    else
      self.index = i0
      r0 = ParseFailure.new(input, i0)
    end
  end
  
  node_cache[:additive][start_index] = r0
  
  return r0
end