-
Notifications
You must be signed in to change notification settings - Fork 0
/
generateClone.js
79 lines (59 loc) · 1.96 KB
/
generateClone.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
const fs = require('mz/fs')
const path=require("path");
async function main(){
var filename=process.argv[2];
const outputfile=path.basename(filename,".ast")+".js";
const contents=(await fs.readFile(filename)).toString();
const ast=JSON.parse(contents);
const jsCode=generateJs(ast);
await fs.writeFile(outputfile,jsCode);
console.log("wrote ${outputfile}.");
function generateJs(statements){
const lines=[];
for(let statement of statements){
console.log(statement);
if(statement.type==="var_assignment"){
const value=generateJSFORExpression(statement.value)
lines.push('let '+statement.varname+"="+value);
}
else if(statement.type==="print_statement"){
const expression=generateJSFORExpression(statement.expression);
lines.push('console.log('+expression+');')
}
else if(statement.type=="while_loop"){
const condition=generateJSFORExpression(statement.condition)
const body=generateJs(statement.body)
lines.push("while("+condition+"){\n"+body+"\n}");
}
}
return lines.join("\n")
return "console.log('hello world')";
}
function generateJSFORExpression(expression){
console.log("js=>"+expression)
const operatorMap={
"+":"+",
"-":"-",
"*":"*",
"/":"/",
">":">",
">=":">=",
"<":"<",
"<=":"<=",
"=":"==s",
}
if(typeof expression=='object'){
console.log(typeof expression);
if(expression.type==="binary_expression"){
const left=generateJSFORExpression(expression.left);
const right=generateJSFORExpression(expression.right);
const operator=operatorMap[expression.operator]
return ''+left+''+operator+''+right+'';
}
}
else{
return expression;
}
}
}
main();