Make keywords variable

* Keywords are now plain literals to the tokenizer
+ A variable list is managed in the parser
+ Make all the types etc. keywords, just as the standard requires it

Signed-off-by: Max Reitz <xanclic@niwohlos.org>
Add bounds check to handwritten tokenizer funcs

! As all tokenizing functions perform a bounds check against the end
  iterator, so should the handwritten ones.

Signed-off-by: Max Reitz <xanclic@niwohlos.org>
Add post-hook to syntax variable definitions

+ When using this, a function is invoked whenever a syntax variable
  could be completely matched (and is therefore likely to persist, if it
  is sufficiently complex).

Signed-off-by: Max Reitz <xanclic@niwohlos.org>
Report parsing mismatch errors

+ Add line and column information to the tokens
+ Track the maximum extent which could be matched
+ Emit that unless the whole translation unit could be matched (i.e.,
  parsed)

Signed-off-by: Max Reitz <xanclic@niwohlos.org>
Add functions for scope coverage

+ Add two functions which help when testing for scope compatibility

Signed-off-by: Max Reitz <xanclic@niwohlos.org>
Keep track of typedef-, class- and template-names

+ Make them keywords and add them to the appropriate lists on
  declaration
+ Implement the respective test functions (sv_class_name() etc.)
  accordingly

Signed-off-by: Max Reitz <xanclic@niwohlos.org>