1*0c56280aSSorin Basca /* 2*0c56280aSSorin Basca * Licensed to the Apache Software Foundation (ASF) under one or more 3*0c56280aSSorin Basca * contributor license agreements. See the NOTICE file distributed with 4*0c56280aSSorin Basca * this work for additional information regarding copyright ownership. 5*0c56280aSSorin Basca * The ASF licenses this file to You under the Apache License, Version 2.0 6*0c56280aSSorin Basca * (the "License"); you may not use this file except in compliance with 7*0c56280aSSorin Basca * the License. You may obtain a copy of the License at 8*0c56280aSSorin Basca * 9*0c56280aSSorin Basca * http://www.apache.org/licenses/LICENSE-2.0 10*0c56280aSSorin Basca * 11*0c56280aSSorin Basca * Unless required by applicable law or agreed to in writing, software 12*0c56280aSSorin Basca * distributed under the License is distributed on an "AS IS" BASIS, 13*0c56280aSSorin Basca * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14*0c56280aSSorin Basca * See the License for the specific language governing permissions and 15*0c56280aSSorin Basca * limitations under the License. 16*0c56280aSSorin Basca * 17*0c56280aSSorin Basca */ 18*0c56280aSSorin Basca /* Generated By:JavaCC: Do not edit this line. ASCII_CharStream.java Version 0.7pre6 */ 19*0c56280aSSorin Basca package Mini; 20*0c56280aSSorin Basca 21*0c56280aSSorin Basca /** 22*0c56280aSSorin Basca * An implementation of interface CharStream, where the stream is assumed to 23*0c56280aSSorin Basca * contain only ASCII characters (without unicode processing). 24*0c56280aSSorin Basca */ 25*0c56280aSSorin Basca 26*0c56280aSSorin Basca public final class ASCII_CharStream 27*0c56280aSSorin Basca { 28*0c56280aSSorin Basca public static final boolean staticFlag = true; 29*0c56280aSSorin Basca static int bufsize; 30*0c56280aSSorin Basca static int available; 31*0c56280aSSorin Basca static int tokenBegin; 32*0c56280aSSorin Basca static public int bufpos = -1; 33*0c56280aSSorin Basca static private int bufline[]; 34*0c56280aSSorin Basca static private int bufcolumn[]; 35*0c56280aSSorin Basca 36*0c56280aSSorin Basca static private int column = 0; 37*0c56280aSSorin Basca static private int line = 1; 38*0c56280aSSorin Basca 39*0c56280aSSorin Basca static private boolean prevCharIsCR = false; 40*0c56280aSSorin Basca static private boolean prevCharIsLF = false; 41*0c56280aSSorin Basca 42*0c56280aSSorin Basca static private java.io.Reader inputStream; 43*0c56280aSSorin Basca 44*0c56280aSSorin Basca static private char[] buffer; 45*0c56280aSSorin Basca static private int maxNextCharInd = 0; 46*0c56280aSSorin Basca static private int inBuf = 0; 47*0c56280aSSorin Basca ExpandBuff(boolean wrapAround)48*0c56280aSSorin Basca static private void ExpandBuff(boolean wrapAround) 49*0c56280aSSorin Basca { 50*0c56280aSSorin Basca char[] newbuffer = new char[bufsize + 2048]; 51*0c56280aSSorin Basca int newbufline[] = new int[bufsize + 2048]; 52*0c56280aSSorin Basca int newbufcolumn[] = new int[bufsize + 2048]; 53*0c56280aSSorin Basca 54*0c56280aSSorin Basca try 55*0c56280aSSorin Basca { 56*0c56280aSSorin Basca if (wrapAround) 57*0c56280aSSorin Basca { 58*0c56280aSSorin Basca System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); 59*0c56280aSSorin Basca System.arraycopy(buffer, 0, newbuffer, 60*0c56280aSSorin Basca bufsize - tokenBegin, bufpos); 61*0c56280aSSorin Basca buffer = newbuffer; 62*0c56280aSSorin Basca 63*0c56280aSSorin Basca System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); 64*0c56280aSSorin Basca System.arraycopy(bufline, 0, newbufline, bufsize - tokenBegin, bufpos); 65*0c56280aSSorin Basca bufline = newbufline; 66*0c56280aSSorin Basca 67*0c56280aSSorin Basca System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); 68*0c56280aSSorin Basca System.arraycopy(bufcolumn, 0, newbufcolumn, bufsize - tokenBegin, bufpos); 69*0c56280aSSorin Basca bufcolumn = newbufcolumn; 70*0c56280aSSorin Basca 71*0c56280aSSorin Basca maxNextCharInd = (bufpos += (bufsize - tokenBegin)); 72*0c56280aSSorin Basca } 73*0c56280aSSorin Basca else 74*0c56280aSSorin Basca { 75*0c56280aSSorin Basca System.arraycopy(buffer, tokenBegin, newbuffer, 0, bufsize - tokenBegin); 76*0c56280aSSorin Basca buffer = newbuffer; 77*0c56280aSSorin Basca 78*0c56280aSSorin Basca System.arraycopy(bufline, tokenBegin, newbufline, 0, bufsize - tokenBegin); 79*0c56280aSSorin Basca bufline = newbufline; 80*0c56280aSSorin Basca 81*0c56280aSSorin Basca System.arraycopy(bufcolumn, tokenBegin, newbufcolumn, 0, bufsize - tokenBegin); 82*0c56280aSSorin Basca bufcolumn = newbufcolumn; 83*0c56280aSSorin Basca 84*0c56280aSSorin Basca maxNextCharInd = (bufpos -= tokenBegin); 85*0c56280aSSorin Basca } 86*0c56280aSSorin Basca } 87*0c56280aSSorin Basca catch (Throwable t) 88*0c56280aSSorin Basca { 89*0c56280aSSorin Basca throw new Error(t.getMessage()); 90*0c56280aSSorin Basca } 91*0c56280aSSorin Basca 92*0c56280aSSorin Basca 93*0c56280aSSorin Basca bufsize += 2048; 94*0c56280aSSorin Basca available = bufsize; 95*0c56280aSSorin Basca tokenBegin = 0; 96*0c56280aSSorin Basca } 97*0c56280aSSorin Basca FillBuff()98*0c56280aSSorin Basca static private void FillBuff() throws java.io.IOException 99*0c56280aSSorin Basca { 100*0c56280aSSorin Basca if (maxNextCharInd == available) 101*0c56280aSSorin Basca { 102*0c56280aSSorin Basca if (available == bufsize) 103*0c56280aSSorin Basca { 104*0c56280aSSorin Basca if (tokenBegin > 2048) 105*0c56280aSSorin Basca { 106*0c56280aSSorin Basca bufpos = maxNextCharInd = 0; 107*0c56280aSSorin Basca available = tokenBegin; 108*0c56280aSSorin Basca } 109*0c56280aSSorin Basca else if (tokenBegin < 0) { 110*0c56280aSSorin Basca bufpos = maxNextCharInd = 0; 111*0c56280aSSorin Basca } else { 112*0c56280aSSorin Basca ExpandBuff(false); 113*0c56280aSSorin Basca } 114*0c56280aSSorin Basca } 115*0c56280aSSorin Basca else if (available > tokenBegin) { 116*0c56280aSSorin Basca available = bufsize; 117*0c56280aSSorin Basca } else if ((tokenBegin - available) < 2048) { 118*0c56280aSSorin Basca ExpandBuff(true); 119*0c56280aSSorin Basca } else { 120*0c56280aSSorin Basca available = tokenBegin; 121*0c56280aSSorin Basca } 122*0c56280aSSorin Basca } 123*0c56280aSSorin Basca 124*0c56280aSSorin Basca int i; 125*0c56280aSSorin Basca try { 126*0c56280aSSorin Basca if ((i = inputStream.read(buffer, maxNextCharInd, 127*0c56280aSSorin Basca available - maxNextCharInd)) == -1) 128*0c56280aSSorin Basca { 129*0c56280aSSorin Basca inputStream.close(); 130*0c56280aSSorin Basca throw new java.io.IOException(); 131*0c56280aSSorin Basca } else { 132*0c56280aSSorin Basca maxNextCharInd += i; 133*0c56280aSSorin Basca } 134*0c56280aSSorin Basca return; 135*0c56280aSSorin Basca } 136*0c56280aSSorin Basca catch(java.io.IOException e) { 137*0c56280aSSorin Basca --bufpos; 138*0c56280aSSorin Basca backup(0); 139*0c56280aSSorin Basca if (tokenBegin == -1) { 140*0c56280aSSorin Basca tokenBegin = bufpos; 141*0c56280aSSorin Basca } 142*0c56280aSSorin Basca throw e; 143*0c56280aSSorin Basca } 144*0c56280aSSorin Basca } 145*0c56280aSSorin Basca BeginToken()146*0c56280aSSorin Basca static public final char BeginToken() throws java.io.IOException 147*0c56280aSSorin Basca { 148*0c56280aSSorin Basca tokenBegin = -1; 149*0c56280aSSorin Basca char c = readChar(); 150*0c56280aSSorin Basca tokenBegin = bufpos; 151*0c56280aSSorin Basca 152*0c56280aSSorin Basca return c; 153*0c56280aSSorin Basca } 154*0c56280aSSorin Basca UpdateLineColumn(char c)155*0c56280aSSorin Basca static private void UpdateLineColumn(char c) 156*0c56280aSSorin Basca { 157*0c56280aSSorin Basca column++; 158*0c56280aSSorin Basca 159*0c56280aSSorin Basca if (prevCharIsLF) 160*0c56280aSSorin Basca { 161*0c56280aSSorin Basca prevCharIsLF = false; 162*0c56280aSSorin Basca line += (column = 1); 163*0c56280aSSorin Basca } 164*0c56280aSSorin Basca else if (prevCharIsCR) 165*0c56280aSSorin Basca { 166*0c56280aSSorin Basca prevCharIsCR = false; 167*0c56280aSSorin Basca if (c == '\n') 168*0c56280aSSorin Basca { 169*0c56280aSSorin Basca prevCharIsLF = true; 170*0c56280aSSorin Basca } else { 171*0c56280aSSorin Basca line += (column = 1); 172*0c56280aSSorin Basca } 173*0c56280aSSorin Basca } 174*0c56280aSSorin Basca 175*0c56280aSSorin Basca switch (c) 176*0c56280aSSorin Basca { 177*0c56280aSSorin Basca case '\r' : 178*0c56280aSSorin Basca prevCharIsCR = true; 179*0c56280aSSorin Basca break; 180*0c56280aSSorin Basca case '\n' : 181*0c56280aSSorin Basca prevCharIsLF = true; 182*0c56280aSSorin Basca break; 183*0c56280aSSorin Basca case '\t' : 184*0c56280aSSorin Basca column--; 185*0c56280aSSorin Basca column += (8 - (column & 07)); 186*0c56280aSSorin Basca break; 187*0c56280aSSorin Basca default : 188*0c56280aSSorin Basca break; 189*0c56280aSSorin Basca } 190*0c56280aSSorin Basca 191*0c56280aSSorin Basca bufline[bufpos] = line; 192*0c56280aSSorin Basca bufcolumn[bufpos] = column; 193*0c56280aSSorin Basca } 194*0c56280aSSorin Basca readChar()195*0c56280aSSorin Basca static public final char readChar() throws java.io.IOException 196*0c56280aSSorin Basca { 197*0c56280aSSorin Basca if (inBuf > 0) 198*0c56280aSSorin Basca { 199*0c56280aSSorin Basca --inBuf; 200*0c56280aSSorin Basca return (char)((char)0xff & buffer[(bufpos == bufsize - 1) ? (bufpos = 0) : ++bufpos]); 201*0c56280aSSorin Basca } 202*0c56280aSSorin Basca 203*0c56280aSSorin Basca if (++bufpos >= maxNextCharInd) { 204*0c56280aSSorin Basca FillBuff(); 205*0c56280aSSorin Basca } 206*0c56280aSSorin Basca 207*0c56280aSSorin Basca char c = (char)((char)0xff & buffer[bufpos]); 208*0c56280aSSorin Basca 209*0c56280aSSorin Basca UpdateLineColumn(c); 210*0c56280aSSorin Basca return (c); 211*0c56280aSSorin Basca } 212*0c56280aSSorin Basca getEndColumn()213*0c56280aSSorin Basca static public final int getEndColumn() { 214*0c56280aSSorin Basca return bufcolumn[bufpos]; 215*0c56280aSSorin Basca } 216*0c56280aSSorin Basca getEndLine()217*0c56280aSSorin Basca static public final int getEndLine() { 218*0c56280aSSorin Basca return bufline[bufpos]; 219*0c56280aSSorin Basca } 220*0c56280aSSorin Basca getBeginColumn()221*0c56280aSSorin Basca static public final int getBeginColumn() { 222*0c56280aSSorin Basca return bufcolumn[tokenBegin]; 223*0c56280aSSorin Basca } 224*0c56280aSSorin Basca getBeginLine()225*0c56280aSSorin Basca static public final int getBeginLine() { 226*0c56280aSSorin Basca return bufline[tokenBegin]; 227*0c56280aSSorin Basca } 228*0c56280aSSorin Basca backup(int amount)229*0c56280aSSorin Basca static public final void backup(int amount) { 230*0c56280aSSorin Basca 231*0c56280aSSorin Basca inBuf += amount; 232*0c56280aSSorin Basca if ((bufpos -= amount) < 0) { 233*0c56280aSSorin Basca bufpos += bufsize; 234*0c56280aSSorin Basca } 235*0c56280aSSorin Basca } 236*0c56280aSSorin Basca ASCII_CharStream(java.io.Reader dstream, int startline, int startcolumn, int buffersize)237*0c56280aSSorin Basca public ASCII_CharStream(java.io.Reader dstream, int startline, 238*0c56280aSSorin Basca int startcolumn, int buffersize) 239*0c56280aSSorin Basca { 240*0c56280aSSorin Basca if (inputStream != null) { 241*0c56280aSSorin Basca throw new Error("\n ERROR: Second call to the constructor of a static ASCII_CharStream. You must\n" + 242*0c56280aSSorin Basca " either use ReInit() or set the JavaCC option STATIC to false\n" + 243*0c56280aSSorin Basca " during the generation of this class."); 244*0c56280aSSorin Basca } 245*0c56280aSSorin Basca inputStream = dstream; 246*0c56280aSSorin Basca line = startline; 247*0c56280aSSorin Basca column = startcolumn - 1; 248*0c56280aSSorin Basca 249*0c56280aSSorin Basca available = bufsize = buffersize; 250*0c56280aSSorin Basca buffer = new char[buffersize]; 251*0c56280aSSorin Basca bufline = new int[buffersize]; 252*0c56280aSSorin Basca bufcolumn = new int[buffersize]; 253*0c56280aSSorin Basca } 254*0c56280aSSorin Basca ASCII_CharStream(java.io.Reader dstream, int startline, int startcolumn)255*0c56280aSSorin Basca public ASCII_CharStream(java.io.Reader dstream, int startline, 256*0c56280aSSorin Basca int startcolumn) 257*0c56280aSSorin Basca { 258*0c56280aSSorin Basca this(dstream, startline, startcolumn, 4096); 259*0c56280aSSorin Basca } ReInit(java.io.Reader dstream, int startline, int startcolumn, int buffersize)260*0c56280aSSorin Basca static public void ReInit(java.io.Reader dstream, int startline, 261*0c56280aSSorin Basca int startcolumn, int buffersize) 262*0c56280aSSorin Basca { 263*0c56280aSSorin Basca inputStream = dstream; 264*0c56280aSSorin Basca line = startline; 265*0c56280aSSorin Basca column = startcolumn - 1; 266*0c56280aSSorin Basca 267*0c56280aSSorin Basca if (buffer == null || buffersize != buffer.length) 268*0c56280aSSorin Basca { 269*0c56280aSSorin Basca available = bufsize = buffersize; 270*0c56280aSSorin Basca buffer = new char[buffersize]; 271*0c56280aSSorin Basca bufline = new int[buffersize]; 272*0c56280aSSorin Basca bufcolumn = new int[buffersize]; 273*0c56280aSSorin Basca } 274*0c56280aSSorin Basca prevCharIsLF = prevCharIsCR = false; 275*0c56280aSSorin Basca tokenBegin = inBuf = maxNextCharInd = 0; 276*0c56280aSSorin Basca bufpos = -1; 277*0c56280aSSorin Basca } 278*0c56280aSSorin Basca ReInit(java.io.Reader dstream, int startline, int startcolumn)279*0c56280aSSorin Basca static public void ReInit(java.io.Reader dstream, int startline, 280*0c56280aSSorin Basca int startcolumn) 281*0c56280aSSorin Basca { 282*0c56280aSSorin Basca ReInit(dstream, startline, startcolumn, 4096); 283*0c56280aSSorin Basca } ASCII_CharStream(java.io.InputStream dstream, int startline, int startcolumn, int buffersize)284*0c56280aSSorin Basca public ASCII_CharStream(java.io.InputStream dstream, int startline, 285*0c56280aSSorin Basca int startcolumn, int buffersize) 286*0c56280aSSorin Basca { 287*0c56280aSSorin Basca this(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096); 288*0c56280aSSorin Basca } 289*0c56280aSSorin Basca ASCII_CharStream(java.io.InputStream dstream, int startline, int startcolumn)290*0c56280aSSorin Basca public ASCII_CharStream(java.io.InputStream dstream, int startline, 291*0c56280aSSorin Basca int startcolumn) 292*0c56280aSSorin Basca { 293*0c56280aSSorin Basca this(dstream, startline, startcolumn, 4096); 294*0c56280aSSorin Basca } 295*0c56280aSSorin Basca ReInit(java.io.InputStream dstream, int startline, int startcolumn, int buffersize)296*0c56280aSSorin Basca static public void ReInit(java.io.InputStream dstream, int startline, 297*0c56280aSSorin Basca int startcolumn, int buffersize) 298*0c56280aSSorin Basca { 299*0c56280aSSorin Basca ReInit(new java.io.InputStreamReader(dstream), startline, startcolumn, 4096); 300*0c56280aSSorin Basca } ReInit(java.io.InputStream dstream, int startline, int startcolumn)301*0c56280aSSorin Basca static public void ReInit(java.io.InputStream dstream, int startline, 302*0c56280aSSorin Basca int startcolumn) 303*0c56280aSSorin Basca { 304*0c56280aSSorin Basca ReInit(dstream, startline, startcolumn, 4096); 305*0c56280aSSorin Basca } GetImage()306*0c56280aSSorin Basca static public final String GetImage() 307*0c56280aSSorin Basca { 308*0c56280aSSorin Basca if (bufpos >= tokenBegin) { 309*0c56280aSSorin Basca return new String(buffer, tokenBegin, bufpos - tokenBegin + 1); 310*0c56280aSSorin Basca } else { 311*0c56280aSSorin Basca return new String(buffer, tokenBegin, bufsize - tokenBegin) + 312*0c56280aSSorin Basca new String(buffer, 0, bufpos + 1); 313*0c56280aSSorin Basca } 314*0c56280aSSorin Basca } 315*0c56280aSSorin Basca GetSuffix(int len)316*0c56280aSSorin Basca static public final char[] GetSuffix(int len) 317*0c56280aSSorin Basca { 318*0c56280aSSorin Basca char[] ret = new char[len]; 319*0c56280aSSorin Basca 320*0c56280aSSorin Basca if ((bufpos + 1) >= len) { 321*0c56280aSSorin Basca System.arraycopy(buffer, bufpos - len + 1, ret, 0, len); 322*0c56280aSSorin Basca } else 323*0c56280aSSorin Basca { 324*0c56280aSSorin Basca System.arraycopy(buffer, bufsize - (len - bufpos - 1), ret, 0, 325*0c56280aSSorin Basca len - bufpos - 1); 326*0c56280aSSorin Basca System.arraycopy(buffer, 0, ret, len - bufpos - 1, bufpos + 1); 327*0c56280aSSorin Basca } 328*0c56280aSSorin Basca 329*0c56280aSSorin Basca return ret; 330*0c56280aSSorin Basca } 331*0c56280aSSorin Basca Done()332*0c56280aSSorin Basca static public void Done() 333*0c56280aSSorin Basca { 334*0c56280aSSorin Basca buffer = null; 335*0c56280aSSorin Basca bufline = null; 336*0c56280aSSorin Basca bufcolumn = null; 337*0c56280aSSorin Basca } 338*0c56280aSSorin Basca 339*0c56280aSSorin Basca /** 340*0c56280aSSorin Basca * Method to adjust line and column numbers for the start of a token.<BR> 341*0c56280aSSorin Basca */ adjustBeginLineColumn(int newLine, int newCol)342*0c56280aSSorin Basca static public void adjustBeginLineColumn(int newLine, int newCol) 343*0c56280aSSorin Basca { 344*0c56280aSSorin Basca int start = tokenBegin; 345*0c56280aSSorin Basca int len; 346*0c56280aSSorin Basca 347*0c56280aSSorin Basca if (bufpos >= tokenBegin) 348*0c56280aSSorin Basca { 349*0c56280aSSorin Basca len = bufpos - tokenBegin + inBuf + 1; 350*0c56280aSSorin Basca } 351*0c56280aSSorin Basca else 352*0c56280aSSorin Basca { 353*0c56280aSSorin Basca len = bufsize - tokenBegin + bufpos + 1 + inBuf; 354*0c56280aSSorin Basca } 355*0c56280aSSorin Basca 356*0c56280aSSorin Basca int i = 0, j = 0, k = 0; 357*0c56280aSSorin Basca int nextColDiff = 0, columnDiff = 0; 358*0c56280aSSorin Basca 359*0c56280aSSorin Basca while (i < len && 360*0c56280aSSorin Basca bufline[j = start % bufsize] == bufline[k = ++start % bufsize]) 361*0c56280aSSorin Basca { 362*0c56280aSSorin Basca bufline[j] = newLine; 363*0c56280aSSorin Basca nextColDiff = columnDiff + bufcolumn[k] - bufcolumn[j]; 364*0c56280aSSorin Basca bufcolumn[j] = newCol + columnDiff; 365*0c56280aSSorin Basca columnDiff = nextColDiff; 366*0c56280aSSorin Basca i++; 367*0c56280aSSorin Basca } 368*0c56280aSSorin Basca 369*0c56280aSSorin Basca if (i < len) 370*0c56280aSSorin Basca { 371*0c56280aSSorin Basca bufline[j] = newLine++; 372*0c56280aSSorin Basca bufcolumn[j] = newCol + columnDiff; 373*0c56280aSSorin Basca 374*0c56280aSSorin Basca while (i++ < len) 375*0c56280aSSorin Basca { 376*0c56280aSSorin Basca if (bufline[j = start % bufsize] != bufline[++start % bufsize]) { 377*0c56280aSSorin Basca bufline[j] = newLine++; 378*0c56280aSSorin Basca } else { 379*0c56280aSSorin Basca bufline[j] = newLine; 380*0c56280aSSorin Basca } 381*0c56280aSSorin Basca } 382*0c56280aSSorin Basca } 383*0c56280aSSorin Basca 384*0c56280aSSorin Basca line = bufline[j]; 385*0c56280aSSorin Basca column = bufcolumn[j]; 386*0c56280aSSorin Basca } 387*0c56280aSSorin Basca 388*0c56280aSSorin Basca } 389