`p` and `np` are frequently used through the source, in mot parsing functions (and actually, not only in Hercules, I have seen them in other projects as well).  I believe the origin of their name is '(string) Pointer' and 'New (string) Pointer'. I don't mind those names in a parser context, they're short and quick to write, and they're always used for the same behavior. Also, they're local variables, so if you ever have to search for them, the search scope wouldn't be broader than a function's scope. (by the way, you can match them with the word boundary tokens in a regex, something like `\bp\b` or `\<b\>` depending on the regex dialect your tools understand)

As for `w1` through `w4`, yes, I suppose they mean 'word'.

Other than this, yes, I agree that variables should have meaningful names when there isn't a specific convention such as this.