added recursive preprocessor