|
|
- var List = require('../common/List');
- var SyntaxError = require('../common/SyntaxError');
- var TokenStream = require('../common/TokenStream');
- var Lexer = require('../lexer/Lexer');
- var definitionSyntax = require('../definition-syntax');
- var tokenize = require('../tokenizer');
- 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,
- SyntaxError: SyntaxError,
- TokenStream: TokenStream,
- Lexer: Lexer,
-
- vendorPrefix: names.vendorPrefix,
- keyword: names.keyword,
- property: names.property,
- isCustomProperty: names.isCustomProperty,
-
- definitionSyntax: definitionSyntax,
- lexer: null,
- createLexer: function(config) {
- return new Lexer(config, syntax, syntax.lexer.structure);
- },
-
- tokenize: tokenize,
- parse: parse,
- walk: walk,
- generate: generate,
-
- find: walk.find,
- findLast: walk.findLast,
- findAll: walk.findAll,
-
- 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));
- };
|