Below is a BNF of the CSN. In preparing this BNF, the goal was not only to provide strictly the syntax of CSN, but also to provide hints as to the meaning of the constructions through the use of descriptive (and sometimes extra) terminal and non-terminal names.
< schemaDefinition> ::= < definition> | < definition> < schemaDefinition> < definition> ::= < openDefinition> < definitionBody> < closeDefinition> < definitionBody> ::= < tupleDefinition> | < enumerationDefintion> | < domainDefinition> < tupleDefinition> ::= < parentName> < subclass> [< tag>] [< subclassing>] [< attributes>] [< classAttributes>] [< defaults>] [< restricted>] [< constraints>] [< classAttributeDefaults>] [< classAttributeValues>] [< comments>] < parentName> ::= < className> {< comma> [< whitespace>] < className>} < className> ::= < upperName> [< schemaID>] < schemaID> ::= "::" < upperName> < subclass> ::= "subclass:" < className> < tag> ::= "tag:" < tagCategory> < tagNumber> < tagCategory> ::= "universal" | "application" | "private" < tagNumber> ::= < unsignedInteger> < attributes> ::= "attributes:" < attributeDef> {< attributeDef>} < attributeDef> ::= < attribNameSpec> [< forceType>] < attributeType> < attributeType> ::= < className> | < stringType> | (< multiset> "(" [< forcetype>] < className> | < stringType> ")" ) < stringType> ::= "String" [ "(" < unsignedInteger> ")" ] < multiset> ::= "Multiset" | "List" | "Set" | "IsoList" | "IsoSet" | "Relation" < stringType> ::= "String" ["(" < unsignedInteger> ")"] < attribNameSpec> ::= < attributeName> | < optionalAttrib> < attributeName ::= < lowerName> < openValueSpec> ::= < openParen> < closeValueSpec> ::= < closeParen> < openOptional> ::= < openBracket> < closeOptional> ::= < closeBracket> < optionalAttrib> ::= < openOptional> < attributeName> < closeOptional> < subclassing> ::= "subclassing:" < textString> < defaults> ::= "defaults:" < defaultSpec> {< defaultSpec>} < defaultSpec> ::= < attributeName> < setTo> < value> < value> ::= < textString> | < number> | < enumtag> < number> ::= < float> | < integer> < enumTag> ::= < lowerName> < restricted> ::= "restricted:" < restrictionSpec> {< restrictionSpec>} < restrictionSpec> ::= < valueRestriction> | < typeRestriction> < valueRestriction> ::= < attribPathName> < setTo> < valueChoice> < valueChoice> ::= < valueSpec> {< chooser> < valueChoice>} < valueSpec> ::= < value> | < range> < range> ::= < lowerBound> ".." < upperBound> < lowerBound> ::= < integer> < upperBound> ::= < integer> < attribPathName> ::= { < attributeNameSpec> [< multisetMember>] < selector> } < attributeNameSpec> < multisetMember> ::= "{}" < typeRestriction> ::= < typePathName> < setTo> < typeChoice> < typeChoice> ::= < typeSpec> {< chooser> < typeChoice> } < typeSpec> ::= [ < excludeType> | < forceType> ] < className> < typePathName> ::= [< attributePathName>] (< wildcard> |< selector> ) < className> < constraints> ::= "constraints:" < textString> < comments> ::= "comments:" < textString> < classAttributeValue> ::= { < attributeName> < setTo> < value> } < classAttributeValues> ::= "classAttributeValues:" < classAttributeValue> {< classAttributeValue>} < classAttributeDefaults> ::= "classAttributeDefaults:" < classAttributeValue> {< classAttributeValue>} < enumerationDef> ::= "Enumeration" < subclass> [< tag>] < enumTags> [< comments>] < enumTags> ::= "values:" < tagSpec> {< tagSpec>} < tagSpec> ::= < enumTag> [< numericRep>] < numericRep> ::= < openValueSpec> < unsignedInteger> < closeValueSpec> < domainDefinition> ::= "Domain" < subclass> [< tag>] < primitiveType < domainValues>R [< comments>]< MO> < primitiveType> ::= "primitiveType:" < className> < domainValues> ::= "values:" ( < strings> | < integers | < floats> ) < strings> ::= < textString> {< textString> } < floats> ::= < float> {< float> } < integers> ::= < integer> {< integer> }