Mercurial > repos > tabletprog
view tpi.js @ 246:8c81afd6d2d3
Refactor some of the AST node object constructors into a separate AST module
author | Michael Pavone <pavone@retrodev.com> |
---|---|
date | Mon, 06 Jan 2014 19:41:35 -0800 |
parents | 60eff5f81d9a |
children |
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; for (var i = 0; i < arguments.length; i++) { switch (argtype) { case 'normal': switch (arguments[i]) { case '-basedir': case '-i': case '-interpdebug': debugmode = 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 tpi.js -- filename'); quit(1); } includes.push(basedir + 'modules'); interpFile(file, basedir, includes, debugmode); 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 interpFile(filename, basedir, includes, debugmode) { load(basedir + 'mquery.js'); load(basedir + 'peg.js'); PEG = module.exports; load(basedir + 'parser.js'); load(basedir + 'interp.js'); if (debugmode) { debugprint = print; } else { debugprint = function() {}; } var parsed = parseFile(filename); toplevel = new topenv(includes); parsed = parsed.macroexpand(toplevel); var mainModule = parsed.eval(toplevel); return mainModule.tpmeth_main(); }