Показать сообщение отдельно
Старый 20.09.2013, 19:23
AlexCooper вне форума Посмотреть профиль Отправить личное сообщение для AlexCooper Найти все сообщения от AlexCooper
  № 9  
Ответить с цитированием
AlexCooper
 
Аватар для AlexCooper

Регистрация: Sep 2008
Адрес: Черкассы
Сообщений: 1,167
Записей в блоге: 1
Отправить сообщение для AlexCooper с помощью ICQ Отправить сообщение для AlexCooper с помощью Skype™
Вот нечего было делать, наваял вам небольшой парсер, работает только с условием AND нет проверок на пробелы, вообще м как, примерно показал.

Код AS3:
 
var fLib:Object = new Object();
	fLib['=='] = ravno;
	fLib['!='] = neravno;
	fLib['>'] = bolshe;
	fLib['<'] = menshe;
 
function bolshe(arg:Array):Boolean {
	return arg[0]>arg[1];
}
 
function menshe(arg:Array):Boolean {
	return arg[0]<arg[1];
}
 
function ravno(arg:Array):Boolean {
	return arg[0]==arg[1];
}
 
function neravno(arg:Array):Boolean {
	return arg[0]!=arg[1];
}
 
var variables:Object = new Object();
	variables['p1'] = 1;
	variables['p2'] = 2;
	variables['p3'] = 2;
 
var commandLine = '(p1!=p2) AND (p2==p3) AND (p1<2)';
 
var resultCommand:Boolean = interpretator(commandLine);
 
trace(resultCommand); // true
 
function interpretator(line:String):Boolean {
 
	var funcTemp:Array = new Array();
 
	var funcDump:Array;
 
	// разбиваем на логические И
	var ifDump:Array = line.split('AND');
 
	var resultDump:Array = new Array();
 
	var result:Array = new Array();
 
	// проходим по логическим составным
	for each( var subcommand:String in ifDump) {
 
		// ищем функции
		for ( var func:String in fLib) {
 
			// разбиваем на элементы 
			funcDump = subcommand.split(func);
 
			// если два и более элемента значит нужно выполнить эту логическую функцию
			if (funcDump.length>1) {
 
 
				if (!resultDump[func]) resultDump[func] = new Array();
 
				// парсим переменные
				variableParser(funcDump);
 
				// результаты в массив
				resultDump[func].push(funcDump);
			}
		}
	}
 
	// выполняем функции
	for ( func in resultDump) {
 
		// пока есть элементы 
		while (resultDump[func].length) {
 
			// выбираем по парам и выполняем соответсвующию функцию
			result.push(fLib[func]( resultDump[func].shift() ) );
		}
 
	}
 
	// только для условия И ( нужно доработать )
	var resultBoolean:Boolean = true; 
 
	for each( var resB:Boolean in result ) {
 
		if (resultBoolean) resultBoolean = resB;
	}
 
	return resultBoolean;
}
 
function variableParser(arr:Array):void {
 
	// проходим все пары элементов
	for ( var i:uint = 0; i <arr.length ; i++) {
 
		var varIndex:String;
 
		var ind:Number;
 
		if (i%2) {
			// если элемент после знака оператора то ищем дугу 
			ind = String(arr[i]).indexOf(')');
 
			// режем текст до дуги
			varIndex = String(arr[i]).substr(0,ind);
 
		} else {
			// если элемент перед оператором
			ind = String(arr[i]).lastIndexOf('(');
 
			// режем текст с начала строки до дуги
			varIndex = String(arr[i]).substr(ind+1,String(arr[i]).length);
		}
 
		// находим переменную и переопределяем массив
		arr[i] = (variables[varIndex]) ? variables[varIndex] : varIndex;
 
	}
 
}
__________________
return this...


Последний раз редактировалось AlexCooper; 20.09.2013 в 19:37.