1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpackage ANTLR::Runtime::CommonTokenStream;
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse Carp;
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse Readonly;
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse UNIVERSAL qw( isa );
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse ANTLR::Runtime::CharStream;
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse ANTLR::Runtime::Token;
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse ANTLR::Runtime::TokenSource;
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse Moose;
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse overload
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    '""' => \&str
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    ;
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwith 'ANTLR::Runtime::IntStream',
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver     'ANTLR::Runtime::TokenStream';
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'token_source' => (
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    is  => 'rw',
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    does => 'ANTLR::Runtime::TokenSource',
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver);
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'tokens' => (
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    is  => 'rw',
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    isa => 'ArrayRef[ANTLR::Runtime::Token]',
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    default => sub { [] },
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver);
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'channel_override_map' => (
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    is  => 'rw',
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    isa => 'HashRef[Int]',
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver);
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'discard_set' => (
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    is  => 'rw',
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    isa => 'HashRef[Int]',
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver);
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'channel' => (
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    is  => 'rw',
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    isa => 'Int',
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    default => ANTLR::Runtime::Token->DEFAULT_CHANNEL,
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver);
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'discard_off_channel_tokens' => (
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    is  => 'rw',
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    isa => 'Bool',
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    default => 0,
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver);
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'last_marker' => (
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    is  => 'rw',
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    isa => 'Int',
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    default => 0,
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver);
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'p' => (
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    is  => 'rw',
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    isa => 'Int',
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    default => -1,
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver);
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub set_token_source {
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self, $token_source) = @_;
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->token_source($token_source);
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->tokens([]);
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->p(-1);
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->channel(ANTLR::Runtime::Token->DEFAULT_CHANNEL);
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub fill_buffer {
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self) = @_;
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $index = 0;
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $t = $self->token_source->next_token();
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    while (defined $t && $t->get_type() != ANTLR::Runtime::CharStream->EOF) {
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        my $discard = 0;
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	# is there a channel override for token type?
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (defined $self->channel_override_map) {
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            my $channel = $self->channel_override_map->{$t->get_type()};
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if (defined $channel) {
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                $t->set_channel($channel);
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (defined $self->discard_set && $self->discard_set->contains($t->get_type())) {
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            $discard = 1;
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        } elsif ($self->discard_off_channel_tokens && $t->get_channel() != $self->channel) {
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            $discard = 1;
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (!$discard) {
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            $t->set_token_index($index);
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            push @{$self->tokens}, $t;
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            ++$index;
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    } continue {
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $t = $self->token_source->next_token();
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    # leave p pointing at first token on channel
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->p(0);
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->skip_off_token_channels($self->p);
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub consume {
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self) = @_;
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ($self->p < @{$self->tokens}) {
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $self->p($self->p + 1);
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $self->p($self->skip_off_token_channels($self->p));  # leave p on valid token
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub skip_off_token_channels {
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self, $i) = @_;
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $n = @{$self->tokens};
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    while ($i < $n && $self->tokens->[$i]->get_channel() != $self->channel) {
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ++$i;
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return $i;
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub skip_off_token_channels_reverse {
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self, $i) = @_;
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    while ($i >= 0 && $self->tokens->[$i]->get_channel() != $self->channel) {
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        --$i;
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return $i;
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub set_token_type_channel {
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self, $ttype, $channel) = @_;
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (!defined $self->channel_override_map) {
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $self->channel_override_map({});
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->channel_override_map->{$ttype} = $channel;
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub discard_token_type {
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self, $ttype) = @_;
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (!defined $self->discard_set) {
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $self->discard_set({});
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->discard_set->{$ttype} = 1;
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub get_tokens {
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self, $args) = @_;
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ($self->p == -1) {
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $self->fill_buffer();
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (!defined $args) {
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return $self->tokens;
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $start = $args->{start};
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $stop = $args->{stop};
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $types;
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (exists $args->{types}) {
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (ref $args->{types} eq 'ARRAY') {
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            $types = ANTLR::Runtime::BitSet->new($args->{types});
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        } else {
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            $types = $args->{types};
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    } else {
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        my $ttype = $args->{ttype};
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $types = ANTLR::Runtime::BitSet->of($ttype);
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ($stop >= @{$self->tokens}) {
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $stop = $#{$self->tokens};
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ($start < 0) {
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $start = 0;
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ($start > $stop) {
193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return undef;
194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $filtered_tokens = [];
197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    foreach my $t (@{$self->tokens}[$start..$stop]) {
198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (!defined $types || $types->member($t->get_type())) {
199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            push @$filtered_tokens, $t;
200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (!@{$filtered_tokens}) {
204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $filtered_tokens = undef;
205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return $filtered_tokens;
208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub LT {
211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self, $k) = @_;
212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ($self->p == -1) {
214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $self->fill_buffer();
215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ($k == 0) {
217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return undef;
218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ($k < 0) {
220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return $self->LB(-$k);
221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ($self->p + $k - 1 >= @{$self->tokens}) {
224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return ANTLR::Runtime::Token->EOF_TOKEN;
225324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
226324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
227324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $i = $self->p;
228324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $n = 1;
229324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
230324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    while ($n < $k) {
231324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $i = $self->skip_off_token_channels($i+1);
232324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ++$n;
233324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
234324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
235324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ($i >= @{$self->tokens}) {
236324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return ANTLR::Runtime::Token->EOF_TOKEN;
237324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
238324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
239324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return $self->tokens->[$i];
240324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
241324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
242324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub LB {
243324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self, $k) = @_;
244324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
245324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ($self->p == -1) {
246324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $self->fill_buffer();
247324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
248324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ($k == 0) {
249324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return undef;
250324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
251324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ($self->p - $k < 0) {
252324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return undef;
253324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
254324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
255324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $i = $self->p;
256324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $n = 1;
257324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    while ($n <= $k) {
258324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $k = $self->skip_off_token_channels_reverse($i - 1);
259324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        ++$n;
260324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
261324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
262324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ($i < 0) {
263324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return undef;
264324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
265324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
266324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return $self->tokens->[$i];
267324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
268324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
269324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub get {
270324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self, $i) = @_;
271324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
272324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return $self->tokens->[$i];
273324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
274324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
275324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub LA {
276324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self, $i) = @_;
277324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
278324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return $self->LT($i)->get_type();
279324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
280324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
281324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub mark {
282324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self) = @_;
283324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
284324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ($self->p == -1) {
285324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $self->fill_buffer();
286324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
287324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->last_marker($self->index());
288324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return $self->last_marker;
289324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
290324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
291324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub release {
292324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self, $marker) = @_;
293324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
294324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    # no resources to release
295324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
296324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
297324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub size {
298324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self) = @_;
299324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
300324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return scalar @{$self->tokens};
301324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
302324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
303324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub index {
304324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self) = @_;
305324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
306324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return $self->p;
307324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
308324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
309324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub rewind {
310324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Readonly my $usage => 'void rewind(int marker) | void rewind()';
311324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    croak $usage if @_ != 1 && @_ != 2;
312324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
313324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (@_ == 1) {
314324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        my ($self) = @_;
315324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $self->seek($self->last_marker);
316324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    } else {
317324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        my ($self, $marker) = @_;
318324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        $self->seek($marker);
319324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
320324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
321324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
322324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub seek {
323324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self, $index) = @_;
324324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
325324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->p($index);
326324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
327324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
328324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub get_token_source {
329324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self) = @_;
330324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
331324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return $self->token_source;
332324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
333324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
334324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub get_source_name {
335324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self) = @_;
336324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return $self->get_token_source()->get_source_name();
337324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
338324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
339324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub str {
340324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self) = @_;
341324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return $self->to_string();
342324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
343324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
344324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub to_string {
345324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    Readonly my $usage => 'String to_string() | String to_string(int start, int stop | String to_string(Token start, Token stop)';
346324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    croak $usage if @_ != 1 && @_ != 3;
347324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
348324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if (@_ == 1) {
349324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        my ($self) = @_;
350324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
351324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if ($self->p == -1) {
352324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            $self->fill_buffer();
353324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
354324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        return $self->to_string(0, $#{$self->tokens});
355324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    } else {
356324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        my ($self, $start, $stop) = @_;
357324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
358324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        if (defined $start && defined $stop) {
359324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if (ref($start) && $start->isa('ANTLR::Runtime::Token')) {
360324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                $start = $start->get_token_index();
361324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
362324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
363324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if (ref($start) && $stop->isa('ANTLR::Runtime::Token')) {
364324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                $stop = $stop->get_token_index();
365324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
366324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
367324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if ($start < 0 || $stop < 0) {
368324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return undef;
369324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
370324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if ($self->p == -1) {
371324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                $self->fill_buffer();
372324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
373324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if ($stop >= @{$self->tokens}) {
374324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                $stop = $#{$self->tokens};
375324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
376324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
377324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            my $buf = '';
378324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            foreach my $t (@{$self->tokens}[$start..$stop]) {
379324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                $buf .= $t->get_text();
380324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
381324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
382324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return $buf;
383324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        } else {
384324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            return undef;
385324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
386324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
387324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
388324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
389324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverno Moose;
390324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver__PACKAGE__->meta->make_immutable();
391324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver1;
392324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver__END__
393