76 lines
2.0 KiB
76 lines
2.0 KiB
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)); |
|
};
|
|
|