123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730(* tokens *)openParser_cppmodulePI=Parse_info(*****************************************************************************)(* Is_xxx, categories *)(*****************************************************************************)letis_eof=function|EOF_->true|_->false(* ---------------------------------------------------------------------- *)letis_space=function|TCommentSpace_|TCommentNewline_->true|_->falseletis_comment_or_space=function|TCommentSpace_|TCommentNewline_|TComment_->true|_->falseletis_just_comment=function|TComment_->true|_->falseletis_comment=function|TCommentSpace_|TCommentNewline_|TComment_|TComment_Pp_|TComment_Cpp_->true|_->falseletis_real_comment=function|TComment_|TCommentSpace_|TCommentNewline_->true|_->falseletis_fake_comment=function|TComment_Pp_|TComment_Cpp_->true|_->falseletis_not_commentx=not(is_commentx)(* ---------------------------------------------------------------------- *)(*
let is_gcc_token = function
| Tasm _ | Tinline _ | Tattribute _ | Ttypeof _
-> true
| _ -> false
*)letis_pp_instruction=function|TInclude_|TDefine_|TIfdef_|TIfdefelse_|TIfdefelif_|TEndif_|TIfdefBool_|TIfdefMisc_|TIfdefVersion_|TUndef_|TCppDirectiveOther_->true|_->falseletis_opar=function|TOPar_|TOPar_Define_|TOPar_CplusplusInit_->true|_->falseletis_cpar=function|TCPar_|TCPar_EOL_->true|_->falseletis_obrace=function|TOBrace_|TOBrace_DefineInit_->true|_->falseletis_cbrace=function|TCBrace_->true|_->falseletis_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.
*)letis_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|_->falseletis_binary_operator=function|TOrLog_|TAndLog_|TOr_|TXor_|TAnd_|TEqEq_|TNotEq_|TInf_|TSup_|TInfEq_|TSupEq_|TShl_|TShr_|TPlus_|TMinus_|TMul_|TDiv_|TMod_->true|_->falseletis_binary_operator_except_star=function(* | TAnd _ *)(*| TMul _*)|TOrLog_|TAndLog_|TOr_|TXor_|TEqEq_|TNotEq_|TInf_|TSup_|TInfEq_|TSupEq_|TShl_|TShr_|TPlus_|TMinus_|TDiv_|TMod_->true|_->falseletis_stuff_taking_parenthized=function|Tif_|Twhile_|Tswitch_|Ttypeof_|TIdent_MacroIterator_->true|_->falseletis_static_cast_like=function|Tconst_cast_|Tdynamic_cast_|Tstatic_cast_|Treinterpret_cast_->true|_->falseletis_basic_type=function|Tchar_|Tshort_|Tint_|Tdouble_|Tfloat_|Tlong_|Tbool_|Twchar_t_|Tunsigned_|Tsigned_|Tvoid_->true|_->falseletis_struct_like_keyword=function|(Tstruct_|Tunion_|Tenum_)->true(* c++ext: *)|(Tclass_)->true|_->falseletis_classkey_keyword=function|(Tstruct_|Tunion_|Tclass_)->true|_->falseletis_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|_->falseletis_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 *)letis_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
*)letis_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|_->falseletis_privacy_keyword=function|Tpublic_|Tprivate_|Tprotected_->true|_->falselettoken_kind_of_tokt=matchtwith(* todo: ( ) { } ... *)|TComment_|TComment_Pp_|TComment_Cpp_->PI.EsthetPI.Comment|TCommentSpace_->PI.EsthetPI.Space|TCommentNewline_->PI.EsthetPI.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.
*)letinfo_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_Constri->i|Tsigned_Constri->i|EOF(i)->i(* used by tokens to complete the parse_info with filename, line, col infos *)letvisitor_info_of_tokf=function|TString((s,isWchar),i)->TString((s,isWchar),fi)|TChar((s,isWchar),i)->TChar((s,isWchar),fi)|TFloat((s,floatType),i)->TFloat((s,floatType),fi)|TAssign(assignOp,i)->TAssign(assignOp,fi)|TIdent(s,i)->TIdent(s,fi)|TIdent_Typedef(s,i)->TIdent_Typedef(s,fi)|TInt(s,i)->TInt(s,fi)(* cppext: *)|TDefine(i1)->TDefine(fi1)|TUndef(s,i1)->TUndef(s,fi1)|TCppDirectiveOther(i1)->TCppDirectiveOther(fi1)|TInclude(includes,filename,i1)->TInclude(includes,filename,fi1)|TCppEscapedNewline(i1)->TCppEscapedNewline(fi1)|TCommentNewline_DefineEndOfMacro(i1)->TCommentNewline_DefineEndOfMacro(fi1)|TOPar_Define(i1)->TOPar_Define(fi1)|TIdent_Define(s,i)->TIdent_Define(s,fi)|TDefParamVariadic(s,i1)->TDefParamVariadic(s,fi1)|TOBrace_DefineInit(i1)->TOBrace_DefineInit(fi1)|TUnknown(i)->TUnknown(fi)|TIdent_MacroStmt(i)->TIdent_MacroStmt(fi)|TIdent_MacroString(i)->TIdent_MacroString(fi)|TIdent_MacroIterator(s,i)->TIdent_MacroIterator(s,fi)|TIdent_MacroDecl(s,i)->TIdent_MacroDecl(s,fi)|Tconst_MacroDeclConst(i)->Tconst_MacroDeclConst(fi)(* | TMacroTop (s,i) -> TMacroTop (s,f i) *)|TCPar_EOL(i)->TCPar_EOL(fi)|TAny_Action(i)->TAny_Action(fi)|TComment(i)->TComment(fi)|TCommentSpace(i)->TCommentSpace(fi)|TCommentNewline(i)->TCommentNewline(fi)|TComment_Pp(cppkind,i)->TComment_Pp(cppkind,fi)|TComment_Cpp(cppkind,i)->TComment_Cpp(cppkind,fi)|TIfdef(i)->TIfdef(fi)|TIfdefelse(i)->TIfdefelse(fi)|TIfdefelif(i)->TIfdefelif(fi)|TEndif(i)->TEndif(fi)|TIfdefBool(b,i)->TIfdefBool(b,fi)|TIfdefMisc(b,i)->TIfdefMisc(b,fi)|TIfdefVersion(b,i)->TIfdefVersion(b,fi)|TOPar(i)->TOPar(fi)|TOPar_CplusplusInit(i)->TOPar_CplusplusInit(fi)|TCPar(i)->TCPar(fi)|TOBrace(i)->TOBrace(fi)|TCBrace(i)->TCBrace(fi)|TOCro(i)->TOCro(fi)|TCCro(i)->TCCro(fi)|TDot(i)->TDot(fi)|TComma(i)->TComma(fi)|TPtrOp(i)->TPtrOp(fi)|TInc(i)->TInc(fi)|TDec(i)->TDec(fi)|TEq(i)->TEq(fi)|TWhy(i)->TWhy(fi)|TTilde(i)->TTilde(fi)|TBang(i)->TBang(fi)|TEllipsis(i)->TEllipsis(fi)|TCol(i)->TCol(fi)|TPtVirg(i)->TPtVirg(fi)|TOrLog(i)->TOrLog(fi)|TAndLog(i)->TAndLog(fi)|TOr(i)->TOr(fi)|TXor(i)->TXor(fi)|TAnd(i)->TAnd(fi)|TEqEq(i)->TEqEq(fi)|TNotEq(i)->TNotEq(fi)|TInf(i)->TInf(fi)|TSup(i)->TSup(fi)|TInfEq(i)->TInfEq(fi)|TSupEq(i)->TSupEq(fi)|TShl(i)->TShl(fi)|TShr(i)->TShr(fi)|TPlus(i)->TPlus(fi)|TMinus(i)->TMinus(fi)|TMul(i)->TMul(fi)|TDiv(i)->TDiv(fi)|TMod(i)->TMod(fi)|Tchar(i)->Tchar(fi)|Tshort(i)->Tshort(fi)|Tint(i)->Tint(fi)|Tdouble(i)->Tdouble(fi)|Tfloat(i)->Tfloat(fi)|Tlong(i)->Tlong(fi)|Tunsigned(i)->Tunsigned(fi)|Tsigned(i)->Tsigned(fi)|Tvoid(i)->Tvoid(fi)|Tauto(i)->Tauto(fi)|Tregister(i)->Tregister(fi)|Textern(i)->Textern(fi)|Tstatic(i)->Tstatic(fi)|Tconst(i)->Tconst(fi)|Tvolatile(i)->Tvolatile(fi)|Trestrict(i)->Trestrict(fi)|Tstruct(i)->Tstruct(fi)|Tenum(i)->Tenum(fi)|Ttypedef(i)->Ttypedef(fi)|Tunion(i)->Tunion(fi)|Tbreak(i)->Tbreak(fi)|Telse(i)->Telse(fi)|Tswitch(i)->Tswitch(fi)|Tcase(i)->Tcase(fi)|Tcontinue(i)->Tcontinue(fi)|Tfor(i)->Tfor(fi)|Tdo(i)->Tdo(fi)|Tif(i)->Tif(fi)|Twhile(i)->Twhile(fi)|Treturn(i)->Treturn(fi)|Tgoto(i)->Tgoto(fi)|Tdefault(i)->Tdefault(fi)|Tsizeof(i)->Tsizeof(fi)|Tasm(i)->Tasm(fi)|Tattribute(i)->Tattribute(fi)|Tinline(i)->Tinline(fi)|Ttypeof(i)->Ttypeof(fi)|Tclass(i)->Tclass(fi)|Tthis(i)->Tthis(fi)|Tnew(i)->Tnew(fi)|Tdelete(i)->Tdelete(fi)|Ttemplate(i)->Ttemplate(fi)|Ttypeid(i)->Ttypeid(fi)|Ttypename(i)->Ttypename(fi)|Tcatch(i)->Tcatch(fi)|Ttry(i)->Ttry(fi)|Tthrow(i)->Tthrow(fi)|Toperator(i)->Toperator(fi)|Tpublic(i)->Tpublic(fi)|Tprivate(i)->Tprivate(fi)|Tprotected(i)->Tprotected(fi)|Tfriend(i)->Tfriend(fi)|Tvirtual(i)->Tvirtual(fi)|Tnamespace(i)->Tnamespace(fi)|Tusing(i)->Tusing(fi)|Tbool(i)->Tbool(fi)|Ttrue(i)->Ttrue(fi)|Tfalse(i)->Tfalse(fi)|Twchar_t(i)->Twchar_t(fi)|Tconst_cast(i)->Tconst_cast(fi)|Tdynamic_cast(i)->Tdynamic_cast(fi)|Tstatic_cast(i)->Tstatic_cast(fi)|Treinterpret_cast(i)->Treinterpret_cast(fi)|Texplicit(i)->Texplicit(fi)|Tmutable(i)->Tmutable(fi)|Texport(i)->Texport(fi)|TColCol(i)->TColCol(fi)|TColCol_BeforeTypedef(i)->TColCol_BeforeTypedef(fi)|TPtrOpStar(i)->TPtrOpStar(fi)|TDotStar(i)->TDotStar(fi)|TIdent_ClassnameInQualifier(s,i)->TIdent_ClassnameInQualifier(s,fi)|TIdent_ClassnameInQualifier_BeforeTypedef(s,i)->TIdent_ClassnameInQualifier_BeforeTypedef(s,fi)|TIdent_Templatename(s,i)->TIdent_Templatename(s,fi)|TIdent_Constructor(s,i)->TIdent_Constructor(s,fi)|TIdent_TypedefConstr(s,i)->TIdent_TypedefConstr(s,fi)|TIdent_TemplatenameInQualifier(s,i)->TIdent_TemplatenameInQualifier(s,fi)|TIdent_TemplatenameInQualifier_BeforeTypedef(s,i)->TIdent_TemplatenameInQualifier_BeforeTypedef(s,fi)|TInf_Template(i)->TInf_Template(fi)|TSup_Template(i)->TSup_Template(fi)|TOCro_new(i)->TOCro_new(fi)|TCCro_new(i)->TCCro_new(fi)|TInt_ZeroVirtual(i)->TInt_ZeroVirtual(fi)|Tchar_Constr(i)->Tchar_Constr(fi)|Tint_Constr(i)->Tint_Constr(fi)|Tfloat_Constr(i)->Tfloat_Constr(fi)|Tdouble_Constr(i)->Tdouble_Constr(fi)|Twchar_t_Constr(i)->Twchar_t_Constr(fi)|Tshort_Constr(i)->Tshort_Constr(fi)|Tlong_Constr(i)->Tlong_Constr(fi)|Tbool_Constr(i)->Tbool_Constr(fi)|Tsigned_Constr(i)->Tsigned_Constr(fi)|Tunsigned_Constr(i)->Tunsigned_Constr(fi)|EOF(i)->EOF(fi)(*****************************************************************************)(* Accessors *)(*****************************************************************************)letline_of_toktok=letinfo=info_of_toktokinPI.line_of_infoinfo