in drools-drl/drools-drl-parser/src/main/java/org/drools/drl/parser/lang/DRL6Parser.java [4169:4381]
private void fromAccumulate(PatternDescrBuilder<?> pattern) throws RecognitionException {
AccumulateDescrBuilder<?> accumulate = helper.start(pattern,
AccumulateDescrBuilder.class,
null);
try {
if (helper.validateIdentifierKey(DroolsSoftKeywords.ACCUMULATE)) {
match(input,
DRL6Lexer.ID,
DroolsSoftKeywords.ACCUMULATE,
null,
DroolsEditorType.KEYWORD);
} else {
// might be using the short mnemonic
match(input,
DRL6Lexer.ID,
DroolsSoftKeywords.ACC,
null,
DroolsEditorType.KEYWORD);
}
if (state.failed)
return;
if (state.backtracking == 0 && input.LA(1) != DRL6Lexer.EOF) {
helper.emit(Location.LOCATION_LHS_FROM_ACCUMULATE);
}
match(input,
DRL6Lexer.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) == DRL6Lexer.COMMA) {
match(input,
DRL6Lexer.COMMA,
null,
null,
DroolsEditorType.SYMBOL);
if (state.failed)
return;
} else if (input.LA(-1) != DRL6Lexer.SEMICOLON) {
match(input,
DRL6Lexer.SEMICOLON,
null,
null,
DroolsEditorType.SYMBOL);
if (state.failed)
return;
}
if (helper.validateIdentifierKey(DroolsSoftKeywords.INIT)) {
// custom code, inline accumulate
// initBlock
match(input,
DRL6Lexer.ID,
DroolsSoftKeywords.INIT,
null,
DroolsEditorType.KEYWORD);
if (state.failed)
return;
if (state.backtracking == 0 && input.LA(1) != DRL6Lexer.EOF) {
helper.emit(Location.LOCATION_LHS_FROM_ACCUMULATE_INIT);
}
String init = chunk(DRL6Lexer.LEFT_PAREN,
DRL6Lexer.RIGHT_PAREN,
Location.LOCATION_LHS_FROM_ACCUMULATE_INIT_INSIDE);
if (state.failed)
return;
if (state.backtracking == 0)
accumulate.init(init);
if (input.LA(1) == DRL6Lexer.COMMA) {
match(input,
DRL6Lexer.COMMA,
null,
null,
DroolsEditorType.SYMBOL);
if (state.failed)
return;
}
// actionBlock
match(input,
DRL6Lexer.ID,
DroolsSoftKeywords.ACTION,
null,
DroolsEditorType.KEYWORD);
if (state.failed)
return;
if (state.backtracking == 0 && input.LA(1) != DRL6Lexer.EOF) {
helper.emit(Location.LOCATION_LHS_FROM_ACCUMULATE_ACTION);
}
String action = chunk(DRL6Lexer.LEFT_PAREN,
DRL6Lexer.RIGHT_PAREN,
Location.LOCATION_LHS_FROM_ACCUMULATE_ACTION_INSIDE);
if (state.failed)
return;
if (state.backtracking == 0)
accumulate.action(action);
if (input.LA(1) == DRL6Lexer.COMMA) {
match(input,
DRL6Lexer.COMMA,
null,
null,
DroolsEditorType.SYMBOL);
if (state.failed)
return;
}
// reverseBlock
if (helper.validateIdentifierKey(DroolsSoftKeywords.REVERSE)) {
match(input,
DRL6Lexer.ID,
DroolsSoftKeywords.REVERSE,
null,
DroolsEditorType.KEYWORD);
if (state.failed)
return;
if (state.backtracking == 0 && input.LA(1) != DRL6Lexer.EOF) {
helper.emit(Location.LOCATION_LHS_FROM_ACCUMULATE_REVERSE);
}
String reverse = chunk(DRL6Lexer.LEFT_PAREN,
DRL6Lexer.RIGHT_PAREN,
Location.LOCATION_LHS_FROM_ACCUMULATE_REVERSE_INSIDE);
if (state.failed)
return;
if (state.backtracking == 0)
accumulate.reverse(reverse);
if (input.LA(1) == DRL6Lexer.COMMA) {
match(input,
DRL6Lexer.COMMA,
null,
null,
DroolsEditorType.SYMBOL);
if (state.failed)
return;
}
}
// resultBlock
match(input,
DRL6Lexer.ID,
DroolsSoftKeywords.RESULT,
null,
DroolsEditorType.KEYWORD);
if (state.failed)
return;
if (state.backtracking == 0 && input.LA(1) != DRL6Lexer.EOF) {
helper.emit(Location.LOCATION_LHS_FROM_ACCUMULATE_RESULT);
}
String result = chunk(DRL6Lexer.LEFT_PAREN,
DRL6Lexer.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,
DRL6Lexer.RIGHT_PAREN,
null,
null,
DroolsEditorType.SYMBOL);
if (state.failed)
return;
} finally {
helper.end(AccumulateDescrBuilder.class,
accumulate);
if (state.backtracking == 0 && input.LA(1) != DRL6Lexer.EOF) {
helper.emit(Location.LOCATION_LHS_BEGIN_OF_CONDITION);
}
}
}