create.js 2.2 KB

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