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