mirror of
https://github.com/jamiebuilds/the-super-tiny-compiler.git
synced 2024-10-27 20:34:08 +00:00
66 lines
2.1 KiB
JavaScript
66 lines
2.1 KiB
JavaScript
/**
|
|
* ============================================================================
|
|
* ヾ(〃^∇^)ノ♪
|
|
* THE CODE GENERATOR!!!!
|
|
* ============================================================================
|
|
*/
|
|
|
|
/**
|
|
* Now let's move onto our last phase: The Code Generator.
|
|
*
|
|
* Our code generator is going to recursively call itself to print each node in
|
|
* the tree into one giant string.
|
|
*/
|
|
|
|
function codeGenerator(node) {
|
|
|
|
// We'll break things down by the `type` of the `node`.
|
|
switch (node.type) {
|
|
|
|
// If we have a `Program` node. We will map through each node in the `body`
|
|
// and run them through the code generator and join them with a newline.
|
|
case 'Program':
|
|
return node.body.map(codeGenerator)
|
|
.join('\n');
|
|
|
|
// For `ExpressionStatement` we'll call the code generator on the nested
|
|
// expression and we'll add a semicolon...
|
|
case 'ExpressionStatement':
|
|
return (
|
|
codeGenerator(node.expression) +
|
|
';' // << (...because we like to code the *correct* way)
|
|
);
|
|
|
|
// For `CallExpression` we will print the `callee`, add an open
|
|
// parenthesis, we'll map through each node in the `arguments` array and run
|
|
// them through the code generator, joining them with a comma, and then
|
|
// we'll add a closing parenthesis.
|
|
case 'CallExpression':
|
|
return (
|
|
codeGenerator(node.callee) +
|
|
'(' +
|
|
node.arguments.map(codeGenerator)
|
|
.join(', ') +
|
|
')'
|
|
);
|
|
|
|
// For `Identifier` we'll just return the `node`'s name.
|
|
case 'Identifier':
|
|
return node.name;
|
|
|
|
// For `NumberLiteral` we'll just return the `node`'s value.
|
|
case 'NumberLiteral':
|
|
return node.value;
|
|
|
|
// For `StringLiteral` we'll add quotations around the `node`'s value.
|
|
case 'StringLiteral':
|
|
return '"' + node.value + '"';
|
|
|
|
// And if we haven't recognized the node, we'll throw an error.
|
|
default:
|
|
throw new TypeError(node.type);
|
|
}
|
|
}
|
|
|
|
// Just exporting our code generator to be used in the final compiler...
|
|
module.exports = codeGenerator; |