anchor.diff:      : n=native_type     { $t = cql3_type::raw::from(n); }
       | c=collection_type { $t = c; }
       | tt=tuple_type     { $t = tt; }
  -#if 0
  -    | id=userTypeName   { $t = CQL3Type.Raw.userType(id); }
  +    | id=userTypeName   { $t = cql3::cql3_type::raw::user_type(id); }
  +#if 0
       | K_FROZEN '<' f=comparatorType '>'
         {
           try {
  
positive.code:     : (cfOrKsName[name, true] '.')? cfOrKsName[name, false]
      ;
  
  #if 0
  userTypeName returns [UTName name]
      : (ks=ident '.')? ut=non_type_ident { return new UTName(ks, ut); }
      ;
  #endif
  
  cfOrKsName[shared_ptr<cql3::cf_name> name, bool isKs]
      : t=IDENT              { if (isKs) $name->set_keyspace($t.text, false); else $name->set_column_family($t.text, false); }
  
negative.code:     : IDENT
      | STRING_LITERAL
      ;
  #endif
  
  // Basically the same as cident, but we need to exlude existing CQL3 types
  // (which for some reason are not reserved otherwise)
  non_type_ident returns [shared_ptr<cql3::column_identifier> id]
      : t=IDENT                    { if (_reserved_type_names().count($t.text)) { add_recognition_error("Invalid (reserved) user type name " + $t.text); } $id = ::make_shared<cql3::column_identifier>($t.text, false); }
      | t=QUOTED_NAME              { $id = ::make_shared<cql3::column_identifier>($t.text, true); }
      | k=basic_unreserved_keyword { $id = ::make_shared<cql3::column_identifier>(k, false); }
      | kk=K_KEY                   { $id = ::make_shared<cql3::column_identifier>($kk.text, false); }
      ;
  
  unreserved_keyword returns [sstring str]
      : u=unreserved_function_keyword     { $str = u; }
  