12#ifndef MCRL2_MODAL_FORMULA_PARSE_IMPL_H
13#define MCRL2_MODAL_FORMULA_PARSE_IMPL_H
15#include "mcrl2/lps/parse.h"
16#include "mcrl2/lps/parse_impl.h"
17#include "mcrl2/modal_formula/typecheck.h"
33 if ((node.child_count() == 1) && (symbol_name(node.child(0)) ==
"MultAct")) {
return atermpp::down_cast<action_formulas::action_formula>(process::untyped_multi_action(parse_ActionList(node.child(0)))); }
34 else if ((node.child_count() == 1) && (symbol_name(node.child(0)) ==
"DataValExpr")) {
return atermpp::down_cast<action_formulas::action_formula>(parse_DataValExpr(node.child(0))); }
35 else if ((node.child_count() == 1) && (symbol_name(node.child(0)) ==
"DataExpr")) {
return atermpp::down_cast<action_formulas::action_formula>(parse_DataExpr(node.child(0))); }
38 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 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))); }
43 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))); }
45 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)
); }
63 if ((node.child_count() == 1) && (symbol_name(node.child(0)) ==
"ActFrm")) {
return atermpp::down_cast<regular_formulas::regular_formula>(parse_ActFrm(node.child(0))); }
64 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)
); }
65 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)
)); }
66 else if ((node.child_count() == 2) && (symbol_name(node.child(0)) ==
"RegFrm") && (symbol_name(node.child(1)) ==
"+")) {
return trans(parse_RegFrm(node.child(0)
)); }
67 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)
)); }
68 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)
)); }
87 result.action_labels() = action_labels;
135 if ((node.child_count() == 1) && (symbol_name(node.child(0)) ==
"DataValExpr")) {
return atermpp::down_cast<state_formulas::state_formula>(parse_DataValExpr(node.child(0))); }
136 else if ((node.child_count() == 1) && (symbol_name(node.child(0)) ==
"DataExpr")) {
return atermpp::down_cast<state_formulas::state_formula>(parse_DataExpr(node.child(0))); }
137 else if ((node.child_count() == 1) && (symbol_name(node.child(0)) ==
"true")) {
return state_formulas::true_(); }
139 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)
)); }
140 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)
)); }
147 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))); }
148 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))); }
149 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))); }
150 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))); }
151 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))); }
152 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)
)); }
153 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)
)); }
154 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))); }
155 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))); }
156 else if ((node.child_count() == 2) && (symbol_name(node.child(0)) ==
"Id")) {
return atermpp::down_cast<state_formulas::state_formula>(data::untyped_data_parameter(parse_Id(node.child(0)), parse_DataExprList(node.child(1)))); }
157 else if ((node.child_count() == 2) && (symbol_name(node.child(0)) ==
"delay")) {
return make_delay(node.child(1)
); }
158 else if ((node.child_count() == 2) && (symbol_name(node.child(0)) ==
"yaled")) {
return make_yaled(node.child(1)
); }
159 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)
); }
170 if (symbol_name(node) ==
"SortSpec")
174 else if (symbol_name(node) ==
"ConsSpec")
178 else if (symbol_name(node) ==
"MapSpec")
182 else if (symbol_name(node) ==
"EqnSpec")
186 else if (symbol_name(node) ==
"ActSpec")
188 result.action_labels = result.action_labels + parse_ActSpec(node);
191 else if (symbol_name(node) ==
"FormSpec")
196 else if (symbol_name(node) ==
"StateFrm")
aterm_string(const aterm_string &t) noexcept=default
aterm()
Default constructor.
A unordered_map class in which aterms can be stored.
parse_node_unexpected_exception(const parser &p, const parse_node &node)
\brief Assignment of a data expression to a variable
assignment(const variable &lhs, const data_expression &rhs)
\brief Constructor Z14.
const sort_expression & element_sort() const
sort_expression sort() const
Returns the sort of the data expression.
void translate_user_notation()
Translate user notation within the equations of the data specification.
data_specification()=default
Default constructor. Generate a data specification that contains only booleans and positive numbers.
data_type_checker(const data_specification &data_spec)
make a data type checker. Throws a mcrl2::runtime_error exception if the data_specification is not we...
data_specification operator()() const
Yields a type checked data specification, provided typechecking was successful. If not successful an ...
const data_specification & typechecked_data_specification() const
Identifier generator that stores the identifiers of the context in a set. Using the operator()() and ...
\brief An untyped parameter
const core::identifier_string & name() const
const data_expression_list & arguments() const
variable(const core::identifier_string &name, const sort_expression &sort)
Constructor.
Linear process specification.
Linear process specification.
stochastic_specification(const specification &other)
Constructor. This constructor is explicit as implicit conversions of this kind is a source of bugs.
\brief An untyped multi action or data application
std::map< core::identifier_string, data::sort_expression_list > m_state_variables
bool is_declared(const core::identifier_string &name) const
data::sort_expression_list matching_state_variable_sorts(const core::identifier_string &name, const data::data_expression_list &arguments) const
void add_state_variable(const core::identifier_string &name, const data::variable_list ¶meters, const data::sort_type_checker &sort_typechecker)
D_ParserTables parser_tables_mcrl2
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.
void warn_left_merge_merge(const parse_node &)
Prints a warning for each occurrence of 'x ||_ y || z' in the parse tree.
void warn_and_or(const parse_node &)
Prints a warning for each occurrence of 'x && y || z' in the parse tree.
Namespace for system defined sort bag.
bool is_union_application(const atermpp::aterm &e)
Recogniser for application of +.
application union_(const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Application of function symbol +.
Namespace for system defined sort bool_.
const basic_sort & bool_()
Constructor for sort expression Bool.
Namespace for system defined sort fbag.
application union_(const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Application of function symbol +.
bool is_union_application(const atermpp::aterm &e)
Recogniser for application of +.
Namespace for system defined sort fset.
application union_(const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Application of function symbol +.
bool is_union_application(const atermpp::aterm &e)
Recogniser for application of +.
Namespace for system defined sort int_.
application plus(const data_expression &arg0, const data_expression &arg1)
Application of function symbol +.
bool is_int(const sort_expression &e)
Recogniser for sort expression Int.
Namespace for system defined sort list.
application element_at(const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Application of function symbol ..
Namespace for system defined sort nat.
bool is_nat(const sort_expression &e)
Recogniser for sort expression Nat.
application plus(const data_expression &arg0, const data_expression &arg1)
Application of function symbol +.
Namespace for system defined sort pos.
bool is_pos(const sort_expression &e)
Recogniser for sort expression Pos.
application plus(const data_expression &arg0, const data_expression &arg1)
Application of function symbol +.
Namespace for system defined sort real_.
bool is_real(const sort_expression &e)
Recogniser for sort expression Real.
application plus(const data_expression &arg0, const data_expression &arg1)
Application of function symbol +.
Namespace for system defined sort set_.
bool is_union_application(const atermpp::aterm &e)
Recogniser for application of +.
application union_(const sort_expression &s, const data_expression &arg0, const data_expression &arg1)
Application of function symbol +.
bool is_data_expression(const atermpp::aterm &x)
Test for a data_expression expression.
data_specification merge_data_specifications(const data_specification &dataspec1, const data_specification &dataspec2)
Merges two data specifications. Throws an exception if conflicts are detected.
bool is_untyped_data_parameter(const atermpp::aterm &x)
A class that takes a linear process specification and checks all tau-summands of that LPS for conflue...
The main namespace for the LPS library.
specification remove_stochastic_operators(const stochastic_specification &spec)
Converts a stochastic specification to a specification. Throws an exception if non-empty distribution...
The main namespace for the Process library.
action_label_list merge_action_specifications(const action_label_list &actspec1, const action_label_list &actspec2)
Merges two action specifications.
bool is_untyped_multi_action(const atermpp::aterm &x)
expression builder that visits all sub expressions
core::identifier_string parse_Id(const parse_node &node) const
expression traverser that visits all sub expressions
data::data_expression parse_DataValExpr(const core::parse_node &node) const
data::data_expression parse_DataExpr(const core::parse_node &node) const
bool callback_DataSpecElement(const core::parse_node &node, untyped_data_specification &result) const
data::sort_expression parse_SortExpr(const core::parse_node &node, data::sort_expression_list *product=nullptr) const
data_specification construct_data_specification() const
multi_action_actions(const core::parser &parser_)