Program ::= Decl*; abstract Decl ::= Type ; TypeDecl : Decl; SampleDecl : Decl; Field ::= Type ; abstract Type; VoidType : Type; PrimType : Type ::= ; UserType : Type ::= ; StructType : Type ::= Field*; ParseArrayType : Type ::= Type Dim*; abstract ArrayType : Type ::= Type Exp*; VariableArrayType : ArrayType; FixedArrayType : ArrayType; Dim ::= Exp*; abstract Exp; IntegerLiteral : Exp ::= ; VariableSize : Exp;