This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
Forbid braces as format delimiters
authorFather Chrysostomos <sprout@cpan.org>
Mon, 6 Aug 2012 05:24:09 +0000 (22:24 -0700)
committerFather Chrysostomos <sprout@cpan.org>
Mon, 6 Aug 2012 05:27:04 +0000 (22:27 -0700)
commit7c70caa5333de92b09e138154bed7f78f783be3b
tree139644b1427743e4e1bafba7b92ff99b9c7c5521
parentc77244152327e2223e55144a463094790d835933
Forbid braces as format delimiters

As long the argument line is not missing, braces can be used
for a format:

# valid
format foo {
@<<<
$a
}

but if the argument line is missing, you get a syntax error:

# invalid
format foo {
@<<<
}

and also if the name is missing:

# invalid
format {
@<<<
$a
}

If you use = then you can use a closing brace to terminate the format,
but only if the argument line is missing:

# valid, but useless
format =
@<<<
}

# invalid
format =
@<<<
$a
}

In commit 79072805 (perl 5.0 alpha 20), the lexer was changed to lie
to the parser about formats’ = and . delimiters, pretending they are
actually { and }, because the bracket-handling code takes care of all
the scoping issues (well, most of them).

Unfortunately, this implementation detail can leak through, but it is
far from consistent, as shown above.

Fixing this makes it easier to fix other bugs.

We do this by recording the fact that we are dealing with a format
token before jumping to the bracket code.  And we feed format-specific
tokens to the parser in that case, so it can’t get fake brackets and
real brackets mixed up.
perly.act
perly.h
perly.tab
perly.y
t/op/write.t
toke.c