Next / Previous / Contents / Shipman's homepage

17.15. Txny.__readAlt(): Read the alternate forms file

As with the standard forms file, we read the alternate forms file a line at a time, in Section 17.16, “Txny.__readAltLine(): Process one line of the alt file”, which will raise SyntaxError for any line containing an error. In order that the operator can get multiple errors out of the file in one run, the current method ignores these exceptions, but it inspects the error count from the Log() singleton before and after reading the file, and terminates execution if the count has changed.

nomcompile3
# - - -   T x n y . _ _ r e a d A l t

    def __readAlt ( self, altFileName ):
        '''Process the alternate forms file.

          [ altFileName is a string ->
              if altFileName names a readable alternate forms file
              valid against itself, self.hier, and self.abTab ->
                self.taxaTree  +:=  new taxa from that file
                self.abTab  +:=  new bindings from that file
              else ->
                Log()  +:=  error message(s)
                raise IOError ]
        '''
        #-- 1 --
        # [ if file (altFileName) can be opened for reading ->
        #     scan  :=  a Scan instance pointing at the start of
        #               that file
        #     errCount  :=  error count from Log()
        #   else ->
        #     Log()  +:=  error message(s)
        #     raise IOError ]
        try:
            scan = Scan ( altFileName )
            errCount = Log().count()
        except IOError, detail:
            raise IOError ( "Can't open alternate forms file '%s': "
                "%s" % (altFileName, detail) )

        #-- 2 --
        # [ scan  :=  scan advanced to end of file
        #   self.taxaTree  +:=  new taxa from scan
        #   self.abTab  +:=  new  bindings from scan
        #   Log()  +:=  error messages about invalid lines in scan ]
        while not scan.atEndFile:
            #-- 2 body --

            #-- 2.1 --
            # [ if line in scan is valid ->
            #     scan  :=  scan advanced to end of line
            #     self.taxaTree  +:=  new taxa from that line
            #     self.abTab  +:=  new bindings from that line
            #   else ->
            #     scan  :=  scan advanced not past end of line
            #     Log()  +:=  error message(s)
            try:
                self.__readAltLine ( scan )
            except SyntaxError:
                pass

            #-- 2.2 --
            # [ scan  :=  scan advanced to next line or end of file,
            #             whichever comes first ]
            scan.nextLine()

        #-- 3 --
        # [ if Log().count() == errCount ->
        #     I
        #   else -> raise IOError ]
        scan.close()
        netErrCount = Log().count() - errCount
        if netErrCount > 0:
            raise IOError ( "Execution terminated due to %d errors in "
                "the alternate forms file." % netErrCount )