Legend:
Page
Library
Module
Module type
Parameter
Class
Class type
Source
Source file parser_aux.ml
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606(*
Copyright 2012-2025 Codinuum Software Lab <https://codinuum.com>
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
*)(* parser_aux.ml *)[%%prepare_logger]moduleFname=Langs_common.FnamemoduleEnv_base=Langs_common.Env_baseopenPrintfopenCommonopenAstmoduleL=Labeltypevartype=VTdefault|VTtypetypememtbl=(identifier,identifier_attribute)Hashtbl.tandidentifier_attribute=|IAclassofmemtblref|IAcovergroup|IApackage|IAtype|IAproperty|IAclocking|IAextern_method|IAinterfaceletiattr_to_str=function|IAclass_->"IAclass"|IAcovergroup->"IAcovergroup"|IApackage->"IApackage"|IAtype->"IAtype"|IAproperty->"IAproperty"|IAclocking->"IAclocking"|IAextern_method->"IAextern_method"|IAinterface->"IAinterface"exceptionAttrs_foundofidentifier_attributelisttypescope_attribute=|SApackageofidentifier|SAclassofidentifier|SAfunctionofidentifier|SAotherletsattr_to_str=function|SApackageid->"SApackage:"^id|SAclassid->"SAclass:"^id|SAfunctionid->"SAfunction:"^id|SAother->"SAother"typeframe={f_attr:scope_attribute;f_tbl:(identifier,identifier_attribute)Hashtbl.t;}letcreate_framesattr={f_attr=sattr;f_tbl=Hashtbl.create0;}letcopy_framefrm={f_attr=frm.f_attr;f_tbl=Hashtbl.copyfrm.f_tbl;}letdummy_tbl=Hashtbl.create0letbuiltin_packages=["std",["semaphore",IAclass(ref(Hashtbl.create0));"mailbox",IAclass(ref(Hashtbl.create0));"process",IAclass(ref(Hashtbl.create0));]]letbase_symbol_tbl=Hashtbl.create0let_=List.iter(fun(pkg,pmems)->letfrm=create_frame(SApackagepkg)inList.iter(fun(id,attr)->Hashtbl.addfrm.f_tblidattr)pmems;Hashtbl.addbase_symbol_tblpkgfrm)builtin_packagesexceptionFrame_foundofframetypestate={s_symbol_tbl:(identifier,frame)Hashtbl.t;s_stack:frameStack.t;s_scoped_flag:bool;s_pvstate:int;s_vartype:vartype;s_in_table:bool;}letmkstatestblstackscopvsvtin_t={s_symbol_tbl=stbl;s_stack=stack;s_scoped_flag=sco;s_pvstate=pvs;s_vartype=vt;s_in_table=in_t;}lettop_key=Loc.dummy[%%capture_pathclassenv=object(self)inherit[Source.c]Env_base.cassupervalmutableignore_include_flag=falsevalmutablecontext_enter_flag=falsevalmutablecontext_activate_flag=falsevalmutablelast_active_ofss=(0,0)valmutablepartial_parsing_flag=falsevalfname_ext_cache=(Hashtbl.create0:Fname.ext_cache_t)methodfname_ext_cache=fname_ext_cache(* put in saved states *)valmutablesymbol_tbl=Hashtbl.create0valmutablestack=Stack.create()valmutablescoped_flag=falsevalmutablepvstate=0valmutablevartype=VTdefaultvalmutablein_table=falsevalcheckpoint_tbl=Hashtbl.create0(* Loc.t -> state *)(*val mutable macrotbl = None*)valloc_stack=newLayeredloc.loc_stack(* methods *)valmutablecurrent_loc_layers=[]valmutableprev_loc_layers=[]valmutablecurrent_loc_layers_encoded=""methodcurrent_loc_layers=current_loc_layersmethodcurrent_loc_layers_encoded=current_loc_layers_encodedmethodloc_stack_level=loc_stack#get_levelmethodpush_locloc=[%debug_log"pushing [%s]"(Astloc.to_string~short:trueloc)];letloc=ifFname.is_extendedloc.Astloc.filenamethenLoc.get_strippedlocelselocin[%debug_log"loc stack: %s"loc_stack#to_string];loc_stack#pushloc;prev_loc_layers<-current_loc_layers;current_loc_layers<-loc_stack#get_layers;current_loc_layers_encoded<-Layeredloc.encode_layerscurrent_loc_layersmethodpop_loc=loc_stack#pop;prev_loc_layers<-current_loc_layers;current_loc_layers<-loc_stack#get_layers;current_loc_layers_encoded<-Layeredloc.encode_layerscurrent_loc_layersmethodmkllocloc=Layeredloc.of_loclocvalmutablepredefined_macrotbl=(None:Macro.tableoption)methodset_predefined_macrotbltbl=predefined_macrotbl<-tblvalmacrotbl=newMacro.table"main"methodmacrotbl=macrotblmethoddefine_macro?(conditional=false)idbody=[%debug_log"id=%s conditional=%B"idconditional];macrotbl#define~conditional("`"^id)bodymethodundefine_macroid=[%debug_log"%s"id];macrotbl#undefine("`"^id)methodfind_macroid=trymacrotbl#findidwithNot_found->matchpredefined_macrotblwith|Sometbl->tbl#findid|None->raiseNot_foundmethodmacro_definedid=trylet_=self#find_macroidintruewithNot_found->falsevallex_macrotbl=newMacro.table"lex"methodlex_macrotbl=lex_macrotblmethodlex_define_macroidbody=[%debug_log"%s"id];lex_macrotbl#define("`"^id)bodymethodlex_undefine_macroid=[%debug_log"%s"id];lex_macrotbl#undefine("`"^id)methodlex_find_macroid=trylex_macrotbl#findidwithNot_found->matchpredefined_macrotblwith|Sometbl->tbl#findid|None->raiseNot_foundmethodignore_include_flag=ignore_include_flagmethodset_ignore_include_flag=ignore_include_flag<-truemethodclear_ignore_include_flag=ignore_include_flag<-falsemethodcontext_enter_flag=context_enter_flagmethodset_context_enter_flag=context_enter_flag<-truemethodclear_context_enter_flag=context_enter_flag<-falsemethodcontext_activate_flag=context_activate_flagmethodset_context_activate_flag=context_activate_flag<-truemethodclear_context_activate_flag=context_activate_flag<-falsemethodset_partial_parsing_flag=partial_parsing_flag<-truemethodclear_partial_parsing_flag=partial_parsing_flag<-falsemethodpartial_parsing_flag=partial_parsing_flagmethodget_last_active_ofss=last_active_ofssmethodset_last_active_ofss(st,ed)=[%debug_log"%d - %d"sted];last_active_ofss<-(st,ed)methodcheckpoint(key:Loc.t)=[%debug_log"key=%s"(Loc.to_stringkey)];letstat=mkstate(Hashtbl.copysymbol_tbl)(self#_copy_stackstack)scoped_flagpvstatevartypein_tablein(*
if Hashtbl.mem checkpoint_tbl key then
[%warn_log "already checkpointed: key=%s" (Loc.to_string key)];
*)Hashtbl.replacecheckpoint_tblkeystat;methodrecover?(remove=false)key=[%debug_log"key=%s"(Loc.to_stringkey)];tryletstat=Hashtbl.findcheckpoint_tblkeyinsymbol_tbl<-Hashtbl.copystat.s_symbol_tbl;stack<-self#_copy_stackstat.s_stack;scoped_flag<-stat.s_scoped_flag;pvstate<-stat.s_pvstate;vartype<-stat.s_vartype;in_table<-stat.s_in_table;ifremovethenHashtbl.removecheckpoint_tblkeywithNot_found->[%fatal_log"state not found: key=%s"(Loc.to_stringkey)];exit1methodscoped_flag=scoped_flagmethodset_scoped_flag=scoped_flag<-truemethodclear_scoped_flag=scoped_flag<-falsemethodpvstate=pvstatemethodset_pvstatei=pvstate<-imethodvartype=vartypemethodset_vartype_type=vartype<-VTtypemethodreset_vartype=vartype<-VTdefaultmethodin_table=in_tablemethodbegin_table=in_table<-truemethodend_table=in_table<-falsemethodfind_symbolid=tryHashtbl.findsymbol_tblidwithNot_found->Hashtbl.findbase_symbol_tblidmethodcurrent_frame=tryStack.topstackwithStack.Empty->raise(Internal_error"Parser_aux.get_current_frame: stack empty")methodprivate_copy_stacks=letcopy=Stack.create()inletfs=ref[]inStack.iter(funf->fs:=(copy_framef)::!fs)s;List.iter(funf->Stack.pushfcopy)!fs;copymethodregister_identifier(id:string)attr=[%debug_log"REG(%d): \"%s\" -> %s"(Stack.lengthstack)id(iattr_to_strattr)];Hashtbl.add(self#current_frame).f_tblidattrmethodlookup_identifier?(afilt=(fun_->true))(id:string)=begin%debug_block[%debug_log"LKUP(%d): \"%s\""(Stack.lengthstack)id];Stack.iter(funframe->[%debug_log"FRM: <%s>[%s]"(sattr_to_strframe.f_attr)(Hashtbl.fold(funid_s->id^";"^s)frame.f_tbl"")];)stack;end;tryStack.iter(funframe->tryletattrs=Hashtbl.find_allframe.f_tblidinletfiltered=List.filterafiltattrsiniffiltered<>[]thenraise(Attrs_foundfiltered)withNot_found->())stack;raiseNot_foundwithAttrs_foundattrs->ifattrs=[]thenraiseNot_foundelseattrsmethod_begin_scopesattr=[%debug_log"PUSH(%d): FRM: <%s>"(Stack.lengthstack)(sattr_to_strsattr)];Stack.push(create_framesattr)stackmethodend_scope=tryletfrm=(Stack.popstack)in[%debug_log"POP(%d): FRM: <%s>"(Stack.lengthstack)(sattr_to_strfrm.f_attr)];matchfrm.f_attrwith|SApackageid->Hashtbl.addsymbol_tblidfrm|SAclassid->begintryleta=self#lookup_identifieridinmatchawith|(IAclasstblr)::_->tblr:=frm.f_tbl|_->assertfalsewithNot_found->assertfalse(* toplevel *)end|_->()withStack.Empty->raise(Internal_error"Parser_aux.end_scope: stack empty")methodimport_onepkgid=[%debug_log"IMPORT: %s::%s"pkgid];tryletfrm=self#find_symbolpkgintryself#register_identifierid(Hashtbl.findfrm.f_tblid)withNot_found->[%warn_log"id \"%s\" not found in package \"%s\""idpkg]withNot_found->[%warn_log"package \"%s\" not found"pkg]method_import_anytbl=Hashtbl.iter(funidattr->self#register_identifieridattr)tblmethodimport_anypkg=[%debug_log"IMPORT_ANY: %s"pkg];tryletfrm=self#find_symbolpkginself#_import_anyfrm.f_tblwithNot_found->[%warn_log"package \"%s\" not found"pkg]methodfind_frame_forid=tryStack.iter(funframe->tryifHashtbl.memframe.f_tblidthenraise(Frame_foundframe)withNot_found->())stack;raiseNot_foundwithFrame_foundfrm->frmmethod!init=super#init;Hashtbl.clearsymbol_tbl;Stack.clearstack;Hashtbl.clearfname_ext_cache;scoped_flag<-false;in_table<-false;context_enter_flag<-false;context_activate_flag<-false;last_active_ofss<-(0,0);partial_parsing_flag<-false;end(* of class env *)]moduletypeSTATE_T=sigvalenv:envvalcontext_stack:Context.stackend[%%capture_pathmoduleF(Stat:STATE_T)=structopenStatletlexing_pos_start=Langs_common.Position.lexing_pos_startletlexing_pos_end=Langs_common.Position.lexing_pos_endletparse_warning=PB.parse_warningletparse_errorsposepos:('a,unit,string,'b)format4->'a=PB.parse_errorenv(funloc->newAst.node~lloc:(env#mkllocloc)L.Error)sposeposletparse_error_locloc:('a,unit,string,'b)format4->'a=PB.parse_error_locenv(funloc->newAst.node~lloc:(env#mkllocloc)L.Error)locletparse_failure_loclocmsg=lethead=sprintf"[%s]"(Loc.to_stringloc)infail_to_parse~headmsgletget_loc_for_lexlexbuf=letstart_pos=lexing_pos_startlexbufinletend_pos=lexing_pos_endlexbufinletloc=Loc.of_lexpossstart_posend_posinlocletcheck_errornode=ifnotenv#partial_parsing_flagthenbeginAst.visit(funnd->ifL.is_errornd#labelthenenv#missed_regions#addnd#loc)nodeendletlloc_of_posspos0pos1=letloc=Loc.of_lexposspos0pos1inletlayers=env#current_loc_layersinnewLayeredloc.c~layerslocletmake_error_nodestart_posend_pos=begin%debug_block[%debug_log"start_offset=%d, end_offset=%d"start_pos.Lexing.pos_cnumend_pos.Lexing.pos_cnum];letst,ed=env#get_last_active_ofssin[%debug_log"last_active_ofss: %d - %d"sted]end;letlloc=lloc_of_possstart_posend_posinifnotenv#partial_parsing_flag&&lloc#get_level=0thenenv#missed_regions#addlloc#get_loc;newnode~llocL.Errorletregister_vartypeident=matchenv#vartypewith|VTtype->env#register_identifieridentIAtype|_->()letregister_classident=env#register_identifierident(IAclass(refdummy_tbl))letregister_typeident=env#register_identifieridentIAtypeletregister_packageident=env#register_identifieridentIApackageletregister_propertyident=env#register_identifieridentIApropertyletregister_covergroupident=env#register_identifieridentIAcovergroupletregister_clockingident=env#register_identifieridentIAclockingletregister_extern_methodident=env#register_identifieridentIAextern_methodletregister_interfaceident=env#register_identifieridentIAinterfaceletbegin_package_scopeid=env#_begin_scope(SApackageid)letbegin_class_scopeid=env#_begin_scope(SAclassid)letbegin_function_scopeid=env#_begin_scope(SAfunctionid)letbegin_scope()=env#_begin_scopeSAotherletend_scope()=env#end_scopeletimport_onepkgid=env#import_onepkgidletimport_anypkg=env#import_anypkgletlookup_identifierid=env#lookup_identifieridletset_vartype_type()=env#set_vartype_typeletreset_vartype()=env#reset_vartypeletimport_pkg_cls_scope(pkg_opt,cty_list)=[%debug_log"pkg=%s, cty_list=[%s]"(matchpkg_optwithNone->"<none>"|Someid->id)(String.concat";"cty_list)];ifcty_list=[]then()elsebeginletget_tblini_tbl=List.fold_left(funtblcty->leta=Hashtbl.findtblctyinmatchawith|IAclasstblr->!tblr|_->assertfalse)ini_tblcty_listinletfrm=matchpkg_optwith|Somepkg->env#find_symbolpkg|None->matchcty_listwith|cty::_->env#find_frame_forcty|_->assertfalseinlettbl=get_tblfrm.f_tblinenv#_import_anytblendletnode_to_locnd=nd#lloc#to_loc?cache:(Some(Someenv#fname_ext_cache))()letnode_to_lexpossnd=Loc.to_lexposs(node_to_locnd)end(* of functor Parser_aux.F *)]