parser

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

 

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

Ответ

Misha v.3 05.03.2004 21:59

Пример 1:

auto.p:
@my_method[]
код метода
index.html:
^if($my_method is "junction"){
  ^my_method[]
}
Пример 2 (более сложный, но его я активно использую):
есть парсерный код в файле, который иногда хочется отпроцессить:
@main[]
# в этом хеше мы будем хранить ссылки на junctions.
$processes[^hash::create[]]
...

# затем в него каким-то образом попадают записи о внешних файлах, которые нам придется выполнять
...

# ну а когда надо выполнять зовем свой метод
# при этом файл с диска будет загружен только один раз, и 
# отпроцессен один раз, при повторном вызове будет обращение 
# к уже созданному методу (junction)
^for[i](1;100){
  ^my_process[5]
}


@my_process[id]
^if(!$processes.[$id].process_body_loaded){
	^rem{ *** еще не грузили данный код (соответственно не процессили) *** }
	$pname[process_${id}_main]
	^try{
		$pf[^file::load[text;каталог/$processes.[$id].process]]
		$process_body[^taint[as-is][^trim[$pf.text]]]
		^if(^process_body.pos[@main^[^]] >= 0){
			^rem{ *** если в нем есть буковки @main[] - меняем их *** }
			$process_body[^process_body.match[\@main\^[\^]][g]{@${pname}^[^]}]
		}{
			^rem{ *** а если их нету, и в файле что-то есть - приделываем их в самое начало *** }
			^if(def $process_body){
				$process_body[@${pname}^[^] ^#0A$process_body]
			}
		}
	}{
		^rem{ *** какой-то облом, ну и фиг с ним. бум считать, что кода нету *** }
		$exception.handled(1)
		$process_body[]
	}
	^rem{ *** вот теперь можно процессить код и создавать метод *** }
	^process[$caller.self]{$process_body}
	^rem{ *** запоминаем, что мы его уже отпроцессили, и нам не надо его больше будет пытаться грузить и компилить *** }
	^processes.[$id].add[
		$.process_body_loaded(1)
		$.main[$$pname]
	]
}
^if($processes.[$id].main is "junction"){
	^rem{ *** если метод есть - выполняем его *** }
	$result[^trim[^processes.[$id].main[]]]
}{
	$result[]
}