1 /** Support functions for traversing cyclic DFA states as laid 2 * out in static initialized structures by the code generator. 3 * 4 * A DFA implemented as a set of transition tables. 5 * 6 * Any state that has a semantic predicate edge is special; those states 7 * are generated with if-then-else structures in a ->specialStateTransition() 8 * which is generated by cyclicDFA template. 9 * 10 * There are at most 32767 states (16-bit signed short). 11 * Could get away with byte sometimes but would have to generate different 12 * types and the simulation code too. For a point of reference, the Java 13 * lexer's Tokens rule DFA has 326 states roughly. 14 */ 15 16 // [The "BSD licence"] 17 // Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC 18 // http://www.temporal-wave.com 19 // http://www.linkedin.com/in/jimidle 20 // 21 // All rights reserved. 22 // 23 // Redistribution and use in source and binary forms, with or without 24 // modification, are permitted provided that the following conditions 25 // are met: 26 // 1. Redistributions of source code must retain the above copyright 27 // notice, this list of conditions and the following disclaimer. 28 // 2. Redistributions in binary form must reproduce the above copyright 29 // notice, this list of conditions and the following disclaimer in the 30 // documentation and/or other materials provided with the distribution. 31 // 3. The name of the author may not be used to endorse or promote products 32 // derived from this software without specific prior written permission. 33 // 34 // THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR 35 // IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES 36 // OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. 37 // IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, 38 // INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT 39 // NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 40 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 41 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 42 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 43 // THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 44 45 #include <antlr3defs.h> 46 #include <antlr3cyclicdfa.h> 47 48 #ifdef ANTLR3_WINDOWS 49 #pragma warning( disable : 4100 ) 50 #endif 51 52 static void 53 noViableAlt(pANTLR3_BASE_RECOGNIZER rec, pANTLR3_CYCLIC_DFA cdfa, ANTLR3_UINT32 s) 54 { 55 // In backtracking mode, we just set the failed flag so that the 56 // alt can just exit right now. If we are parsing though, then 57 // we want the exception to be raised. 58 // 59 if (rec->state->backtracking > 0) 60 { 61 rec->state->failed = ANTLR3_TRUE; 62 } 63 else 64 { 65 rec->exConstruct(rec); 66 rec->state->exception->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION; 67 rec->state->exception->message = cdfa->description; 68 rec->state->exception->decisionNum = cdfa->decisionNumber; 69 rec->state->exception->state = s; 70 } 71 } 72 73 /** From the input stream, predict what alternative will succeed 74 * using this DFA (representing the covering regular approximation 75 * to the underlying CFL). Return an alternative number 1..n. Throw 76 * an exception upon error. 77 */ 78 ANTLR3_API ANTLR3_INT32 79 antlr3dfapredict (void * ctx, pANTLR3_BASE_RECOGNIZER rec, pANTLR3_INT_STREAM is, pANTLR3_CYCLIC_DFA cdfa) 80 { 81 ANTLR3_MARKER mark; 82 ANTLR3_INT32 s; 83 ANTLR3_INT32 specialState; 84 ANTLR3_INT32 c; 85 86 mark = is->mark(is); /* Store where we are right now */ 87 s = 0; /* Always start with state 0 */ 88 89 for (;;) 90 { 91 /* Pick out any special state entry for this state 92 */ 93 specialState = cdfa->special[s]; 94 95 /* Transition the special state and consume an input token 96 */ 97 if (specialState >= 0) 98 { 99 s = cdfa->specialStateTransition(ctx, rec, is, cdfa, specialState); 100 101 // Error? 102 // 103 if (s<0) 104 { 105 // If the predicate/rule raised an exception then we leave it 106 // in tact, else we have an NVA. 107 // 108 if (rec->state->error != ANTLR3_TRUE) 109 { 110 noViableAlt(rec,cdfa, s); 111 } 112 is->rewind(is, mark); 113 return 0; 114 } 115 is->consume(is); 116 continue; 117 } 118 119 /* Accept state? 120 */ 121 if (cdfa->accept[s] >= 1) 122 { 123 is->rewind(is, mark); 124 return cdfa->accept[s]; 125 } 126 127 /* Look for a normal transition state based upon the input token element 128 */ 129 c = is->_LA(is, 1); 130 131 /* Check against min and max for this state 132 */ 133 if (c>= cdfa->min[s] && c <= cdfa->max[s]) 134 { 135 ANTLR3_INT32 snext; 136 137 /* What is the next state? 138 */ 139 snext = cdfa->transition[s][c - cdfa->min[s]]; 140 141 if (snext < 0) 142 { 143 /* Was in range but not a normal transition 144 * must check EOT, which is like the else clause. 145 * eot[s]>=0 indicates that an EOT edge goes to another 146 * state. 147 */ 148 if (cdfa->eot[s] >= 0) 149 { 150 s = cdfa->eot[s]; 151 is->consume(is); 152 continue; 153 } 154 noViableAlt(rec,cdfa, s); 155 is->rewind(is, mark); 156 return 0; 157 } 158 159 /* New current state - move to it 160 */ 161 s = snext; 162 is->consume(is); 163 continue; 164 } 165 /* EOT Transition? 166 */ 167 if (cdfa->eot[s] >= 0) 168 { 169 s = cdfa->eot[s]; 170 is->consume(is); 171 continue; 172 } 173 /* EOF transition to accept state? 174 */ 175 if ( c == ANTLR3_TOKEN_EOF && cdfa->eof[s] >= 0) 176 { 177 is->rewind(is, mark); 178 return cdfa->accept[cdfa->eof[s]]; 179 } 180 181 /* No alt, so bomb 182 */ 183 noViableAlt(rec, cdfa, s); 184 is->rewind(is, mark); 185 return 0; 186 } 187 188 } 189 190 /** Default special state implementation 191 */ 192 ANTLR3_API ANTLR3_INT32 193 antlr3dfaspecialStateTransition (void * ctx, pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_INT_STREAM is, pANTLR3_CYCLIC_DFA dfa, ANTLR3_INT32 s) 194 { 195 return -1; 196 } 197 198 /* Default special transition implementation 199 */ 200 ANTLR3_API ANTLR3_INT32 201 antlr3dfaspecialTransition (void * ctx, pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_INT_STREAM is, pANTLR3_CYCLIC_DFA dfa, ANTLR3_INT32 s) 202 { 203 return 0; 204 } 205