package Regex::CodeGen::Rx;
# Copyright (C) 2002-2006, The Perl Foundation.
# $Id: Rx.pm 21249 2007-09-13 06:33:24Z paultcochrane $
use Regex::Ops::Tree ();
use base 'Regex::CodeGen';
use strict;
use warnings;
my $fail_label = Regex::Ops::Tree::mark('FAIL');
sub output_preamble {
my $self = shift;
return 'rx_allocinfo P0, S0';
}
sub output_match_succeeded {
return 'rx_succeed P0';
}
sub output_match_failed {
return 'rx_fail P0';
}
############### SIMPLE OUTPUT ##############
sub output_advance {
my ( $self, $distance, $failLabel ) = @_;
$failLabel = $self->output_label_use($failLabel);
if ( $distance eq '1' ) {
return "rx_advance P0, $failLabel";
}
elsif ( $distance =~ /\D/ ) {
die "Unimplemented: variable-length advances with rx backend";
}
else {
return ("rx_advance P0, $failLabel") x $distance;
}
}
sub output_match {
my ( $self, $byte, $failLabel ) = @_;
return "rx_literal P0, \"$byte\", " . $self->output_label_use($failLabel);
}
sub output_classmatch {
my ( $self, $class, $failLabel ) = @_;
return "rx_oneof P0, $class, " . $self->output_label_use($failLabel);
}
sub output_start {
my ( $self, $n ) = @_;
return "rx_startgroup P0, $n";
}
sub output_end {
my ( $self, $n ) = @_;
return "rx_endgroup P0, $n";
}
sub output_atend {
my ( $self, $failLabel ) = @_;
return ( "rx_zwa_atend P0, " . $self->output_label_use($failLabel) );
}
sub output_pushmark {
my ($self) = @_;
return "rx_pushmark P0";
}
sub output_pushindex {
my ($self) = @_;
return "rx_pushindex P0";
}
sub output_popindex {
my ( $self, $fallback ) = @_;
die "Must always have fallback defined!" if !$fallback;
return "rx_popindex P0, " . $self->output_label_use($fallback);
}
1;
# Local Variables:
# mode: cperl
# cperl-indent-level: 4
# fill-column: 100
# End:
# vim: expandtab shiftwidth=4:
syntax highlighted by Code2HTML, v. 0.9.1