1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpackage ANTLR::Runtime::ANTLRStringStream; 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse Carp; 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse Readonly; 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse ANTLR::Runtime::CharStreamState; 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse Moose; 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverwith 'ANTLR::Runtime::IntStream', 'ANTLR::Runtime::CharStream'; 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'input' => ( 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver is => 'ro', 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver isa => 'Str', 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver required => 1, 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver); 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'p' => ( 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver is => 'rw', 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver isa => 'Int', 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default => 0, 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver); 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'line' => ( 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver is => 'rw', 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver isa => 'Int', 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default => 1, 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver); 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'char_position_in_line' => ( 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver is => 'rw', 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver isa => 'Int', 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default => 0, 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver); 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'mark_depth' => ( 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver is => 'rw', 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver isa => 'Int', 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default => 0, 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver); 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'markers' => ( 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver is => 'rw', 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver isa => 'ArrayRef[Maybe[ANTLR::Runtime::CharStreamState]]', 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default => sub { [ undef ] }, 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver); 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'last_marker' => ( 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver is => 'rw', 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver isa => 'Int', 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default => 0, 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver); 53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'name' => ( 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver is => 'rw', 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver isa => 'Str', 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver default => q{}, 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver); 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub get_line { 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self) = @_; 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return $self->line; 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub set_line { 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self, $value) = @_; 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->line($value); 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub get_char_position_in_line { 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self) = @_; 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return $self->char_position_in_line; 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub set_char_position_in_line { 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self, $value) = @_; 78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->char_position_in_line($value); 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub reset { 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self) = @_; 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->p(0); 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->line(1); 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->char_position_in_line(0); 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->mark_depth(0); 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub consume { 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self) = @_; 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ($self->p < length $self->input) { 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->char_position_in_line($self->char_position_in_line + 1); 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (substr($self->input, $self->p, 1) eq "\n") { 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->line($self->line + 1); 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->char_position_in_line(0); 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->p($self->p + 1); 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub LA { 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self, $i) = @_; 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ($i == 0) { 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return undef; 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ($i < 0) { 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ++$i; # e.g., translate LA(-1) to use offset i=0; then input[p+0-1] 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ($self->p + $i - 1 < 0) { 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return $self->EOF; 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ($self->p + $i - 1 >= length $self->input) { 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return $self->EOF; 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return substr $self->input, $self->p + $i - 1, 1; 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub LT { 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self, $i) = @_; 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return $self->LA($i); 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub index { 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self) = @_; 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return $self->p; 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub size { 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self) = @_; 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return length $self->input; 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub mark { 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self) = @_; 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->mark_depth($self->mark_depth + 1); 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $state; 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ($self->mark_depth >= @{$self->markers}) { 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $state = ANTLR::Runtime::CharStreamState->new(); 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver push @{$self->markers}, $state; 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else { 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $state = $self->markers->[$self->mark_depth]; 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $state->set_p($self->p); 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $state->set_line($self->line); 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $state->set_char_position_in_line($self->char_position_in_line); 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->last_marker($self->mark_depth); 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return $self->mark_depth; 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub rewind { 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $self = shift; 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $m; 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (@_ == 0) { 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $m = $self->last_marker; 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } else { 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $m = shift; 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my $state = $self->markers->[$m]; 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # restore stream state 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->seek($state->get_p); 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->line($state->get_line); 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->char_position_in_line($state->get_char_position_in_line); 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->release($m); 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub release { 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self, $marker) = @_; 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # unwind any other markers made after m and release m 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->mark_depth($marker); 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # release this marker 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->mark_depth($self->mark_depth - 1); 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# consume() ahead unit p == index; can't just set p = index as we must update 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# line and char_position_in_line 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub seek { 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self, $index) = @_; 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ($index <= $self->p) { 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # just jump; don't update stream state (line, ...) 200324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->p($index); 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver # seek forward, consume until p hits index 205324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver while ($self->p < $index) { 206324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver $self->consume(); 207324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 208324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return; 209324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 210324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 211324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub substring { 212324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self, $start, $stop) = @_; 213324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 214324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return substr $self->input, $start, $stop - $start + 1; 215324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 216324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 217324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub get_source_name { 218324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver my ($self) = @_; 219324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return $self->name; 220324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 221324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 222324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverno Moose; 223324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver__PACKAGE__->meta->make_immutable(); 224324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver1; 225