in drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/lang/DRL5Parser.java [3671:3845]
private void fromAccumulate( PatternDescrBuilder< ? > pattern ) throws RecognitionException {
AccumulateDescrBuilder< ? > accumulate = helper.start( pattern,
AccumulateDescrBuilder.class,
null );
try {
match( input,
DRL5Lexer.ID,
DroolsSoftKeywords.ACCUMULATE,
null,
DroolsEditorType.KEYWORD );
if ( state.failed ) return;
if ( state.backtracking == 0 && input.LA( 1 ) != DRL5Lexer.EOF ) {
helper.emit( Location.LOCATION_LHS_FROM_ACCUMULATE );
}
match( input,
DRL5Lexer.LEFT_PAREN,
null,
null,
DroolsEditorType.SYMBOL );
if ( state.failed ) return;
CEDescrBuilder< ? , AndDescr> source = accumulate.source();
try {
helper.start( source,
CEDescrBuilder.class,
null );
lhsAnd( source,
false );
if ( state.failed ) return;
if ( source.getDescr() != null && source.getDescr() instanceof ConditionalElementDescr ) {
ConditionalElementDescr root = source.getDescr();
BaseDescr[] descrs = root.getDescrs().toArray( new BaseDescr[root.getDescrs().size()] );
root.getDescrs().clear();
for ( int i = 0; i < descrs.length; i++ ) {
root.addOrMerge( descrs[i] );
}
}
} finally {
helper.end( CEDescrBuilder.class,
source );
}
if ( input.LA( 1 ) == DRL5Lexer.COMMA ) {
match( input,
DRL5Lexer.COMMA,
null,
null,
DroolsEditorType.SYMBOL );
if ( state.failed ) return;
}
if ( helper.validateIdentifierKey( DroolsSoftKeywords.INIT ) ) {
// custom code, inline accumulate
// initBlock
match( input,
DRL5Lexer.ID,
DroolsSoftKeywords.INIT,
null,
DroolsEditorType.KEYWORD );
if ( state.failed ) return;
if ( state.backtracking == 0 && input.LA( 1 ) != DRL5Lexer.EOF ) {
helper.emit( Location.LOCATION_LHS_FROM_ACCUMULATE_INIT );
}
String init = chunk( DRL5Lexer.LEFT_PAREN,
DRL5Lexer.RIGHT_PAREN,
Location.LOCATION_LHS_FROM_ACCUMULATE_INIT_INSIDE );
if ( state.failed ) return;
if ( state.backtracking == 0 ) accumulate.init( init );
if ( input.LA( 1 ) == DRL5Lexer.COMMA ) {
match( input,
DRL5Lexer.COMMA,
null,
null,
DroolsEditorType.SYMBOL );
if ( state.failed ) return;
}
// actionBlock
match( input,
DRL5Lexer.ID,
DroolsSoftKeywords.ACTION,
null,
DroolsEditorType.KEYWORD );
if ( state.failed ) return;
if ( state.backtracking == 0 && input.LA( 1 ) != DRL5Lexer.EOF ) {
helper.emit( Location.LOCATION_LHS_FROM_ACCUMULATE_ACTION );
}
String action = chunk( DRL5Lexer.LEFT_PAREN,
DRL5Lexer.RIGHT_PAREN,
Location.LOCATION_LHS_FROM_ACCUMULATE_ACTION_INSIDE );
if ( state.failed ) return;
if ( state.backtracking == 0 ) accumulate.action( action );
if ( input.LA( 1 ) == DRL5Lexer.COMMA ) {
match( input,
DRL5Lexer.COMMA,
null,
null,
DroolsEditorType.SYMBOL );
if ( state.failed ) return;
}
// reverseBlock
if ( helper.validateIdentifierKey( DroolsSoftKeywords.REVERSE ) ) {
match( input,
DRL5Lexer.ID,
DroolsSoftKeywords.REVERSE,
null,
DroolsEditorType.KEYWORD );
if ( state.failed ) return;
if ( state.backtracking == 0 && input.LA( 1 ) != DRL5Lexer.EOF ) {
helper.emit( Location.LOCATION_LHS_FROM_ACCUMULATE_REVERSE );
}
String reverse = chunk( DRL5Lexer.LEFT_PAREN,
DRL5Lexer.RIGHT_PAREN,
Location.LOCATION_LHS_FROM_ACCUMULATE_REVERSE_INSIDE );
if ( state.failed ) return;
if ( state.backtracking == 0 ) accumulate.reverse( reverse );
if ( input.LA( 1 ) == DRL5Lexer.COMMA ) {
match( input,
DRL5Lexer.COMMA,
null,
null,
DroolsEditorType.SYMBOL );
if ( state.failed ) return;
}
}
// resultBlock
match( input,
DRL5Lexer.ID,
DroolsSoftKeywords.RESULT,
null,
DroolsEditorType.KEYWORD );
if ( state.failed ) return;
if ( state.backtracking == 0 && input.LA( 1 ) != DRL5Lexer.EOF ) {
helper.emit( Location.LOCATION_LHS_FROM_ACCUMULATE_RESULT );
}
String result = chunk( DRL5Lexer.LEFT_PAREN,
DRL5Lexer.RIGHT_PAREN,
Location.LOCATION_LHS_FROM_ACCUMULATE_RESULT_INSIDE );
if ( state.failed ) return;
if ( state.backtracking == 0 ) accumulate.result( result );
} else {
// accumulate functions
accumulateFunction( accumulate,
false,
null );
if ( state.failed ) return;
}
match( input,
DRL5Lexer.RIGHT_PAREN,
null,
null,
DroolsEditorType.SYMBOL );
if ( state.failed ) return;
} finally {
helper.end( AccumulateDescrBuilder.class,
accumulate );
if ( state.backtracking == 0 && input.LA( 1 ) != DRL5Lexer.EOF ) {
helper.emit( Location.LOCATION_LHS_BEGIN_OF_CONDITION );
}
}
}