Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Perlito5 - grammar - the "format" statement
  • Loading branch information
fglock committed Sep 16, 2013
1 parent 8064a20 commit 4b438fb
Show file tree
Hide file tree
Showing 4 changed files with 190 additions and 6 deletions.
84 changes: 80 additions & 4 deletions html/perlito5.js
Expand Up @@ -2784,6 +2784,9 @@ var p5100 = p5pkg['main'];
}], null);
p5pkg["Perlito5::Grammar::Statement"].add_statement(['package', function (List__, p5want) {
return (p5call(p5pkg["Perlito5::Grammar::Statement"], "stmt_package", p5list_to_a(List__.p5aget(0), List__.p5aget(1)), p5want));
}], null);
p5pkg["Perlito5::Grammar::Statement"].add_statement(['format', function (List__, p5want) {
return (p5call(p5pkg["Perlito5::Grammar::Statement"], "stmt_format", p5list_to_a(List__.p5aget(0), List__.p5aget(1)), p5want));
}], null);
p5typeglob_set("Perlito5::Grammar::Statement", "stmt_yadayada", function (List__, p5want) {
var v_grammar;
Expand All @@ -2802,6 +2805,78 @@ var p5100 = p5pkg['main'];
})()], 0) })], 0)], 0));
return (( p5bool(v_tmp) ? v_MATCH : 0));
});
p5typeglob_set("Perlito5::Grammar::Statement", "stmt_format", function (List__, p5want) {
var v_grammar;
v_grammar = (List__.p5aget(0));
var v_str;
v_str = (List__.p5aget(1));
var v_pos;
v_pos = (List__.p5aget(2));
var v_MATCH;
v_MATCH = ((new p5HashRef({'str' : v_str, 'from' : v_pos, 'to' : v_pos})));
var v_tmp;
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 () {
var v_m2;
v_m2 = (p5call(p5pkg["Perlito5::Grammar::Space"], "ws", p5list_to_a(v_str, (v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to')), 0));
if ( p5bool(v_m2) ) {
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', ((v_m2 || (v_m2 = new p5HashRef({})))._hash_.p5hget('to')));
return (p5context([1], p5want));
}
else {
return (p5context([0], p5want));
}
})()], 0) }), function () { return p5context([(function () {
var v_pos1;
v_pos1 = ((v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to'));
return (p5or(p5context([(function () {
var v_m2;
v_m2 = (p5call(p5pkg["Perlito5::Grammar"], "full_ident", p5list_to_a(v_str, (v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to')), 0));
if ( p5bool(v_m2) ) {
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', ((v_m2 || (v_m2 = new p5HashRef({})))._hash_.p5hget('to')));
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('Perlito5::Grammar.full_ident', (v_m2));
return (p5context([1], p5want));
}
else {
return (p5context([0], p5want));
}
})()], 0), function () { return p5context([(function () {
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', (v_pos1));
return (p5context([(function () {
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('str', (v_str));
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('Perlito5::Grammar.full_ident', ('STDOUT'));
return (p5context([1], p5want));
})()], p5want));
})()], p5want) }));
})()], 0) }), function () { return p5context([(function () {
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('str', (v_str));
var v_placeholder;
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));
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'), '.')))));
(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)));
return (p5context([1], p5want));
})()], 0) }), function () { return p5context([(function () {
var v_m2;
v_m2 = (p5call(p5pkg["Perlito5::Grammar::Space"], "opt_ws", p5list_to_a(v_str, (v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to')), 0));
if ( p5bool(v_m2) ) {
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', ((v_m2 || (v_m2 = new p5HashRef({})))._hash_.p5hget('to')));
return (p5context([1], p5want));
}
else {
return (p5context([0], p5want));
}
})()], 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 () {
var v_m2;
v_m2 = (p5call(p5pkg["Perlito5::Grammar::Space"], "ws", p5list_to_a(v_str, (v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to')), 0));
if ( p5bool(v_m2) ) {
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', ((v_m2 || (v_m2 = new p5HashRef({})))._hash_.p5hget('to')));
return (p5context([1], p5want));
}
else {
return (p5context([0], p5want));
}
})()], 0) })], 0)], 0));
return (( p5bool(v_tmp) ? v_MATCH : 0));
});
p5typeglob_set("Perlito5::Grammar::Statement", "stmt_package", function (List__, p5want) {
var v_grammar;
v_grammar = (List__.p5aget(0));
Expand Down Expand Up @@ -6489,7 +6564,8 @@ return (p5call(p5pkg["Perlito5::AST::Val::Buf"], "new", ['buf', p5pkg["Perlito5:
};
return ((new p5HashRef({'str' : v_str, 'from' : v_pos, 'to' : v_p, 'capture' : v_ast})));
});
var List_Here_doc= [];
if (typeof p5pkg["Perlito5::Grammar::String"]["List_Here_doc"] == "undefined" ) { p5pkg["Perlito5::Grammar::String"]["List_Here_doc"]= [];};
p5pkg["Perlito5::Grammar::String"]["List_Here_doc"];
p5typeglob_set("Perlito5::Grammar::String", "here_doc_wanted", function (List__, p5want) {
try {
var v_self;
Expand Down Expand Up @@ -6544,7 +6620,7 @@ return (p5call(p5pkg["Perlito5::AST::Val::Buf"], "new", ['buf', p5pkg["Perlito5:
};
var v_placeholder;
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));
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)))));
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)))));
return ((new p5HashRef(p5a_to_h(p5list_to_a('str', v_str, 'from', v_pos, 'to', v_p, 'capture', (new p5ArrayRef(['term', v_placeholder])))))));
}
catch(err) {
Expand Down Expand Up @@ -6600,13 +6676,13 @@ return (p5call(p5pkg["Perlito5::AST::Val::Buf"], "new", ['buf', p5pkg["Perlito5:
v_str = (List__.p5aget(1));
var v_pos;
v_pos = (List__.p5aget(2));
if ( !( p5bool(List_Here_doc.length)) ) {
if ( !( p5bool(p5pkg["Perlito5::Grammar::String"]["List_Here_doc"].length)) ) {
throw((new p5HashRef({'str' : v_str, 'from' : v_pos, 'to' : v_pos})));
};
var v_p;
v_p = (v_pos);
var v_here;
v_here = (List_Here_doc.shift());
v_here = (p5pkg["Perlito5::Grammar::String"]["List_Here_doc"].shift());
var v_type;
v_type = ((v_here || (v_here = new p5ArrayRef([])))._array_.p5aget(0));
var v_result;
Expand Down
66 changes: 65 additions & 1 deletion perlito5.pl
Expand Up @@ -946,6 +946,9 @@ sub Perlito5::Grammar::Statement::add_statement {
Perlito5::Grammar::Statement::add_statement('package', sub {
Perlito5::Grammar::Statement->stmt_package($_[0], $_[1])
});
Perlito5::Grammar::Statement::add_statement('format', sub {
Perlito5::Grammar::Statement->stmt_format($_[0], $_[1])
});
sub Perlito5::Grammar::Statement::stmt_yadayada {
my $grammar = $_[0];
my $str = $_[1];
Expand All @@ -958,6 +961,67 @@ sub Perlito5::Grammar::Statement::stmt_yadayada {
})))));
($tmp ? $MATCH : 0)
};
sub Perlito5::Grammar::Statement::stmt_format {
my $grammar = $_[0];
my $str = $_[1];
my $pos = $_[2];
my $MATCH = {'str', $str, 'from', $pos, 'to', $pos};
my $tmp = ((((((((((('format' eq substr($str, $MATCH->{'to'}, 6)) && ($MATCH->{'to'} = (6 + $MATCH->{'to'})))) && ((do {
my $m2 = Perlito5::Grammar::Space->ws($str, $MATCH->{'to'});
if ($m2) {
$MATCH->{'to'} = $m2->{'to'};
1
}
else {
0
}
}))) && ((do {
my $pos1 = $MATCH->{'to'};
(((do {
my $m2 = Perlito5::Grammar->full_ident($str, $MATCH->{'to'});
if ($m2) {
$MATCH->{'to'} = $m2->{'to'};
$MATCH->{'Perlito5::Grammar.full_ident'} = $m2;
1
}
else {
0
}
})) || ((do {
$MATCH->{'to'} = $pos1;
((do {
$MATCH->{'str'} = $str;
$MATCH->{'Perlito5::Grammar.full_ident'} = 'STDOUT';
1
}))
})))
}))) && ((do {
$MATCH->{'str'} = $str;
my $placeholder = Perlito5::AST::Apply->new('code', 'list:<.>', 'namespace', '', 'arguments', [Perlito5::AST::Apply->new('code', 'list:<.>', 'namespace', '', 'arguments', [])]);
push(@Perlito5::Grammar::String::Here_doc, ['single_quote', $placeholder->{'arguments'}->[0]->{'arguments'}, '.']);
$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));
1
}))) && ((do {
my $m2 = Perlito5::Grammar::Space->opt_ws($str, $MATCH->{'to'});
if ($m2) {
$MATCH->{'to'} = $m2->{'to'};
1
}
else {
0
}
}))) && ((('=' eq substr($str, $MATCH->{'to'}, 1)) && ($MATCH->{'to'} = (1 + $MATCH->{'to'}))))) && ((do {
my $m2 = Perlito5::Grammar::Space->ws($str, $MATCH->{'to'});
if ($m2) {
$MATCH->{'to'} = $m2->{'to'};
1
}
else {
0
}
})))));
($tmp ? $MATCH : 0)
};
sub Perlito5::Grammar::Statement::stmt_package {
my $grammar = $_[0];
my $str = $_[1];
Expand Down Expand Up @@ -4626,7 +4690,7 @@ sub Perlito5::Grammar::String::string_interpolation_parse {
};
return {'str', $str, 'from', $pos, 'to', $p, 'capture', $ast}
};
my @Here_doc;
our @Here_doc;
sub Perlito5::Grammar::String::here_doc_wanted {
my $self = $_[0];
my $str = $_[1];
Expand Down
44 changes: 44 additions & 0 deletions src5/lib/Perlito5/Grammar/Statement.pm
Expand Up @@ -16,11 +16,55 @@ sub add_statement {
# --- TODO - move this to its own module
Perlito5::Grammar::Statement::add_statement( '...' => sub { Perlito5::Grammar::Statement->stmt_yadayada( $_[0], $_[1] ) } );
Perlito5::Grammar::Statement::add_statement( 'package' => sub { Perlito5::Grammar::Statement->stmt_package( $_[0], $_[1] ) } );
Perlito5::Grammar::Statement::add_statement( 'format' => sub { Perlito5::Grammar::Statement->stmt_format( $_[0], $_[1] ) } );

token stmt_yadayada {
'...' { die "Unimplemented" }
};

token stmt_format {
'format' <.Perlito5::Grammar::Space.ws>
[ <Perlito5::Grammar.full_ident>
| { $MATCH->{'Perlito5::Grammar.full_ident'} = 'STDOUT' }
]
{
# inject a here-doc request
# see Perlito5::Grammar::String
my $placeholder = Perlito5::AST::Apply->new(
code => 'list:<.>',
namespace => '',
arguments => [
# XXX - this comment was originally on Perlito5::Grammar::String
# XXX - test 12 t/base/lex.t fails if we don't use this "double-pointer" '
Perlito5::AST::Apply->new(
code => 'list:<.>',
namespace => '',
arguments => []
)
]
);
push @Perlito5::Grammar::String::Here_doc, [
'single_quote',
$placeholder->{arguments}[0]{arguments},
'.', # delimiter
];
$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 => '', # TODO - split namespace/name
sigil => 'FORMAT', # ???
value => $placeholder # TODO - use proper assignment with infix:<=>
),
);
}
<.Perlito5::Grammar::Space.opt_ws>
'='
<.Perlito5::Grammar::Space.ws> # this will read the 'here-doc' we are expecting
};

token stmt_package {
'package' <.Perlito5::Grammar::Space.ws> <Perlito5::Grammar.full_ident>
[
Expand Down
2 changes: 1 addition & 1 deletion src5/lib/Perlito5/Grammar/String.pm
Expand Up @@ -444,7 +444,7 @@ sub string_interpolation_parse {
}


my @Here_doc;
our @Here_doc;
sub here_doc_wanted {
# setup a here-doc request
# the actual text will be parsed later, by here_doc()
Expand Down

0 comments on commit 4b438fb

Please sign in to comment.