TuringSim
C++ framework to simulate abstract computing models
mConfigurationParser.h
1 #pragma once
2 
3 #include <state/mConfiguration/mConfiguration.h>
4 
22  public:
26  enum class TokenKind {
27  SEPARATOR,
28  LEFT,
29  RIGHT,
30  IDENT,
31  BLANK,
32  EOS,
33  };
34 
38  typedef std::tuple<TokenKind, size_t, size_t> Token;
39 
50 
58  MConfigurationParser(char left, char right, char separator, std::set<char> ignore, const std::string& variablePrefix);
59 
63  void checkInitialization() const;
64 
70  std::shared_ptr<const MConfiguration<std::string>> parse(const std::string& mConfiguration) const;
71 
77  std::string sub(const std::string& mConfiguration, const Token& token) const;
78 
84  Token tokenize(const std::string& mConfiguration, size_t start) const;
85 
90  std::vector<Token> tokenize(const std::string& mConfiguration) const;
91 
99  std::optional<Token> translateKeyword(const std::string& mConfiguration, const Token& token) const;
100 
105  void translateKeywords(const std::string& mConfiguration, std::vector<Token>& tokens) const;
106 
113  std::pair<bool, std::string> isVariableNode(const std::string& node) const;
114 
122  std::pair<std::shared_ptr<const MConfiguration<std::string>>, size_t> parse_tokens_m_func(const std::string& mConfiguration, const std::vector<Token>& tokens, size_t start) const;
123 
131  std::pair<std::vector<std::shared_ptr<const MConfiguration<std::string>>>, size_t> parse_tokens_m_func_list(const std::string& mConfiguration, const std::vector<Token>& tokens, size_t start) const;
132 
140  template<typename CharT, typename Traits>
141  friend std::basic_ostream<CharT, Traits>& operator<< (std::basic_ostream<CharT, Traits>& os, const TokenKind& tokenKind) {
143  switch(tokenKind) {
144  case TokenKind::IDENT:
145  os << "IDENT"; break;
146  case TokenKind::LEFT:
147  os << "LEFT"; break;
148  case TokenKind::RIGHT:
149  os << "RIGHT"; break;
151  os << "SEPARATOR"; break;
152  case TokenKind::BLANK:
153  os << "BLANK"; break;
154  case TokenKind::EOS:
155  os << "EOS";
156  }
157  return os;
158  }
159 
167  template<typename CharT, typename Traits>
168  friend std::basic_ostream<CharT, Traits>& operator<< (std::basic_ostream<CharT, Traits>& os, const Token& token) {
169  using Utils::Debug::operator<<;
170  return os << Utils::Debug::debug(token);
171  }
172  private:
173  char left{'('};
174  char right{')'};
175  char separator{','};
176  std::set<char> ignore{'\n', ' ', '\t'};
177  std::string variablePrefix{"_"};
178  };
179 
184  public:
189 
197  MConfigurationParserSyntaxErrorException(std::string message, std::string toParse, const std::vector<MConfigurationParser::Token>& tokens, size_t position , std::string additionalMessage=""):
198  Utils::MessageException(message),
200  toParse(toParse),
201  tokens(tokens),
203  {}
204 
205  protected:
206  virtual std::string makeFullMessage() const override {
207  using Utils::Debug::operator<<;
208  std::ostringstream ss;
209  ss << this->msg << std::endl;
210  if(!additionalMessage.empty()) {
211  ss << " " << additionalMessage << std::endl;
212  }
213  ss << " toParse: " << toParse << std::endl;
214  ss << " tokens (" << tokens.size() << "): " << Utils::Debug::debug(tokens) << std::endl;
215  ss << " position: " << position << std::endl;
216  if(position == tokens.size()) {
217  ss << " position at the end" << std::endl;
218  }
219  else if(position > tokens.size()) {
220  ss << " position after the end" << std::endl;
221  }
222  else {
223  ss << " token at position" << tokens[position] << std::endl;
224  }
225  return ss.str();
226  }
227 
230  std::string additionalMessage;
231 
234  std::string toParse;
235 
238  std::vector<MConfigurationParser::Token> tokens;
239 
242  size_t position;
243  };
244 
249  public:
254 
263  MConfigurationParserBadInitializationException(std::string message, char left, char right, char separator, std::set<char> ignore, const std::string& variablePrefix) :
264  Utils::MessageException(message),
265  left(left),
266  right(right),
268  ignore(ignore),
270  {}
271 
272  virtual std::string makeFullMessage() const override {
273  using Utils::Debug::operator<<;
274  std::ostringstream ss;
275  ss << this->msg << std::endl;
276  ss << " left: " << left << std::endl;
277  ss << " right: " << right << std::endl;
278  ss << " separator: " << separator << std::endl;
279  ss << " ignore: " << Utils::Debug::debug(ignore) << std::endl;
280  ss << " variablePrefix: " << variablePrefix << std::endl;
281  return ss.str();
282  }
283 
284  protected:
287  char left;
288 
291  char right;
292 
295  char separator;
296 
299  std::set<char> ignore;
300 
303  std::string variablePrefix;
304  };
305 }
TuringSim::State::MConfiguration::MConfigurationParser::TokenKind
TokenKind
Category of tokens.
Definition: mConfigurationParser.h:26
TuringSim::Utils::MessageException::MessageException
MessageException()=delete
a message exception must have an explicative message.
TuringSim::State::MConfiguration::MConfigurationParser::translateKeywords
void translateKeywords(const std::string &mConfiguration, std::vector< Token > &tokens) const
Translate a full sequence of tokens.
Definition: mConfigurationParser.cpp:102
TuringSim::State::MConfiguration::MConfigurationParser::checkInitialization
void checkInitialization() const
Check if parameters of the parser are consistent. This function is called by constructors.
Definition: mConfigurationParser.cpp:4
TuringSim::State::MConfiguration::MConfigurationParser::MConfigurationParser
MConfigurationParser()
Builds MConfigurationParser with default parameters.
Definition: mConfigurationParser.cpp:32
TuringSim::Utils::MessageException::msg
std::string msg
The error message.
Definition: messageException.h:78
TuringSim::State::MConfiguration::MConfigurationParser::TokenKind::LEFT
@ LEFT
The left parenthesis.
TuringSim::Utils::MessageException
The Base class for all custom exceptions.
Definition: messageException.h:12
TuringSim::State::MConfiguration::MConfigurationParser::TokenKind::EOS
@ EOS
The token at the end of the string.
TuringSim::State::MConfiguration::MConfigurationParserSyntaxErrorException::position
size_t position
Where the error happened.
Definition: mConfigurationParser.h:242
TuringSim::State::MConfiguration::MConfigurationParserSyntaxErrorException
Exception launched when we try to parse a string with a syntax error as a MConfiguration<std::string>...
Definition: mConfigurationParser.h:183
TuringSim::State::MConfiguration::MConfigurationParser::TokenKind::IDENT
@ IDENT
Node names.
TuringSim::State::MConfiguration::MConfigurationParserBadInitializationException::MConfigurationParserBadInitializationException
MConfigurationParserBadInitializationException(std::string message, char left, char right, char separator, std::set< char > ignore, const std::string &variablePrefix)
Builds a MConfigurationParserBadInitializationException.
Definition: mConfigurationParser.h:263
TuringSim::State::MConfiguration::MConfigurationParserSyntaxErrorException::additionalMessage
std::string additionalMessage
An optional additional message, depending on the context.
Definition: mConfigurationParser.h:230
TuringSim::State::MConfiguration::MConfigurationParser::operator<<
friend std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &os, const TokenKind &tokenKind)
Debug printer of TokenKind.
Definition: mConfigurationParser.h:141
TuringSim::State::MConfiguration::MConfigurationParserSyntaxErrorException::makeFullMessage
virtual std::string makeFullMessage() const override
Build the full error message. It should be overridden by derived class that adds data to the exceptio...
Definition: mConfigurationParser.h:206
TuringSim::State::MConfiguration::MConfigurationParser::translateKeyword
std::optional< Token > translateKeyword(const std::string &mConfiguration, const Token &token) const
Translate a single token by recognizing keyword.
Definition: mConfigurationParser.cpp:92
TuringSim::State::MConfiguration::MConfigurationParser
Parse a m-configuration written as a std::string into a MConfiguration<std::string>.
Definition: mConfigurationParser.h:21
TuringSim::State::MConfiguration::MConfigurationParser::TokenKind::BLANK
@ BLANK
The keyword "blank" for blank symbol.
TuringSim::State::MConfiguration::MConfigurationParser::parse_tokens_m_func_list
std::pair< std::vector< std::shared_ptr< const MConfiguration< std::string > > >, size_t > parse_tokens_m_func_list(const std::string &mConfiguration, const std::vector< Token > &tokens, size_t start) const
Parse a SEPARATOR-separated list of m-configuration starting at position start.
Definition: mConfigurationParser.cpp:198
TuringSim::State::MConfiguration::MConfigurationParserBadInitializationException::right
char right
The closing delimiter.
Definition: mConfigurationParser.h:291
TuringSim::State::MConfiguration::MConfigurationParserBadInitializationException::separator
char separator
The separator between terms in lists.
Definition: mConfigurationParser.h:295
TuringSim::State::MConfiguration::MConfigurationParser::parse_tokens_m_func
std::pair< std::shared_ptr< const MConfiguration< std::string > >, size_t > parse_tokens_m_func(const std::string &mConfiguration, const std::vector< Token > &tokens, size_t start) const
Parse a m-configuration starting at position start.
Definition: mConfigurationParser.cpp:130
TuringSim::State::MConfiguration::MConfigurationParser::TokenKind::RIGHT
@ RIGHT
The right parenthesis.
TuringSim::State::MConfiguration::MConfigurationParser::isVariableNode
std::pair< bool, std::string > isVariableNode(const std::string &node) const
Test is a raw node name is a variable name. A node name is a variable name if it starts with the vari...
Definition: mConfigurationParser.cpp:118
TuringSim::State::MConfiguration::MConfigurationParser::Token
std::tuple< TokenKind, size_t, size_t > Token
Type of tokens: the first component is the category, the second is the starting character,...
Definition: mConfigurationParser.h:38
TuringSim::State::MConfiguration::MConfigurationParser::tokenize
Token tokenize(const std::string &mConfiguration, size_t start) const
Lex a single token.
Definition: mConfigurationParser.cpp:62
TuringSim::State::MConfiguration::MConfigurationParserBadInitializationException::left
char left
The opening delimiter.
Definition: mConfigurationParser.h:287
TuringSim::State::MConfiguration::MConfigurationParserBadInitializationException::variablePrefix
std::string variablePrefix
the prefix used to mark variable nodes.
Definition: mConfigurationParser.h:303
TuringSim::State::MConfiguration::MConfigurationParserSyntaxErrorException::tokens
std::vector< MConfigurationParser::Token > tokens
The list of tokens we parse.
Definition: mConfigurationParser.h:238
TuringSim::State::MConfiguration::MConfigurationParserSyntaxErrorException::toParse
std::string toParse
The input string.
Definition: mConfigurationParser.h:234
TuringSim::State::MConfiguration::MConfigurationParser::TokenKind::SEPARATOR
@ SEPARATOR
Separator of terms.
TuringSim::State::MConfiguration::MConfigurationParserBadInitializationException::makeFullMessage
virtual std::string makeFullMessage() const override
Build the full error message. It should be overridden by derived class that adds data to the exceptio...
Definition: mConfigurationParser.h:272
TuringSim::State::MConfiguration::MConfigurationParserSyntaxErrorException::MConfigurationParserSyntaxErrorException
MConfigurationParserSyntaxErrorException()=delete
Deleted default constructor: a MConfigurationParserSyntaxErrorException must contain interesting info...
TuringSim::State::MConfiguration::MConfigurationParserBadInitializationException
Exception thrown when the special characters of the parser are not consistent.
Definition: mConfigurationParser.h:248
TuringSim::State::MConfiguration::MConfigurationParserBadInitializationException::MConfigurationParserBadInitializationException
MConfigurationParserBadInitializationException()=delete
Deleted default constructor: a MConfigurationParserBadInitializationException must contain interestin...
TuringSim::Utils::Debug::debug
std::function< std::basic_ostream< CharT, Traits > &(std::basic_ostream< CharT, Traits > &)> debug(const T &s)
Generic debug printing function.
Definition: printer.h:34
TuringSim::State::MConfiguration::MConfigurationParser::sub
std::string sub(const std::string &mConfiguration, const Token &token) const
Get the text of a token.
Definition: mConfigurationParser.cpp:111
TuringSim::State::MConfiguration::MConfigurationParserSyntaxErrorException::MConfigurationParserSyntaxErrorException
MConfigurationParserSyntaxErrorException(std::string message, std::string toParse, const std::vector< MConfigurationParser::Token > &tokens, size_t position, std::string additionalMessage="")
Builds a MConfigurationParserSyntaxErrorException.
Definition: mConfigurationParser.h:197
TuringSim::State::MConfiguration
The namespace of everything about m-configurations.
TuringSim::State::MConfiguration::MConfigurationParser::parse
std::shared_ptr< const MConfiguration< std::string > > parse(const std::string &mConfiguration) const
Parse a string into a m-configuration. The usual entry point.
Definition: mConfigurationParser.cpp:41
TuringSim::State::MConfiguration::MConfigurationParserBadInitializationException::ignore
std::set< char > ignore
Set of characters to ignore.
Definition: mConfigurationParser.h:299