Browse Source

Create simple compiler class

Just numbers and strings for now
master
Dylan Baker 5 years ago
parent
commit
7a9b1a6727
4 changed files with 57 additions and 2 deletions
  1. 23
    0
      src/compiler.js
  2. 6
    1
      src/index.js
  3. 20
    0
      test/compilerTest.js
  4. 8
    1
      test/helpers.js

+ 23
- 0
src/compiler.js View File

@@ -0,0 +1,23 @@
1
+const AST = require('./ast')
2
+
3
+module.exports = class Compiler {
4
+  constructor() {
5
+    this.result = ''
6
+  }
7
+
8
+  compile(tree) {
9
+    tree.forEach(node => {
10
+      this.result += this.compileNode(node)
11
+    })
12
+
13
+    return this.result
14
+  }
15
+
16
+  compileNode(node) {
17
+    switch (node.constructor) {
18
+      case AST.Number:
19
+      case AST.String:
20
+        return node.value
21
+    }
22
+  }
23
+}

+ 6
- 1
src/index.js View File

@@ -1,11 +1,16 @@
1
+const Compiler = require('./compiler')
1 2
 const Lexer = require('./lexer')
2 3
 const Parser = require('./parser')
3 4
 
4 5
 module.exports = function oslo(source, context) {
5 6
   const lexer = new Lexer()
6 7
   const tokens = lexer.scan(source)
8
+
7 9
   const parser = new Parser(tokens)
8 10
   const tree = parser.parse()
9 11
 
10
-  return tree
12
+  const compiler = new Compiler()
13
+  const result = compiler.compile(tree)
14
+
15
+  return result
11 16
 }

+ 20
- 0
test/compilerTest.js View File

@@ -0,0 +1,20 @@
1
+const test = require('tape')
2
+const helpers = require('./helpers')
3
+
4
+const AST = require('../src/ast')
5
+
6
+test('compiles numbers', t => {
7
+  t.plan(1)
8
+
9
+  const result = helpers.compile('5')
10
+
11
+  t.equal(result, "5")
12
+})
13
+
14
+test('compiles strings', t => {
15
+  t.plan(1)
16
+
17
+  const result = helpers.compile('"hello world"')
18
+
19
+  t.equal(result, "hello world")
20
+})

+ 8
- 1
test/helpers.js View File

@@ -1,3 +1,4 @@
1
+const Compiler = require('../src/compiler')
1 2
 const Lexer = require('../src/lexer')
2 3
 const Parser = require('../src/parser')
3 4
 
@@ -11,7 +12,13 @@ const parse = source => {
11 12
   return parser.parse()
12 13
 }
13 14
 
15
+const compile = source => {
16
+  const compiler = new Compiler()
17
+  return compiler.compile(parse(source))
18
+}
19
+
14 20
 module.exports = {
15
-  scan: scan,
21
+  compile: compile,
16 22
   parse: parse,
23
+  scan: scan,
17 24
 }

Loading…
Cancel
Save