LMCAS
Lamina Computer Algebra System
载入中...
搜索中...
未找到
assumption_deserialization.cpp
浏览该文件的文档.
2
4
5AssumptionContext 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
30void 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[] = {
45 {"TRANSCENDENTAL", &AssumptionParser::parse_transcendental},
47 {"DEFINITENESS", &AssumptionParser::parse_definiteness},
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
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
96
97namespace LMCAS {
98
99AssumptionContext AssumptionContext::deserialize_impl(
100 const std::string& data, ComputationContext& context) {
102 return parser.parse(data);
103}
104
105Result<AssumptionContext> AssumptionContext::deserialize(const std::string& data) {
106 return deserialize_checked(data);
107}
108
109Result<AssumptionContext> AssumptionContext::deserialize_checked(
110 const std::string& data) {
112 return deserialize_checked(data, context);
113}
114
115Result<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) {
126 } catch (const std::bad_alloc&) {
129 "assumption deserialization allocation failed", operation);
130 } catch (const std::invalid_argument& ex) {
132 CasErrc::ParseError, ex.what(), operation);
133 } catch (const std::exception& ex) {
135 CasErrc::InternalInvariant, ex.what(), operation);
136 }
137}
138
139}
static Result failure(CasErrc code, std::string message, std::string operation={})
static Result success(T value)
void parse_relation(std::istringstream &ls, const std::string &keyword)
void parse_periodic(std::istringstream &ls, const std::string &keyword)
void parse_bounded(std::istringstream &ls, const std::string &keyword)
void parse_transcendental(std::istringstream &ls, const std::string &keyword)
void parse_parity(std::istringstream &ls, const std::string &keyword)
void parse_domain(std::istringstream &ls, const std::string &keyword)
AssumptionContext parse(const std::string &data)
void parse_conditional(std::istringstream &ls, const std::string &keyword)
void parse_continuity(std::istringstream &ls, const std::string &keyword)
void parse_sign(std::istringstream &ls, const std::string &keyword)
void parse_finiteness(std::istringstream &ls, const std::string &keyword)
void parse_definiteness(std::istringstream &ls, const std::string &keyword)
void parse_scope(std::istringstream &ls, const std::string &keyword)
void parse_monotonicity(std::istringstream &ls, const std::string &keyword)
void require_line_end(std::istringstream &input, int line_num, const std::string &keyword)
ComputationContext const std::string & operation
const std::vector< Polynomial< BigInt > > const BigInt ComputationContext & context
__attribute__((visibility("default"))) Result< EqvProfile > eqv_profile_from_name(const std const std::string & name