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