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