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.

96 lines
2.6 KiB

var tokenizer = require('./1-tokenizer');
var parser = require('./2-parser');
// Note: The traverser is only used inside of the transformer...
var transformer = require('./4-transformer');
var codeGenerator = require('./5-code-generator');
var compiler = require('./6-compiler');
// assert is a Node.js utility for asserting values and throwing and error if
// they aren't what you expect
var assert = require('assert');
/**
* Setting up all of the expected values through out our compiler phases:
*/
var input = '(add 2 (subtract 4 2))';
var output = 'add(2, subtract(4, 2));';
var tokens = [
{ type: 'paren', value: '(' },
{ type: 'name', value: 'add' },
{ type: 'number', value: '2' },
{ type: 'paren', value: '(' },
{ type: 'name', value: 'subtract' },
{ type: 'number', value: '4' },
{ type: 'number', value: '2' },
{ type: 'paren', value: ')' },
{ type: 'paren', value: ')' }
];
var ast = {
type: 'Program',
body: [{
type: 'CallExpression',
name: 'add',
params: [{
type: 'NumberLiteral',
value: '2'
}, {
type: 'CallExpression',
name: 'subtract',
params: [{
type: 'NumberLiteral',
value: '4'
}, {
type: 'NumberLiteral',
value: '2'
}]
}]
}]
};
var newAst = {
type: 'Program',
body: [{
type: 'ExpressionStatement',
expression: {
type: 'CallExpression',
callee: {
type: 'Identifier',
name: 'add'
},
arguments: [{
type: 'NumberLiteral',
value: '2'
}, {
type: 'CallExpression',
callee: {
type: 'Identifier',
name: 'subtract'
},
arguments: [{
type: 'NumberLiteral',
value: '4'
}, {
type: 'NumberLiteral',
value: '2'
}]
}]
}
}]
};
/**
* Now let's write some assertions to make sure our compiler does everything we
* want it to...
*/
assert.deepStrictEqual( tokenizer(input), tokens, 'Tokenizer should turn `input` string into `tokens` array');
assert.deepStrictEqual( parser(tokens), ast, 'Parser should turn `tokens` array into `ast`');
assert.deepStrictEqual( transformer(ast), newAst, 'Transformer should turn `ast` into a `newAst`');
assert.deepStrictEqual( codeGenerator(newAst), output, 'Code Generator should turn `newAst` into `output` string');
assert.deepStrictEqual( compiler(input), output, 'Compiler should turn `input` into `output`');
// If none of the above asserts threw an error...
console.log('All Passed!');