Class ParserImpl

  • All Implemented Interfaces:
    java.util.Iterator<Event>, 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.

    • Field Detail

      • DEFAULT_TAGS

        private static final java.util.Map<java.lang.String,​java.lang.String> DEFAULT_TAGS
      • scanner

        protected final Scanner scanner
        tokeniser
      • 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 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 Detail

      • 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 java.util.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 java.util.Iterator<Event>
        Returns:
        true if there is another event
      • produce

        private void produce()
      • 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)