]
+let cpp_keyword_table = Common.hash_of_list [
+ "new", (fun ii -> Tnew ii);
+ "delete",(fun ii -> Tdelete ii) ]
+
let error_radix s =
("numeric " ^ s ^ " constant contains digits beyond the radix:")
{ let info = tokinfo lexbuf in
let s = tok lexbuf in
Common.profile_code "C parsing.lex_ident" (fun () ->
- match Common.optionise (fun () -> Hashtbl.find keyword_table s)
- with
- | Some f -> f info
+ let tok =
+ if !Flag.c_plus_plus
+ then Common.optionise (fun () -> Hashtbl.find cpp_keyword_table s)
+ else None in
+ match tok with
+ Some f -> f info
+ | None ->
+ match Common.optionise (fun () -> Hashtbl.find keyword_table s)
+ with
+ | Some f -> f info
(* parse_typedef_fix.
* if Lexer_parser.is_typedef s
* now done in parse_c.ml.
*)
- | None -> TIdent (s, info)
+ | None -> TIdent (s, info)
)
}
(* gccext: apparently gcc allows dollar in variable names. found such
pr2 ("LEXER: identifier with dollar: " ^ s);
TIdent (s, info)
}
- | (letter | '$') (letter | digit | '$' | '~') *
- ("::" (letter | '$' | '~') (letter | digit | '$' | '~') *
+ | (letter | '$') (letter | digit | '$') *
+ ('<' (letter | '$' | '~') (letter | digit | '$' | '~') * '>') ?
+ ("::~" (letter | '$') (letter | digit | '$') *
+ ('<' (letter | '$' | '~') (letter | digit | '$' | '~') * '>') ?) +
+
+ {
+ if !Flag.c_plus_plus
+ then
+ begin
+ let info = tokinfo lexbuf in
+ let s = tok lexbuf in
+ Tconstructorname (s, info)
+ end
+ else
+ raise
+ (Lexical "~ and :: not allowed in C identifiers, try -c++ option")
+ }
+ | ((letter | '$') (letter | digit | '$') *)
+ ('<' (letter | '$' | '~') (letter | digit | '$' | '~') * '>')
+
+ {
+ if !Flag.c_plus_plus
+ then
+ begin
+ let info = tokinfo lexbuf in
+ let s = tok lexbuf in
+ TypedefIdent (s, info)
+ end
+ else raise (Lexical "<> detected, try -c++ option")
+ }
+
+
+ | (((letter | '$') (letter | digit | '$') *) as first)
+ ('<' (letter | '$' | '~') (letter | digit | '$' | '~') * '>') ?
+ "::" (((letter | '$') (letter | digit | '$') *) as second)
+ ('<' (letter | '$' | '~') (letter | digit | '$' | '~') * '>') ?
+ ("::" ((letter | '$') (letter | digit | '$') *)
+ ('<' (letter | '$' | '~') (letter | digit | '$' | '~') * '>') ?) *
+
+ {
+ if !Flag.c_plus_plus
+ then
+ begin
+ let info = tokinfo lexbuf in
+ let s = tok lexbuf in
+ if first = second
+ then Tconstructorname (s, info)
+ else TIdent (s, info)
+ end
+ else
+ raise
+ (Lexical "~ and :: not allowed in C identifiers, try -c++ option")
+ }
+
+ | "::" ((letter | '$') (letter | digit | '$') *)
+ ('<' (letter | '$' | '~') (letter | digit | '$' | '~') * '>') ?
+ ("::" ((letter | '$') (letter | digit | '$') *)
('<' (letter | '$' | '~') (letter | digit | '$' | '~') * '>') ?) *
{
begin
let info = tokinfo lexbuf in
let s = tok lexbuf in
- TIdent (s, info)
+ TIdent (s, info)
end
else
raise