%%%
 %% Jimple Types
 %%%
module languages/jimple/Types
imports
  languages/jimple/Names
  
exports
  sorts BaseTypeNoName
  context-free syntax

    "boolean"              -> BaseTypeNoName {cons("BooleanType")}
    "byte"                 -> BaseTypeNoName {cons("ByteType")}
    "char"                 -> BaseTypeNoName {cons("CharType")}
    "short"                -> BaseTypeNoName {cons("ShortType")}
    "int"                  -> BaseTypeNoName {cons("IntType")}
    "long"                 -> BaseTypeNoName {cons("LongType")}
    "float"                -> BaseTypeNoName {cons("FloatType")}
    "double"               -> BaseTypeNoName {cons("DoubleType")}
    "null_type"            -> BaseTypeNoName {cons("NullType")}

  sorts NonVoidType
  context-free syntax

    BaseTypeNoName      -> NonVoidType
    QuotedName          -> NonVoidType {cons("RefType")}
    Identifier          -> NonVoidType {cons("RefType")}
    FullIdentifier      -> NonVoidType {cons("RefType")}
    NonVoidType "[" "]" -> NonVoidType {cons("ArrayType")}

  sorts Type
  context-free syntax
    "void"                 -> Type {cons("VoidType")}
    NonVoidType            -> Type

  sorts JimpleType
  context-free syntax
    "unknown"              -> JimpleType {cons("UnknownType")}
    NonVoidType            -> JimpleType

  sorts BaseType
  context-free syntax
    BaseTypeNoName         -> BaseType
    ClassName              -> BaseType