Browse Source

Implement compiler

Just strings and numbers for now
master
Dylan Baker 5 years ago
parent
commit
cf57876795
4 changed files with 63 additions and 1 deletions
  1. 23
    0
      src/compiler.js
  2. 3
    1
      src/index.js
  3. 30
    0
      test/compilerTest.js
  4. 7
    0
      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
+  compile(tree) {
5
+    let output = ''
6
+
7
+    tree.forEach(node => {
8
+      output += this.compileNode(node)
9
+    })
10
+
11
+    return output
12
+  }
13
+
14
+  compileNode(node) {
15
+    switch (node.constructor) {
16
+      case AST.Number:
17
+      case AST.String:
18
+        return node.value
19
+      case AST.Lambda:
20
+        return '<lambda>'
21
+    }
22
+  }
23
+}

+ 3
- 1
src/index.js View File

@@ -1,3 +1,4 @@
1
+const Compiler = require('./compiler')
1 2
 const Env = require('./env')
2 3
 const Evaluator = require('./evaluator')
3 4
 const Lexer = require('./lexer')
@@ -22,5 +23,6 @@ module.exports = function oslo(source, context) {
22 23
     return evaluatedTree
23 24
   }
24 25
 
25
-  return ''
26
+  const compiler = new Compiler()
27
+  return compiler.compile(evaluatedTree)
26 28
 }

+ 30
- 0
test/compilerTest.js View File

@@ -0,0 +1,30 @@
1
+const test = require('tape')
2
+const helpers = require('./helpers')
3
+
4
+test('compiles numbers', t => {
5
+  t.plan(1)
6
+
7
+  const result = helpers.compile('5')
8
+  t.equal(result, '5')
9
+})
10
+
11
+test('compiles strings', t => {
12
+  t.plan(1)
13
+
14
+  const result = helpers.compile('"hello world"')
15
+  t.equal(result, 'hello world')
16
+})
17
+
18
+test('compiles lambdas', t => {
19
+  t.plan(1)
20
+
21
+  const result = helpers.compile('(lambda (x) (* x x))')
22
+  t.equal(result, '<lambda>')
23
+})
24
+
25
+test('compiles applications that evaluate to numbers', t => {
26
+  t.plan(1)
27
+
28
+  const result = helpers.compile('((lambda (x) (+ x 1)) 5)')
29
+  t.equal(result, '6')
30
+})

+ 7
- 0
test/helpers.js View File

@@ -1,3 +1,4 @@
1
+const Compiler = require('../src/compiler')
1 2
 const Env = require('../src/env')
2 3
 const Evaluator = require('../src/evaluator')
3 4
 const Lexer = require('../src/lexer')
@@ -18,7 +19,13 @@ const evaluate = source => {
18 19
   return evaluator.eval(parse(source), new Env())
19 20
 }
20 21
 
22
+const compile = source => {
23
+  const compiler = new Compiler()
24
+  return compiler.compile(evaluate(source))
25
+}
26
+
21 27
 module.exports = {
28
+  compile: compile,
22 29
   evaluate: evaluate,
23 30
   parse: parse,
24 31
   scan: scan,

Loading…
Cancel
Save