text: /* ***** BEGIN LICENSE BLOCK *****
   * Distributed under the BSD license:
   *
   * Copyright (c) 2012, Ajax.org B.V.
   * All rights reserved.
   * 
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions are met:
   *     * Redistributions of source code must retain the above copyright
   *       notice, this list of conditions and the following disclaimer.
   *     * Redistributions in binary form must reproduce the above copyright
   *       notice, this list of conditions and the following disclaimer in the
   *       documentation and/or other materials provided with the distribution.
   *     * Neither the name of Ajax.org B.V. nor the
   *       names of its contributors may be used to endorse or promote products
   *       derived from this software without specific prior written permission.
   * 
   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
   * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
   * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
   * DISCLAIMED. IN NO EVENT SHALL AJAX.ORG B.V. BE LIABLE FOR ANY
   * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
   * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
   * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
   * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
   * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   *
   *
   * Contributor(s):
   * 
   * NalaGinrut@gmail.com
   *
   * ***** END LICENSE BLOCK ***** */
  
  define(function(require, exports, module) {
  "use strict";
  
  var oop = require("../lib/oop");
  var TextHighlightRules = require("./TextHighlightRules").TextHighlightRules;
  
  var SchemeHighlightRules = function() {
      var keywordControl = "case|do|let|loop|if|else|when";
      var keywordOperator = "eq?|eqv?|equal?|and|or|not|null?";
      var constantLanguage = "#t|#f";
      var supportFunctions = "cons|car|cdr|cond|lambda|lambda*|syntax-rules|format|set!|quote|eval|append|list|list?|member?|load";
  
      var keywordMapper = this.createKeywordMapper({
          "keyword.control": keywordControl,
          "keyword.operator": keywordOperator,
          "constant.language": constantLanguage,
          "support.function": supportFunctions
      }, "identifier", true);
  
      // regexp must not have capturing parentheses. Use (?:) instead.
      // regexps are ordered -> the first match is used
  
      this.$rules = 
          {
      "start": [
          {
              token : "comment",
              regex : ";.*$"
          },
          {
              "token": ["storage.type.function-type.scheme", "text", "entity.name.function.scheme"],
              "regex": "(?:\\b(?:(define|define-syntax|define-macro))\\b)(\\s+)((?:\\w|\\-|\\!|\\?)*)"
          },
          {
              "token": "punctuation.definition.constant.character.scheme",
              "regex": "#:\\S+"
          },
          {
              "token": ["punctuation.definition.variable.scheme", "variable.other.global.scheme", "punctuation.definition.variable.scheme"],
              "regex": "(\\*)(\\S*)(\\*)"
          },
          {
              "token" : "constant.numeric", // hex
              "regex" : "#[xXoObB][0-9a-fA-F]+"
          }, 
          {
              "token" : "constant.numeric", // float
              "regex" : "[+-]?\\d+(?:(?:\\.\\d*)?(?:[eE][+-]?\\d+)?)?"
          },
          {
                  "token" : keywordMapper,
                  "regex" : "[a-zA-Z_#][a-zA-Z0-9_\\-\\?\\!\\*]*"
          },
          {
              "token" : "string",
              "regex" : '"(?=.)',
              "next"  : "qqstring"
          }
      ],
      "qqstring": [
          {
              "token": "constant.character.escape.scheme",
              "regex": "\\\\."
          },
          {
              "token" : "string",
              "regex" : '[^"\\\\]+',
              "merge" : true
          }, {
              "token" : "string",
              "regex" : "\\\\$",
              "next"  : "qqstring",
              "merge" : true
          }, {
              "token" : "string",
              "regex" : '"|$',
              "next"  : "start",
              "merge" : true
          }
      ]
  }
  
  };
  
  oop.inherits(SchemeHighlightRules, TextHighlightRules);
  
  exports.SchemeHighlightRules = SchemeHighlightRules;
  });
  