/// <summary> /// /// </summary> /// <param name="stream"></param> /// <returns></returns> /// <remarks> /// /// See http://www.dmtf.org/sites/default/files/standards/documents/DSP0221_3.0.0a.pdf /// A.12 Parameter declaration /// /// parameterDeclaration = [ qualifierList ] ( primitiveParamDeclaration / /// complexParamDeclaration / /// enumParamDeclaration / /// referenceParamDeclaration ) /// /// primitiveParamDeclaration = primitiveType parameterName [ array ] /// [ "=" primitiveTypeValue ] /// complexParamDeclaration = structureOrClassName parameterName [ array ] /// [ "=" ( complexTypeValue / aliasIdentifier ) ] /// enumParamDeclaration = enumName parameterName [ array ] /// [ "=" enumValue ] /// referenceParamDeclaration = classReference parameterName [ array ] /// [ "=" referenceTypeValue ] /// /// parameterName = IDENTIFIER /// /// </remarks> internal static ParameterDeclarationAst Parse(ParserStream stream) { var parameter = new ParameterDeclarationAst(); var qualifiers = default(QualifierListAst); if (stream.Peek <AttributeOpenToken>() != null) { qualifiers = QualifierListAst.Parse(stream); } parameter.Qualifiers = qualifiers; parameter.Type = stream.Read <IdentifierToken>(); if (stream.PeekIdentifier(Keywords.REF)) { stream.ReadIdentifier(Keywords.REF); parameter.IsRef = true; } else { parameter.IsRef = false; } parameter.Name = stream.Read <IdentifierToken>(); if (stream.Peek <AttributeOpenToken>() != null) { stream.Read <AttributeOpenToken>(); stream.Read <AttributeCloseToken>(); parameter.IsArray = true; } if (stream.Peek <EqualsOperatorToken>() != null) { stream.Read <EqualsOperatorToken>(); parameter.DefaultValue = ClassFeatureAst.ReadDefaultValue(stream, parameter.Type); } return(parameter); }
/// <summary> /// </summary> /// <param name="stream"></param> /// <returns></returns> /// <remarks> /// See http://www.dmtf.org/sites/default/files/standards/documents/DSP0221_3.0.0.pdf /// Section A.2 - MOF specification /// /// mofProduction = compilerDirective / /// structureDeclaration / /// classDeclaration / /// associationDeclaration / /// enumerationDeclaration / /// instanceDeclaration / /// qualifierDeclaration /// /// </remarks> internal static MofProductionAst Parse(ParserStream stream) { var peek = stream.Peek(); // compilerDirective var pragma = peek as PragmaToken; if (pragma != null) { return(CompilerDirectiveAst.Parse(stream)); } // all other mofProduction structures can start with an optional qualifierList var qualifiers = default(QualifierListAst); if (peek is AttributeOpenToken) { qualifiers = QualifierListAst.Parse(stream); } var identifier = stream.Peek <IdentifierToken>(); switch (identifier.GetNormalizedName()) { case Keywords.STRUCTURE: // structureDeclaration throw new UnsupportedTokenException(identifier); case Keywords.CLASS: // classDeclaration var @class = ClassDeclarationAst.Parse(stream, qualifiers); return(@class); case Keywords.ASSOCIATION: // associationDeclaration throw new UnsupportedTokenException(identifier); case Keywords.ENUMERATION: // enumerationDeclaration throw new UnsupportedTokenException(identifier); case Keywords.INSTANCE: case Keywords.VALUE: // instanceDeclaration var instance = ComplexTypeValueAst.Parse(stream, qualifiers); return(instance); case Keywords.QUALIFIER: // qualifierDeclaration throw new UnsupportedTokenException(identifier); default: throw new UnexpectedTokenException(peek); } #endregion }
/// <summary> /// </summary> /// <returns></returns> /// <remarks> /// See http://www.dmtf.org/sites/default/files/standards/documents/DSP0221_3.0.0a.pdf /// A.5 Class declaration /// /// classFeature = structureFeature / methodDeclaration /// /// structureFeature = structureDeclaration / ; local structure /// enumDeclaration / ; local enumeration /// propertyDeclaration /// /// structureDeclaration = [ qualifierList ] STRUCTURE structureName /// [ superstructure ] /// "{" *structureFeature "}" ";" /// /// enumDeclaration = enumTypeHeader /// enumName ":" enumTypeDeclaration ";" /// enumTypeHeader = [ qualifierList ] ENUMERATION /// /// propertyDeclaration = [ qualifierList ] ( primitivePropertyDeclaration / /// complexPropertyDeclaration / /// enumPropertyDeclaration /// referencePropertyDeclaration ) ";" /// /// methodDeclaration = [ qualifierList ] ( ( returnDataType [ array ] ) / /// VOID ) methodName /// "(" [ parameterList ] ")" ";" /// /// </remarks> internal static ClassFeatureAst Parse(ParserStream stream) { // all classFeatures start with an optional "[ qualifierList ]" var qualifierList = default(QualifierListAst); var peek = stream.Peek() as AttributeOpenToken; if ((peek as AttributeOpenToken) != null) { qualifierList = QualifierListAst.Parse(stream); } // we now need to work out if it's a structureDeclaration, enumDeclaration, // propertyDeclaration or methodDeclaration var identifier = stream.Peek <IdentifierToken>(); var identifierName = identifier.GetNormalizedName(); if (identifier == null) { throw new UnexpectedTokenException(peek); } else if (identifierName == Keywords.STRUCTURE) { // structureDeclaration throw new UnsupportedTokenException(identifier); } else if (identifierName == Keywords.ENUMERATION) { // enumDeclaration throw new UnsupportedTokenException(identifier); } else { // propertyDeclaration or methodDeclaration return(ClassFeatureAst.ParseMemberDeclaration(stream, qualifierList)); } }