blob: db8d0ba395392f5c5f813c58a1a1833c37be4b53 [file] [log] [blame]
package ANTLR::Runtime::RecognitionException;
use Carp;
use Readonly;
use Moose;
use Moose::Util::TypeConstraints;
extends 'ANTLR::Runtime::Exception';
has 'input' => (
is => 'ro',
does => 'ANTLR::Runtime::IntStream',
required => 1,
);
has 'index' => (
is => 'ro',
isa => 'Int',
default => 0,
);
has 'token' => (
is => 'ro',
does => 'ANTLR::Runtime::Token',
);
has 'node' => (
is => 'ro',
isa => 'Any',
);
subtype 'Char'
=> as 'Str'
=> where { $_ eq '-1' || length == 1 };
has 'c' => (
is => 'ro',
isa => 'Maybe[Char]',
);
has 'line' => (
is => 'ro',
isa => 'Int',
default => 0,
);
has 'char_position_in_line' => (
is => 'ro',
isa => 'Int',
default => 0,
);
has 'approximate_line_info' => (
is => 'rw',
isa => 'Bool',
);
sub BUILDARGS {
my ($class, @args) = @_;
my $args = $class->SUPER::BUILDARGS(@args);
my $new_args = { %$args };
my $input = $args->{input};
$new_args->{input} = $input;
$new_args->{index} = $input->index();
if ($input->does('ANTLR::Runtime::TokenStream')) {
my $token = $input->LT(1);
$new_args->{token} = $token;
$new_args->{line} = $token->get_line();
$new_args->{char_position_in_line} = $token->get_char_position_in_line();
}
if ($input->does('ANTLR::Runtime::TreeNodeStream')) {
# extract_information_from_tree_node_stream($input);
}
elsif ($input->does('ANTLR::Runtime::CharStream')) {
$new_args->{c} = $input->LA(1);
$new_args->{line} = $input->get_line();
$new_args->{char_position_in_line} = $input->get_char_position_in_line();
}
else {
$new_args->{c} = $input->LA(1);
}
return $new_args;
}
sub get_unexpected_type {
my ($self) = @_;
if ($self->input->isa('ANTLR::Runtime::TokenStream')) {
return $self->token->get_type();
} else {
return $self->c;
}
}
sub get_c {
my ($self) = @_;
return $self->c;
}
sub get_line {
my ($self) = @_;
return $self->line;
}
sub get_char_position_in_line {
my ($self) = @_;
return $self->char_position_in_line;
}
sub get_token {
my ($self) = @_;
return $self->token;
}
no Moose;
__PACKAGE__->meta->make_immutable();
1;