/******************************************************************************* * Copyright (c) 2006-2010 eBay Inc. All Rights Reserved. * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 *******************************************************************************/ /* The following code was generated by JFlex 1.4.1 on 1/14/10 9:34 AM */ /************************************************************************ This is a lexer specification file for JSON. The JSONLexer.java is generated from this file using jflex 1.4.1 Any time this file is modified, please follow the steps below to generate JSONLexer.java 1. In a command window, chdir to this directory. 2. run java -jar jflex.jar json.flex from this directory and copy the generated JSONLexer.java to runtime\binding-framework\src\main\java\org\ebayopensource\turmeric\binding\impl\parser\json to override the existing file. You may need to modify your gen.bat to point to your jflex 1.4.1 jflex can be downloaded from http://jflex.de/ or from \\d-sjc-wdeng1\Software\jflex-1.4.1. 3. manually change the generated JSONLexer.java to make it able to handle utf16 by change: int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput] ]; to int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput > 255 ? 255 : zzInput] ]; ************************************************************************/ package org.ebayopensource.turmeric.runtime.binding.impl.parser.json; import org.ebayopensource.turmeric.runtime.binding.impl.parser.ParseException; /** * This class is a scanner generated by * <a href="http://www.jflex.de/">JFlex</a> 1.4.1 * on 1/14/10 9:34 AM from the specification file * <tt>json.flex</tt> */ public class JSONLexer { /** This character denotes the end of file */ public static final int YYEOF = -1; /** initial size of the lookahead buffer */ private static final int ZZ_BUFFERSIZE = 16384; /** lexical states */ public static final int STRING = 2; public static final int VALUE_STRING = 1; public static final int YYINITIAL = 0; public static final int NAME_STRING = 1; /** * Translates characters to character classes */ private static final char [] ZZ_CMAP = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 11, 0, 12, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 12, 0, 14, 0, 0, 0, 0, 0, 0, 0, 0, 9, 15, 2, 7, 35, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 16, 0, 0, 0, 0, 0, 0, 31, 8, 8, 8, 3, 30, 0, 0, 0, 0, 0, 32, 0, 0, 0, 0, 0, 24, 33, 23, 25, 0, 0, 0, 0, 0, 17, 13, 18, 0, 0, 0, 27, 34, 8, 8, 1, 26, 0, 0, 0, 0, 0, 28, 0, 5, 0, 0, 0, 21, 29, 6, 22, 0, 0, 0, 0, 0, 19, 0, 20, 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, 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, 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, 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 }; /** * Translates DFA states to action switch labels. */ private static final int [] ZZ_ACTION = zzUnpackAction(); private static final String ZZ_ACTION_PACKED_0 = "\3\0\2\1\1\2\2\1\2\3\1\4\1\5\1\6"+ "\1\7\1\10\1\11\1\12\3\1\1\13\1\14\2\15"+ "\1\1\1\16\7\0\1\17\1\20\1\21\1\22\1\23"+ "\1\24\1\17\1\25\1\26\1\27\1\0\2\2\6\0"+ "\1\30\1\31\3\0\1\32\1\0\1\33"; private static int [] zzUnpackAction() { int [] result = new int[60]; int offset = 0; offset = zzUnpackAction(ZZ_ACTION_PACKED_0, offset, result); return result; } private static int zzUnpackAction(String packed, int offset, int [] result) { int i = 0; /* index in packed string */ int j = offset; /* index in unpacked array */ int l = packed.length(); while (i < l) { int count = packed.charAt(i++); int value = packed.charAt(i++); do result[j++] = value; while (--count > 0); } return j; } /** * Translates a state to a row index in the transition table */ private static final int [] ZZ_ROWMAP = zzUnpackRowMap(); private static final String ZZ_ROWMAP_PACKED_0 = "\0\0\0\44\0\110\0\154\0\220\0\264\0\330\0\374"+ "\0\u0120\0\154\0\154\0\154\0\154\0\154\0\154\0\154"+ "\0\154\0\u0144\0\u0168\0\u018c\0\u01b0\0\154\0\u01d4\0\154"+ "\0\u01f8\0\154\0\u021c\0\u0240\0\u0264\0\u0288\0\u02ac\0\u02d0"+ "\0\u02f4\0\154\0\154\0\154\0\154\0\154\0\154\0\u0318"+ "\0\154\0\154\0\154\0\u033c\0\u033c\0\u0360\0\u0384\0\u03a8"+ "\0\u03cc\0\u03f0\0\u0414\0\u0438\0\154\0\154\0\u045c\0\u0480"+ "\0\u04a4\0\154\0\u04c8\0\154"; private static int [] zzUnpackRowMap() { int [] result = new int[60]; int offset = 0; offset = zzUnpackRowMap(ZZ_ROWMAP_PACKED_0, offset, result); return result; } private static int zzUnpackRowMap(String packed, int offset, int [] result) { int i = 0; /* index in packed string */ int j = offset; /* index in unpacked array */ int l = packed.length(); while (i < l) { int high = packed.charAt(i++) << 16; result[j++] = high | packed.charAt(i++); } return j; } /** * The transition table of the DFA */ private static final int ZZ_TRANS [] = { 3, 3, 4, 3, 5, 6, 7, 3, 3, 3, 8, 9, 9, 3, 10, 11, 12, 13, 14, 15, 16, 3, 3, 17, 3, 3, 18, 3, 3, 3, 19, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, -1, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 20, 20, 20, 20, 20, 20, 20, 21, 20, 20, 22, 23, 20, 24, 25, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 5, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 26, -1, 26, 5, -1, -1, 27, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 28, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 9, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 29, -1, -1, 30, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 31, -1, -1, -1, 32, -1, -1, -1, -1, 20, 20, 20, 20, 20, 20, 20, -1, 20, 20, -1, -1, 20, -1, -1, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 23, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 33, 33, 33, 33, 33, 34, 35, 33, 33, 33, 33, -1, 33, 36, 37, 33, 33, 33, 33, 33, 33, 38, 39, 33, 33, 33, 40, 33, 33, 33, 33, 33, 33, 33, 41, 42, -1, -1, 43, -1, 44, -1, -1, -1, -1, 43, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 46, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 47, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 48, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 49, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 50, -1, -1, -1, -1, 51, -1, 51, 51, -1, -1, -1, 51, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 51, 51, -1, -1, 51, 51, -1, -1, 51, -1, -1, -1, -1, -1, 44, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 26, -1, 26, 45, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 52, -1, -1, -1, -1, -1, -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 53, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 54, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 55, -1, -1, -1, 56, -1, 56, 56, -1, -1, -1, 56, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 56, 56, -1, -1, 56, 56, -1, -1, 56, -1, -1, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 57, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 58, -1, 58, 58, -1, -1, -1, 58, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 58, 58, -1, -1, 58, 58, -1, -1, 58, -1, -1, 59, -1, 59, 59, -1, -1, -1, 59, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, 59, 59, -1, -1, 59, 59, -1, -1, 59, -1, }; /* error codes */ private static final int ZZ_UNKNOWN_ERROR = 0; private static final int ZZ_NO_MATCH = 1; private static final int ZZ_PUSHBACK_2BIG = 2; /* error messages for the codes above */ private static final String ZZ_ERROR_MSG[] = { "Unkown internal scanner error", "Error: could not match input", "Error: pushback value was too large" }; /** * ZZ_ATTRIBUTE[aState] contains the attributes of state <code>aState</code> */ private static final int [] ZZ_ATTRIBUTE = zzUnpackAttribute(); private static final String ZZ_ATTRIBUTE_PACKED_0 = "\3\0\1\11\5\1\10\11\4\1\1\11\1\1\1\11"+ "\1\1\1\11\7\0\6\11\1\1\3\11\1\0\2\1"+ "\6\0\2\11\3\0\1\11\1\0\1\11"; private static int [] zzUnpackAttribute() { int [] result = new int[60]; int offset = 0; offset = zzUnpackAttribute(ZZ_ATTRIBUTE_PACKED_0, offset, result); return result; } private static int zzUnpackAttribute(String packed, int offset, int [] result) { int i = 0; /* index in packed string */ int j = offset; /* index in unpacked array */ int l = packed.length(); while (i < l) { int count = packed.charAt(i++); int value = packed.charAt(i++); do result[j++] = value; while (--count > 0); } return j; } /** the input device */ private java.io.Reader zzReader; /** the current state of the DFA */ private int zzState; /** the current lexical state */ private int zzLexicalState = YYINITIAL; /** this buffer contains the current text to be matched and is the source of the yytext() string */ private char zzBuffer[] = new char[ZZ_BUFFERSIZE]; /** the textposition at the last accepting state */ private int zzMarkedPos; /** the textposition at the last state to be included in yytext */ private int zzPushbackPos; /** the current text position in the buffer */ private int zzCurrentPos; /** startRead marks the beginning of the yytext() string in the buffer */ private int zzStartRead; /** endRead marks the last character in the buffer, that has been read from input */ private int zzEndRead; /** number of newlines encountered up to the start of the matched text */ private int yyline; /** the number of characters up to the start of the matched text */ private int yychar; /** * the number of characters from the last newline up to the start of the * matched text */ private int yycolumn; /** * zzAtBOL == true <=> the scanner is currently at the beginning of a line */ private boolean zzAtBOL = true; /** zzAtEOF == true <=> the scanner is at the EOF */ private boolean zzAtEOF; /* user code: */ private static int NUMBER_TOKEN_TYPES = JSONTokenType.values().length; private static final char[][] SPECIAL_CHARS = new char[NUMBER_TOKEN_TYPES][6]; static { for (int i=0; i<SPECIAL_CHARS.length; i++) { for (int j=0; j<6; j++) { SPECIAL_CHARS[i][j] = (char) 0; } } SPECIAL_CHARS[JSONTokenType.LPAR.ordinal()][0]='('; SPECIAL_CHARS[JSONTokenType.RPAR.ordinal()][0]=')'; SPECIAL_CHARS[JSONTokenType.COMMA.ordinal()][0]=','; SPECIAL_CHARS[JSONTokenType.COLON.ordinal()][0]=':'; SPECIAL_CHARS[JSONTokenType.LBLANKET.ordinal()][0]='['; SPECIAL_CHARS[JSONTokenType.RBLANKET.ordinal()][0]=']'; SPECIAL_CHARS[JSONTokenType.LCURLY.ordinal()][0]='{'; SPECIAL_CHARS[JSONTokenType.RCURLY.ordinal()][0]='}'; SPECIAL_CHARS[JSONTokenType.FALSE.ordinal()][0]='f'; SPECIAL_CHARS[JSONTokenType.FALSE.ordinal()][1]='a'; SPECIAL_CHARS[JSONTokenType.FALSE.ordinal()][2]='l'; SPECIAL_CHARS[JSONTokenType.FALSE.ordinal()][3]='s'; SPECIAL_CHARS[JSONTokenType.FALSE.ordinal()][4]='e'; SPECIAL_CHARS[JSONTokenType.TRUE.ordinal()][0]='t'; SPECIAL_CHARS[JSONTokenType.TRUE.ordinal()][1]='r'; SPECIAL_CHARS[JSONTokenType.TRUE.ordinal()][2]='u'; SPECIAL_CHARS[JSONTokenType.TRUE.ordinal()][3]='e'; SPECIAL_CHARS[JSONTokenType.NULL.ordinal()][0]='n'; SPECIAL_CHARS[JSONTokenType.NULL.ordinal()][1]='u'; SPECIAL_CHARS[JSONTokenType.NULL.ordinal()][2]='l'; SPECIAL_CHARS[JSONTokenType.NULL.ordinal()][3]='l'; } StringBuilder string = new StringBuilder(16); int prefixEnd = -1; public int getRow() { return yyline; } public int getColumn() { return yycolumn; } JSONToken createToken(JSONTokenType type) { JSONToken token = new JSONToken(type, yyline, yycolumn); if (type != JSONTokenType.STRING) { int len = zzMarkedPos-zzStartRead; token.m_chars = new char[len]; System.arraycopy(zzBuffer, zzStartRead, token.m_chars, 0, len); return token; } char[] specialChars = SPECIAL_CHARS[type.ordinal()]; if ((char) 0 != specialChars[0]) { token.m_chars = (char[])specialChars; return token; } char[] chars = string.toString().toCharArray(); int len = string.length(); token.m_chars = new char[len]; System.arraycopy(chars, 0, token.m_chars, 0, len); token.m_prefixEnd = prefixEnd; return token; } /** * Creates a new scanner * There is also a java.io.InputStream version of this constructor. * * @param in the java.io.Reader to read input from. */ public JSONLexer(java.io.Reader in) { this.zzReader = in; } /** * Creates a new scanner. * There is also java.io.Reader version of this constructor. * * @param in the java.io.Inputstream to read input from. */ public JSONLexer(java.io.InputStream in) { this(new java.io.InputStreamReader(in)); } /** * Refills the input buffer. * * @return <code>false</code>, iff there was new input. * * @exception java.io.IOException if any I/O-Error occurs */ private boolean zzRefill() throws java.io.IOException { /* first: make room (if you can) */ if (zzStartRead > 0) { System.arraycopy(zzBuffer, zzStartRead, zzBuffer, 0, zzEndRead-zzStartRead); /* translate stored positions */ zzEndRead-= zzStartRead; zzCurrentPos-= zzStartRead; zzMarkedPos-= zzStartRead; zzPushbackPos-= zzStartRead; zzStartRead = 0; } /* is the buffer big enough? */ if (zzCurrentPos >= zzBuffer.length) { /* if not: blow it up */ char newBuffer[] = new char[zzCurrentPos*2]; System.arraycopy(zzBuffer, 0, newBuffer, 0, zzBuffer.length); zzBuffer = newBuffer; } /* finally: fill the buffer with new input */ int numRead = zzReader.read(zzBuffer, zzEndRead, zzBuffer.length-zzEndRead); if (numRead < 0) { return true; } else { zzEndRead+= numRead; return false; } } /** * Closes the input stream. */ public final void yyclose() throws java.io.IOException { zzAtEOF = true; /* indicate end of file */ zzEndRead = zzStartRead; /* invalidate buffer */ if (zzReader != null) zzReader.close(); } /** * Resets the scanner to read from a new input stream. * Does not close the old reader. * * All internal variables are reset, the old input stream * <b>cannot</b> be reused (internal buffer is discarded and lost). * Lexical state is set to <tt>ZZ_INITIAL</tt>. * * @param reader the new input stream */ public final void yyreset(java.io.Reader reader) { zzReader = reader; zzAtBOL = true; zzAtEOF = false; zzEndRead = zzStartRead = 0; zzCurrentPos = zzMarkedPos = zzPushbackPos = 0; yyline = yychar = yycolumn = 0; zzLexicalState = YYINITIAL; } /** * Returns the current lexical state. */ public final int yystate() { return zzLexicalState; } /** * Enters a new lexical state * * @param newState the new lexical state */ public final void yybegin(int newState) { zzLexicalState = newState; } /** * Returns the text matched by the current regular expression. */ public final String yytext() { return new String( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead ); } /** * Returns the character at position <tt>pos</tt> from the * matched text. * * It is equivalent to yytext().charAt(pos), but faster * * @param pos the position of the character to fetch. * A value from 0 to yylength()-1. * * @return the character at position pos */ public final char yycharat(int pos) { return zzBuffer[zzStartRead+pos]; } /** * Returns the length of the matched text region. */ public final int yylength() { return zzMarkedPos-zzStartRead; } /** * Reports an error that occured while scanning. * * In a wellformed scanner (no or only correct usage of * yypushback(int) and a match-all fallback rule) this method * will only be called with things that "Can't Possibly Happen". * If this method is called, something is seriously wrong * (e.g. a JFlex bug producing a faulty scanner etc.). * * Usual syntax/scanner level error handling should be done * in error fallback rules. * * @param errorCode the code of the errormessage to display */ private void zzScanError(int errorCode) { String message; try { message = ZZ_ERROR_MSG[errorCode]; } catch (ArrayIndexOutOfBoundsException e) { message = ZZ_ERROR_MSG[ZZ_UNKNOWN_ERROR]; } throw new Error(message); } /** * Pushes the specified amount of characters back into the input stream. * * They will be read again by then next call of the scanning method * * @param number the number of characters to be read again. * This number must not be greater than yylength()! */ public void yypushback(int number) { if ( number > yylength() ) zzScanError(ZZ_PUSHBACK_2BIG); zzMarkedPos -= number; } /** * Resumes scanning until the next regular expression is matched, * the end of input is encountered or an I/O-Error occurs. * * @return the next token * @exception java.io.IOException if any I/O-Error occurs */ public JSONToken yylex() throws java.io.IOException, ParseException { int zzInput; int zzAction; // cached fields: int zzCurrentPosL; int zzMarkedPosL; int zzEndReadL = zzEndRead; char [] zzBufferL = zzBuffer; char [] zzCMapL = ZZ_CMAP; int [] zzTransL = ZZ_TRANS; int [] zzRowMapL = ZZ_ROWMAP; int [] zzAttrL = ZZ_ATTRIBUTE; while (true) { zzMarkedPosL = zzMarkedPos; yychar+= zzMarkedPosL-zzStartRead; boolean zzR = false; for (zzCurrentPosL = zzStartRead; zzCurrentPosL < zzMarkedPosL; zzCurrentPosL++) { switch (zzBufferL[zzCurrentPosL]) { case '\u000B': case '\u000C': case '\u0085': case '\u2028': case '\u2029': yyline++; yycolumn = 0; zzR = false; break; case '\r': yyline++; yycolumn = 0; zzR = true; break; case '\n': if (zzR) zzR = false; else { yyline++; yycolumn = 0; } break; default: zzR = false; yycolumn++; } } if (zzR) { // peek one character ahead if it is \n (if we have counted one line too much) boolean zzPeek; if (zzMarkedPosL < zzEndReadL) zzPeek = zzBufferL[zzMarkedPosL] == '\n'; else if (zzAtEOF) zzPeek = false; else { boolean eof = zzRefill(); zzEndReadL = zzEndRead; zzMarkedPosL = zzMarkedPos; zzBufferL = zzBuffer; if (eof) zzPeek = false; else zzPeek = zzBufferL[zzMarkedPosL] == '\n'; } if (zzPeek) yyline--; } zzAction = -1; zzCurrentPosL = zzCurrentPos = zzStartRead = zzMarkedPosL; zzState = zzLexicalState; zzForAction: { while (true) { if (zzCurrentPosL < zzEndReadL) zzInput = zzBufferL[zzCurrentPosL++]; else if (zzAtEOF) { zzInput = YYEOF; break zzForAction; } else { // store back cached positions zzCurrentPos = zzCurrentPosL; zzMarkedPos = zzMarkedPosL; boolean eof = zzRefill(); // get translated positions and possibly new buffer zzCurrentPosL = zzCurrentPos; zzMarkedPosL = zzMarkedPos; zzBufferL = zzBuffer; zzEndReadL = zzEndRead; if (eof) { zzInput = YYEOF; break zzForAction; } else { zzInput = zzBufferL[zzCurrentPosL++]; } } int zzNext = zzTransL[ zzRowMapL[zzState] + zzCMapL[zzInput > 255 ? 255 : zzInput] ]; if (zzNext == -1) break zzForAction; zzState = zzNext; int zzAttributes = zzAttrL[zzState]; if ( (zzAttributes & 1) == 1 ) { zzAction = zzState; zzMarkedPosL = zzCurrentPosL; if ( (zzAttributes & 8) == 8 ) break zzForAction; } } } // store back cached position zzMarkedPos = zzMarkedPosL; switch (zzAction < 0 ? zzAction : ZZ_ACTION[zzAction]) { case 4: { yybegin(STRING); string.setLength(0); prefixEnd = -1; } case 28: break; case 12: { prefixEnd = string.length(); string.append('.'); } case 29: break; case 11: { string.append( zzBuffer, zzStartRead, zzMarkedPos-zzStartRead ); } case 30: break; case 23: { string.append( '/' ); } case 31: break; case 24: { return createToken(JSONTokenType.NULL); } case 32: break; case 20: { string.append( '\r' ); } case 33: break; case 8: { return createToken(JSONTokenType.RBLANKET); } case 34: break; case 10: { return createToken(JSONTokenType.RCURLY); } case 35: break; case 2: { return createToken(JSONTokenType.NUMBER); } case 36: break; case 22: { string.append( '\b' ); } case 37: break; case 27: { String hexNumber = yytext(); try{ int ch=Integer.parseInt(hexNumber.substring(2),16); string.append((char)ch); } catch(Exception e){ throw new NumberFormatException("Invalid hex number: " + hexNumber); } } case 38: break; case 17: { string.append( '\t' ); } case 39: break; case 1: { throw new ParseException(yytext(), yyline, yycolumn, "Illegal Character."); } case 40: break; case 13: { throw new ParseException(yytext(), yyline, yycolumn, "Unterminated string at end of line"); } case 41: break; case 25: { return createToken(JSONTokenType.TRUE); } case 42: break; case 18: { string.append( '\\' ); } case 43: break; case 6: { return createToken(JSONTokenType.COLON); } case 44: break; case 14: { yybegin(YYINITIAL); return createToken(JSONTokenType.STRING); } case 45: break; case 16: { string.append( '\n' ); } case 46: break; case 9: { return createToken(JSONTokenType.LCURLY); } case 47: break; case 7: { return createToken(JSONTokenType.LBLANKET); } case 48: break; case 5: { return createToken(JSONTokenType.COMMA); } case 49: break; case 26: { return createToken(JSONTokenType.FALSE); } case 50: break; case 21: { string.append( '\f' ); } case 51: break; case 15: { throw new ParseException(yytext(), yyline, yycolumn, "Illegal escape sequence \""+yytext()+"\""); } case 52: break; case 19: { string.append( '\"' ); } case 53: break; case 3: { } case 54: break; default: if (zzInput == YYEOF && zzStartRead == zzCurrentPos) { zzAtEOF = true; return null; } else { zzScanError(ZZ_NO_MATCH); } } } } }