cvsuser 04/09/17 19:52:25
Modified: languages/regex/lib/Regex/CodeGen IMCC.pm
Log:
Switch to using Match PMCs
Revision Changes Path
1.8 +37 -17 parrot/languages/regex/lib/Regex/CodeGen/IMCC.pm
Index: IMCC.pm
===================================================================
RCS file: /cvs/public/parrot/languages/regex/lib/Regex/CodeGen/IMCC.pm,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -w -r1.7 -r1.8
--- IMCC.pm 29 Jan 2004 04:39:59 -0000 1.7
+++ IMCC.pm 18 Sep 2004 02:52:25 -0000 1.8
@@ -8,9 +8,9 @@
sub init_context {
my ($self, $ctx) = @_;
$self->init_context($ctx);
- $ctx->{rx_starts} ||= '$P0';
- $ctx->{rx_ends} ||= '$P1';
- $ctx->{rx_stack} ||= '$P2';
+ $ctx->{rx_match} ||= '$P0';
+ $ctx->{rx_stack} ||= '$P1';
+ $ctx->{rx_ptmp} ||= '$P2';
$ctx->{rx_tmp} ||= '$I0';
$ctx->{rx_pos} ||= '$I1';
$ctx->{rx_len} ||= '$I2';
@@ -21,30 +21,38 @@
sub popop { "pop" };
sub output_preamble {
- my $self = shift;
+ my ($self, $num_groups) = @_;
my @ops;
- push @ops, ("length <rx_len>, <rx_input> # cache the length in <rx_len>",
- "set <rx_starts>[0], 0");
+ push @ops, ('new <rx_match>, .Match',
+ 'set <rx_match>["!INPUT"], <rx_input>',
+ "set <rx_match>[\"!GROUPS\"], $num_groups",
+ 'set <rx_match>["0"], <rx_ptmp>',
+ "length <rx_len>, <rx_input> # cache the length in <rx_len>",
+ );
return @ops;
}
sub output_match_succeeded {
- return ('set <rx_tmp>, 1',
- "set <rx_ends>[0], <rx_pos>");
+ return ('set <rx_match>["!POS"], <rx_pos>',
+ 'set <rx_match>["!RESULT"], 1',
+ 'add <rx_tmp>, <rx_pos>, -1',
+ 'set <rx_match>["0";1], <rx_tmp>');
}
sub output_match_failed {
- return ('set <rx_tmp>, 0',
- "set <rx_ends>[0], -2");
+ return ('set <rx_match>["!POS"], <rx_pos>',
+ 'set <rx_match>["!RESULT"], 0',
+ 'set <rx_match>["0";1], -2');
}
sub value {
my $name = shift;
return '<rx_pos>' if $name eq 'pos';
return '<rx_tmp>' if $name eq 'tmp';
+ return '<rx_ptmp>' if $name eq 'ptmp';
return $name;
}
@@ -66,7 +74,7 @@
$failLabel = $self->output_label_use($failLabel);
return ("add <rx_pos>, $distance # pos++",
"gt <rx_pos>, <rx_len>, $failLabel # past end of input?",
- "set <rx_starts>[0], <rx_pos> # group 0 start := pos");
+ 'set <rx_match>["0";0], <rx_pos> # group 0 start := pos');
}
sub output_increment {
@@ -218,33 +226,45 @@
return @ops;
}
+sub output_initgroup {
+ my ($self, $group) = @_;
+ return ("new <rx_ptmp>, .MatchRange # new group \"$group\"",
+ "set <rx_match>[\"$group\"], <rx_ptmp>");
+}
+
sub output_setstart {
my ($self, $group, $value) = @_;
$value = value($value);
- return "set <rx_starts>[$group], $value # open group $group";
+ return qq!set <rx_match>["$group";0], $value # open group $group!;
}
sub output_setend {
- my ($self, $group, $value) = @_;
+ my ($self, $group, $value, $adj) = @_;
$value = value($value);
- return "set <rx_ends>[$group], $value # close group $group";
+ my @ops;
+ if ($adj) {
+ push @ops, "add <rx_tmp>, $value, $adj";
+ $value = "<rx_tmp>";
+ }
+ push @ops, qq!set <rx_match>["$group";1], $value # close group $group!;
+ return @ops;
}
sub output_getstart {
my ($self, $reg, $group) = @_;
$reg = value($reg);
- return "set $reg, <rx_starts>[$group] # get group $group start";
+ return qq!set $reg, <rx_match>["$group";0] # get group $group start!;
}
sub output_getend {
my ($self, $reg, $group) = @_;
$reg = value($reg);
- return "set $reg, <rx_ends>[$group] # get group $group end";
+ return qq!set $reg, <rx_match>["$group";1] # get group $group end!;
}
sub output_delete {
my ($self, $n) = @_;
- return "set <rx_ends>[$n], -2 # delete group $n";
+ return qq!set <rx_match>["$n";1], -2 # delete group $n!;
}
sub output_atend {