1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverpackage ANTLR::Runtime::DFA;
2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse Params::Validate qw( :types );
4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse Error qw( try finally );
5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruveruse Moose;
7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'eot' => (
9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    is  => 'rw',
10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    isa => 'ArrayRef[Int]',
11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver);
12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'eof' => (
14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    is  => 'rw',
15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    isa => 'ArrayRef[Int]',
16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver);
17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'min' => (
19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    is  => 'rw',
20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    isa => 'ArrayRef[Str]',
21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver);
22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'max' => (
24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    is  => 'rw',
25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    isa => 'ArrayRef[Str]',
26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver);
27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'accept' => (
29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    is  => 'rw',
30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    isa => 'ArrayRef[Int]',
31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver);
32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'special' => (
34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    is  => 'rw',
35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    isa => 'ArrayRef[Int]',
36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver);
37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'transition' => (
39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    is  => 'rw',
40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    isa => 'ArrayRef[ArrayRef[Int]]',
41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver);
42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'decision_number' => (
44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    is  => 'rw',
45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    isa => 'Int',
46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver);
47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# Which recognizer encloses this DFA?  Needed to check backtracking
50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverhas 'recognizer' => (
51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    is  => 'rw',
52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    isa => 'ANTLR::Runtime::BaseRecognizer',
53324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver);
54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub get_description {
57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return "n/a";
58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# From the input stream, predict what alternative will succeed
61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# using this DFA (representing the covering regular approximation
62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# to the underlying CFL).  Return an alternative number 1..n.  Throw
63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# an exception upon error.
64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub predict {
65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self, $input) = @_;
66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $mark = $input->mark();  # remember where decision started in input
68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $s = 0; # we always start at s0
69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    try {
71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        while (1) {
72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            my $special_state = $self->special->[$s];
73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if ($special_state >= 0) {
74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                $s = $self->special_state_transition($special_state, $input);
75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if ($s == -1) {
76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    $self->no_viable_alt($s, $input);
77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return 0;
78324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                $input->consume();
80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                next;
81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if ($self->accept->[$s] >= 1) {
84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                return $self->accept->[$s];
85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    # look for a normal char transition
88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            my $c = $input->LA(1);  # -1 == \uFFFF, all tokens fit in 65000 space
89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            if ($c >= $self->min->[$s] && $c <= $self->max->[$s]) {
91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                my $next_s = $self->transition->[$s][$c - $self->min->[$s]];  # move to next state
92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                if ($next_s < 0) {
94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    # was in range but not a normal transition
95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    # must check EOT, which is like the else clause.
96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    # eot[s]>=0 indicates that an EOT edge goes to another
97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    # state.
98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    if ($self->eot->[$s] >= 0) {  # EOT Transition to accept state?
99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        $s = $self->eot->[$s];
100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        $input->consume();
101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        # TODO: I had this as return accept[eot[s]]
102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        # which assumed here that the EOT edge always
103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        #went to an accept...faster to do this, but
104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        # what about predicated edges coming from EOT
105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        # target?
106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                        next;
107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    }
108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    $self->no_viable_alt($s, $input);
110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                    return 0;
111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                }
112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                $s = $next_s;
114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                $input->consume();
115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver                next;
116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver            }
117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    if ($self->eot->[$s] >= 0) {  # EOT Transition?
119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		$s = $self->eot->[$s];
120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		$input->consume();
121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		next;
122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    }
123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    if ($c == ANTLR::Runtime::Token->EOF && $self->eof->[$s] >= 0) {  # EOF Transition to accept state?
125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver		return $self->accept->[$self->eof->[$s]];
126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    }
127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    # not in range and not EOF/EOT, must be invalid symbol
129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    $self->no_viable_alt($s, $input);
130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	    return 0;
131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        }
132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    finally {
134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	$input->rewind();
135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    };
136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub no_viable_alt {
139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self, $s, $input) = @_;
140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    if ($self->recognizer->state->backtracking > 0) {
142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	$self->recognizer->state->failed = 1;
143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	return;
144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $nvae = ANTLR::Runtime::NoViableAltException({
146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	grammar_decision_description => $self->get_description(),
147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	decision_number => $self->decision_number,
148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	state_number => $self->state_number,
149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver	input => $input
150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    });
151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $self->error($nvae);
152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    $nvae->throw();
153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# A hook for debugging interface
156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub error {
157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self, $nvae) = @_;
158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub special_state_transition {
161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self, $s, $input) = @_;
162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return -1;
164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# Given a String that has a run-length-encoding of some unsigned shorts
167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# like "\1\2\3\9", convert to short[] {2,9,9,9}.  We do this to avoid
168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# static short[] which generates so much init code that the class won't
169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver# compile. :(
170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub unpack_encoded_string {
171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self, $encoded_string) = @_;
172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my $data = [];
174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    while ($encoded_string =~ /(.)(.)/gxms) {
175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        my ($n, $v) = ($1, $2);
176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver        push @$data, $v x $n;
178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    }
179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return $data;
181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruversub unpack_encoded_string_to_unsigned_chars {
184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    my ($self, $encoded_string) = @_;
185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver    return $self->unpack_encoded_string($encoded_string);
187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver}
188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver
189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverno Moose;
190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver__PACKAGE__->meta->make_immutable();
191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver1;
192324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver__END__
193