<x:schema xmlns:x="http://www.w3.org/2001/XMLSchema">

     <!-- Type Definitions -->

     <x:simpleType name="IDENTIFIER">

          <x:restriction base="x:NCName">

               <x:pattern value="\w(\w|\d)*"/>

          </x:restriction>

     </x:simpleType>

     <x:simpleType name="NormalizedString">

          <x:restriction base="x:string">

               <x:whiteSpace value="collapse"/>

          </x:restriction>

     </x:simpleType>

     <x:simpleType name="StaticRangeExpression">

          <x:restriction base="x:string">

               <x:pattern value="(\d)+\.\.(\d)+"/>

          </x:restriction>

     </x:simpleType>

     <x:simpleType name="DynamicRangeExpression">

          <x:restriction base="x:string">

               <x:pattern value="(\w(\w|\d)*)\.\.(\w(\w|\d)*)"/>

               <x:pattern value="(\w(\w|\d)*)\.\.((\d)+\.\.(\d)+)"/>

               <x:pattern value="((\d)+\.\.(\d)+)\.\.(\w(\w|\d)*)"/>

          </x:restriction>

     </x:simpleType>

     <x:simpleType name="FiniteRangeExpression">

          <x:union memberTypes="StaticRangeExpression DynamicRangeExpression"/>

     </x:simpleType>

     <x:simpleType name="SubjectRangeExpression">

          <x:union memberTypes="StaticRangeExpression x:integer"/>

     </x:simpleType>

     <x:simpleType name="SimpleName">

          <x:restriction base="IDENTIFIER"/>

     </x:simpleType>

     <x:simpleType name="NameList">

          <x:restriction base="x:string">

               <x:pattern value="( |\t)*(\w(\w|\d)*)( |\t)*(,( |\t)*(\w(\w|\d)*)( |\t)*)*"/>

          </x:restriction>

     </x:simpleType>

     <x:simpleType name="NodeSet">

          <x:restriction base="x:string">

               <x:pattern value="( |\t)*(\w(\w|\d)*)( |\t)*(,( |\t)*(\w(\w|\d)*)( |\t)*)+"/>

          </x:restriction>

     </x:simpleType>

     <x:simpleType name="FilePath">

          <x:restriction base="x:anyURI">

               <x:pattern value=".*\.xml"/>

          </x:restriction>

     </x:simpleType>

     <x:simpleType name="ProcessType">

          <x:restriction base="x:string">

               <x:enumeration value="Interface Type"/>

               <x:enumeration value="Process"/>

               <x:enumeration value="Port"/>

               <x:enumeration value="Role"/>

               <x:enumeration value="Computation"/>

               <x:enumeration value="Glue"/>

          </x:restriction>

     </x:simpleType>

     <x:simpleType name="SecurityLabel">

          <x:restriction base="x:string">

               <x:enumeration value="Security Label"/>

          </x:restriction>

     </x:simpleType>

     <x:simpleType name="FormalParamType">

          <x:union memberTypes="ProcessType SecurityLabel"/>

     </x:simpleType>

     <x:simpleType name="FunctionName">

          <x:restriction base="x:NCName">

               <x:enumeration value="max"/>

               <x:enumeration value="min"/>

               <x:enumeration value="meet"/>

               <x:enumeration value="join"/>

          </x:restriction>

     </x:simpleType>

     <x:element name="CSPExp" type="NormalizedString"/>

     <x:simpleType name="IntegerExpression">

          <x:union memberTypes="IDENTIFIER x:integer"/>

     </x:simpleType>

     <x:element name="IntegerExp" type="IntegerExpression"/>

     <x:element name="ImportLattice" type="ImportLattice"/>

     <!-- The start symbol -->

     <x:element name="Descriptions" type="SpecList"/>

     <x:complexType name="SpecList">

          <x:group ref="Spec" maxOccurs="unbounded"/>

     </x:complexType>

     <x:group name="Spec">

          <x:choice>

               <x:element name="Configuration" type="Configuration"/>

               <x:element name="Style" type="Style"/>

          </x:choice>

     </x:group>

     <x:complexType name="Style">

          <x:sequence>

               <x:element ref="ImportLattice" minOccurs="0"/>

               <x:group ref="TypeList" minOccurs="0"/>

               <x:element name="Constraints" type="NormalizedString" minOccurs="0"/>

          </x:sequence>

          <x:attribute name="name" type="SimpleName" use="required"/>

     </x:complexType>

     <x:complexType name="ImportLattice">

          <x:attribute name="name" type="SimpleName" use="required"/>

          <x:attribute name="filename" type="FilePath" use="required"/>

     </x:complexType>

     <x:group name="TypeList">

          <x:sequence>

               <x:group ref="Type" maxOccurs="unbounded"/>

          </x:sequence>

     </x:group>

     <x:group name="Type">

          <x:choice>

               <x:element name="Component" type="Component"/>

               <x:element name="Connector" type="Connector"/>

               <x:element name="InterfaceType" type="IG"/>

               <x:element name="Process" type="IG"/>

          </x:choice>

     </x:group>

     <x:complexType name="Component">

          <x:sequence>

               <x:element name="param" type="FormalCCParam" minOccurs="0" maxOccurs="unbounded"/>

               <x:group ref="PortList" minOccurs="0"/>

               <x:element name="Computation" type="BehaviourDescription"/>

          </x:sequence>

          <x:attribute name="name" type="SimpleName" use="required"/>

     </x:complexType>

     <x:complexType name="Connector">

          <x:sequence>

               <x:element name="param" type="FormalCCParam" minOccurs="0" maxOccurs="unbounded"/>

               <x:group ref="RoleList" minOccurs="0"/>

               <x:element name="Glue" type="BehaviourDescription"/>

          </x:sequence>

          <x:attribute name="name" type="SimpleName" use="required"/>

     </x:complexType>

     <x:complexType name="FormalCCParam">

          <x:attribute name="names" type="NameList" use="required"/>

          <x:attribute name="type" type="FormalParamType" use="optional"/>

          <x:attribute name="range" type="StaticRangeExpression" use="optional"/>

     </x:complexType>

     <x:group name="PortList">

          <x:sequence>

               <x:element name="Port" type="PR" maxOccurs="unbounded"/>

          </x:sequence>

     </x:group>

     <x:complexType name="PR">

          <x:sequence>

               <x:element ref="CSPExp"/>

          </x:sequence>

          <x:attribute name="name" type="SimpleName" use="required"/>

          <x:attribute name="range" type="FiniteRangeExpression" use="optional"/>

     </x:complexType>

     <x:complexType name="BehaviourDescription">

          <x:choice>

               <x:element ref="CSPExp"/>

               <x:group ref="Subconfiguration"/>

          </x:choice>

     </x:complexType>

     <x:group name="Subconfiguration">

          <x:sequence>

               <x:element name="Configuration" type="Configuration"/>

               <x:element name="Bindings" type="Bindings"/>

          </x:sequence>

     </x:group>

     <x:complexType name="Bindings">

          <x:sequence>

               <x:element name="Binding" type="Binding" minOccurs="0" maxOccurs="unbounded"/>

          </x:sequence>

     </x:complexType>

     <x:complexType name="Binding">

          <x:sequence>

               <x:element name="Outer" type="Interface"/>

               <x:element name="Inner" type="ActualPRName"/>

          </x:sequence>

     </x:complexType>

     <x:complexType name="ActualPRName">

          <x:attribute name="pr" type="SimpleName" use="required"/>

          <x:attribute name="index" type="x:integer" use="optional"/>

     </x:complexType>

     <x:complexType name="Interface">

          <x:attribute name="cc" type="SimpleName" use="required"/>

          <x:attribute name="ccIndex" type="x:integer" use="optional"/>

          <x:attribute name="pr" type="SimpleName" use="required"/>

          <x:attribute name="prIndex" type="x:integer" use="optional"/>

     </x:complexType>

     <x:group name="RoleList">

          <x:sequence>

               <x:element name="Role" type="PR" maxOccurs="unbounded"/>

          </x:sequence>

     </x:group>

     <x:complexType name="Configuration">

          <x:group ref="Configuration"/>

          <x:attribute name="name" type="SimpleName" use="required"/>

          <x:attribute name="style" type="SimpleName" use="optional"/>

     </x:complexType>

     <x:group name="Configuration">

          <x:sequence>

               <x:element ref="ImportLattice" minOccurs="0"/>

               <x:group ref="TypeList" minOccurs="0"/>

               <x:element name="Instances" type="InstanceList"/>

               <x:element name="Clearances" type="ClearanceLists" minOccurs="0"/>

               <x:element name="Attachments" type="AttachmentList"/>

          </x:sequence>

     </x:group>

     <x:complexType name="InstanceList">

          <x:sequence>

               <x:element name="Instance" type="Instance" minOccurs="0" maxOccurs="unbounded"/>

          </x:sequence>

     </x:complexType>

     <x:complexType name="ClearanceLists">

          <x:sequence>

               <x:element name="ClearanceList" type="ClearanceList" minOccurs="0" maxOccurs="unbounded"/>

          </x:sequence>

     </x:complexType>

     <x:complexType name="AttachmentList">

          <x:sequence>

               <x:element name="Attachment" type="Attachment" minOccurs="0" maxOccurs="unbounded"/>

          </x:sequence>

     </x:complexType>

     <x:complexType name="ClearanceList">

          <x:sequence>

               <x:element name="CCName" type="Subject" maxOccurs="unbounded"/>

          </x:sequence>

          <x:attribute name="clearance" type="SimpleName" use="required"/>

     </x:complexType>

     <x:complexType name="Subject">

          <x:sequence>

               <x:element name="PRName" type="PRName" minOccurs="0"/>

          </x:sequence>

          <x:attribute name="id" type="SimpleName" use="required"/>

          <x:attribute name="index" type="SubjectRangeExpression" use="optional"/>

     </x:complexType>

     <x:complexType name="PRName">

          <x:attribute name="id" type="SimpleName" use="required"/>

          <x:attribute name="index" type="SubjectRangeExpression" use="optional"/>

     </x:complexType>

     <x:complexType name="Instance">

          <x:sequence>

               <x:element name="name" type="InstanceName" maxOccurs="unbounded"/>

               <x:element name="param" type="ActualCCParam" minOccurs="0" maxOccurs="unbounded"/>

          </x:sequence>

          <x:attribute name="type" type="SimpleName" use="required"/>

     </x:complexType>

     <x:complexType name="InstanceName">

          <x:attribute name="id" type="SimpleName" use="required"/>

          <x:attribute name="range" type="StaticRangeExpression" use="optional"/>

     </x:complexType>

     <x:complexType name="ActualCCParam">

          <x:choice>

               <x:element ref="CSPExp"/>

               <x:element ref="IntegerExp"/>

               <x:element name="LatticeFunction" type="LatticeFunction"/>

          </x:choice>

     </x:complexType>

     <x:complexType name="LatticeFunction">

          <x:attribute name="lattice" type="SimpleName" use="required"/>

          <x:attribute name="function" type="FunctionName" use="required"/>

          <x:attribute name="nodes" type="NodeSet" use="optional"/>

     </x:complexType>

     <x:complexType name="Attachment">

          <x:sequence>

               <x:element name="From" type="Interface"/>

               <x:element name="To" type="Interface"/>

          </x:sequence>

     </x:complexType>

     <x:complexType name="IG">

          <x:sequence>

               <x:element name="param" type="NormalizedString" minOccurs="0" maxOccurs="unbounded"/>

               <x:element ref="CSPExp"/>

          </x:sequence>

          <x:attribute name="name" type="SimpleName" use="required"/>

     </x:complexType>

</x:schema>