sub signatures: use parser rather than lexer
authorDavid Mitchell <davem@iabyn.com>
Thu, 28 Jan 2016 15:14:57 +0000 (15:14 +0000)
committerDavid Mitchell <davem@iabyn.com>
Wed, 3 Aug 2016 19:54:40 +0000 (20:54 +0100)
commitd3d9da4a748f12980e8b04fe471398bf91237705
tree0ad8bbe844a4d0c4de002a3481f2b1d6cb167ee6
parentd64e121b07bda895f7f3a5d0e449fc948986e2f1
sub signatures: use parser rather than lexer

Currently the signature of a sub (i.e. the '($a, $b = 1)' bit) is parsed
in toke.c using a roll-your-own mini-parser. This commit makes
the signature be part of the general grammar in perly.y instead.

In theory it should still generate the same optree as before, except
that an OP_STUB is no longer appended to each signature optree: it's
unnecessary, and I assume that was a hangover from early development of
the original signature code.

Error messages have changed somewhat: the generic 'Parse error' has
changed to the generic 'syntax error', with the addition of ', near "xyz"'
now appended to each message.

Also, some specific error messages have been added; for example
(@a=1) now says that slurpy params can't have a default vale, rather than
just giving 'Parse error'.

It introduces a new lexer expect state, XSIGVAR, since otherwise when
the lexer saw something like '($, ...)' it would see the identifier
'$,' rather than the tokens '$' and ','.

Since it no longer uses parse_termexpr(), it is no longer subject to the
bug (#123010) associated with that; so sub f($x = print, $y) {}
is no longer mis-interpreted as sub f($x = print($_, $y)) {}
15 files changed:
embed.fnc
embed.h
op.c
parser.h
perl.h
perly.act
perly.c
perly.h
perly.tab
perly.y
pod/perldiag.pod
proto.h
sv.c
t/op/signatures.t
toke.c