text: var List = require('../utils/list');
  var Tokenizer = require('../tokenizer');
  var Lexer = require('../lexer/Lexer');
  var grammar = require('../lexer/grammar');
  var createParser = require('../parser/create');
  var createGenerator = require('../generator/create');
  var createConvertor = require('../convertor/create');
  var createWalker = require('../walker/create');
  var clone = require('../utils/clone');
  var names = require('../utils/names');
  var mix = require('./config/mix');
  
  function assign(dest, src) {
      for (var key in src) {
          dest[key] = src[key];
      }
  
      return dest;
  }
  
  function createSyntax(config) {
      var parse = createParser(config);
      var walk = createWalker(config);
      var generate = createGenerator(config);
      var convert = createConvertor(walk);
  
      var syntax = {
          List: List,
          Tokenizer: Tokenizer,
          Lexer: Lexer,
  
          vendorPrefix: names.vendorPrefix,
          keyword: names.keyword,
          property: names.property,
          isCustomProperty: names.isCustomProperty,
  
          grammar: grammar,
          lexer: null,
          createLexer: function(config) {
              return new Lexer(config, syntax, syntax.lexer.structure);
          },
  
          parse: parse,
          walk: walk,
          generate: generate,
  
          clone: clone,
          fromPlainObject: convert.fromPlainObject,
          toPlainObject: convert.toPlainObject,
  
          createSyntax: function(config) {
              return createSyntax(mix({}, config));
          },
          fork: function(extension) {
              var base = mix({}, config); // copy of config
              return createSyntax(
                  typeof extension === 'function'
                      ? extension(base, assign)
                      : mix(base, extension)
              );
          }
      };
  
      syntax.lexer = new Lexer({
          generic: true,
          types: config.types,
          properties: config.properties,
          node: config.node
      }, syntax);
  
      return syntax;
  };
  
  exports.create = function(config) {
      return createSyntax(mix({}, config));
  };
  