anchor.diff:  	;
   
   creation:
  -    name=TID '(' params+=actualParam (',' params+=actualParam)*  ')' ;
  +    name=TID LPAREN params+=actualParam (COMMA params+=actualParam)*  RPAREN ;
   
   varDecl :
  -    'val' (type=typeUsage ':')? name=ID '=' value=expression nls;
  +    VAL_KW (type=typeUsage COLON)? name=ID ASSIGNMENT value=expression nls;
   
   expressionStmt:
       expression nls;
  
positive.code: //
  
  program:
      'program' name=TID '(' params+=formalParam (',' params+=formalParam)* ')' '{' nls
      (statements += statement)*
      '}' nls;
  
  //
  
  fileMember:
      propertyDeclaration | typeDeclaration | program;
  
  ID: 'a'..'z' ('A'..'Z' | 'a'..'z' | '_')*;
  // Only for types
  
negative.code: nls: NL+;
  
  qualifiedId:
      (parts+=ID POINT)* parts+=ID;
  
  //
  
  namespaceDecl:
      NAMESPACE_KW name=qualifiedId;
  
  //
  
  typeUsage:
      ref=TID
      | arrayBase=typeUsage LSQUARE RSQUARE;
  
  //
  
  propertyDeclaration:
      PROPERTY_KW type=typeUsage COLON name=ID nls;
  
  propertyReference:
      PROPERTY_KW name=ID nls;
  
  typeMember:
      propertyDeclaration | propertyReference;
  
  typeDeclaration:
      TYPE_KW name=TID LBRACKET nls
      (typeMembers += typeMember)*
      RBRACKET nls;
  
  //
  
  actualParam:
      expression | name=ID ASSIGNMENT expression;
  
  functionCall:
      name=ID LPAREN params+=actualParam (COMMA params+=actualParam)*  RPAREN ;
  
  expression:
      functionCall | creation | stringLiteral | intLiteral;
  