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