parser

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

 

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

где тут магия? это-же решение "в лоб"

Misha v.3 02.05.2014 01:55 / 02.05.2014 06:46

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

чуть необычно нахожу корневой ключ: он будет в prematch, т.е. делать отдельный поиск его с помошью шаблона или pos+left не осень нужно. хотя возможно используемый мой метод чуть более ресурсоёмкий/медленный, т.к. делается поиск этого prematch.

"микрооптимизация":
@parseData[field;value][result;match;t;h;i]
$t[^field.match[\^[([^^\^]]+)\^]][g']]
^if($t){
	$h[^create[$self.data;$t.prematch]]
	^for[i](1;$t-1){
		$h[^create[$h;$t.1]]
		^t.offset[cur](1)
	}
	$h.[$t.1][$value]
}{
	$self.data.[$field][$value]
}

@create[h;k][result]
^if(!$h.$k){$h.[$k][^hash::create[]]}
$h.$k
её смысл в том, чтобы в цикле два call-а (if, line) заменить на один (offset) без существенного ухудшения читаемости кода. call -- одна из самых дорогих операций в парсере. однако в данном случае это всё несущественно, т.к. длинных циклов тут не будет и количество обрабатываемых field небольшое.

P.S. в исходном коде есть небольшая ошибка: не задекларирована среди локальных переменных переменная с именем match. надо добавить её туда.