1package ANTLR::Runtime::RecognitionException;
2
3use Carp;
4use Readonly;
5
6use Moose;
7use Moose::Util::TypeConstraints;
8
9extends 'ANTLR::Runtime::Exception';
10
11has 'input' => (
12    is   => 'ro',
13    does => 'ANTLR::Runtime::IntStream',
14    required => 1,
15);
16
17has 'index' => (
18    is  => 'ro',
19    isa => 'Int',
20    default => 0,
21);
22
23has 'token' => (
24    is   => 'ro',
25    does => 'ANTLR::Runtime::Token',
26);
27
28has 'node' => (
29    is  => 'ro',
30    isa => 'Any',
31);
32
33subtype 'Char'
34    => as 'Str'
35    => where { $_ eq '-1' || length == 1 };
36
37has 'c' => (
38    is  => 'ro',
39    isa => 'Maybe[Char]',
40);
41
42has 'line' => (
43    is  => 'ro',
44    isa => 'Int',
45    default => 0,
46);
47
48has 'char_position_in_line' => (
49    is  => 'ro',
50    isa => 'Int',
51    default => 0,
52);
53
54has 'approximate_line_info' => (
55    is  => 'rw',
56    isa => 'Bool',
57);
58
59sub BUILDARGS {
60    my ($class, @args) = @_;
61    my $args = $class->SUPER::BUILDARGS(@args);
62
63    my $new_args = { %$args };
64    my $input = $args->{input};
65    $new_args->{input} = $input;
66    $new_args->{index} = $input->index();
67
68    if ($input->does('ANTLR::Runtime::TokenStream')) {
69        my $token = $input->LT(1);
70        $new_args->{token} = $token;
71        $new_args->{line} = $token->get_line();
72        $new_args->{char_position_in_line} = $token->get_char_position_in_line();
73    }
74
75    if ($input->does('ANTLR::Runtime::TreeNodeStream')) {
76        # extract_information_from_tree_node_stream($input);
77    }
78    elsif ($input->does('ANTLR::Runtime::CharStream')) {
79        $new_args->{c} = $input->LA(1);
80        $new_args->{line} = $input->get_line();
81        $new_args->{char_position_in_line} = $input->get_char_position_in_line();
82    }
83    else {
84        $new_args->{c} = $input->LA(1);
85    }
86
87    return $new_args;
88}
89
90sub get_unexpected_type {
91    my ($self) = @_;
92
93    if ($self->input->isa('ANTLR::Runtime::TokenStream')) {
94        return $self->token->get_type();
95    } else {
96        return $self->c;
97    }
98}
99
100sub get_c {
101    my ($self) = @_;
102    return $self->c;
103}
104
105sub get_line {
106    my ($self) = @_;
107    return $self->line;
108}
109
110sub get_char_position_in_line {
111    my ($self) = @_;
112    return $self->char_position_in_line;
113}
114
115sub get_token {
116    my ($self) = @_;
117    return $self->token;
118}
119
120no Moose;
121__PACKAGE__->meta->make_immutable();
1221;
123