parser: Add “success” boolean

+ Until now, whether a syntactic variable could be matched was decided
  based on whether the returned iterator differed from the one given to
  it. This made Epsilon matches impossible. Now, a pointer to a boolean
  is given to every matching function. Before a function returns, this
  boolean has to be set to false indicating failure or true indicating a
  successful match. In doing so, empty matches are now possible as
  required by the given syntax.

Signed-off-by: Max Reitz <xanclic@niwohlos.org>
parser: Fix error position

! maximum_extent is indeed the position of the error, not the one
  before.

Signed-off-by: Max Reitz <xanclic@niwohlos.org>
tokenizer: Fix keyword operators

! Test for operators before testing for identifiers in order to make
  sure "new" etc. is classified as an operator rather than an identifer
! Fix off-by-one error in detection whether keyword operators
  (consisting of identifier characters) are completed

Signed-off-by: Max Reitz <xanclic@niwohlos.org>
syntax: Make trailing-return-type mandatory

! According to the standard, it is non-optional here, therefore make it
  so.

Signed-off-by: Max Reitz <xanclic@niwohlos.org>
parser: Fix noptr-declarator

! noptr-declarator may end with an undefined number of
  parameters-or-qualifiers. However, in one rule for declarator,
  noptr-declarator is immediately followed by a mandatory
  parameters-or-qualifiers. A greedy parser breaks this, therefore, we
  require means of correction. Enter post-modify: Through this
  attribute it is possible to modify a match after it has been detected.
  Now we can check for a noptr-declarator match whether it is an
  immediate child of declarator and ends with parameters-or-qualifiers.
  If so, remove that and push it back into the unmatched token stream.

Signed-off-by: Max Reitz <xanclic@niwohlos.org>
parser: Fix incomplete loop matches

! If a loop iteration only results in a partial match, the child nodes
  added during that iteration have to be removed.

Signed-off-by: Max Reitz <xanclic@niwohlos.org>
parser: Fix right shift expressions

! Until now, right shift expression operators are matched as ">" ">" and
  ">" ">=", respectively. This is necessary in order to match the right
  angles of declarations involving nested templates correctly, however,
  we should contract those cases to ">>" and ">>=" after the parsing is
  done. Do it.

Signed-off-by: Max Reitz <xanclic@niwohlos.org>
specs: Add parserspec::ex3

+ This test involves trailing return types, decltype and shift
  expressions.

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