Skip to content

Commit c55f350

Browse files
committed
Perlito5 - grammar - vstring placeholder
1 parent 2a9824c commit c55f350

File tree

4 files changed

+77
-54
lines changed

4 files changed

+77
-54
lines changed

html/perlito5.js

Lines changed: 29 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -10187,47 +10187,50 @@ return (p5call(p5pkg["Perlito5::AST::Val::Buf"], "new", ['buf', p5pkg["Perlito5:
1018710187
return (p5context([1], p5want));
1018810188
})()], 0), function () { return p5context([(function () {
1018910189
var v_m2;
10190-
v_m2 = (p5call(v_grammar, "digits_underscore", p5list_to_a(v_str, (v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to')), 0));
10190+
v_m2 = (p5call(v_grammar, "val_int", p5list_to_a(v_str, (v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to')), 0));
1019110191
if ( p5bool(v_m2) ) {
1019210192
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', ((v_m2 || (v_m2 = new p5HashRef({})))._hash_.p5hget('to')));
10193+
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('val_int', (v_m2));
1019310194
return (p5context([1], p5want));
1019410195
}
1019510196
else {
1019610197
return (p5context([0], p5want));
1019710198
}
1019810199
})()], 0) }), function () { return p5context([(function () {
10200+
var v_last_match_null;
10201+
v_last_match_null = (0);
1019910202
var v_m;
1020010203
v_m = (v_MATCH);
10201-
if ( !( (((('.' == p5pkg["Perlito5::Grammar::Number"].substr([v_str, (v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to'), 1], 0)) && p5bool((v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', ((1 + p5num((v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to'))))))) && p5bool((function () {
10202-
var v_m2;
10203-
v_m2 = (p5call(v_grammar, "digits_underscore", p5list_to_a(v_str, (v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to')), 0));
10204-
if ( p5bool(v_m2) ) {
10205-
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', ((v_m2 || (v_m2 = new p5HashRef({})))._hash_.p5hget('to')));
10206-
return (p5context([1], p5want));
10204+
var v_to;
10205+
v_to = ((v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to'));
10206+
p5while(function () {
10207+
if ( (p5num(v_to) == p5num((v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to'))) ) {
10208+
v_last_match_null = ((p5num(v_last_match_null) + 1));
1020710209
}
1020810210
else {
10209-
return (p5context([0], p5want));
10210-
}
10211-
})())) && p5bool((function () {
10212-
var v_m;
10211+
v_last_match_null = (0);
10212+
};
1021310213
v_m = (v_MATCH);
10214-
if ( !( ((('.' == p5pkg["Perlito5::Grammar::Number"].substr([v_str, (v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to'), 1], 0)) && p5bool((v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', ((1 + p5num((v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to'))))))) && p5bool((function () {
10215-
var v_m2;
10216-
v_m2 = (p5call(v_grammar, "digits_underscore", p5list_to_a(v_str, (v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to')), 0));
10217-
if ( p5bool(v_m2) ) {
10218-
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', ((v_m2 || (v_m2 = new p5HashRef({})))._hash_.p5hget('to')));
10219-
return (p5context([1], p5want));
10220-
}
10221-
else {
10222-
return (p5context([0], p5want));
10223-
}
10224-
})()))) ) {
10225-
v_MATCH = (v_m);
10214+
v_to = ((v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to'));
10215+
}, function () { return p5and(p5context([p5and(p5context([p5and(('.' == p5pkg["Perlito5::Grammar::Number"].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 () {
10216+
var v_m2;
10217+
v_m2 = (p5call(v_grammar, "digits_underscore", p5list_to_a(v_str, (v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget('to')), 0));
10218+
if ( p5bool(v_m2) ) {
10219+
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', ((v_m2 || (v_m2 = new p5HashRef({})))._hash_.p5hget('to')));
10220+
if ( (v_MATCH)._hash_.hasOwnProperty('digits_underscore') ) {
10221+
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hget_array('digits_underscore')._array_.p5push([v_m2]);
10222+
}
10223+
else {
10224+
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('digits_underscore', ((new p5ArrayRef([v_m2]))));
1022610225
};
1022710226
return (p5context([1], p5want));
10228-
})()))) ) {
10229-
v_MATCH = (v_m);
10230-
};
10227+
}
10228+
else {
10229+
return (p5context([0], p5want));
10230+
}
10231+
})()], 0) })], 0), function () { return p5context([(p5num(v_last_match_null) < 2)], 0) }) }, false, "");
10232+
v_MATCH = (v_m);
10233+
(v_MATCH || (v_MATCH = new p5HashRef({})))._hash_.p5hset('to', (v_to));
1023110234
return (p5context([1], p5want));
1023210235
})()], 0) })], 0)], 0));
1023310236
return (( p5bool(v_tmp) ? v_MATCH : 0));

perlito5.pl

Lines changed: 30 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -7451,43 +7451,48 @@ sub Perlito5::Grammar::Number::val_version {
74517451
};
74527452
1
74537453
})) && ((do {
7454-
my $m2 = $grammar->digits_underscore($str, $MATCH->{'to'});
7454+
my $m2 = $grammar->val_int($str, $MATCH->{'to'});
74557455
if ($m2) {
74567456
$MATCH->{'to'} = $m2->{'to'};
7457+
$MATCH->{'val_int'} = $m2;
74577458
1
74587459
}
74597460
else {
74607461
0
74617462
}
74627463
}))) && ((do {
7464+
my $last_match_null = 0;
74637465
my $m = $MATCH;
7464-
if (!((((((('.' eq substr($str, $MATCH->{'to'}, 1)) && ($MATCH->{'to'} = (1 + $MATCH->{'to'})))) && ((do {
7465-
my $m2 = $grammar->digits_underscore($str, $MATCH->{'to'});
7466-
if ($m2) {
7467-
$MATCH->{'to'} = $m2->{'to'};
7468-
1
7466+
my $to = $MATCH->{'to'};
7467+
for ( ; (((((('.' eq substr($str, $MATCH->{'to'}, 1)) && ($MATCH->{'to'} = (1 + $MATCH->{'to'})))) && ((do {
7468+
my $m2 = $grammar->digits_underscore($str, $MATCH->{'to'});
7469+
if ($m2) {
7470+
$MATCH->{'to'} = $m2->{'to'};
7471+
if (exists($MATCH->{'digits_underscore'})) {
7472+
push(@{$MATCH->{'digits_underscore'}}, $m2)
74697473
}
74707474
else {
7471-
0
7472-
}
7473-
}))) && ((do {
7474-
my $m = $MATCH;
7475-
if (!(((((('.' eq substr($str, $MATCH->{'to'}, 1)) && ($MATCH->{'to'} = (1 + $MATCH->{'to'})))) && ((do {
7476-
my $m2 = $grammar->digits_underscore($str, $MATCH->{'to'});
7477-
if ($m2) {
7478-
$MATCH->{'to'} = $m2->{'to'};
7479-
1
7480-
}
7481-
else {
7482-
0
7483-
}
7484-
})))))) {
7485-
$MATCH = $m
7486-
};
7487-
1
7488-
})))))) {
7489-
$MATCH = $m
7475+
$MATCH->{'digits_underscore'} = [$m2]
7476+
};
7477+
1
7478+
}
7479+
else {
7480+
0
7481+
}
7482+
})))) && (($last_match_null < 2))); {
7483+
7484+
} ) {
7485+
if (($to == $MATCH->{'to'})) {
7486+
$last_match_null = ($last_match_null + 1)
7487+
}
7488+
else {
7489+
$last_match_null = 0
7490+
};
7491+
$m = $MATCH;
7492+
$to = $MATCH->{'to'}
74907493
};
7494+
$MATCH = $m;
7495+
$MATCH->{'to'} = $to;
74917496
1
74927497
})))));
74937498
($tmp ? $MATCH : 0)

src5/lib/Perlito5/Grammar/Number.pm

Lines changed: 17 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,9 @@ token term_digit {
2020
| <Perlito5::Grammar::Number.val_octal>
2121
# 0123
2222
{ $MATCH->{capture} = [ 'term', Perlito5::Match::flat($MATCH->{"Perlito5::Grammar::Number.val_octal"}) ] }
23+
# | <Perlito5::Grammar::Number.val_version>
24+
# # 123.456.789
25+
# { print "version\n" }
2326
| <Perlito5::Grammar::Number.val_num>
2427
# 123.456
2528
{ $MATCH->{capture} = [ 'term', Perlito5::Match::flat($MATCH->{"Perlito5::Grammar::Number.val_num"}) ] }
@@ -65,7 +68,7 @@ token digits_underscore {
6568
token val_octal {
6669
'0' [ ['x'|'X'] <.Perlito5::Grammar.word>+ # XXX test for hex digits
6770
| ['b'|'B'] [ '_' | '0' | '1' ]+
68-
| [ '_' | \d]+ # XXX test for octal number
71+
| [ '_' | \d]+ # XXX test for octal digits
6972
]
7073
{ $MATCH->{capture} = Perlito5::AST::Val::Int->new( int => oct(lc(Perlito5::Match::flat($MATCH))) ) }
7174
};
@@ -81,7 +84,19 @@ token val_int {
8184

8285
token val_version {
8386
# TODO - this should return a "VSTRING"
84-
['v']? <.digits_underscore> [ '.' <.digits_underscore> [ '.' <.digits_underscore> ]? ]?
87+
#
88+
# $ perl5.16 -e ' use strict; $a = v100; print ref(\$a) '
89+
# VSTRING
90+
# $ perl5.16 -e ' use strict; sub v100 { 123 } $a = v100; print ref(\$a)
91+
# SCALAR
92+
# $ perl5.16 -e ' use strict; sub v100 { 123 } $a = v100.100; print ref(\$a) '
93+
# VSTRING
94+
95+
['v']? <val_int> [ '.' <digits_underscore> ]*
96+
# {
97+
# print "HERE!\n";
98+
# return;
99+
# }
85100
};
86101

87102
1;

t5/01-perlito/030-num.t

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,5 +43,5 @@ say 'ok 8 - undefined var';
4343

4444
$v = eval '013.4e2';
4545
print 'not ' if $v != 11400;
46-
say 'ok 9 - octal integer followed by dot # TODO';
46+
say 'ok 9 - octal integer followed by dot';
4747

0 commit comments

Comments
 (0)