mCRL2
Loading...
Searching...
No Matches
parse_impl.h
Go to the documentation of this file.
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/process/parse_impl.h
10/// \brief add your file description here.
11
12#ifndef MCRL2_PROCESS_PARSE_IMPL_H
13#define MCRL2_PROCESS_PARSE_IMPL_H
14
15#include "mcrl2/data/parse_impl.h"
16#include "mcrl2/process/typecheck.h"
17#include "mcrl2/utilities/detail/separate_keyword_section.h"
18
19namespace mcrl2::process
20{
21
23{
24 data::variable_list global_variables;
25 action_label_list action_labels;
28
30 {
32 result.data() = construct_data_specification();
33 result.global_variables() = std::set<data::variable>(global_variables.begin(), global_variables.end());
34 result.action_labels() = action_labels;
35 result.equations() = equations;
36 result.init() = init;
37 return result;
38 }
39};
40
41namespace detail
42{
43
45{
46 action_actions(const core::parser& parser_)
48 {}
49
50 data::untyped_data_parameter parse_Action(const core::parse_node& node) const
51 {
52 return data::untyped_data_parameter(parse_Id(node.child(0)), parse_DataExprList(node.child(1)));
53 }
54
55 data::untyped_data_parameter_list parse_ActionList(const core::parse_node& node) const
56 {
57 return parse_list<data::untyped_data_parameter>(node, "Action", [&](const core::parse_node& node) { return parse_Action(node); });
58 }
59
60 bool callback_ActDecl(const core::parse_node& node, action_label_vector& result) const
61 {
62 if (symbol_name(node) == "ActDecl")
63 {
64 core::identifier_string_list ids = parse_IdList(node.child(0));
65 data::sort_expression_list sorts;
66 if (node.child(1).child(0))
67 {
68 sorts = parse_SortProduct(node.child(1).child(0).child(1));
69 }
70 for (const core::identifier_string& id: ids)
71 {
72 result.emplace_back(id, sorts);
73 }
74 return true;
75 }
76 return false;
77 };
78
79 action_label_list parse_ActDeclList(const core::parse_node& node) const
80 {
81 action_label_vector result;
82 traverse(node, [&](const core::parse_node& node) { return callback_ActDecl(node, result); });
83 return process::action_label_list(result.begin(), result.end());
84 }
85
86 action_label_list parse_ActSpec(const core::parse_node& node) const
87 {
88 return parse_ActDeclList(node.child(1));
89 }
90};
91
93{
94 explicit process_actions(const core::parser& parser_)
96 {}
97
98 core::identifier_string_list parse_ActIdSet(const core::parse_node& node) const
99 {
100 return parse_IdList(node.child(1));
101 }
102
103 process::action_name_multiset parse_MultActId(const core::parse_node& node) const
104 {
105 return action_name_multiset(parse_IdList(node));
106 }
107
108 process::action_name_multiset_list parse_MultActIdList(const core::parse_node& node) const
109 {
110 return parse_list<process::action_name_multiset>(node, "MultActId", [&](const core::parse_node& node) { return parse_MultActId(node); });
111 }
112
113 process::action_name_multiset_list parse_MultActIdSet(const core::parse_node& node) const
114 {
115 return parse_MultActIdList(node.child(1));
116 }
117
118 process::communication_expression parse_CommExpr(const core::parse_node& node) const
119 {
120 core::identifier_string id = parse_Id(node.child(0));
121 core::identifier_string_list ids = parse_IdList(node.child(2));
122 ids.push_front(id);
123 action_name_multiset lhs(ids);
124 core::identifier_string rhs = parse_Id(node.child(4));
126 }
127
128 process::communication_expression_list parse_CommExprList(const core::parse_node& node) const
129 {
130 return parse_list<process::communication_expression>(node, "CommExpr", [&](const core::parse_node& node) { return parse_CommExpr(node); });
131 }
132
133 process::communication_expression_list parse_CommExprSet(const core::parse_node& node) const
134 {
135 return parse_CommExprList(node.child(1));
136 }
137
138 process::rename_expression parse_RenExpr(const core::parse_node& node) const
139 {
140 return process::rename_expression(parse_Id(node.child(0)), parse_Id(node.child(2)));
141 }
142
143 process::rename_expression_list parse_RenExprList(const core::parse_node& node) const
144 {
145 return parse_list<process::rename_expression>(node, "RenExpr", [&](const core::parse_node& node) { return parse_RenExpr(node); });
146 }
147
148 process::rename_expression_list parse_RenExprSet(const core::parse_node& node) const
149 {
150 return parse_RenExprList(node.child(1));
151 }
152
153 bool is_process_expression(const std::string& s) const
154 {
155 return s == "ProcExpr" || s == "ProcExprNoIf";
156 }
157
158 bool is_proc_expr_stochastic_operator(const core::parse_node& node) const
159 {
160 return is_process_expression(symbol_name(node)) && (node.child_count() == 7) && (symbol_name(node.child(0)) == "dist") && (symbol_name(node.child(1)) == "VarsDeclList") &&
161 (symbol_name(node.child(2)) == "[") && (symbol_name(node.child(3)) == "DataExpr") && (symbol_name(node.child(4)) == "]") && (symbol_name(node.child(5)) == ".") && is_process_expression(symbol_name(node.child(6)));
162 }
163
164 // override
165 data::untyped_data_parameter parse_Action(const core::parse_node& node) const
166 {
167 return data::untyped_data_parameter(parse_Id(node.child(0)), parse_DataExprList(node.child(1)));
168 }
169
170 process::process_expression parse_ProcExpr(const core::parse_node& node) const
171 {
172 if ((node.child_count() == 1) && (symbol_name(node.child(0)) == "Action")) { return atermpp::down_cast<process::process_expression>(parse_Action(node.child(0))); }
173 else if ((node.child_count() == 4) && (symbol_name(node.child(0)) == "Id") && (symbol_name(node.child(1)) == "(") && (symbol_name(node.child(3)) == ")")) { return untyped_process_assignment(parse_Id(node.child(0)), parse_AssignmentList(node.child(2))); }
174 else if ((node.child_count() == 1) && (symbol_name(node.child(0)) == "delta")) { return delta(); }
175 else if ((node.child_count() == 1) && (symbol_name(node.child(0)) == "tau")) { return tau(); }
176 else if ((node.child_count() == 6) && (symbol_name(node.child(0)) == "block") && (symbol_name(node.child(1)) == "(") && (symbol_name(node.child(2)) == "ActIdSet") && (symbol_name(node.child(3)) == ",") && is_process_expression(symbol_name(node.child(4))) && (symbol_name(node.child(5)) == ")")) { return process::block(parse_ActIdSet(node.child(2)), parse_ProcExpr(node.child(4))); }
177 else if ((node.child_count() == 6) && (symbol_name(node.child(0)) == "allow") && (symbol_name(node.child(1)) == "(") && (symbol_name(node.child(2)) == "MultActIdSet") && (symbol_name(node.child(3)) == ",") && is_process_expression(symbol_name(node.child(4))) && (symbol_name(node.child(5)) == ")")) { return process::allow(parse_MultActIdSet(node.child(2)), parse_ProcExpr(node.child(4))); }
178 else if ((node.child_count() == 6) && (symbol_name(node.child(0)) == "hide") && (symbol_name(node.child(1)) == "(") && (symbol_name(node.child(2)) == "ActIdSet") && (symbol_name(node.child(3)) == ",") && is_process_expression(symbol_name(node.child(4))) && (symbol_name(node.child(5)) == ")")) { return process::hide(parse_ActIdSet(node.child(2)), parse_ProcExpr(node.child(4))); }
179 else if ((node.child_count() == 6) && (symbol_name(node.child(0)) == "rename") && (symbol_name(node.child(1)) == "(") && (symbol_name(node.child(2)) == "RenExprSet") && (symbol_name(node.child(3)) == ",") && is_process_expression(symbol_name(node.child(4))) && (symbol_name(node.child(5)) == ")")) { return process::rename(parse_RenExprSet(node.child(2)), parse_ProcExpr(node.child(4))); }
180 else if ((node.child_count() == 6) && (symbol_name(node.child(0)) == "comm") && (symbol_name(node.child(1)) == "(") && (symbol_name(node.child(2)) == "CommExprSet") && (symbol_name(node.child(3)) == ",") && is_process_expression(symbol_name(node.child(4))) && (symbol_name(node.child(5)) == ")")) { return process::comm(parse_CommExprSet(node.child(2)), parse_ProcExpr(node.child(4))); }
181 else if ((node.child_count() == 3) && (symbol_name(node.child(0)) == "(") && is_process_expression(symbol_name(node.child(1))) && (symbol_name(node.child(2)) == ")")) { return parse_ProcExpr(node.child(1)); }
182 else if ((node.child_count() == 3) && is_process_expression(symbol_name(node.child(0))) && (node.child(1).string() == "+") && is_process_expression(symbol_name(node.child(2)))) { return choice(parse_ProcExpr(node.child(0)), parse_ProcExpr(node.child(2))); }
183 else if ((node.child_count() == 3) && is_process_expression(symbol_name(node.child(0))) && (node.child(1).string() == "||") && is_process_expression(symbol_name(node.child(2)))) { return merge(parse_ProcExpr(node.child(0)), parse_ProcExpr(node.child(2))); }
184 else if ((node.child_count() == 3) && is_process_expression(symbol_name(node.child(0))) && (node.child(1).string() == "||_") && is_process_expression(symbol_name(node.child(2)))) { return left_merge(parse_ProcExpr(node.child(0)), parse_ProcExpr(node.child(2))); }
185 else if ((node.child_count() == 3) && is_process_expression(symbol_name(node.child(0))) && (node.child(1).string() == ".") && is_process_expression(symbol_name(node.child(2)))) { return seq(parse_ProcExpr(node.child(0)), parse_ProcExpr(node.child(2))); }
186 else if ((node.child_count() == 3) && is_process_expression(symbol_name(node.child(0))) && (node.child(1).string() == "<<") && is_process_expression(symbol_name(node.child(2)))) { return bounded_init(parse_ProcExpr(node.child(0)), parse_ProcExpr(node.child(2))); }
187 else if ((node.child_count() == 3) && is_process_expression(symbol_name(node.child(0))) && (node.child(1).string() == "@") && (symbol_name(node.child(2)) == "DataExprUnit")) { return at(parse_ProcExpr(node.child(0)), parse_DataExprUnit(node.child(2))); }
188 else if ((node.child_count() == 3) && is_process_expression(symbol_name(node.child(0))) && (node.child(1).string() == "|") && is_process_expression(symbol_name(node.child(2)))) { return sync(parse_ProcExpr(node.child(0)), parse_ProcExpr(node.child(2))); }
189 else if ((node.child_count() == 3) && (symbol_name(node.child(0)) == "DataExprUnit") && (node.child(1).string() == "->") && is_process_expression(symbol_name(node.child(2)))) { return if_then(parse_DataExprUnit(node.child(0)), parse_ProcExpr(node.child(2))); }
190 else if ((node.child_count() == 3) && (symbol_name(node.child(0)) == "DataExprUnit") && (symbol_name(node.child(1)) == "IfThen") && node.child(1).child(0).string() == "->" && is_process_expression(symbol_name(node.child(1).child(1))) && (node.child(1).child(2).string() == "<>") && is_process_expression(symbol_name(node.child(2)))) { return if_then_else(parse_DataExprUnit(node.child(0)), parse_ProcExpr(node.child(1).child(1)), parse_ProcExpr(node.child(2))); }
191 else if ((node.child_count() == 4) && (symbol_name(node.child(0)) == "sum") && (symbol_name(node.child(1)) == "VarsDeclList") && (symbol_name(node.child(2)) == ".") && is_process_expression(symbol_name(node.child(3)))) { return sum(parse_VarsDeclList(node.child(1)), parse_ProcExpr(node.child(3))); }
192 else if ((node.child_count() == 7) && is_proc_expr_stochastic_operator(node)) { return stochastic_operator(parse_VarsDeclList(node.child(1)), parse_DataExpr(node.child(3)), parse_ProcExpr(node.child(6))); }
194 }
195
196 process::process_equation parse_ProcDecl(const core::parse_node& node) const
197 {
198 core::identifier_string name = parse_Id(node.child(0));
199 data::variable_list variables = parse_VarsDeclList(node.child(1));
200 process_identifier id(name, variables);
201 return process::process_equation(id, variables, parse_ProcExpr(node.child(3)));
202 }
203
205 {
206 return parse_vector<process::process_equation>(node, "ProcDecl", [&](const core::parse_node& node) { return parse_ProcDecl(node); });
207 }
208
210 {
211 return parse_ProcDeclList(node.child(1));
212 }
213
214 process::process_expression parse_Init(const core::parse_node& node) const
215 {
216 return parse_ProcExpr(node.child(1));
217 }
218
219 bool callback_mCRL2Spec(const core::parse_node& node, untyped_process_specification& result) const
220 {
221 if (symbol_name(node) == "SortSpec")
222 {
223 return callback_DataSpecElement(node, result);
224 }
225 else if (symbol_name(node) == "ConsSpec")
226 {
227 return callback_DataSpecElement(node, result);
228 }
229 else if (symbol_name(node) == "MapSpec")
230 {
231 return callback_DataSpecElement(node, result);
232 }
233 else if (symbol_name(node) == "EqnSpec")
234 {
235 return callback_DataSpecElement(node, result);
236 }
237 else if (symbol_name(node) == "GlobVarSpec")
238 {
239 result.global_variables = parse_GlobVarSpec(node);
240 return true;
241 }
242 else if (symbol_name(node) == "ActSpec")
243 {
244 result.action_labels = result.action_labels + parse_ActSpec(node);
245 return true;
246 }
247 else if (symbol_name(node) == "ProcSpec")
248 {
249 std::vector<process::process_equation> eqn = parse_ProcSpec(node);
250 result.equations.insert(result.equations.end(), eqn.begin(), eqn.end());
251 return true;
252 }
253 else if (symbol_name(node) == "Init")
254 {
255 result.init = parse_Init(node);
256 }
257 return false;
258 }
259
261 {
263 traverse(node, [&](const core::parse_node& node) { return callback_mCRL2Spec(node, result); });
264 return result;
265 }
266};
267
268} // namespace detail
269
270} // namespace mcrl2::process
271
272#endif // MCRL2_PROCESS_PARSE_IMPL_H
A unordered_map class in which aterms can be stored.
parse_node_unexpected_exception(const parser &p, const parse_node &node)
Definition parse.h:76
\brief Assignment of a data expression to a variable
Definition assignment.h:88
const data_expression & rhs() const
Definition assignment.h:119
const variable & lhs() const
Definition assignment.h:114
data_expression & operator=(const data_expression &) noexcept=default
data_expression & operator=(data_expression &&) noexcept=default
sort_expression sort() const
Returns the sort of the data expression.
Definition data.cpp:107
data_expression(const data_expression &) noexcept=default
Move semantics.
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.
Rewriter that operates on data expressions.
Definition rewriter.h:84
Identifier generator that stores the identifiers of the context in a set. Using the operator()() and ...
\brief A sort expression
\brief A data variable
Definition variable.h:25
const sort_expression & sort() const
Definition variable.h:40
const data::data_expression & condition() const
Returns the condition of the rule.
const process::process_expression & rhs() const
Returns the right hand side of the rule.
data::data_expression & condition()
Returns the condition of the rule.
action_rename_rule()=default
Constructor.
action_rename_rule(const data::variable_list &variables, const data::data_expression &condition, const process::action &lhs, const process::process_expression &rhs)
Constructor.
process::process_expression m_rhs
right hand side of the rule. Can only be an action, tau or delta.
data::variable_list m_variables
The data variables of the rule.
bool check_that_rhs_is_tau_delta_or_an_action() const
data::variable_list & variables()
Returns the variables of the rule.
process::action m_lhs
The left hand side of the rule.
action_rename_rule(const atermpp::aterm &t)
Constructor.
data::data_expression m_condition
The condition of the rule.
const data::variable_list & variables() const
Returns the variables of the rule.
const process::action & lhs() const
Returns the left hand side of the rule.
Action rename specification.
const std::vector< action_rename_rule > & rules() const
Returns the action rename rules.
data::data_specification m_data
The data specification of the action rename specification.
process::action_label_list & action_labels()
Returns the sequence of action labels.
std::vector< action_rename_rule > m_rules
The action rename rules of the action rename specification.
action_rename_specification(const data::data_specification &data, const process::action_label_list &action_labels, const std::vector< action_rename_rule > &rules)
Constructor.
std::vector< action_rename_rule > & rules()
Returns the action rename rules.
action_rename_specification()=default
Constructor.
process::action_label_list m_action_labels
The action labels of the action rename specification.
const process::action_label_list & action_labels() const
Returns the sequence of action labels.
action_rename_specification(atermpp::aterm t)
Constructor.
bool is_well_typed() const
Indicates whether the action_rename_specification is well typed.
action_rename_specification operator()(const action_rename_specification &arspec, const stochastic_specification &lpsspec)
Type check an action_rename_specification.
Definition typecheck.h:97
process::detail::action_context m_action_context
Definition typecheck.h:72
action_rename_rule typecheck_action_rename_rule(const action_rename_rule &x, const process::action_label_list &action_labels)
Definition typecheck.h:74
data::data_type_checker m_data_type_checker
Definition typecheck.h:71
action_rename_type_checker()
Default constructor for an action rename type checker.
Definition typecheck.h:88
LPS summand containing a multi-action.
data::data_expression_list next_state(const data::variable_list &process_parameters) const
Returns the next state corresponding to this summand.
Definition lps.cpp:71
LPS summand containing a deadlock.
Represents a deadlock.
Definition deadlock.h:23
deadlock(data::data_expression time=data::undefined_real())
Constructor.
Definition deadlock.h:33
bool has_time() const
Returns true if time is available.
Definition deadlock.h:39
data::data_expression & time()
Returns the time.
Definition deadlock.h:53
multi_action_type_checker(const data::data_specification &dataspec=data::data_specification())
Default constructor.
Definition typecheck.h:41
multi_action operator()(const process::untyped_multi_action &x)
Type check a multi action. Throws a mcrl2::runtime_error exception if the expression is not well type...
Definition typecheck.h:50
data::detail::variable_context m_variable_context
Definition typecheck.h:26
process::detail::action_context m_action_context
Definition typecheck.h:25
data::data_type_checker m_data_type_checker
Definition typecheck.h:24
multi_action_type_checker(const data::data_specification &dataspec, const VariableContainer &variables, const ActionLabelContainer &action_labels)
Definition typecheck.h:30
\brief A timed multi-action
bool has_time() const
Returns true if time is available.
const process::action_list & actions() const
multi_action(const process::action &l)
Constructor.
multi_action operator+(const multi_action &other) const
Joins the actions of both multi actions.
multi_action & operator=(multi_action &&) noexcept=default
multi_action(const process::action_list &actions=process::action_list(), data::data_expression time=data::undefined_real())
Constructor. Actions are sorted to establish the sorted-storage invariant.
process_initializer & operator=(process_initializer &&) noexcept=default
process_initializer(const data::data_expression_list &expressions)
Constructor.
Linear process specification.
\brief A stochastic distribution
stochastic_distribution & operator=(stochastic_distribution &&) noexcept=default
stochastic_distribution()
\brief Default constructor X3.
stochastic_distribution(const data::variable_list &variables, const data::data_expression &distribution)
\brief Constructor Z12.
stochastic_process_initializer(const data::data_expression_list &expressions, const stochastic_distribution &distribution)
Constructor.
\brief An action label
\brief A multiset of action names
action(const action_label &label, const data::data_expression_list &arguments)
\brief Constructor Z14.
const data::data_expression_list & arguments() const
action(const action &) noexcept=default
Move semantics.
const action_label & label() const
\brief The allow operator
\brief The at operator
at(const process_expression &operand, const data::data_expression &time_stamp)
\brief Constructor Z14.
const data::data_expression & time_stamp() const
const process_expression & operand() const
\brief The block operator
\brief The bounded initialization
bounded_init(const process_expression &left, const process_expression &right)
\brief Constructor Z14.
\brief The choice operator
const process_expression & left() const
choice(const process_expression &left, const process_expression &right)
\brief Constructor Z14.
const process_expression & right() const
\brief The communication operator
communication_expression(const action_name_multiset &action_name, const core::identifier_string &name)
\brief Constructor Z12.
\brief The value delta
delta()
\brief Default constructor X3.
\brief The hide operator
\brief The if-then-else operator
if_then_else(const data::data_expression &condition, const process_expression &then_case, const process_expression &else_case)
\brief Constructor Z14.
\brief The if-then operator
const process_expression & then_case() const
if_then(const data::data_expression &condition, const process_expression &then_case)
\brief Constructor Z14.
const data::data_expression & condition() const
\brief The left merge operator
left_merge(const process_expression &left, const process_expression &right)
\brief Constructor Z14.
\brief The merge operator
merge(const process_expression &left, const process_expression &right)
\brief Constructor Z14.
\brief A process equation
process_equation()
\brief Default constructor X3.
process_equation(const process_equation &) noexcept=default
Move semantics.
const data::variable_list & formal_parameters() const
const process_identifier & identifier() const
const process_expression & expression() const
\brief A process expression
process_expression & operator=(const process_expression &) noexcept=default
process_expression(const process_expression &) noexcept=default
Move semantics.
process_expression & operator=(process_expression &&) noexcept=default
\brief A process identifier
const process_identifier & identifier() const
const data::data_expression_list & actual_parameters() const
const process_identifier & identifier() const
Process specification consisting of a data specification, action labels, a sequence of process equati...
process_expression & init()
Returns the initialization of the process specification.
const process_expression & init() const
Returns the initialization of the process specification.
const process::action_label_list & action_labels() const
Returns the action label specification.
\brief A rename expression
\brief The rename operator
\brief The sequential composition
const process_expression & right() const
const process_expression & left() const
seq(const process_expression &left, const process_expression &right)
\brief Constructor Z14.
\brief The distribution operator
const data::variable_list & variables() const
const data::data_expression & distribution() const
\brief The sum operator
const process_expression & operand() const
\brief The synchronization operator
const process_expression & left() const
sync(const process_expression &left, const process_expression &right)
\brief Constructor Z14.
const process_expression & right() const
\brief The value tau
tau()
\brief Default constructor X3.
\brief An untyped multi action or data application
untyped_multi_action()
\brief Default constructor X3.
D_ParserTables parser_tables_mcrl2
#define mCRL2log(LEVEL)
mCRL2log(LEVEL) provides the stream used to log.
Definition logger.h:393
static data_specification const & default_specification()
Definition parse.h:28
bool check_assignment_variables(assignment_list const &assignments, variable_list const &variables)
Returns true if the left hand sides of assignments are contained in variables.
Namespace for system defined sort bool_.
Definition bool.h:29
bool is_bool(const sort_expression &e)
Recogniser for sort expression Bool.
Definition bool.h:51
bool is_and_application(const atermpp::aterm &e)
Recogniser for application of &&.
Definition bool.h:278
bool is_not_application(const atermpp::aterm &e)
Recogniser for application of !.
Definition bool.h:214
const function_symbol & true_()
Constructor for function symbol true.
Definition bool.h:74
Namespace for system defined sort real_.
bool is_real(const sort_expression &e)
Recogniser for sort expression Real.
Definition real1.h:55
A class that takes a linear process specification and checks all tau-summands of that LPS for conflue...
bool is_well_typed(const T &x)
Checks well typedness of an LPS object.
bool check_action_labels(const process::action_list &actions, const std::set< process::action_label > &labels)
Returns true if the labels of the given actions are contained in labels.
multi_action complete_multi_action(process::untyped_multi_action &x, const process::action_label_list &action_decls, const data::data_specification &data_spec=data::detail::default_specification())
Definition lps.cpp:148
process::action_label rename_action_label(const process::action_label &act, const std::regex &matching_regex, const std::string &replacing_fmt)
bool check_action_label_sorts(const process::action_label_list &action_labels, const std::set< data::sort_expression > &sorts)
Returns true if the sorts of the given action labels are contained in sorts.
bool check_well_typedness(const T &x)
Checks well typedness of an LPS object, and will print error messages to stderr.
bool check_action_sorts(const process::action_list &actions, const std::set< data::sort_expression > &sorts)
Returns true if the sorts of the given actions are contained in sorts.
void complete_action_rename_specification(action_rename_specification &x, const lps::stochastic_specification &spec)
Definition lps.cpp:166
process::untyped_multi_action parse_multi_action_new(const std::string &text)
Definition lps.cpp:130
multi_action complete_multi_action(process::untyped_multi_action &x, multi_action_type_checker &typechecker, const data::data_specification &data_spec=data::detail::default_specification())
Definition lps.cpp:140
action_rename_specification parse_action_rename_specification_new(const std::string &text)
Definition lps.cpp:156
The main namespace for the LPS library.
Definition constelm.h:18
std::string pp(const lps::stochastic_specification &x, bool arg0)
Definition lps.cpp:40
std::set< data::variable > find_all_variables(const lps::linear_process &x)
Definition lps.cpp:47
std::string pp(const lps::specification &x, bool arg0)
Definition lps.cpp:35
std::set< data::sort_expression > find_sort_expressions(const lps::stochastic_specification &x)
Definition lps.cpp:46
std::string pp_extended(const lps::stochastic_specification &x, const std::string &process_name, bool precedence_aware=true)
Definition lps.cpp:79
std::set< process::action_label > find_action_labels(const lps::stochastic_specification &x)
Definition lps.cpp:68
std::set< data::variable > find_free_variables(const lps::stochastic_specification &x)
Definition lps.cpp:56
std::string pp(const lps::stochastic_distribution &x, bool arg0)
Definition lps.cpp:37
std::string pp_extended(const stochastic_specification &x, const std::string &process_name, bool precedence_aware, bool summand_numbers)
Definition lps.cpp:98
std::set< data::variable > find_all_variables(const lps::multi_action &x)
Returns all variables inside a multi-action.
Definition lps.cpp:52
std::set< data::variable > find_all_variables(const lps::stochastic_specification &x)
Definition lps.cpp:50
bool check_well_typedness(const specification &x)
Definition lps.cpp:118
std::set< data::variable > find_free_variables(const lps::linear_process &x)
Definition lps.cpp:53
bool check_well_typedness(const linear_process &x)
Definition lps.cpp:108
std::set< data::function_symbol > find_function_symbols(const lps::stochastic_specification &x)
Definition lps.cpp:62
std::string pp_extended(const specification &x, const std::string &process_name, bool precedence_aware, bool summand_numbers)
Definition lps.cpp:88
lps::stochastic_specification action_rename(const action_rename_specification &action_rename_spec, const lps::stochastic_specification &lps_old_spec, const data::rewriter &rewr, const bool enable_rewriting)
Rename the actions in a linear specification using a given action_rename_spec.
std::set< process::action_label > find_action_labels(const lps::process_initializer &x)
Definition lps.cpp:66
std::set< data::variable > find_free_variables(const lps::specification &x)
Definition lps.cpp:55
multi_action typecheck_multi_action(process::untyped_multi_action &mult_act, const data::data_specification &data_spec, const process::action_label_list &action_decls)
Type check a multi action Throws an exception if something went wrong.
Definition typecheck.h:125
void normalize_sorts(lps::specification &x, const data::sort_specification &)
Definition lps.cpp:42
std::set< data::variable > find_free_variables(const lps::deadlock &x)
Definition lps.cpp:57
std::string pp(const lps::deadlock_summand &x, bool arg0)
Definition lps.cpp:31
std::set< process::action_label > find_action_labels(const lps::linear_process &x)
Definition lps.cpp:65
lps::multi_action normalize_sorts(const lps::multi_action &x, const data::sort_specification &sortspec)
Definition lps.cpp:41
std::set< data::variable > find_free_variables(const lps::stochastic_linear_process &x)
Definition lps.cpp:54
multi_action typecheck_multi_action(process::untyped_multi_action &mult_act, multi_action_type_checker &typechecker)
Type check a multi action Throws an exception if something went wrong.
Definition typecheck.h:141
std::set< data::function_symbol > find_function_symbols(const lps::specification &x)
Definition lps.cpp:61
std::string pp(const lps::stochastic_linear_process &x, bool arg0)
Definition lps.cpp:38
std::set< data::variable > find_free_variables(const lps::stochastic_process_initializer &x)
Definition lps.cpp:60
std::set< data::variable > find_free_variables(const lps::multi_action &x)
Definition lps.cpp:58
std::string pp(const lps::deadlock &x, bool arg0)
Definition lps.cpp:30
void normalize_sorts(lps::stochastic_specification &x, const data::sort_specification &)
Definition lps.cpp:43
std::set< data::variable > find_free_variables(const lps::process_initializer &x)
Definition lps.cpp:59
std::string pp(const lps::stochastic_action_summand &x, bool arg0)
Definition lps.cpp:36
std::string pp(const lps::stochastic_process_initializer &x, bool arg0)
Definition lps.cpp:39
std::string pp(const lps::linear_process &x, bool arg0)
Definition lps.cpp:32
std::string pp(const lps::multi_action &x, bool arg0)
Definition lps.cpp:33
atermpp::aterm action_rename_specification_to_aterm(const action_rename_specification &spec)
atermpp::aterm action_rename_rule_to_aterm(const action_rename_rule &rule)
std::set< data::sort_expression > find_sort_expressions(const lps::specification &x)
Definition lps.cpp:45
std::string pp(const lps::action_summand &x, bool arg0)
Definition lps.cpp:29
std::set< data::variable > find_all_variables(const lps::specification &x)
Definition lps.cpp:49
stochastic_specification action_rename(const std::regex &matching_regex, const std::string &replacing_fmt, const stochastic_specification &lps_old_spec)
Rename actions in given specification based on a regular expression and a string that specifies how t...
bool check_well_typedness(const stochastic_specification &x)
Definition lps.cpp:123
std::set< data::variable > find_all_variables(const lps::deadlock &x)
Definition lps.cpp:51
action_rename_specification typecheck_action_rename_specification(const action_rename_specification &arspec, const lps::stochastic_specification &lpsspec)
Type checks an action rename specification.
Definition typecheck.h:154
std::set< data::variable > find_all_variables(const lps::stochastic_linear_process &x)
Definition lps.cpp:48
bool check_well_typedness(const stochastic_linear_process &x)
Definition lps.cpp:113
lps::multi_action translate_user_notation(const lps::multi_action &x)
Definition lps.cpp:44
std::set< core::identifier_string > find_identifiers(const lps::stochastic_specification &x)
Definition lps.cpp:64
std::set< core::identifier_string > find_identifiers(const lps::specification &x)
Definition lps.cpp:63
std::set< process::action_label > find_action_labels(const lps::specification &x)
Definition lps.cpp:67
std::string pp(const lps::process_initializer &x, bool arg0)
Definition lps.cpp:34
bool check_process_instance_assignment(const process_equation &eq, const process_instance_assignment &inst)
Returns true if the process instance assignment a matches with the process equation eq.
Definition is_linear.h:25
bool is_process(const process_expression &x)
Returns true if the argument is a process instance.
Definition is_linear.h:68
bool is_conditional_deadlock(const process_expression &x)
Returns true if the argument is a conditional deadlock.
Definition is_linear.h:128
bool is_linear_process_term(const process_expression &x)
Returns true if the argument is a linear process.
Definition is_linear.h:154
bool check_process_instance(const process_equation &eq, const process_instance &init)
Returns true if the process instance a matches with the process equation eq.
Definition is_linear.h:46
bool is_alternative(const process_expression &x)
Returns true if the argument is an alternative composition.
Definition is_linear.h:144
bool is_timed_deadlock(const process_expression &x)
Returns true if the argument is a deadlock.
Definition is_linear.h:93
bool is_action_prefix(const process_expression &x)
Returns true if the argument is an action prefix.
Definition is_linear.h:120
bool is_stochastic_process(const process_expression &x)
Returns true if the argument is a process instance, optionally wrapped in a stochastic distribution.
Definition is_linear.h:78
bool is_multiaction(const process_expression &x)
Returns true if the argument is a multi-action.
Definition is_linear.h:102
bool is_conditional_action_prefix(const process_expression &x)
Returns true if the argument is a conditional action prefix.
Definition is_linear.h:136
bool is_timed_multiaction(const process_expression &x)
Returns true if the argument is a multi-action.
Definition is_linear.h:112
The main namespace for the Process library.
bool is_at(const atermpp::aterm &x)
bool is_linear(const process_specification &p, bool verbose=false)
Returns true if the process specification is linear.
Definition is_linear.h:344
bool is_linear(const process_expression &x, const process_equation &eqn)
Returns true if the process expression is linear.
Definition is_linear.h:389
bool is_process_instance(const atermpp::aterm &x)
bool is_process_instance_assignment(const atermpp::aterm &x)
bool is_tau(const atermpp::aterm &x)
bool is_seq(const atermpp::aterm &x)
bool is_delta(const atermpp::aterm &x)
bool is_linear(const process_equation &eqn)
Returns true if the process equation is linear.
Definition is_linear.h:379
bool is_sum(const atermpp::aterm &x)
bool is_action(const atermpp::aterm &x)
bool is_if_then(const atermpp::aterm &x)
bool is_choice(const atermpp::aterm &x)
bool is_stochastic_operator(const atermpp::aterm &x)
bool is_sync(const atermpp::aterm &x)
std::ostream & operator<<(std::ostream &out, const mcrl2::lps::action_rename_specification &s)
Output a action_rename_rule to ostream.
std::ostream & operator<<(std::ostream &out, const mcrl2::lps::action_rename_rule &r)
Output an action_rename_rule to ostream.
core::identifier_string parse_Id(const parse_node &node) const
Definition parse.h:231
const parser & m_parser
Definition parse.h:83
data::data_expression parse_DataExprUnit(const core::parse_node &node) const
Definition parse_impl.h:255
data::data_expression parse_DataExpr(const core::parse_node &node) const
Definition parse_impl.h:208
data_specification_actions(const core::parser &parser_)
Definition parse_impl.h:297
bool callback_DataSpecElement(const core::parse_node &node, untyped_data_specification &result) const
Definition parse_impl.h:410
std::vector< lps::action_rename_rule > parse_ActionRenameRuleList(const core::parse_node &node) const
Definition parse_impl.h:71
process::action parse_Action_as_action(const core::parse_node &node) const
Definition parse_impl.h:47
bool callback_ActionRenameSpec(const core::parse_node &node, data::untyped_data_specification &dataspec_result, lps::action_rename_specification &result) const
Definition parse_impl.h:87
std::vector< lps::action_rename_rule > parse_ActionRenameRuleSpec(const core::parse_node &node) const
Definition parse_impl.h:76
lps::action_rename_specification parse_ActionRenameSpec(const core::parse_node &node) const
Definition parse_impl.h:119
process::process_expression parse_ActionRenameRuleRHS(const core::parse_node &node) const
Definition parse_impl.h:53
action_rename_actions(const core::parser &parser_)
Definition parse_impl.h:42
lps::action_rename_rule parse_ActionRenameRule(const core::parse_node &node) const
Definition parse_impl.h:61
Function object for applying a substitution to LPS data types.
bool is_well_typed(const linear_process_base< ActionSummand > &p) const
Checks well typedness of a linear process.
bool is_well_typed(const process::action &a) const
Traverses an action.
bool is_well_typed(const action_summand &s) const
Checks well typedness of a summand.
bool check_time(const data::data_expression &t, const std::string &type) const
Checks if the sort of t has type real.
bool is_well_typed(const data::assignment &a) const
Traverses an assignment.
bool check_condition(const data::data_expression &t, const std::string &type) const
Checks if the sort of t has type bool.
bool is_well_typed(const stochastic_specification &spec) const
bool is_well_typed(const data::variable &d) const
Checks well typedness of a variable.
bool check_assignments(const data::assignment_list &l, const std::string &type) const
Checks if the assignments are well typed and have unique left hand sides.
bool is_well_typed(const specification &spec) const
bool is_well_typed(const data::sort_expression &d) const
Checks well typedness of a sort expression.
bool is_well_typed_container(const Container &c) const
Checks well typedness of the elements of a container.
bool is_well_typed(const process::action_label &d) const
Traverses an action label.
bool is_well_typed(const specification_base< LinearProcess, InitialProcessExpression > &spec, const std::set< data::variable > &free_variables) const
Checks well typedness of a linear process specification.
bool is_well_typed(const deadlock &d) const
Checks well typedness of a deadlock.
bool is_well_typed(const data::data_expression &d) const
Checks well typedness of a data expression.
bool is_well_typed(const deadlock_summand &s) const
Checks well typedness of a summand.
bool is_well_typed(const multi_action &a) const
Checks well typedness of a multi-action.
process::untyped_multi_action parse_MultAct(const core::parse_node &node) const
Definition parse_impl.h:29
multi_action_actions(const core::parser &parser_)
Definition parse_impl.h:25
action_actions(const core::parser &parser_)
Definition parse_impl.h:46
action_label_list parse_ActSpec(const core::parse_node &node) const
Definition parse_impl.h:86
data::untyped_data_parameter parse_Action(const core::parse_node &node) const
Definition parse_impl.h:50
bool callback_ActDecl(const core::parse_node &node, action_label_vector &result) const
Definition parse_impl.h:60
data::untyped_data_parameter_list parse_ActionList(const core::parse_node &node) const
Definition parse_impl.h:55
action_label_list parse_ActDeclList(const core::parse_node &node) const
Definition parse_impl.h:79
Converts a process expression into linear process format. Use the convert member functions for this.
lps::deadlock_summand_vector m_deadlock_summands
The result of the conversion.
process_equation m_equation
The process equation that is checked.
lps::specification convert(const process_specification &p)
Converts a process_specification into a specification. Throws non_linear_process if a non-linear sub-...
void leave(const process::left_merge &x)
Visit left_merge node.
lps::action_summand_vector m_action_summands
The result of the conversion.
void leave(const process::bounded_init &x)
Visit bounded_init node.
void convert(const process_equation &)
Returns true if the process equation e is linear.
void leave(const process::if_then_else &x)
Visit if_then_else node.
Exception that is thrown by linear_process_expression_traverser.
Definition is_linear.h:175
Checks if a process equation is linear. Use the is_linear() member function for this.
Definition is_linear.h:164
linear_process_expression_traverser(const process_equation &eqn_=process_equation())
Definition is_linear.h:181
void enter(const process::process_instance &x)
Definition is_linear.h:186
process_equation eqn
The process equation that is checked.
Definition is_linear.h:171
bool is_linear(const process_expression &x, bool verbose=false)
Returns true if the process equation e is linear.
Definition is_linear.h:322
void enter(const process::process_instance_assignment &x)
Definition is_linear.h:194
process::action_name_multiset parse_MultActId(const core::parse_node &node) const
Definition parse_impl.h:103
bool callback_mCRL2Spec(const core::parse_node &node, untyped_process_specification &result) const
Definition parse_impl.h:219
bool is_process_expression(const std::string &s) const
Definition parse_impl.h:153
process::process_equation parse_ProcDecl(const core::parse_node &node) const
Definition parse_impl.h:196
bool is_proc_expr_stochastic_operator(const core::parse_node &node) const
Definition parse_impl.h:158
process::rename_expression_list parse_RenExprSet(const core::parse_node &node) const
Definition parse_impl.h:148
untyped_process_specification parse_mCRL2Spec(const core::parse_node &node) const
Definition parse_impl.h:260
process::action_name_multiset_list parse_MultActIdList(const core::parse_node &node) const
Definition parse_impl.h:108
process::action_name_multiset_list parse_MultActIdSet(const core::parse_node &node) const
Definition parse_impl.h:113
data::untyped_data_parameter parse_Action(const core::parse_node &node) const
Definition parse_impl.h:165
process::communication_expression_list parse_CommExprList(const core::parse_node &node) const
Definition parse_impl.h:128
process::communication_expression_list parse_CommExprSet(const core::parse_node &node) const
Definition parse_impl.h:133
process::rename_expression parse_RenExpr(const core::parse_node &node) const
Definition parse_impl.h:138
process::communication_expression parse_CommExpr(const core::parse_node &node) const
Definition parse_impl.h:118
std::vector< process::process_equation > parse_ProcSpec(const core::parse_node &node) const
Definition parse_impl.h:209
std::vector< process::process_equation > parse_ProcDeclList(const core::parse_node &node) const
Definition parse_impl.h:204
process::process_expression parse_ProcExpr(const core::parse_node &node) const
Definition parse_impl.h:170
process_actions(const core::parser &parser_)
Definition parse_impl.h:94
process::process_expression parse_Init(const core::parse_node &node) const
Definition parse_impl.h:214
core::identifier_string_list parse_ActIdSet(const core::parse_node &node) const
Definition parse_impl.h:98
process::rename_expression_list parse_RenExprList(const core::parse_node &node) const
Definition parse_impl.h:143
Converts a process expression into linear process format. Use the convert member functions for this.
void leave(const process::stochastic_operator &x)
Visit stochastic operator node.
void convert(const process_equation &)
Returns true if the process equation e is linear.
lps::stochastic_action_summand_vector m_action_summands
The result of the conversion.
lps::deadlock_summand_vector m_deadlock_summands
The result of the conversion.
lps::stochastic_specification convert(const process_specification &p)
Converts a process_specification into a stochastic_specification. Throws non_linear_process if a non-...
std::vector< process::process_equation > equations
Definition parse_impl.h:26
process_specification construct_process_specification()
Definition parse_impl.h:29