A templating language that looks like Lisp and compiles to HTML
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

parser.js 1.8KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475
  1. const test = require('tape')
  2. const Lexer = require('../src/lexer')
  3. const Node = require('../src/node')
  4. const Parser = require('../src/parser')
  5. const tt = require('../src/tokenTypes')
  6. test('parses token stream into a tree', t => {
  7. t.plan(1)
  8. const lexer = new Lexer()
  9. let tokenStream = lexer.scan(`
  10. (div :class "foobar"
  11. (p :class "bazquux"))
  12. `)
  13. let parser = new Parser(tokenStream)
  14. let tree = parser.parse()
  15. t.deepEqual(tree, [
  16. new Node({
  17. type: 'functionCall',
  18. functionName: 'div',
  19. args: [
  20. new Node({
  21. attributeName: 'class',
  22. attributeValue: new Node({ type: 'string', content: 'foobar' }),
  23. }),
  24. ],
  25. subtree: [
  26. new Node({
  27. type: 'functionCall',
  28. functionName: 'p',
  29. args: [
  30. new Node({
  31. attributeName: 'class',
  32. attributeValue: new Node({ type: 'string', content: 'bazquux' }),
  33. }),
  34. ],
  35. subtree: [],
  36. }),
  37. ],
  38. }),
  39. ])
  40. })
  41. test('missing close paren returns an error', function(t) {
  42. t.plan(2)
  43. const lexer = new Lexer()
  44. let tokenStream = lexer.scan(`
  45. (div :class "foobar"
  46. `)
  47. let parser = new Parser(tokenStream)
  48. let tree = parser.parse()
  49. t.equal(tree.error.constructor.name, 'Error')
  50. t.deepEqual(tree.error, {
  51. file: undefined,
  52. line: 3,
  53. message: 'Encountered an unexpected EOF while looking for a ).',
  54. })
  55. })
  56. test('unexpected attribute return an error', function(t) {
  57. t.plan(2)
  58. const lexer = new Lexer()
  59. let tokenStream = lexer.scan(`
  60. (div :class :id)
  61. `)
  62. let parser = new Parser(tokenStream)
  63. let tree = parser.parse()
  64. t.equal(tree.error.constructor.name, 'Error')
  65. t.deepEqual(tree.error, {
  66. file: undefined,
  67. line: 2,
  68. message: 'Encountered an unexpected attribute while looking for a string or identifier.',
  69. })
  70. })