anchor.diff:  indexType
     : 'Int'
     | 'String'
  -  | Identifier // of array or 
  +  | Identifier // of array or entity
  +  ;
  +
  +  
  +cloudType
  +  : 'CInt'
  +  | 'CString'
  +  | cloudSetType
  +  ;
  +  
  +expressionType
  +  : indexType
  +  | 'Set' '<' expressionType '>'
  +  | expressionType '->' expressionType
  +  ;
  +  
  +cloudSetType
  +  : 'CSet' '<' indexType '>'
     ;
   
   cloudDataDecl
     : entityDecl
  -  ;
  +  | arrayDecl
  +  ;
  +
   
   // Entities
  +// TODO think if I need to make the body optional
   entityDecl
  -  : 'entity' Identifier '(' elements ')'
  -  ;
  -
  +  : 'entity' Identifier '(' elements ')' '{' properties '}'
  +  ;
  +
  +//TODO I think I am enforcing one or more elements, fix...
   elements
     :   element (',' element)*
     ;
  
positive.code: // Parser
  
  program
    : schema EOF
    ;
  
  schema
  
negative.code: element
    : Identifier ':' indexType
    ;
    
  properties
    : property ';' (property ';')*
    ;
    
  property
    : Identifier ':' cloudType
    ; 
    
    
  // Arrays
    arrayDecl
    : 'array' Identifier '[' elements ']' '{' properties '}'
    ;
    
    
  // Expressions, expression, and related stuff
  expressions
    :   expression (',' expression)*
    ;
  
  
   expression
    : 'new' Identifier '(' expressions ')'
    | 'delete' expression
    | Identifier '[' expressions ']'
    | expression '(' expressions ')'
    | expression '.' expression
    | 'all' Identifier
    | 'entries' Identifier
    | 'yield'
    | 'flush'
    | expression expression
    | expression ';' expression
    | '(' expressions ')'
    | expression bop expression
    | foreach
    | value
    | varDeclaration
    ;
    
  bop
    : '=='
    | '!='
    ;
  
  varDeclaration
    : 'var' Identifier '=' value
    ;
  
  
  value
    : Identifier
    | literals
    | Identifier '[' values ']'
    | '(' values ')'
    | '(' Identifier ':' expressionType ')' '=>' expression
    ;
  
  
  ifelse
    : 'if' '(' expression ')' block 'else' block
    ;
  
  block
    : '{' expression '}'
    ;
  
  values
    : value ',' value
    | value
    ;
  
  foreach
    : 'foreach' Identifier 'in' ('all' | 'entries') expression '.' expression
      ('where' expression bop expression)?
      ('orderby' expression '.' expression)?
      block
    ;
  
  literals
    : IntegerLiteral
    | StringLiteral
    ;
   
  
  // LEXER
  
  