let identifier =
    let all_kw = Hashtbl.create 37 in
    let c_kw = Hashtbl.create 37 in
    let type_kw = Hashtbl.create 3 in
    List.iter
      (fun (i,t,flag) ->
         Hashtbl.add all_kw i t;
         if flag then Hashtbl.add c_kw i t
      )
      [
        "assert"ASSERTfalse;
        "assigns"ASSIGNSfalse;
        "assumes"ASSUMESfalse;
        "at"EXT_ATfalse;(* ACSL extension for external spec file *)
        "axiom"AXIOMfalse;
        "axiomatic"AXIOMATICfalse;
        "behavior"BEHAVIORfalse;
        "behaviors"BEHAVIORSfalse;
        "breaks"BREAKSfalse;
        "case"CASEtrue;
        "char"CHARtrue;
        "complete"COMPLETEfalse;
        "const"CONSTtrue;
        "continues"CONTINUESfalse;
        "contract"CONTRACTfalse;(* ACSL extension for external spec file *)
        "decreases"DECREASESfalse;
        "disjoint"DISJOINTfalse;
        "double"DOUBLEtrue;
        "else"ELSEtrue;
        "ensures"ENSURESfalse ;
        "enum"ENUMtrue;
        "exits"EXITSfalse;
        "function"FUNCTIONfalse;(* ACSL extension for external spec file *)
        "float"FLOATtrue;
        "for"FORtrue;
        "global",    GLOBALfalse;
        "if"IFtrue;
        "impact"IMPACTfalse;
        "inductive"INDUCTIVEfalse;
        "include"INCLUDEfalse;(* ACSL extension for external spec file *)
        "int"INTtrue;
        "invariant"INVARIANTfalse;
        "label"LABELfalse;
        "lemma"LEMMAfalse;
        "let"EXT_LETfalse;(* ACSL extension for external spec file *)
        "logic"LOGICfalse;
        "long"LONGtrue;
        "loop"LOOPfalse;
        "module"MODULEfalse;(* ACSL extension for external spec file *)
        "pragma"PRAGMAfalse;
        "predicate"PREDICATEfalse;
        "reads"READSfalse;
        "requires"REQUIRESfalse;
        "returns"RETURNSfalse;
        "short"SHORTtrue;
        "signed"SIGNEDtrue;
        "sizeof"SIZEOFtrue;
        "slice"SLICEfalse;
        "struct"STRUCTtrue;
        "terminates"TERMINATESfalse;
        "type"TYPEfalse;
        "union"UNIONtrue;
        "unsigned"UNSIGNEDtrue;
        "variant"VARIANTfalse;
        "void"VOIDtrue;
        "volatile"VOLATILEtrue;
        "writes"WRITESfalse;
      ];
    List.iter (fun (x, y) -> Hashtbl.add type_kw x y)
      ["integer"INTEGER"real"REAL"boolean"BOOLEAN; ];
    fun s ->
      try
        Hashtbl.find (if Logic_utils.is_kw_c_mode () then c_kw else all_kw) s
      with Not_found ->
        if Logic_env.typename_status s then TYPENAME s
        else
          (try
             Hashtbl.find type_kw s
           with Not_found ->
             if Logic_utils.is_rt_type_mode () then TYPENAME s
             else IDENTIFIER s)