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;