Package org.yaml.snakeyaml.parser
Class ParserImpl
- java.lang.Object
-
- org.yaml.snakeyaml.parser.ParserImpl
-
- All Implemented Interfaces:
Parser
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 classParserImpl.ParseBlockMappingFirstKeyprivate classParserImpl.ParseBlockMappingKeyprivate classParserImpl.ParseBlockMappingValueprivate classParserImpl.ParseBlockMappingValueCommentprivate classParserImpl.ParseBlockMappingValueCommentListprivate classParserImpl.ParseBlockNodeblock_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 classParserImpl.ParseBlockSequenceEntryKeyprivate classParserImpl.ParseBlockSequenceEntryValueprivate classParserImpl.ParseBlockSequenceFirstEntryprivate classParserImpl.ParseDocumentContentprivate classParserImpl.ParseDocumentEndprivate classParserImpl.ParseDocumentStartprivate classParserImpl.ParseFlowEndCommentprivate classParserImpl.ParseFlowMappingEmptyValueprivate classParserImpl.ParseFlowMappingFirstKeyflow_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 classParserImpl.ParseFlowMappingKeyprivate classParserImpl.ParseFlowMappingValueprivate classParserImpl.ParseFlowSequenceEntryprivate classParserImpl.ParseFlowSequenceEntryMappingEndprivate classParserImpl.ParseFlowSequenceEntryMappingKeyprivate classParserImpl.ParseFlowSequenceEntryMappingValueprivate classParserImpl.ParseFlowSequenceFirstEntryflow_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 classParserImpl.ParseImplicitDocumentStartprivate classParserImpl.ParseIndentlessSequenceEntryKeyprivate classParserImpl.ParseIndentlessSequenceEntryValueprivate classParserImpl.ParseStreamStartstream ::= STREAM-START implicit_document? explicit_document* STREAM-END implicit_document ::= block_node DOCUMENT-END* explicit_document ::= DIRECTIVE* DOCUMENT-START block_node? DOCUMENT-END*
-
Field Summary
Fields Modifier and Type Field Description private EventcurrentEventprivate static java.util.Map<java.lang.String,java.lang.String>DEFAULT_TAGSprivate VersionTagsTupledirectivesprivate ArrayStack<Mark>marksprotected Scannerscannerprivate Productionstateprivate ArrayStack<Production>states
-
Constructor Summary
Constructors Constructor Description ParserImpl(StreamReader reader)Deprecated.use optionsParserImpl(StreamReader reader, boolean parseComments)Deprecated.use options insteadParserImpl(StreamReader reader, LoaderOptions options)ParserImpl(Scanner scanner)
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description booleancheckEvent(Event.ID choice)Check the type of the next event.EventgetEvent()Get the next event and proceed further.private EventparseBlockNodeOrIndentlessSequence()private EventparseFlowNode()private EventparseNode(boolean block, boolean indentlessSequence)EventpeekEvent()Get the next event.private VersionTagsTupleprocessDirectives()https://yaml.org/spec/1.1/#id898785 says "If the document specifies no directives, it is parsed using the same settings as the previous document.private EventprocessEmptyScalar(Mark mark)block_mapping ::= BLOCK-MAPPING_START ((KEY block_node_or_indentless_sequence?)? (VALUE block_node_or_indentless_sequence?)?)* BLOCK-ENDprivate CommentEventproduceCommentEvent(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
-
currentEvent
private Event currentEvent
-
states
private final ArrayStack<Production> states
-
marks
private final ArrayStack<Mark> marks
-
state
private Production state
-
directives
private VersionTagsTuple directives
-
-
Constructor Detail
-
ParserImpl
@Deprecated public ParserImpl(StreamReader reader)
Deprecated.use optionsCreate- Parameters:
reader- - input
-
ParserImpl
@Deprecated public ParserImpl(StreamReader reader, boolean parseComments)
Deprecated.use options insteadCreate- Parameters:
reader- - inputparseComments- - true to keep the comments
-
ParserImpl
public ParserImpl(StreamReader reader, LoaderOptions options)
-
ParserImpl
public ParserImpl(Scanner scanner)
-
-
Method Detail
-
checkEvent
public boolean checkEvent(Event.ID choice)
Check the type of the next event.- Specified by:
checkEventin interfaceParser- Parameters:
choice- Event ID.- Returns:
trueif the next event can be assigned to a variable of the given type. Returnsfalseif no more events are available.
-
peekEvent
public Event peekEvent()
Get the next event.- Specified by:
peekEventin interfaceParser- Returns:
- The event that will be returned on the next call to
Parser.getEvent()
-
getEvent
public Event getEvent()
Get the next event and proceed further.
-
produceCommentEvent
private CommentEvent produceCommentEvent(CommentToken token)
-
processDirectives
private VersionTagsTuple processDirectives()
https://yaml.org/spec/1.1/#id898785 says "If the document specifies no directives, it is parsed using the same settings as the previous document. If the document does specify any directives, all directives of previous documents, if any, are ignored." TODO the last statement is not respected (as in PyYAML, to work the same)- Returns:
- directives to be applied for the current document
-
parseFlowNode
private Event parseFlowNode()
-
parseBlockNodeOrIndentlessSequence
private Event parseBlockNodeOrIndentlessSequence()
-
parseNode
private Event parseNode(boolean block, boolean indentlessSequence)
-
-