(* tokens *) open Parser_cpp module PI = Parse_info (*****************************************************************************) (* Is_xxx, categories *) (*****************************************************************************) let is_eof = function | EOF _ -> true | _ -> false (* ---------------------------------------------------------------------- *) let is_space = function | TCommentSpace _ | TCommentNewline _ -> true | _ -> false let is_comment_or_space = function | TCommentSpace _ | TCommentNewline _ | TComment _ -> true | _ -> false let is_just_comment = function | TComment _ -> true | _ -> false let is_comment = function | TCommentSpace _ | TCommentNewline _ | TComment _ | TComment_Pp _ | TComment_Cpp _ -> true | _ -> false let is_real_comment = function | TComment _ | TCommentSpace _ | TCommentNewline _ -> true | _ -> false let is_fake_comment = function | TComment_Pp _ | TComment_Cpp _ -> true | _ -> false let is_not_comment x = not (is_comment x) (* ---------------------------------------------------------------------- *) (* let is_gcc_token = function | Tasm _ | Tinline _ | Tattribute _ | Ttypeof _ -> true | _ -> false *) let is_pp_instruction = function | TInclude _ | TDefine _ | TIfdef _ | TIfdefelse _ | TIfdefelif _ | TEndif _ | TIfdefBool _ | TIfdefMisc _ | TIfdefVersion _ | TUndef _ | TCppDirectiveOther _ -> true | _ -> false let is_opar = function | TOPar _ | TOPar_Define _ | TOPar_CplusplusInit _ -> true | _ -> false let is_cpar = function | TCPar _ | TCPar_EOL _ -> true | _ -> false let is_obrace = function | TOBrace _ | TOBrace_DefineInit _ -> true | _ -> false let is_cbrace = function | TCBrace _ -> true | _ -> false let is_statement = function | Tfor _ | Tdo _ | Tif _ | Twhile _ | Treturn _ | Tbreak _ | Telse _ | Tswitch _ | Tcase _ | Tcontinue _ | Tgoto _ | TPtVirg _ | TIdent_MacroIterator _ -> true | _ -> false (* is_start_of_something is used in parse_c for error recovery, to find * a synchronisation token. * * Would like to put TIdent or TDefine, TIfdef but they can be in the * middle of a function, for instance with label:. * * Could put Typedefident but fired ? it would work in error recovery * on the already_passed tokens, which has been already gone in the * Parsing_hacks.lookahead machinery, but it will not work on the * "next" tokens. But because the namespace for labels is different * from namespace for ident/typedef, we can use the name for a typedef * for a label and so dangerous to put Typedefident at true here. * * Can look in parser_c.output to know what can be at toplevel * at the very beginning. *) let is_start_of_something = function | Tchar _ | Tshort _ | Tint _ | Tdouble _ | Tfloat _ | Tlong _ | Tunsigned _ | Tsigned _ | Tvoid _ | Tauto _ | Tregister _ | Textern _ | Tstatic _ | Tconst _ | Tvolatile _ | Ttypedef _ | Tstruct _ | Tunion _ | Tenum _ (* c++ext: *) | Tclass _ | Tbool _ | Twchar_t _ -> true | _ -> false let is_binary_operator = function | TOrLog _ | TAndLog _ | TOr _ | TXor _ | TAnd _ | TEqEq _ | TNotEq _ | TInf _ | TSup _ | TInfEq _ | TSupEq _ | TShl _ | TShr _ | TPlus _ | TMinus _ | TMul _ | TDiv _ | TMod _ -> true | _ -> false let is_binary_operator_except_star = function (* | TAnd _ *) (*| TMul _*) | TOrLog _ | TAndLog _ | TOr _ | TXor _ | TEqEq _ | TNotEq _ | TInf _ | TSup _ | TInfEq _ | TSupEq _ | TShl _ | TShr _ | TPlus _ | TMinus _ | TDiv _ | TMod _ -> true | _ -> false let is_stuff_taking_parenthized = function | Tif _ | Twhile _ | Tswitch _ | Ttypeof _ | TIdent_MacroIterator _ -> true | _ -> false let is_static_cast_like = function | Tconst_cast _ | Tdynamic_cast _ | Tstatic_cast _ | Treinterpret_cast _ -> true | _ -> false let is_basic_type = function | Tchar _ | Tshort _ | Tint _ | Tdouble _ | Tfloat _ | Tlong _ | Tbool _ | Twchar_t _ | Tunsigned _ | Tsigned _ | Tvoid _ -> true | _ -> false let is_struct_like_keyword = function | (Tstruct _ | Tunion _ | Tenum _) -> true (* c++ext: *) | (Tclass _) -> true | _ -> false let is_classkey_keyword = function | (Tstruct _ | Tunion _ | Tclass _) -> true | _ -> false let is_cpp_keyword = function | Tclass _ | Tthis _ | Tnew _ | Tdelete _ | Ttemplate _ | Ttypeid _ | Ttypename _ | Tcatch _ | Ttry _ | Tthrow _ | Toperator _ | Tpublic _ | Tprivate _ | Tprotected _ | Tfriend _ | Tvirtual _ | Tnamespace _ | Tusing _ | Tbool _ | Tfalse _ | Ttrue _ | Twchar_t _ | Tconst_cast _ | Tdynamic_cast _ | Tstatic_cast _ | Treinterpret_cast _ | Texplicit _ | Tmutable _ | Texport _ -> true | _ -> false let is_really_cpp_keyword = function | Tconst_cast _ | Tdynamic_cast _ | Tstatic_cast _ | Treinterpret_cast _ -> true (* when have some asm volatile, can have some :: | TColCol _ -> true *) | _ -> false (* some false positive on some C file like sqlite3.c *) let is_maybenot_cpp_keyword = function | Tpublic _ | Tprivate _ | Tprotected _ | Ttemplate _ | Tnew _ | Ttypename _ | Tnamespace _ -> true | _ -> false (* used in the algorithm for "10 most problematic tokens". C-s for TIdent * in parser_cpp.mly *) let is_ident_like = function | TIdent _ | TIdent_Typedef _ | TIdent_Define _ (* | TDefParamVariadic _*) | TUnknown _ | TIdent_MacroStmt _ | TIdent_MacroString _ | TIdent_MacroIterator _ | TIdent_MacroDecl _ (* | TIdent_MacroDeclConst _ *) (* | TIdent_MacroAttr _ | TIdent_MacroAttrStorage _ *) | TIdent_ClassnameInQualifier _ | TIdent_ClassnameInQualifier_BeforeTypedef _ | TIdent_Templatename _ | TIdent_TemplatenameInQualifier _ | TIdent_TemplatenameInQualifier_BeforeTypedef _ | TIdent_Constructor _ | TIdent_TypedefConstr _ -> true | _ -> false let is_privacy_keyword = function | Tpublic _ | Tprivate _ | Tprotected _ -> true | _ -> false let token_kind_of_tok t = match t with (* todo: ( ) { } ... *) | TComment _ | TComment_Pp _ | TComment_Cpp _ -> PI.Esthet PI.Comment | TCommentSpace _ -> PI.Esthet PI.Space | TCommentNewline _ -> PI.Esthet PI.Newline | _ -> PI.Other (*****************************************************************************) (* Visitors *) (*****************************************************************************) (* Because ocamlyacc force us to do it that way. The ocamlyacc token * cant be a pair of a sum type, it must be directly a sum type. *) let info_of_tok = function | TString ((_s, _isWchar), i) -> i | TChar ((_s, _isWchar), i) -> i | TFloat ((_s, _floatType), i) -> i | TAssign (_assignOp, i) -> i | TIdent (_s, i) -> i | TIdent_Typedef (_s, i) -> i | TInt (_s, i) -> i (*cppext:*) | TDefine (ii) -> ii | TInclude (_includes, _filename, i1) -> i1 | TUndef (_s, ii) -> ii | TCppDirectiveOther (ii) -> ii | TCommentNewline_DefineEndOfMacro (i1) -> i1 | TOPar_Define (i1) -> i1 | TIdent_Define (_s, i) -> i | TOBrace_DefineInit (i1) -> i1 | TCppEscapedNewline (ii) -> ii | TDefParamVariadic (_s, i1) -> i1 | TUnknown (i) -> i | TIdent_MacroStmt (i) -> i | TIdent_MacroString (i) -> i | TIdent_MacroIterator (_s,i) -> i | TIdent_MacroDecl (_s, i) -> i | Tconst_MacroDeclConst (i) -> i (* | TMacroTop (_s,i) -> i *) | TCPar_EOL (i1) -> i1 | TAny_Action (i) -> i | TComment (i) -> i | TCommentSpace (i) -> i | TComment_Pp (_cppkind, i) -> i | TComment_Cpp (_cppkind, i) -> i | TCommentNewline (i) -> i | TIfdef (i) -> i | TIfdefelse (i) -> i | TIfdefelif (i) -> i | TEndif (i) -> i | TIfdefBool (_b, i) -> i | TIfdefMisc (_b, i) -> i | TIfdefVersion (_b, i) -> i | TOPar (i) -> i | TOPar_CplusplusInit (i) -> i | TCPar (i) -> i | TOBrace (i) -> i | TCBrace (i) -> i | TOCro (i) -> i | TCCro (i) -> i | TDot (i) -> i | TComma (i) -> i | TPtrOp (i) -> i | TInc (i) -> i | TDec (i) -> i | TEq (i) -> i | TWhy (i) -> i | TTilde (i) -> i | TBang (i) -> i | TEllipsis (i) -> i | TCol (i) -> i | TPtVirg (i) -> i | TOrLog (i) -> i | TAndLog (i) -> i | TOr (i) -> i | TXor (i) -> i | TAnd (i) -> i | TEqEq (i) -> i | TNotEq (i) -> i | TInf (i) -> i | TSup (i) -> i | TInfEq (i) -> i | TSupEq (i) -> i | TShl (i) -> i | TShr (i) -> i | TPlus (i) -> i | TMinus (i) -> i | TMul (i) -> i | TDiv (i) -> i | TMod (i) -> i | Tchar (i) -> i | Tshort (i) -> i | Tint (i) -> i | Tdouble (i) -> i | Tfloat (i) -> i | Tlong (i) -> i | Tunsigned (i) -> i | Tsigned (i) -> i | Tvoid (i) -> i | Tauto (i) -> i | Tregister (i) -> i | Textern (i) -> i | Tstatic (i) -> i | Tconst (i) -> i | Tvolatile (i) -> i | Trestrict (i) -> i | Tstruct (i) -> i | Tenum (i) -> i | Ttypedef (i) -> i | Tunion (i) -> i | Tbreak (i) -> i | Telse (i) -> i | Tswitch (i) -> i | Tcase (i) -> i | Tcontinue (i) -> i | Tfor (i) -> i | Tdo (i) -> i | Tif (i) -> i | Twhile (i) -> i | Treturn (i) -> i | Tgoto (i) -> i | Tdefault (i) -> i | Tsizeof (i) -> i (* gccext: *) | Tasm (i) -> i | Tattribute (i) -> i | Tinline (i) -> i | Ttypeof (i) -> i (* c++ext: *) | Tclass (i) -> i | Tthis (i) -> i | Tnew (i) -> i | Tdelete (i) -> i | Ttemplate (i) -> i | Ttypeid (i) -> i | Ttypename (i) -> i | Tcatch (i) -> i | Ttry (i) -> i | Tthrow (i) -> i | Toperator (i) -> i | Tpublic (i) -> i | Tprivate (i) -> i | Tprotected (i) -> i | Tfriend (i) -> i | Tvirtual (i) -> i | Tnamespace (i) -> i | Tusing (i) -> i | Tbool (i) -> i | Ttrue (i) -> i | Tfalse (i) -> i | Twchar_t (i) -> i | Tconst_cast (i) -> i | Tdynamic_cast (i) -> i | Tstatic_cast (i) -> i | Treinterpret_cast (i) -> i | Texplicit (i) -> i | Tmutable (i) -> i | Texport (i) -> i | TColCol (i) -> i | TColCol_BeforeTypedef (i) -> i | TPtrOpStar (i) -> i | TDotStar(i) -> i | TIdent_ClassnameInQualifier (_s, i) -> i | TIdent_ClassnameInQualifier_BeforeTypedef (_s, i) -> i | TIdent_Templatename (_s, i) -> i | TIdent_Constructor (_s, i) -> i | TIdent_TypedefConstr (_s, i) -> i | TIdent_TemplatenameInQualifier (_s, i) -> i | TIdent_TemplatenameInQualifier_BeforeTypedef (_s, i) -> i | TInf_Template (i) -> i | TSup_Template (i) -> i | TOCro_new (i) -> i | TCCro_new (i) -> i | TInt_ZeroVirtual (i) -> i | Tchar_Constr (i) -> i | Tint_Constr (i) -> i | Tfloat_Constr (i) -> i | Tdouble_Constr (i) -> i | Twchar_t_Constr (i) -> i | Tshort_Constr (i) -> i | Tlong_Constr (i) -> i | Tbool_Constr (i) -> i | Tunsigned_Constr i -> i | Tsigned_Constr i -> i | EOF (i) -> i (* used by tokens to complete the parse_info with filename, line, col infos *) let visitor_info_of_tok f = function | TString ((s, isWchar), i) -> TString ((s, isWchar), f i) | TChar ((s, isWchar), i) -> TChar ((s, isWchar), f i) | TFloat ((s, floatType), i) -> TFloat ((s, floatType), f i) | TAssign (assignOp, i) -> TAssign (assignOp, f i) | TIdent (s, i) -> TIdent (s, f i) | TIdent_Typedef (s, i) -> TIdent_Typedef (s, f i) | TInt (s, i) -> TInt (s, f i) (* cppext: *) | TDefine (i1) -> TDefine(f i1) | TUndef (s,i1) -> TUndef(s, f i1) | TCppDirectiveOther (i1) -> TCppDirectiveOther(f i1) | TInclude (includes, filename, i1) -> TInclude (includes, filename, f i1) | TCppEscapedNewline (i1) -> TCppEscapedNewline (f i1) | TCommentNewline_DefineEndOfMacro (i1) -> TCommentNewline_DefineEndOfMacro (f i1) | TOPar_Define (i1) -> TOPar_Define (f i1) | TIdent_Define (s, i) -> TIdent_Define (s, f i) | TDefParamVariadic (s, i1) -> TDefParamVariadic (s, f i1) | TOBrace_DefineInit (i1) -> TOBrace_DefineInit (f i1) | TUnknown (i) -> TUnknown (f i) | TIdent_MacroStmt (i) -> TIdent_MacroStmt (f i) | TIdent_MacroString (i) -> TIdent_MacroString (f i) | TIdent_MacroIterator (s,i) -> TIdent_MacroIterator (s,f i) | TIdent_MacroDecl (s,i) -> TIdent_MacroDecl (s, f i) | Tconst_MacroDeclConst (i) -> Tconst_MacroDeclConst (f i) (* | TMacroTop (s,i) -> TMacroTop (s,f i) *) | TCPar_EOL (i) -> TCPar_EOL (f i) | TAny_Action (i) -> TAny_Action (f i) | TComment (i) -> TComment (f i) | TCommentSpace (i) -> TCommentSpace (f i) | TCommentNewline (i) -> TCommentNewline (f i) | TComment_Pp (cppkind, i) -> TComment_Pp (cppkind, f i) | TComment_Cpp (cppkind, i) -> TComment_Cpp (cppkind, f i) | TIfdef (i) -> TIfdef (f i) | TIfdefelse (i) -> TIfdefelse (f i) | TIfdefelif (i) -> TIfdefelif (f i) | TEndif (i) -> TEndif (f i) | TIfdefBool (b, i) -> TIfdefBool (b, f i) | TIfdefMisc (b, i) -> TIfdefMisc (b, f i) | TIfdefVersion (b, i) -> TIfdefVersion (b, f i) | TOPar (i) -> TOPar (f i) | TOPar_CplusplusInit (i) -> TOPar_CplusplusInit (f i) | TCPar (i) -> TCPar (f i) | TOBrace (i) -> TOBrace (f i) | TCBrace (i) -> TCBrace (f i) | TOCro (i) -> TOCro (f i) | TCCro (i) -> TCCro (f i) | TDot (i) -> TDot (f i) | TComma (i) -> TComma (f i) | TPtrOp (i) -> TPtrOp (f i) | TInc (i) -> TInc (f i) | TDec (i) -> TDec (f i) | TEq (i) -> TEq (f i) | TWhy (i) -> TWhy (f i) | TTilde (i) -> TTilde (f i) | TBang (i) -> TBang (f i) | TEllipsis (i) -> TEllipsis (f i) | TCol (i) -> TCol (f i) | TPtVirg (i) -> TPtVirg (f i) | TOrLog (i) -> TOrLog (f i) | TAndLog (i) -> TAndLog (f i) | TOr (i) -> TOr (f i) | TXor (i) -> TXor (f i) | TAnd (i) -> TAnd (f i) | TEqEq (i) -> TEqEq (f i) | TNotEq (i) -> TNotEq (f i) | TInf (i) -> TInf (f i) | TSup (i) -> TSup (f i) | TInfEq (i) -> TInfEq (f i) | TSupEq (i) -> TSupEq (f i) | TShl (i) -> TShl (f i) | TShr (i) -> TShr (f i) | TPlus (i) -> TPlus (f i) | TMinus (i) -> TMinus (f i) | TMul (i) -> TMul (f i) | TDiv (i) -> TDiv (f i) | TMod (i) -> TMod (f i) | Tchar (i) -> Tchar (f i) | Tshort (i) -> Tshort (f i) | Tint (i) -> Tint (f i) | Tdouble (i) -> Tdouble (f i) | Tfloat (i) -> Tfloat (f i) | Tlong (i) -> Tlong (f i) | Tunsigned (i) -> Tunsigned (f i) | Tsigned (i) -> Tsigned (f i) | Tvoid (i) -> Tvoid (f i) | Tauto (i) -> Tauto (f i) | Tregister (i) -> Tregister (f i) | Textern (i) -> Textern (f i) | Tstatic (i) -> Tstatic (f i) | Tconst (i) -> Tconst (f i) | Tvolatile (i) -> Tvolatile (f i) | Trestrict (i) -> Trestrict (f i) | Tstruct (i) -> Tstruct (f i) | Tenum (i) -> Tenum (f i) | Ttypedef (i) -> Ttypedef (f i) | Tunion (i) -> Tunion (f i) | Tbreak (i) -> Tbreak (f i) | Telse (i) -> Telse (f i) | Tswitch (i) -> Tswitch (f i) | Tcase (i) -> Tcase (f i) | Tcontinue (i) -> Tcontinue (f i) | Tfor (i) -> Tfor (f i) | Tdo (i) -> Tdo (f i) | Tif (i) -> Tif (f i) | Twhile (i) -> Twhile (f i) | Treturn (i) -> Treturn (f i) | Tgoto (i) -> Tgoto (f i) | Tdefault (i) -> Tdefault (f i) | Tsizeof (i) -> Tsizeof (f i) | Tasm (i) -> Tasm (f i) | Tattribute (i) -> Tattribute (f i) | Tinline (i) -> Tinline (f i) | Ttypeof (i) -> Ttypeof (f i) | Tclass (i) -> Tclass (f i) | Tthis (i) -> Tthis (f i) | Tnew (i) -> Tnew (f i) | Tdelete (i) -> Tdelete (f i) | Ttemplate (i) -> Ttemplate (f i) | Ttypeid (i) -> Ttypeid (f i) | Ttypename (i) -> Ttypename (f i) | Tcatch (i) -> Tcatch (f i) | Ttry (i) -> Ttry (f i) | Tthrow (i) -> Tthrow (f i) | Toperator (i) -> Toperator (f i) | Tpublic (i) -> Tpublic (f i) | Tprivate (i) -> Tprivate (f i) | Tprotected (i) -> Tprotected (f i) | Tfriend (i) -> Tfriend (f i) | Tvirtual (i) -> Tvirtual (f i) | Tnamespace (i) -> Tnamespace (f i) | Tusing (i) -> Tusing (f i) | Tbool (i) -> Tbool (f i) | Ttrue (i) -> Ttrue (f i) | Tfalse (i) -> Tfalse (f i) | Twchar_t (i) -> Twchar_t (f i) | Tconst_cast (i) -> Tconst_cast (f i) | Tdynamic_cast (i) -> Tdynamic_cast (f i) | Tstatic_cast (i) -> Tstatic_cast (f i) | Treinterpret_cast (i) -> Treinterpret_cast (f i) | Texplicit (i) -> Texplicit (f i) | Tmutable (i) -> Tmutable (f i) | Texport (i) -> Texport (f i) | TColCol (i) -> TColCol (f i) | TColCol_BeforeTypedef (i) -> TColCol_BeforeTypedef (f i) | TPtrOpStar (i) -> TPtrOpStar (f i) | TDotStar(i) -> TDotStar (f i) | TIdent_ClassnameInQualifier (s, i) -> TIdent_ClassnameInQualifier (s, f i) | TIdent_ClassnameInQualifier_BeforeTypedef (s, i) -> TIdent_ClassnameInQualifier_BeforeTypedef (s, f i) | TIdent_Templatename (s, i) -> TIdent_Templatename (s, f i) | TIdent_Constructor (s, i) -> TIdent_Constructor (s, f i) | TIdent_TypedefConstr (s, i) -> TIdent_TypedefConstr (s, f i) | TIdent_TemplatenameInQualifier (s, i) -> TIdent_TemplatenameInQualifier (s, f i) | TIdent_TemplatenameInQualifier_BeforeTypedef (s, i) -> TIdent_TemplatenameInQualifier_BeforeTypedef (s, f i) | TInf_Template (i) -> TInf_Template (f i) | TSup_Template (i) -> TSup_Template (f i) | TOCro_new (i) -> TOCro_new (f i) | TCCro_new (i) -> TCCro_new (f i) | TInt_ZeroVirtual (i) -> TInt_ZeroVirtual (f i) | Tchar_Constr (i) -> Tchar_Constr (f i) | Tint_Constr (i) -> Tint_Constr (f i) | Tfloat_Constr (i) -> Tfloat_Constr (f i) | Tdouble_Constr (i) -> Tdouble_Constr (f i) | Twchar_t_Constr (i) -> Twchar_t_Constr (f i) | Tshort_Constr (i) -> Tshort_Constr (f i) | Tlong_Constr (i) -> Tlong_Constr (f i) | Tbool_Constr (i) -> Tbool_Constr (f i) | Tsigned_Constr (i) -> Tsigned_Constr (f i) | Tunsigned_Constr (i) -> Tunsigned_Constr (f i) | EOF (i) -> EOF (f i) (*****************************************************************************) (* Accessors *) (*****************************************************************************) let line_of_tok tok = let info = info_of_tok tok in PI.line_of_info info