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