diff --git a/html/perlito5.js b/html/perlito5.js
index 5a8f9eadb..8bde470eb 100644
--- a/html/perlito5.js
+++ b/html/perlito5.js
@@ -7830,6 +7830,10 @@ var p5100 = p5pkg['main'];
(Hash_hex = p5a_to_h(p5list_to_a(p5map(p5pkg["Perlito5::Grammar::String"], function (p5want) {
return ((p5context([p5pkg["Perlito5::Grammar::String"]["v__"], 1], p5want)));
}, ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F']))));
+ var Hash_octal = {};
+ (Hash_octal = p5a_to_h(p5list_to_a(p5map(p5pkg["Perlito5::Grammar::String"], function (p5want) {
+ return ((p5context([p5pkg["Perlito5::Grammar::String"]["v__"], 1], p5want)));
+ }, ['0', '1', '2', '3', '4', '5', '6', '7']))));
p5make_sub("Perlito5::Grammar::String", "q_quote_parse", function (List__, p5want) {
var v_self = null;
(v_self = (List__[p5idx(List__,0)]));
@@ -8557,7 +8561,24 @@ var p5100 = p5pkg['main'];
};
}
else {
- (v_m = ((new p5HashRef(p5a_to_h(p5list_to_a('str', v_str, 'from', v_pos, 'to', (p5num(v_pos) + 2), 'capture', p5call(p5pkg["Perlito5::AST::Val::Buf"], "new", ['buf', v_c2], 1)))))));
+ if ( (Hash_octal).hasOwnProperty(v_c2) ) {
+ (function () {
+ var v_p = null;
+ (v_p = ((p5num(v_pos) + 2)));
+ if ( p5bool(Hash_octal[p5pkg["Perlito5::Grammar::String"].substr([v_str, v_p, 1], p5want)]) ) {
+ (v_p)++;
+ };
+ if ( p5bool(Hash_octal[p5pkg["Perlito5::Grammar::String"].substr([v_str, v_p, 1], p5want)]) ) {
+ (v_p)++;
+ };
+ var v_tmp = null;
+ (v_tmp = (p5pkg["Perlito5::Grammar::String"].oct([p5pkg["Perlito5::Grammar::String"].substr([v_str, (p5num(v_pos) + 1), (p5num(v_p) - p5num(v_pos))], 0)], 0)));
+ (v_m = ((new p5HashRef(p5a_to_h(p5list_to_a('str', v_str, 'from', v_pos, 'to', v_p, 'capture', p5call(p5pkg["Perlito5::AST::Apply"], "new", p5list_to_a('arguments', (new p5ArrayRef(p5list_to_a(p5call(p5pkg["Perlito5::AST::Val::Int"], "new", ['int', v_tmp], 1)))), 'code', 'chr'), 1)))))));
+ })();
+ }
+ else {
+ (v_m = ((new p5HashRef(p5a_to_h(p5list_to_a('str', v_str, 'from', v_pos, 'to', (p5num(v_pos) + 2), 'capture', p5call(p5pkg["Perlito5::AST::Val::Buf"], "new", ['buf', v_c2], 1)))))));
+ };
};
};
};
diff --git a/lib5/Perlito5/AST.pm b/lib5/Perlito5/AST.pm
index 865cc4bc6..3e4577f01 100644
--- a/lib5/Perlito5/AST.pm
+++ b/lib5/Perlito5/AST.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
undef();
diff --git a/lib5/Perlito5/Dumper.pm b/lib5/Perlito5/Dumper.pm
index f9539b32e..d6d6bd1fa 100644
--- a/lib5/Perlito5/Dumper.pm
+++ b/lib5/Perlito5/Dumper.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
package Perlito5::Dumper;
diff --git a/lib5/Perlito5/Emitter/Token.pm b/lib5/Perlito5/Emitter/Token.pm
index be971a66f..382e2ed5c 100644
--- a/lib5/Perlito5/Emitter/Token.pm
+++ b/lib5/Perlito5/Emitter/Token.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
undef();
diff --git a/lib5/Perlito5/Eval.pm b/lib5/Perlito5/Eval.pm
index 6844abe87..67cf7fcb8 100644
--- a/lib5/Perlito5/Eval.pm
+++ b/lib5/Perlito5/Eval.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
undef();
diff --git a/lib5/Perlito5/Expression.pm b/lib5/Perlito5/Expression.pm
index 4d6b5211a..cd4f2fdeb 100644
--- a/lib5/Perlito5/Expression.pm
+++ b/lib5/Perlito5/Expression.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
package Perlito5::Expression;
diff --git a/lib5/Perlito5/Grammar.pm b/lib5/Perlito5/Grammar.pm
index 0e1db7e53..095ad8e27 100644
--- a/lib5/Perlito5/Grammar.pm
+++ b/lib5/Perlito5/Grammar.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
package Perlito5::Grammar;
diff --git a/lib5/Perlito5/Grammar/Bareword.pm b/lib5/Perlito5/Grammar/Bareword.pm
index c533b8fce..fa68ec216 100644
--- a/lib5/Perlito5/Grammar/Bareword.pm
+++ b/lib5/Perlito5/Grammar/Bareword.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
package Perlito5::Grammar::Bareword;
diff --git a/lib5/Perlito5/Grammar/Block.pm b/lib5/Perlito5/Grammar/Block.pm
index 7a5256004..06277a32a 100644
--- a/lib5/Perlito5/Grammar/Block.pm
+++ b/lib5/Perlito5/Grammar/Block.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
package Perlito5::Grammar::Block;
diff --git a/lib5/Perlito5/Grammar/Control.pm b/lib5/Perlito5/Grammar/Control.pm
index 4126568f3..964d11b7c 100644
--- a/lib5/Perlito5/Grammar/Control.pm
+++ b/lib5/Perlito5/Grammar/Control.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
package Perlito5::Grammar;
diff --git a/lib5/Perlito5/Grammar/Regex.pm b/lib5/Perlito5/Grammar/Regex.pm
index 32ecc1aae..09f75762d 100644
--- a/lib5/Perlito5/Grammar/Regex.pm
+++ b/lib5/Perlito5/Grammar/Regex.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
package Perlito5::Grammar::Regex;
diff --git a/lib5/Perlito5/Grammar/Space.pm b/lib5/Perlito5/Grammar/Space.pm
index ace0dbb7a..99d6f7659 100644
--- a/lib5/Perlito5/Grammar/Space.pm
+++ b/lib5/Perlito5/Grammar/Space.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
package Perlito5::Grammar::Space;
diff --git a/lib5/Perlito5/Grammar/String.pm b/lib5/Perlito5/Grammar/String.pm
index 3cd593313..1f487c482 100644
--- a/lib5/Perlito5/Grammar/String.pm
+++ b/lib5/Perlito5/Grammar/String.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
undef();
@@ -599,6 +599,7 @@ sub Perlito5::Grammar::String::term_qr_quote {
((my %pair) = ('{', '}', '(', ')', '[', ']', '<', '>'));
((my %escape_sequence) = ('a', '7', 'b', '8', 'e', '27', 'f', '12', 'n', '10', 'r', '13', 't', '9'));
((my %hex) = map(+(($_, 1)), ('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F')));
+((my %octal) = map(+(($_, 1)), ('0', '1', '2', '3', '4', '5', '6', '7')));
sub Perlito5::Grammar::String::q_quote_parse {
((my $self) = $_[0]);
((my $str) = $_[1]);
@@ -1117,7 +1118,20 @@ sub Perlito5::Grammar::String::double_quoted_unescape {
}
}
else {
- ($m = {'str', $str, 'from', $pos, 'to', ($pos + 2), 'capture', Perlito5::AST::Val::Buf->new('buf', $c2)})
+ if (exists($octal{$c2})) {
+ ((my $p) = ($pos + 2));
+ if ($octal{substr($str, $p, 1)}) {
+ ($p)++
+ };
+ if ($octal{substr($str, $p, 1)}) {
+ ($p)++
+ };
+ ((my $tmp) = oct(substr($str, ($pos + 1), ($p - $pos))));
+ ($m = {'str', $str, 'from', $pos, 'to', $p, 'capture', Perlito5::AST::Apply->new('arguments', [Perlito5::AST::Val::Int->new('int', $tmp)], 'code', 'chr')})
+ }
+ else {
+ ($m = {'str', $str, 'from', $pos, 'to', ($pos + 2), 'capture', Perlito5::AST::Val::Buf->new('buf', $c2)})
+ }
}
}
};
diff --git a/lib5/Perlito5/Grammar/Use.pm b/lib5/Perlito5/Grammar/Use.pm
index 50cb01753..f1e886954 100644
--- a/lib5/Perlito5/Grammar/Use.pm
+++ b/lib5/Perlito5/Grammar/Use.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
package Perlito5::Grammar::Use;
diff --git a/lib5/Perlito5/Javascript/CORE.pm b/lib5/Perlito5/Javascript/CORE.pm
index 60c8c00ec..3c198d16d 100644
--- a/lib5/Perlito5/Javascript/CORE.pm
+++ b/lib5/Perlito5/Javascript/CORE.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
undef();
diff --git a/lib5/Perlito5/Javascript/Emitter.pm b/lib5/Perlito5/Javascript/Emitter.pm
index 7ce3dc676..ffb6e09d0 100644
--- a/lib5/Perlito5/Javascript/Emitter.pm
+++ b/lib5/Perlito5/Javascript/Emitter.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
undef();
diff --git a/lib5/Perlito5/Javascript/IO.pm b/lib5/Perlito5/Javascript/IO.pm
index a99ed8d2c..19a855ee8 100644
--- a/lib5/Perlito5/Javascript/IO.pm
+++ b/lib5/Perlito5/Javascript/IO.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
undef();
diff --git a/lib5/Perlito5/Javascript/Runtime.pm b/lib5/Perlito5/Javascript/Runtime.pm
index 1b9214eb8..3060b5525 100644
--- a/lib5/Perlito5/Javascript/Runtime.pm
+++ b/lib5/Perlito5/Javascript/Runtime.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
undef();
diff --git a/lib5/Perlito5/Macro.pm b/lib5/Perlito5/Macro.pm
index 35c3dcc32..d9f5b40b0 100644
--- a/lib5/Perlito5/Macro.pm
+++ b/lib5/Perlito5/Macro.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
undef();
diff --git a/lib5/Perlito5/Match.pm b/lib5/Perlito5/Match.pm
index b50e6e9f8..35752dc61 100644
--- a/lib5/Perlito5/Match.pm
+++ b/lib5/Perlito5/Match.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
undef();
diff --git a/lib5/Perlito5/Perl5/Emitter.pm b/lib5/Perlito5/Perl5/Emitter.pm
index 932bd358d..c57864c53 100644
--- a/lib5/Perlito5/Perl5/Emitter.pm
+++ b/lib5/Perlito5/Perl5/Emitter.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
undef();
diff --git a/lib5/Perlito5/Perl6/Emitter.pm b/lib5/Perlito5/Perl6/Emitter.pm
index f44a30d25..402073150 100644
--- a/lib5/Perlito5/Perl6/Emitter.pm
+++ b/lib5/Perlito5/Perl6/Emitter.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
undef();
diff --git a/lib5/Perlito5/Precedence.pm b/lib5/Perlito5/Precedence.pm
index 18a717e75..892a7dd41 100644
--- a/lib5/Perlito5/Precedence.pm
+++ b/lib5/Perlito5/Precedence.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
package Perlito5::Precedence;
diff --git a/lib5/Perlito5/Runtime.pm b/lib5/Perlito5/Runtime.pm
index 34d26a4c6..b2e2b04f8 100644
--- a/lib5/Perlito5/Runtime.pm
+++ b/lib5/Perlito5/Runtime.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
package Perlito5::Runtime;
diff --git a/lib5/Perlito5/Test.pm b/lib5/Perlito5/Test.pm
index 9dcafbe62..c7ca2d372 100644
--- a/lib5/Perlito5/Test.pm
+++ b/lib5/Perlito5/Test.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
package Perlito5::Test;
diff --git a/lib5/Perlito5/bytes.pm b/lib5/Perlito5/bytes.pm
index ffc9538c6..cdd4809b4 100644
--- a/lib5/Perlito5/bytes.pm
+++ b/lib5/Perlito5/bytes.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
package Perlito5::bytes;
diff --git a/lib5/Perlito5/strict.pm b/lib5/Perlito5/strict.pm
index fe8c098a0..098a768a6 100644
--- a/lib5/Perlito5/strict.pm
+++ b/lib5/Perlito5/strict.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
package Perlito5::strict;
diff --git a/lib5/Perlito5/utf8.pm b/lib5/Perlito5/utf8.pm
index 425f847d3..899edf75c 100644
--- a/lib5/Perlito5/utf8.pm
+++ b/lib5/Perlito5/utf8.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
package Perlito5::utf8;
diff --git a/lib5/Perlito5/warnings.pm b/lib5/Perlito5/warnings.pm
index c0733be7b..d2f57f187 100644
--- a/lib5/Perlito5/warnings.pm
+++ b/lib5/Perlito5/warnings.pm
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
package Perlito5::warnings;
diff --git a/perlito5.pl b/perlito5.pl
index 0404a9c39..cb9a6c36f 100644
--- a/perlito5.pl
+++ b/perlito5.pl
@@ -1,5 +1,5 @@
# Do not edit this file - Generated by Perlito5 9.0
-use v5;
+use v5.10;
use Perlito5::Perl5::Runtime;
package main;
undef();
diff --git a/src5/lib/Perlito5/Grammar/String.pm b/src5/lib/Perlito5/Grammar/String.pm
index d5ac140a8..1e16ae261 100644
--- a/src5/lib/Perlito5/Grammar/String.pm
+++ b/src5/lib/Perlito5/Grammar/String.pm
@@ -91,7 +91,8 @@ my %pair = (
my %escape_sequence = qw/ a 7 b 8 e 27 f 12 n 10 r 13 t 9 /;
-my %hex = map +($_ => 1), qw/ 0 1 2 3 4 5 6 7 8 9 A B C D E F /;
+my %hex = map +($_ => 1), qw/ 0 1 2 3 4 5 6 7 8 9 A B C D E F /;
+my %octal = map +($_ => 1), qw/ 0 1 2 3 4 5 6 7 /;
sub q_quote_parse {
my $self = $_[0];
@@ -671,25 +672,29 @@ sub double_quoted_unescape {
};
}
}
+ elsif ( exists $octal{$c2} ) {
+ # "\"+octal - initial zero is optional; max 3 digit octal (377)
+ my $p = $pos+2;
+ $p++ if $octal{ substr($str, $p, 1) };
+ $p++ if $octal{ substr($str, $p, 1) };
+ my $tmp = oct( substr($str, $pos+1, $p - $pos) );
+ $m = {
+ str => $str,
+ from => $pos,
+ to => $p,
+ capture => Perlito5::AST::Apply->new(
+ 'arguments' => [
+ Perlito5::AST::Val::Int->new( 'int' => $tmp ),
+ ],
+ 'code' => 'chr',
+ )
+ };
+ }
else {
- # TODO - "\"+octal - initial zero is optional; max 3 digit octal (377)
# TODO - \N{charname} - requires "use charnames"
# TODO - \L \Q \U ... \E - lowercase/uppercase/quote until /E
# TODO - \l \u - uppercase next char
- ## [ \[ \]
- ## { $MATCH->{capture} = chr( Perlito5::Match::flat($MATCH->{"Perlito5::Grammar.digits"}) ) }
- ## |
- ## { $MATCH->{capture} = chr( Perlito5::Match::flat($MATCH->{"Perlito5::Grammar.digits"}) ) }
- ## ]
-
- ## my %double_quoted_unescape = (
- ## '0' => \&unescape_octal,
- ## 'x' => \&unescape_hex,
- ## 'c' => \&unescape_ctrl,
- ## 'N' => \&unescape_charname,
- ## );
-
$m = {
'str' => $str,
'from' => $pos,