Specification ::= Decl*;

abstract Decl ::= TypeInstance /Signature/;

TypeInstance ::= DataType Annotations;

Annotations ::= Annotation*;
Annotation ::= <Key:String> <Value:byte[]>;

Intention : Annotation;
DocString : Annotation;

TypeDecl   : Decl;
SampleDecl : Decl;

//Signatures are in the abstract grammar, so that
//they can be extended and refined by aspects.

Signature                 ::= SignatureList FlatSignatureList:SignatureList;
SignatureList             ::= SignatureLine*;
abstract SignatureLine 	  ::= <Indent:int> <Comment:String>;
abstract DataSignatureLine : SignatureLine;
ByteArraySignatureLine     : DataSignatureLine ::= <Data:byte[]>;
IntSignatureLine           : DataSignatureLine ::= <Data:int>;
StringSignatureLine        : DataSignatureLine ::= <Data:String>;
IntentionSignatureLine     : DataSignatureLine ::= Intention* ;
TypeRefSignatureLine       : SignatureLine     ::= Decl;

Field : TypeInstance;

abstract DataType;
VoidType           : DataType;
//SampleRefType      : DataType;
PrimType           : DataType ::= <Name:String> <Token:int>;
UserType           : DataType ::= <Name:String>;
StructType         : DataType ::= Field*;
ParseArrayType     : DataType ::= DataType Dim*;
abstract ArrayType : DataType ::= DataType Dim;
VariableArrayType  : ArrayType;
FixedArrayType     : ArrayType;

Dim ::= Exp*;

abstract Exp;
IntegerLiteral : Exp ::= <Value:String>;
VariableSize   : Exp;