# Autogenerated from a Treetop grammar. Edits may be lost.


module Mail
  module RFC2822Obsolete
    include Treetop::Runtime

    def root
      @root ||= :obs_qp
    end

    module ObsQp0
    end

    def _nt_obs_qp
      start_index = index
      if node_cache[:obs_qp].has_key?(index)
        cached = node_cache[:obs_qp][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("\\", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
        @index += 1
      else
        terminal_parse_failure("\\")
        r1 = nil
      end
      s0 << r1
      if r1
        if has_terminal?('\G[\\x00-\\x7F]', true, index)
          r2 = true
          @index += 1
        else
          r2 = nil
        end
        s0 << r2
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsQp0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_qp][start_index] = r0

      r0
    end

    module ObsText0
      def obs_char
        elements[0]
      end

    end

    module ObsText1
    end

    def _nt_obs_text
      start_index = index
      if node_cache[:obs_text].has_key?(index)
        cached = node_cache[:obs_text][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      s1, i1 = [], index
      loop do
        r2 = _nt_LF
        if r2
          s1 << r2
        else
          break
        end
      end
      r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
      s0 << r1
      if r1
        s3, i3 = [], index
        loop do
          r4 = _nt_CR
          if r4
            s3 << r4
          else
            break
          end
        end
        r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
        s0 << r3
        if r3
          s5, i5 = [], index
          loop do
            i6, s6 = index, []
            r7 = _nt_obs_char
            s6 << r7
            if r7
              s8, i8 = [], index
              loop do
                r9 = _nt_LF
                if r9
                  s8 << r9
                else
                  break
                end
              end
              r8 = instantiate_node(SyntaxNode,input, i8...index, s8)
              s6 << r8
              if r8
                s10, i10 = [], index
                loop do
                  r11 = _nt_CR
                  if r11
                    s10 << r11
                  else
                    break
                  end
                end
                r10 = instantiate_node(SyntaxNode,input, i10...index, s10)
                s6 << r10
              end
            end
            if s6.last
              r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
              r6.extend(ObsText0)
            else
              @index = i6
              r6 = nil
            end
            if r6
              s5 << r6
            else
              break
            end
          end
          r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
          s0 << r5
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsText1)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_text][start_index] = r0

      r0
    end

    def _nt_obs_char
      start_index = index
      if node_cache[:obs_char].has_key?(index)
        cached = node_cache[:obs_char][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0 = index
      if has_terminal?('\G[\\x00-\\x09]', true, index)
        r1 = true
        @index += 1
      else
        r1 = nil
      end
      if r1
        r0 = r1
      else
        if has_terminal?('\G[\\x0B-\\x0C]', true, index)
          r2 = true
          @index += 1
        else
          r2 = nil
        end
        if r2
          r0 = r2
        else
          if has_terminal?('\G[\\x0E-\\x7F]', true, index)
            r3 = true
            @index += 1
          else
            r3 = nil
          end
          if r3
            r0 = r3
          else
            @index = i0
            r0 = nil
          end
        end
      end

      node_cache[:obs_char][start_index] = r0

      r0
    end

    def _nt_obs_utext
      start_index = index
      if node_cache[:obs_utext].has_key?(index)
        cached = node_cache[:obs_utext][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      r0 = _nt_obs_text

      node_cache[:obs_utext][start_index] = r0

      r0
    end

    def _nt_obs_phrase
      start_index = index
      if node_cache[:obs_phrase].has_key?(index)
        cached = node_cache[:obs_phrase][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      s0, i0 = [], index
      loop do
        i1 = index
        r2 = _nt_word
        if r2
          r1 = r2
        else
          if has_terminal?(".", false, index)
            r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(".")
            r3 = nil
          end
          if r3
            r1 = r3
          else
            if has_terminal?("@", false, index)
              r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
              @index += 1
            else
              terminal_parse_failure("@")
              r4 = nil
            end
            if r4
              r1 = r4
            else
              @index = i1
              r1 = nil
            end
          end
        end
        if r1
          s0 << r1
        else
          break
        end
      end
      if s0.empty?
        @index = i0
        r0 = nil
      else
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
      end

      node_cache[:obs_phrase][start_index] = r0

      r0
    end

    module ObsPhraseList0
    end

    module ObsPhraseList1
    end

    def _nt_obs_phrase_list
      start_index = index
      if node_cache[:obs_phrase_list].has_key?(index)
        cached = node_cache[:obs_phrase_list][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0 = index
      r1 = _nt_phrase
      if r1
        r0 = r1
      else
        i2, s2 = index, []
        s3, i3 = [], index
        loop do
          i4, s4 = index, []
          r6 = _nt_phrase
          if r6
            r5 = r6
          else
            r5 = instantiate_node(SyntaxNode,input, index...index)
          end
          s4 << r5
          if r5
            r8 = _nt_CFWS
            if r8
              r7 = r8
            else
              r7 = instantiate_node(SyntaxNode,input, index...index)
            end
            s4 << r7
            if r7
              if has_terminal?(",", false, index)
                r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
                @index += 1
              else
                terminal_parse_failure(",")
                r9 = nil
              end
              s4 << r9
              if r9
                r11 = _nt_CFWS
                if r11
                  r10 = r11
                else
                  r10 = instantiate_node(SyntaxNode,input, index...index)
                end
                s4 << r10
              end
            end
          end
          if s4.last
            r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
            r4.extend(ObsPhraseList0)
          else
            @index = i4
            r4 = nil
          end
          if r4
            s3 << r4
          else
            break
          end
        end
        if s3.empty?
          @index = i3
          r3 = nil
        else
          r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
        end
        s2 << r3
        if r3
          r13 = _nt_phrase
          if r13
            r12 = r13
          else
            r12 = instantiate_node(SyntaxNode,input, index...index)
          end
          s2 << r12
        end
        if s2.last
          r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
          r2.extend(ObsPhraseList1)
        else
          @index = i2
          r2 = nil
        end
        if r2
          r0 = r2
        else
          @index = i0
          r0 = nil
        end
      end

      node_cache[:obs_phrase_list][start_index] = r0

      r0
    end

    module ObsFWS0
      def CRLF
        elements[0]
      end

    end

    module ObsFWS1
    end

    def _nt_obs_FWS
      start_index = index
      if node_cache[:obs_FWS].has_key?(index)
        cached = node_cache[:obs_FWS][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      s1, i1 = [], index
      loop do
        r2 = _nt_WSP
        if r2
          s1 << r2
        else
          break
        end
      end
      if s1.empty?
        @index = i1
        r1 = nil
      else
        r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
      end
      s0 << r1
      if r1
        s3, i3 = [], index
        loop do
          i4, s4 = index, []
          r5 = _nt_CRLF
          s4 << r5
          if r5
            s6, i6 = [], index
            loop do
              r7 = _nt_WSP
              if r7
                s6 << r7
              else
                break
              end
            end
            if s6.empty?
              @index = i6
              r6 = nil
            else
              r6 = instantiate_node(SyntaxNode,input, i6...index, s6)
            end
            s4 << r6
          end
          if s4.last
            r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
            r4.extend(ObsFWS0)
          else
            @index = i4
            r4 = nil
          end
          if r4
            s3 << r4
          else
            break
          end
        end
        r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
        s0 << r3
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsFWS1)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_FWS][start_index] = r0

      r0
    end

    module ObsDayOfWeek0
      def day_name
        elements[1]
      end

    end

    def _nt_obs_day_of_week
      start_index = index
      if node_cache[:obs_day_of_week].has_key?(index)
        cached = node_cache[:obs_day_of_week][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      r2 = _nt_CFWS
      if r2
        r1 = r2
      else
        r1 = instantiate_node(SyntaxNode,input, index...index)
      end
      s0 << r1
      if r1
        r3 = _nt_day_name
        s0 << r3
        if r3
          r5 = _nt_CFWS
          if r5
            r4 = r5
          else
            r4 = instantiate_node(SyntaxNode,input, index...index)
          end
          s0 << r4
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsDayOfWeek0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_day_of_week][start_index] = r0

      r0
    end

    module ObsYear0
      def DIGIT1
        elements[0]
      end

      def DIGIT2
        elements[1]
      end
    end

    module ObsYear1
    end

    def _nt_obs_year
      start_index = index
      if node_cache[:obs_year].has_key?(index)
        cached = node_cache[:obs_year][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      r2 = _nt_CFWS
      if r2
        r1 = r2
      else
        r1 = instantiate_node(SyntaxNode,input, index...index)
      end
      s0 << r1
      if r1
        i3, s3 = index, []
        r4 = _nt_DIGIT
        s3 << r4
        if r4
          r5 = _nt_DIGIT
          s3 << r5
        end
        if s3.last
          r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
          r3.extend(ObsYear0)
        else
          @index = i3
          r3 = nil
        end
        s0 << r3
        if r3
          r7 = _nt_CFWS
          if r7
            r6 = r7
          else
            r6 = instantiate_node(SyntaxNode,input, index...index)
          end
          s0 << r6
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsYear1)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_year][start_index] = r0

      r0
    end

    module ObsMonth0
      def CFWS1
        elements[0]
      end

      def month_name
        elements[1]
      end

      def CFWS2
        elements[2]
      end
    end

    def _nt_obs_month
      start_index = index
      if node_cache[:obs_month].has_key?(index)
        cached = node_cache[:obs_month][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      r1 = _nt_CFWS
      s0 << r1
      if r1
        r2 = _nt_month_name
        s0 << r2
        if r2
          r3 = _nt_CFWS
          s0 << r3
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsMonth0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_month][start_index] = r0

      r0
    end

    module ObsDay0
      def DIGIT1
        elements[0]
      end

      def DIGIT2
        elements[1]
      end
    end

    module ObsDay1
    end

    def _nt_obs_day
      start_index = index
      if node_cache[:obs_day].has_key?(index)
        cached = node_cache[:obs_day][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      r2 = _nt_CFWS
      if r2
        r1 = r2
      else
        r1 = instantiate_node(SyntaxNode,input, index...index)
      end
      s0 << r1
      if r1
        i3 = index
        r4 = _nt_DIGIT
        if r4
          r3 = r4
        else
          i5, s5 = index, []
          r6 = _nt_DIGIT
          s5 << r6
          if r6
            r7 = _nt_DIGIT
            s5 << r7
          end
          if s5.last
            r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
            r5.extend(ObsDay0)
          else
            @index = i5
            r5 = nil
          end
          if r5
            r3 = r5
          else
            @index = i3
            r3 = nil
          end
        end
        s0 << r3
        if r3
          r9 = _nt_CFWS
          if r9
            r8 = r9
          else
            r8 = instantiate_node(SyntaxNode,input, index...index)
          end
          s0 << r8
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsDay1)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_day][start_index] = r0

      r0
    end

    module ObsHour0
      def DIGIT1
        elements[0]
      end

      def DIGIT2
        elements[1]
      end
    end

    module ObsHour1
    end

    def _nt_obs_hour
      start_index = index
      if node_cache[:obs_hour].has_key?(index)
        cached = node_cache[:obs_hour][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      r2 = _nt_CFWS
      if r2
        r1 = r2
      else
        r1 = instantiate_node(SyntaxNode,input, index...index)
      end
      s0 << r1
      if r1
        i3, s3 = index, []
        r4 = _nt_DIGIT
        s3 << r4
        if r4
          r5 = _nt_DIGIT
          s3 << r5
        end
        if s3.last
          r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
          r3.extend(ObsHour0)
        else
          @index = i3
          r3 = nil
        end
        s0 << r3
        if r3
          r7 = _nt_CFWS
          if r7
            r6 = r7
          else
            r6 = instantiate_node(SyntaxNode,input, index...index)
          end
          s0 << r6
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsHour1)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_hour][start_index] = r0

      r0
    end

    module ObsMinute0
      def DIGIT1
        elements[0]
      end

      def DIGIT2
        elements[1]
      end
    end

    module ObsMinute1
    end

    def _nt_obs_minute
      start_index = index
      if node_cache[:obs_minute].has_key?(index)
        cached = node_cache[:obs_minute][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      r2 = _nt_CFWS
      if r2
        r1 = r2
      else
        r1 = instantiate_node(SyntaxNode,input, index...index)
      end
      s0 << r1
      if r1
        i3, s3 = index, []
        r4 = _nt_DIGIT
        s3 << r4
        if r4
          r5 = _nt_DIGIT
          s3 << r5
        end
        if s3.last
          r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
          r3.extend(ObsMinute0)
        else
          @index = i3
          r3 = nil
        end
        s0 << r3
        if r3
          r7 = _nt_CFWS
          if r7
            r6 = r7
          else
            r6 = instantiate_node(SyntaxNode,input, index...index)
          end
          s0 << r6
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsMinute1)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_minute][start_index] = r0

      r0
    end

    module ObsSecond0
      def DIGIT1
        elements[0]
      end

      def DIGIT2
        elements[1]
      end
    end

    module ObsSecond1
    end

    def _nt_obs_second
      start_index = index
      if node_cache[:obs_second].has_key?(index)
        cached = node_cache[:obs_second][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      r2 = _nt_CFWS
      if r2
        r1 = r2
      else
        r1 = instantiate_node(SyntaxNode,input, index...index)
      end
      s0 << r1
      if r1
        i3, s3 = index, []
        r4 = _nt_DIGIT
        s3 << r4
        if r4
          r5 = _nt_DIGIT
          s3 << r5
        end
        if s3.last
          r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
          r3.extend(ObsSecond0)
        else
          @index = i3
          r3 = nil
        end
        s0 << r3
        if r3
          r7 = _nt_CFWS
          if r7
            r6 = r7
          else
            r6 = instantiate_node(SyntaxNode,input, index...index)
          end
          s0 << r6
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsSecond1)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_second][start_index] = r0

      r0
    end

    def _nt_obs_zone
      start_index = index
      if node_cache[:obs_zone].has_key?(index)
        cached = node_cache[:obs_zone][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0 = index
      if has_terminal?("UT", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 2))
        @index += 2
      else
        terminal_parse_failure("UT")
        r1 = nil
      end
      if r1
        r0 = r1
      else
        if has_terminal?("GMT", false, index)
          r2 = instantiate_node(SyntaxNode,input, index...(index + 3))
          @index += 3
        else
          terminal_parse_failure("GMT")
          r2 = nil
        end
        if r2
          r0 = r2
        else
          if has_terminal?("EST", false, index)
            r3 = instantiate_node(SyntaxNode,input, index...(index + 3))
            @index += 3
          else
            terminal_parse_failure("EST")
            r3 = nil
          end
          if r3
            r0 = r3
          else
            if has_terminal?("EDT", false, index)
              r4 = instantiate_node(SyntaxNode,input, index...(index + 3))
              @index += 3
            else
              terminal_parse_failure("EDT")
              r4 = nil
            end
            if r4
              r0 = r4
            else
              if has_terminal?("CST", false, index)
                r5 = instantiate_node(SyntaxNode,input, index...(index + 3))
                @index += 3
              else
                terminal_parse_failure("CST")
                r5 = nil
              end
              if r5
                r0 = r5
              else
                if has_terminal?("CDT", false, index)
                  r6 = instantiate_node(SyntaxNode,input, index...(index + 3))
                  @index += 3
                else
                  terminal_parse_failure("CDT")
                  r6 = nil
                end
                if r6
                  r0 = r6
                else
                  if has_terminal?("MST", false, index)
                    r7 = instantiate_node(SyntaxNode,input, index...(index + 3))
                    @index += 3
                  else
                    terminal_parse_failure("MST")
                    r7 = nil
                  end
                  if r7
                    r0 = r7
                  else
                    if has_terminal?("MDT", false, index)
                      r8 = instantiate_node(SyntaxNode,input, index...(index + 3))
                      @index += 3
                    else
                      terminal_parse_failure("MDT")
                      r8 = nil
                    end
                    if r8
                      r0 = r8
                    else
                      if has_terminal?("PST", false, index)
                        r9 = instantiate_node(SyntaxNode,input, index...(index + 3))
                        @index += 3
                      else
                        terminal_parse_failure("PST")
                        r9 = nil
                      end
                      if r9
                        r0 = r9
                      else
                        if has_terminal?("PDT", false, index)
                          r10 = instantiate_node(SyntaxNode,input, index...(index + 3))
                          @index += 3
                        else
                          terminal_parse_failure("PDT")
                          r10 = nil
                        end
                        if r10
                          r0 = r10
                        else
                          if has_terminal?('\G[\\x41-\\x49]', true, index)
                            r11 = true
                            @index += 1
                          else
                            r11 = nil
                          end
                          if r11
                            r0 = r11
                          else
                            if has_terminal?('\G[\\x4B-\\x5A]', true, index)
                              r12 = true
                              @index += 1
                            else
                              r12 = nil
                            end
                            if r12
                              r0 = r12
                            else
                              if has_terminal?('\G[\\x61-\\x69]', true, index)
                                r13 = true
                                @index += 1
                              else
                                r13 = nil
                              end
                              if r13
                                r0 = r13
                              else
                                if has_terminal?('\G[\\x6B-\\x7A]', true, index)
                                  r14 = true
                                  @index += 1
                                else
                                  r14 = nil
                                end
                                if r14
                                  r0 = r14
                                else
                                  @index = i0
                                  r0 = nil
                                end
                              end
                            end
                          end
                        end
                      end
                    end
                  end
                end
              end
            end
          end
        end
      end

      node_cache[:obs_zone][start_index] = r0

      r0
    end

    module ObsAngleAddr0
      def addr_spec
        elements[3]
      end

    end

    def _nt_obs_angle_addr
      start_index = index
      if node_cache[:obs_angle_addr].has_key?(index)
        cached = node_cache[:obs_angle_addr][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      r2 = _nt_CFWS
      if r2
        r1 = r2
      else
        r1 = instantiate_node(SyntaxNode,input, index...index)
      end
      s0 << r1
      if r1
        if has_terminal?("<", false, index)
          r3 = instantiate_node(SyntaxNode,input, index...(index + 1))
          @index += 1
        else
          terminal_parse_failure("<")
          r3 = nil
        end
        s0 << r3
        if r3
          r5 = _nt_obs_route
          if r5
            r4 = r5
          else
            r4 = instantiate_node(SyntaxNode,input, index...index)
          end
          s0 << r4
          if r4
            r6 = _nt_addr_spec
            s0 << r6
            if r6
              if has_terminal?(">", false, index)
                r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
                @index += 1
              else
                terminal_parse_failure(">")
                r7 = nil
              end
              s0 << r7
              if r7
                r9 = _nt_CFWS
                if r9
                  r8 = r9
                else
                  r8 = instantiate_node(SyntaxNode,input, index...index)
                end
                s0 << r8
              end
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsAngleAddr0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_angle_addr][start_index] = r0

      r0
    end

    module ObsRoute0
      def obs_domain_list
        elements[1]
      end

    end

    def _nt_obs_route
      start_index = index
      if node_cache[:obs_route].has_key?(index)
        cached = node_cache[:obs_route][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      r2 = _nt_CFWS
      if r2
        r1 = r2
      else
        r1 = instantiate_node(SyntaxNode,input, index...index)
      end
      s0 << r1
      if r1
        r3 = _nt_obs_domain_list
        s0 << r3
        if r3
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            r6 = _nt_CFWS
            if r6
              r5 = r6
            else
              r5 = instantiate_node(SyntaxNode,input, index...index)
            end
            s0 << r5
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsRoute0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_route][start_index] = r0

      r0
    end

    module ObsDomainList0
      def domain
        elements[3]
      end
    end

    module ObsDomainList1
      def domain
        elements[1]
      end

    end

    def _nt_obs_domain_list
      start_index = index
      if node_cache[:obs_domain_list].has_key?(index)
        cached = node_cache[:obs_domain_list][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("@", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 1))
        @index += 1
      else
        terminal_parse_failure("@")
        r1 = nil
      end
      s0 << r1
      if r1
        r2 = _nt_domain
        s0 << r2
        if r2
          s3, i3 = [], index
          loop do
            i4, s4 = index, []
            s5, i5 = [], index
            loop do
              if has_terminal?(",", false, index)
                r6 = instantiate_node(SyntaxNode,input, index...(index + 1))
                @index += 1
              else
                terminal_parse_failure(",")
                r6 = nil
              end
              if r6
                s5 << r6
              else
                break
              end
            end
            r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
            s4 << r5
            if r5
              r8 = _nt_CFWS
              if r8
                r7 = r8
              else
                r7 = instantiate_node(SyntaxNode,input, index...index)
              end
              s4 << r7
              if r7
                if has_terminal?("@", false, index)
                  r9 = instantiate_node(SyntaxNode,input, index...(index + 1))
                  @index += 1
                else
                  terminal_parse_failure("@")
                  r9 = nil
                end
                s4 << r9
                if r9
                  r10 = _nt_domain
                  s4 << r10
                end
              end
            end
            if s4.last
              r4 = instantiate_node(SyntaxNode,input, i4...index, s4)
              r4.extend(ObsDomainList0)
            else
              @index = i4
              r4 = nil
            end
            if r4
              s3 << r4
            else
              break
            end
          end
          r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
          s0 << r3
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsDomainList1)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_domain_list][start_index] = r0

      r0
    end

    module ObsLocalPart0
      def word
        elements[1]
      end
    end

    module ObsLocalPart1
      def word
        elements[0]
      end

    end

    def _nt_obs_local_part
      start_index = index
      if node_cache[:obs_local_part].has_key?(index)
        cached = node_cache[:obs_local_part][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      r1 = _nt_word
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          i3, s3 = index, []
          if has_terminal?(".", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(".")
            r4 = nil
          end
          s3 << r4
          if r4
            r5 = _nt_word
            s3 << r5
          end
          if s3.last
            r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
            r3.extend(ObsLocalPart0)
          else
            @index = i3
            r3 = nil
          end
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsLocalPart1)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_local_part][start_index] = r0

      r0
    end

    module ObsDomain0
      def atom
        elements[1]
      end
    end

    module ObsDomain1
      def atom
        elements[0]
      end

    end

    def _nt_obs_domain
      start_index = index
      if node_cache[:obs_domain].has_key?(index)
        cached = node_cache[:obs_domain][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      r1 = _nt_atom
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          i3, s3 = index, []
          if has_terminal?(".", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(".")
            r4 = nil
          end
          s3 << r4
          if r4
            r5 = _nt_atom
            s3 << r5
          end
          if s3.last
            r3 = instantiate_node(SyntaxNode,input, i3...index, s3)
            r3.extend(ObsDomain0)
          else
            @index = i3
            r3 = nil
          end
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsDomain1)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_domain][start_index] = r0

      r0
    end

    module ObsMboxList0
    end

    module ObsMboxList1
    end

    def _nt_obs_mbox_list
      start_index = index
      if node_cache[:obs_mbox_list].has_key?(index)
        cached = node_cache[:obs_mbox_list][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      s1, i1 = [], index
      loop do
        i2, s2 = index, []
        r4 = _nt_mailbox
        if r4
          r3 = r4
        else
          r3 = instantiate_node(SyntaxNode,input, index...index)
        end
        s2 << r3
        if r3
          r6 = _nt_CFWS
          if r6
            r5 = r6
          else
            r5 = instantiate_node(SyntaxNode,input, index...index)
          end
          s2 << r5
          if r5
            if has_terminal?(",", false, index)
              r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
              @index += 1
            else
              terminal_parse_failure(",")
              r7 = nil
            end
            s2 << r7
            if r7
              r9 = _nt_CFWS
              if r9
                r8 = r9
              else
                r8 = instantiate_node(SyntaxNode,input, index...index)
              end
              s2 << r8
            end
          end
        end
        if s2.last
          r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
          r2.extend(ObsMboxList0)
        else
          @index = i2
          r2 = nil
        end
        if r2
          s1 << r2
        else
          break
        end
      end
      if s1.empty?
        @index = i1
        r1 = nil
      else
        r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
      end
      s0 << r1
      if r1
        r11 = _nt_mailbox
        if r11
          r10 = r11
        else
          r10 = instantiate_node(SyntaxNode,input, index...index)
        end
        s0 << r10
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsMboxList1)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_mbox_list][start_index] = r0

      r0
    end

    module ObsAddrList0
    end

    module ObsAddrList1
    end

    def _nt_obs_addr_list
      start_index = index
      if node_cache[:obs_addr_list].has_key?(index)
        cached = node_cache[:obs_addr_list][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      s1, i1 = [], index
      loop do
        i2, s2 = index, []
        r4 = _nt_address
        if r4
          r3 = r4
        else
          r3 = instantiate_node(SyntaxNode,input, index...index)
        end
        s2 << r3
        if r3
          r6 = _nt_CFWS
          if r6
            r5 = r6
          else
            r5 = instantiate_node(SyntaxNode,input, index...index)
          end
          s2 << r5
          if r5
            if has_terminal?(",", false, index)
              r7 = instantiate_node(SyntaxNode,input, index...(index + 1))
              @index += 1
            else
              terminal_parse_failure(",")
              r7 = nil
            end
            s2 << r7
            if r7
              r9 = _nt_CFWS
              if r9
                r8 = r9
              else
                r8 = instantiate_node(SyntaxNode,input, index...index)
              end
              s2 << r8
            end
          end
        end
        if s2.last
          r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
          r2.extend(ObsAddrList0)
        else
          @index = i2
          r2 = nil
        end
        if r2
          s1 << r2
        else
          break
        end
      end
      if s1.empty?
        @index = i1
        r1 = nil
      else
        r1 = instantiate_node(SyntaxNode,input, i1...index, s1)
      end
      s0 << r1
      if r1
        r11 = _nt_address
        if r11
          r10 = r11
        else
          r10 = instantiate_node(SyntaxNode,input, index...index)
        end
        s0 << r10
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsAddrList1)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_addr_list][start_index] = r0

      r0
    end

    def _nt_obs_fields
      start_index = index
      if node_cache[:obs_fields].has_key?(index)
        cached = node_cache[:obs_fields][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      s0, i0 = [], index
      loop do
        i1 = index
        r2 = _nt_obs_return
        if r2
          r1 = r2
        else
          r3 = _nt_obs_received
          if r3
            r1 = r3
          else
            r4 = _nt_obs_orig_date
            if r4
              r1 = r4
            else
              r5 = _nt_obs_from
              if r5
                r1 = r5
              else
                r6 = _nt_obs_sender
                if r6
                  r1 = r6
                else
                  r7 = _nt_obs_reply_to
                  if r7
                    r1 = r7
                  else
                    r8 = _nt_obs_to
                    if r8
                      r1 = r8
                    else
                      r9 = _nt_obs_cc
                      if r9
                        r1 = r9
                      else
                        r10 = _nt_obs_bcc
                        if r10
                          r1 = r10
                        else
                          r11 = _nt_obs_message_id
                          if r11
                            r1 = r11
                          else
                            r12 = _nt_obs_in_reply_to
                            if r12
                              r1 = r12
                            else
                              r13 = _nt_obs_references
                              if r13
                                r1 = r13
                              else
                                r14 = _nt_obs_subject
                                if r14
                                  r1 = r14
                                else
                                  r15 = _nt_obs_comments
                                  if r15
                                    r1 = r15
                                  else
                                    r16 = _nt_obs_keywords
                                    if r16
                                      r1 = r16
                                    else
                                      r17 = _nt_obs_resent_date
                                      if r17
                                        r1 = r17
                                      else
                                        r18 = _nt_obs_resent_from
                                        if r18
                                          r1 = r18
                                        else
                                          r19 = _nt_obs_resent_send
                                          if r19
                                            r1 = r19
                                          else
                                            r20 = _nt_obs_resent_rply
                                            if r20
                                              r1 = r20
                                            else
                                              r21 = _nt_obs_resent_to
                                              if r21
                                                r1 = r21
                                              else
                                                r22 = _nt_obs_resent_cc
                                                if r22
                                                  r1 = r22
                                                else
                                                  r23 = _nt_obs_resent_bcc
                                                  if r23
                                                    r1 = r23
                                                  else
                                                    r24 = _nt_obs_resent_mid
                                                    if r24
                                                      r1 = r24
                                                    else
                                                      r25 = _nt_obs_optional
                                                      if r25
                                                        r1 = r25
                                                      else
                                                        @index = i1
                                                        r1 = nil
                                                      end
                                                    end
                                                  end
                                                end
                                              end
                                            end
                                          end
                                        end
                                      end
                                    end
                                  end
                                end
                              end
                            end
                          end
                        end
                      end
                    end
                  end
                end
              end
            end
          end
        end
        if r1
          s0 << r1
        else
          break
        end
      end
      r0 = instantiate_node(SyntaxNode,input, i0...index, s0)

      node_cache[:obs_fields][start_index] = r0

      r0
    end

    module ObsOrigDate0
      def date_time
        elements[3]
      end

      def CRLF
        elements[4]
      end
    end

    def _nt_obs_orig_date
      start_index = index
      if node_cache[:obs_orig_date].has_key?(index)
        cached = node_cache[:obs_orig_date][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("Date", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 4))
        @index += 4
      else
        terminal_parse_failure("Date")
        r1 = nil
      end
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            r5 = _nt_date_time
            s0 << r5
            if r5
              r6 = _nt_CRLF
              s0 << r6
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsOrigDate0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_orig_date][start_index] = r0

      r0
    end

    module ObsFrom0
      def mailbox_list
        elements[3]
      end

      def CRLF
        elements[4]
      end
    end

    def _nt_obs_from
      start_index = index
      if node_cache[:obs_from].has_key?(index)
        cached = node_cache[:obs_from][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("From", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 4))
        @index += 4
      else
        terminal_parse_failure("From")
        r1 = nil
      end
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            r5 = _nt_mailbox_list
            s0 << r5
            if r5
              r6 = _nt_CRLF
              s0 << r6
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsFrom0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_from][start_index] = r0

      r0
    end

    module ObsSender0
      def mailbox
        elements[3]
      end

      def CRLF
        elements[4]
      end
    end

    def _nt_obs_sender
      start_index = index
      if node_cache[:obs_sender].has_key?(index)
        cached = node_cache[:obs_sender][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("Sender", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 6))
        @index += 6
      else
        terminal_parse_failure("Sender")
        r1 = nil
      end
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            r5 = _nt_mailbox
            s0 << r5
            if r5
              r6 = _nt_CRLF
              s0 << r6
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsSender0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_sender][start_index] = r0

      r0
    end

    module ObsReplyTo0
      def mailbox_list
        elements[3]
      end

      def CRLF
        elements[4]
      end
    end

    def _nt_obs_reply_to
      start_index = index
      if node_cache[:obs_reply_to].has_key?(index)
        cached = node_cache[:obs_reply_to][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("Reply-To", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 8))
        @index += 8
      else
        terminal_parse_failure("Reply-To")
        r1 = nil
      end
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            r5 = _nt_mailbox_list
            s0 << r5
            if r5
              r6 = _nt_CRLF
              s0 << r6
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsReplyTo0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_reply_to][start_index] = r0

      r0
    end

    module ObsTo0
      def address_list
        elements[3]
      end

      def CRLF
        elements[4]
      end
    end

    def _nt_obs_to
      start_index = index
      if node_cache[:obs_to].has_key?(index)
        cached = node_cache[:obs_to][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("To", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 2))
        @index += 2
      else
        terminal_parse_failure("To")
        r1 = nil
      end
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            r5 = _nt_address_list
            s0 << r5
            if r5
              r6 = _nt_CRLF
              s0 << r6
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsTo0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_to][start_index] = r0

      r0
    end

    module ObsCc0
      def address_list
        elements[3]
      end

      def CRLF
        elements[4]
      end
    end

    def _nt_obs_cc
      start_index = index
      if node_cache[:obs_cc].has_key?(index)
        cached = node_cache[:obs_cc][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("Cc", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 2))
        @index += 2
      else
        terminal_parse_failure("Cc")
        r1 = nil
      end
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            r5 = _nt_address_list
            s0 << r5
            if r5
              r6 = _nt_CRLF
              s0 << r6
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsCc0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_cc][start_index] = r0

      r0
    end

    module ObsBcc0
      def CRLF
        elements[4]
      end
    end

    def _nt_obs_bcc
      start_index = index
      if node_cache[:obs_bcc].has_key?(index)
        cached = node_cache[:obs_bcc][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("Bcc", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 3))
        @index += 3
      else
        terminal_parse_failure("Bcc")
        r1 = nil
      end
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            i5 = index
            r6 = _nt_address_list
            if r6
              r5 = r6
            else
              r8 = _nt_CFWS
              if r8
                r7 = r8
              else
                r7 = instantiate_node(SyntaxNode,input, index...index)
              end
              if r7
                r5 = r7
              else
                @index = i5
                r5 = nil
              end
            end
            s0 << r5
            if r5
              r9 = _nt_CRLF
              s0 << r9
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsBcc0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_bcc][start_index] = r0

      r0
    end

    module ObsMessageId0
      def msg_id
        elements[3]
      end

      def CRLF
        elements[4]
      end
    end

    def _nt_obs_message_id
      start_index = index
      if node_cache[:obs_message_id].has_key?(index)
        cached = node_cache[:obs_message_id][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("Message-ID", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 10))
        @index += 10
      else
        terminal_parse_failure("Message-ID")
        r1 = nil
      end
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            r5 = _nt_msg_id
            s0 << r5
            if r5
              r6 = _nt_CRLF
              s0 << r6
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsMessageId0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_message_id][start_index] = r0

      r0
    end

    module ObsInReplyTo0
      def CRLF
        elements[4]
      end
    end

    def _nt_obs_in_reply_to
      start_index = index
      if node_cache[:obs_in_reply_to].has_key?(index)
        cached = node_cache[:obs_in_reply_to][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("In-Reply-To", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 11))
        @index += 11
      else
        terminal_parse_failure("In-Reply-To")
        r1 = nil
      end
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            s5, i5 = [], index
            loop do
              i6 = index
              r7 = _nt_phrase
              if r7
                r6 = r7
              else
                r8 = _nt_msg_id
                if r8
                  r6 = r8
                else
                  @index = i6
                  r6 = nil
                end
              end
              if r6
                s5 << r6
              else
                break
              end
            end
            r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
            s0 << r5
            if r5
              r9 = _nt_CRLF
              s0 << r9
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsInReplyTo0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_in_reply_to][start_index] = r0

      r0
    end

    module ObsReferences0
      def CRLF
        elements[4]
      end
    end

    def _nt_obs_references
      start_index = index
      if node_cache[:obs_references].has_key?(index)
        cached = node_cache[:obs_references][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("References", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 10))
        @index += 10
      else
        terminal_parse_failure("References")
        r1 = nil
      end
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            s5, i5 = [], index
            loop do
              i6 = index
              r7 = _nt_phrase
              if r7
                r6 = r7
              else
                r8 = _nt_msg_id
                if r8
                  r6 = r8
                else
                  @index = i6
                  r6 = nil
                end
              end
              if r6
                s5 << r6
              else
                break
              end
            end
            r5 = instantiate_node(SyntaxNode,input, i5...index, s5)
            s0 << r5
            if r5
              r9 = _nt_CRLF
              s0 << r9
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsReferences0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_references][start_index] = r0

      r0
    end

    def _nt_obs_id_left
      start_index = index
      if node_cache[:obs_id_left].has_key?(index)
        cached = node_cache[:obs_id_left][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      r0 = _nt_local_part

      node_cache[:obs_id_left][start_index] = r0

      r0
    end

    def _nt_obs_id_right
      start_index = index
      if node_cache[:obs_id_right].has_key?(index)
        cached = node_cache[:obs_id_right][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      r0 = _nt_domain

      node_cache[:obs_id_right][start_index] = r0

      r0
    end

    module ObsSubject0
      def unstructured
        elements[3]
      end

      def CRLF
        elements[4]
      end
    end

    def _nt_obs_subject
      start_index = index
      if node_cache[:obs_subject].has_key?(index)
        cached = node_cache[:obs_subject][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("Subject", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 7))
        @index += 7
      else
        terminal_parse_failure("Subject")
        r1 = nil
      end
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            r5 = _nt_unstructured
            s0 << r5
            if r5
              r6 = _nt_CRLF
              s0 << r6
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsSubject0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_subject][start_index] = r0

      r0
    end

    module ObsComments0
      def unstructured
        elements[3]
      end

      def CRLF
        elements[4]
      end
    end

    def _nt_obs_comments
      start_index = index
      if node_cache[:obs_comments].has_key?(index)
        cached = node_cache[:obs_comments][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("Comments", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 8))
        @index += 8
      else
        terminal_parse_failure("Comments")
        r1 = nil
      end
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            r5 = _nt_unstructured
            s0 << r5
            if r5
              r6 = _nt_CRLF
              s0 << r6
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsComments0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_comments][start_index] = r0

      r0
    end

    module ObsKeywords0
      def obs_phrase_list
        elements[3]
      end

      def CRLF
        elements[4]
      end
    end

    def _nt_obs_keywords
      start_index = index
      if node_cache[:obs_keywords].has_key?(index)
        cached = node_cache[:obs_keywords][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("Keywords", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 8))
        @index += 8
      else
        terminal_parse_failure("Keywords")
        r1 = nil
      end
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            r5 = _nt_obs_phrase_list
            s0 << r5
            if r5
              r6 = _nt_CRLF
              s0 << r6
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsKeywords0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_keywords][start_index] = r0

      r0
    end

    module ObsResentFrom0
      def mailbox_list
        elements[3]
      end

      def CRLF
        elements[4]
      end
    end

    def _nt_obs_resent_from
      start_index = index
      if node_cache[:obs_resent_from].has_key?(index)
        cached = node_cache[:obs_resent_from][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("Resent-From", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 11))
        @index += 11
      else
        terminal_parse_failure("Resent-From")
        r1 = nil
      end
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            r5 = _nt_mailbox_list
            s0 << r5
            if r5
              r6 = _nt_CRLF
              s0 << r6
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsResentFrom0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_resent_from][start_index] = r0

      r0
    end

    module ObsResentSend0
      def mailbox
        elements[3]
      end

      def CRLF
        elements[4]
      end
    end

    def _nt_obs_resent_send
      start_index = index
      if node_cache[:obs_resent_send].has_key?(index)
        cached = node_cache[:obs_resent_send][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("Resent-Sender", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 13))
        @index += 13
      else
        terminal_parse_failure("Resent-Sender")
        r1 = nil
      end
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            r5 = _nt_mailbox
            s0 << r5
            if r5
              r6 = _nt_CRLF
              s0 << r6
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsResentSend0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_resent_send][start_index] = r0

      r0
    end

    module ObsResentDate0
      def date_time
        elements[3]
      end

      def CRLF
        elements[4]
      end
    end

    def _nt_obs_resent_date
      start_index = index
      if node_cache[:obs_resent_date].has_key?(index)
        cached = node_cache[:obs_resent_date][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("Resent-Date", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 11))
        @index += 11
      else
        terminal_parse_failure("Resent-Date")
        r1 = nil
      end
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            r5 = _nt_date_time
            s0 << r5
            if r5
              r6 = _nt_CRLF
              s0 << r6
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsResentDate0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_resent_date][start_index] = r0

      r0
    end

    module ObsResentTo0
      def address_list
        elements[3]
      end

      def CRLF
        elements[4]
      end
    end

    def _nt_obs_resent_to
      start_index = index
      if node_cache[:obs_resent_to].has_key?(index)
        cached = node_cache[:obs_resent_to][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("Resent-To", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 9))
        @index += 9
      else
        terminal_parse_failure("Resent-To")
        r1 = nil
      end
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            r5 = _nt_address_list
            s0 << r5
            if r5
              r6 = _nt_CRLF
              s0 << r6
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsResentTo0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_resent_to][start_index] = r0

      r0
    end

    module ObsResentCc0
      def address_list
        elements[3]
      end

      def CRLF
        elements[4]
      end
    end

    def _nt_obs_resent_cc
      start_index = index
      if node_cache[:obs_resent_cc].has_key?(index)
        cached = node_cache[:obs_resent_cc][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("Resent-Cc", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 9))
        @index += 9
      else
        terminal_parse_failure("Resent-Cc")
        r1 = nil
      end
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            r5 = _nt_address_list
            s0 << r5
            if r5
              r6 = _nt_CRLF
              s0 << r6
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsResentCc0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_resent_cc][start_index] = r0

      r0
    end

    module ObsResentBcc0
      def CRLF
        elements[4]
      end
    end

    def _nt_obs_resent_bcc
      start_index = index
      if node_cache[:obs_resent_bcc].has_key?(index)
        cached = node_cache[:obs_resent_bcc][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("Resent-Bcc", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 10))
        @index += 10
      else
        terminal_parse_failure("Resent-Bcc")
        r1 = nil
      end
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            i5 = index
            r6 = _nt_address_list
            if r6
              r5 = r6
            else
              r8 = _nt_CFWS
              if r8
                r7 = r8
              else
                r7 = instantiate_node(SyntaxNode,input, index...index)
              end
              if r7
                r5 = r7
              else
                @index = i5
                r5 = nil
              end
            end
            s0 << r5
            if r5
              r9 = _nt_CRLF
              s0 << r9
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsResentBcc0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_resent_bcc][start_index] = r0

      r0
    end

    module ObsResentMid0
      def msg_id
        elements[3]
      end

      def CRLF
        elements[4]
      end
    end

    def _nt_obs_resent_mid
      start_index = index
      if node_cache[:obs_resent_mid].has_key?(index)
        cached = node_cache[:obs_resent_mid][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("Resent-Message-ID", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 17))
        @index += 17
      else
        terminal_parse_failure("Resent-Message-ID")
        r1 = nil
      end
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            r5 = _nt_msg_id
            s0 << r5
            if r5
              r6 = _nt_CRLF
              s0 << r6
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsResentMid0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_resent_mid][start_index] = r0

      r0
    end

    module ObsResentRply0
      def address_list
        elements[3]
      end

      def CRLF
        elements[4]
      end
    end

    def _nt_obs_resent_rply
      start_index = index
      if node_cache[:obs_resent_rply].has_key?(index)
        cached = node_cache[:obs_resent_rply][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("Resent-Reply-To", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 15))
        @index += 15
      else
        terminal_parse_failure("Resent-Reply-To")
        r1 = nil
      end
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            r5 = _nt_address_list
            s0 << r5
            if r5
              r6 = _nt_CRLF
              s0 << r6
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsResentRply0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_resent_rply][start_index] = r0

      r0
    end

    module ObsReturn0
      def path
        elements[3]
      end

      def CRLF
        elements[4]
      end
    end

    def _nt_obs_return
      start_index = index
      if node_cache[:obs_return].has_key?(index)
        cached = node_cache[:obs_return][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("Return-Path", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 11))
        @index += 11
      else
        terminal_parse_failure("Return-Path")
        r1 = nil
      end
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            r5 = _nt_path
            s0 << r5
            if r5
              r6 = _nt_CRLF
              s0 << r6
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsReturn0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_return][start_index] = r0

      r0
    end

    module ObsReceived0
      def name_val_list
        elements[3]
      end

      def CRLF
        elements[4]
      end
    end

    def _nt_obs_received
      start_index = index
      if node_cache[:obs_received].has_key?(index)
        cached = node_cache[:obs_received][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      if has_terminal?("Received", false, index)
        r1 = instantiate_node(SyntaxNode,input, index...(index + 8))
        @index += 8
      else
        terminal_parse_failure("Received")
        r1 = nil
      end
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            r5 = _nt_name_val_list
            s0 << r5
            if r5
              r6 = _nt_CRLF
              s0 << r6
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsReceived0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_received][start_index] = r0

      r0
    end

    def _nt_obs_path
      start_index = index
      if node_cache[:obs_path].has_key?(index)
        cached = node_cache[:obs_path][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      r0 = _nt_obs_angle_addr

      node_cache[:obs_path][start_index] = r0

      r0
    end

    module ObsOptional0
      def field_name
        elements[0]
      end

      def unstructured
        elements[3]
      end

      def CRLF
        elements[4]
      end
    end

    def _nt_obs_optional
      start_index = index
      if node_cache[:obs_optional].has_key?(index)
        cached = node_cache[:obs_optional][index]
        if cached
          cached = SyntaxNode.new(input, index...(index + 1)) if cached == true
          @index = cached.interval.end
        end
        return cached
      end

      i0, s0 = index, []
      r1 = _nt_field_name
      s0 << r1
      if r1
        s2, i2 = [], index
        loop do
          r3 = _nt_WSP
          if r3
            s2 << r3
          else
            break
          end
        end
        r2 = instantiate_node(SyntaxNode,input, i2...index, s2)
        s0 << r2
        if r2
          if has_terminal?(":", false, index)
            r4 = instantiate_node(SyntaxNode,input, index...(index + 1))
            @index += 1
          else
            terminal_parse_failure(":")
            r4 = nil
          end
          s0 << r4
          if r4
            r5 = _nt_unstructured
            s0 << r5
            if r5
              r6 = _nt_CRLF
              s0 << r6
            end
          end
        end
      end
      if s0.last
        r0 = instantiate_node(SyntaxNode,input, i0...index, s0)
        r0.extend(ObsOptional0)
      else
        @index = i0
        r0 = nil
      end

      node_cache[:obs_optional][start_index] = r0

      r0
    end

  end

  class RFC2822ObsoleteParser < Treetop::Runtime::CompiledParser
    include RFC2822Obsolete
  end

end
