Mercurial > repos > tabletprog
view tpc.js @ 217:adad61ea2f3a
Switched to a less hacky implementation of hygiene and exposed more AST properties to macros
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Sat, 21 Dec 2013 12:07:51 -0800 |
parents | 2dac67e9d18b |
children | 2557ce4e671f |
line wrap: on
line source
var module = {exports: {}}; var console = {log: function(text){}}; var PEG; var file = null; var argtype = 'normal'; var includes = ['.']; var basedir = ''; var debugmode = false; var backend = 'C'; var macroonly = false; for (var i = 0; i < arguments.length; i++) { switch (argtype) { case 'normal': switch (arguments[i]) { case '-basedir': case '-i': case '-backend': argtype = arguments[i]; break; case '-compilerdebug': debugmode = true; break; case '-m': macroonly = true; break; default: if (arguments[i].charAt(0) == '-') { print("unrecognized switch", arguments[i]); quit(1); } file = arguments[i]; } break; case '-basedir': if (basedir == '') { basedir = arguments[i]; argtype = 'normal'; } else { print("only one -basedir option allowed"); quit(1); } break; case '-i': includes.push(arguments[i]); argtype = 'normal'; break; case '-backend': backend = arguments[i]; argtype = 'normal'; break; } } if (argtype != 'normal') { print("switch", argtype, "expects a parameter"); quit(1); } if (!file) { print('usage: d8 tpc.js -- filename'); quit(1); } includes.push(basedir + 'modules'); compileFile(file, basedir, includes, debugmode, backend); function parseFile(filename) { debugprint('//parsing', filename); var text = read(filename); try { var parsed = parser.parse(text); } catch (error) { print('SyntaxError on at', error.line, ',', error.column, ':', error.message); var lines = text.split('\n'); print(lines[error.line-1]); var spacer = ''; for (var i = 1; i < error.column; i++) { if (lines[error.line-1].charAt(i-1) == '\t') { spacer += ' '; } else { spacer += ' '; } } print(spacer + '^'); quit(1); } return parsed; } function compileFile(filename, basedir, includes, debugmode, backend) { load(basedir + 'mquery.js'); load(basedir + 'peg.js'); PEG = module.exports; load(basedir + 'parser.js'); load(basedir + 'compiler.js'); load(basedir + 'interp.js'); if (backend == 'C') { load(basedir + 'cbackend.js'); } else if (backend == 'IL') { load(basedir + 'ilbackend.js'); } else { load(basedir + 'jsbackend.js'); } var parsed = parseFile(filename); if (debugmode) { debugprint = print; } parsed = parsed.macroexpand(new topenv(includes)); if (macroonly) { print(''+parsed); } else { toplevel = new topsymbols(includes); switch(backend) { case 'C': var c = parsed.toCModule(); break; case 'IL': var c = parsed.toILModule(); case 'JS': var c = makeJSProg(parsed); break; default: print('Backend', backend, ' not recognized'); quit(1); } print(c); } }