create.js 2.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677
  1. var List = require('../utils/list');
  2. var Tokenizer = require('../tokenizer');
  3. var Lexer = require('../lexer/Lexer');
  4. var grammar = require('../lexer/grammar');
  5. var createParser = require('../parser/create');
  6. var createGenerator = require('../generator/create');
  7. var createConvertor = require('../convertor/create');
  8. var createWalker = require('../walker/create');
  9. var clone = require('../utils/clone');
  10. var names = require('../utils/names');
  11. var mix = require('./config/mix');
  12. function assign(dest, src) {
  13. for (var key in src) {
  14. dest[key] = src[key];
  15. }
  16. return dest;
  17. }
  18. function createSyntax(config) {
  19. var parse = createParser(config);
  20. var walk = createWalker(config);
  21. var generate = createGenerator(config);
  22. var convert = createConvertor(walk);
  23. var syntax = {
  24. List: List,
  25. Tokenizer: Tokenizer,
  26. Lexer: Lexer,
  27. vendorPrefix: names.vendorPrefix,
  28. keyword: names.keyword,
  29. property: names.property,
  30. isCustomProperty: names.isCustomProperty,
  31. grammar: grammar,
  32. lexer: null,
  33. createLexer: function(config) {
  34. return new Lexer(config, syntax, syntax.lexer.structure);
  35. },
  36. parse: parse,
  37. walk: walk,
  38. generate: generate,
  39. clone: clone,
  40. fromPlainObject: convert.fromPlainObject,
  41. toPlainObject: convert.toPlainObject,
  42. createSyntax: function(config) {
  43. return createSyntax(mix({}, config));
  44. },
  45. fork: function(extension) {
  46. var base = mix({}, config); // copy of config
  47. return createSyntax(
  48. typeof extension === 'function'
  49. ? extension(base, assign)
  50. : mix(base, extension)
  51. );
  52. }
  53. };
  54. syntax.lexer = new Lexer({
  55. generic: true,
  56. types: config.types,
  57. properties: config.properties,
  58. node: config.node
  59. }, syntax);
  60. return syntax;
  61. };
  62. exports.create = function(config) {
  63. return createSyntax(mix({}, config));
  64. };