I'm inclined to think we should either make techniques variables, or make them non-variables, rather than doing both.
(Also, creating a variable but setting the type to "void" is probably going to result in some less-than-perfectly-clear error messages).
There are not really variables. There needs to be some way to have technique blocks at top level, then fxgroup block at top level, and techniques within groups. Next and final nesting level are passes that are contained in techniques. I don't see how this can nicely fit in the type system. That's why I used void.
Regarding skips, now I think that using lists here might be a better fit, so that I can do cleanup based on profile, before going further.
So, if not using variables, the only functionality needed here is to have something dummy in global scope that takes up the name, within groups, or within techniques you can't have variables, so it's easy to check names there against already added techniques/passes.
And yes, some splitting is necessary. I wanted some comments first to figure out general direction.