v0.2.0a - Log works with one parameter. Hello world!
This commit is contained in:
parent
c8195cef5a
commit
b2a686c27c
10
bin/pivot.js
10
bin/pivot.js
@ -2,6 +2,7 @@
|
|||||||
const args = process.argv.slice(2);
|
const args = process.argv.slice(2);
|
||||||
const tokenizer = require('../src/tokenizer.js');
|
const tokenizer = require('../src/tokenizer.js');
|
||||||
const parser = require('../src/parser.js');
|
const parser = require('../src/parser.js');
|
||||||
|
const code = require('../src/code.js');
|
||||||
|
|
||||||
if (typeof args[0] != 'undefined') {
|
if (typeof args[0] != 'undefined') {
|
||||||
// Execute from file.
|
// Execute from file.
|
||||||
@ -21,9 +22,14 @@ if (typeof args[0] != 'undefined') {
|
|||||||
func(answer);
|
func(answer);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
console.log('Welcome to Pivot v0.1.0 Alpha.');
|
console.log('Welcome to Pivot v0.2.0 Alpha.');
|
||||||
console.log('Type \'exit\' to exit.');
|
console.log('Type \'exit\' to exit.');
|
||||||
|
let data = {
|
||||||
|
log: "console.log"
|
||||||
|
};
|
||||||
repl('> ', (answer) => {
|
repl('> ', (answer) => {
|
||||||
console.log(require('util').inspect(parser.parse(tokenizer.tokenize(answer)), { depth: null }));
|
let jsAnswer = code.translate(parser.parse(tokenizer.tokenize(answer)), data);
|
||||||
|
// console.log(require('util').inspect(jsAnswer, { depth: null }));
|
||||||
|
eval(jsAnswer);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
38
src/code.js
Normal file
38
src/code.js
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
/**
|
||||||
|
* @module code
|
||||||
|
* @file Runs the code / transpiles the code to JavaScript
|
||||||
|
* @author Garen Tyler <garentyler@gmail.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @function translate
|
||||||
|
* @desc Translates the code to JS, given an AST
|
||||||
|
* @param {Token[]} ast The ast.
|
||||||
|
* @returns {String} The JS code.
|
||||||
|
* @public
|
||||||
|
*/
|
||||||
|
function translate(ast, data) {
|
||||||
|
let out = '';
|
||||||
|
for (let i = 0; i < ast.length; i++) {
|
||||||
|
if (ast[i].type == 'operator' && ast[i].subtype == 'function call') {
|
||||||
|
let temp = '';
|
||||||
|
if (!(Object.keys(data).indexOf(ast[i].operands[0].value) > -1))
|
||||||
|
throw new ReferenceError(`Undefined function ${ast[i].operands[0].value}`);
|
||||||
|
else temp += data[ast[i].operands[0].value];
|
||||||
|
temp += '(';
|
||||||
|
for (let j = 0; j < ast[i].operands[1].tokens.length; j++) {
|
||||||
|
if (j != 0)
|
||||||
|
temp += ', ';
|
||||||
|
if (ast[i].operands[1].tokens[j].type == 'string')
|
||||||
|
temp += `"${ast[i].operands[1].tokens[j].value}"`;
|
||||||
|
}
|
||||||
|
temp += ');'
|
||||||
|
out += temp;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return out;
|
||||||
|
}
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
translate
|
||||||
|
};
|
@ -208,7 +208,8 @@ function functionCall(ast) {
|
|||||||
for (let i = 0; i < ast.length; i++) {
|
for (let i = 0; i < ast.length; i++) {
|
||||||
if (ast[i].type == 'group')
|
if (ast[i].type == 'group')
|
||||||
ast[i].tokens = functionCall(ast[i].tokens); // Recursively order the groups.
|
ast[i].tokens = functionCall(ast[i].tokens); // Recursively order the groups.
|
||||||
else if (ast[i].type == 'name' && ast[i].subtype == 'variable') { // Member access operator.
|
else if ((ast[i].type == 'name' && ast[i].subtype == 'variable') || // Normal function call
|
||||||
|
(ast[i].type == 'operator' && (ast[i].value == '.' || ast[i].value == 'member access'))) { // Function call in member access. Example: console.log()
|
||||||
if (typeof ast[i + 1] == 'undefined')
|
if (typeof ast[i + 1] == 'undefined')
|
||||||
continue; // Nothing after the variable; skip this loop.
|
continue; // Nothing after the variable; skip this loop.
|
||||||
if (ast[i + 1].type == 'group' && ast[i + 1].subtype == 'parenthesis') {
|
if (ast[i + 1].type == 'group' && ast[i + 1].subtype == 'parenthesis') {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user