[minor] allows underscores in variable names
[refactor] Vastly improves callbacks and error handling in preprocessor