def parse_line
      s0 = @current_pos
      match_spaces
      s2 = parse_te
      if s2 != :failed
        match_spaces
        s4 = @current_pos
        s5 = parse_fugou
        if s5 != :failed
          s6 = parse_from
          if s6 != :failed
            @reported_pos = s4
            s4 = transform_teban_fugou_from(s2, s5, s6)
          else
            @current_pos = s4
            s4 = :failed
          end
        else
          @current_pos = s4
          s4 = :failed
        end
        if s4 == :failed
          s4 = @current_pos
          s5 = []
          s6 = match_regexp(/^[^\r\n ]/)
          while s6 != :failed
            s5 << s6
            s6 = match_regexp(/^[^\r\n ]/)
          end
          @reported_pos = s4
          s4 = s5.join
        end
        if s4 != :failed
          match_spaces
          s6 = parse_time
          s6 = nil if s6 == :failed
          match_str("+")
          if parse_nl != :failed
            @reported_pos = s0
            s0 = { "move" => s4, "time" => s6 }
          else
            @current_pos = s0
            s0 = :failed
          end
        else
          @current_pos = s0
          s0 = :failed
        end
      else
        @current_pos = s0
        s0 = :failed
      end
      s0
    end
def parse_line
      s0 = @current_pos
      match_spaces
      s2 = parse_te
      if s2 != :failed
        match_spaces
        s4 = @current_pos
        s5 = parse_fugou
        if s5 != :failed
          s6 = parse_from
          if s6 != :failed
            @reported_pos = s4
            s4 = transform_teban_fugou_from(s2, s5, s6)
          else
            @current_pos = s4
            s4 = :failed
          end
        else
          @current_pos = s4
          s4 = :failed
        end
        if s4 == :failed
          s4 = @current_pos
          s5 = []
          s6 = match_regexp(/^[^\r\n ]/)
          while s6 != :failed
            s5 << s6
            s6 = match_regexp(/^[^\r\n ]/)
          end
          @reported_pos = s4
          s4 = s5.join
        end
        if s4 != :failed
          match_spaces
          s6 = parse_time
          s6 = nil if s6 == :failed
          match_str("+")
          if parse_nl != :failed
            @reported_pos = s0
            s0 = { "move" => s4, "time" => s6 }
          else
            @current_pos = s0
            s0 = :failed
          end
        else
          @current_pos = s0
          s0 = :failed
        end
      else
        @current_pos = s0
        s0 = :failed
      end
      s0
    end
line : " "* te " "* (fugou from | [^\r\n ]*) " "* time? "+"? nl