<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XML Spy v4.2 U (http://www.xmlspy.com) by jaco (technion) -->
<!ELEMENT Program (Global?, Module+)>
<!ATTLIST Program
	ID ID #IMPLIED
>
<!ELEMENT Global (HOLD_PREVIOUS?, CONST?, TYPE?, VAR?, DEFINE?)>
<!ATTLIST Global
	ID ID #IMPLIED
>
<!ELEMENT CONST (ConstDef+)>
<!ATTLIST CONST
	ID ID #IMPLIED
>
<!ELEMENT TYPE (TypeDef+)>
<!ATTLIST TYPE
	ID ID #IMPLIED
>
<!ELEMENT VAR (VarDef+)>
<!ATTLIST VAR
	ID ID #IMPLIED
>
<!ELEMENT DEFINE (Def+)>
<!ATTLIST DEFINE
	ID ID #IMPLIED
>
<!ELEMENT ConstDef (ATOM, Expr)>
<!ATTLIST ConstDef
	ID ID #IMPLIED
>
<!ELEMENT TypeDef (ATOM, (Range | Scalarset | Enum | ATOM))>
<!ATTLIST TypeDef
	ID ID #IMPLIED
>
<!ELEMENT Enum (ATOM+)>
<!ATTLIST Enum
	ID ID #IMPLIED
>
<!ELEMENT VarDef (ATOM, Typename, INITVAL?)>
<!ATTLIST VarDef
	ID ID #IMPLIED
>
<!ELEMENT INITVAL (Expr+)>
<!ATTLIST INITVAL
	ID ID #IMPLIED
>
<!ELEMENT Def (ATOM, Expr)>
<!ATTLIST Def
	ID ID #IMPLIED
>
<!ELEMENT Module (ATOM, Params?, DEFINE?, VAR?, COJOIN?, Comment?, (Modcombin | Transition+))>
<!ATTLIST Module
	ID ID #IMPLIED
>
<!ELEMENT Params (Param+)>
<!ATTLIST Params
	ID ID #IMPLIED
>
<!ELEMENT Param (ATOM, Typename)>
<!ATTLIST Param
	ID ID #IMPLIED
>
<!ELEMENT COJOIN (Expr)>
<!ATTLIST COJOIN
	ID ID #IMPLIED
>
<!ELEMENT Typename (ArrayType | BOOL | INTEGER | ATOM)>
<!ATTLIST Typename
	ID ID #IMPLIED
>
<!ELEMENT ArrayType (Expr, Typename)>
<!ATTLIST ArrayType
	ID ID #IMPLIED
>
<!ELEMENT Modcombin (INST | ASYNC | SYNC | PART)>
<!ATTLIST Modcombin
	ID ID #IMPLIED
>
<!ELEMENT INST (ATOM, Modparams?, Renames?)>
<!ATTLIST INST
	ID ID #IMPLIED
>
<!ELEMENT Modparams (Expr+)>
<!ATTLIST Modparams
	ID ID #IMPLIED
>
<!ELEMENT Renames (Rename+)>
<!ATTLIST Renames
	ID ID #IMPLIED
>
<!ELEMENT Rename (Pair, ATOM)>
<!ATTLIST Rename
	ID ID #IMPLIED
>
<!ELEMENT Pair ((Pair, Pair) | ATOM)>
<!ATTLIST Pair
	ID ID #IMPLIED
>
<!ELEMENT ASYNC (Modcombin, Modcombin)>
<!ATTLIST ASYNC
	ID ID #IMPLIED
>
<!ELEMENT SYNC (Modcombin, Modcombin)>
<!ATTLIST SYNC
	ID ID #IMPLIED
>
<!ELEMENT PART (Modcombin, Pair+, Modcombin)>
<!ATTLIST PART
	ID ID #IMPLIED
>
<!ELEMENT Transition (ATOM, Enable, ((Assign, Relation) | Assign | Relation))>
<!ATTLIST Transition
	ID ID #IMPLIED
>
<!ELEMENT Enable (Expr)>
<!ATTLIST Enable
	ID ID #IMPLIED
>
<!ELEMENT Assign (Assignment+)>
<!ATTLIST Assign
	ID ID #IMPLIED
>
<!ELEMENT Assignment (Expr, Expr)>
<!ATTLIST Assignment
	ID ID #IMPLIED
>
<!ELEMENT Relation (Expr)>
<!ATTLIST Relation
	ID ID #IMPLIED
>
<!ELEMENT Range (Expr, Expr)>
<!ATTLIST Range
	ID ID #IMPLIED
>
<!ELEMENT Scalarset (Expr)>
<!ATTLIST Scalarset
	ID ID #IMPLIED
>
<!ELEMENT Expr (Constant | PLUS | MINUS | DIVIDE | TIMES | MOD | EQUAL | NOTEQUAL | LE | GE | LT | GT | Neatomset | OR | AND | NOT | PAR_EXPR)>
<!ATTLIST Expr
	ID ID #IMPLIED
>
<!ELEMENT PLUS (Expr, Expr)>
<!ATTLIST PLUS
	ID ID #IMPLIED
>
<!ELEMENT MINUS ((Expr | (Expr, Expr)))>
<!ATTLIST MINUS
	ID ID #IMPLIED
>
<!ELEMENT DIVIDE (Expr, Expr)>
<!ATTLIST DIVIDE
	ID ID #IMPLIED
>
<!ELEMENT TIMES (Expr, Expr)>
<!ATTLIST TIMES
	ID ID #IMPLIED
>
<!ELEMENT MOD (Expr, Expr)>
<!ATTLIST MOD
	ID ID #IMPLIED
>
<!ELEMENT EQUAL (Expr, Expr)>
<!ATTLIST EQUAL
	ID ID #IMPLIED
>
<!ELEMENT NOTEQUAL (Expr, Expr)>
<!ATTLIST NOTEQUAL
	ID ID #IMPLIED
>
<!ELEMENT LE (Expr, Expr)>
<!ATTLIST LE
	ID ID #IMPLIED
>
<!ELEMENT GE (Expr, Expr)>
<!ATTLIST GE
	ID ID #IMPLIED
>
<!ELEMENT LT (Expr, Expr)>
<!ATTLIST LT
	ID ID #IMPLIED
>
<!ELEMENT GT (Expr, Expr)>
<!ATTLIST GT
	ID ID #IMPLIED
>
<!ELEMENT OR (Expr, Expr)>
<!ATTLIST OR
	ID ID #IMPLIED
>
<!ELEMENT AND (Expr, Expr)>
<!ATTLIST AND
	ID ID #IMPLIED
>
<!ELEMENT NOT (Expr)>
<!ATTLIST NOT
	ID ID #IMPLIED
>
<!ELEMENT PAR_EXPR (Expr)>
<!ATTLIST PAR_EXPR
	ID ID #IMPLIED
>
<!ELEMENT ARRAY (Atom, Expr)>
<!ATTLIST ARRAY
	ID ID #IMPLIED
>
<!ELEMENT Neatomset (Expr+)>
<!ATTLIST Neatomset
	ID ID #IMPLIED
>
<!ELEMENT Constant (Genconst | Boolconst)>
<!ATTLIST Constant
	ID ID #IMPLIED
>
<!ELEMENT Genconst (Atom | TaggedAtom | Number)>
<!ATTLIST Genconst
	ID ID #IMPLIED
>
<!ELEMENT Boolconst (TRUE | FALSE)>
<!ATTLIST Boolconst
	ID ID #IMPLIED
>
<!ELEMENT TaggedAtom (Atom)>
<!ATTLIST TaggedAtom
	ID ID #IMPLIED
>
<!ELEMENT Atom (ATOM | ARRAY)>
<!ATTLIST Atom
	ID ID #IMPLIED
>
<!ELEMENT HOLD_PREVIOUS EMPTY>
<!ATTLIST HOLD_PREVIOUS
	ID ID #IMPLIED
>
<!ELEMENT Comment (#PCDATA)>
<!ATTLIST Comment
	ID ID #IMPLIED
>
<!ELEMENT BOOL EMPTY>
<!ATTLIST BOOL
	ID ID #IMPLIED
>
<!ELEMENT INTEGER EMPTY>
<!ATTLIST INTEGER
	ID ID #IMPLIED
>
<!ELEMENT TRUE EMPTY>
<!ATTLIST TRUE
	ID ID #IMPLIED
>
<!ELEMENT FALSE EMPTY>
<!ATTLIST FALSE
	ID ID #IMPLIED
>
<!ELEMENT ATOM (#PCDATA)>
<!ATTLIST ATOM
	ID ID #IMPLIED
>
<!ELEMENT Number (#PCDATA)>
<!ATTLIST Number
	ID ID #IMPLIED
>
