LCOV - code coverage report
Current view: top level - modal_formula/include/mcrl2/modal_formula - parse_impl.h (source / functions) Hit Total Coverage
Test: mcrl2_coverage.info.cleaned Lines: 93 104 89.4 %
Date: 2024-04-19 03:43:27 Functions: 16 16 100.0 %
Legend: Lines: hit not hit

          Line data    Source code
       1             : // Author(s): Wieger Wesselink
       2             : // Copyright: see the accompanying file COPYING or copy at
       3             : // https://github.com/mCRL2org/mCRL2/blob/master/COPYING
       4             : //
       5             : // Distributed under the Boost Software License, Version 1.0.
       6             : // (See accompanying file LICENSE_1_0.txt or copy at
       7             : // http://www.boost.org/LICENSE_1_0.txt)
       8             : //
       9             : /// \file mcrl2/modal_formula/parse_impl.h
      10             : /// \brief add your file description here.
      11             : 
      12             : #ifndef MCRL2_MODAL_FORMULA_PARSE_IMPL_H
      13             : #define MCRL2_MODAL_FORMULA_PARSE_IMPL_H
      14             : 
      15             : #include "mcrl2/lps/parse.h"
      16             : #include "mcrl2/lps/parse_impl.h"
      17             : #include "mcrl2/modal_formula/typecheck.h"
      18             : 
      19             : namespace mcrl2
      20             : {
      21             : 
      22             : namespace action_formulas
      23             : {
      24             : 
      25             : namespace detail
      26             : {
      27             : 
      28             : struct action_formula_actions: public lps::detail::multi_action_actions
      29             : {
      30         179 :   explicit action_formula_actions(const core::parser& parser_)
      31         179 :     : lps::detail::multi_action_actions(parser_)
      32         179 :   {}
      33             : 
      34         297 :   action_formulas::action_formula parse_ActFrm(const core::parse_node& node) const
      35             :   {
      36         297 :     if ((node.child_count() == 1) && (symbol_name(node.child(0)) == "MultAct")) { return process::untyped_multi_action(parse_ActionList(node.child(0))); }
      37         118 :     else if ((node.child_count() == 1) && (symbol_name(node.child(0)) == "DataValExpr")) { return parse_DataValExpr(node.child(0)); }
      38         118 :     else if ((node.child_count() == 1) && (symbol_name(node.child(0)) == "DataExpr")) { return parse_DataExpr(node.child(0)); }
      39         118 :     else if ((node.child_count() == 1) && (symbol_name(node.child(0)) == "true")) { return action_formulas::true_(); }
      40          57 :     else if ((node.child_count() == 1) && (symbol_name(node.child(0)) == "false")) { return action_formulas::false_(); }
      41          55 :     else if ((node.child_count() == 2) && (symbol_name(node.child(0)) == "!") && (symbol_name(node.child(1)) == "ActFrm")) { return action_formulas::not_(parse_ActFrm(node.child(1))); }
      42          18 :     else if ((node.child_count() == 3) && (symbol_name(node.child(0)) == "ActFrm") && (node.child(1).string() == "=>") && (symbol_name(node.child(2)) == "ActFrm")) { return action_formulas::imp(parse_ActFrm(node.child(0)), parse_ActFrm(node.child(2))); }
      43          18 :     else if ((node.child_count() == 3) && (symbol_name(node.child(0)) == "ActFrm") && (node.child(1).string() == "&&") && (symbol_name(node.child(2)) == "ActFrm")) { return action_formulas::and_(parse_ActFrm(node.child(0)), parse_ActFrm(node.child(2))); }
      44           9 :     else if ((node.child_count() == 3) && (symbol_name(node.child(0)) == "ActFrm") && (node.child(1).string() == "||") && (symbol_name(node.child(2)) == "ActFrm")) { return action_formulas::or_(parse_ActFrm(node.child(0)), parse_ActFrm(node.child(2))); }
      45           6 :     else if ((node.child_count() == 4) && (symbol_name(node.child(0)) == "forall") && (symbol_name(node.child(1)) == "VarsDeclList") && (symbol_name(node.child(2)) == ".") && (symbol_name(node.child(3)) == "ActFrm")) { return action_formulas::forall(parse_VarsDeclList(node.child(1)), parse_ActFrm(node.child(3))); }
      46           3 :     else if ((node.child_count() == 4) && (symbol_name(node.child(0)) == "exists") && (symbol_name(node.child(1)) == "VarsDeclList") && (symbol_name(node.child(2)) == ".") && (symbol_name(node.child(3)) == "ActFrm")) { return action_formulas::exists(parse_VarsDeclList(node.child(1)), parse_ActFrm(node.child(3))); }
      47           1 :     else if ((node.child_count() == 3) && (symbol_name(node.child(0)) == "ActFrm") && (node.child(1).string() == "@") && (symbol_name(node.child(2)) == "DataExpr")) { return action_formulas::at(parse_ActFrm(node.child(0)), parse_DataExpr(node.child(2))); }
      48           2 :     else if ((node.child_count() == 3) && (symbol_name(node.child(0)) == "(") && (symbol_name(node.child(1)) == "ActFrm") && (symbol_name(node.child(2)) == ")")) { return parse_ActFrm(node.child(1)); }
      49           0 :     throw core::parse_node_unexpected_exception(m_parser, node);
      50             :   }
      51             : };
      52             : 
      53             : } // namespace detail
      54             : 
      55             : } // namespace action_formulas
      56             : 
      57             : namespace regular_formulas
      58             : {
      59             : 
      60             : namespace detail
      61             : {
      62             : 
      63             : struct regular_formula_actions: public action_formulas::detail::action_formula_actions
      64             : {
      65         179 :   explicit regular_formula_actions(const core::parser& parser_)
      66         179 :     : action_formulas::detail::action_formula_actions(parser_)
      67         179 :   {}
      68             : 
      69         268 :   regular_formulas::regular_formula parse_RegFrm(const core::parse_node& node) const
      70             :   {
      71         268 :     if ((node.child_count() == 1) && (symbol_name(node.child(0)) == "ActFrm")) { return parse_ActFrm(node.child(0)); }
      72          38 :     else if ((node.child_count() == 3) && (symbol_name(node.child(0)) == "(") && (symbol_name(node.child(1)) == "RegFrm") && (symbol_name(node.child(2)) == ")")) { return parse_RegFrm(node.child(1)); }
      73          38 :     else if ((node.child_count() == 2) && (symbol_name(node.child(0)) == "RegFrm") && (symbol_name(node.child(1)) == "*")) { return trans_or_nil(parse_RegFrm(node.child(0))); }
      74           5 :     else if ((node.child_count() == 2) && (symbol_name(node.child(0)) == "RegFrm") && (symbol_name(node.child(1)) == "+")) { return trans(parse_RegFrm(node.child(0))); }
      75           5 :     else if ((node.child_count() == 3) && (symbol_name(node.child(0)) == "RegFrm") && (node.child(1).string() == ".") && (symbol_name(node.child(2)) == "RegFrm")) { return untyped_regular_formula(core::identifier_string("."), parse_RegFrm(node.child(0)), parse_RegFrm(node.child(2))); }
      76           2 :     else if ((node.child_count() == 3) && (symbol_name(node.child(0)) == "RegFrm") && (node.child(1).string() == "+") && (symbol_name(node.child(2)) == "RegFrm")) { return untyped_regular_formula(core::identifier_string("+"), parse_RegFrm(node.child(0)), parse_RegFrm(node.child(2))); }
      77           0 :     throw core::parse_node_unexpected_exception(m_parser, node);
      78             :   }
      79             : };
      80             : 
      81             : } // namespace detail
      82             : 
      83             : } // namespace regular_formulas
      84             : 
      85             : namespace state_formulas
      86             : {
      87             : 
      88             : namespace detail
      89             : {
      90             : 
      91             : struct untyped_state_formula_specification: public data::untyped_data_specification
      92             : {
      93             :   process::action_label_list action_labels;
      94             :   state_formula formula;
      95             : 
      96           5 :   state_formula_specification construct_state_formula_specification()
      97             :   {
      98           5 :     state_formula_specification result;
      99           5 :     result.data() = construct_data_specification();
     100           5 :     result.action_labels() = action_labels;
     101           5 :     result.formula() = formula;
     102           5 :     return result;
     103           0 :   }
     104             : };
     105             : 
     106             : struct state_formula_actions: public regular_formulas::detail::regular_formula_actions
     107             : {
     108         179 :   explicit state_formula_actions(const core::parser& parser_)
     109         179 :     : regular_formulas::detail::regular_formula_actions(parser_)
     110         179 :   {}
     111             : 
     112           3 :   state_formula make_delay(const core::parse_node& node) const
     113             :   {
     114           3 :     if (node.child(0))
     115             :     {
     116           3 :       return delay_timed(parse_DataExpr(node.child(0).child(1)));
     117             :     }
     118             :     else
     119             :     {
     120           0 :       return delay();
     121             :     }
     122             :   }
     123             : 
     124           1 :   state_formula make_yaled(const core::parse_node& node) const
     125             :   {
     126           1 :     if (node.child(0))
     127             :     {
     128           1 :       return yaled_timed(parse_DataExpr(node.child(0).child(1)));
     129             :     }
     130             :     else
     131             :     {
     132           0 :       return yaled();
     133             :     }
     134             :   }
     135             : 
     136          15 :   data::assignment parse_StateVarAssignment(const core::parse_node& node) const
     137             :   {
     138          30 :     return data::assignment(data::variable(parse_Id(node.child(0)), parse_SortExpr(node.child(2))), parse_DataExpr(node.child(4)));
     139             :   }
     140             : 
     141         168 :   data::assignment_list parse_StateVarAssignmentList(const core::parse_node& node) const
     142             :   {
     143         183 :     return parse_list<data::assignment>(node, "StateVarAssignment", [&](const core::parse_node& node) { return parse_StateVarAssignment(node); });
     144             :   }
     145             : 
     146        1033 :   state_formulas::state_formula parse_StateFrm(const core::parse_node& node) const
     147             :   {
     148        1033 :     if ((node.child_count() == 1) && (symbol_name(node.child(0)) == "DataValExpr")) { return parse_DataValExpr(node.child(0)); }
     149        1007 :     else if ((node.child_count() == 1) && (symbol_name(node.child(0)) == "DataExpr")) { return parse_DataExpr(node.child(0)); }
     150        1007 :     else if ((node.child_count() == 1) && (symbol_name(node.child(0)) == "true")) { return state_formulas::true_(); }
     151         913 :     else if ((node.child_count() == 1) && (symbol_name(node.child(0)) == "false")) { return state_formulas::false_(); }
     152         875 :     else if ((node.child_count() == 2) && (symbol_name(node.child(0)) == "!") && (symbol_name(node.child(1)) == "StateFrm")) { return state_formulas::not_(parse_StateFrm(node.child(1))); }
     153         839 :     else if ((node.child_count() == 2) && (symbol_name(node.child(0)) == "-") && (symbol_name(node.child(1)) == "StateFrm")) { return state_formulas::minus(parse_StateFrm(node.child(1))); }
     154         839 :     else if ((node.child_count() == 3) && (symbol_name(node.child(0)) == "StateFrm") && (node.child(1).string() == "=>") && (symbol_name(node.child(2)) == "StateFrm")) { return state_formulas::imp(parse_StateFrm(node.child(0)), parse_StateFrm(node.child(2))); }
     155         815 :     else if ((node.child_count() == 3) && (symbol_name(node.child(0)) == "StateFrm") && (node.child(1).string() == "&&") && (symbol_name(node.child(2)) == "StateFrm")) { return state_formulas::and_(parse_StateFrm(node.child(0)), parse_StateFrm(node.child(2))); }
     156         739 :     else if ((node.child_count() == 3) && (symbol_name(node.child(0)) == "StateFrm") && (node.child(1).string() == "||") && (symbol_name(node.child(2)) == "StateFrm")) { return state_formulas::or_(parse_StateFrm(node.child(0)), parse_StateFrm(node.child(2))); }
     157         713 :     else if ((node.child_count() == 3) && (symbol_name(node.child(0)) == "StateFrm") && (node.child(1).string() == "+") && (symbol_name(node.child(2)) == "StateFrm")) { return state_formulas::plus(parse_StateFrm(node.child(0)), parse_StateFrm(node.child(2))); } 
     158         713 :     else if ((node.child_count() == 3) && (symbol_name(node.child(0)) == "DataValExpr") && (node.child(1).string() == "*") && (symbol_name(node.child(2)) == "StateFrm")) { return state_formulas::const_multiply(parse_DataValExpr(node.child(0)), parse_StateFrm(node.child(2))); }
     159         712 :     else if ((node.child_count() == 3) && (symbol_name(node.child(0)) == "StateFrm") && (node.child(1).string() == "*") && (symbol_name(node.child(2)) == "DataValExpr")) { return state_formulas::const_multiply_alt(parse_StateFrm(node.child(0)), parse_DataValExpr(node.child(2))); }
     160         711 :     else if ((node.child_count() == 4) && (symbol_name(node.child(0)) == "forall") && (symbol_name(node.child(1)) == "VarsDeclList") && (symbol_name(node.child(2)) == ".") && (symbol_name(node.child(3)) == "StateFrm")) { return state_formulas::forall(parse_VarsDeclList(node.child(1)), parse_StateFrm(node.child(3))); }
     161         692 :     else if ((node.child_count() == 4) && (symbol_name(node.child(0)) == "exists") && (symbol_name(node.child(1)) == "VarsDeclList") && (symbol_name(node.child(2)) == ".") && (symbol_name(node.child(3)) == "StateFrm")) { return state_formulas::exists(parse_VarsDeclList(node.child(1)), parse_StateFrm(node.child(3))); }
     162         684 :     else if ((node.child_count() == 4) && (symbol_name(node.child(0)) == "inf") && (symbol_name(node.child(1)) == "VarsDeclList") && (symbol_name(node.child(2)) == ".") && (symbol_name(node.child(3)) == "StateFrm")) { return state_formulas::infimum(parse_VarsDeclList(node.child(1)), parse_StateFrm(node.child(3))); }
     163         682 :     else if ((node.child_count() == 4) && (symbol_name(node.child(0)) == "sup") && (symbol_name(node.child(1)) == "VarsDeclList") && (symbol_name(node.child(2)) == ".") && (symbol_name(node.child(3)) == "StateFrm")) { return state_formulas::supremum(parse_VarsDeclList(node.child(1)), parse_StateFrm(node.child(3))); }
     164         681 :     else if ((node.child_count() == 4) && (symbol_name(node.child(0)) == "sum") && (symbol_name(node.child(1)) == "VarsDeclList") && (symbol_name(node.child(2)) == ".") && (symbol_name(node.child(3)) == "StateFrm")) { return state_formulas::sum(parse_VarsDeclList(node.child(1)), parse_StateFrm(node.child(3))); }
     165         680 :     else if ((node.child_count() == 4) && (symbol_name(node.child(0)) == "[") && (symbol_name(node.child(1)) == "RegFrm") && (symbol_name(node.child(2)) == "]") && (symbol_name(node.child(3)) == "StateFrm")) { return state_formulas::must(parse_RegFrm(node.child(1)), parse_StateFrm(node.child(3))); }
     166         543 :     else if ((node.child_count() == 4) && (symbol_name(node.child(0)) == "<") && (symbol_name(node.child(1)) == "RegFrm") && (symbol_name(node.child(2)) == ">") && (symbol_name(node.child(3)) == "StateFrm")) { return state_formulas::may(parse_RegFrm(node.child(1)), parse_StateFrm(node.child(3))); }
     167         455 :     else if ((node.child_count() == 4) && (symbol_name(node.child(0)) == "mu") && (symbol_name(node.child(1)) == "StateVarDecl") && (symbol_name(node.child(2)) == ".") && (symbol_name(node.child(3)) == "StateFrm")) { return state_formulas::mu(parse_Id(node.child(1).child(0)), parse_StateVarAssignmentList(node.child(1).child(1)), parse_StateFrm(node.child(3))); }
     168         355 :     else if ((node.child_count() == 4) && (symbol_name(node.child(0)) == "nu") && (symbol_name(node.child(1)) == "StateVarDecl") && (symbol_name(node.child(2)) == ".") && (symbol_name(node.child(3)) == "StateFrm")) { return state_formulas::nu(parse_Id(node.child(1).child(0)), parse_StateVarAssignmentList(node.child(1).child(1)), parse_StateFrm(node.child(3))); }
     169         287 :     else if ((node.child_count() == 2) && (symbol_name(node.child(0)) == "Id")) { return data::untyped_data_parameter(parse_Id(node.child(0)), parse_DataExprList(node.child(1))); }
     170         147 :     else if ((node.child_count() == 2) && (symbol_name(node.child(0)) == "delay")) { return make_delay(node.child(1)); }
     171         142 :     else if ((node.child_count() == 2) && (symbol_name(node.child(0)) == "yaled")) { return make_yaled(node.child(1)); }
     172         280 :     else if ((node.child_count() == 3) && (symbol_name(node.child(0)) == "(") && (symbol_name(node.child(1)) == "StateFrm") && (symbol_name(node.child(2)) == ")")) { return parse_StateFrm(node.child(1)); }
     173           0 :     throw core::parse_node_unexpected_exception(m_parser, node);
     174             :   }
     175             : 
     176           5 :   state_formula parse_FormSpec(const core::parse_node& node) const
     177             :   {
     178          10 :     return parse_StateFrm(node.child(1));
     179             :   }
     180             : 
     181          44 :   bool callback_StateFrmSpec(const core::parse_node& node, untyped_state_formula_specification& result) const
     182             :   {
     183          44 :     if (symbol_name(node) == "SortSpec")
     184             :     {
     185           4 :       return callback_DataSpecElement(node, result);
     186             :     }
     187          40 :     else if (symbol_name(node) == "ConsSpec")
     188             :     {
     189           4 :       return callback_DataSpecElement(node, result);
     190             :     }
     191          36 :     else if (symbol_name(node) == "MapSpec")
     192             :     {
     193           0 :       return callback_DataSpecElement(node, result);
     194             :     }
     195          36 :     else if (symbol_name(node) == "EqnSpec")
     196             :     {
     197           0 :       return callback_DataSpecElement(node, result);
     198             :     }
     199          36 :     else if (symbol_name(node) == "ActSpec")
     200             :     {
     201           4 :       result.action_labels = result.action_labels + parse_ActSpec(node);
     202           4 :       return true;
     203             :     }
     204          32 :     else if (symbol_name(node) == "FormSpec")
     205             :     {
     206           5 :       result.formula = parse_FormSpec(node);
     207           5 :       return true;
     208             :     }
     209          27 :     else if (symbol_name(node) == "StateFrm")
     210             :     {
     211           0 :       result.formula = parse_StateFrm(node);
     212           0 :       return true;
     213             :     }
     214          27 :     return false;
     215             :   }
     216             : 
     217           5 :   untyped_state_formula_specification parse_StateFrmSpec(const core::parse_node& node) const
     218             :   {
     219           5 :     untyped_state_formula_specification result;
     220          49 :     traverse(node, [&](const core::parse_node& node) { return callback_StateFrmSpec(node, result); });
     221           5 :     return result;
     222           0 :   }
     223             : };
     224             : 
     225             : } // namespace detail
     226             : 
     227             : } // namespace state_formulas
     228             : 
     229             : } // namespace mcrl2
     230             : 
     231             : #endif // MCRL2_MODAL_FORMULA_PARSE_IMPL_H

Generated by: LCOV version 1.14