Class ParserImpl
java.lang.Object
org.snakeyaml.engine.v2.parser.ParserImpl
# The following YAML grammar is LL(1) and is parsed by a recursive descent parser.
stream ::= STREAM-START implicit_document? explicit_document* STREAM-END
implicit_document ::= block_node DOCUMENT-END*
explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
block_node_or_indentless_sequence ::=
ALIAS
| properties (block_content | indentless_block_sequence)?
| block_content
| indentless_block_sequence
block_node ::= ALIAS
| properties block_content?
| block_content
flow_node ::= ALIAS
| properties flow_content?
| flow_content
properties ::= TAG ANCHOR? | ANCHOR TAG?
block_content ::= block_collection | flow_collection | SCALAR
flow_content ::= flow_collection | SCALAR
block_collection ::= block_sequence | block_mapping
flow_collection ::= flow_sequence | flow_mapping
block_sequence ::= BLOCK-SEQUENCE-START (BLOCK-ENTRY block_node?)* BLOCK-END
indentless_sequence ::= (BLOCK-ENTRY block_node?)+
block_mapping ::= BLOCK-MAPPING_START
((KEY block_node_or_indentless_sequence?)?
(VALUE block_node_or_indentless_sequence?)?)*
BLOCK-END
flow_sequence ::= FLOW-SEQUENCE-START
(flow_sequence_entry FLOW-ENTRY)*
flow_sequence_entry?
FLOW-SEQUENCE-END
flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
flow_mapping ::= FLOW-MAPPING-START
(flow_mapping_entry FLOW-ENTRY)*
flow_mapping_entry?
FLOW-MAPPING-END
flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?
#
FIRST sets:
#
stream: { STREAM-START }
explicit_document: { DIRECTIVE DOCUMENT-START }
implicit_document: FIRST(block_node)
block_node: { ALIAS TAG ANCHOR SCALAR BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START }
flow_node: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START }
block_content: { BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START SCALAR }
flow_content: { FLOW-SEQUENCE-START FLOW-MAPPING-START SCALAR }
block_collection: { BLOCK-SEQUENCE-START BLOCK-MAPPING-START }
flow_collection: { FLOW-SEQUENCE-START FLOW-MAPPING-START }
block_sequence: { BLOCK-SEQUENCE-START }
block_mapping: { BLOCK-MAPPING-START }
block_node_or_indentless_sequence: { ALIAS ANCHOR TAG SCALAR BLOCK-SEQUENCE-START BLOCK-MAPPING-START FLOW-SEQUENCE-START FLOW-MAPPING-START BLOCK-ENTRY }
indentless_sequence: { ENTRY }
flow_collection: { FLOW-SEQUENCE-START FLOW-MAPPING-START }
flow_sequence: { FLOW-SEQUENCE-START }
flow_mapping: { FLOW-MAPPING-START }
flow_sequence_entry: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START KEY }
flow_mapping_entry: { ALIAS ANCHOR TAG SCALAR FLOW-SEQUENCE-START FLOW-MAPPING-START KEY }
Since writing a recursive-descendant parser is a straightforward task, we do not give many comments here.
-
Nested Class Summary
Nested ClassesModifier and TypeClassDescriptionprivate classprivate classprivate classprivate classprivate classprivate classblock_node_or_indentless_sequence ::= ALIAS | properties (block_content | indentless_block_sequence)? | block_content | indentless_block_sequence block_node ::= ALIAS | properties block_content? | block_content flow_node ::= ALIAS | properties flow_content? | flow_content properties ::= TAG ANCHOR? | ANCHOR TAG? block_content ::= block_collection | flow_collection | SCALAR flow_content ::= flow_collection | SCALAR block_collection ::= block_sequence | block_mapping flow_collection ::= flow_sequence | flow_mappingprivate classprivate classprivate classprivate classprivate classprivate classprivate classprivate classprivate classflow_mapping ::= FLOW-MAPPING-START (flow_mapping_entry FLOW-ENTRY)* flow_mapping_entry? FLOW-MAPPING-END flow_mapping_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)?private classprivate classprivate classprivate classprivate classprivate classprivate classflow_sequence ::= FLOW-SEQUENCE-START (flow_sequence_entry FLOW-ENTRY)* flow_sequence_entry? FLOW-SEQUENCE-END flow_sequence_entry ::= flow_node | KEY flow_node? (VALUE flow_node?)? Note that while production rules for both flow_sequence_entry and flow_mapping_entry are equal, their interpretations are different.private classprivate classprivate classprivate class -
Field Summary
FieldsModifier and TypeFieldDescriptionprivate final ArrayStack<Optional<Mark>> protected final Scannertokeniserprivate final LoadSettingsprivate Optional<Production> private final ArrayStack<Production> -
Constructor Summary
ConstructorsConstructorDescriptionParserImpl(LoadSettings settings, Scanner scanner) CreateParserImpl(LoadSettings settings, StreamReader reader) CreateParserImpl(Scanner scanner, LoadSettings settings) Deprecated.use the other constructor with LoadSettings firstParserImpl(StreamReader reader, LoadSettings settings) Deprecated.use the other constructor with LoadSettings first -
Method Summary
Modifier and TypeMethodDescriptionbooleancheckEvent(Event.ID id) Check the ID of the next event.booleanhasNext()Produce the event if not yet present.markPop()private voidnext()Consume the event (get the next event and removed it).private Eventprivate Eventprivate EventparseNode(boolean block, boolean indentlessSequence) Get the next event (and keep it).private VersionTagsTupleprivate EventprocessEmptyScalar(Optional<Mark> mark) block_mapping ::= BLOCK-MAPPING_START ((KEY block_node_or_indentless_sequence?)? (VALUE block_node_or_indentless_sequence?)?)* BLOCK-ENDprivate voidproduce()private CommentEventproduceCommentEvent(CommentToken token) Methods inherited from class Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, waitMethods inherited from interface Iterator
forEachRemaining, remove
-
Field Details
-
DEFAULT_TAGS
-
scanner
tokeniser -
settings
-
states
-
marksStack
-
currentEvent
-
state
-
directiveTags
-
-
Constructor Details
-
ParserImpl
Deprecated.use the other constructor with LoadSettings first- Parameters:
reader- - the inputsettings- - the configuration options
-
ParserImpl
Create- Parameters:
settings- - configuration optionsreader- - the input
-
ParserImpl
Deprecated.use the other constructor with LoadSettings first- Parameters:
scanner- - inputsettings- - configuration options
-
ParserImpl
Create- Parameters:
settings- - configuration optionsscanner- - input
-
-
Method Details
-
checkEvent
Check the ID of the next event.- Specified by:
checkEventin interfaceParser- Parameters:
id- Event ID to match- Returns:
trueif the next event has the given ID. Returnsfalseif no more events are available.
-
peekEvent
Get the next event (and keep it). Produce the event if not yet present.- Specified by:
peekEventin interfaceParser- Returns:
- The event that will be returned on the next call to
Parser.next()
-
next
-
hasNext
-
produce
private void produce() -
produceCommentEvent
-
processDirectives
-
parseFlowNode
-
parseBlockNodeOrIndentlessSequence
-
parseNode
-
processEmptyScalar
-
markPop
-
markPush
-