Browse Source

Implement number and boolean types

master
Dylan Baker 5 years ago
parent
commit
c7c40f7df7
3 changed files with 46 additions and 0 deletions
  1. 19
    0
      src/lexer.js
  2. 2
    0
      src/tokenTypes.js
  3. 25
    0
      test/lexer.js

+ 19
- 0
src/lexer.js View File

@@ -44,6 +44,25 @@ module.exports = class Lexer {
44 44
           value: value,
45 45
         })
46 46
         pos += value.length + 1 // the +1 is to account for the apostrophe
47
+      } else if (source[pos].match(/\d/)) {
48
+        let number = ''
49
+        while (source[pos] && source[pos].match(/\d/)) {
50
+          number += source[pos]
51
+          pos++
52
+        }
53
+        tokenStream.tokens.push({
54
+          type: tokenTypes.NUMBER,
55
+          line: line,
56
+          value: parseFloat(number),
57
+        })
58
+      } else if (source.slice(pos).match(/^#(t|f)/)) {
59
+        pos++
60
+        tokenStream.tokens.push({
61
+          type: tokenTypes.BOOLEAN,
62
+          line: line,
63
+          value: source[pos] === 't' ? true : false
64
+        })
65
+        pos++
47 66
       } else if (source[pos].match(/\n/)) {
48 67
         line++
49 68
         pos++

+ 2
- 0
src/tokenTypes.js View File

@@ -6,5 +6,7 @@ module.exports = {
6 6
   LITERAL: 'literal',
7 7
   ATTRIBUTE: 'attribute',
8 8
   SYMBOL: 'symbol',
9
+  NUMBER: 'number',
10
+  BOOLEAN: 'boolean',
9 11
   EOF: 'EOF',
10 12
 }

+ 25
- 0
test/lexer.js View File

@@ -84,3 +84,28 @@ test('allow special characters inside quotes', t => {
84 84
   ])
85 85
   t.equal(tokens[3].value, '(test)')
86 86
 })
87
+
88
+test('lex numbers', t => {
89
+  t.plan(2)
90
+  const lexer = new Lexer()
91
+  let tokens = lexer.scan('1 2 3 4 5').tokens
92
+  t.deepEqual(tokens.map(token => token.type), [
93
+    tt.NUMBER, tt.NUMBER, tt.NUMBER, tt.NUMBER, tt.NUMBER, tt.EOF,
94
+  ])
95
+  t.deepEqual(tokens.map(token => token.value), [
96
+    1, 2, 3, 4, 5, undefined // undefined is for the EOF
97
+  ])
98
+})
99
+
100
+test('lex booleans', t => {
101
+  t.plan(2)
102
+  const lexer = new Lexer()
103
+  let tokens = lexer.scan('#t #f').tokens
104
+  t.deepEqual(tokens.map(token => token.type), [
105
+    tt.BOOLEAN, tt.BOOLEAN, tt.EOF
106
+  ])
107
+  t.deepEqual(tokens.map(token => token.value), [
108
+    true, false, undefined // undefined is for the EOF
109
+  ])
110
+})
111
+

Loading…
Cancel
Save