Package org.snakeyaml.engine.v2.parser
Class ParserImpl
- java.lang.Object
-
- org.snakeyaml.engine.v2.parser.ParserImpl
-
public class ParserImpl extends java.lang.Object implements Parser
# 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 Classes Modifier and Type Class Description private class
ParserImpl.ParseBlockMappingFirstKey
private class
ParserImpl.ParseBlockMappingKey
private class
ParserImpl.ParseBlockMappingValue
private class
ParserImpl.ParseBlockMappingValueComment
private class
ParserImpl.ParseBlockMappingValueCommentList
private class
ParserImpl.ParseBlockNode
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_mappingprivate class
ParserImpl.ParseBlockSequenceEntryKey
private class
ParserImpl.ParseBlockSequenceEntryValue
private class
ParserImpl.ParseBlockSequenceFirstEntry
private class
ParserImpl.ParseDocumentContent
private class
ParserImpl.ParseDocumentEnd
private class
ParserImpl.ParseDocumentStart
private class
ParserImpl.ParseFlowEndComment
private class
ParserImpl.ParseFlowMappingEmptyValue
private class
ParserImpl.ParseFlowMappingFirstKey
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?)?private class
ParserImpl.ParseFlowMappingKey
private class
ParserImpl.ParseFlowMappingValue
private class
ParserImpl.ParseFlowSequenceEntry
private class
ParserImpl.ParseFlowSequenceEntryMappingEnd
private class
ParserImpl.ParseFlowSequenceEntryMappingKey
private class
ParserImpl.ParseFlowSequenceEntryMappingValue
private class
ParserImpl.ParseFlowSequenceFirstEntry
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?)? Note that while production rules for both flow_sequence_entry and flow_mapping_entry are equal, their interpretations are different.private class
ParserImpl.ParseImplicitDocumentStart
private class
ParserImpl.ParseIndentlessSequenceEntryKey
private class
ParserImpl.ParseIndentlessSequenceEntryValue
private class
ParserImpl.ParseStreamStart
-
Field Summary
Fields Modifier and Type Field Description private java.util.Optional<Event>
currentEvent
private static java.util.Map<java.lang.String,java.lang.String>
DEFAULT_TAGS
private java.util.Map<java.lang.String,java.lang.String>
directiveTags
private ArrayStack<java.util.Optional<Mark>>
marksStack
protected Scanner
scanner
tokeniserprivate LoadSettings
settings
private java.util.Optional<Production>
state
private ArrayStack<Production>
states
-
Constructor Summary
Constructors Constructor Description ParserImpl(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
All Methods Instance Methods Concrete Methods Modifier and Type Method Description boolean
checkEvent(Event.ID id)
Check the ID of the next event.boolean
hasNext()
Produce the event if not yet present.private java.util.Optional<Mark>
markPop()
private void
markPush(java.util.Optional<Mark> mark)
Event
next()
Consume the event (get the next event and removed it).private Event
parseBlockNodeOrIndentlessSequence()
private Event
parseFlowNode()
private Event
parseNode(boolean block, boolean indentlessSequence)
Event
peekEvent()
Get the next event (and keep it).private VersionTagsTuple
processDirectives()
private Event
processEmptyScalar(java.util.Optional<Mark> mark)
block_mapping ::= BLOCK-MAPPING_START ((KEY block_node_or_indentless_sequence?)? (VALUE block_node_or_indentless_sequence?)?)* BLOCK-ENDprivate void
produce()
private CommentEvent
produceCommentEvent(CommentToken token)
-
-
-
Field Detail
-
DEFAULT_TAGS
private static final java.util.Map<java.lang.String,java.lang.String> DEFAULT_TAGS
-
scanner
protected final Scanner scanner
tokeniser
-
settings
private final LoadSettings settings
-
states
private final ArrayStack<Production> states
-
marksStack
private final ArrayStack<java.util.Optional<Mark>> marksStack
-
currentEvent
private java.util.Optional<Event> currentEvent
-
state
private java.util.Optional<Production> state
-
directiveTags
private java.util.Map<java.lang.String,java.lang.String> directiveTags
-
-
Constructor Detail
-
ParserImpl
@Deprecated public ParserImpl(StreamReader reader, LoadSettings settings)
Deprecated.use the other constructor with LoadSettings first- Parameters:
reader
- - the inputsettings
- - the configuration options
-
ParserImpl
public ParserImpl(LoadSettings settings, StreamReader reader)
Create- Parameters:
settings
- - configuration optionsreader
- - the input
-
ParserImpl
@Deprecated public ParserImpl(Scanner scanner, LoadSettings settings)
Deprecated.use the other constructor with LoadSettings first- Parameters:
scanner
- - inputsettings
- - configuration options
-
ParserImpl
public ParserImpl(LoadSettings settings, Scanner scanner)
Create- Parameters:
settings
- - configuration optionsscanner
- - input
-
-
Method Detail
-
checkEvent
public boolean checkEvent(Event.ID id)
Check the ID of the next event.- Specified by:
checkEvent
in interfaceParser
- Parameters:
id
- Event ID to match- Returns:
true
if the next event has the given ID. Returnsfalse
if no more events are available.
-
peekEvent
public Event peekEvent()
Get the next event (and keep it). Produce the event if not yet present.- Specified by:
peekEvent
in interfaceParser
- Returns:
- The event that will be returned on the next call to
Parser.next()
-
next
public Event next()
Consume the event (get the next event and removed it).
-
hasNext
public boolean hasNext()
Produce the event if not yet present.- Specified by:
hasNext
in interfacejava.util.Iterator<Event>
- Returns:
- true if there is another event
-
produce
private void produce()
-
produceCommentEvent
private CommentEvent produceCommentEvent(CommentToken token)
-
processDirectives
private VersionTagsTuple processDirectives()
-
parseFlowNode
private Event parseFlowNode()
-
parseBlockNodeOrIndentlessSequence
private Event parseBlockNodeOrIndentlessSequence()
-
parseNode
private Event parseNode(boolean block, boolean indentlessSequence)
-
processEmptyScalar
private Event processEmptyScalar(java.util.Optional<Mark> mark)
block_mapping ::= BLOCK-MAPPING_START ((KEY block_node_or_indentless_sequence?)? (VALUE block_node_or_indentless_sequence?)?)* BLOCK-END
-
markPop
private java.util.Optional<Mark> markPop()
-
markPush
private void markPush(java.util.Optional<Mark> mark)
-
-