/// <summary> /// /// </summary> /// <param name="value"></param> /// <returns></returns> public static ABNF_Rule Parse(string value) { if (value == null) { throw new ArgumentNullException("value"); } string[] name_value = value.Split(new char[] { '=' }, 2); if (name_value.Length != 2) { throw new ParseException("Invalid ABNF rule '" + value + "'."); } ABNF_Rule retVal = new ABNF_Rule(name_value[0].Trim(), ABNF_Alternation.Parse(new System.IO.StringReader(name_value[1]))); return(retVal); }
/// <summary> /// /// </summary> /// <param name="reader"></param> /// <returns></returns> public static ABNF_Option Parse(System.IO.StringReader reader) { if (reader == null) { throw new ArgumentNullException("reader"); } // option = "[" *c-wsp alternation *c-wsp "]" if (reader.Peek() != '[') { throw new ParseException("Invalid ABNF 'option' value '" + reader.ReadToEnd() + "'."); } // Eat "[". reader.Read(); // TODO: *c-wsp ABNF_Option retVal = new ABNF_Option(); // We reached end of stream, no closing "]". if (reader.Peek() == -1) { throw new ParseException("Invalid ABNF 'option' value '" + reader.ReadToEnd() + "'."); } retVal.m_pAlternation = ABNF_Alternation.Parse(reader); // We don't have closing ")". if (reader.Peek() != ']') { throw new ParseException("Invalid ABNF 'option' value '" + reader.ReadToEnd() + "'."); } else { reader.Read(); } return(retVal); }
/// <summary> /// Default constructor. /// </summary> /// <param name="name">Rule name.</param> /// <param name="elements">Alternation elements.</param> /// <exception cref="ArgumentNullException">Is raised when <b>name</b> or <b>elements</b> is null reference.</exception> /// <exception cref="ArgumentException">Is raised when any of the arguments has invalid value.</exception> public ABNF_Rule(string name, ABNF_Alternation elements) { if (name == null) { throw new ArgumentNullException("name"); } if (name == string.Empty) { throw new ArgumentException("Argument 'name' value must be specified."); } if (!ValidateName(name)) { throw new ArgumentException("Invalid argument 'name' value. Value must be 'rulename = ALPHA *(ALPHA / DIGIT / \"-\")'."); } if (elements == null) { throw new ArgumentNullException("elements"); } m_Name = name; m_pElements = elements; }
/// <summary> /// /// </summary> /// <param name="reader"></param> /// <returns></returns> public static ABNF_Alternation Parse(System.IO.StringReader reader) { if (reader == null) { throw new ArgumentNullException("reader"); } // alternation = concatenation *(*c-wsp "/" *c-wsp concatenation) ABNF_Alternation retVal = new ABNF_Alternation(); while (true) { ABNF_Concatenation item = ABNF_Concatenation.Parse(reader); if (item != null) { retVal.m_pItems.Add(item); } // We reached end of string. if (reader.Peek() == -1) { break; } // We have next alternation item. else if (reader.Peek() == '/') { reader.Read(); } // We have unexpected value, probably alternation ends. else { break; } } return(retVal); }