text: var createCustomError = require('../utils/createCustomError');
  var generate = require('../definition-syntax/generate');
  
  function fromMatchResult(matchResult) {
      var tokens = matchResult.tokens;
      var longestMatch = matchResult.longestMatch;
      var node = longestMatch < tokens.length ? tokens[longestMatch].node : null;
      var mismatchOffset = -1;
      var entries = 0;
      var css = '';
  
      for (var i = 0; i < tokens.length; i++) {
          if (i === longestMatch) {
              mismatchOffset = css.length;
          }
  
          if (node !== null && tokens[i].node === node) {
              if (i <= longestMatch) {
                  entries++;
              } else {
                  entries = 0;
              }
          }
  
          css += tokens[i].value;
      }
  
      return {
          node: node,
          css: css,
          mismatchOffset: mismatchOffset === -1 ? css.length : mismatchOffset,
          last: node === null || entries > 1
      };
  }
  
  function getLocation(node, point) {
      var loc = node && node.loc && node.loc[point];
  
      if (loc) {
          return {
              offset: loc.offset,
              line: loc.line,
              column: loc.column
          };
      }
  
      return null;
  }
  
  var SyntaxReferenceError = function(type, referenceName) {
      var error = createCustomError(
          'SyntaxReferenceError',
          type + (referenceName ? ' `' + referenceName + '`' : '')
      );
  
      error.reference = referenceName;
  
      return error;
  };
  
  var MatchError = function(message, syntax, node, matchResult) {
      var error = createCustomError('SyntaxMatchError', message);
      var details = fromMatchResult(matchResult);
      var mismatchOffset = details.mismatchOffset || 0;
      var badNode = details.node || node;
      var end = getLocation(badNode, 'end');
      var start = details.last ? end : getLocation(badNode, 'start');
      var css = details.css;
  
      error.rawMessage = message;
      error.syntax = syntax ? generate(syntax) : '<generic>';
      error.css = css;
      error.mismatchOffset = mismatchOffset;
      error.loc = {
          source: (badNode && badNode.loc && badNode.loc.source) || '<unknown>',
          start: start,
          end: end
      };
      error.line = start ? start.line : undefined;
      error.column = start ? start.column : undefined;
      error.offset = start ? start.offset : undefined;
      error.message = message + '\n' +
          '  syntax: ' + error.syntax + '\n' +
          '   value: ' + (error.css || '<empty string>') + '\n' +
          '  --------' + new Array(error.mismatchOffset + 1).join('-') + '^';
  
      return error;
  };
  
  module.exports = {
      SyntaxReferenceError: SyntaxReferenceError,
      MatchError: MatchError
  };
  