LMCAS
Lamina Computer Algebra System
Toggle main menu visibility
载入中...
搜索中...
未找到
expr_parser_construction.cpp
浏览该文件的文档.
1
#include "
internal/expr_parser.hpp
"
2
#include "
internal/expr_common.hpp
"
3
4
#include <exception>
5
#include <utility>
6
7
namespace
LMCAS::expr_detail
{
8
namespace
{
9
10
ExprResult
invalid_construction
(std::string message) {
11
return
expr_common::expression_failure
(
12
CasErrc::InvalidArgument
, std::move(message),
kParseOperation
);
13
}
14
15
template
<
typename
Factory>
16
ExprResult
construct_expression
(std::string allocation_message,
17
Factory&& factory) {
18
try
{
19
auto
node = std::forward<Factory>(factory)();
20
return
ExprResult::success
(
21
LMCAS::detail::make_expression_ptr
(std::move(node)));
22
}
catch
(
const
std::bad_alloc&) {
23
return
expr_common::expression_failure
(
24
CasErrc::ResourceLimit
, std::move(allocation_message),
25
kParseOperation
);
26
}
catch
(
const
std::exception& error) {
27
return
expr_common::expression_failure
(
28
CasErrc::InternalInvariant
, error.what(),
kParseOperation
);
29
}
30
}
31
32
}
33
34
35
ExprResult
ExprParser::relational
(
36
const
ExprPtr
& lhs,
const
ExprPtr
&
rhs
,
RelationOp
op
) {
37
if
(!lhs || !
rhs
) {
38
return
invalid_construction(
"relational operands cannot be null"
);
39
}
40
return
construct_expression(
41
"relational expression allocation failed"
, [&] {
42
return
LMCAS::detail::make_node<RelationalNode>
(
43
LMCAS::detail::node
(lhs),
LMCAS::detail::node
(
rhs
),
op
);
44
});
45
}
46
47
ExprResult
ExprParser::logical
(
48
const
ExprPtr
& lhs,
const
ExprPtr
&
rhs
,
LogicalNode::Op
op
) {
49
if
(!lhs || (
op
!=
LogicalNode::Op::Not
&& !
rhs
)) {
50
return
invalid_construction(
"logical operands cannot be null"
);
51
}
52
return
construct_expression(
53
"logical expression allocation failed"
, [&] {
54
return
LMCAS::detail::make_node<LogicalNode>
(
55
LMCAS::detail::node
(lhs),
56
rhs
?
LMCAS::detail::node
(
rhs
) :
nullptr
,
op
);
57
});
58
}
59
60
ExprResult
ExprParser::finite_set
(
const
std::vector<ExprPtr>& elements) {
61
for
(
const
auto
&
element
: elements) {
62
if
(!
element
|| !
LMCAS::detail::node
(
element
)) {
63
return
invalid_construction(
"set elements cannot be null"
);
64
}
65
}
66
return
construct_expression(
67
"set expression allocation failed"
, [&] {
68
std::vector<std::shared_ptr<const SymbolicNode>> nodes;
69
nodes.reserve(elements.size());
70
for
(
const
auto
&
element
: elements) {
71
nodes.push_back(
LMCAS::detail::node
(
element
));
72
}
73
return
LMCAS::detail::make_node<FiniteSetNode>
(std::move(nodes));
74
});
75
}
76
77
ExprResult
ExprParser::interval
(
78
const
ExprPtr
&
lower
,
const
ExprPtr
&
upper
,
79
bool
lower_closed
,
bool
upper_closed
) {
80
if
(!
lower
|| !
upper
) {
81
return
invalid_construction(
"interval bounds cannot be null"
);
82
}
83
return
construct_expression(
84
"interval expression allocation failed"
, [&] {
85
return
LMCAS::detail::make_node<IntervalNode>
(
86
LMCAS::detail::node
(
lower
),
LMCAS::detail::node
(
upper
),
87
lower_closed
,
upper_closed
);
88
});
89
}
90
91
ExprResult
ExprParser::membership
(
92
const
ExprPtr
&
element
,
const
ExprPtr
&
set
,
bool
negated
) {
93
if
(!
element
|| !
set
) {
94
return
invalid_construction(
"membership operands cannot be null"
);
95
}
96
return
construct_expression(
97
"membership expression allocation failed"
, [&] {
98
std::shared_ptr<const SymbolicNode> node =
99
LMCAS::detail::make_node<MembershipNode>
(
100
LMCAS::detail::node
(
element
),
LMCAS::detail::node
(
set
));
101
if
(
negated
) {
102
node =
LMCAS::detail::make_node<LogicalNode>
(
103
std::move(node),
nullptr
,
LogicalNode::Op::Not
);
104
}
105
return
node;
106
});
107
}
108
109
ExprResult
ExprParser::function_node
(
110
const
std::string&
name
,
const
std::vector<ExprPtr>& arguments,
111
FunctionNode::FuncType
type) {
112
for
(
const
auto
& argument : arguments) {
113
if
(!argument || !
LMCAS::detail::node
(argument)) {
114
return
invalid_construction(
"function arguments cannot be null"
);
115
}
116
}
117
return
construct_expression(
118
name
+
" expression allocation failed"
, [&] {
119
std::vector<std::shared_ptr<const SymbolicNode>> nodes;
120
nodes.reserve(arguments.size());
121
for
(
const
auto
& argument : arguments) {
122
nodes.push_back(
LMCAS::detail::node
(argument));
123
}
124
return
LMCAS::detail::make_node<FunctionNode>
(
125
type, std::move(nodes));
126
});
127
}
128
129
}
LMCAS::FunctionNode::FuncType
FuncType
定义
functions.hpp:12
LMCAS::LogicalNode::Op
Op
定义
relations.hpp:75
LMCAS::LogicalNode::Op::Not
@ Not
一元逻辑非,right 为 nullptr。
定义
relations.hpp:78
LMCAS::Result< ExprPtr >::success
static Result success(ExprPtr value)
定义
result.hpp:48
LMCAS::expr_detail::ExprParser::function_node
ExprResult function_node(const std::string &name, const std::vector< ExprPtr > &arguments, FunctionNode::FuncType type)
定义
expr_parser_construction.cpp:109
LMCAS::expr_detail::ExprParser::interval
ExprResult interval(const ExprPtr &lower, const ExprPtr &upper, bool lower_closed, bool upper_closed)
定义
expr_parser_construction.cpp:77
LMCAS::expr_detail::ExprParser::logical
ExprResult logical(const ExprPtr &lhs, const ExprPtr &rhs, LogicalNode::Op op)
定义
expr_parser_construction.cpp:47
LMCAS::expr_detail::ExprParser::finite_set
ExprResult finite_set(const std::vector< ExprPtr > &elements)
定义
expr_parser_construction.cpp:60
LMCAS::expr_detail::ExprParser::relational
ExprResult relational(const ExprPtr &lhs, const ExprPtr &rhs, RelationOp op)
定义
expr_parser_construction.cpp:35
LMCAS::expr_detail::ExprParser::membership
ExprResult membership(const ExprPtr &element, const ExprPtr &set, bool negated)
定义
expr_parser_construction.cpp:91
expr_common.hpp
expr_parser.hpp
LMCAS::detail::make_expression_ptr
std::shared_ptr<::LMCAS::SymbolicExpr > make_expression_ptr(SymbolicNodePtr root)
定义
base.hpp:111
LMCAS::detail::node
const SymbolicNodePtr & node(const ::LMCAS::SymbolicExpr &expression) noexcept
定义
base.hpp:91
LMCAS::detail::make_node
std::shared_ptr< const Node > make_node(Args &&... args)
定义
base.hpp:123
LMCAS::expr_detail::anonymous_namespace{expr_parser_construction.cpp}::invalid_construction
ExprResult invalid_construction(std::string message)
定义
expr_parser_construction.cpp:10
LMCAS::expr_detail::anonymous_namespace{expr_parser_construction.cpp}::construct_expression
ExprResult construct_expression(std::string allocation_message, Factory &&factory)
定义
expr_parser_construction.cpp:16
LMCAS::expr_detail::expr_common::expression_failure
ExprResult expression_failure(CasErrc code, std::string message, const char *operation)
定义
expr_facade.cpp:13
LMCAS::expr_detail
定义
expr_facade.cpp:12
LMCAS::expr_detail::kParseOperation
constexpr const char * kParseOperation
定义
expr_parser.hpp:12
LMCAS::element
const ExprPtr & element
定义
expr.hpp:368
LMCAS::upper
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr upper
定义
expr.hpp:148
LMCAS::lower
const ExprPtr & lower
定义
expr.hpp:255
LMCAS::set
const ExprPtr & set
定义
expr.hpp:161
LMCAS::CasErrc::InvalidArgument
@ InvalidArgument
定义
result.hpp:13
LMCAS::CasErrc::InternalInvariant
@ InternalInvariant
定义
result.hpp:28
LMCAS::CasErrc::ResourceLimit
@ ResourceLimit
定义
result.hpp:25
LMCAS::ExprResult
Result< ExprPtr > ExprResult
定义
expr.hpp:28
LMCAS::RelationOp
RelationOp
Stable relational operator used by public APIs.
定义
symbolic.hpp:39
LMCAS::op
const ExprPtr RelationOp op
定义
expr.hpp:151
LMCAS::lower_closed
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr bool lower_closed
定义
expr.hpp:149
LMCAS::ExprPtr
std::shared_ptr< SymbolicExpr > ExprPtr
定义
conditional_result.hpp:19
LMCAS::rhs
const ExprPtr & rhs
定义
expr.hpp:150
LMCAS::upper_closed
__attribute__((visibility("default"))) ExprResult function(const std __attribute__((visibility("default"))) ExprResult finite_set(std ExprPtr bool bool upper_closed
定义
expr.hpp:149
LMCAS::negated
const ExprPtr bool negated
定义
expr.hpp:161
LMCAS::name
__attribute__((visibility("default"))) Result< EqvProfile > eqv_profile_from_name(const std const std::string & name
定义
equivalence_options.hpp:41
src
expr_parser_construction.cpp
生成于
, 为 LMCAS使用
1.18.0