in opennlp-tools/src/main/java/opennlp/tools/parser/chunking/ParserEventStream.java [138:189]
protected void addParseEvents(List<Event> parseEvents, Parse[] chunks) {
int ci = 0;
while (ci < chunks.length) {
if (logger.isTraceEnabled()) {
logger.trace("parserEventStream.addParseEvents: chunks={}", Arrays.asList(chunks));
}
Parse c = chunks[ci];
Parse parent = c.getParent();
if (parent != null) {
String type = parent.getType();
String outcome;
if (firstChild(c, parent)) {
outcome = AbstractBottomUpParser.START + type;
}
else {
outcome = AbstractBottomUpParser.CONT + type;
}
if (logger.isTraceEnabled()) {
logger.trace("parserEventStream.addParseEvents: chunks[{}]={} label={} bcg={}",
ci, c, outcome, bcg);
}
c.setLabel(outcome);
if (etype == ParserEventTypeEnum.BUILD) {
parseEvents.add(new Event(outcome, bcg.getContext(chunks, ci)));
}
int start = ci - 1;
while (start >= 0 && chunks[start].getParent() == parent) {
start--;
}
if (lastChild(c, parent)) {
if (etype == ParserEventTypeEnum.CHECK) {
parseEvents.add(new Event(Parser.COMPLETE, kcg.getContext( chunks, type, start + 1, ci)));
}
//perform reduce
int reduceStart = ci;
while (reduceStart >= 0 && chunks[reduceStart].getParent() == parent) {
reduceStart--;
}
reduceStart++;
chunks = reduceChunks(chunks,ci,parent);
ci = reduceStart - 1; //ci will be incremented at end of loop
}
else {
if (etype == ParserEventTypeEnum.CHECK) {
parseEvents.add(new Event(Parser.INCOMPLETE, kcg.getContext(chunks, type, start + 1, ci)));
}
}
}
ci++;
}
}