/// <summary> /// </summary> /// <returns></returns> /// <remarks> /// /// See http://www.dmtf.org/sites/default/files/standards/documents/DSP0221_3.0.0.pdf /// A.19 Reference type value /// /// referenceTypeValue = referenceValue / referenceValueArray /// referenceValueArray = "{" [ objectPathValue *( "," objectPathValue ) ] /// /// No whitespace is allowed between the elements of the rules in this ABNF section. /// /// objectPathValue = [namespacePath ":"] instanceId /// namespacePath = [serverPath] namespaceName /// /// ; Note: The production rules for host and port are defined in IETF /// ; RFC 3986 (Uniform Resource Identifiers (URI): Generic Syntax). /// /// serverPath = (host / LOCALHOST) [ ":" port] "/" /// LOCALHOST = "localhost" ; Case insensitive /// instanceId = className "." instanceKeyValue /// instanceKeyValue = keyValue *( "," keyValue ) /// keyValue = propertyName "=" literalValue /// /// </remarks> internal static ReferenceTypeValueAst Parse(ParserStream stream) { var node = new ReferenceTypeValueAst(); // referenceValue = objectPathValue node.Name = stream.Read <AliasIdentifierToken>().Name; return(node); }
/// <summary> /// </summary> /// <returns></returns> /// <remarks> /// /// See http://www.dmtf.org/sites/default/files/standards/documents/DSP0221_3.0.0a.pdf /// A.14 Complex type value /// /// propertyValue = primitiveTypeValue / complexTypeValue / referenceTypeValue / enumTypeValue /// /// 7.3.5 /// /// primitiveTypeValue = literalValue / literalValueArray /// primitiveType = DT_Integer / DT_Real / DT_STRING / DT_DATETIME / DT_BOOLEAN / DT_OCTETSTRING /// /// A.1 /// /// complexTypeValue = complexValue / complexValueArray /// /// A.19 /// /// referenceTypeValue = referenceValue / referenceValueArray /// referenceValueArray = "{" [ objectPathValue *( "," objectPathValue ) ] 1163 "}" /// /// A.7 /// /// enumTypeValue = enumValue / enumValueArray /// enumDeclaration = enumTypeHeader enumName ":" enumTypeDeclaration ";" /// /// </remarks> internal static PropertyValueAst Parse(ParserStream stream) { var node = new PropertyValueAst(); var peek = stream.Peek(); // propertyValue = primitiveTypeValue / complexTypeValue / referenceTypeValue / enumTypeValue if (LiteralValueAst.IsLiteralValueToken(peek)) { // primitiveTypeValue -> literalValue node.Value = PrimitiveTypeValueAst.Parse(stream); } else if (peek is BlockOpenToken) { // we need to read the subsequent token to work out whether // this is a complexValueArray, literalValueArray, referenceValueArray or enumValueArray stream.Read(); peek = stream.Peek(); if (LiteralValueAst.IsLiteralValueToken(peek)) { // literalValueArray stream.Backtrack(); node.Value = LiteralValueArrayAst.Parse(stream); } else { // complexValueType stream.Backtrack(); node.Value = ComplexValueArrayAst.Parse(stream); } } else if (peek is AliasIdentifierToken) { // referenceTypeValue node.Value = ReferenceTypeValueAst.Parse(stream); } else { throw new UnexpectedTokenException(peek); } // return the result return(node); }