templates.gwt.SimpleCharStream.template Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of javacc Show documentation
Show all versions of javacc Show documentation
JavaCC is a parser/scanner generator for Java.
/**
* An implementation of interface CharStream, where the stream is assumed to
* contain only ASCII characters (without unicode processing).
*/
${SUPPORT_CLASS_VISIBILITY_PUBLIC?public :}class SimpleCharStream
{
/** Whether parser is static. */
public static final boolean staticFlag = ${STATIC};
${PREFIX}int bufsize;
${PREFIX}int available;
${PREFIX}int tokenBegin;
/** Position in buffer. */
${PREFIX}public int bufpos = -1;
#if KEEP_LINE_COLUMN
${PREFIX}protected int bufline[];
${PREFIX}protected int bufcolumn[];
${PREFIX}protected int column = 0;
${PREFIX}protected int line = 1;
${PREFIX}protected boolean prevCharIsCR = false;
${PREFIX}protected boolean prevCharIsLF = false;
#fi
${PREFIX}protected Provider inputStream;
${PREFIX}protected char[] buffer;
${PREFIX}protected int maxNextCharInd = 0;
${PREFIX}protected int inBuf = 0;
${PREFIX}protected int tabSize = 1;
#if KEEP_LINE_COLUMN
${PREFIX}protected boolean trackLineColumn = true;
#else
${PREFIX}protected boolean trackLineColumn = false;
#fi
${PREFIX}public void setTabSize(int i) { tabSize = i; }
${PREFIX}public int getTabSize() { return tabSize; }
${PREFIX}protected void ExpandBuff(boolean wrapAround)
{
char[] newbuffer = new char[bufsize + 2048];
#if KEEP_LINE_COLUMN
int newbufline[] = new int[bufsize + 2048];
int newbufcolumn[] = new int[bufsize + 2048];
#fi
try
{
if (wrapAround)
{
System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
System.arraycopy(buffer, 0, newbuffer, bufsize - tokenBegin, bufpos);
buffer = newbuffer;
#if KEEP_LINE_COLUMN
System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos);
bufline = newbufline;
System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos);
bufcolumn = newbufcolumn;
#fi
maxNextCharInd = (bufpos += (bufsize - tokenBegin));
}
else
{
System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin);
buffer = newbuffer;
#if KEEP_LINE_COLUMN
System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin);
bufline = newbufline;
System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin);
bufcolumn = newbufcolumn;
#fi
maxNextCharInd = (bufpos -= tokenBegin);
}
}
catch (Throwable t)
{
throw new ${LEGACY_EXCEPTION_HANDLING?Error:RuntimeException}(t.getMessage());
}
bufsize += 2048;
available = bufsize;
tokenBegin = 0;
}
${PREFIX}protected void FillBuff() throws java.io.IOException
{
if (maxNextCharInd == available)
{
if (available == bufsize)
{
if (tokenBegin > 2048)
{
bufpos = maxNextCharInd = 0;
available = tokenBegin;
}
else if (tokenBegin < 0)
bufpos = maxNextCharInd = 0;
else
ExpandBuff(false);
}
else if (available > tokenBegin)
available = bufsize;
else if ((tokenBegin - available) < 2048)
ExpandBuff(true);
else
available = tokenBegin;
}
int i;
try {
if ((i = inputStream.read(buffer, maxNextCharInd, available - maxNextCharInd)) == -1)
{
inputStream.close();
throw new java.io.IOException();
}
else
maxNextCharInd += i;
return;
}
catch(java.io.IOException e) {
--bufpos;
backup(0);
if (tokenBegin == -1)
tokenBegin = bufpos;
throw e;
}
}
/** Start. */
${PREFIX}public char BeginToken() throws java.io.IOException
{
tokenBegin = -1;
char c = readChar();
tokenBegin = bufpos;
return c;
}
#if KEEP_LINE_COLUMN
${PREFIX}protected void UpdateLineColumn(char c)
{
column++;
if (prevCharIsLF)
{
prevCharIsLF = false;
line += (column = 1);
}
else if (prevCharIsCR)
{
prevCharIsCR = false;
if (c == '\n')
{
prevCharIsLF = true;
}
else
line += (column = 1);
}
switch (c)
{
case '\r' :
prevCharIsCR = true;
break;
case '\n' :
prevCharIsLF = true;
break;
case '\t' :
column--;
column += (tabSize - (column % tabSize));
break;
default :
break;
}
bufline[bufpos] = line;
bufcolumn[bufpos] = column;
}
#fi
/** Read a character. */
${PREFIX}public char readChar() throws java.io.IOException
{
if (inBuf > 0)
{
--inBuf;
if (++bufpos == bufsize)
bufpos = 0;
return buffer[bufpos];
}
if (++bufpos >= maxNextCharInd)
FillBuff();
char c = buffer[bufpos];
#if KEEP_LINE_COLUMN
UpdateLineColumn(c);
#fi
return c;
}
#if GENERATE_ANNOTATIONS
@Deprecated
#fi
/**
* @deprecated
* @see #getEndColumn
*/
${PREFIX}public int getColumn() {
#if KEEP_LINE_COLUMN
return bufcolumn[bufpos];
#else
return -1;
#fi
}
#if GENERATE_ANNOTATIONS
@Deprecated
#fi
/**
* @deprecated
* @see #getEndLine
*/
${PREFIX}public int getLine() {
#if KEEP_LINE_COLUMN
return bufline[bufpos];
#else
return -1;
#fi
}
/** Get token end column number. */
${PREFIX}public int getEndColumn() {
#if KEEP_LINE_COLUMN
return bufcolumn[bufpos];
#else
return -1;
#fi
}
/** Get token end line number. */
${PREFIX}public int getEndLine() {
#if KEEP_LINE_COLUMN
return bufline[bufpos];
#else
return -1;
#fi
}
/** Get token beginning column number. */
${PREFIX}public int getBeginColumn() {
#if KEEP_LINE_COLUMN
return bufcolumn[tokenBegin];
#else
return -1;
#fi
}
/** Get token beginning line number. */
${PREFIX}public int getBeginLine() {
#if KEEP_LINE_COLUMN
return bufline[tokenBegin];
#else
return -1;
#fi
}
/** Backup a number of characters. */
${PREFIX}public void backup(int amount) {
inBuf += amount;
if ((bufpos -= amount) < 0)
bufpos += bufsize;
}
/** Constructor. */
public SimpleCharStream(Provider dstream, int startline,
int startcolumn, int buffersize)
{
#if STATIC
if (inputStream != null)
throw new ${LEGACY_EXCEPTION_HANDLING?Error:RuntimeException}("\n ERROR: Second call to the constructor of a static SimpleCharStream.\n" +
" You must either use ReInit() or set the JavaCC option STATIC to false\n" +
" during the generation of this class.");
#fi
inputStream = dstream;
#if KEEP_LINE_COLUMN
line = startline;
column = startcolumn - 1;
#fi
available = bufsize = buffersize;
buffer = new char[buffersize];
#if KEEP_LINE_COLUMN
bufline = new int[buffersize];
bufcolumn = new int[buffersize];
#fi
}
/** Constructor. */
public SimpleCharStream(Provider dstream, int startline,
int startcolumn)
{
this(dstream, startline, startcolumn, 4096);
}
/** Constructor. */
public SimpleCharStream(Provider dstream)
{
this(dstream, 1, 1, 4096);
}
/** Reinitialise. */
public void ReInit(Provider dstream, int startline,
int startcolumn, int buffersize)
{
inputStream = dstream;
#if KEEP_LINE_COLUMN
line = startline;
column = startcolumn - 1;
#fi
if (buffer == null || buffersize != buffer.length)
{
available = bufsize = buffersize;
buffer = new char[buffersize];
#if KEEP_LINE_COLUMN
bufline = new int[buffersize];
bufcolumn = new int[buffersize];
#fi
}
#if KEEP_LINE_COLUMN
prevCharIsLF = prevCharIsCR = false;
#fi
tokenBegin = inBuf = maxNextCharInd = 0;
bufpos = -1;
}
/** Reinitialise. */
public void ReInit(Provider dstream, int startline,
int startcolumn)
{
ReInit(dstream, startline, startcolumn, 4096);
}
/** Reinitialise. */
public void ReInit(Provider dstream)
{
ReInit(dstream, 1, 1, 4096);
}
/** Get token literal value. */
${PREFIX}public String GetImage()
{
if (bufpos >= tokenBegin)
return new String(buffer, tokenBegin, bufpos - tokenBegin + 1);
else
return new String(buffer, tokenBegin, bufsize - tokenBegin) +
new String(buffer, 0, bufpos + 1);
}
/** Get the suffix. */
${PREFIX}public char[] GetSuffix(int len)
{
char[] ret = new char[len];
if ((bufpos + 1) >= len)
System.arraycopy(buffer, bufpos - len + 1, ret, 0, len);
else
{
System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0,
len - bufpos - 1);
System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1);
}
return ret;
}
/** Reset buffer when finished. */
${PREFIX}public void Done()
{
buffer = null;
#if KEEP_LINE_COLUMN
bufline = null;
bufcolumn = null;
#fi
}
#if KEEP_LINE_COLUMN
/**
* Method to adjust line and column numbers for the start of a token.
*/
${PREFIX}public void adjustBeginLineColumn(int newLine, int newCol)
{
int start = tokenBegin;
int len;
if (bufpos >= tokenBegin)
{
len = bufpos - tokenBegin + inBuf + 1;
}
else
{
len = bufsize - tokenBegin + bufpos + 1 + inBuf;
}
int i = 0, j = 0, k = 0;
int nextColDiff = 0, columnDiff = 0;
while (i < len && bufline[j = start % bufsize] == bufline[k = ++start % bufsize])
{
bufline[j] = newLine;
nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j];
bufcolumn[j] = newCol + columnDiff;
columnDiff = nextColDiff;
i++;
}
if (i < len)
{
bufline[j] = newLine++;
bufcolumn[j] = newCol + columnDiff;
while (i++ < len)
{
if (bufline[j = start % bufsize] != bufline[++start % bufsize])
bufline[j] = newLine++;
else
bufline[j] = newLine;
}
}
line = bufline[j];
column = bufcolumn[j];
}
${PREFIX}boolean getTrackLineColumn() { return trackLineColumn; }
${PREFIX}void setTrackLineColumn(boolean tlc) { trackLineColumn = tlc; }
#fi
}