/// <summary> /// /// </summary> /// <param name="stream"></param> /// <returns></returns> /// <remarks> /// /// See http://www.dmtf.org/sites/default/files/standards/documents/DSP0221_3.0.0.pdf /// /// A.13 Names /// /// MOF names are identifiers with the format defined by the IDENTIFIER rule. /// No whitespace is allowed between the elements of the rules in this ABNF section. /// /// IDENTIFIER = firstIdentifierChar *( nextIdentifierChar ) /// firstIdentifierChar = UPPERALPHA / LOWERALPHA / UNDERSCORE /// nextIdentifierChar = firstIdentifierChar / decimalDigit /// elementName = localName / schemaQualifiedName /// localName = IDENTIFIER /// /// </remarks> private static IdentifierToken ReadIdentifierToken(ILexerStream stream) { var sourceChars = new List <SourceChar>(); var nameChars = new List <char>(); // firstIdentifierChar var peek = stream.Peek(); if (!StringValidator.IsFirstIdentifierChar(peek.Value)) { throw new InvalidOperationException( string.Format("Unexpected character '{0}' encountered", peek.Value)); } // *( nextIdentifierChar ) while (!stream.Eof) { peek = stream.Peek(); if (StringValidator.IsNextIdentifierChar(peek.Value)) { var @char = stream.Read(); sourceChars.Add(@char); nameChars.Add(@char.Value); } else { break; } } // return the result var extent = new SourceExtent(sourceChars); var name = new string(nameChars.ToArray()); return(new IdentifierToken(extent, name)); }
public static void IsNextIdentifierCharTest(char value, bool expectedResult) { var result = StringValidator.IsNextIdentifierChar(value); Assert.AreEqual(expectedResult, result); }