225 lines
3.9 KiB
Perl
225 lines
3.9 KiB
Perl
package ANTLR::Runtime::CommonToken;
|
|
|
|
use Readonly;
|
|
|
|
use Moose;
|
|
|
|
use overload
|
|
'bool' => \¬_eof,
|
|
fallback => 1,
|
|
;
|
|
|
|
with 'ANTLR::Runtime::Token';
|
|
|
|
has 'type' => (
|
|
is => 'rw',
|
|
isa => 'Int',
|
|
required => 1,
|
|
);
|
|
|
|
has 'line' => (
|
|
is => 'rw',
|
|
isa => 'Int',
|
|
default => 0,
|
|
);
|
|
|
|
has 'char_position_in_line' => (
|
|
is => 'rw',
|
|
isa => 'Int',
|
|
# set to invalid position
|
|
default => -1,
|
|
);
|
|
|
|
has 'channel' => (
|
|
is => 'rw',
|
|
isa => 'Int',
|
|
default => sub { ANTLR::Runtime::Token->DEFAULT_CHANNEL }
|
|
);
|
|
|
|
has 'input' => (
|
|
is => 'rw',
|
|
isa => 'Maybe[ANTLR::Runtime::CharStream]',
|
|
);
|
|
|
|
# We need to be able to change the text once in a while. If
|
|
# this is non-null, then getText should return this. Note that
|
|
# start/stop are not affected by changing this.
|
|
has 'text' => (
|
|
is => 'rw',
|
|
isa => 'Maybe[Str]',
|
|
);
|
|
|
|
# What token number is this from 0..n-1 tokens; < 0 implies invalid index
|
|
has 'index' => (
|
|
is => 'rw',
|
|
isa => 'Int',
|
|
default => -1,
|
|
);
|
|
|
|
# The char position into the input buffer where this token starts
|
|
has 'start' => (
|
|
is => 'rw',
|
|
isa => 'Int',
|
|
);
|
|
|
|
# The char position into the input buffer where this token stops
|
|
has 'stop' => (
|
|
is => 'rw',
|
|
isa => 'Int',
|
|
);
|
|
|
|
sub BUILD {
|
|
my ($self, $arg_ref) = @_;
|
|
|
|
if (exists $arg_ref->{token}) {
|
|
my $token = $arg_ref->{token};
|
|
$self->text($token->get_text());
|
|
$self->type($token->get_type());
|
|
$self->line($token->get_line());
|
|
$self->index($token->get_token_index());
|
|
$self->char_position_in_line($token->get_char_position_in_line());
|
|
$self->channel($token->get_channel());
|
|
}
|
|
return;
|
|
}
|
|
|
|
sub get_type {
|
|
my ($self) = @_;
|
|
return $self->type;
|
|
}
|
|
|
|
sub set_type {
|
|
my ($self, $value) = @_;
|
|
$self->value($value);
|
|
return;
|
|
}
|
|
|
|
|
|
sub get_line {
|
|
my ($self) = @_;
|
|
return $self->line;
|
|
}
|
|
|
|
sub set_line {
|
|
my ($self, $line) = @_;
|
|
$self->line($line);
|
|
return;
|
|
}
|
|
|
|
sub get_text {
|
|
my ($self) = @_;
|
|
|
|
if (defined $self->text) {
|
|
return $self->text;
|
|
}
|
|
if (!defined $self->input) {
|
|
return undef;
|
|
}
|
|
$self->text($self->input->substring($self->start, $self->stop));
|
|
return $self->text;
|
|
}
|
|
|
|
sub set_text {
|
|
my ($self, $text) = @_;
|
|
$self->text($text);
|
|
return;
|
|
}
|
|
|
|
sub get_char_position_in_line {
|
|
my ($self) = @_;
|
|
return $self->char_position_in_line;
|
|
}
|
|
|
|
sub set_char_position_in_line {
|
|
my ($self, $pos) = @_;
|
|
$self->char_position_in_line($pos);
|
|
return;
|
|
}
|
|
|
|
sub get_channel {
|
|
my ($self) = @_;
|
|
return $self->channel;
|
|
}
|
|
|
|
sub set_channel {
|
|
my ($self, $channel) = @_;
|
|
$self->channel($channel);
|
|
return;
|
|
}
|
|
|
|
sub get_start_index {
|
|
my ($self) = @_;
|
|
return $self->start;
|
|
}
|
|
|
|
sub set_start_index {
|
|
my ($self, $start) = @_;
|
|
$self->start($start);
|
|
return;
|
|
}
|
|
|
|
sub get_stop_index {
|
|
my ($self) = @_;
|
|
return $self->stop;
|
|
}
|
|
|
|
sub set_stop_index {
|
|
my ($self, $stop) = @_;
|
|
$self->stop($stop);
|
|
return;
|
|
}
|
|
|
|
sub get_token_index {
|
|
my ($self) = @_;
|
|
return $self->index;
|
|
}
|
|
|
|
sub set_token_index {
|
|
my ($self, $index) = @_;
|
|
$self->index($index);
|
|
return;
|
|
}
|
|
|
|
sub get_input_stream {
|
|
my ($self) = @_;
|
|
return $self->input;
|
|
}
|
|
|
|
sub set_input_stream {
|
|
my ($self, $input) = @_;
|
|
$self->input($input);
|
|
return;
|
|
}
|
|
|
|
sub not_eof {
|
|
my ($self) = @_;
|
|
return $self->type != ANTLR::Runtime::Token->EOF;
|
|
}
|
|
|
|
=begin later
|
|
|
|
public String toString() {
|
|
String channelStr = "";
|
|
if ( channel>0 ) {
|
|
channelStr=",channel="+channel;
|
|
}
|
|
String txt = getText();
|
|
if ( txt!=null ) {
|
|
txt = txt.replaceAll("\n","\\\\n");
|
|
txt = txt.replaceAll("\r","\\\\r");
|
|
txt = txt.replaceAll("\t","\\\\t");
|
|
}
|
|
else {
|
|
txt = "<no text>";
|
|
}
|
|
return "[@"+getTokenIndex()+","+start+":"+stop+"='"+txt+"',<"+type+">"+channelStr+","+line+":"+getCharPositionInLine()+"]";
|
|
}
|
|
|
|
=end later
|
|
|
|
=cut
|
|
|
|
no Moose;
|
|
__PACKAGE__->meta->make_immutable();
|
|
1;
|