-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathagate.js
132 lines (118 loc) · 3.61 KB
/
agate.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
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
'use strict';
var file;
var directory = "./";
var verbose = false;
var dumpTokens = false;
var dumpParseTree = false;
var outName = false;
var fs = require("fs");
var AgateError = require("./error.js");
var error = new AgateError();
var scanner = require("./scanner.js");
let Parser = require("./parser.js");
let Generator = require("./generator.js");
var help = () =>{
console.log("Help")
// TODO: make a help thingy
}
var processArguments = function(){
// First two elements are "node" and "analyzer.js"
let args = process.argv.slice(2);
let noHelp = true;
for(var i = 0; i < args.length && noHelp; ++i) {
let arg = args[i];
if (arg.charAt(0) === '-') {
switch(arg.slice(1)){
case 'v':
verbose = true;
break;
case 't':
dumpTokens = true;
break;
case 'p':
dumpParseTree = true;
break;
case 'o':
outName = arg[++i];
break;
default:
file = "";
noHelp = false;
}
}
else{
// optional /, (characters followed by /)* ((non-dots)+ (dot (non-dots)+)*) (dot then characters)
let fileparts = /^((\/)?(.+?\/)*)([^\.]+(\.[^\.]+)*)\..+$/.exec(arg);
directory = fileparts[1];
file = fileparts[4];
}
}
if ( !file ){
help();
}
};
var readFile = name => new Promise( (resolve, reject) => {
fs.readFile(name, 'utf8', (err, data) => {
if (err) {
reject(err);
}
resolve(data);
});
});
var writeFile = (name, toWrite) => new Promise( (resolve, reject) => {
fs.writeFile(name, toWrite, 'utf8', err => {
if (err) {
reject(err);
}
resolve();
});
});
processArguments();
readFile(`${directory}${file}.agate`)
.then( code => {
if(verbose) {
console.log("Beginning Scanning...");
}
let tokens = scanner(code, error, verbose);
if(verbose) {
console.log("-".repeat(80));
console.log("Beginning Parsing...");
}
if(dumpTokens) {
let prettyTokens = JSON.stringify(tokens, null, 3);
writeFile(`${directory}${outName || file}.tokens.json`, prettyTokens)
.catch( err => {
console.log(err);
});
}
if( !error.count ) {
try{
let parser = new Parser(tokens, error, verbose, directory);
let parseTree = parser.init();
if( dumpParseTree ) {
let treeString = parseTree.toString();
writeFile(`${directory}${outName || file}.tree`, treeString)
.catch( err => {
console.log(err);
});
}
if( !error.count ){
let generator = new Generator(parseTree, error, verbose);
let code = generator.init();
writeFile(`${directory}${outName || file}.html`, code)
.catch( err => {
console.log(err);
});
}
}
// The built-in error handling is so bad
catch(e){
console.log(e.text);
console.log(e.stack);
return;
}
}
})
.catch( err => {
console.log(err);
});