1 #include <state/mConfiguration/mConfigurationParser.h>
5 std::set<char> symbols {left, right, separator};
6 if(symbols.size() != 3) {
8 "Left, right and separator should be distinct.",
9 left, right, separator, ignore, variablePrefix);
12 if(symbols.count(i) > 0) {
14 "Left, right and separator should not be ignore characters.",
15 left, right, separator, ignore, variablePrefix);
18 for(
char c: variablePrefix) {
19 if(symbols.count(c) > 0) {
21 "variablePrefix should not contain delimiters and separators.",
22 left, right, separator, ignore, variablePrefix);
24 if(ignore.count(c) > 0) {
26 "variablePrefix should not contain ignore characters",
27 left, right, separator, ignore, variablePrefix);
37 : left(left), right(right), separator(separator), ignore(ignore), variablePrefix(variablePrefix) {
42 std::vector<Token> tokens =
tokenize(m_fun);
46 if(position != tokens.size() - 1) {
47 using Utils::Debug::operator<<;
49 ss <<
"parsed: " << parsed;
53 using Utils::Debug::operator<<;
55 ss <<
"parsed: " << parsed;
63 for(; start < m_fun.size() && ignore.count(m_fun[start]) != 0; ++start)
65 if(start == m_fun.size())
67 if(m_fun[start] == left)
69 if(m_fun[start] == right)
71 if(m_fun[start] == separator)
74 for(end = start; end < m_fun.size() && ignore.count(m_fun[end]) == 0 && m_fun[end] != left && m_fun[end] != right && m_fun[end] != separator; ++end)
80 std::vector<Token> tokens;
87 start = std::get<2>(t) + 1;
94 return std::optional<Token>(std::nullopt);
95 std::string name =
sub(pattern, token);
98 return std::make_optional(std::make_tuple(
TokenKind::BLANK, std::get<1>(token), std::get<2>(token)));
99 return std::optional<Token>(std::nullopt);
103 for(
size_t i = 0; i < tokens.size(); ++i) {
104 const Token& token = tokens[i];
107 tokens[i] = new_token.value();
113 std::tie(std::ignore, begin, end) = token;
114 size_t len = end - begin + 1;
115 return m_fun.substr(begin, len);
119 size_t nodeLen = variablePrefix.size();
120 size_t prefixLen = variablePrefix.size();
121 if(nodeLen < prefixLen) {
122 return {
false, node};
124 if(variablePrefix == node.substr(0, prefixLen)) {
125 return {
true, node.substr(prefixLen)};
127 return {
false, node};
131 const std::string& m_fun,
132 const std::vector<Token>& tokens,
133 size_t position)
const {
134 using namespace std::string_literals;
135 size_t l = tokens.size();
141 bool explicitBlank =
false;
143 switch(std::get<0>(tokens[position])) {
145 node =
sub(m_fun, tokens[position]);
149 explicitBlank =
true;
160 std::function<std::shared_ptr<const MConfiguration<std::string>>(std::string)> make_leaf =
161 [&](
const std::string& node_str) -> std::shared_ptr<const MConfiguration<std::string>> {
162 if(!explicitBlank && node_str.empty()) {
166 return std::make_shared<const MConfiguration<std::string>>(nodeName, isVariable);
169 switch(std::get<0>(tokens[position])) {
171 return {make_leaf(node), position};
178 return {make_leaf(node), position};
180 std::vector<std::shared_ptr<const MConfiguration<std::string>>> params;
183 switch(std::get<0>(tokens[position])){
185 return {std::make_shared<const MConfiguration<std::string>>(node, params), position + 1};
199 std::vector<std::shared_ptr<const MConfiguration<std::string>>> params;
206 using Utils::Debug::operator<<;
207 std::stringstream ss;
208 ss <<
"new_position: " << new_position;
212 position = new_position;
213 params.push_back(param);
216 throw make_exception(
"Expected delimiter or right parenthesis, got an identifier");
219 throw make_exception(
"Expected delimiter or right parenthesis, got a left parenthesis");
222 throw make_exception(
"Expected delimiter or right parenthesis, got end of string");
232 return {params, position};