1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889(****************************************************************************)(* *)(* This file is part of MOPSA, a Modular Open Platform for Static Analysis. *)(* *)(* Copyright (C) 2017-2019 The MOPSA Project. *)(* *)(* This program is free software: you can redistribute it and/or modify *)(* it under the terms of the GNU Lesser General Public License as published *)(* by the Free Software Foundation, either version 3 of the License, or *)(* (at your option) any later version. *)(* *)(* This program is distributed in the hope that it will be useful, *)(* but WITHOUT ANY WARRANTY; without even the implied warranty of *)(* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *)(* GNU Lesser General Public License for more details. *)(* *)(* You should have received a copy of the GNU Lesser General Public License *)(* along with this program. If not, see <http://www.gnu.org/licenses/>. *)(* *)(****************************************************************************)(** Visitor of configuration files *)openMopsa_utilsopenYojson.BasicopenYojson.Basic.Utiltype'avisitor={leaf:stringoption->string->'a;switch:stringoption->Yojson.Basic.tlist->'a;compose:stringoption->Yojson.Basic.tlist->'a;union:stringoption->Yojson.Basic.tlist->'a;apply:stringoption->Yojson.Basic.t->Yojson.Basic.t->'a;nonrel:stringoption->Yojson.Basic.t->'a;product:stringoption->Yojson.Basic.tlist->stringlist->'a;}letget_semanticobj=List.assoc_opt"semantic"obj|>OptionExt.liftto_stringletvisit_leafvisitors=visitor.leafNonesletvisit_domainvisitorobj=letd=List.assoc"domain"obj|>to_stringinvisitor.leaf(get_semanticobj)dletvisit_seqvisitorobj=letl=List.assoc"seq"obj|>to_listinvisitor.switch(get_semanticobj)lletvisit_switchvisitorobj=letl=List.assoc"switch"obj|>to_listinvisitor.switch(get_semanticobj)lletvisit_composevisitorobj=letl=List.assoc"compose"obj|>to_listinvisitor.compose(get_semanticobj)lletvisit_applyvisitorobj=letf=List.assoc"apply"objinletd=List.assoc"on"objinvisitor.apply(get_semanticobj)fdletvisit_nonrelvisitorobj=letv=List.assoc"nonrel"objinvisitor.nonrel(get_semanticobj)vletvisit_unionvisitorobj=letl=List.assoc"union"obj|>to_listinvisitor.union(get_semanticobj)lletvisit_productvisitorobj=letl=List.assoc"product"obj|>to_listinletr=tryList.assoc"reductions"obj|>to_list|>List.mapto_stringwithNot_found->[]invisitor.product(get_semanticobj)lrletrecvisitvisitorjson=matchjsonwith|`Strings->visit_leafvisitors|`AssocobjwhenList.mem_assoc"domain"obj->visit_domainvisitorobj|`AssocobjwhenList.mem_assoc"switch"obj->visit_switchvisitorobj|`AssocobjwhenList.mem_assoc"compose"obj->visit_composevisitorobj|`AssocobjwhenList.mem_assoc"apply"obj->visit_applyvisitorobj|`AssocobjwhenList.mem_assoc"nonrel"obj->visit_nonrelvisitorobj|`AssocobjwhenList.mem_assoc"product"obj->visit_productvisitorobj|`AssocobjwhenList.mem_assoc"union"obj->visit_unionvisitorobj|_->Exceptions.panic"parsing error: configuration not supported@ %a"(pretty_print~std:true)json