2 #ifndef _MADARA_EXPRESSION_VARIABLEEXPANDER_H_ 3 #define _MADARA_EXPRESSION_VARIABLEEXPANDER_H_ 5 #ifndef _MADARA_NO_KARL_ 35 bool & key_expansion_necessary,
36 std::vector< std::string> & splitters,
37 std::vector< std::string> & tokens,
38 std::vector< std::string> & pivot_list)
45 if (key.find (
"{") != key.npos)
48 "%s: Variable %s requires variable expansion.\n",
49 print_prefix.c_str (), key.c_str ());
51 key_expansion_necessary =
true;
52 splitters.push_back (
"{");
53 splitters.push_back (
"}");
57 if (pivot_list.size () % 2 != 0)
59 std::stringstream buffer;
60 buffer << print_prefix;
61 buffer <<
": KARL COMPILE ERROR: matching braces not found in ";
62 buffer << key <<
"\n";
64 buffer.str ().c_str ());
70 std::vector<std::string>::const_iterator pivot = pivot_list.begin ();
71 unsigned int num_opens = 0;
72 unsigned int num_closes = 0;
74 for (; pivot != pivot_list.end (); ++pivot)
80 else if (*pivot ==
"}")
86 if (num_opens > num_closes)
88 std::stringstream buffer;
89 buffer << print_prefix;
90 buffer <<
": KARL COMPILE ERROR: more opening braces than closing in ";
91 buffer << key <<
"\n";
93 buffer.str ().c_str ());
97 else if (num_closes > num_opens)
99 std::stringstream buffer;
100 buffer << print_prefix;
101 buffer <<
": KARL COMPILE ERROR: more closing braces than opening in ";
102 buffer << key <<
"\n";
104 buffer.str ().c_str ());
123 #endif // _MADARA_NO_KARL_
void tokenizer(const std::string &input, const ::std::vector< std::string > &splitters,::std::vector< std::string > &tokens,::std::vector< std::string > &pivots)
Split a string into tokens.
This class stores variables and their values for use by any entity needing state information in a thr...
madara::knowledge::VariableReference expand(const std::string &key, const std::string &print_prefix, madara::knowledge::ThreadSafeContext &context, madara::logger::Logger *cur_logger, bool &key_expansion_necessary, std::vector< std::string > &splitters, std::vector< std::string > &tokens, std::vector< std::string > &pivot_list)
Expands a key into either a VariableReference or tokens.
Optimized reference to a variable within the knowledge base.
A multi-threaded logger for logging to one or more destinations.
#define madara_logger_ptr_log(logger, level,...)
Fast version of the madara::logger::log method for Logger pointers.
VariableReference get_ref(const std::string &key, const KnowledgeReferenceSettings &settings=KnowledgeReferenceSettings())
Atomically returns a reference to the variable.
An exception for unrecoverable KaRL compilation issues.
Copyright (c) 2015 Carnegie Mellon University.