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.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445
  1. const test = require('tape')
  2. const Lexer = require('../src/lexer')
  3. const AST = require('../src/ast/index')
  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 (cond #t "primary" "secondary")))
  12. `)
  13. let parser = new Parser(tokenStream)
  14. let tree = parser.parse()
  15. t.deepEqual(tree, [
  16. new AST.Application({
  17. functionName: new AST.Identifier({ name: 'div' }),
  18. args: [
  19. new AST.Attribute({
  20. name: 'class',
  21. value: new AST.String({ value: 'foobar' })
  22. }),
  23. new AST.Application({
  24. functionName: new AST.Identifier({ name: 'p' }),
  25. args: [
  26. new AST.Attribute({
  27. name: 'class',
  28. value: new AST.Application({
  29. functionName: new AST.Identifier({ name: 'cond' }),
  30. args: [
  31. new AST.Boolean({ value: true }),
  32. new AST.String({ value: 'primary' }),
  33. new AST.String({ value: 'secondary' }),
  34. ]
  35. })
  36. })
  37. ]
  38. })
  39. ]
  40. })
  41. ])
  42. })