XML specifications for basic elements: - references to declarable entities (variables, constants, functions, typedefs, interfaces, interface definitions, components, enums, structs, unions) - types - values (regular constants and structured values from C {} initialisers) - attributes - documentation strings A reference to a component or to an interface definition The qname uniquely identifies the interface definition or component. An instance of a component or interface. The number attribute is present for real instances of generic components. A simple value. Contains constant value (might be V:) and its type A structured value (from a C { ... } initialiser). All of these have a type as their first element. Enforce the "type as first element" rule A struct or union value (from a C { ... } initialiser), the structured-elements are the initialised fields (unitialised fields are just absent). An array value (from a C { ... } initialiser), the array-elements are the initialised array elements (unitialised elements are just absent). A nesC type. Purposefully does not contain type-error (bug indicator). All have size and alignment attributes (though these may be V:). Every type has a size and alignment attribute, and, optionally, the name of the typedef this type corresponds to (we can't just have a typedef-ref, as that would cause confusion with type-var). The network attribute is present for network base types. Its value is the network base type name. The typename element is just a reference to a typedef Base types just include the C base type name Integer and complex integer types may have an unsigned attribute Types that contain a single embedded type Qualified types contain an empty attribute for each qualifier present Array types include a number of elements. An unspecified number of elements is represented as a non-constant value for the elements attribute. Function types may be varargs or oldstyle. They contain a type list (arguments) and a return type. Tag types contain a tag reference Interface types contain an interface reference Component types contain an internal component reference. These are the type of a component name inside a configuration, i.e., the type of X in `components Y as X'. Note that `components Y' is just a shortcut for `components Y as Y', the two Y's are in different namespaces. Type variables contain a reference to a typedef (whose type is itself this type) An attribute with its initialiser A documentation string A short string is always present, a long one is optional. nesdoc strings have arbitrary contents