Class ParserImpl

java.lang.Object
org.snakeyaml.engine.v2.parser.ParserImpl
All Implemented Interfaces:
Iterator<Event>, Parser

public class ParserImpl extends 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.

  • Field Details

  • Constructor Details

    • ParserImpl

      @Deprecated public ParserImpl(StreamReader reader, LoadSettings settings)
      Deprecated.
      use the other constructor with LoadSettings first
      Parameters:
      reader - - the input
      settings - - the configuration options
    • ParserImpl

      public ParserImpl(LoadSettings settings, StreamReader reader)
      Create
      Parameters:
      settings - - configuration options
      reader - - the input
    • ParserImpl

      @Deprecated public ParserImpl(Scanner scanner, LoadSettings settings)
      Deprecated.
      use the other constructor with LoadSettings first
      Parameters:
      scanner - - input
      settings - - configuration options
    • ParserImpl

      public ParserImpl(LoadSettings settings, Scanner scanner)
      Create
      Parameters:
      settings - - configuration options
      scanner - - input
  • Method Details

    • checkEvent

      public boolean checkEvent(Event.ID id)
      Check the ID of the next event.
      Specified by:
      checkEvent in interface Parser
      Parameters:
      id - Event ID to match
      Returns:
      true if the next event has the given ID. Returns false 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 interface Parser
      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).
      Specified by:
      next in interface Iterator<Event>
      Specified by:
      next in interface Parser
      Returns:
      the next parsed event
    • hasNext

      public boolean hasNext()
      Produce the event if not yet present.
      Specified by:
      hasNext in interface 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(Optional<Mark> mark)
       block_mapping     ::= BLOCK-MAPPING_START
                 ((KEY block_node_or_indentless_sequence?)?
                 (VALUE block_node_or_indentless_sequence?)?)*
                 BLOCK-END
       
    • markPop

      private Optional<Mark> markPop()
    • markPush

      private void markPush(Optional<Mark> mark)