Example #1
0
        private YamlEvent Produce()
        {
            var prod = _parseStack.Pop();

            //Console.WriteLine(prod);
            switch (prod)
            {
            case Production.STREAM: {
                _parseStack.Push(Production.STREAM_END);
                _parseStack.Push(Production.EXPLICIT_DOCUMENT);
                _parseStack.Push(Production.IMPLICIT_DOCUMENT);
                _parseStack.Push(Production.STREAM_START);
                return(null);
            }

            case Production.STREAM_START: {
                _scanner.GetToken();
                return(StreamStartEvent.Instance);
            }

            case Production.STREAM_END: {
                _scanner.GetToken();
                return(StreamEndEvent.Instance);
            }

            case Production.IMPLICIT_DOCUMENT: {
                Token curr = _scanner.PeekToken();
                if (!(curr is DirectiveToken || curr is DocumentStartToken || curr is StreamEndToken))
                {
                    _parseStack.Push(Production.DOCUMENT_END);
                    _parseStack.Push(Production.BLOCK_NODE);
                    _parseStack.Push(Production.DOCUMENT_START_IMPLICIT);
                }
                return(null);
            }

            case Production.EXPLICIT_DOCUMENT: {
                if (!(_scanner.PeekToken() is StreamEndToken))
                {
                    _parseStack.Push(Production.EXPLICIT_DOCUMENT);
                    _parseStack.Push(Production.DOCUMENT_END);
                    _parseStack.Push(Production.BLOCK_NODE);
                    _parseStack.Push(Production.DOCUMENT_START);
                }
                return(null);
            }

            case Production.DOCUMENT_START: {
                Token   tok = _scanner.PeekToken();
                Version version;
                Dictionary <string, string> tags;
                ProcessDirectives(out version, out tags);
                if (!(_scanner.PeekToken() is DocumentStartToken))
                {
                    ReportError("expected '<document start>', but found: {0}", tok);
                }
                _scanner.GetToken();
                return(new DocumentStartEvent(true, version, tags));
            }

            case Production.DOCUMENT_START_IMPLICIT: {
                Version version;
                Dictionary <string, string> tags;
                ProcessDirectives(out version, out tags);
                return(new DocumentStartEvent(false, version, tags));
            }

            case Production.DOCUMENT_END: {
                Token tok       = _scanner.PeekToken();
                bool  @explicit = false;
                while (_scanner.PeekToken() is DocumentEndToken)
                {
                    _scanner.GetToken();
                    @explicit = true;
                }
                return(@explicit ? DocumentEndEvent.ExplicitInstance : DocumentEndEvent.ImplicitInstance);
            }

            case Production.BLOCK_NODE: {
                Token curr = _scanner.PeekToken();
                if (curr is DirectiveToken || curr is DocumentStartToken || curr is DocumentEndToken || curr is StreamEndToken)
                {
                    _parseStack.Push(Production.EMPTY_SCALAR);
                }
                else
                {
                    if (curr is AliasToken)
                    {
                        _parseStack.Push(Production.ALIAS);
                    }
                    else
                    {
                        _parseStack.Push(Production.PROPERTIES_END);
                        _parseStack.Push(Production.BLOCK_CONTENT);
                        _parseStack.Push(Production.PROPERTIES);
                    }
                }
                return(null);
            }

            case Production.BLOCK_CONTENT: {
                Token tok = _scanner.PeekToken();
                if (tok is BlockSequenceStartToken)
                {
                    _parseStack.Push(Production.BLOCK_SEQUENCE);
                }
                else if (tok is BlockMappingStartToken)
                {
                    _parseStack.Push(Production.BLOCK_MAPPING);
                }
                else if (tok is FlowSequenceStartToken)
                {
                    _parseStack.Push(Production.FLOW_SEQUENCE);
                }
                else if (tok is FlowMappingStartToken)
                {
                    _parseStack.Push(Production.FLOW_MAPPING);
                }
                else if (tok is ScalarToken)
                {
                    _parseStack.Push(Production.SCALAR);
                }
                else
                {
                    // Part of solution for JRUBY-718
                    return(new ScalarEvent(_anchors.First.Value, _tags.First.Value ?? Tags.Str, ScalarValueType.String, "", ScalarQuotingStyle.Single));
                }
                return(null);
            }

            case Production.PROPERTIES: {
                string anchor = null;
                string tag    = null;
                if (_scanner.PeekToken() is AnchorToken)
                {
                    anchor = ((AnchorToken)_scanner.GetToken()).Value;
                    if (_scanner.PeekToken() is TagToken)
                    {
                        tag = GetTag((TagToken)_scanner.GetToken());
                    }
                }
                else if (_scanner.PeekToken() is TagToken)
                {
                    tag = GetTag((TagToken)_scanner.GetToken());
                    if (_scanner.PeekToken() is AnchorToken)
                    {
                        anchor = ((AnchorToken)_scanner.GetToken()).Value;
                    }
                }
                _anchors.AddFirst(anchor);
                _tags.AddFirst(tag);
                return(null);
            }

            case Production.PROPERTIES_END: {
                _anchors.RemoveFirst();
                _tags.RemoveFirst();
                return(null);
            }

            case Production.FLOW_CONTENT: {
                Token tok = _scanner.PeekToken();
                if (tok is FlowSequenceStartToken)
                {
                    _parseStack.Push(Production.FLOW_SEQUENCE);
                }
                else if (tok is FlowMappingStartToken)
                {
                    _parseStack.Push(Production.FLOW_MAPPING);
                }
                else if (tok is ScalarToken)
                {
                    _parseStack.Push(Production.SCALAR);
                }
                else
                {
                    ReportError("while scanning a flow node: expected the node content, but found: {0}", tok);
                }
                return(null);
            }

            case Production.BLOCK_SEQUENCE: {
                _parseStack.Push(Production.BLOCK_SEQUENCE_END);
                _parseStack.Push(Production.BLOCK_SEQUENCE_ENTRY);
                _parseStack.Push(Production.BLOCK_SEQUENCE_START);
                return(null);
            }

            case Production.BLOCK_MAPPING: {
                _parseStack.Push(Production.BLOCK_MAPPING_END);
                _parseStack.Push(Production.BLOCK_MAPPING_ENTRY);
                _parseStack.Push(Production.BLOCK_MAPPING_START);
                return(null);
            }

            case Production.FLOW_SEQUENCE: {
                _parseStack.Push(Production.FLOW_SEQUENCE_END);
                _parseStack.Push(Production.FLOW_SEQUENCE_ENTRY);
                _parseStack.Push(Production.FLOW_SEQUENCE_START);
                return(null);
            }

            case Production.FLOW_MAPPING: {
                _parseStack.Push(Production.FLOW_MAPPING_END);
                _parseStack.Push(Production.FLOW_MAPPING_ENTRY);
                _parseStack.Push(Production.FLOW_MAPPING_START);
                return(null);
            }

            case Production.SCALAR: {
                ScalarToken     tok = (ScalarToken)_scanner.GetToken();
                ScalarValueType scalarType;
                if ((tok.Style == ScalarQuotingStyle.None && _tags.First.Value == null) || "!" == _tags.First.Value)
                {
                    scalarType = ScalarValueType.Unknown;
                }
                else if (_tags.First.Value == null)
                {
                    scalarType = ScalarValueType.String;
                }
                else
                {
                    scalarType = ScalarValueType.Other;
                }
                return(new ScalarEvent(_anchors.First.Value, _tags.First.Value, scalarType, tok.Value, tok.Style));
            }

            case Production.BLOCK_SEQUENCE_ENTRY: {
                if (_scanner.PeekToken() is BlockEntryToken)
                {
                    _scanner.GetToken();
                    if (!(_scanner.PeekToken() is BlockEntryToken || _scanner.PeekToken() is BlockEndToken))
                    {
                        _parseStack.Push(Production.BLOCK_SEQUENCE_ENTRY);
                        _parseStack.Push(Production.BLOCK_NODE);
                    }
                    else
                    {
                        _parseStack.Push(Production.BLOCK_SEQUENCE_ENTRY);
                        _parseStack.Push(Production.EMPTY_SCALAR);
                    }
                }
                return(null);
            }

            case Production.BLOCK_MAPPING_ENTRY: {
                if (_scanner.PeekToken() is KeyToken || _scanner.PeekToken() is ValueToken)
                {
                    if (_scanner.PeekToken() is KeyToken)
                    {
                        _scanner.GetToken();
                        Token curr = _scanner.PeekToken();
                        if (!(curr is KeyToken || curr is ValueToken || curr is BlockEndToken))
                        {
                            _parseStack.Push(Production.BLOCK_MAPPING_ENTRY);
                            _parseStack.Push(Production.BLOCK_MAPPING_ENTRY_VALUE);
                            _parseStack.Push(Production.BLOCK_NODE_OR_INDENTLESS_SEQUENCE);
                        }
                        else
                        {
                            _parseStack.Push(Production.BLOCK_MAPPING_ENTRY);
                            _parseStack.Push(Production.BLOCK_MAPPING_ENTRY_VALUE);
                            _parseStack.Push(Production.EMPTY_SCALAR);
                        }
                    }
                    else
                    {
                        _parseStack.Push(Production.BLOCK_MAPPING_ENTRY);
                        _parseStack.Push(Production.BLOCK_MAPPING_ENTRY_VALUE);
                        _parseStack.Push(Production.EMPTY_SCALAR);
                    }
                }
                return(null);
            }

            case Production.BLOCK_MAPPING_ENTRY_VALUE: {
                if (_scanner.PeekToken() is KeyToken || _scanner.PeekToken() is ValueToken)
                {
                    if (_scanner.PeekToken() is ValueToken)
                    {
                        _scanner.GetToken();
                        Token curr = _scanner.PeekToken();
                        if (!(curr is KeyToken || curr is ValueToken || curr is BlockEndToken))
                        {
                            _parseStack.Push(Production.BLOCK_NODE_OR_INDENTLESS_SEQUENCE);
                        }
                        else
                        {
                            _parseStack.Push(Production.EMPTY_SCALAR);
                        }
                    }
                    else
                    {
                        _parseStack.Push(Production.EMPTY_SCALAR);
                    }
                }
                return(null);
            }

            case Production.BLOCK_NODE_OR_INDENTLESS_SEQUENCE: {
                if (_scanner.PeekToken() is AliasToken)
                {
                    _parseStack.Push(Production.ALIAS);
                }
                else
                {
                    if (_scanner.PeekToken() is BlockEntryToken)
                    {
                        _parseStack.Push(Production.INDENTLESS_BLOCK_SEQUENCE);
                        _parseStack.Push(Production.PROPERTIES);
                    }
                    else
                    {
                        _parseStack.Push(Production.BLOCK_CONTENT);
                        _parseStack.Push(Production.PROPERTIES);
                    }
                }
                return(null);
            }

            case Production.BLOCK_SEQUENCE_START: {
                _scanner.GetToken();
                return(new SequenceStartEvent(_anchors.First.Value, _tags.First.Value != "!" ? _tags.First.Value : null, FlowStyle.Block));
            }

            case Production.BLOCK_SEQUENCE_END: {
                Token tok = _scanner.PeekToken();
                if (!(tok is BlockEndToken))
                {
                    ReportError("while scanning a block collection: expected <block end>, but found: {0}", tok);
                }
                _scanner.GetToken();
                return(SequenceEndEvent.Instance);
            }

            case Production.BLOCK_MAPPING_START: {
                _scanner.GetToken();
                return(new MappingStartEvent(_anchors.First.Value, _tags.First.Value != "!" ? _tags.First.Value : null, FlowStyle.Block));
            }

            case Production.BLOCK_MAPPING_END: {
                Token tok = _scanner.PeekToken();
                if (!(tok is BlockEndToken))
                {
                    ReportError("while scanning a block mapping: expected <block end>, but found: {0}", tok);
                }
                _scanner.GetToken();
                return(MappingEndEvent.Instance);
            }

            case Production.INDENTLESS_BLOCK_SEQUENCE: {
                _parseStack.Push(Production.BLOCK_INDENTLESS_SEQUENCE_END);
                _parseStack.Push(Production.INDENTLESS_BLOCK_SEQUENCE_ENTRY);
                _parseStack.Push(Production.BLOCK_INDENTLESS_SEQUENCE_START);
                return(null);
            }

            case Production.BLOCK_INDENTLESS_SEQUENCE_START: {
                return(new SequenceStartEvent(_anchors.First.Value, _tags.First.Value != "!" ? _tags.First.Value : null, FlowStyle.Block));
            }

            case Production.INDENTLESS_BLOCK_SEQUENCE_ENTRY: {
                if (_scanner.PeekToken() is BlockEntryToken)
                {
                    _scanner.GetToken();
                    Token curr = _scanner.PeekToken();
                    if (!(curr is BlockEntryToken || curr is KeyToken || curr is ValueToken || curr is BlockEndToken))
                    {
                        _parseStack.Push(Production.INDENTLESS_BLOCK_SEQUENCE_ENTRY);
                        _parseStack.Push(Production.BLOCK_NODE);
                    }
                    else
                    {
                        _parseStack.Push(Production.INDENTLESS_BLOCK_SEQUENCE_ENTRY);
                        _parseStack.Push(Production.EMPTY_SCALAR);
                    }
                }
                return(null);
            }

            case Production.BLOCK_INDENTLESS_SEQUENCE_END: {
                return(SequenceEndEvent.Instance);
            }

            case Production.FLOW_SEQUENCE_START: {
                _scanner.GetToken();
                return(new SequenceStartEvent(_anchors.First.Value, _tags.First.Value != "!" ? _tags.First.Value : null, FlowStyle.Inline));
            }

            case Production.FLOW_SEQUENCE_ENTRY: {
                if (!(_scanner.PeekToken() is FlowSequenceEndToken))
                {
                    if (_scanner.PeekToken() is KeyToken)
                    {
                        _parseStack.Push(Production.FLOW_SEQUENCE_ENTRY);
                        _parseStack.Push(Production.FLOW_ENTRY_MARKER);
                        _parseStack.Push(Production.FLOW_INTERNAL_MAPPING_END);
                        _parseStack.Push(Production.FLOW_INTERNAL_VALUE);
                        _parseStack.Push(Production.FLOW_INTERNAL_CONTENT);
                        _parseStack.Push(Production.FLOW_INTERNAL_MAPPING_START);
                    }
                    else
                    {
                        _parseStack.Push(Production.FLOW_SEQUENCE_ENTRY);
                        _parseStack.Push(Production.FLOW_NODE);
                        _parseStack.Push(Production.FLOW_ENTRY_MARKER);
                    }
                }
                return(null);
            }

            case Production.FLOW_SEQUENCE_END: {
                _scanner.GetToken();
                return(SequenceEndEvent.Instance);
            }

            case Production.FLOW_MAPPING_START: {
                _scanner.GetToken();
                return(new MappingStartEvent(_anchors.First.Value, _tags.First.Value != "!" ? _tags.First.Value : null, FlowStyle.Inline));
            }

            case Production.FLOW_MAPPING_ENTRY: {
                if (!(_scanner.PeekToken() is FlowMappingEndToken))
                {
                    if (_scanner.PeekToken() is KeyToken)
                    {
                        _parseStack.Push(Production.FLOW_MAPPING_ENTRY);
                        _parseStack.Push(Production.FLOW_ENTRY_MARKER);
                        _parseStack.Push(Production.FLOW_MAPPING_INTERNAL_VALUE);
                        _parseStack.Push(Production.FLOW_MAPPING_INTERNAL_CONTENT);
                    }
                    else
                    {
                        _parseStack.Push(Production.FLOW_MAPPING_ENTRY);
                        _parseStack.Push(Production.FLOW_NODE);
                        _parseStack.Push(Production.FLOW_ENTRY_MARKER);
                    }
                }
                return(null);
            }

            case Production.FLOW_MAPPING_END: {
                _scanner.GetToken();
                return(MappingEndEvent.Instance);
            }

            case Production.FLOW_INTERNAL_MAPPING_START: {
                _scanner.GetToken();
                return(new MappingStartEvent(null, null, FlowStyle.Inline));
            }

            case Production.FLOW_INTERNAL_CONTENT: {
                Token curr = _scanner.PeekToken();
                if (!(curr is ValueToken || curr is FlowEntryToken || curr is FlowSequenceEndToken))
                {
                    _parseStack.Push(Production.FLOW_NODE);
                }
                else
                {
                    _parseStack.Push(Production.EMPTY_SCALAR);
                }
                return(null);
            }

            case Production.FLOW_INTERNAL_VALUE: {
                if (_scanner.PeekToken() is ValueToken)
                {
                    _scanner.GetToken();
                    if (!((_scanner.PeekToken() is FlowEntryToken) || (_scanner.PeekToken() is FlowSequenceEndToken)))
                    {
                        _parseStack.Push(Production.FLOW_NODE);
                    }
                    else
                    {
                        _parseStack.Push(Production.EMPTY_SCALAR);
                    }
                }
                else
                {
                    _parseStack.Push(Production.EMPTY_SCALAR);
                }
                return(null);
            }

            case Production.FLOW_INTERNAL_MAPPING_END: {
                return(MappingEndEvent.Instance);
            }

            case Production.FLOW_ENTRY_MARKER: {
                if (_scanner.PeekToken() is FlowEntryToken)
                {
                    _scanner.GetToken();
                }
                return(null);
            }

            case Production.FLOW_NODE: {
                if (_scanner.PeekToken() is AliasToken)
                {
                    _parseStack.Push(Production.ALIAS);
                }
                else
                {
                    _parseStack.Push(Production.PROPERTIES_END);
                    _parseStack.Push(Production.FLOW_CONTENT);
                    _parseStack.Push(Production.PROPERTIES);
                }
                return(null);
            }

            case Production.FLOW_MAPPING_INTERNAL_CONTENT: {
                Token curr = _scanner.PeekToken();
                if (!(curr is ValueToken || curr is FlowEntryToken || curr is FlowMappingEndToken))
                {
                    _scanner.GetToken();
                    _parseStack.Push(Production.FLOW_NODE);
                }
                else
                {
                    _parseStack.Push(Production.EMPTY_SCALAR);
                }
                return(null);
            }

            case Production.FLOW_MAPPING_INTERNAL_VALUE: {
                if (_scanner.PeekToken() is ValueToken)
                {
                    _scanner.GetToken();
                    if (!(_scanner.PeekToken() is FlowEntryToken || _scanner.PeekToken() is FlowMappingEndToken))
                    {
                        _parseStack.Push(Production.FLOW_NODE);
                    }
                    else
                    {
                        _parseStack.Push(Production.EMPTY_SCALAR);
                    }
                }
                else
                {
                    _parseStack.Push(Production.EMPTY_SCALAR);
                }
                return(null);
            }

            case Production.ALIAS: {
                AliasToken tok = (AliasToken)_scanner.GetToken();
                return(new AliasEvent(tok.Value));
            }

            case Production.EMPTY_SCALAR: {
                return(new ScalarEvent(null, null, ScalarValueType.Other, null, ScalarQuotingStyle.None));
            }
            }

            return(null);
        }
Example #2
0
        private YamlEvent Produce()
        {
            switch (_parseStack.Pop())
            {
            case Production.STREAM: {
                _parseStack.Push(Production.STREAM_END);
                _parseStack.Push(Production.EXPLICIT_DOCUMENT);
                _parseStack.Push(Production.IMPLICIT_DOCUMENT);
                _parseStack.Push(Production.STREAM_START);
                return(null);
            }

            case Production.STREAM_START: {
                _scanner.GetToken();
                return(StreamStartEvent.Instance);
            }

            case Production.STREAM_END: {
                _scanner.GetToken();
                return(StreamEndEvent.Instance);
            }

            case Production.IMPLICIT_DOCUMENT: {
                Token curr = _scanner.PeekToken();
                if (!(curr is DirectiveToken || curr is DocumentStartToken || curr is StreamEndToken))
                {
                    _parseStack.Push(Production.DOCUMENT_END);
                    _parseStack.Push(Production.BLOCK_NODE);
                    _parseStack.Push(Production.DOCUMENT_START_IMPLICIT);
                }
                return(null);
            }

            case Production.EXPLICIT_DOCUMENT: {
                if (!(_scanner.PeekToken() is StreamEndToken))
                {
                    _parseStack.Push(Production.EXPLICIT_DOCUMENT);
                    _parseStack.Push(Production.DOCUMENT_END);
                    _parseStack.Push(Production.BLOCK_NODE);
                    _parseStack.Push(Production.DOCUMENT_START);
                }
                return(null);
            }

            case Production.DOCUMENT_START: {
                Token   tok = _scanner.PeekToken();
                Version version;
                Dictionary <string, string> tags;
                ProcessDirectives(out version, out tags);
                if (!(_scanner.PeekToken() is DocumentStartToken))
                {
                    throw new ParserException("expected '<document start>', but found: " + tok);
                }
                _scanner.GetToken();
                return(new DocumentStartEvent(true, version, tags));
            }

            case Production.DOCUMENT_START_IMPLICIT: {
                Version version;
                Dictionary <string, string> tags;
                ProcessDirectives(out version, out tags);
                return(new DocumentStartEvent(false, version, tags));
            }

            case Production.DOCUMENT_END: {
                Token tok       = _scanner.PeekToken();
                bool  @explicit = false;
                while (_scanner.PeekToken() is DocumentEndToken)
                {
                    _scanner.GetToken();
                    @explicit = true;
                }
                return(@explicit ? DocumentEndEvent.ExplicitInstance : DocumentEndEvent.ImplicitInstance);
            }

            case Production.BLOCK_NODE: {
                Token curr = _scanner.PeekToken();
                if (curr is DirectiveToken || curr is DocumentStartToken || curr is DocumentEndToken || curr is StreamEndToken)
                {
                    _parseStack.Push(Production.EMPTY_SCALAR);
                }
                else
                {
                    if (curr is AliasToken)
                    {
                        _parseStack.Push(Production.ALIAS);
                    }
                    else
                    {
                        _parseStack.Push(Production.PROPERTIES_END);
                        _parseStack.Push(Production.BLOCK_CONTENT);
                        _parseStack.Push(Production.PROPERTIES);
                    }
                }
                return(null);
            }

            case Production.BLOCK_CONTENT: {
                Token tok = _scanner.PeekToken();
                if (tok is BlockSequenceStartToken)
                {
                    _parseStack.Push(Production.BLOCK_SEQUENCE);
                }
                else if (tok is BlockMappingStartToken)
                {
                    _parseStack.Push(Production.BLOCK_MAPPING);
                }
                else if (tok is FlowSequenceStartToken)
                {
                    _parseStack.Push(Production.FLOW_SEQUENCE);
                }
                else if (tok is FlowMappingStartToken)
                {
                    _parseStack.Push(Production.FLOW_MAPPING);
                }
                else if (tok is ScalarToken)
                {
                    _parseStack.Push(Production.SCALAR);
                }
                else
                {
                    // Part of solution for JRUBY-718
                    bool[] @implicit = new bool[] { false, false };
                    return(new ScalarEvent(_anchors.First.Value, _tags.First.Value, @implicit, "", '\''));
                }
                return(null);
            }

            case Production.PROPERTIES: {
                string anchor = null;
                string tag    = null;
                if (_scanner.PeekToken() is AnchorToken)
                {
                    anchor = ((AnchorToken)_scanner.GetToken()).Value;
                    if (_scanner.PeekToken() is TagToken)
                    {
                        tag = GetTag((TagToken)_scanner.GetToken());
                    }
                }
                else if (_scanner.PeekToken() is TagToken)
                {
                    tag = GetTag((TagToken)_scanner.GetToken());
                    if (_scanner.PeekToken() is AnchorToken)
                    {
                        anchor = ((AnchorToken)_scanner.GetToken()).Value;
                    }
                }
                _anchors.AddFirst(anchor);
                _tags.AddFirst(tag);
                return(null);
            }

            case Production.PROPERTIES_END: {
                _anchors.RemoveFirst();
                _tags.RemoveFirst();
                return(null);
            }

            case Production.FLOW_CONTENT: {
                Token tok = _scanner.PeekToken();
                if (tok is FlowSequenceStartToken)
                {
                    _parseStack.Push(Production.FLOW_SEQUENCE);
                }
                else if (tok is FlowMappingStartToken)
                {
                    _parseStack.Push(Production.FLOW_MAPPING);
                }
                else if (tok is ScalarToken)
                {
                    _parseStack.Push(Production.SCALAR);
                }
                else
                {
                    throw new ParserException("while scanning a flow node: expected the node content, but found: " + tok);
                }
                return(null);
            }

            case Production.BLOCK_SEQUENCE: {
                _parseStack.Push(Production.BLOCK_SEQUENCE_END);
                _parseStack.Push(Production.BLOCK_SEQUENCE_ENTRY);
                _parseStack.Push(Production.BLOCK_SEQUENCE_START);
                return(null);
            }

            case Production.BLOCK_MAPPING: {
                _parseStack.Push(Production.BLOCK_MAPPING_END);
                _parseStack.Push(Production.BLOCK_MAPPING_ENTRY);
                _parseStack.Push(Production.BLOCK_MAPPING_START);
                return(null);
            }

            case Production.FLOW_SEQUENCE: {
                _parseStack.Push(Production.FLOW_SEQUENCE_END);
                _parseStack.Push(Production.FLOW_SEQUENCE_ENTRY);
                _parseStack.Push(Production.FLOW_SEQUENCE_START);
                return(null);
            }

            case Production.FLOW_MAPPING: {
                _parseStack.Push(Production.FLOW_MAPPING_END);
                _parseStack.Push(Production.FLOW_MAPPING_ENTRY);
                _parseStack.Push(Production.FLOW_MAPPING_START);
                return(null);
            }

            case Production.SCALAR: {
                ScalarToken tok       = (ScalarToken)_scanner.GetToken();
                bool[]      @implicit = null;
                if ((tok.Plain && _tags.First.Value == null) || "!" == _tags.First.Value)
                {
                    @implicit = new bool[] { true, false };
                }
                else if (_tags.First.Value == null)
                {
                    @implicit = new bool[] { false, true };
                }
                else
                {
                    @implicit = new bool[] { false, false };
                }
                return(new ScalarEvent(_anchors.First.Value, _tags.First.Value, @implicit, tok.Value, tok.Style));
            }

            case Production.BLOCK_SEQUENCE_ENTRY: {
                if (_scanner.PeekToken() is BlockEntryToken)
                {
                    _scanner.GetToken();
                    if (!(_scanner.PeekToken() is BlockEntryToken || _scanner.PeekToken() is BlockEndToken))
                    {
                        _parseStack.Push(Production.BLOCK_SEQUENCE_ENTRY);
                        _parseStack.Push(Production.BLOCK_NODE);
                    }
                    else
                    {
                        _parseStack.Push(Production.BLOCK_SEQUENCE_ENTRY);
                        _parseStack.Push(Production.EMPTY_SCALAR);
                    }
                }
                return(null);
            }

            case Production.BLOCK_MAPPING_ENTRY: {
                if (_scanner.PeekToken() is KeyToken || _scanner.PeekToken() is ValueToken)
                {
                    if (_scanner.PeekToken() is KeyToken)
                    {
                        _scanner.GetToken();
                        Token curr = _scanner.PeekToken();
                        if (!(curr is KeyToken || curr is ValueToken || curr is BlockEndToken))
                        {
                            _parseStack.Push(Production.BLOCK_MAPPING_ENTRY);
                            _parseStack.Push(Production.BLOCK_MAPPING_ENTRY_VALUE);
                            _parseStack.Push(Production.BLOCK_NODE_OR_INDENTLESS_SEQUENCE);
                        }
                        else
                        {
                            _parseStack.Push(Production.BLOCK_MAPPING_ENTRY);
                            _parseStack.Push(Production.BLOCK_MAPPING_ENTRY_VALUE);
                            _parseStack.Push(Production.EMPTY_SCALAR);
                        }
                    }
                    else
                    {
                        _parseStack.Push(Production.BLOCK_MAPPING_ENTRY);
                        _parseStack.Push(Production.BLOCK_MAPPING_ENTRY_VALUE);
                        _parseStack.Push(Production.EMPTY_SCALAR);
                    }
                }
                return(null);
            }

            case Production.BLOCK_MAPPING_ENTRY_VALUE: {
                if (_scanner.PeekToken() is KeyToken || _scanner.PeekToken() is ValueToken)
                {
                    if (_scanner.PeekToken() is ValueToken)
                    {
                        _scanner.GetToken();
                        Token curr = _scanner.PeekToken();
                        if (!(curr is KeyToken || curr is ValueToken || curr is BlockEndToken))
                        {
                            _parseStack.Push(Production.BLOCK_NODE_OR_INDENTLESS_SEQUENCE);
                        }
                        else
                        {
                            _parseStack.Push(Production.EMPTY_SCALAR);
                        }
                    }
                    else
                    {
                        _parseStack.Push(Production.EMPTY_SCALAR);
                    }
                }
                return(null);
            }

            case Production.BLOCK_NODE_OR_INDENTLESS_SEQUENCE: {
                if (_scanner.PeekToken() is AliasToken)
                {
                    _parseStack.Push(Production.ALIAS);
                }
                else
                {
                    if (_scanner.PeekToken() is BlockEntryToken)
                    {
                        _parseStack.Push(Production.INDENTLESS_BLOCK_SEQUENCE);
                        _parseStack.Push(Production.PROPERTIES);
                    }
                    else
                    {
                        _parseStack.Push(Production.BLOCK_CONTENT);
                        _parseStack.Push(Production.PROPERTIES);
                    }
                }
                return(null);
            }

            case Production.BLOCK_SEQUENCE_START: {
                bool @implicit = _tags.First.Value == null || _tags.First.Value == "!";
                _scanner.GetToken();
                return(new SequenceStartEvent(_anchors.First.Value, _tags.First.Value, @implicit, false));
            }

            case Production.BLOCK_SEQUENCE_END: {
                Token tok = null;
                if (!(_scanner.PeekToken() is BlockEndToken))
                {
                    tok = _scanner.PeekToken();
                    throw new ParserException("while scanning a block collection: expected <block end>, but found: " + tok);
                }
                _scanner.GetToken();
                return(SequenceEndEvent.Instance);
            }

            case Production.BLOCK_MAPPING_START: {
                bool @implicit = _tags.First.Value == null || _tags.First.Value == "!";
                _scanner.GetToken();
                return(new MappingStartEvent(_anchors.First.Value, _tags.First.Value, @implicit, false));
            }

            case Production.BLOCK_MAPPING_END: {
                Token tok = null;
                if (!(_scanner.PeekToken() is BlockEndToken))
                {
                    tok = _scanner.PeekToken();
                    throw new ParserException("while scanning a block mapping: expected <block end>, but found: " + tok);
                }
                _scanner.GetToken();
                return(MappingEndEvent.Instance);
            }

            case Production.INDENTLESS_BLOCK_SEQUENCE: {
                _parseStack.Push(Production.BLOCK_INDENTLESS_SEQUENCE_END);
                _parseStack.Push(Production.INDENTLESS_BLOCK_SEQUENCE_ENTRY);
                _parseStack.Push(Production.BLOCK_INDENTLESS_SEQUENCE_START);
                return(null);
            }

            case Production.BLOCK_INDENTLESS_SEQUENCE_START: {
                bool @implicit = _tags.First.Value == null || _tags.First.Value == "!";
                return(new SequenceStartEvent(_anchors.First.Value, _tags.First.Value, @implicit, false));
            }

            case Production.INDENTLESS_BLOCK_SEQUENCE_ENTRY: {
                if (_scanner.PeekToken() is BlockEntryToken)
                {
                    _scanner.GetToken();
                    Token curr = _scanner.PeekToken();
                    if (!(curr is BlockEntryToken || curr is KeyToken || curr is ValueToken || curr is BlockEndToken))
                    {
                        _parseStack.Push(Production.INDENTLESS_BLOCK_SEQUENCE_ENTRY);
                        _parseStack.Push(Production.BLOCK_NODE);
                    }
                    else
                    {
                        _parseStack.Push(Production.INDENTLESS_BLOCK_SEQUENCE_ENTRY);
                        _parseStack.Push(Production.EMPTY_SCALAR);
                    }
                }
                return(null);
            }

            case Production.BLOCK_INDENTLESS_SEQUENCE_END: {
                return(SequenceEndEvent.Instance);
            }

            case Production.FLOW_SEQUENCE_START: {
                bool @implicit = _tags.First.Value == null || _tags.First.Value == "!";
                _scanner.GetToken();
                return(new SequenceStartEvent(_anchors.First.Value, _tags.First.Value, @implicit, true));
            }

            case Production.FLOW_SEQUENCE_ENTRY: {
                if (!(_scanner.PeekToken() is FlowSequenceEndToken))
                {
                    if (_scanner.PeekToken() is KeyToken)
                    {
                        _parseStack.Push(Production.FLOW_SEQUENCE_ENTRY);
                        _parseStack.Push(Production.FLOW_ENTRY_MARKER);
                        _parseStack.Push(Production.FLOW_INTERNAL_MAPPING_END);
                        _parseStack.Push(Production.FLOW_INTERNAL_VALUE);
                        _parseStack.Push(Production.FLOW_INTERNAL_CONTENT);
                        _parseStack.Push(Production.FLOW_INTERNAL_MAPPING_START);
                    }
                    else
                    {
                        _parseStack.Push(Production.FLOW_SEQUENCE_ENTRY);
                        _parseStack.Push(Production.FLOW_NODE);
                        _parseStack.Push(Production.FLOW_ENTRY_MARKER);
                    }
                }
                return(null);
            }

            case Production.FLOW_SEQUENCE_END: {
                _scanner.GetToken();
                return(SequenceEndEvent.Instance);
            }

            case Production.FLOW_MAPPING_START: {
                bool @implicit = _tags.First.Value == null || _tags.First.Value == "!";
                _scanner.GetToken();
                return(new MappingStartEvent(_anchors.First.Value, _tags.First.Value, @implicit, true));
            }

            case Production.FLOW_MAPPING_ENTRY: {
                if (!(_scanner.PeekToken() is FlowMappingEndToken))
                {
                    if (_scanner.PeekToken() is KeyToken)
                    {
                        _parseStack.Push(Production.FLOW_MAPPING_ENTRY);
                        _parseStack.Push(Production.FLOW_ENTRY_MARKER);
                        _parseStack.Push(Production.FLOW_MAPPING_INTERNAL_VALUE);
                        _parseStack.Push(Production.FLOW_MAPPING_INTERNAL_CONTENT);
                    }
                    else
                    {
                        _parseStack.Push(Production.FLOW_MAPPING_ENTRY);
                        _parseStack.Push(Production.FLOW_NODE);
                        _parseStack.Push(Production.FLOW_ENTRY_MARKER);
                    }
                }
                return(null);
            }

            case Production.FLOW_MAPPING_END: {
                _scanner.GetToken();
                return(MappingEndEvent.Instance);
            }

            case Production.FLOW_INTERNAL_MAPPING_START: {
                _scanner.GetToken();
                return(new MappingStartEvent(null, null, true, true));
            }

            case Production.FLOW_INTERNAL_CONTENT: {
                Token curr = _scanner.PeekToken();
                if (!(curr is ValueToken || curr is FlowEntryToken || curr is FlowSequenceEndToken))
                {
                    _parseStack.Push(Production.FLOW_NODE);
                }
                else
                {
                    _parseStack.Push(Production.EMPTY_SCALAR);
                }
                return(null);
            }

            case Production.FLOW_INTERNAL_VALUE: {
                if (_scanner.PeekToken() is ValueToken)
                {
                    _scanner.GetToken();
                    if (!((_scanner.PeekToken() is FlowEntryToken) || (_scanner.PeekToken() is FlowSequenceEndToken)))
                    {
                        _parseStack.Push(Production.FLOW_NODE);
                    }
                    else
                    {
                        _parseStack.Push(Production.EMPTY_SCALAR);
                    }
                }
                else
                {
                    _parseStack.Push(Production.EMPTY_SCALAR);
                }
                return(null);
            }

            case Production.FLOW_INTERNAL_MAPPING_END: {
                return(MappingEndEvent.Instance);
            }

            case Production.FLOW_ENTRY_MARKER: {
                if (_scanner.PeekToken() is FlowEntryToken)
                {
                    _scanner.GetToken();
                }
                return(null);
            }

            case Production.FLOW_NODE: {
                if (_scanner.PeekToken() is AliasToken)
                {
                    _parseStack.Push(Production.ALIAS);
                }
                else
                {
                    _parseStack.Push(Production.PROPERTIES_END);
                    _parseStack.Push(Production.FLOW_CONTENT);
                    _parseStack.Push(Production.PROPERTIES);
                }
                return(null);
            }

            case Production.FLOW_MAPPING_INTERNAL_CONTENT: {
                Token curr = _scanner.PeekToken();
                if (!(curr is ValueToken || curr is FlowEntryToken || curr is FlowMappingEndToken))
                {
                    _scanner.GetToken();
                    _parseStack.Push(Production.FLOW_NODE);
                }
                else
                {
                    _parseStack.Push(Production.EMPTY_SCALAR);
                }
                return(null);
            }

            case Production.FLOW_MAPPING_INTERNAL_VALUE: {
                if (_scanner.PeekToken() is ValueToken)
                {
                    _scanner.GetToken();
                    if (!(_scanner.PeekToken() is FlowEntryToken || _scanner.PeekToken() is FlowMappingEndToken))
                    {
                        _parseStack.Push(Production.FLOW_NODE);
                    }
                    else
                    {
                        _parseStack.Push(Production.EMPTY_SCALAR);
                    }
                }
                else
                {
                    _parseStack.Push(Production.EMPTY_SCALAR);
                }
                return(null);
            }

            case Production.ALIAS: {
                AliasToken tok = (AliasToken)_scanner.GetToken();
                return(new AliasEvent(tok.Value));
            }

            case Production.EMPTY_SCALAR: {
                return(new ScalarEvent(null, null, new bool[] { true, false }, "", (char)0));
            }
            }

            return(null);
        }