in daffodil-runtime1/src/main/scala/org/apache/daffodil/runtime1/processors/parsers/SeparatedParseHelper.scala [106:178]
final protected def parseOneWithInfixOrPrefixSeparator(
shouldParseTheSep: Boolean,
pstate: PState,
requiredOptional: RequiredOptionalStatus
): ParseAttemptStatus = {
val sepStatus =
if (shouldParseTheSep) {
// If a separator is expected, but optional, we may generate errors
// while searching for it which should not be propagated upward
requiredOptional match {
case _: RequiredOptionalStatus.Optional => {
// Create a point of uncertainty with which to reset if we find errors
pstate.withPointOfUncertainty(
"parseOneWithInfixOrPrefixSeparator",
childParser.context
) { pou =>
sep.parse1(pstate)
val rv = if (pstate.processorStatus eq Success) {
SeparatorParseStatus.SeparatorFound
} else {
// reset to the point of uncertainty to discard the errors
pstate.resetToPointOfUncertainty(pou)
SeparatorParseStatus.SeparatorFailed
}
rv
}
}
case _ => {
sep.parse1(pstate)
if (pstate.processorStatus eq Success)
SeparatorParseStatus.SeparatorFound
else
SeparatorParseStatus.SeparatorFailed
}
}
} else
SeparatorParseStatus.SeparatorNotNeeded
val prevBitPosBeforeChild = pstate.bitPos0b
sepStatus match {
case _: SeparatorParseStatus.SeparatorSuccess => {
childParser.parse1(pstate)
val pas =
scParser.parseResultHelper.computeParseAttemptStatus(
scParser,
prevBitPosBeforeChild,
pstate,
requiredOptional
)
pas
}
case _ => {
requiredOptional match {
case _: RequiredOptionalStatus.Required => {
failedSeparator(pstate, kind)
}
case _ => // No action
}
scParser.parseResultHelper.computeFailedSeparatorParseAttemptStatus(
scParser,
prevBitPosBeforeChild,
pstate,
isZL = true,
requiredOptional
)
}
}
}