Combinator.js 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556
  1. var TYPE = require('../../tokenizer').TYPE;
  2. var CHARCODE = require('../../tokenizer').CHARCODE;
  3. var IDENT = TYPE.Ident;
  4. var PLUSSIGN = CHARCODE.PlusSign;
  5. var SOLIDUS = CHARCODE.Solidus;
  6. var GREATERTHANSIGN = CHARCODE.GreaterThanSign;
  7. var TILDE = CHARCODE.Tilde;
  8. // + | > | ~ | /deep/
  9. module.exports = {
  10. name: 'Combinator',
  11. structure: {
  12. name: String
  13. },
  14. parse: function() {
  15. var start = this.scanner.tokenStart;
  16. var code = this.scanner.source.charCodeAt(this.scanner.tokenStart);
  17. switch (code) {
  18. case GREATERTHANSIGN:
  19. case PLUSSIGN:
  20. case TILDE:
  21. this.scanner.next();
  22. break;
  23. case SOLIDUS:
  24. this.scanner.next();
  25. if (this.scanner.tokenType !== IDENT || this.scanner.lookupValue(0, 'deep') === false) {
  26. this.error('Identifier `deep` is expected');
  27. }
  28. this.scanner.next();
  29. if (!this.scanner.isDelim(SOLIDUS)) {
  30. this.error('Solidus is expected');
  31. }
  32. this.scanner.next();
  33. break;
  34. default:
  35. this.error('Combinator is expected');
  36. }
  37. return {
  38. type: 'Combinator',
  39. loc: this.getLocation(start, this.scanner.tokenStart),
  40. name: this.scanner.substrToCursor(start)
  41. };
  42. },
  43. generate: function(node) {
  44. this.chunk(node.name);
  45. }
  46. };