<SpecChi> 		::= ChiSpec(<ModelDef>, <ProcDef>+)

<ModelDef>      ::= ModelDef(<String>, <ModelBody>)

<ModelBody>     ::= ModelSpec(<VarSpec>*, <Statement> )

<ProcDef>		::= ProcDef(<String>, <ProcDecl>, <ProcBody>)

<ProcDecl>		::= ProcDecl(<Decl>*)

<Decl>			::= VarDecl(<VarID>+)
                  | ChanDecl(<TypedChannels>+)

<ProcBody>		::= ProcSpec(<VarSpec>*, <Statement>)

<VarSpec>		::= VarSpec(<VarExpID>+)
				  | ChanSpec(<ChanID>+)

<VarExpID>		::= DataVarExprID( <VarID>, <Expr> )
				  |	<VarID>

<VarID>			::= DataVarID(<String>, <TypeExp>)

<TypeExp>		::= <TypeID>
                  | SetType(<TypeExpr>)
                  | ListType(<TypeExpr>)
                  | TupleType(<TypeExpr>+)

<TypeID>		::= Type(<String>)

<ChannelTypedID>::= ChannelTypedID(<ChannelID>,<TypeID>, <Expr>)

<ChannelID>     ::= ChannelID(<VarID>, <ComType>)

<ComTyp>        ::= Nil
                  | Send
                  | Recv

<Expr>			::= Expression(<String>, <TypeID> )
				  | UnaryExpression( <String>, <TypeID>, <Expr> )
				  | BinaryExpression( <String>, <TypeID>, <Expr>, <Expr> )
                  | ListLiteral( <Expr>*, <TypeID> )
                  | SetLiteral( <Expr>*, <TypeID> )
                  | TupleLiteral( <Expr>*, <TypeID> )
				  | BinaryListExpression( <String>, <TypeID>, <Expr>, <Expr> )
                  | BinarySetExpression( <String>, <TypeID>, <Expr>, <Expr> )
                  | Function(<String>, <TypeID>, <Expr>)
                  | Function2(<String>, <TypeID>, <Expr>, <Expr> )
                  | TupleDot(<Expr>, <TypeID>, <String> )

<Statement>		::= SkipStat(OptGuard,OptChannel,Skip)
				  | AssignmentStat(OptGuard,OptChannel,<Expr>+,<Expr>+)
				  | AssignmentGGStat(OptGuard,OptChannel,<Expr>+,<Expr>+)
                  | ParenthesisedStat( <Statement> )
				  | SepStat(<Statement>,<Statement>)
				  | AltStat(<Statement>,<Statement>)
				  | ParStat(<Statement>,<Statement>)
  				  | StarStat(<Statement>)
			      | GuardedStarStat(<Expr>,<Statement>)
				  | DeltaStat(OptGuard,Delta)
                  | Instantiation(<String>,<Expr>*)
                  | SendStat(OptGuard, <Expr>, <Expr>, <Expr>+)
                  | RecvStat(OptGuard, <Expr>, <Expr>, <Expr>+)

<OptGuard>		::= <Expr>
				  |	Nil

<OptChannel>	::= Nil
