SpecList := Spec | SpecList Spec;
Spec := Configuration | Style;
[ “Import
Lattice” LatticeName LatticeFileName ]
[ TypeList ]
[ "Constraints"
[ ConstraintExpression ]
]
"End Style";
Type := Component | Connector | InterfaceType
| GeneralProcess;
[ PortList ]
"Computation" BehaviorDescription;
[ RoleList ]
"Glue" BehaviorDescription;
Port := "Port" FormalPRName '=' ProcessExpression;
Role := "Role" FormalPRName '=' ProcessExpression;
[ “Import Lattice” LatticeName LatticeFileName ]
[ "Style" SimpleName
]
[ TypeList ]
"Instances"
[ InstanceList
]
[ “Clearances”
[ClearanceLists] ]
"Attachments"
[ AttachmentList
]
"End Configuration";
Instance := InstanceNameList
':' TypeUse;
InstanceNameList :=
InstanceName | InstanceNameList ‘,’ InstanceName;
InstanceName := SimpleName
[ “_{“ FiniteRangeExpression ‘}’ ];
ClearanceList := SubjectList
‘:’ Clearance;
SubjectList := aSubject
| SubjectList ‘,’ aSubject;
FiniteRangeExpressionOrIndex
:= FiniteRangeExpression | IntegerExpression;
ComponentConnectorName
:= SimpleName [ "_{" FiniteRangeExpressionOrIndex "_}" ];
PortRoleName := ComponentConnectorName
'.' SimpleName [ "_{" FiniteRangeExpressionOrIndex "_}" ];
Attachment : Interface "As" Interface;
Interface : SimpleName [ "_{" IntegerExpression '}' ] '.' ActualPRName;
GeneralProcess := "Process" ProcessName '='
ProcessExpression;
-- Names and Lists
--
-- IDENTIFIER is a terminal representing an
arbitrary name. Such names can contain
-- an combination of letters and digits, but
must begin with a letter. Spaces
-- underscores are not permitted in names.
SimpleName := IDENTIFIER;
ProcessName := SimpleName [ "_{" ProcessParams
'}' ]
AlphabetName := "ALPHA" SimpleName;
DefnName := ProcessName | AlphabetName;
ElementList := DataExpression | ElementList
',' DataExpression;
ActualPRName := SimpleName [ "_{" IntegerExpression
'}' ];
| Subconfiguration;
Subconfiguration := Configuration
"Bindings"
[ BindingList ]
"End Bindings"
Binding := Interface '=' ActualPRName;
Declaration :=
DefnName '=' AnyExpression
| DefnName '=' "Cond" '{' ConditionalDefinitions
'}'
ConditionalDefinition
| ConditionalDefinitions ConditionalDefinition
ConditionalDefinition =
ProcessExpression "When" '{' LogicalExpression
'}'
| ProcessExpression "Otherwise"
-- types of parameters (formal and actual for
use in various rules)
-- The NL variant of ForamlParams allows lists
of parameters, but each parameter
-- of the same type must be specified separately
instead of in a list of the same
-- type (eg, "i,j:X" is not permitted; instead
"i:X; j:X" would have to be used).
--
FormalParams := FormalParam | FormalParams ';'
FormalParam;
FormalParam := NameList ':' SetExpression;
FormalParamNL := SimpleName ':' SetExpression;
FormalCCParam := NameList ':' ProcessType | NameList ':' FiniteRangeExpression
| NameList ‘:’ “Security Label”;
ActualCCParam := ProcessExpression | IntegerExpression
| LatticeFunction;
FunctionName := “meet”
‘(‘ SetOfNodes ‘)’ | “join” ‘(‘ SetOfNodes ‘)’ | “max()” | “min()”;
SetOfNodes := NodeName
‘,’ NodeList;
NodeList := NodeName
| NodeList ‘,’ NodeName;
NodeName :=IDENTIFIER;
LatticeName := SimpleName;
-- types of expresssions
--
ProcessType :=
"Interface Type"
| "Process"
| "Port"
| "Role"
| "Computation"
| "Glue";
| ProcessExpression "/\" ProcessExpression
| EventExpression "->"
ProcessExpression
| ProcessExpression
"||" ProcessExpression
| ProcessExpression "|||" ProcessExpression
| ProcessExpression
"[]" ProcessExpression
| ProcessExpression
"|~|" ProcessExpression
| "[]" FormalParams
'@' ProcessExpression
| "|~|" FormalParams
'@' ProcessExpression
| ';' FormalParams
'@' ProcessExpression
| "||" FormalParams
'@' ProcessExpression
| "|||" FormalParams '@' ProcessExpression
| ToolAnnotation
| ProcessName
| "Computation"
| "Glue"
| "Success"
| "Skip"
| "Stop"
| ProcessExpression
"Where" '{' DeclList '}'
| '(' ProcessExpression
')';
"diamond" '(' ProcessExpression
')'
| "normalise" '(' ProcessExpression
')';
| EventName [ EventDataList
];
| EventDataList '!'
NonEventDataExpression
| '?' NonEventDataExpression
| '!' NonEventDataExpression;
| LogicalExpression
"or" LogicalExpression
| LogicalExpression
"and" LogicalExpression
| "forall" FormalParams
'@' LogicalExpression
| "forall" FormalParams
'|' LogicalExpression '@' LogicalExpression
| "exists" FormalParams
'@' LogicalExpression
| "exists" FormalParams
'|' LogicalExpression '@' LogicalExpression
| NonEventDataExpression "==" NonEventDataExpression
| NonEventDataExpression "!=" NonEventDataExpression
| IntegerExpression
'<' IntegerExpression
| IntegerExpression
'>' IntegerExpression
| IntegerExpression
"<=" IntegerExpression
| IntegerExpression
">=" IntegerExpression
| DataExpression "in"
SetExpression
| DataExpression "notin"
SetExpression
| "true"
| "false"
| LogicalExpression
"Where" '{' DeclList '}'
| '(' LogicalExpression
')';
ConstraintExpression := LogicalExpression;
| SetExpression "intersection"
SetExpression
| SetExpression "setminus"
SetExpression
| SetExpression "cross"
SetExpression
| "power" SetExpression
| "sequence" SetExpression
| '{' ElementList '}'
| '{' FormalParamsNL
[ '|' LogicalExpression ] [ '@' DataExpression] '}'
| RangeExpression
| SimpleName
| AlphabetName
| "Integer"
| "{}"
| SetExpression "Where"
'{' DeclList '}'
| '(' SetExpression ')';
'<'
ElementList '>'
| SequenceExpression
'^' SequenceExpression
| SimpleName
| "<>"
| SequenceExpression "Where"
'{' DeclList '}'
| '(' SequenceExpression
')';
| IntegerExpression
'-' IntegerExpression
| SimpleName
| INTEGER
| IntegerExpression
"Where" '{' DeclList '}'
| '(' IntegerExpression
')';
| IntegerExpression
".."
| ".." IntegerExpression;
SetExpression
| IntegerExpression
| SequenceExpression
| LogicalExpresssion
| TupleExpression;