blob: 8f542cf62434345dda9fd33e6b760b6a1dc2b704 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package org.apache.daffodil.runtime1.processors.parsers
import org.apache.daffodil.lib.schema.annotation.props.gen.SeparatorPosition
import org.apache.daffodil.runtime1.processors._
trait Separated { self: SequenceChildParser =>
def sep: Parser
def spos: SeparatorPosition
def trd: TermRuntimeData
def parseResultHelper: SeparatedSequenceChildParseResultHelper
override def childProcessors: Vector[Processor] = Vector(self.childParser) :+ sep
import SeparatorPosition._
protected final val separatorHelper = spos match {
case Prefix => new PrefixSeparatorHelper(sep, childParser, this)
case Infix => new InfixSeparatorHelper(sep, childParser, this)
case Postfix =>
new PostfixSeparatorHelper(sep, childParser, this, parseResultHelper.isSimpleDelimited)
}
final def isPositional: Boolean =
parseResultHelper.separatedSequenceChildBehavior
.isInstanceOf[SeparatedSequenceChildBehavior.PositionalLike]
final def parseOne(
pstate: PState,
requiredOptional: RequiredOptionalStatus,
): ParseAttemptStatus = {
separatorHelper.parseOneWithSeparator(pstate, requiredOptional)
}
final override def arrayCompleteChecks(
pstate: PState,
resultOfTry: ParseAttemptStatus,
priorResultOfTry: ParseAttemptStatus,
): Unit =
parseResultHelper.arrayCompleteChecks(self, pstate, resultOfTry, priorResultOfTry)
final override def sequenceCompleteChecks(
pstate: PState,
resultOfTry: ParseAttemptStatus,
priorResultOfTry: ParseAttemptStatus,
): Unit =
parseResultHelper.sequenceCompleteChecks(self, pstate, resultOfTry, priorResultOfTry)
}
sealed abstract class ScalarOrderedSeparatedSequenceChildParser(
childParser: Parser,
srd: SequenceRuntimeData,
trd: TermRuntimeData,
override val sep: Parser,
override val spos: SeparatorPosition,
override val parseResultHelper: SeparatedSequenceChildParseResultHelper,
) extends SequenceChildParser(childParser, srd, trd)
with Separated
with NonRepeatingSequenceChildParser
final class ScalarOrderedElementSeparatedSequenceChildParser(
childParser: Parser,
srd: SequenceRuntimeData,
trd: TermRuntimeData,
sep: Parser,
spos: SeparatorPosition,
prh: SeparatedSequenceChildParseResultHelper,
) extends ScalarOrderedSeparatedSequenceChildParser(childParser, srd, trd, sep, spos, prh)
final class GroupSeparatedSequenceChildParser(
childParser: Parser,
srd: SequenceRuntimeData,
val mrd: ModelGroupRuntimeData,
sep: Parser,
spos: SeparatorPosition,
prh: SeparatedSequenceChildParseResultHelper,
) extends ScalarOrderedSeparatedSequenceChildParser(childParser, srd, mrd, sep, spos, prh)
final class RepOrderedExactlyNSeparatedSequenceChildParser(
childParser: Parser,
srd: SequenceRuntimeData,
erd: ElementRuntimeData,
override val sep: Parser,
override val spos: SeparatorPosition,
override val parseResultHelper: SeparatedSequenceChildParseResultHelper,
) extends OccursCountExactParser(childParser, srd, erd)
with Separated
final class RepOrderedExpressionOccursCountSeparatedSequenceChildParser(
childParser: Parser,
ocEv: OccursCountEv,
srd: SequenceRuntimeData,
erd: ElementRuntimeData,
override val sep: Parser,
override val spos: SeparatorPosition,
override val parseResultHelper: SeparatedSequenceChildParseResultHelper,
) extends OccursCountExpressionParser(childParser, srd, erd, ocEv)
with Separated
final class RepOrderedWithMinMaxSeparatedSequenceChildParser(
childParser: Parser,
srd: SequenceRuntimeData,
erd: ElementRuntimeData,
override val sep: Parser,
override val spos: SeparatorPosition,
override val parseResultHelper: SeparatedSequenceChildParseResultHelper,
) extends OccursCountMinMaxParser(childParser, srd, erd)
with Separated
final class OrderedSeparatedSequenceParser(
rd: SequenceRuntimeData,
spos: SeparatorPosition,
sep: Parser,
childrenArg: Vector[SequenceChildParser],
) extends SequenceParserBase(rd, childrenArg, isOrdered = true) {
override lazy val childProcessors = (sep +: childrenArg.asInstanceOf[Seq[Parser]]).toVector
}
final class UnorderedSeparatedSequenceParser(
rd: SequenceRuntimeData,
spos: SeparatorPosition,
sep: Parser,
childrenArg: Vector[SequenceChildParser],
) extends SequenceParserBase(rd, childrenArg, isOrdered = false) {
override lazy val childProcessors = (sep +: childrenArg.asInstanceOf[Seq[Parser]]).toVector
}