From bd9e6617827818fd043452c08c606f07b78014a0 Mon Sep 17 00:00:00 2001 From: toma Date: Wed, 25 Nov 2009 17:56:58 +0000 Subject: Copy the KDE 3.5 branch to branches/trinity for new KDE 3.5 features. BUG:215923 git-svn-id: svn://anonsvn.kde.org/home/kde/branches/trinity/kdesdk@1054174 283d02a7-25f6-0310-bc7c-ecb5cbfe19da --- poxml/antlr/src/TokenBuffer.cpp | 107 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 107 insertions(+) create mode 100644 poxml/antlr/src/TokenBuffer.cpp (limited to 'poxml/antlr/src/TokenBuffer.cpp') diff --git a/poxml/antlr/src/TokenBuffer.cpp b/poxml/antlr/src/TokenBuffer.cpp new file mode 100644 index 00000000..ded5df9b --- /dev/null +++ b/poxml/antlr/src/TokenBuffer.cpp @@ -0,0 +1,107 @@ +/** + * SOFTWARE RIGHTS + *

+ * ANTLR 2.6.0 MageLang Insitute, 1998 + *

+ * We reserve no legal rights to the ANTLR--it is fully in the + * public domain. An individual or company may do whatever + * they wish with source code distributed with ANTLR or the + * code generated by ANTLR, including the incorporation of + * ANTLR, or its output, into commerical software. + *

+ * We encourage users to develop software with ANTLR. However, + * we do ask that credit is given to us for developing + * ANTLR. By "credit", we mean that if you use ANTLR or + * incorporate any source code into one of your programs + * (commercial product, research project, or otherwise) that + * you acknowledge this fact somewhere in the documentation, + * research report, etc... If you like ANTLR and have + * developed a nice tool with the output, please mention that + * you developed it using ANTLR. In addition, we ask that the + * headers remain intact in our source code. As long as these + * guidelines are kept, we expect to continue enhancing this + * system and expect to make other tools available as they are + * completed. + *

+ * The ANTLR gang: + * @version ANTLR 2.6.0 MageLang Insitute, 1998 + * @author Terence Parr, MageLang Institute + * @author
John Lilley, Empathy Software + * @author
Pete Wells + */ + +#include "antlr/TokenBuffer.hpp" + +ANTLR_BEGIN_NAMESPACE(antlr) + +/**A Stream of Token objects fed to the parser from a TokenStream that can + * be rewound via mark()/rewind() methods. + *

+ * A dynamic array is used to buffer up all the input tokens. Normally, + * "k" tokens are stored in the buffer. More tokens may be stored during + * guess mode (testing syntactic predicate), or when LT(i>k) is referenced. + * Consumption of tokens is deferred. In other words, reading the next + * token is not done by conume(), but deferred until needed by LA or LT. + *

+ * + * @see antlr.Token + * @see antlr.TokenStream + * @see antlr.TokenQueue + */ + +/** Create a token buffer */ +TokenBuffer::TokenBuffer(TokenStream& input_) +: input(input_) +{ nMarkers=0; markerOffset=0; numToConsume=0; } + +/** Mark another token for deferred consumption */ +void TokenBuffer::consume() +{ numToConsume++; } + +/** Ensure that the token buffer is sufficiently full */ +void TokenBuffer::fill(int amount) +{ + syncConsume(); + // Fill the buffer sufficiently to hold needed tokens + while (queue.entries() < amount + markerOffset) { + // Append the next token + queue.append(input.nextToken()); + } +} + +/** Get a lookahead token value */ +int TokenBuffer::LA(int i) +{ + fill(i); + return queue.elementAt(markerOffset+i-1)->type; +} + +/** Get a lookahead token */ +RefToken TokenBuffer::LT(int i) +{ + fill(i); + return queue.elementAt(markerOffset+i-1); +} + +/**Return an integer marker that can be used to rewind the buffer to + * its current state. + */ +int TokenBuffer::mark() +{ + syncConsume(); + nMarkers++; + return markerOffset; +} + +/**Rewind the token buffer to a marker. + * @param mark Marker returned previously from mark() + */ +void TokenBuffer::rewind(int mark) +{ + syncConsume(); + markerOffset=mark; + nMarkers--; +} + +ANTLR_END_NAMESPACE + -- cgit v1.2.1