text: var esprima = require('esprima');
  
  module.exports = function (src, file) {
      if (typeof src !== 'string') src = String(src);
      
      try {
          Function(src);
          return;
      }
      catch (err) {
          if (err.constructor.name !== 'SyntaxError') throw err;
          return errorInfo(src, file);
      }
  };
  
  function errorInfo (src, file) {
      try {
          esprima.parse(src);
          return;
      }
      catch (err) {
          return new ParseError(err, src, file);
      }
  }
  
  function ParseError (err, src, file) {
      SyntaxError.call(this);
      
      this.message = err.message.replace(/^Line \d+: /, '');
      
      this.line = err.lineNumber;
      this.column = err.column;
      
      this.annotated = '\n'
          + (file || '(anonymous file)')
          + ':' + this.line
          + '\n'
          + src.split('\n')[this.line - 1]
          + '\n'
          + Array(this.column).join(' ') + '^'
          + '\n'
          + 'ParseError: ' + this.message
      ;
  }
  
  ParseError.prototype = new SyntaxError;
  
  ParseError.prototype.toString = function () {
      return this.annotated;
  };
  
  ParseError.prototype.inspect = function () {
      return this.annotated;
  };
  