Exemple #1
0
        /// <summary>
        /// Parse the productions:
        /// 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?)?
        ///                          *
        /// </summary>
        private ParsingEvent ParseFlowSequenceEntry(bool isFirst)
        {
            if (isFirst)
            {
                GetCurrentToken();
                Skip();
            }

            ParsingEvent evt;

            if (!(GetCurrentToken() is FlowSequenceEnd))
            {
                if (!isFirst)
                {
                    if (GetCurrentToken() is FlowEntry)
                    {
                        Skip();
                    }
                    else
                    {
                        var current = GetCurrentToken();
                        throw new SemanticErrorException(current.Start, current.End, "While parsing a flow sequence, did not find expected ',' or ']'.");
                    }
                }

                if (GetCurrentToken() is Key)
                {
                    state = ParserState.FlowSequenceEntryMappingKey;
                    evt   = new Events.MappingStart(null, null, true, MappingStyle.Flow);
                    Skip();
                    return(evt);
                }
                else if (!(GetCurrentToken() is FlowSequenceEnd))
                {
                    states.Push(ParserState.FlowSequenceEntry);
                    return(ParseNode(false, false));
                }
            }

            state = states.Pop();
            evt   = new Events.SequenceEnd(GetCurrentToken().Start, GetCurrentToken().End);
            Skip();
            return(evt);
        }
Exemple #2
0
		/// <summary>
		/// Parse the productions:
		/// 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?)?
		///                          *
		/// </summary>
		private ParsingEvent ParseFlowSequenceEntry(bool isFirst)
		{
			if (isFirst)
			{
				GetCurrentToken();
				Skip();
			}

			ParsingEvent evt;
			if (!(GetCurrentToken() is FlowSequenceEnd))
			{
				if (!isFirst)
				{
					if (GetCurrentToken() is FlowEntry)
					{
						Skip();
					}
					else
					{
						var current = GetCurrentToken();
						throw new SemanticErrorException(current.Start, current.End, "While parsing a flow sequence, did not find expected ',' or ']'.");
					}
				}

				if (GetCurrentToken() is Key)
				{
					state = ParserState.FlowSequenceEntryMappingKey;
					evt = new Events.MappingStart(null, null, true, MappingStyle.Flow);
					Skip();
					return evt;
				}
				else if (!(GetCurrentToken() is FlowSequenceEnd))
				{
					states.Push(ParserState.FlowSequenceEntry);
					return ParseNode(false, false);
				}
			}

			state = states.Pop();
			evt = new Events.SequenceEnd(GetCurrentToken().Start, GetCurrentToken().End);
			Skip();
			return evt;
		}