The rules which follow are given in CSN. The example is intended to serve as a template. The user should be aware that, typically, commentary is not given using the // structure; instead, comments are normally given in a comments clause.
< Superclass::Schema1, Superclass2::Schema3
subclass: Class::Schema2
subclassing: The user may define subclasses of this class.
attributes: attribute11 DomainForAttribute11
attribute12 DomainForAttribute12
[attribute13] DomainForAttribute13::Schema2
attribute14 List(DomainForMembersOfAttribute14)
classAttributes: classAttribute11 DomainForClassAttribute11::Schema2
classAttribute12 DomainForClassAttribute12
defaults: attribute11: valueW
restricted: attribute1: RestrictedDomainForAttribute1
attribute2: valueX
constraints: "The product of the values for attribute3 and attribute4
must be greater than the value for attribute5."
classAttributeDefaults: classAttribute11: valueP
classAttributeValues: classAttribute12: valueQ
comments: "This class definition serves as a template for other
class definitions."
>
< Superclass::Schema1, Superclass2::Schema3
// The definition of a class always begins with an open, angled bracket,
// followed by the name of the superclass(es) of the class being defined.
// Note that a class may have one parent (immediate supertype or super-
// class) or two to n parents. With multiple inheritance the superclasses
// may or may not come from different schemas. Commas are used to
// separate superclasses, if more than one is listed.
// If the superclass is not part of the SAIF data model or SAIF schema,
// the name of the superclass is followed by two colons and the name of
// the external schema containing the superclass. If the superclass is
// defined in SAIF, the two colons and the schema name are omitted.
subclass: Class::Schema2
// A meaningful name for the subclass is provided, followed by two colons
// and the name of the schema in which the class is defined, i.e., the
// current schema. The two colons and the schema name are not given in the
// definitions of SAIF classes.
// Class names and schema names begin with upper case letters and are
// followed by zero or more characters which may be upper or lower case
// letters, numeric digits or underscores (_).
subclassing: "The user may define subclasses of this class."
// This clause is given typically only with those classes of the SAIF schema
// which may be used as superclasses for user defined classes. In a
// user defined class definition, the user may provide restrictions or
// commentary on subclassing, as may be of interest to other users.
attributes: attribute11 DomainForAttribute11
attribute12 DomainForAttribute12
[attribute13] DomainForAttribute13::Schema2
attribute14 List(DomainForMembersOfAttribute14)
// 0 to n attributes may be listed. The name of each attribute is followed
// by the domain for the attribute. If the domain is a type from an external
// schema, it is followed by ::SchemaName. If no attributes are provided, the
// clause is not given.
// If provision of a value for an attribute is considered as optional,
// its name is surrounded by opening and closing square brackets, as with
// attribute13 above.
// Attribute names begin with lower case letters and are followed by zero
// or more characters which may be upper or lower case letters ,numeric
// digits or underscores (_). The domain for an attribute may include a
// multiset construction (Multiset, List, IsoList, Set, IsoSet, or
// Relation), as with attribute14 above. If the domain of an attribute is
// defined as String, it is assumed that the length of the string is
// variable. (This is identical to CHARACTER VARYING in SQL.) If the domain
// is specified as String (n), for example, String (30), then it is assumed
// that the maximum length of the string is n. (This is equivalent to
// CHARACTER (n) in SQL.)
// The following are not allowed as attribute names or as the leading
// characters in attribute names. They may, however, be embedded in
// attribute names:
// subclass values
// comments attributes subclassing
// classAttributes defaults constraints
// restricted primitiveType classAttributeValues
// classAttributeDefaults
// For example, values is not allowed, valuesList is not allowed,
// listValues is allowed. All other character strings are permitted so
// long as the rules given above are followed.
// Where multiple inheritance is employed, the order of the attributes must
// be unambiguous. This is achieved as follows -
// All attributes inherited from the first (left most) parent are given, then
// those from the second parent, etc. Where an attribute is inherited twice
// or more from a common ancestor, the 2nd to n copies are ignored, i.e.,
// they are considered virtual. Following the inherited attributes are those
// specified in the class definition.
classAttributes: classAttribute11 DomainForClassAttribute11::Schema2
classAttribute12 DomainForClassAttribute12
// Zero to n class attributes are given. The name of each class attribute
// is followed by the domain for the attribute. The domain is always either
// a type of primitive or an enumeration. If it is an enumeration from an
// external schema, the enumeration name is followed by ::SchemaName. If no
// class attributes are listed, the clause is not given. Unlike an
// (object) attribute, a class attribute is never considered optional;
// consequently, square brackets around a class attribute name are not
// allowed.
// As with (object) attributes, the word value is not allowed as a class
// attribute name.
defaults: attribute11: valueW
// A defaults clause may contain one or more defaults. The example above
// implies that if a value is not provided for attribute11 in a transfer
// (i.e., it is left undefined), then it should be considered as equal to
// valueW, some primitive value.
restricted: attribute1: RestrictedDomainForAttribute1 // Line 1
attribute2: valueX // Line 2
// If certain restrictions apply to the possible values for an attribute,
// beyond the domain given in the attribute clause, then a restricted
// clause is used.
// In general, an attribute may be restricted to a given domain, indicated
// by a type name, or to one or more given values. Examples of these two
// cases are represented by Lines 1 and 2 above, respectively. (In both
// cases in this example, the attribute is inherited from the superclass,
// hence the attributes are not listed in the attributes clause given
// earlier.)
// The restricted clause follows a formal syntax. There are a number of
// possible ways of using restricted clauses; these are discussed later in
// this chapter.
constraints: "The product of the values for attribute3 and attribute4
must be greater than the value for attribute5."
// If certain conditions cannot be expressed effectively in a restricted
// clause, a constraints clause is used. The constraints clause above is an
// example of this. If - then - else constructs may be placed in a
// constraints clause. Also, several different constraints may be placed in
// the same clause.
classAttributeDefaults: classAttribute11: valueP
// A default value may be given for each class attribute. Such defaults may
// be overridden in the definitions of subclasses. The value, valueP, must
// be a primitive or from an enumeration.
classAttributeValues: classAttribute12: valueQ
// A value for a class attribute is provided from a primitive type or
// enumeration. The value cannot be overridden in a subclass. If the class
// being defined is an abstract superclass, it is not required to specify a
// default or value for a class attribute. Also, with an abstract
// superclass the class attribute may be assigned a range of values (
// valueM .. valueN ) or a set of values ( valueF | valueG | valueH ) with
// the classAttributeValues clause. In such cases, specific values must be
// assigned in those subclasses which can be directly instantiated.
comments: "This class definition serves as a template for other class
definitions."
// Comments may contain text, tables, or graphics. (The use of
// non-ASCII characters and graphics is at variance with what is specified
// in the BNF later in this chapter. As discussed below, these would be
// removed prior to parsing with a computer program. The user need not be
// concerned about this when defining types in CSN.)
>
// The definition of a class ends with a closing, angled bracket, as shown
// above.
Start at the SAIF class list to find examples of class definitions.
(As mentioned above under comments, certain changes must be made to a file containing CSN definitions before it can be parsed by a computer program. Typically, indents and tabs are replaced globally by spaces, and it is advisable to replace globally each carriage return (hard return) with: space carriage return. When the file is exported to a generic text file, diagrams should be removed.)