docs: def parse(self):
          """Parse our project file and return :class:`Project` object or raise :exc:`ParseException`."""
          log.debug("Parsing Compass .MAK file %s ...", self.makfilename)
  
          base_location = None
          linked_files = []
          file_params = set()
  
          def parse_linked_file(value):
              log.debug("Parsing linked file:  %s", value)
              value = value.rstrip(';')
              toks = value.split(',', 1)
              if len(toks) == 1:
                  return toks[0]
              else:
                  return toks[0]  # TODO: implement link stations and fixed stations
  
          with codecs.open(self.makfilename, 'rb', 'windows-1252') as makfile:
              prev = None
  
              for line in makfile:
                  line = line.strip()
  
                  if not line:
                      continue
  
                  header, value = line[0], line[1:]
  
                  if prev:
                      if line.endswith(';'):
                          linked_file = parse_linked_file(prev + line.rstrip(';'))
                          linked_files.append(linked_file)
                          prev = None
                      else:
                          prev += value
                      continue
  
                  if header == '/':
                      pass  # comment
  
                  elif header == '@':
                      value = value.rstrip(';')
                      base_location = UTMLocation(*(float(v) for v in value.split(',')))
  
                  elif header == '&':
                      value = value.rstrip(';')
                      base_location.datum = value
  
                  elif header == '%':
                      value = value.rstrip(';')
                      base_location.convergence = float(value)
  
                  elif header == '!':
                      value = value.rstrip(';')
                      #file_params = set(value)  # TODO
  
                  elif header == '#':
                      if value.endswith(';'):
                          linked_files.append(parse_linked_file(value))
                          prev = None
                      else:
                          prev = value
  
              log.debug("Project:  base_loc=%s  linked_files=%s", base_location, linked_files)
  
              project = Project(name_from_filename(self.makfilename), filename=self.makfilename)
              project.set_base_location(base_location)
  
              for linked_file in linked_files:
                  # TODO: we need to support case-insensitive path resolution on case-sensitive filesystems
                  linked_file_path = os.path.join(os.path.dirname(self.makfilename), os.path.normpath(linked_file.replace('\\', '/')))
                  datfile = CompassDatParser(linked_file_path).parse()
                  project.add_linked_file(datfile)
  
              return project