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> }