2016-12-31 20:31:43 +00:00
|
|
|
const {
|
|
|
|
tokenizer,
|
|
|
|
parser,
|
|
|
|
transformer,
|
|
|
|
codeGenerator,
|
|
|
|
compiler,
|
2017-01-10 22:18:45 +00:00
|
|
|
} = require('./the-super-tiny-compiler');
|
2016-12-31 20:31:43 +00:00
|
|
|
const assert = require('assert');
|
2016-08-25 01:35:32 +00:00
|
|
|
|
2016-12-31 20:31:43 +00:00
|
|
|
const input = '(add 2 (subtract 4 2))';
|
|
|
|
const output = 'add(2, subtract(4, 2));';
|
2016-08-25 01:35:32 +00:00
|
|
|
|
2016-12-31 20:31:43 +00:00
|
|
|
const tokens = [
|
2016-08-25 01:35:32 +00:00
|
|
|
{ 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: ')' }
|
|
|
|
];
|
|
|
|
|
2016-12-31 20:31:43 +00:00
|
|
|
const ast = {
|
2016-08-25 01:35:32 +00:00
|
|
|
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'
|
|
|
|
}]
|
|
|
|
}]
|
|
|
|
}]
|
|
|
|
};
|
|
|
|
|
2016-12-31 20:31:43 +00:00
|
|
|
const newAst = {
|
2016-08-25 01:35:32 +00:00
|
|
|
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'
|
|
|
|
}]
|
|
|
|
}]
|
|
|
|
}
|
|
|
|
}]
|
|
|
|
};
|
|
|
|
|
|
|
|
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`');
|
|
|
|
|
|
|
|
console.log('All Passed!');
|