# - - - S p T a i l . _ _ s c a n S c i def __scanSci ( self, scan ): '''Scan the "Genus (Subgenus) species" part of the line. [ scan is a Scan instance -> if scan starts with a valid scientific name group -> scan := scan advanced past that group and any trailing whitespace self.genus := genus name from that group self.subgenus := subgenus name from that group or None if missing self.species := species name from that group else -> scan := scan advanced no further than end of line Log() +:= error message(s) raise SyntaxError ] '''
All the pattern matching is done in one large regular
expression: see Section 6.25, “
GENUS_SPECIES_RE”. If the
scan matches, the resulting
MatchObject will contain three named groups:
GENUS_CODE for the genus name,
SUBGENUS_FIELD for the subgenus name (which is
optional and will return
None if omitted), and
SPECIES_CODE for the species name.
#-- 1 -- # [ if the line in scan starts with a pattern that matches # GENUS_SPECIES_RE -> # scan := scan advanced past that pattern # self.genus := genus part of the match # self.subgenus := subgenus part of the match, or # None if omitted # self.species := species part of the match # else -> # scan := scan advanced no further than end of line # Log() +:= error message(s) # raise SyntaxError ] m = scan.tabReMatch ( GENUS_SPECIES_RE ) if m is None: scan.syntax ( "Expecting 'Genus species' or " "'Genus (Subgenus) species'." ) self.genus = m.group ( GENUS_CODE ) self.subgenus = m.group ( SUBGENUS_FIELD ) self.species = m.group ( SPECIES_CODE ) #-- 2 -- # [ scan := scan advanced past any leading whitespace ] scan.deblankLine()