code: def run_validator(pattern):
      
  
      start = ''
      if isinstance(pattern, six.string_types):
          start = pattern[:2]
          pattern = InputStream(pattern)
  
      if not start:
          start = pattern.readline()[:2]
          pattern.seek(0)
  
      parseErrListener = STIXPatternErrorListener()
  
      lexer = STIXPatternLexer(pattern)
      # it always adds a console listener by default... remove it.
      lexer.removeErrorListeners()
  
      stream = CommonTokenStream(lexer)
  
      parser = STIXPatternParser(stream)
      parser.buildParseTrees = False
      # it always adds a console listener by default... remove it.
      parser.removeErrorListeners()
      parser.addErrorListener(parseErrListener)
  
      # To improve error messages, replace "<INVALID>" in the literal
      # names with symbolic names.  This is a hack, but seemed like
      # the simplest workaround.
      for i, lit_name in enumerate(parser.literalNames):
          if lit_name == u"<INVALID>":
              parser.literalNames[i] = parser.symbolicNames[i]
  
      parser.pattern()
  
      # replace with easier-to-understand error message
      if not (start[0] == '[' or start == '(['):
          parseErrListener.err_strings[0] = "FAIL: Error found at line 1:0. " \
                                            "input is missing square brackets"
  
      return parseErrListener.err_strings
docs: Validates a pattern against the STIX Pattern grammar.  Error messages are
      returned in a list.  The test passed if the returned list is empty.