def add_edurange(self, edurange):
        """
        Parameters
        ----------
        edurange : etree.Element
            etree representation of a <edurange> element
            (annotation that groups a number of EDUs)
            <edu-range> seems to glue together a number of `<edu> elements,
            which may be scattered over a number of sentences
            <edu-range> may or may not contain a span attribute
            (it seems that the span attribute is present, when <edu-range> is
            a descendent of <sentence>)

        Example
        -------

           <edu-range xml:id="edus9_3_1-5_0" span="s128_4..s130_7">
            <node xml:id="s128_525" cat="SIMPX" func="--">
             <edu xml:id="edu_9_3_1">
              <discRel relation="Continuation" marking="-" arg2="edu_9_3_2"/>
              <node xml:id="s128_506" cat="VF" func="-" parent="s128_525">
               <node xml:id="s128_505" cat="NX" func="ON" parent="s128_506">
                <relation type="expletive"/>
                <word xml:id="s128_4" form="Es" pos="PPER" morph="nsn3" lemma="es" func="HD" parent="s128_505" dephead="s128_5" deprel="SUBJ"/>
               </node>
              </node>

            ...

          <edu-range xml:id="edus37_8_0-8_1">
           <discRel relation="Restatement" marking="-" arg2="edu_37_9_0"/>
           <sentence xml:id="s660">
        """
        edurange_id = self.get_element_id(edurange)
        edurange_attribs = self.element_attribs_to_dict(edurange) # contains 'span' or nothing
        self.add_node(edurange_id, layers={self.ns, self.ns+':edu:range'}, attr_dict=edurange_attribs)
        for edu in edurange.iterdescendants('edu'):
            edu_id = self.get_element_id(edu)
            self.add_edge(edurange_id, edu_id, layers={self.ns, self.ns+':edu:range'},
                          edge_type=dg.EdgeTypes.spanning_relation)