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); }
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); }