view tpc.js @ 69:ba032565c7a5

Fix handling of variable style access to self and parent object messages defined with lambdas. Improve test case for this bug to include parent object access as well as self object access.
author Mike Pavone <pavone@retrodev.com>
date Sat, 14 Jul 2012 19:24:04 -0700
parents 3a169ebb3224
children b5152f5ac138
line wrap: on
line source

var module = {exports: {}};
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':
			argtype = arguments[i];
			break;
		case '-compilerdebug':
			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;
	}
}
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);


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)
{
	
	load(basedir + 'peg.js');
	PEG = module.exports;
	load(basedir + 'parser.js');
	load(basedir + 'compiler.js');
	load(basedir + 'cbackend.js');
	var parsed = parseFile(filename);
	if (debugmode) {
		debugprint = print;
	}
	toplevel = new topsymbols(includes);
	var c = parsed.toCModule();
	print(c);
}