parser

Написать ответ на текущее сообщение

 

 
   команды управления поиском

не вдаваясь в подробности...

Maxx 31.07.2007 15:40 / 31.07.2007 15:49

того зачем вам это понадобилось.

стоит наверно вынести обработку ошибок в отдельный метод, иначе логика вашего кода не читается совсем.

типа так (не проверял):
@main[]
$func[$form:func]
^if(^func.match[[^^xy\d+*\/-]][]){
	^funcException[$.type[invalid data]$.comment[$func]]
}{
	$func[^func.match[x|y][ig]{1}]
	^try{
	  $func(^process{^^eval($func)}) ^rem{ <--untaint здесь не нужен}
	  ^oSql.void{INSERT	INTO dataname (func) VALUES ('$form:dataname')}
	  Добавлен набор "$form:dataname"
	}{
	  ^funcException[$exception]		
	  $exception.handled(true)
	}
}



@funcException[e]
^switch[$e.type]{
	^case[number.format;parser.runtime;parser.compile]{
		$result[Ошибка в формуле,
			<pre>$e.comment</pre>
			функция должна состоять из: 'x', 'y', цифр и знаков '+', '-', '*', '/'
		]
	}
	^case[number.zerodivision]{
		$result[Деление на ноль!
			<pre>$e.comment</pre>
			Есть попроще функции? лень лечить деление...
		]
	}
	^case[sql.execute]{
		$result[Ошибка создания набора данных:
			<pre>$exception.comment</pre>
		]
	}
	^case[invalid data]{
		$result[<br />
			недопустимый символ в формуле:
			<pre>$e.comment</pre>
			<br />
		]
	}
}
чего вы добиваетесь вычислением формулы в итоге? что заменив переменные на 1 - он таки продолжает давать какой то результат?
ну а если человек ошибся и написал вместо x+y*15 - xy15 - формула все равно вычислится и даст результат 1115, но это вроде не то что вы хотите.

трудно представить что в формуле ЯВНО будут писать x+y/0

P.S. не забудьте в числах еще бывают точки и запятые (кто как пишет)