LMCAS
Lamina Computer Algebra System
Toggle main menu visibility
载入中...
搜索中...
未找到
assumption_deserialization.cpp
浏览该文件的文档.
1
#include "
internal/assumption_parser.hpp
"
2
3
namespace
LMCAS::assumption_detail
{
4
5
AssumptionContext
AssumptionParser::parse
(
const
std::string& data) {
6
std::istringstream input(data);
7
std::string line;
8
while
(std::getline(input, line)) {
9
++
line_num
;
10
if
(line.empty())
continue
;
11
if
(line.back() ==
'\r'
) line.pop_back();
12
if
(line.empty())
continue
;
13
if
(
ended
) {
14
throw
std::invalid_argument(
15
"Line "
+ std::to_string(
line_num
) +
": data after END"
);
16
}
17
if
(line ==
"END"
) {
18
ended
=
true
;
19
continue
;
20
}
21
parse_record
(line);
22
}
23
if
(!
ended
) {
24
throw
std::invalid_argument(
25
"Line "
+ std::to_string(
line_num
) +
": unexpected end of input (missing END)"
);
26
}
27
return
std::move(
ctx
);
28
}
29
30
void
AssumptionParser::parse_record
(
const
std::string& line) {
31
std::istringstream ls(line);
32
std::string keyword;
33
ls >> keyword;
34
using
Handler = void (
AssumptionParser
::*)(std::istringstream&,
const
std::string&);
35
struct
Command {
36
const
char
*
name
;
37
Handler handler;
38
};
39
static
const
Command commands[] = {
40
{
"SCOPE"
, &
AssumptionParser::parse_scope
},
41
{
"DOMAIN"
, &
AssumptionParser::parse_domain
},
42
{
"SIGN"
, &
AssumptionParser::parse_sign
},
43
{
"PARITY"
, &
AssumptionParser::parse_parity
},
44
{
"BOUNDED"
, &
AssumptionParser::parse_bounded
},
45
{
"TRANSCENDENTAL"
, &
AssumptionParser::parse_transcendental
},
46
{
"FINITENESS"
, &
AssumptionParser::parse_finiteness
},
47
{
"DEFINITENESS"
, &
AssumptionParser::parse_definiteness
},
48
{
"PERIODIC"
, &
AssumptionParser::parse_periodic
},
49
{
"RELATION"
, &
AssumptionParser::parse_relation
},
50
{
"CONDITIONAL"
, &
AssumptionParser::parse_conditional
},
51
{
"CONTINUOUS"
, &
AssumptionParser::parse_continuity
},
52
{
"DIFFERENTIABLE"
, &
AssumptionParser::parse_continuity
},
53
{
"MONOTONICITY"
, &
AssumptionParser::parse_monotonicity
},
54
};
55
for
(
const
auto
& command : commands) {
56
if
(keyword == command.name) {
57
if
(command.handler != &
AssumptionParser::parse_scope
&&
current_scope
< 0) {
58
throw
std::invalid_argument(
59
"Line "
+ std::to_string(
line_num
) +
": "
+ keyword +
" before SCOPE"
);
60
}
61
(this->*command.handler)(ls, keyword);
62
return
;
63
}
64
}
65
if
(keyword ==
"END"
) {
66
throw
std::invalid_argument(
67
"Line "
+ std::to_string(
line_num
) +
": malformed END record"
);
68
}
69
throw
std::invalid_argument(
70
"Line "
+ std::to_string(
line_num
) +
": unknown keyword '"
+ keyword +
"'"
);
71
}
72
73
void
AssumptionParser::parse_scope
(
74
std::istringstream& ls,
const
std::string& keyword) {
75
int
idx;
76
if
(!(ls >> idx)) {
77
throw
std::invalid_argument(
78
"Line "
+ std::to_string(
line_num
) +
": SCOPE missing index"
);
79
}
80
require_line_end
(ls,
line_num
, keyword);
81
if
(idx !=
current_scope
+ 1) {
82
throw
std::invalid_argument(
83
"Line "
+ std::to_string(
line_num
) +
84
": SCOPE indices must be sequential from zero"
);
85
}
86
if
(idx > 0) {
87
ctx
.push();
88
}
89
current_scope
= idx;
90
}
91
92
93
}
94
95
#include "
computation_context.hpp
"
96
97
namespace
LMCAS
{
98
99
AssumptionContext AssumptionContext::deserialize_impl(
100
const
std::string& data,
ComputationContext
&
context
) {
101
assumption_detail::AssumptionParser
parser(
context
);
102
return
parser.parse(data);
103
}
104
105
Result<AssumptionContext> AssumptionContext::deserialize(
const
std::string& data) {
106
return
deserialize_checked(data);
107
}
108
109
Result<AssumptionContext>
AssumptionContext::deserialize_checked(
110
const
std::string& data) {
111
ComputationContext
context
;
112
return
deserialize_checked(data,
context
);
113
}
114
115
Result<AssumptionContext>
AssumptionContext::deserialize_checked(
116
const
std::string& data,
ComputationContext
&
context
) {
117
constexpr
const
char
*
operation
=
"deserialize"
;
118
auto
input_budget =
context
.require_input_bytes(data.size(), operation);
119
if
(!input_budget) {
120
return
Result<AssumptionContext>::failure
(input_budget.error());
121
}
122
try
{
123
return
Result<AssumptionContext>::success
(deserialize_impl(data,
context
));
124
}
catch
(
const
CasError
& error) {
125
return
Result<AssumptionContext>::failure
(error);
126
}
catch
(
const
std::bad_alloc&) {
127
return
Result<AssumptionContext>::failure
(
128
CasErrc::ResourceLimit
,
129
"assumption deserialization allocation failed"
, operation);
130
}
catch
(
const
std::invalid_argument& ex) {
131
return
Result<AssumptionContext>::failure
(
132
CasErrc::ParseError
, ex.what(), operation);
133
}
catch
(
const
std::exception& ex) {
134
return
Result<AssumptionContext>::failure
(
135
CasErrc::InternalInvariant
, ex.what(), operation);
136
}
137
}
138
139
}
assumption_parser.hpp
LMCAS::ComputationContext
定义
computation_context.hpp:99
LMCAS::Result
定义
result.hpp:39
LMCAS::Result::failure
static Result failure(CasErrc code, std::string message, std::string operation={})
定义
result.hpp:52
LMCAS::Result::success
static Result success(T value)
定义
result.hpp:48
LMCAS::assumption_detail::AssumptionParser
定义
assumption_parser.hpp:34
LMCAS::assumption_detail::AssumptionParser::line_num
int line_num
定义
assumption_parser.hpp:42
LMCAS::assumption_detail::AssumptionParser::parse_relation
void parse_relation(std::istringstream &ls, const std::string &keyword)
定义
assumption_parse_relations.cpp:156
LMCAS::assumption_detail::AssumptionParser::parse_periodic
void parse_periodic(std::istringstream &ls, const std::string &keyword)
定义
assumption_parse_intervals.cpp:5
LMCAS::assumption_detail::AssumptionParser::parse_bounded
void parse_bounded(std::istringstream &ls, const std::string &keyword)
定义
assumption_parse_properties.cpp:47
LMCAS::assumption_detail::AssumptionParser::parse_record
void parse_record(const std::string &line)
定义
assumption_deserialization.cpp:30
LMCAS::assumption_detail::AssumptionParser::parse_transcendental
void parse_transcendental(std::istringstream &ls, const std::string &keyword)
定义
assumption_parse_properties.cpp:78
LMCAS::assumption_detail::AssumptionParser::ended
bool ended
定义
assumption_parser.hpp:44
LMCAS::assumption_detail::AssumptionParser::parse_parity
void parse_parity(std::istringstream &ls, const std::string &keyword)
定义
assumption_parse_properties.cpp:33
LMCAS::assumption_detail::AssumptionParser::parse_domain
void parse_domain(std::istringstream &ls, const std::string &keyword)
定义
assumption_parse_properties.cpp:5
LMCAS::assumption_detail::AssumptionParser::parse
AssumptionContext parse(const std::string &data)
定义
assumption_deserialization.cpp:5
LMCAS::assumption_detail::AssumptionParser::parse_conditional
void parse_conditional(std::istringstream &ls, const std::string &keyword)
定义
assumption_parse_relations.cpp:175
LMCAS::assumption_detail::AssumptionParser::parse_continuity
void parse_continuity(std::istringstream &ls, const std::string &keyword)
定义
assumption_parse_intervals.cpp:27
LMCAS::assumption_detail::AssumptionParser::current_scope
int current_scope
定义
assumption_parser.hpp:43
LMCAS::assumption_detail::AssumptionParser::ctx
AssumptionContext ctx
定义
assumption_parser.hpp:41
LMCAS::assumption_detail::AssumptionParser::parse_sign
void parse_sign(std::istringstream &ls, const std::string &keyword)
定义
assumption_parse_properties.cpp:19
LMCAS::assumption_detail::AssumptionParser::parse_finiteness
void parse_finiteness(std::istringstream &ls, const std::string &keyword)
定义
assumption_parse_properties.cpp:91
LMCAS::assumption_detail::AssumptionParser::AssumptionParser
AssumptionParser(ComputationContext &context)
定义
assumption_parser.hpp:36
LMCAS::assumption_detail::AssumptionParser::parse_definiteness
void parse_definiteness(std::istringstream &ls, const std::string &keyword)
定义
assumption_parse_properties.cpp:105
LMCAS::assumption_detail::AssumptionParser::parse_scope
void parse_scope(std::istringstream &ls, const std::string &keyword)
定义
assumption_deserialization.cpp:73
LMCAS::assumption_detail::AssumptionParser::parse_monotonicity
void parse_monotonicity(std::istringstream &ls, const std::string &keyword)
定义
assumption_parse_intervals.cpp:52
computation_context.hpp
LMCAS::assumption_detail
定义
assumption_deserialization.cpp:3
LMCAS::assumption_detail::require_line_end
void require_line_end(std::istringstream &input, int line_num, const std::string &keyword)
定义
assumption_parse_atoms.cpp:64
LMCAS::detail::operation
ComputationContext const std::string & operation
定义
exact_algebraic.hpp:32
LMCAS
定义
assumption.hpp:11
LMCAS::context
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
定义
exact_factorization.hpp:65
LMCAS::CasErrc::InternalInvariant
@ InternalInvariant
定义
result.hpp:28
LMCAS::CasErrc::ResourceLimit
@ ResourceLimit
定义
result.hpp:25
LMCAS::CasErrc::ParseError
@ ParseError
定义
result.hpp:14
LMCAS::name
__attribute__((visibility("default"))) Result< EqvProfile > eqv_profile_from_name(const std const std::string & name
定义
equivalence_options.hpp:41
LMCAS::CasError
定义
result.hpp:31
src
assumption_deserialization.cpp
生成于
, 为 LMCAS使用
1.18.0