grammar ScientificNameCanonical

include ScientificNameDirty

rule root
  multinomial_with_garbage {
    def hybrid
      false
    end

    def details
      [super]
    end

    def parser_run
      3
    end
  }
  /
  uninomial_with_garbage {
    def hybrid
      false
    end

    def details
      [super]
    end

    def parser_run
      3
    end
  }
end

rule multinomial_with_garbage

  a:genus space b:infragenus space c:species garbage {
    def value
      a.value + " " + b.value + " " + c.value
    end

    def canonical
      a.canonical + " " + c.canonical
    end

    def pos
      a.pos.merge(b.pos).merge(c.pos)
    end

    def details
      a.details.merge(b.details).merge(c.details)
    end
  }
  /
  a:genus space b:infragenus garbage {
    def value
      a.value + " " + b.value
    end

    def canonical
      a.canonical
    end

    def pos
      a.pos.merge(b.pos)
    end

    def details
      a.details.merge(b.details)
    end
  }
  /
  a:genus space b:species garbage {
    def value
      a.value + " " + b.value
    end

    def canonical
      a.canonical + " " + b.canonical
    end

    def pos
      a.pos.merge(b.pos)
    end

    def details
      a.details.merge(b.details)
    end
  }
end

rule uninomial_with_garbage
  a:uninomial_string b:garbage {
    def value
      a.value
    end

    def canonical
      a.canonical
    end

    def pos
      a.pos
    end

    def details
      {:uninomial => a.details[:uninomial]}
    end
  }
end

rule garbage
  space "$$g@rbg3$$"
  /
  space (["',.]) space [^щ]*
  /
  space_hard [^ш]+
end

end