- Direct Known Subclasses:
CookieHeaderParser
Input tokens from a stream.
Parser enables efficient, interruptible parsing of network protocols
and data formats, without intermediate buffering.
Input tokens
A Parser reads tokens from an Input reader. Input tokens
are modeled as primitive ints, commonly representing Unicode code
points, or raw octets. Each Parser implementation specifies the
semantic type of input tokens it consumes.
Parser states
A Parser is always in one of three states: continue,
done, or error. The cont state indicates that
feed is ready to consume Input; the
done state indicates that parsing terminated successfully, and that
bind will return the parsed result; the error state
indicates that parsing terminated in failure, and that trap
will return the parse error. Parser subclasses default to the
cont state.
Feeding input
The feed(Input) method incrementally parses as much
Input as it can, before returning another Parser that represents
the continuation of how to parse additional Input. The Input
passed to feed is only guaranteed to be valid for the duration of
the method call; references to the provided Input instance must not
be stored.
Parser results
A Parser produces a parsed result of type O, obtained
via the bind() method. bind is only guaranteed to return a
result when in the done state; though bind may optionally
make available partial results in other states. A failed Parser
provides a parse error via the trap() method. trap is only
guaranteed to return an error when in the error state.
Continuations
A Parser instance represents a continuation of how to parse
remaining Input. Rather than parsing a complete input in one go,
a Parser takes an Input chunk and returns another
Parser instance that knows how to parse subsequent Input chunks.
This enables non-blocking, incremental parsing that can be interrupted
whenever an Input reader runs out of immediately available data.
A Parser terminates by returning a continuation in either the
done state, or the error state.
done(Object) returns a Parser in the done
state. error(Throwable) returns a Parser in the
error state.
Iteratees
Parser is an
Iteratee. Though unlike strictly functional iteratees, a Parser
statefully iterates over its Input, rather than allocating an object
for each incremental input continutaion. This internal mutability minimizes
garbage collector memory pressure, without violating the functional Iteratee
abstraction, provided that feed logically takes exclusive ownership
of its Input when invoked, and logically returns ownership of the
Input in a state that's consistent with the returned Parser
continuation.
Immutability
A Parser should be immutable. Specifically, an invocation of
feed should not alter the behavior of future calls to feed
on the same Parser instance. A Parser should only mutate
its internal state if it's essential to do so, such as for critical path
performance reasons.
Backtracking
feed can internally clone its
Input, if it might need to backtrack. Keep in mind that, because
Input is only valid for the duration of a call to feed, input must
be internally buffered if it needs to be preserved between feed
invocations.
Forking
The fork(Object) method passes an out-of-band condition to a
Parser, yielding a Parser continuation whose behavior may
be altered by the given condition. For example, an HTML Parser
might fork an inner text parser to directly parse an embedded micro
format out of an HTML element, based on some out-of-band schema information.
The types of conditions accepted by fork, and their intended
semantics, are implementation defined.
-
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescription<O2> Parser<O2>asError()Casts an erroredParserto a different output type.bind()Returns the parsed result.static <O> Parser<O>done()Returns aParserin the done state thatbinds anullparsed result.static <O> Parser<O>done(O output) Returns aParserin the done state thatbinds the given parsedoutput.static <O> Parser<O>Returns aParserin the error state thattraps the given parseerror.static <O> Parser<O>error(Diagnostic diagnostic) Incrementally parses as muchinputas possible, and returns anotherParserthat represents the continuation of how to parse additionalInput.feed(InputBuffer input) Incrementally decodes as muchinputbuffer data as possible, and returns anotherDecoderthat represents the continuation of how to decode additional buffer data.Returns aParsercontinuation whose behavior may be altered by the given out-of-bandcondition.booleanisCont()booleanisDone()Returnstruewhen parsing has terminated successfully, andbindwill return the parsed result.booleanisError()Returnstruewhen parsing has terminated in failure, andtrapwill return the parse error.trap()Returns the parse error.
-
Constructor Details
-
Parser
public Parser()
-
-
Method Details
-
isCont
public boolean isCont() -
isDone
public boolean isDone()Returnstruewhen parsing has terminated successfully, andbindwill return the parsed result. i.e. thisParseris in the done state. -
isError
public boolean isError()Returnstruewhen parsing has terminated in failure, andtrapwill return the parse error. i.e. thisParseris in the error state. -
feed
Incrementally parses as muchinputas possible, and returns anotherParserthat represents the continuation of how to parse additionalInput. Ifinputenters the done state,feedmust return a terminatedParser, i.e. aParserin the done state, or in the error state. The giveninputis only guaranteed to be valid for the duration of the method call; references toinputmust not be stored. -
feed
Description copied from class:DecoderIncrementally decodes as muchinputbuffer data as possible, and returns anotherDecoderthat represents the continuation of how to decode additional buffer data. IfisLastistrue, thenfeedmust return a terminatedDecoder, i.e. aDecoderin the done state, or in the error state. The giveninputbuffer is only guaranteed to be valid for the duration of the method call; references toinputmust not be stored. -
fork
Returns aParsercontinuation whose behavior may be altered by the given out-of-bandcondition. -
bind
Returns the parsed result. Only guaranteed to return a result when in the done state.- Overrides:
bindin classDecoder<O>- Throws:
IllegalStateException- if thisParseris not in the done state.
-
trap
Returns the parse error. Only guaranteed to return an error when in the error state.- Overrides:
trapin classDecoder<O>- Throws:
IllegalStateException- if thisParseris not in the error state.
-
asError
Casts an erroredParserto a different output type. AParserin the error state can have any output type.- Overrides:
asErrorin classDecoder<O>- Throws:
IllegalStateException- if thisParseris not in the error state.
-
done
Returns aParserin the done state thatbinds anullparsed result. -
done
Returns aParserin the done state thatbinds the given parsedoutput. -
error
Returns aParserin the error state thattraps the given parseerror. -
error
-