123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358(*
Copyright 2013-2018 RIKEN
Copyright 2018-2025 Chiba Institude of Technology
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.
*)(* Author: Masatomo Hashimoto <m.hashimoto@stair.center> *)(* lib.ml *)[%%prepare_logger]moduleStorage=Diffast_misc.StoragemoduleAstloc=Langs_common.AstlocmoduleParserlib_base=Langs_common.Parserlib_basemoduleLoc=AstlocmoduleAux=Parser_auxmodulePB=Parserlib_basemoduleSF=Common.SourceFormmoduleC=Contextletmkparser=PB.mkparserletpredefined_macrotbl=letopenTokens_inletmkconstid=PP_MACRO_CONSTidinletmknameid=PP_MACRO_NAME(id,"")inletmkexprid=PP_MACRO_EXPRidinletmkstmtid=PP_MACRO_STMTidinletmktypespecid=PP_MACRO_TYPE_SPECidinlettbl=newMacro.table"predefined"inletlist=["__FXXP_CONST__",[],Macro.mk_linemkconst;"__FXXP_NAME__",[],Macro.mk_linemkname;"__FXXP_EXPR__",[],Macro.mk_linemkexpr;"__FXXP_STMT__",[],Macro.mk_linemkstmt;"__FXXP_TYPE_SPEC__",[],Macro.mk_linemktypespec;"__FILE__",[],Macro.mk_linemkconst;"__LINE__",[],Macro.mk_linemkconst;"__DATE__",[],Macro.mk_linemkconst;"__TIME__",[],Macro.mk_linemkconst;]inList.iter(fun(id,args,mk_line)->letbody=matchargswith|[]->Macro.Object(mk_lineid)|_->Macro.Function(args,mk_lineid)intbl#defineidbody)list;tbl[%%capture_pathclassparser_c=object(self)inherit[Source.c,Tokens_.token,Ast.c]PB.c(newAux.env)valmutableparse_d_lines_flag=falsevalmutablemax_line_length=Nonevalmutablecontext_stack=Obj.magic()valmutablebegin_program_scope=fun()->()valmutablebegin_main_program_scope=fun_->()valmutableend_scope=fun()->()valmutableparser_partial_program=fun_->Obj.magic()valmutableparser_partial_program_unit=fun_->Obj.magic()valmutableparser_partial_spec__exec=fun_->Obj.magic()valmutableparser_partial_specification_part=fun_->Obj.magic()valmutableparser_partial_execution_part=fun_->Obj.magic()valmutableparser_partial_subprograms=fun_->Obj.magic()valmutableparser_partial_interface_spec=fun_->Obj.magic()valmutableparser_partial_case_block=fun_->Obj.magic()valmutableparser_partial_assignment_stmt=fun_->Obj.magic()valmutableparser_partial_type_declaration_stmt=fun_->Obj.magic()valmutableparser_partial_function_stmt=fun_->Obj.magic()valmutableparser_partial_variable=fun_->Obj.magic()valmutableparser_partial_expr=fun_->Obj.magic()valmutableparser_partial_stmts=fun_->Obj.magic()valmutableparser_partial_data_stmt_sets=fun_->Obj.magic()valmutableparser_partial_type_spec=fun_->Obj.magic()valmutableparser_partial_action_stmt=fun_->Obj.magic()valmutableparser_partial_derived_type_def_part=fun_->Obj.magic()valmutableparser_partial_onlys=fun_->Obj.magic()valmutableparser_partial_type_bound_proc_part=fun_->Obj.magic()valmutableparser_partial_function_head=fun_->Obj.magic()valmutableparser_partial_function_stmt_head=fun_->Obj.magic()valmutableparser_partial_subroutine_head=fun_->Obj.magic()valmutableparser_partial_subroutine_stmt_head=fun_->Obj.magic()valmutableparser_partial_pu_tail=fun_->Obj.magic()valmutableparser_main=fun_->Ast.dummy_nodevalmutableparse_error=fun___->Common.fail_to_parse""valmutablescanner=Obj.magic()valmutable_parse=fun()->Obj.magic()method_parse=_parse()method!parse_filefile=self#parser_init;letsrc=self#make_sourcefileinlet_=env#enter_sourcesrcinenv#set_base_filesrc#path;letast=_parse()inenv#exit_source;astmethodset_ignore_case_flag=env#set_ignore_case_flagmethodclear_ignore_case_flag=env#clear_ignore_case_flagmethodset_ignore_include_flag=env#set_ignore_include_flagmethodclear_ignore_include_flag=env#clear_ignore_include_flagmethodmacrotbl=env#macrotblmethodset_predefined_macrotbltbl=env#set_predefined_macrotbltblmethod_set_parse_d_lines_flagb=parse_d_lines_flag<-bmethodset_parse_d_lines_flag=parse_d_lines_flag<-truemethodclear_parse_d_lines_flag=parse_d_lines_flag<-falsemethodset_max_line_lengthn=max_line_length<-Somenmethodclear_max_line_length=max_line_length<-Nonemethod_make_sourcesrc=letconfig=src#lang_configinconfig#_set_parse_d_lines_flagparse_d_lines_flag;beginmatchmax_line_lengthwith|Somen->config#set_max_line_lengthn|_->()end;srcmethodmake_sourcefile=self#_make_source(newSource.cfile)methodmake_source_stdin=self#_make_source(newSource.cStorage.stdin)methoddump_ignored_regions=env#ignored_regions#dumpmethodignored_LOC=env#ignored_regions#get_LOCmethoddump_missed_regions=env#missed_regions#dumpmethodmissed_LOC=env#missed_regions#get_LOCmethodpartial_parser_selectorc=matchC.get_tagcwith|C.Tunknown->[%debug_log"unknown context"];raiseNot_found|C.Ttoplevel->[parser_partial_program]|C.Tprogram_unit->[parser_partial_program_unit;parser_partial_spec__exec]|C.Tspec__exec->[parser_partial_spec__exec;parser_partial_type_spec;parser_partial_stmts;parser_partial_pu_tail;parser_partial_function_stmt_head;parser_partial_subroutine_stmt_head;parser_partial_function_head;parser_partial_subroutine_head;parser_partial_program]|C.Tspecification_part->[parser_partial_specification_part;parser_partial_stmts]|C.Texecution_part->[parser_partial_execution_part;parser_partial_stmts]|C.Tsubprograms->[parser_partial_subprograms;parser_partial_function_stmt_head;parser_partial_subroutine_stmt_head;parser_partial_function_head;parser_partial_subroutine_head]|C.Tinterface_spec->[parser_partial_interface_spec]|C.Tcase_block->[parser_partial_case_block]|C.Tassignment_stmt->[parser_partial_assignment_stmt]|C.Ttype_declaration_stmt->[parser_partial_type_declaration_stmt]|C.Tfunction_stmt->[parser_partial_function_stmt]|C.Tvariable->[parser_partial_variable]|C.Texpr->[parser_partial_expr]|C.Tstmts->[parser_partial_stmts]|C.Tdata_stmt_sets->[parser_partial_data_stmt_sets]|C.Ttype_spec->[parser_partial_type_spec]|C.Taction_stmt->[parser_partial_action_stmt]|C.Tderived_type_def_part->[parser_partial_derived_type_def_part]|C.Tonlys->[parser_partial_onlys]|C.Ttype_bound_proc_part->[parser_partial_type_bound_proc_part]|C.Tfunction_head->[parser_partial_function_head]|C.Tfunction_stmt_head->[parser_partial_function_stmt_head]|C.Tsubroutine_head->[parser_partial_subroutine_head]|C.Tsubroutine_stmt_head->[parser_partial_subroutine_stmt_head]|C.Tpu_tail->[parser_partial_pu_tail]|C.Tin_stmt->[](*[parser_partial_variable;parser_partial_expr]*)(*
| t ->
[%debug_log "parser for %s not found" (C.tag_to_string t)];
raise Not_found
*)method!parser_init=[%debug_log"called"];begin_program_scope();context_stack#reset;(* for head-less main_program *)begin_main_program_scope();context_stack#push(C.spec__exec());lettopkey=C.mktopkey0incontext_stack#checkpointtopkey;env#checkpointtopkeymethodprivate__parse()=tryletroot=parser_mainscanner#get_tokeninletast=newAst.crootinletelab=newElaborate.cinelab#elaborate_astast;scanner#set_ignored_regions;ast#set_lines_read(env#lines_read+env#current_pos_mgr#lines_read);ast#set_comment_regionsenv#comment_regions#get_offsets;ast#set_comment_LOCenv#comment_regions#get_LOC;ast#set_missed_regions(env#missed_regions#get_offsets);ast#set_missed_LOC(env#missed_regions#get_LOC);ast#set_ignored_regions(env#ignored_regions#get_offsets);ast#set_ignored_LOC(env#ignored_regions#get_LOC);astwith|Common.Parse_error(_head,msg)->lethead=if_head=""thenletloc=scanner#last_locinLoc.end_to_string~prefix:"["~suffix:"]"locelse_headinCommon.fail_to_parse~headmsg|Parsing.Parse_error->letloc=scanner#last_locinCommon.fail_to_parse~head:(Loc.end_to_string~prefix:"["~suffix:"]"loc)"syntax error"initializercontext_stack<-newC.stackenv;env#set_last_lex_qtoken_obj(Obj.repr(Tokens_.EOFNone,Loc.dummy));letmoduleS=structletenv=envletcontext_stack=context_stackendinletmoduleA=Aux.F(S)inletmoduleP=Parser.Make(S)inletmoduleScan=Scanner.F(S)inbegin_program_scope<-A.begin_program_scope;begin_main_program_scope<-A.begin_headless_main_program_scope;end_scope<-A.end_scope;scanner<-newScan.cenvself#partial_parser_selector;parser_partial_program<-mkparserP.partial_program;parser_partial_program_unit<-mkparserP.partial_program_unit;parser_partial_spec__exec<-mkparserP.partial_spec__exec;parser_partial_specification_part<-mkparserP.partial_specification_part;parser_partial_execution_part<-mkparserP.partial_execution_part;parser_partial_subprograms<-mkparserP.partial_subprograms;parser_partial_interface_spec<-mkparserP.partial_interface_spec;parser_partial_case_block<-mkparserP.partial_case_block;parser_partial_assignment_stmt<-mkparserP.partial_assignment_stmt;parser_partial_type_declaration_stmt<-mkparserP.partial_type_declaration_stmt;parser_partial_function_stmt<-mkparserP.partial_function_stmt;parser_partial_variable<-mkparserP.partial_variable;parser_partial_expr<-mkparserP.partial_expr;parser_partial_stmts<-mkparserP.partial_stmts;parser_partial_data_stmt_sets<-mkparserP.partial_data_stmt_sets;parser_partial_type_spec<-mkparserP.partial_type_spec;parser_partial_action_stmt<-mkparserP.partial_action_stmt;parser_partial_derived_type_def_part<-mkparserP.partial_derived_type_def_part;parser_partial_onlys<-mkparserP.partial_onlys;parser_partial_type_bound_proc_part<-mkparserP.partial_type_bound_proc_part;parser_partial_function_head<-mkparserP.partial_function_head;parser_partial_function_stmt_head<-mkparserP.partial_function_stmt_head;parser_partial_subroutine_head<-mkparserP.partial_subroutine_head;parser_partial_subroutine_stmt_head<-mkparserP.partial_subroutine_stmt_head;parser_partial_pu_tail<-mkparserP.partial_pu_tail;parser_main<-mkparserP.main;parse_error<-A.parse_error;_parse<-(fun()->tryself#__parse()with|P.Error->letl,c=env#current_pos_mgr#get_current_positioninCommon.fail_to_parse~head:(Printf.sprintf"[%s:%d:%d]"env#current_filenamelc)"syntax error");self#set_predefined_macrotbl(Somepredefined_macrotbl)end(* of Lib.parser_c *)]