package jxl.biff.formula; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.Reader; import jxl.biff.WorkbookMethods; class Yylex { private final int YY_BUFFER_SIZE = 512; private final int YY_F = -1; private final int YY_NO_STATE = -1; private final int YY_NOT_ACCEPT = 0; private final int YY_START = 1; private final int YY_END = 2; private final int YY_NO_ANCHOR = 4; private final int YY_BOL = 65536; private final int YY_EOF = 65537; private boolean emptyString; private ExternalSheet externalSheet; private WorkbookMethods nameTable; private BufferedReader yy_reader; private int yy_buffer_index; private int yy_buffer_read; private int yy_buffer_start; private int yy_buffer_end; private char[] yy_buffer; private int yychar; private int yyline; private boolean yy_at_bol; private int yy_lexical_state; private boolean yy_eof_done; private final int YYSTRING = 1; private final int YYINITIAL = 0; private final int[] yy_state_dtrans; private boolean yy_last_was_cr; private final int YY_E_INTERNAL = 0; private final int YY_E_MATCH = 1; private String[] yy_error_string; private int[] yy_acpt; private int[] yy_cmap; private int[] yy_rmap; private int[][] yy_nxt; int getPos() { return this.yychar; } void setExternalSheet(ExternalSheet es) { this.externalSheet = es; } void setNameTable(WorkbookMethods nt) { this.nameTable = nt; } Yylex(Reader reader) { this(); if (null == reader) throw new Error("Error: Bad input stream initializer."); this.yy_reader = new BufferedReader(reader); } Yylex(InputStream instream) { this(); if (null == instream) throw new Error("Error: Bad input stream initializer."); this.yy_reader = new BufferedReader(new InputStreamReader(instream)); } private Yylex() { this.yy_eof_done = false; this.YYSTRING = 1; this.YYINITIAL = 0; this.yy_state_dtrans = new int[] { 0, 30 }; this.yy_last_was_cr = false; this.YY_E_INTERNAL = 0; this.YY_E_MATCH = 1; this.yy_error_string = new String[] { "Error: Internal error.\n", "Error: Unmatched input.\n" }; this.yy_acpt = new int[] { 0, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 4, 4, 4, 4, 4, 0, 4, 4, 0, 4, 4, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 4, 0, 0, 4, 0 }; this.yy_cmap = unpackFromString(1, 65538, "29:8,14:3,29:21,14,16,28,15,11,15:2,13,26,27,3,1,8,2,10,4,9:10,17,15,7,6,5,15:2,23,12:3,21,22,12:5,24,12:5,19,25,18,20,12:5,15:5,29,12:26,29,15,29,15,29:65409,0:2")[0]; this.yy_rmap = unpackFromString(1, 89, "0,1,2,1,2:2,3,2,4,2,5,2:2,1:3,2:3,6,7,1,8,9,10,11,12,13,11,14,15,1,16,17,11,2,18,19,20,21,22,23,2,24,25,1,26,27,8,28,29,30,31,32,33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48,49,13,50,51,52,53,54,55,56,14,57,20,58,59,60,2,61,62,63")[0]; this.yy_nxt = unpackFromString(64, 30, "1,2,3,4,5,6,7,8,9,10,32,40,32,43,11,85:2,12,83,32:3,88,32:3,13,14,15,-1:32,85,-1,85:10,46,85:2,86,85:9,-1:5,85,-1,85:3,16,85:6,46,85:2,86,85:9,-1:5,85,-1,85:2,17,18,85:6,46,85:2,86,85:9,-1:5,85,-1,85:6,10,48,85:2,46,85:2,86,85:9,-1:5,85,-1,85:6,19,85:3,46,85:2,86,55,85:8,-1:5,85,-1,85:6,33,34,49,34,46,85:2,86,50,34:8,21,-1:4,85,-1,85:6,22,85:3,46,85:2,86,85:9,-1:5,85,-1,85:7,35,85,35,46,85:2,86,85,35:8,-1:5,85,-1,85:6,24,85:3,46,85:2,86,68,85:8,-1:5,85,-1,85:6,44,34,85,34,46,85:2,86,85,34:8,21,-1:4,85,-1,85:7,42,85,42,46,85:2,86,85,42:8,-1:5,85,-1,85:6,27,85:3,46,85:2,86,85:9,-1:5,85,-1,85:6,29,85:3,46,85:2,86,85:9,-1:4,1,39:27,31,39,-1,85,-1,85:6,19,20,49,20,46,85:2,86,50,20:8,21,-1:4,85,-1,85:6,33,44,85,44,46,85:2,86,55,44:8,-1:13,36,-1:7,72,-1:22,45,-1,45,-1:5,45:8,-1:13,38,-1:21,39:27,-1,39,-1,85,-1,85:7,51,85,51,46,85:2,86,85,51:8,-1:5,85,-1,85:6,44,34,85,34,46,85:2,86,85,34:3,25,34:4,21,-1:4,85,-1,85:10,-1,85:12,-1:5,85,-1,85:6,44:2,85,44,46,85:2,86,85,44:8,-1:20,52,-1:14,85,-1,85:6,44,34,85,34,46,85:2,86,85,34:3,28,34:4,21,-1:4,85,-1,85:6,19,85:3,46,85:2,86,85:9,-1:5,85,-1,85:7,23,56,23,46,85:2,86,85,23:8,-1:5,85,-1,85:6,19,57,49,57,46,85:2,86,50,57:8,-1:14,58,59,58,-1:5,58:8,-1:5,85,-1,85:6,24,60,61,60,46,85:2,86,62,60:8,-1:5,85,-1,85:7,53,85,53,46,85:2,86,85,53:8,-1:5,85,-1,85:7,63,64,63,46,85:2,86,85,63:8,-1:5,85,-1,85:7,23,85,23,46,85:2,86,85,23:8,-1:5,85,-1,85:6,19,85,49,85,46,85:2,86,50,85:8,-1:13,36,65,66,65,-1:4,67,65:8,-1:14,58,-1,58,-1:5,58:8,-1:5,85,-1,85:6,24,85,61,85,46,85:2,86,62,85:8,-1:5,85,-1,85:6,24,85:3,46,85:2,86,85:9,-1:5,85,-1,85:7,26,69,26,46,85:2,86,85,26:8,-1:5,85,-1,85:6,27,70,71,70,46,85:2,86,85,70:8,-1:5,85,-1,85:7,63,85,63,46,85:2,86,85,63:8,-1:13,36,-1,66,-1:5,67,-1:21,36,-1:30,37,73,37,-1:5,37:8,-1:5,85,-1,85:7,74,75,74,46,85:2,86,85,74:8,-1:5,85,-1,85:7,26,85,26,46,85:2,86,85,26:8,-1:5,85,-1,85:6,27,85,71,85,46,85:2,86,85:9,-1:14,76,77,76,-1:5,76:8,-1:14,37,-1,37,-1:5,37:8,-1:5,85,-1,85:6,29,78,79,78,46,85:2,86,85,78:8,-1:5,85,-1,85:7,74,85,74,46,85:2,86,85,74:8,-1:13,38,80,81,80,-1:5,80:8,-1:14,76,-1,76,-1:5,76:8,-1:5,85,-1,85:6,29,85,79,85,46,85:2,86,85:9,-1:13,38,-1,81,-1:19,85,-1,85:6,33,34,49,34,46,85:2,86,50,34:2,41,34:5,21,-1:4,85,-1,85:6,19,20,49,20,46,85:2,86,50,20,82,20:6,21,-1:4,85,-1,85:6,44,34,85,34,46,85:2,86,85,34:7,47,21,-1:4,85,-1,85:7,53,54,53,46,85:2,86,85,53:8,-1:5,85,-1,85:6,33,34,49,34,46,85:2,86,50,34:6,84,34,21,-1:4,85,-1,85:6,19,20,49,20,46,85:2,86,50,20:5,87,20:2,21,-1:3"); this.yy_buffer = new char[512]; this.yy_buffer_read = 0; this.yy_buffer_index = 0; this.yy_buffer_start = 0; this.yy_buffer_end = 0; this.yychar = 0; this.yyline = 0; this.yy_at_bol = true; this.yy_lexical_state = 0; } private void yybegin(int state) { this.yy_lexical_state = state; } private int yy_advance() throws IOException { if (this.yy_buffer_index < this.yy_buffer_read) return this.yy_buffer[this.yy_buffer_index++]; if (0 != this.yy_buffer_start) { int i = this.yy_buffer_start; int j = 0; while (i < this.yy_buffer_read) { this.yy_buffer[j] = this.yy_buffer[i]; i++; j++; } this.yy_buffer_end -= this.yy_buffer_start; this.yy_buffer_start = 0; this.yy_buffer_read = j; this.yy_buffer_index = j; int next_read = this.yy_reader.read(this.yy_buffer, this.yy_buffer_read, this.yy_buffer.length - this.yy_buffer_read); if (-1 == next_read) return 65537; this.yy_buffer_read += next_read; } while (this.yy_buffer_index >= this.yy_buffer_read) { if (this.yy_buffer_index >= this.yy_buffer.length) this.yy_buffer = yy_double(this.yy_buffer); int next_read = this.yy_reader.read(this.yy_buffer, this.yy_buffer_read, this.yy_buffer.length - this.yy_buffer_read); if (-1 == next_read) return 65537; this.yy_buffer_read += next_read; } return this.yy_buffer[this.yy_buffer_index++]; } private void yy_move_end() { if (this.yy_buffer_end > this.yy_buffer_start && '\n' == this.yy_buffer[this.yy_buffer_end - 1]) this.yy_buffer_end--; if (this.yy_buffer_end > this.yy_buffer_start && '\r' == this.yy_buffer[this.yy_buffer_end - 1]) this.yy_buffer_end--; } private void yy_mark_start() { for (int i = this.yy_buffer_start; i < this.yy_buffer_index; i++) { if ('\n' == this.yy_buffer[i] && !this.yy_last_was_cr) this.yyline++; if ('\r' == this.yy_buffer[i]) { this.yyline++; this.yy_last_was_cr = true; } else { this.yy_last_was_cr = false; } } this.yychar = this.yychar + this.yy_buffer_index - this.yy_buffer_start; this.yy_buffer_start = this.yy_buffer_index; } private void yy_mark_end() { this.yy_buffer_end = this.yy_buffer_index; } private void yy_to_mark() { this.yy_buffer_index = this.yy_buffer_end; this.yy_at_bol = (this.yy_buffer_end > this.yy_buffer_start && ('\r' == this.yy_buffer[this.yy_buffer_end - 1] || '\n' == this.yy_buffer[this.yy_buffer_end - 1] || '߬' == this.yy_buffer[this.yy_buffer_end - 1] || '߭' == this.yy_buffer[this.yy_buffer_end - 1])); } private String yytext() { return new String(this.yy_buffer, this.yy_buffer_start, this.yy_buffer_end - this.yy_buffer_start); } private int yylength() { return this.yy_buffer_end - this.yy_buffer_start; } private char[] yy_double(char[] buf) { char[] newbuf = new char[2 * buf.length]; for (int i = 0; i < buf.length; i++) newbuf[i] = buf[i]; return newbuf; } private void yy_error(int code, boolean fatal) { System.out.print(this.yy_error_string[code]); System.out.flush(); if (fatal) throw new Error("Fatal Error.\n"); } private int[][] unpackFromString(int size1, int size2, String st) { int colonIndex = -1; int sequenceLength = 0; int sequenceInteger = 0; int[][] res = new int[size1][size2]; for (int i = 0; i < size1; i++) { for (int j = 0; j < size2; j++) { if (sequenceLength != 0) { res[i][j] = sequenceInteger; sequenceLength--; } else { int commaIndex = st.indexOf(','); String workString = (commaIndex == -1) ? st : st.substring(0, commaIndex); st = st.substring(commaIndex + 1); colonIndex = workString.indexOf(':'); if (colonIndex == -1) { res[i][j] = Integer.parseInt(workString); } else { String lengthString = workString.substring(colonIndex + 1); sequenceLength = Integer.parseInt(lengthString); workString = workString.substring(0, colonIndex); sequenceInteger = Integer.parseInt(workString); res[i][j] = sequenceInteger; sequenceLength--; } } } } return res; } public ParseItem yylex() throws IOException, FormulaException { int yy_anchor = 4; int yy_state = this.yy_state_dtrans[this.yy_lexical_state]; int yy_next_state = -1; int yy_last_accept_state = -1; boolean yy_initial = true; yy_mark_start(); int yy_this_accept = this.yy_acpt[yy_state]; if (0 != yy_this_accept) { yy_last_accept_state = yy_state; yy_mark_end(); } while (true) { int yy_lookahead; if (yy_initial && this.yy_at_bol) { yy_lookahead = 65536; } else { yy_lookahead = yy_advance(); } yy_next_state = -1; yy_next_state = this.yy_nxt[this.yy_rmap[yy_state]][this.yy_cmap[yy_lookahead]]; if (65537 == yy_lookahead && true == yy_initial) return null; if (-1 != yy_next_state) { yy_state = yy_next_state; yy_initial = false; yy_this_accept = this.yy_acpt[yy_state]; if (0 != yy_this_accept) { yy_last_accept_state = yy_state; yy_mark_end(); } continue; } if (-1 == yy_last_accept_state) throw new Error("Lexical Error: Unmatched Input."); yy_anchor = this.yy_acpt[yy_last_accept_state]; if (0 != (0x2 & yy_anchor)) yy_move_end(); yy_to_mark(); switch (yy_last_accept_state) { case -2: case 1: break; case 2: return new Plus(); case -3: break; case 3: return new Minus(); case -4: break; case 4: return new Multiply(); case -5: break; case 5: return new Divide(); case -6: break; case 6: return new GreaterThan(); case -7: break; case 7: return new Equal(); case -8: break; case 8: return new LessThan(); case -9: break; case 9: return new ArgumentSeparator(); case -10: break; case 10: return new IntegerValue(yytext()); case -11: case -12: case 11: break; case 12: return new RangeSeparator(); case -13: break; case 13: return new OpenParentheses(); case -14: break; case 14: return new CloseParentheses(); case -15: break; case 15: this.emptyString = true; yybegin(1); break; case -16: break; case 16: return new GreaterEqual(); case -17: break; case 17: return new NotEqual(); case -18: break; case 18: return new LessEqual(); case -19: break; case 19: return new CellReference(yytext()); case -20: break; case 20: return new NameRange(yytext(), this.nameTable); case -21: break; case 21: return new StringFunction(yytext()); case -22: break; case 22: return new DoubleValue(yytext()); case -23: break; case 23: return new ColumnRange(yytext()); case -24: break; case 24: return new CellReference3d(yytext(), this.externalSheet); case -25: break; case 25: return new BooleanValue(yytext()); case -26: break; case 26: return new ColumnRange3d(yytext(), this.externalSheet); case -27: break; case 27: return new Area(yytext()); case -28: break; case 28: return new BooleanValue(yytext()); case -29: break; case 29: return new Area3d(yytext(), this.externalSheet); case -30: break; case 30: this.emptyString = false; return new StringValue(yytext()); case -31: break; case 31: yybegin(0); if (this.emptyString) return new StringValue(""); break; case -32: break; case 33: return new CellReference(yytext()); case -33: break; case 34: return new NameRange(yytext(), this.nameTable); case -34: break; case 35: return new ColumnRange(yytext()); case -35: break; case 36: return new CellReference3d(yytext(), this.externalSheet); case -36: break; case 37: return new ColumnRange3d(yytext(), this.externalSheet); case -37: break; case 38: return new Area3d(yytext(), this.externalSheet); case -38: break; case 39: this.emptyString = false; return new StringValue(yytext()); case -39: break; case 41: return new NameRange(yytext(), this.nameTable); case -40: break; case 42: return new ColumnRange3d(yytext(), this.externalSheet); case -41: break; case 44: return new NameRange(yytext(), this.nameTable); case -42: break; case 45: return new ColumnRange3d(yytext(), this.externalSheet); case -43: break; case 47: return new NameRange(yytext(), this.nameTable); case -44: break; case 82: return new NameRange(yytext(), this.nameTable); case -45: break; case 84: return new NameRange(yytext(), this.nameTable); case -46: break; case 87: return new NameRange(yytext(), this.nameTable); case -47: break; default: yy_error(0, false); break; case -1: break; } yy_initial = true; yy_state = this.yy_state_dtrans[this.yy_lexical_state]; yy_next_state = -1; yy_last_accept_state = -1; yy_mark_start(); yy_this_accept = this.yy_acpt[yy_state]; if (0 != yy_this_accept) { yy_last_accept_state = yy_state; yy_mark_end(); } } } }