Skip to content

Commit 4b438fb

Browse files
committed
Perlito5 - grammar - the "format" statement
1 parent 8064a20 commit 4b438fb

File tree

4 files changed

+190
-6
lines changed

4 files changed

+190
-6
lines changed

html/perlito5.js

Lines changed: 80 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2784,6 +2784,9 @@ var p5100 = p5pkg['main'];
27842784
}], null);
27852785
p5pkg["Perlito5::Grammar::Statement"].add_statement(['package', function (List__, p5want) {
27862786
return (p5call(p5pkg["Perlito5::Grammar::Statement"], "stmt_package", p5list_to_a(List__.p5aget(0), List__.p5aget(1)), p5want));
2787+
}], null);
2788+
p5pkg["Perlito5::Grammar::Statement"].add_statement(['format', function (List__, p5want) {
2789+
return (p5call(p5pkg["Perlito5::Grammar::Statement"], "stmt_format", p5list_to_a(List__.p5aget(0), List__.p5aget(1)), p5want));
27872790
}], null);
27882791
p5typeglob_set("Perlito5::Grammar::Statement", "stmt_yadayada", function (List__, p5want) {
27892792
var v_grammar;
@@ -2802,6 +2805,78 @@ var p5100 = p5pkg['main'];
28022805
})()], 0) })], 0)], 0));
28032806
return (( p5bool(v_tmp) ? v_MATCH : 0));
28042807
});
2808+
p5typeglob_set("Perlito5::Grammar::Statement", "stmt_format", function (List__, p5want) {
2809+
var v_grammar;
2810+
v_grammar = (List__.p5aget(0));
2811+
var v_str;
2812+
v_str = (List__.p5aget(1));
2813+
var v_pos;
2814+
v_pos = (List__.p5aget(2));
2815+
var v_MATCH;
2816+
v_MATCH = ((new p5HashRef({'str' : v_str, 'from' : v_pos, 'to' : v_pos})));
2817+
var v_tmp;
2818+
v_tmp = (p5context([p5context([p5and(p5and(p5and(p5and(p5and(p5and(p5context([p5and(('format' == p5pkg["Perlito5::Grammar::Statement"].substr([v_str, (v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to'), 6], 0)), function () { return p5context([(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', ((6 + p5num((v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to')))))], 0) })], 0), function () { return p5context([(function () {
2819+
var v_m2;
2820+
v_m2 = (p5call(p5pkg["Perlito5::Grammar::Space"], "ws", p5list_to_a(v_str, (v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to')), 0));
2821+
if ( p5bool(v_m2) ) {
2822+
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', ((v_m2 || (v_m2 = new p5HashRef({})))._hash_.p5hget('to')));
2823+
return (p5context([1], p5want));
2824+
}
2825+
else {
2826+
return (p5context([0], p5want));
2827+
}
2828+
})()], 0) }), function () { return p5context([(function () {
2829+
var v_pos1;
2830+
v_pos1 = ((v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to'));
2831+
return (p5or(p5context([(function () {
2832+
var v_m2;
2833+
v_m2 = (p5call(p5pkg["Perlito5::Grammar"], "full_ident", p5list_to_a(v_str, (v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to')), 0));
2834+
if ( p5bool(v_m2) ) {
2835+
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', ((v_m2 || (v_m2 = new p5HashRef({})))._hash_.p5hget('to')));
2836+
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('Perlito5::Grammar.full_ident', (v_m2));
2837+
return (p5context([1], p5want));
2838+
}
2839+
else {
2840+
return (p5context([0], p5want));
2841+
}
2842+
})()], 0), function () { return p5context([(function () {
2843+
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', (v_pos1));
2844+
return (p5context([(function () {
2845+
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('str', (v_str));
2846+
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('Perlito5::Grammar.full_ident', ('STDOUT'));
2847+
return (p5context([1], p5want));
2848+
})()], p5want));
2849+
})()], p5want) }));
2850+
})()], 0) }), function () { return p5context([(function () {
2851+
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('str', (v_str));
2852+
var v_placeholder;
2853+
v_placeholder = (p5call(p5pkg["Perlito5::AST::Apply"], "new", p5list_to_a('code', 'list:<.>', 'namespace', '', 'arguments', (new p5ArrayRef(p5list_to_a(p5call(p5pkg["Perlito5::AST::Apply"], "new", p5list_to_a('code', 'list:<.>', 'namespace', '', 'arguments', (new p5ArrayRef([]))), 1))))), 0));
2854+
p5global_array("Perlito5::Grammar::String", "Here_doc").p5push(p5list_to_a((new p5ArrayRef(p5list_to_a('single_quote', (v_placeholder || (v_placeholder = new p5HashRef({})))._hash_.p5hget_array('arguments')._array_.p5aget_hash(0)._hash_.p5hget('arguments'), '.')))));
2855+
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('capture', (p5call(p5pkg["Perlito5::AST::Decl"], "new", p5list_to_a('decl', 'FORMAT', 'type', null, 'var', p5call(p5pkg["Perlito5::AST::Var"], "new", p5list_to_a('name', p5pkg["Perlito5::Match"].flat(p5list_to_a((v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('Perlito5::Grammar.full_ident')), 1), 'namespace', '', 'sigil', 'FORMAT', 'value', v_placeholder), 1)), 0)));
2856+
return (p5context([1], p5want));
2857+
})()], 0) }), function () { return p5context([(function () {
2858+
var v_m2;
2859+
v_m2 = (p5call(p5pkg["Perlito5::Grammar::Space"], "opt_ws", p5list_to_a(v_str, (v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to')), 0));
2860+
if ( p5bool(v_m2) ) {
2861+
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', ((v_m2 || (v_m2 = new p5HashRef({})))._hash_.p5hget('to')));
2862+
return (p5context([1], p5want));
2863+
}
2864+
else {
2865+
return (p5context([0], p5want));
2866+
}
2867+
})()], 0) }), function () { return p5context([p5and(('=' == p5pkg["Perlito5::Grammar::Statement"].substr([v_str, (v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to'), 1], 0)), function () { return p5context([(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', ((1 + p5num((v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to')))))], 0) })], 0) }), function () { return p5context([(function () {
2868+
var v_m2;
2869+
v_m2 = (p5call(p5pkg["Perlito5::Grammar::Space"], "ws", p5list_to_a(v_str, (v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to')), 0));
2870+
if ( p5bool(v_m2) ) {
2871+
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', ((v_m2 || (v_m2 = new p5HashRef({})))._hash_.p5hget('to')));
2872+
return (p5context([1], p5want));
2873+
}
2874+
else {
2875+
return (p5context([0], p5want));
2876+
}
2877+
})()], 0) })], 0)], 0));
2878+
return (( p5bool(v_tmp) ? v_MATCH : 0));
2879+
});
28052880
p5typeglob_set("Perlito5::Grammar::Statement", "stmt_package", function (List__, p5want) {
28062881
var v_grammar;
28072882
v_grammar = (List__.p5aget(0));
@@ -6489,7 +6564,8 @@ return (p5call(p5pkg["Perlito5::AST::Val::Buf"], "new", ['buf', p5pkg["Perlito5:
64896564
};
64906565
return ((new p5HashRef({'str' : v_str, 'from' : v_pos, 'to' : v_p, 'capture' : v_ast})));
64916566
});
6492-
var List_Here_doc= [];
6567+
if (typeof p5pkg["Perlito5::Grammar::String"]["List_Here_doc"] == "undefined" ) { p5pkg["Perlito5::Grammar::String"]["List_Here_doc"]= [];};
6568+
p5pkg["Perlito5::Grammar::String"]["List_Here_doc"];
64936569
p5typeglob_set("Perlito5::Grammar::String", "here_doc_wanted", function (List__, p5want) {
64946570
try {
64956571
var v_self;
@@ -6544,7 +6620,7 @@ return (p5call(p5pkg["Perlito5::AST::Val::Buf"], "new", ['buf', p5pkg["Perlito5:
65446620
};
65456621
var v_placeholder;
65466622
v_placeholder = (p5call(p5pkg["Perlito5::AST::Apply"], "new", p5list_to_a('code', 'list:<.>', 'namespace', '', 'arguments', (new p5ArrayRef(p5list_to_a(p5call(p5pkg["Perlito5::AST::Apply"], "new", p5list_to_a('code', 'list:<.>', 'namespace', '', 'arguments', (new p5ArrayRef([]))), 1))))), 0));
6547-
List_Here_doc.p5push(p5list_to_a((new p5ArrayRef(p5list_to_a(v_type, (v_placeholder || (v_placeholder = new p5HashRef({})))._hash_.p5hget_array('arguments')._array_.p5aget_hash(0)._hash_.p5hget('arguments'), v_delimiter)))));
6623+
p5pkg["Perlito5::Grammar::String"]["List_Here_doc"].p5push(p5list_to_a((new p5ArrayRef(p5list_to_a(v_type, (v_placeholder || (v_placeholder = new p5HashRef({})))._hash_.p5hget_array('arguments')._array_.p5aget_hash(0)._hash_.p5hget('arguments'), v_delimiter)))));
65486624
return ((new p5HashRef(p5a_to_h(p5list_to_a('str', v_str, 'from', v_pos, 'to', v_p, 'capture', (new p5ArrayRef(['term', v_placeholder])))))));
65496625
}
65506626
catch(err) {
@@ -6600,13 +6676,13 @@ return (p5call(p5pkg["Perlito5::AST::Val::Buf"], "new", ['buf', p5pkg["Perlito5:
66006676
v_str = (List__.p5aget(1));
66016677
var v_pos;
66026678
v_pos = (List__.p5aget(2));
6603-
if ( !( p5bool(List_Here_doc.length)) ) {
6679+
if ( !( p5bool(p5pkg["Perlito5::Grammar::String"]["List_Here_doc"].length)) ) {
66046680
throw((new p5HashRef({'str' : v_str, 'from' : v_pos, 'to' : v_pos})));
66056681
};
66066682
var v_p;
66076683
v_p = (v_pos);
66086684
var v_here;
6609-
v_here = (List_Here_doc.shift());
6685+
v_here = (p5pkg["Perlito5::Grammar::String"]["List_Here_doc"].shift());
66106686
var v_type;
66116687
v_type = ((v_here || (v_here = new p5ArrayRef([])))._array_.p5aget(0));
66126688
var v_result;

perlito5.pl

Lines changed: 65 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -946,6 +946,9 @@ sub Perlito5::Grammar::Statement::add_statement {
946946
Perlito5::Grammar::Statement::add_statement('package', sub {
947947
Perlito5::Grammar::Statement->stmt_package($_[0], $_[1])
948948
});
949+
Perlito5::Grammar::Statement::add_statement('format', sub {
950+
Perlito5::Grammar::Statement->stmt_format($_[0], $_[1])
951+
});
949952
sub Perlito5::Grammar::Statement::stmt_yadayada {
950953
my $grammar = $_[0];
951954
my $str = $_[1];
@@ -958,6 +961,67 @@ sub Perlito5::Grammar::Statement::stmt_yadayada {
958961
})))));
959962
($tmp ? $MATCH : 0)
960963
};
964+
sub Perlito5::Grammar::Statement::stmt_format {
965+
my $grammar = $_[0];
966+
my $str = $_[1];
967+
my $pos = $_[2];
968+
my $MATCH = {'str', $str, 'from', $pos, 'to', $pos};
969+
my $tmp = ((((((((((('format' eq substr($str, $MATCH->{'to'}, 6)) && ($MATCH->{'to'} = (6 + $MATCH->{'to'})))) && ((do {
970+
my $m2 = Perlito5::Grammar::Space->ws($str, $MATCH->{'to'});
971+
if ($m2) {
972+
$MATCH->{'to'} = $m2->{'to'};
973+
1
974+
}
975+
else {
976+
0
977+
}
978+
}))) && ((do {
979+
my $pos1 = $MATCH->{'to'};
980+
(((do {
981+
my $m2 = Perlito5::Grammar->full_ident($str, $MATCH->{'to'});
982+
if ($m2) {
983+
$MATCH->{'to'} = $m2->{'to'};
984+
$MATCH->{'Perlito5::Grammar.full_ident'} = $m2;
985+
1
986+
}
987+
else {
988+
0
989+
}
990+
})) || ((do {
991+
$MATCH->{'to'} = $pos1;
992+
((do {
993+
$MATCH->{'str'} = $str;
994+
$MATCH->{'Perlito5::Grammar.full_ident'} = 'STDOUT';
995+
1
996+
}))
997+
})))
998+
}))) && ((do {
999+
$MATCH->{'str'} = $str;
1000+
my $placeholder = Perlito5::AST::Apply->new('code', 'list:<.>', 'namespace', '', 'arguments', [Perlito5::AST::Apply->new('code', 'list:<.>', 'namespace', '', 'arguments', [])]);
1001+
push(@Perlito5::Grammar::String::Here_doc, ['single_quote', $placeholder->{'arguments'}->[0]->{'arguments'}, '.']);
1002+
$MATCH->{'capture'} = Perlito5::AST::Decl->new('decl', 'FORMAT', 'type', undef(), 'var', Perlito5::AST::Var->new('name', Perlito5::Match::flat($MATCH->{'Perlito5::Grammar.full_ident'}), 'namespace', '', 'sigil', 'FORMAT', 'value', $placeholder));
1003+
1
1004+
}))) && ((do {
1005+
my $m2 = Perlito5::Grammar::Space->opt_ws($str, $MATCH->{'to'});
1006+
if ($m2) {
1007+
$MATCH->{'to'} = $m2->{'to'};
1008+
1
1009+
}
1010+
else {
1011+
0
1012+
}
1013+
}))) && ((('=' eq substr($str, $MATCH->{'to'}, 1)) && ($MATCH->{'to'} = (1 + $MATCH->{'to'}))))) && ((do {
1014+
my $m2 = Perlito5::Grammar::Space->ws($str, $MATCH->{'to'});
1015+
if ($m2) {
1016+
$MATCH->{'to'} = $m2->{'to'};
1017+
1
1018+
}
1019+
else {
1020+
0
1021+
}
1022+
})))));
1023+
($tmp ? $MATCH : 0)
1024+
};
9611025
sub Perlito5::Grammar::Statement::stmt_package {
9621026
my $grammar = $_[0];
9631027
my $str = $_[1];
@@ -4626,7 +4690,7 @@ sub Perlito5::Grammar::String::string_interpolation_parse {
46264690
};
46274691
return {'str', $str, 'from', $pos, 'to', $p, 'capture', $ast}
46284692
};
4629-
my @Here_doc;
4693+
our @Here_doc;
46304694
sub Perlito5::Grammar::String::here_doc_wanted {
46314695
my $self = $_[0];
46324696
my $str = $_[1];

src5/lib/Perlito5/Grammar/Statement.pm

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,11 +16,55 @@ sub add_statement {
1616
# --- TODO - move this to its own module
1717
Perlito5::Grammar::Statement::add_statement( '...' => sub { Perlito5::Grammar::Statement->stmt_yadayada( $_[0], $_[1] ) } );
1818
Perlito5::Grammar::Statement::add_statement( 'package' => sub { Perlito5::Grammar::Statement->stmt_package( $_[0], $_[1] ) } );
19+
Perlito5::Grammar::Statement::add_statement( 'format' => sub { Perlito5::Grammar::Statement->stmt_format( $_[0], $_[1] ) } );
1920

2021
token stmt_yadayada {
2122
'...' { die "Unimplemented" }
2223
};
2324

25+
token stmt_format {
26+
'format' <.Perlito5::Grammar::Space.ws>
27+
[ <Perlito5::Grammar.full_ident>
28+
| { $MATCH->{'Perlito5::Grammar.full_ident'} = 'STDOUT' }
29+
]
30+
{
31+
# inject a here-doc request
32+
# see Perlito5::Grammar::String
33+
my $placeholder = Perlito5::AST::Apply->new(
34+
code => 'list:<.>',
35+
namespace => '',
36+
arguments => [
37+
# XXX - this comment was originally on Perlito5::Grammar::String
38+
# XXX - test 12 t/base/lex.t fails if we don't use this "double-pointer" '
39+
Perlito5::AST::Apply->new(
40+
code => 'list:<.>',
41+
namespace => '',
42+
arguments => []
43+
)
44+
]
45+
);
46+
push @Perlito5::Grammar::String::Here_doc, [
47+
'single_quote',
48+
$placeholder->{arguments}[0]{arguments},
49+
'.', # delimiter
50+
];
51+
$MATCH->{capture} =
52+
Perlito5::AST::Decl->new(
53+
decl => 'FORMAT',
54+
type => undef,
55+
var => Perlito5::AST::Var->new(
56+
name => Perlito5::Match::flat($MATCH->{'Perlito5::Grammar.full_ident'}),
57+
namespace => '', # TODO - split namespace/name
58+
sigil => 'FORMAT', # ???
59+
value => $placeholder # TODO - use proper assignment with infix:<=>
60+
),
61+
);
62+
}
63+
<.Perlito5::Grammar::Space.opt_ws>
64+
'='
65+
<.Perlito5::Grammar::Space.ws> # this will read the 'here-doc' we are expecting
66+
};
67+
2468
token stmt_package {
2569
'package' <.Perlito5::Grammar::Space.ws> <Perlito5::Grammar.full_ident>
2670
[

src5/lib/Perlito5/Grammar/String.pm

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -444,7 +444,7 @@ sub string_interpolation_parse {
444444
}
445445

446446

447-
my @Here_doc;
447+
our @Here_doc;
448448
sub here_doc_wanted {
449449
# setup a here-doc request
450450
# the actual text will be parsed later, by here_doc()

0 commit comments

Comments
 (0)