Leaving `__init__` to after parsing the rule would mean that the parse* functions couldn't be instance methods. I think that's OK, since they don't actually relate to a rule instance at all. I'd be inclined to declare `parseRule` as a top-level function, and the others as private functions within that.

It's probably worth re-testing the performance after changes like that.