our ($ichunkstart, $ichunkend);
our ($before, $after);
-sub is_string ($) { $_[0]{T} =~ m/heredoc|string/; };
+sub is_string ($) { $_[0]{T} =~ m/heredoc|string/; }
+sub is_trans ($) { grep { $_[0]{E} eq $_ } qw(__ f_ i_); }
sub semiparse ($) {
($_) = @_;
Q => $q,
};
@o = (@o[0..$i-1], $new, @o[$i+3..$#o]);
- print STDERR Dumper(\@o);
}
debug $ichunkstart, "semiparsed: ".join ' ', map { $_->{P} } @o;
return @o;
if ($y->{E} eq '+'
and @ys >= 3
and $ys[0]{E} eq '('
- and ($ys[1]{E} eq '__' or $ys[2]{E} eq 'f_')) {
+ and is_trans($ys[1])) {
$next_y->(); # (
$next_y->(); # __ f_
@y_expect_suffix = ')';
}
my $string_changed;
my $ye = $y->{E};
- if ($ye eq '__' or $ye eq 'f_') {
+ if (is_trans($y)) {
$next_y->();
die "__ on non-string $y->{P}\n" unless is_string($y);
die "__ on was non-string $y->{P}\n" unless is_string($x);
die $string_changed if length $string_changed;
next;
}
+ if ($ye eq 'i_') {
+ die $string_changed if length $string_changed;
+ next;
+ }
if ($ye eq 'f_') {
my $fmt = $y->{V};
die "no percent in _f string\n" unless $fmt =~ m{\%};
my ($lit, $what) = @_;
my $xl = substr($xs, 0, length($lit));
if ($xl ne $lit) {
- debug $ichunkstart, "not exactly x: $xs";
- debug $ichunkstart, "not exactly y: $lit";
+ debug $ichunkstart, "not exactly x: ..\"$xs\"";
+ debug $ichunkstart, "not exactly y: $lit";
my $next = @ys ? $ys[0]{P} : '(end)';
die "string contents mismatch near $what before $next\n";
}
# lookahead shows close of containing scope
# or lower precedence operator
unshift @ys, $y;
+ pop @analysed_y;
last;
}
$xs =~ s{^\s+}{};