Написать PHP-класс для парсинга выражений

2 100 руб. за проект • наличный расчёт, электронные деньги
22 марта 2014, 12:44 • 5 откликов • 30 просмотров
Требуется реализовать парсер выражений
На вход подается выражение вида
[операнд*опция1,опция2(5),опция3('параметр1','параметр2)',.....]
и набор допустимых операндов, опций.
на выходе возвращается распарсенная структура 

Примеры:
Вход:
[silicone*after('kill','me')]
операнды:silicone,hydrogen,stop
опции:after,destroy
Выход:
object(stdClass)#1 (2) {
["tag"]=>
string(4) "silicone"
["options"]=>
array(2) {

[1]=>
array(2) {
["name"]=>
string(5) "after"
["parameters"]=>
array(2) {
[0]=>
string(4) "kill"
[1]=>
string(2) "me"
}
}
}
}

Вход
[stop*destroy,after('kill','me')]
операнды:silicone,hydrogen,stop
опции:after,destroy
Выход:

object(stdClass)#1 (2) {
["tag"]=>
string(4) "stop"
["options"]=>
array(2) {
[0]=>
array(2) {
["name"]=>
string(7) "destroy"
["parameters"]=>
array(0) {
}
}
[1]=>
array(2) {
["name"]=>
string(5) "after"
["parameters"]=>
array(2) {
[0]=>
string(4) "kill"
[1]=>
string(2) "me"
}
}
}
}
Вход:
[stop*destroy,after('kill','john,peter,dr\' Doolitle(jr)')]

операнды:silicone,hydrogen,stop
опции:after,destroy
Выход:
object(stdClass)#1 (2) {
["tag"]=>
string(4) "stop"
["functions"]=>
array(2) {
[0]=>
array(2) {
["name"]=>
string(7) "destroy"
["parameters"]=>
array(0) {
}
}
[1]=>
array(2) {
["name"]=>
string(5) "after"
["parameters"]=>
array(2) {
[0]=>
string(4) "kill"
[1]=>
string(2) "john,peter,dr' Doolitle(jr)"
}
}
}
}


У функций может быть л
Eval итп не использовать.

Параметры должны обрамляться кавычками(кроме числовых - они могут быть без кавычек) например after(5)
В случае любых ошибок в выражнении(например:)

[stop*destroy,after('kill,'me'));
или
[stop*destroy,after('kill',)];

или если опции\операнда нет в списке доступных опций

должна возвращаться ошибка с соответствующим текстом
(ошибка в разборе выражения, ошибка - несуществующий операнд, ошибка - несуществующая опция).