summaryrefslogtreecommitdiff
path: root/antlr/libantlr3c-3.4/src/antlr3cyclicdfa.c
diff options
context:
space:
mode:
Diffstat (limited to 'antlr/libantlr3c-3.4/src/antlr3cyclicdfa.c')
-rw-r--r--antlr/libantlr3c-3.4/src/antlr3cyclicdfa.c204
1 files changed, 204 insertions, 0 deletions
diff --git a/antlr/libantlr3c-3.4/src/antlr3cyclicdfa.c b/antlr/libantlr3c-3.4/src/antlr3cyclicdfa.c
new file mode 100644
index 0000000..82e7222
--- /dev/null
+++ b/antlr/libantlr3c-3.4/src/antlr3cyclicdfa.c
@@ -0,0 +1,204 @@
+/** Support functions for traversing cyclic DFA states as laid
+ * out in static initialized structures by the code generator.
+ *
+ * A DFA implemented as a set of transition tables.
+ *
+ * Any state that has a semantic predicate edge is special; those states
+ * are generated with if-then-else structures in a ->specialStateTransition()
+ * which is generated by cyclicDFA template.
+ *
+ * There are at most 32767 states (16-bit signed short).
+ * Could get away with byte sometimes but would have to generate different
+ * types and the simulation code too. For a point of reference, the Java
+ * lexer's Tokens rule DFA has 326 states roughly.
+ */
+
+// [The "BSD licence"]
+// Copyright (c) 2005-2009 Jim Idle, Temporal Wave LLC
+// http://www.temporal-wave.com
+// http://www.linkedin.com/in/jimidle
+//
+// All rights reserved.
+//
+// Redistribution and use in source and binary forms, with or without
+// modification, are permitted provided that the following conditions
+// are met:
+// 1. Redistributions of source code must retain the above copyright
+// notice, this list of conditions and the following disclaimer.
+// 2. Redistributions in binary form must reproduce the above copyright
+// notice, this list of conditions and the following disclaimer in the
+// documentation and/or other materials provided with the distribution.
+// 3. The name of the author may not be used to endorse or promote products
+// derived from this software without specific prior written permission.
+//
+// THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+// IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+// OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+// IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+// INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+// NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+#include <antlr3defs.h>
+#include <antlr3cyclicdfa.h>
+
+#ifdef ANTLR3_WINDOWS
+#pragma warning( disable : 4100 )
+#endif
+
+static void
+noViableAlt(pANTLR3_BASE_RECOGNIZER rec, pANTLR3_CYCLIC_DFA cdfa, ANTLR3_UINT32 s)
+{
+ // In backtracking mode, we just set the failed flag so that the
+ // alt can just exit right now. If we are parsing though, then
+ // we want the exception to be raised.
+ //
+ if (rec->state->backtracking > 0)
+ {
+ rec->state->failed = ANTLR3_TRUE;
+ }
+ else
+ {
+ rec->exConstruct(rec);
+ rec->state->exception->type = ANTLR3_NO_VIABLE_ALT_EXCEPTION;
+ rec->state->exception->message = cdfa->description;
+ rec->state->exception->decisionNum = cdfa->decisionNumber;
+ rec->state->exception->state = s;
+ }
+}
+
+/** From the input stream, predict what alternative will succeed
+ * using this DFA (representing the covering regular approximation
+ * to the underlying CFL). Return an alternative number 1..n. Throw
+ * an exception upon error.
+ */
+ANTLR3_API ANTLR3_INT32
+antlr3dfapredict (void * ctx, pANTLR3_BASE_RECOGNIZER rec, pANTLR3_INT_STREAM is, pANTLR3_CYCLIC_DFA cdfa)
+{
+ ANTLR3_MARKER mark;
+ ANTLR3_INT32 s;
+ ANTLR3_INT32 specialState;
+ ANTLR3_INT32 c;
+
+ mark = is->mark(is); /* Store where we are right now */
+ s = 0; /* Always start with state 0 */
+
+ for (;;)
+ {
+ /* Pick out any special state entry for this state
+ */
+ specialState = cdfa->special[s];
+
+ /* Transition the special state and consume an input token
+ */
+ if (specialState >= 0)
+ {
+ s = cdfa->specialStateTransition(ctx, rec, is, cdfa, specialState);
+
+ // Error?
+ //
+ if (s<0)
+ {
+ // If the predicate/rule raised an exception then we leave it
+ // in tact, else we have an NVA.
+ //
+ if (rec->state->error != ANTLR3_TRUE)
+ {
+ noViableAlt(rec,cdfa, s);
+ }
+ is->rewind(is, mark);
+ return 0;
+ }
+ is->consume(is);
+ continue;
+ }
+
+ /* Accept state?
+ */
+ if (cdfa->accept[s] >= 1)
+ {
+ is->rewind(is, mark);
+ return cdfa->accept[s];
+ }
+
+ /* Look for a normal transition state based upon the input token element
+ */
+ c = is->_LA(is, 1);
+
+ /* Check against min and max for this state
+ */
+ if (c>= cdfa->min[s] && c <= cdfa->max[s])
+ {
+ ANTLR3_INT32 snext;
+
+ /* What is the next state?
+ */
+ snext = cdfa->transition[s][c - cdfa->min[s]];
+
+ if (snext < 0)
+ {
+ /* Was in range but not a normal transition
+ * must check EOT, which is like the else clause.
+ * eot[s]>=0 indicates that an EOT edge goes to another
+ * state.
+ */
+ if (cdfa->eot[s] >= 0)
+ {
+ s = cdfa->eot[s];
+ is->consume(is);
+ continue;
+ }
+ noViableAlt(rec,cdfa, s);
+ is->rewind(is, mark);
+ return 0;
+ }
+
+ /* New current state - move to it
+ */
+ s = snext;
+ is->consume(is);
+ continue;
+ }
+ /* EOT Transition?
+ */
+ if (cdfa->eot[s] >= 0)
+ {
+ s = cdfa->eot[s];
+ is->consume(is);
+ continue;
+ }
+ /* EOF transition to accept state?
+ */
+ if ( c == ANTLR3_TOKEN_EOF && cdfa->eof[s] >= 0)
+ {
+ is->rewind(is, mark);
+ return cdfa->accept[cdfa->eof[s]];
+ }
+
+ /* No alt, so bomb
+ */
+ noViableAlt(rec, cdfa, s);
+ is->rewind(is, mark);
+ return 0;
+ }
+
+}
+
+/** Default special state implementation
+ */
+ANTLR3_API ANTLR3_INT32
+antlr3dfaspecialStateTransition (void * ctx, pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_INT_STREAM is, pANTLR3_CYCLIC_DFA dfa, ANTLR3_INT32 s)
+{
+ return -1;
+}
+
+/* Default special transition implementation
+ */
+ANTLR3_API ANTLR3_INT32
+antlr3dfaspecialTransition (void * ctx, pANTLR3_BASE_RECOGNIZER recognizer, pANTLR3_INT_STREAM is, pANTLR3_CYCLIC_DFA dfa, ANTLR3_INT32 s)
+{
+ return 0;
+}