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,