1324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Support functions for traversing cyclic DFA states as laid 2324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * out in static initialized structures by the code generator. 3324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 4324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * A DFA implemented as a set of transition tables. 5324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 6324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Any state that has a semantic predicate edge is special; those states 7324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * are generated with if-then-else structures in a ->specialStateTransition() 8324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * which is generated by cyclicDFA template. 9324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * 10324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * There are at most 32767 states (16-bit signed short). 11324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * Could get away with byte sometimes but would have to generate different 12324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * types and the simulation code too. For a point of reference, the Java 13324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * lexer's Tokens rule DFA has 326 states roughly. 14324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 15324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 16324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// [The "BSD licence"] 17324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC 18324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.temporal-wave.com 19324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// http://www.linkedin.com/in/jimidle 20324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 21324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// All rights reserved. 22324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 23324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// Redistribution and use in source and binary forms, with or without 24324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// modification, are permitted provided that the following conditions 25324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// are met: 26324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 1. Redistributions of source code must retain the above copyright 27324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer. 28324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 2. Redistributions in binary form must reproduce the above copyright 29324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// notice, this list of conditions and the following disclaimer in the 30324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// documentation and/or other materials provided with the distribution. 31324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 3. The name of the author may not be used to endorse or promote products 32324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// derived from this software without specific prior written permission. 33324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// 34324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 35324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 36324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 37324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 38324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 39324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 40324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 41324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 42324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 43324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 44324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 45324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <antlr3defs.h> 46324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#include <antlr3cyclicdfa.h> 47324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 48324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#ifdef ANTLR3_WINDOWS 49324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#pragma warning( disable : 4100 ) 50324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver#endif 51324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 52324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverstatic void 53324c4644fee44b9898524c09511bd33c3f12e2dfBen GruvernoViableAlt(pANTLR3_BASE_RECOGNIZER rec, pANTLR3_CYCLIC_DFA cdfa, ANTLR3_UINT32 s) 54324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 55324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // In backtracking mode, we just set the failed flag so that the 56324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // alt can just exit right now. If we are parsing though, then 57324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // we want the exception to be raised. 58324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 59324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (rec->state->backtracking > 0) 60324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 61324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rec->state->failed = ANTLR3_TRUE; 62324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 63324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver else 64324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 65324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rec->exConstruct(rec); 66324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rec->state->exception->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION; 67324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rec->state->exception->message = cdfa->description; 68324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rec->state->exception->decisionNum = cdfa->decisionNumber; 69324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver rec->state->exception->state = s; 70324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 71324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 72324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 73324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** From the input stream, predict what alternative will succeed 74324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * using this DFA (representing the covering regular approximation 75324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * to the underlying CFL). Return an alternative number 1..n. Throw 76324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * an exception upon error. 77324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 78324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API ANTLR3_INT32 79324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3dfapredict (void * ctx, pANTLR3_BASE_RECOGNIZER rec, pANTLR3_INT_STREAM is, pANTLR3_CYCLIC_DFA cdfa) 80324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 81324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_MARKER mark; 82324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_INT32 s; 83324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_INT32 specialState; 84324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_INT32 c; 85324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 86324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver mark = is->mark(is); /* Store where we are right now */ 87324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver s = 0; /* Always start with state 0 */ 88324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 89324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver for (;;) 90324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 91324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Pick out any special state entry for this state 92324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 93324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver specialState = cdfa->special[s]; 94324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 95324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Transition the special state and consume an input token 96324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 97324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (specialState >= 0) 98324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 99324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver s = cdfa->specialStateTransition(ctx, rec, is, cdfa, specialState); 100324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 101324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // Error? 102324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 103324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (s<0) 104324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 105324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // If the predicate/rule raised an exception then we leave it 106324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // in tact, else we have an NVA. 107324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver // 108324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (rec->state->error != ANTLR3_TRUE) 109324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 110324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver noViableAlt(rec,cdfa, s); 111324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 112324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver is->rewind(is, mark); 113324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return 0; 114324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 115324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver is->consume(is); 116324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver continue; 117324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 118324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 119324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Accept state? 120324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 121324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (cdfa->accept[s] >= 1) 122324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 123324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver is->rewind(is, mark); 124324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return cdfa->accept[s]; 125324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 126324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 127324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Look for a normal transition state based upon the input token element 128324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 129324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver c = is->_LA(is, 1); 130324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 131324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Check against min and max for this state 132324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 133324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (c>= cdfa->min[s] && c <= cdfa->max[s]) 134324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 135324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver ANTLR3_INT32 snext; 136324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 137324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* What is the next state? 138324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 139324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver snext = cdfa->transition[s][c - cdfa->min[s]]; 140324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 141324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (snext < 0) 142324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 143324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* Was in range but not a normal transition 144324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * must check EOT, which is like the else clause. 145324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * eot[s]>=0 indicates that an EOT edge goes to another 146324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver * state. 147324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 148324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (cdfa->eot[s] >= 0) 149324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 150324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver s = cdfa->eot[s]; 151324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver is->consume(is); 152324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver continue; 153324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 154324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver noViableAlt(rec,cdfa, s); 155324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver is->rewind(is, mark); 156324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return 0; 157324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 158324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 159324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* New current state - move to it 160324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 161324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver s = snext; 162324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver is->consume(is); 163324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver continue; 164324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 165324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* EOT Transition? 166324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 167324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if (cdfa->eot[s] >= 0) 168324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 169324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver s = cdfa->eot[s]; 170324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver is->consume(is); 171324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver continue; 172324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 173324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* EOF transition to accept state? 174324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 175324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver if ( c == ANTLR3_TOKEN_EOF && cdfa->eof[s] >= 0) 176324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver { 177324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver is->rewind(is, mark); 178324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return cdfa->accept[cdfa->eof[s]]; 179324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 180324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 181324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver /* No alt, so bomb 182324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 183324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver noViableAlt(rec, cdfa, s); 184324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver is->rewind(is, mark); 185324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return 0; 186324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver } 187324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 188324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 189324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 190324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/** Default special state implementation 191324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 192324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API ANTLR3_INT32 193324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3dfaspecialStateTransition (void * ctx, pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_INT_STREAM is, pANTLR3_CYCLIC_DFA dfa, ANTLR3_INT32 s) 194324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 195324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return -1; 196324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 197324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver 198324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver/* Default special transition implementation 199324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver */ 200324c4644fee44b9898524c09511bd33c3f12e2dfBen GruverANTLR3_API ANTLR3_INT32 201324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruverantlr3dfaspecialTransition (void * ctx, pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_INT_STREAM is, pANTLR3_CYCLIC_DFA dfa, ANTLR3_INT32 s) 202324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver{ 203324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver return 0; 204324c4644fee44b9898524c09511bd33c3f12e2dfBen Gruver} 205