4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* ANTLRTokenBuffer.cpp
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * SOFTWARE RIGHTS
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * We reserve no LEGAL rights to the Purdue Compiler Construction Tool
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Set (PCCTS) -- PCCTS is in the public domain. An individual or
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * company may do whatever they wish with source code distributed with
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PCCTS or the code generated by PCCTS, including the incorporation of
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * PCCTS, or its output, into commerical software.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * We encourage users to develop software with PCCTS. However, we do ask
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * that credit is given to us for developing PCCTS. By "credit",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * we mean that if you incorporate our source code into one of your
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * programs (commercial product, research project, or otherwise) that you
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * acknowledge this fact somewhere in the documentation, research report,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * etc... If you like PCCTS and have developed a nice tool with the
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * output, please mention that you developed it using PCCTS. In
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * addition, we ask that this header remain intact in our source code.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * As long as these guidelines are kept, we expect to continue enhancing
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * this system and expect to make other tools available as they are
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * completed.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * ANTLR 1.33
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Terence Parr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Parr Research Corporation
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * with Purdue University and AHPCRC, University of Minnesota
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * 1989-2000
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef int ANTLRTokenType; // fool AToken.h into compiling
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncclass ANTLRParser; /* MR1 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#define ANTLR_SUPPORT_CODE
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "pcctscfg.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include ATOKENBUFFER_H
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include APARSER_H // MR23
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsynctypedef ANTLRAbstractToken *_ANTLRTokenPtr;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#if defined(DBG_TBUF)||defined(DBG_TBUF_MARK_REW)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic unsigned char test[1000];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef DBG_REFCOUNTTOKEN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint ANTLRRefCountToken::ctor = 0; /* MR23 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint ANTLRRefCountToken::dtor = 0; /* MR23 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncANTLRTokenBuffer::
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncANTLRTokenBuffer(ANTLRTokenStream *_input, int _k, int _chunk_size_formal) /* MR14 */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync this->input = _input;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync this->k = _k;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync buffer_size = chunk_size = _chunk_size_formal;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync buffer = (_ANTLRTokenPtr *)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync calloc(chunk_size+1,sizeof(_ANTLRTokenPtr ));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( buffer == NULL ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync panic("cannot alloc token buffer");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync buffer++; // leave the first elem empty so tp-1 is valid ptr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync tp = &buffer[0];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync last = tp-1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync next = &buffer[0];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync num_markers = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync end_of_buffer = &buffer[buffer_size-1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync threshold = &buffer[(int)(buffer_size/2)]; // MR23 - Used to be 1.0/2.0 !
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _deleteTokens = 1; // assume we delete tokens
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parser=NULL; // MR5 - uninitialized reference
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncstatic void f() {;}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncANTLRTokenBuffer::
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync~ANTLRTokenBuffer()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync f();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Delete all remaining tokens (from 0..last inclusive)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( _deleteTokens )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _ANTLRTokenPtr *z;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (z=buffer; z<=last; z++)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*z)->deref();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// z->deref();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef DBG_REFCOUNTTOKEN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* MR23 */ printMessage(stderr, "##########dtor: deleting token '%s' (ref %d)\n",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((ANTLRCommonToken *)*z)->getText(), (*z)->nref());
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( (*z)->nref()==0 )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync delete (*z);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( buffer!=NULL ) free((char *)(buffer-1));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#if defined(DBG_TBUF)||defined(DBG_TBUF_MARK_REW)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include "pccts_stdio.h"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncPCCTS_NAMESPACE_STD
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync_ANTLRTokenPtr ANTLRTokenBuffer::
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncgetToken()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( tp <= last ) // is there any buffered lookahead still to be read?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return *tp++; // read buffered lookahead
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // out of buffered lookahead, get some more "real"
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // input from getANTLRToken()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( num_markers==0 )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if( next > threshold )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef DBG_TBUF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* MR23 */ printMessage(stderr,"getToken: next > threshold (high water is %d)\n", threshold-buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync makeRoom();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( next > end_of_buffer )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef DBG_TBUF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* MR23 */ printMessage(stderr,"getToken: next > end_of_buffer (size is %d)\n", buffer_size);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync extendBuffer();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *next = getANTLRToken();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*next)->ref(); // say we have a copy of this pointer in buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync last = next;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync next++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync tp = last;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return *tp++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid ANTLRTokenBuffer::
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncrewind(int pos)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#if defined(DBG_TBUF)||defined(DBG_TBUF_MARK_REW)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* MR23 */ printMessage(stderr, "rewind(%d)[nm=%d,from=%d,%d.n=%d]\n", pos, num_markers, tp-buffer,pos,test[pos]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync test[pos]--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync tp = &buffer[pos];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync num_markers--;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This function is used to specify that the token pointers read
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * by the ANTLRTokenBuffer should be buffered up (to be reused later).
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint ANTLRTokenBuffer::
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncmark()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#if defined(DBG_TBUF)||defined(DBG_TBUF_MARK_REW)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync test[tp-buffer]++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* MR23 */ printMessage(stderr,"mark(%d)[nm=%d,%d.n=%d]\n",tp-buffer,num_markers+1,tp-buffer,test[tp-buffer]);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync num_markers++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return tp - buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * returns the token pointer n positions ahead.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This implies that bufferedToken(1) gets the NEXT symbol of lookahead.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * This is used in conjunction with the ANTLRParser lookahead buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * No markers are set or anything. A bunch of input is buffered--that's all.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * The tp pointer is left alone as the lookahead has not been advanced
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * with getToken(). The next call to getToken() will find a token
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * in the buffer and won't have to call getANTLRToken().
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * If this is called before a consume() is done, how_many_more_i_need is
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * set to 'n'.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync_ANTLRTokenPtr ANTLRTokenBuffer::
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncbufferedToken(int n)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// int how_many_more_i_need = (last-tp < 0) ? n : n-(last-tp)-1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int how_many_more_i_need = (tp > last) ? n : n-(last-tp)-1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Make sure that at least n tokens are available in the buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef DBG_TBUF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* MR23 */ printMessage(stderr, "bufferedToken(%d)\n", n);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (int i=1; i<=how_many_more_i_need; i++)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( next > end_of_buffer ) // buffer overflow?
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync extendBuffer();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *next = getANTLRToken();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*next)->ref(); // say we have a copy of this pointer in buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync last = next;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync next++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return tp[n - 1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* If no markers are set, the none of the input needs to be saved (except
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * for the lookahead Token pointers). We save only k-1 token pointers as
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * we are guaranteed to do a getANTLRToken() right after this because otherwise
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * we wouldn't have needed to extend the buffer.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * If there are markers in the buffer, we need to save things and so
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * extendBuffer() is called.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid ANTLRTokenBuffer::
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncmakeRoom()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef DBG_TBUF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* MR23 */ printMessage(stderr, "in makeRoom.................\n");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* MR23 */ printMessage(stderr, "num_markers==%d\n", num_markers);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( num_markers == 0 )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef DBG_TBUF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* MR23 */ printMessage(stderr, "moving lookahead and resetting next\n");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _ANTLRTokenPtr *r;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* MR23 */ printMessage(stderr, "tbuf = [");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (r=buffer; r<=last; r++)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( *r==NULL ) /* MR23 */ printMessage(stderr, " xxx");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else /* MR23 */ printMessage(stderr, " '%s'", ((ANTLRCommonToken *)*r)->getText());
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* MR23 */ printMessage(stderr, " ]\n");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* MR23 */ printMessage(stderr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "before: tp=%d, last=%d, next=%d, threshold=%d\n",tp-buffer,last-buffer,next-buffer,threshold-buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // Delete all tokens from 0..last-(k-1) inclusive
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( _deleteTokens )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _ANTLRTokenPtr *z;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (z=buffer; z<=last-(k-1); z++)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (*z)->deref();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// z->deref();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef DBG_REFCOUNTTOKEN
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* MR23 */ printMessage(stderr, "##########makeRoom: deleting token '%s' (ref %d)\n",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ((ANTLRCommonToken *)*z)->getText(), (*z)->nref());
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( (*z)->nref()==0 )
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync delete (*z);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // reset the buffer to initial conditions, but move k-1 symbols
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // to the beginning of buffer and put new input symbol at k
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync _ANTLRTokenPtr *p = buffer, *q = last-(k-1)+1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync// ANTLRAbstractToken **p = buffer, **q = end_of_buffer-(k-1)+1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef DBG_TBUF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* MR23 */ printMessage(stderr, "lookahead buffer = [");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (int i=1; i<=(k-1); i++)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *p++ = *q++;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef DBG_TBUF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* MR23 */ printMessage(stderr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync " '%s'", ((ANTLRCommonToken *)buffer[i-1])->getText());
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef DBG_TBUF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* MR23 */ printMessage(stderr, " ]\n");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync next = &buffer[k-1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync tp = &buffer[k-1]; // tp points to what will be filled in next
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync last = tp-1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef DBG_TBUF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* MR23 */ printMessage(stderr,
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync "after: tp=%d, last=%d, next=%d\n",
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync tp-buffer, last-buffer, next-buffer);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync extendBuffer();
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* This function extends 'buffer' by chunk_size and returns with all
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * pointers at the same relative positions in the buffer (the buffer base
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * address could have changed in realloc()) except that 'next' comes
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * back set to where the next token should be stored. All other pointers
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * are untouched.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncANTLRTokenBuffer::
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncextendBuffer()
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int save_last = last-buffer, save_tp = tp-buffer, save_next = next-buffer;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#ifdef DBG_TBUF
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync /* MR23 */ printMessage(stderr, "extending physical buffer\n");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#endif
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync buffer_size += chunk_size;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync buffer = (_ANTLRTokenPtr *)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync realloc((char *)(buffer-1),
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync (buffer_size+1)*sizeof(_ANTLRTokenPtr ));
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if ( buffer == NULL ) {
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync panic("cannot alloc token buffer");
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync }
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync buffer++; // leave the first elem empty so tp-1 is valid ptr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync tp = buffer + save_tp; // put the pointers back to same relative position
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync last = buffer + save_last;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync next = buffer + save_next;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync end_of_buffer = &buffer[buffer_size-1];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync threshold = &buffer[(int)(buffer_size*(1.0/2.0))];
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/*
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // zero out new token ptrs so we'll know if something to delete in buffer
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ANTLRAbstractToken **p = end_of_buffer-chunk_size+1;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync for (; p<=end_of_buffer; p++) *p = NULL;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync*/
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncANTLRParser * ANTLRTokenBuffer:: // MR1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncsetParser(ANTLRParser *p) { // MR1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync ANTLRParser *old=parser; // MR1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parser=p; // MR1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync input->setParser(p); // MR1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return old; // MR1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} // MR1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync // MR1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncANTLRParser * ANTLRTokenBuffer:: // MR1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncgetParser() { // MR1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return parser; // MR1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync} // MR1
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncvoid ANTLRTokenBuffer::panic(const char *msg) // MR23
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (parser) //MR23
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parser->panic(msg); //MR23
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else //MR23
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync exit(PCCTS_EXIT_FAILURE);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync//MR23
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsyncint ANTLRTokenBuffer::printMessage(FILE* pFile, const char* pFormat, ...)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync{
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync va_list marker;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync va_start( marker, pFormat );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync int iRet = 0;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync if (parser)
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync parser->printMessageV(pFile, pFormat, marker);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync else
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync iRet = vfprintf(pFile, pFormat, marker);
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync va_end( marker );
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync return iRet;
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync}
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync/* to avoid having to link in another file just for the smart token ptr
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * stuff, we include it here. Ugh.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * MR23 This causes nothing but problems for IDEs.
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync * Change from .cpp to .h
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync *
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync */
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync
4fd606d1f5abe38e1f42c38de1d2e895166bd0f4vboxsync#include ATOKPTR_IMPL_H