Skip to content

Commit 28f05f9

Browse files
committed
Perlito5 - grammar - lexical subs
1 parent add49ad commit 28f05f9

File tree

3 files changed

+104
-31
lines changed

3 files changed

+104
-31
lines changed

html/perlito5.js

Lines changed: 59 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -3835,16 +3835,17 @@ var p5100 = p5pkg['main'];
38353835
return (( p5bool(v_tmp) ? v_MATCH : 0));
38363836
});
38373837
p5typeglob_set("Perlito5::Grammar::Expression", "term_declarator", function (List__, p5want) {
3838-
var v_grammar;
3839-
v_grammar = (List__.p5aget(0));
3840-
var v_str;
3841-
v_str = (List__.p5aget(1));
3842-
var v_pos;
3843-
v_pos = (List__.p5aget(2));
3844-
var v_MATCH;
3845-
v_MATCH = ((new p5HashRef({'str' : v_str, 'from' : v_pos, 'to' : v_pos})));
3846-
var v_tmp;
3847-
v_tmp = (p5context([p5context([p5and(p5and(p5and(p5and(p5and(p5context([(function () {
3838+
try {
3839+
var v_grammar;
3840+
v_grammar = (List__.p5aget(0));
3841+
var v_str;
3842+
v_str = (List__.p5aget(1));
3843+
var v_pos;
3844+
v_pos = (List__.p5aget(2));
3845+
var v_MATCH;
3846+
v_MATCH = ((new p5HashRef({'str' : v_str, 'from' : v_pos, 'to' : v_pos})));
3847+
var v_tmp;
3848+
v_tmp = (p5context([p5context([p5and(p5and(p5and(p5and(p5and(p5context([(function () {
38483849
var v_m2;
38493850
v_m2 = (p5call(v_grammar, "declarator", p5list_to_a(v_str, (v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to')), 0));
38503851
if ( p5bool(v_m2) ) {
@@ -3870,16 +3871,44 @@ var p5100 = p5pkg['main'];
38703871
return (p5context([0], p5want));
38713872
}
38723873
})()], 0), function () { return p5context([(function () {
3873-
var v_m2;
3874-
v_m2 = (p5call(p5pkg["Perlito5::Grammar"], "opt_type", p5list_to_a(v_str, (v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to')), 0));
3875-
if ( p5bool(v_m2) ) {
3876-
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', ((v_m2 || (v_m2 = new p5HashRef({})))._hash_.p5hget('to')));
3877-
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('Perlito5::Grammar.opt_type', (v_m2));
3878-
return (p5context([1], p5want));
3879-
}
3880-
else {
3881-
return (p5context([0], p5want));
3882-
}
3874+
var v_pos1;
3875+
v_pos1 = ((v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to'));
3876+
return (p5or(p5context([(function () {
3877+
return (p5and(p5context([(function () {
3878+
var v_m2;
3879+
v_m2 = (p5call(p5pkg["Perlito5::Grammar::Block"], "named_sub", p5list_to_a(v_str, (v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to')), 0));
3880+
if ( p5bool(v_m2) ) {
3881+
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', ((v_m2 || (v_m2 = new p5HashRef({})))._hash_.p5hget('to')));
3882+
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('Perlito5::Grammar::Block.named_sub', (v_m2));
3883+
return (p5context([1], p5want));
3884+
}
3885+
else {
3886+
return (p5context([0], p5want));
3887+
}
3888+
})()], 0), function () { return p5context([(function () {
3889+
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('str', (v_str));
3890+
var v_sub;
3891+
v_sub = ((v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget_hash('Perlito5::Grammar::Block.named_sub')._hash_.p5hget('capture'));
3892+
(v_sub || (v_sub = new p5HashRef({})))._hash_.p5hset('decl', (p5pkg["Perlito5::Match"].flat(p5list_to_a((v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('declarator')), 0)));
3893+
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('capture', ((new p5ArrayRef(['term', v_sub]))));
3894+
(function () { throw(p5context([v_MATCH], p5want)) })();
3895+
return (p5context([1], p5want));
3896+
})()], p5want) }));
3897+
})()], 0), function () { return p5context([(function () {
3898+
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', (v_pos1));
3899+
return (p5context([(function () {
3900+
var v_m2;
3901+
v_m2 = (p5call(p5pkg["Perlito5::Grammar"], "opt_type", p5list_to_a(v_str, (v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to')), 0));
3902+
if ( p5bool(v_m2) ) {
3903+
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', ((v_m2 || (v_m2 = new p5HashRef({})))._hash_.p5hget('to')));
3904+
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('Perlito5::Grammar.opt_type', (v_m2));
3905+
return (p5context([1], p5want));
3906+
}
3907+
else {
3908+
return (p5context([0], p5want));
3909+
}
3910+
})()], p5want));
3911+
})()], p5want) }));
38833912
})()], p5want) }));
38843913
})()], 0), function () { return p5context([(function () {
38853914
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', (v_pos1));
@@ -3931,7 +3960,16 @@ var p5100 = p5pkg['main'];
39313960
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('capture', ((new p5ArrayRef(p5list_to_a('term', p5call(p5pkg["Perlito5::AST::Decl"], "new", p5list_to_a('decl', v_decl, 'type', v_type, 'var', v_var, 'attributes', p5pkg["Perlito5::Match"].flat(p5list_to_a((v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('Perlito5::Grammar::Attribute.opt_attribute')), 1)), 1))))));
39323961
return (p5context([1], p5want));
39333962
})()], 0) })], 0)], 0));
3934-
return (( p5bool(v_tmp) ? v_MATCH : 0));
3963+
return (( p5bool(v_tmp) ? v_MATCH : 0));
3964+
}
3965+
catch(err) {
3966+
if ( err instanceof Error ) {
3967+
throw(err);
3968+
}
3969+
else {
3970+
return(err);
3971+
}
3972+
}
39353973
});
39363974
p5typeglob_set("Perlito5::Grammar::Expression", "term_local", function (List__, p5want) {
39373975
var v_grammar;

perlito5.pl

Lines changed: 34 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1778,15 +1778,40 @@ sub Perlito5::Grammar::Expression::term_declarator {
17781778
0
17791779
}
17801780
})) && ((do {
1781-
my $m2 = Perlito5::Grammar->opt_type($str, $MATCH->{'to'});
1782-
if ($m2) {
1783-
$MATCH->{'to'} = $m2->{'to'};
1784-
$MATCH->{'Perlito5::Grammar.opt_type'} = $m2;
1785-
1
1786-
}
1787-
else {
1788-
0
1789-
}
1781+
my $pos1 = $MATCH->{'to'};
1782+
(((do {
1783+
(((do {
1784+
my $m2 = Perlito5::Grammar::Block->named_sub($str, $MATCH->{'to'});
1785+
if ($m2) {
1786+
$MATCH->{'to'} = $m2->{'to'};
1787+
$MATCH->{'Perlito5::Grammar::Block.named_sub'} = $m2;
1788+
1
1789+
}
1790+
else {
1791+
0
1792+
}
1793+
})) && ((do {
1794+
$MATCH->{'str'} = $str;
1795+
my $sub = $MATCH->{'Perlito5::Grammar::Block.named_sub'}->{'capture'};
1796+
$sub->{'decl'} = Perlito5::Match::flat($MATCH->{'declarator'});
1797+
$MATCH->{'capture'} = ['term', $sub];
1798+
return $MATCH;
1799+
1
1800+
})))
1801+
})) || ((do {
1802+
$MATCH->{'to'} = $pos1;
1803+
((do {
1804+
my $m2 = Perlito5::Grammar->opt_type($str, $MATCH->{'to'});
1805+
if ($m2) {
1806+
$MATCH->{'to'} = $m2->{'to'};
1807+
$MATCH->{'Perlito5::Grammar.opt_type'} = $m2;
1808+
1
1809+
}
1810+
else {
1811+
0
1812+
}
1813+
}))
1814+
})))
17901815
})))
17911816
})) || ((do {
17921817
$MATCH->{'to'} = $pos1;

src5/lib/Perlito5/Grammar/Expression.pm

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -399,7 +399,17 @@ token declarator {
399399

400400
token term_declarator {
401401
<declarator>
402-
[ <.Perlito5::Grammar::Space.ws> <Perlito5::Grammar.opt_type>
402+
[ <.Perlito5::Grammar::Space.ws>
403+
[
404+
<Perlito5::Grammar::Block.named_sub>
405+
{
406+
my $sub = $MATCH->{"Perlito5::Grammar::Block.named_sub"}{capture};
407+
$sub->{decl} = Perlito5::Match::flat($MATCH->{declarator});
408+
$MATCH->{capture} = [ 'term', $sub ];
409+
return $MATCH;
410+
}
411+
| <Perlito5::Grammar.opt_type>
412+
]
403413
| ''
404414
]
405415
<.Perlito5::Grammar::Space.opt_ws> <Perlito5::Grammar.var_ident> # my Int $variable

0 commit comments

Comments
 (0)