docs: def parse(self, data, doctype):
          '''
          Parse an input string, and return an AST
          doctype must have WCADocument as a baseclass
          '''
          self.doctype = doctype
          self.lexer.lineno = 0
          del self.errors[:]
          del self.warnings[:]
          self.lexer.lexerror = False
          ast = self.parser.parse(data, lexer=self.lexer)
          if self.lexer.lexerror:
              ast = None
          if ast is None:
              self.errors.append("Couldn't build AST.")
          else:
              for check in self.sema[self.doctype]:
                  visitor = check()
                  if not visitor.visit(ast):
                      self.errors.append("Couldn't visit AST.")
                  self.errors.extend(visitor.errors)
                  self.warnings.extend(visitor.warnings)
          return (ast, list(self.errors), list(self.warnings))