/* Generated By:JavaCC: Do not edit this line. GeneratedFormulaParser.java */ package org.pentaho.reporting.libraries.formula.parser; import org.pentaho.reporting.libraries.formula.lvalues.ContextLookup; import org.pentaho.reporting.libraries.formula.lvalues.DefaultDataTable; import org.pentaho.reporting.libraries.formula.lvalues.FormulaFunction; import org.pentaho.reporting.libraries.formula.lvalues.LValue; import org.pentaho.reporting.libraries.formula.lvalues.ParsePosition; import org.pentaho.reporting.libraries.formula.lvalues.PostfixTerm; import org.pentaho.reporting.libraries.formula.lvalues.PrefixTerm; import org.pentaho.reporting.libraries.formula.lvalues.StaticValue; import org.pentaho.reporting.libraries.formula.lvalues.Term; import org.pentaho.reporting.libraries.formula.operators.InfixOperator; import org.pentaho.reporting.libraries.formula.operators.OperatorFactory; import org.pentaho.reporting.libraries.formula.operators.PostfixOperator; import org.pentaho.reporting.libraries.formula.operators.PrefixOperator; import org.pentaho.reporting.libraries.formula.typing.coretypes.NumberType; import org.pentaho.reporting.libraries.formula.typing.coretypes.TextType; import java.math.BigDecimal; import java.util.ArrayList; public abstract class GeneratedFormulaParser implements GeneratedFormulaParserConstants { protected GeneratedFormulaParser() { } protected abstract OperatorFactory getOperatorFactory(); protected ParsePosition createPosition( Token token ) { return new ParsePosition ( token.beginLine, token.beginColumn, token.endLine, token.endColumn ); } final public LValue getExpression() throws ParseException { LValue retval = null; Term term = null; retval = getLValue(); switch( jj_nt.kind ) { case PLUS: case MINUS: case MULT: case DIV: case POW: case EQUALS: case NOT_EQUALS: case LT_EQUALS: case GT_EQUALS: case LT: case GT: case CONCAT: term = startTail( new Term( retval ) ); label_1: while ( true ) { switch( jj_nt.kind ) { case PLUS: case MINUS: case MULT: case DIV: case POW: case EQUALS: case NOT_EQUALS: case LT_EQUALS: case GT_EQUALS: case LT: case GT: case CONCAT: ; break; default: jj_la1[ 0 ] = jj_gen; break label_1; } term = startTail( term ); } break; default: jj_la1[ 1 ] = jj_gen; ; } if ( term != null ) { { if ( true ) { return term; } } } { if ( true ) { return retval; } } throw new Error( "Missing return statement in function" ); } final public Term startTail( LValue retval ) throws ParseException { LValue val = null; InfixOperator op = null; Term ex = null; op = getInfixOperator(); val = getLValue(); if ( retval instanceof Term ) { ex = (Term) retval; } else { ex = new Term( retval ); } ex.add( op, val ); { if ( true ) { return ex; } } throw new Error( "Missing return statement in function" ); } final public LValue getLValue() throws ParseException { Token value = null; LValue retval = null; PrefixOperator prefixOp = null; PostfixOperator postfixOp = null; switch( jj_nt.kind ) { case PLUS: case MINUS: prefixOp = getPrefixOperator(); break; default: jj_la1[ 2 ] = jj_gen; ; } switch( jj_nt.kind ) { case COLUMN_LOOKUP: value = jj_consume_token( COLUMN_LOOKUP ); retval = new ContextLookup( ParserTools.stripReferenceQuote( value.image ), createPosition( value ) ); break; case STRING_LITERAL: value = jj_consume_token( STRING_LITERAL ); retval = new StaticValue( ParserTools.stripQuote( value.image ), TextType.TYPE, createPosition( value ) ); break; case UNSIGNED_NUMERIC_LITERAL: value = jj_consume_token( UNSIGNED_NUMERIC_LITERAL ); retval = new StaticValue( new BigDecimal( value.image ), NumberType.GENERIC_NUMBER, createPosition( value ) ); break; case UNSIGNED_INTEGER: value = jj_consume_token( UNSIGNED_INTEGER ); retval = new StaticValue( new BigDecimal( value.image ), NumberType.GENERIC_NUMBER, createPosition( value ) ); break; case NULL: jj_consume_token( NULL ); retval = new StaticValue( null, createPosition( value ) ); break; case L_BRACE: jj_consume_token( L_BRACE ); retval = parseArray(); jj_consume_token( R_BRACE ); break; case IDENTIFIER: value = jj_consume_token( IDENTIFIER ); jj_consume_token( L_PAREN ); retval = parseFunction( value.image, createPosition( value ) ); jj_consume_token( R_PAREN ); break; case L_PAREN: jj_consume_token( L_PAREN ); retval = getExpression(); jj_consume_token( R_PAREN ); if ( retval instanceof Term == false ) { retval = new Term( retval ); } break; default: jj_la1[ 3 ] = jj_gen; jj_consume_token( -1 ); throw new ParseException(); } switch( jj_nt.kind ) { case PERCENT: postfixOp = getPostfixOperator(); break; default: jj_la1[ 4 ] = jj_gen; ; } if ( postfixOp != null ) { retval = new PostfixTerm( retval, postfixOp ); } if ( prefixOp != null ) { retval = new PrefixTerm( prefixOp, retval ); } { if ( true ) { return retval; } } throw new Error( "Missing return statement in function" ); } final public LValue parseArray() throws ParseException { ArrayList rows = new ArrayList(); LValue[] row = null; switch( jj_nt.kind ) { case UNSIGNED_INTEGER: case L_PAREN: case L_BRACE: case PLUS: case MINUS: case IDENTIFIER: case COLUMN_LOOKUP: case STRING_LITERAL: case UNSIGNED_NUMERIC_LITERAL: case NULL: row = parseRow(); rows.add( row ); break; default: jj_la1[ 5 ] = jj_gen; ; } label_2: while ( true ) { switch( jj_nt.kind ) { case PIPE: ; break; default: jj_la1[ 6 ] = jj_gen; break label_2; } jj_consume_token( PIPE ); row = parseRow(); // should we check here for column count equality to the first row column count? // or do we give this responsability to a DefaultDataTable constructor? rows.add( row ); } LValue[][] table = (LValue[][]) rows.toArray( new LValue[ rows.size() ][] ); { if ( true ) { return new DefaultDataTable( table ); } } throw new Error( "Missing return statement in function" ); } final public LValue[] parseRow() throws ParseException { ArrayList cols = new ArrayList(); ; LValue column = null; column = getExpression(); cols.add( column ); label_3: while ( true ) { switch( jj_nt.kind ) { case SEMICOLON: ; break; default: jj_la1[ 7 ] = jj_gen; break label_3; } jj_consume_token( SEMICOLON ); column = getExpression(); cols.add( column ); } { if ( true ) { return (LValue[]) cols.toArray( new LValue[ cols.size() ] ); } } throw new Error( "Missing return statement in function" ); } final public LValue parseFunction( String name, ParsePosition parsePosition ) throws ParseException { ArrayList params = new ArrayList(); LValue parameter = null; Token value = null; boolean parameterExpected = false; switch( jj_nt.kind ) { case UNSIGNED_INTEGER: case SEMICOLON: case L_PAREN: case L_BRACE: case PLUS: case MINUS: case IDENTIFIER: case COLUMN_LOOKUP: case STRING_LITERAL: case UNSIGNED_NUMERIC_LITERAL: case NULL: switch( jj_nt.kind ) { case SEMICOLON: value = jj_consume_token( SEMICOLON ); parameterExpected = false; params.add( new StaticValue( null, createPosition( value ) ) ); break; case UNSIGNED_INTEGER: case L_PAREN: case L_BRACE: case PLUS: case MINUS: case IDENTIFIER: case COLUMN_LOOKUP: case STRING_LITERAL: case UNSIGNED_NUMERIC_LITERAL: case NULL: parameter = getExpression(); parameterExpected = false; params.add( parameter ); break; default: jj_la1[ 8 ] = jj_gen; jj_consume_token( -1 ); throw new ParseException(); } label_4: while ( true ) { switch( jj_nt.kind ) { case SEMICOLON: ; break; default: jj_la1[ 9 ] = jj_gen; break label_4; } value = jj_consume_token( SEMICOLON ); if ( parameterExpected == true ) { params.add( new StaticValue( null, createPosition( value ) ) ); } parameterExpected = true; switch( jj_nt.kind ) { case UNSIGNED_INTEGER: case L_PAREN: case L_BRACE: case PLUS: case MINUS: case IDENTIFIER: case COLUMN_LOOKUP: case STRING_LITERAL: case UNSIGNED_NUMERIC_LITERAL: case NULL: parameter = getExpression(); params.add( parameter ); parameterExpected = false; break; default: jj_la1[ 10 ] = jj_gen; ; } } break; default: jj_la1[ 11 ] = jj_gen; ; } if ( parameterExpected == true ) { params.add( new StaticValue( null, createPosition( value ) ) ); } if ( params == null ) { { if ( true ) { return new FormulaFunction( name, new LValue[ 0 ], parsePosition ); } } } LValue[] paramVals = (LValue[]) params.toArray( new LValue[ params.size() ] ); { if ( true ) { return new FormulaFunction( name, paramVals, parsePosition ); } } throw new Error( "Missing return statement in function" ); } final public PrefixOperator getPrefixOperator() throws ParseException { Token value = null; switch( jj_nt.kind ) { case PLUS: value = jj_consume_token( PLUS ); break; case MINUS: value = jj_consume_token( MINUS ); break; default: jj_la1[ 12 ] = jj_gen; jj_consume_token( -1 ); throw new ParseException(); } { if ( true ) { return getOperatorFactory().createPrefixOperator( value.image ); } } throw new Error( "Missing return statement in function" ); } final public PostfixOperator getPostfixOperator() throws ParseException { Token value = null; value = jj_consume_token( PERCENT ); { if ( true ) { return getOperatorFactory().createPostfixOperator( value.image ); } } throw new Error( "Missing return statement in function" ); } final public InfixOperator getInfixOperator() throws ParseException { InfixOperator op = null; Token value = null; switch( jj_nt.kind ) { case PLUS: value = jj_consume_token( PLUS ); break; case MINUS: value = jj_consume_token( MINUS ); break; case MULT: value = jj_consume_token( MULT ); break; case DIV: value = jj_consume_token( DIV ); break; case POW: value = jj_consume_token( POW ); break; case EQUALS: value = jj_consume_token( EQUALS ); break; case NOT_EQUALS: value = jj_consume_token( NOT_EQUALS ); break; case LT_EQUALS: value = jj_consume_token( LT_EQUALS ); break; case GT_EQUALS: value = jj_consume_token( GT_EQUALS ); break; case LT: value = jj_consume_token( LT ); break; case GT: value = jj_consume_token( GT ); break; case CONCAT: value = jj_consume_token( CONCAT ); break; default: jj_la1[ 13 ] = jj_gen; jj_consume_token( -1 ); throw new ParseException(); } { if ( true ) { return getOperatorFactory().createInfixOperator( value.image ); } } throw new Error( "Missing return statement in function" ); } public GeneratedFormulaParserTokenManager token_source; JavaCharStream jj_input_stream; public Token token, jj_nt; private int jj_gen; final private int[] jj_la1 = new int[ 14 ]; static private int[] jj_la1_0; static private int[] jj_la1_1; static { jj_la1_0(); jj_la1_1(); } private static void jj_la1_0() { jj_la1_0 = new int[] { 0xf8000000, 0xf8000000, 0x18000000, 0x1080100, 0x0, 0x19080100, 0x4000000, 0x40000, 0x190c0100, 0x40000, 0x19080100, 0x190c0100, 0x18000000, 0xf8000000, }; } private static void jj_la1_1() { jj_la1_1 = new int[] { 0x7f, 0x7f, 0x0, 0x10f00, 0x80, 0x10f00, 0x0, 0x0, 0x10f00, 0x0, 0x10f00, 0x10f00, 0x0, 0x7f, }; } public GeneratedFormulaParser( java.io.InputStream stream ) { jj_input_stream = new JavaCharStream( stream, 1, 1 ); token_source = new GeneratedFormulaParserTokenManager( jj_input_stream ); token = new Token(); token.next = jj_nt = token_source.getNextToken(); jj_gen = 0; for ( int i = 0; i < 14; i++ ) { jj_la1[ i ] = -1; } } public void ReInit( java.io.InputStream stream ) { jj_input_stream.ReInit( stream, 1, 1 ); token_source.ReInit( jj_input_stream ); token = new Token(); token.next = jj_nt = token_source.getNextToken(); jj_gen = 0; for ( int i = 0; i < 14; i++ ) { jj_la1[ i ] = -1; } } public GeneratedFormulaParser( java.io.Reader stream ) { jj_input_stream = new JavaCharStream( stream, 1, 1 ); token_source = new GeneratedFormulaParserTokenManager( jj_input_stream ); token = new Token(); token.next = jj_nt = token_source.getNextToken(); jj_gen = 0; for ( int i = 0; i < 14; i++ ) { jj_la1[ i ] = -1; } } public void ReInit( java.io.Reader stream ) { jj_input_stream.ReInit( stream, 1, 1 ); token_source.ReInit( jj_input_stream ); token = new Token(); token.next = jj_nt = token_source.getNextToken(); jj_gen = 0; for ( int i = 0; i < 14; i++ ) { jj_la1[ i ] = -1; } } public GeneratedFormulaParser( GeneratedFormulaParserTokenManager tm ) { token_source = tm; token = new Token(); token.next = jj_nt = token_source.getNextToken(); jj_gen = 0; for ( int i = 0; i < 14; i++ ) { jj_la1[ i ] = -1; } } public void ReInit( GeneratedFormulaParserTokenManager tm ) { token_source = tm; token = new Token(); token.next = jj_nt = token_source.getNextToken(); jj_gen = 0; for ( int i = 0; i < 14; i++ ) { jj_la1[ i ] = -1; } } final private Token jj_consume_token( int kind ) throws ParseException { Token oldToken = token; if ( ( token = jj_nt ).next != null ) { jj_nt = jj_nt.next; } else { jj_nt = jj_nt.next = token_source.getNextToken(); } if ( token.kind == kind ) { jj_gen++; return token; } jj_nt = token; token = oldToken; jj_kind = kind; throw generateParseException(); } final public Token getNextToken() { if ( ( token = jj_nt ).next != null ) { jj_nt = jj_nt.next; } else { jj_nt = jj_nt.next = token_source.getNextToken(); } jj_gen++; return token; } final public Token getToken( int index ) { Token t = token; for ( int i = 0; i < index; i++ ) { if ( t.next != null ) { t = t.next; } else { t = t.next = token_source.getNextToken(); } } return t; } private java.util.Vector jj_expentries = new java.util.Vector(); private int[] jj_expentry; private int jj_kind = -1; public ParseException generateParseException() { jj_expentries.removeAllElements(); boolean[] la1tokens = new boolean[ 49 ]; for ( int i = 0; i < 49; i++ ) { la1tokens[ i ] = false; } if ( jj_kind >= 0 ) { la1tokens[ jj_kind ] = true; jj_kind = -1; } for ( int i = 0; i < 14; i++ ) { if ( jj_la1[ i ] == jj_gen ) { for ( int j = 0; j < 32; j++ ) { if ( ( jj_la1_0[ i ] & ( 1 << j ) ) != 0 ) { la1tokens[ j ] = true; } if ( ( jj_la1_1[ i ] & ( 1 << j ) ) != 0 ) { la1tokens[ 32 + j ] = true; } } } } for ( int i = 0; i < 49; i++ ) { if ( la1tokens[ i ] ) { jj_expentry = new int[ 1 ]; jj_expentry[ 0 ] = i; jj_expentries.addElement( jj_expentry ); } } int[][] exptokseq = new int[ jj_expentries.size() ][]; for ( int i = 0; i < jj_expentries.size(); i++ ) { exptokseq[ i ] = (int[]) jj_expentries.elementAt( i ); } return new ParseException( token, exptokseq, tokenImage ); } final public void enable_tracing() { } final public void disable_tracing() { } }