TuringSim
C++ framework to simulate abstract computing models
turingStyleMixedSymbolPatternParser.h
1 #pragma once
2 
3 #include <utils/messageException.h>
4 #include <symbol/turingMachineSymbolPattern.h>
5 
6 namespace TuringSim::Symbol {
37  public:
41  enum class TokenKind {
42  SEPARATOR,
43  LEFT,
44  RIGHT,
45  IDENT,
46  NONE,
47  NON,
48  ANY,
49  TRUE,
50  EOS,
51  };
52 
56  typedef std::tuple<TokenKind, size_t, size_t> Token;
57 
70 
80  TuringStyleMixedSymbolPatternParser(char left, char right, char separator, std::string blank, std::set<char> ignore, std::string variablePrefix, std::string escapePrefix);
81 
85  void checkInitialization() const;
86 
92  SymbolPattern parse(const std::string& pattern) const;
93 
100  std::pair<bool, std::string> isVariableNode(const std::string& node) const;
101 
109  std::pair<SymbolPattern, size_t> parse_negative_pattern(const std::string& pattern, const std::vector <Token>& tokens, size_t position) const;
110 
118  std::pair<SymbolPattern, size_t> parse_positive_pattern(const std::string& pattern, const std::vector <Token>& tokens, size_t position) const;
119 
125  std::string sub(const std::string& pattern, const TuringStyleMixedSymbolPatternParser::Token& token) const;
126 
131  std::vector<Token> tokenize(const std::string& pattern) const;
132 
138  Token tokenize(const std::string& pattern, size_t start) const;
139 
147  std::optional<Token> translateKeyword(const std::string& pattern, const TuringStyleMixedSymbolPatternParser::Token& token) const;
148 
153  void translateKeywords(const std::string& pattern, std::vector <Token>& tokens) const;
154 
162  template<typename CharT, typename Traits = std::char_traits <CharT>>
163  friend std::basic_ostream <CharT, Traits>& operator<<(std::basic_ostream <CharT, Traits>& os, const TokenKind& tokenKind) {
164  switch (tokenKind) {
165  case TokenKind::IDENT:
166  os << "IDENT";
167  break;
168  case TokenKind::LEFT:
169  os << "LEFT";
170  break;
171  case TokenKind::RIGHT:
172  os << "RIGHT";
173  break;
175  os << "SEPARATOR";
176  break;
177  case TokenKind::EOS:
178  os << "EOS";
179  break;
180  case TokenKind::NON:
181  os << "NON";
182  break;
183  case TokenKind::NONE:
184  os << "NONE";
185  break;
186  case TokenKind::ANY:
187  os << "ANY";
188  break;
189  case TokenKind::TRUE:
190  os << "TRUE";
191  break;
192  }
193  return os;
194  }
195 
203  template<typename CharT, typename Traits>
204  friend std::basic_ostream <CharT, Traits>& operator<<(std::basic_ostream <CharT, Traits>& os, const Token& token) {
205  using Utils::Debug::operator<<;
206  return os << Utils::Debug::debug(token);
207  }
208 
209  private:
210  char left = '(';
211  char right = ')';
212  char separator = ',';
213  std::string blank = "";
214  std::set<char> ignore{'\n', ' ', '\t'};
215  std::string variablePrefix = "_";
216  std::string escapePrefix = "\\";
217  };
218 
223  public:
228 
240  std::string message,
241  char left,
242  char right,
243  char separator,
244  std::string blank,
245  std::set<char> ignore,
246  const std::string& variablePrefix,
247  const std::string& escapePrefix
248  ) :
249  Utils::MessageException(message),
250  left(left),
251  right(right),
253  blank(blank),
254  ignore(ignore),
257  {}
258 
259  virtual std::string makeFullMessage() const override {
260  using Utils::Debug::operator<<;
261  std::ostringstream ss;
262  ss << this->msg << std::endl;
263  ss << " left: " << left << std::endl;
264  ss << " right: " << right << std::endl;
265  ss << " separator: " << separator << std::endl;
266  ss << " blank: " << blank << std::endl;
267  ss << " ignore: " << Utils::Debug::debug(ignore) << std::endl;
268  ss << " variablePrefix: " << variablePrefix << std::endl;
269  ss << " escapePrefix: " << escapePrefix << std::endl;
270  return ss.str();
271  }
272 
273  protected:
276  char left;
279  char right;
282  char separator;
285  std::string blank;
288  std::set<char> ignore;
291  std::string variablePrefix;
294  std::string escapePrefix;
295  };
296 
301  public:
306 
315  std::string message,
316  std::string toParse,
317  const std::vector<TuringStyleMixedSymbolPatternParser::Token>& tokens,
318  size_t position,
319  std::string additionalMessage = "") :
320  Utils::MessageException(message),
322  toParse(toParse),
323  tokens(tokens),
324  position(position) {}
325 
326  protected:
327  virtual std::string makeFullMessage() const override {
328  using Utils::Debug::operator<<;
329  std::ostringstream ss;
330  ss << this->msg << std::endl;
331  if (!additionalMessage.empty()) {
332  ss << " " << additionalMessage << std::endl;
333  }
334  ss << " toParse: " << toParse << std::endl;
335  ss << " tokens (" << tokens.size() << "): " << Utils::Debug::debug(tokens) << std::endl;
336  ss << " position: " << position << std::endl;
337  if (position == tokens.size()) {
338  ss << " position at the end" << std::endl;
339  } else if (position > tokens.size()) {
340  ss << " position after the end" << std::endl;
341  } else {
342  ss << " token at position" << tokens[position] << std::endl;
343  }
344  return ss.str();
345  }
346 
349  std::string additionalMessage;
352  std::string toParse;
355  std::vector <TuringStyleMixedSymbolPatternParser::Token> tokens;
358  size_t position;
359  };
360 }
TuringSim::Utils::MessageException::MessageException
MessageException()=delete
a message exception must have an explicative message.
TuringSim::Symbol::TuringStyleMixedSymbolPatternSyntaxErrorException
Exception launched when we try to parse a string with a syntax error as a MConfiguration<std::string>...
Definition: turingStyleMixedSymbolPatternParser.h:300
TuringSim::Symbol::TuringStyleMixedSymbolPatternParser::TokenKind::EOS
@ EOS
The token at the end of the string.
TuringSim::Symbol::TuringStyleMixedSymbolPatternParser::operator<<
friend std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &os, const Token &token)
Debug printer of Token.
Definition: turingStyleMixedSymbolPatternParser.h:204
TuringSim::Symbol::TuringStyleMixedSymbolPatternParserBadInitializationException::left
char left
Opening delimiter.
Definition: turingStyleMixedSymbolPatternParser.h:276
TuringSim::Symbol::TuringStyleMixedSymbolPatternParserBadInitializationException::ignore
std::set< char > ignore
Characters to ignore.
Definition: turingStyleMixedSymbolPatternParser.h:288
TuringSim::Symbol::TuringStyleMixedSymbolPatternParser::TokenKind::ANY
@ ANY
"any" keyword.
TuringSim::Utils::MessageException::msg
std::string msg
The error message.
Definition: messageException.h:78
TuringSim::Symbol::TuringStyleMixedSymbolPatternParserBadInitializationException::TuringStyleMixedSymbolPatternParserBadInitializationException
TuringStyleMixedSymbolPatternParserBadInitializationException()=delete
Deleted default constructor: a SymbolPatternParserInitializationError must contain interesting inform...
TuringSim::Utils::MessageException
The Base class for all custom exceptions.
Definition: messageException.h:12
TuringSim::Symbol::TuringStyleMixedSymbolPatternParserBadInitializationException::escapePrefix
std::string escapePrefix
Prefix to escape keywords.
Definition: turingStyleMixedSymbolPatternParser.h:294
TuringSim::Symbol::TuringStyleMixedSymbolPatternParserBadInitializationException::TuringStyleMixedSymbolPatternParserBadInitializationException
TuringStyleMixedSymbolPatternParserBadInitializationException(std::string message, char left, char right, char separator, std::string blank, std::set< char > ignore, const std::string &variablePrefix, const std::string &escapePrefix)
Builds a SymbolPatternParserInitializationError.
Definition: turingStyleMixedSymbolPatternParser.h:239
TuringSim::Symbol::TuringStyleMixedSymbolPatternParser
A parser of mixed symbol pattern where symbols are std::string
Definition: turingStyleMixedSymbolPatternParser.h:35
TuringSim::Symbol
The namespace for symbol patterns.
Definition: simpleSymbolPattern.h:5
TuringSim::Symbol::TuringStyleMixedSymbolPatternParser::sub
std::string sub(const std::string &pattern, const TuringStyleMixedSymbolPatternParser::Token &token) const
Get the text of a token.
Definition: turingStyleMixedSymbolPatternParser.cpp:262
TuringSim::Symbol::TuringStyleMixedSymbolPatternParserBadInitializationException::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: turingStyleMixedSymbolPatternParser.h:259
TuringSim::Symbol::TuringStyleMixedSymbolPatternParserBadInitializationException
Exception thrown when the special characters of a SymbolPatternParser are not consistent.
Definition: turingStyleMixedSymbolPatternParser.h:222
TuringSim::Symbol::TuringStyleMixedSymbolPatternParser::operator<<
friend std::basic_ostream< CharT, Traits > & operator<<(std::basic_ostream< CharT, Traits > &os, const TokenKind &tokenKind)
Debug printer of TokenKind.
Definition: turingStyleMixedSymbolPatternParser.h:163
TuringSim::Symbol::TuringStyleMixedSymbolPatternParserBadInitializationException::blank
std::string blank
Blank string..
Definition: turingStyleMixedSymbolPatternParser.h:285
TuringSim::Symbol::TuringStyleMixedSymbolPatternParser::TokenKind::TRUE
@ TRUE
"true" keyword.
TuringSim::Symbol::TuringStyleMixedSymbolPatternParser::TokenKind::IDENT
@ IDENT
Symbols.
TuringSim::Symbol::TuringStyleMixedSymbolPatternParser::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: turingStyleMixedSymbolPatternParser.cpp:112
TuringSim::Symbol::TuringStyleMixedSymbolPatternSyntaxErrorException::TuringStyleMixedSymbolPatternSyntaxErrorException
TuringStyleMixedSymbolPatternSyntaxErrorException()=delete
Deleted default constructor: a TuringStyleMixedSymbolPatternSyntaxErrorException must contain interes...
TuringSim::Symbol::TuringStyleMixedSymbolPatternParser::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: turingStyleMixedSymbolPatternParser.h:56
TuringSim::Symbol::TuringStyleMixedSymbolPatternSyntaxErrorException::TuringStyleMixedSymbolPatternSyntaxErrorException
TuringStyleMixedSymbolPatternSyntaxErrorException(std::string message, std::string toParse, const std::vector< TuringStyleMixedSymbolPatternParser::Token > &tokens, size_t position, std::string additionalMessage="")
Builds a TuringStyleMixedSymbolPatternSyntaxErrorException.
Definition: turingStyleMixedSymbolPatternParser.h:314
TuringSim::Symbol::TuringStyleMixedSymbolPatternSyntaxErrorException::toParse
std::string toParse
the string we try to parse.
Definition: turingStyleMixedSymbolPatternParser.h:352
TuringSim::Symbol::TuringStyleMixedSymbolPatternParser::TokenKind::RIGHT
@ RIGHT
Right parenthesis.
TuringSim::Symbol::TuringStyleMixedSymbolPattern< std::string >
TuringSim::Symbol::TuringStyleMixedSymbolPatternParserBadInitializationException::right
char right
Closing delimiter.
Definition: turingStyleMixedSymbolPatternParser.h:279
TuringSim::Symbol::TuringStyleMixedSymbolPatternSyntaxErrorException::tokens
std::vector< TuringStyleMixedSymbolPatternParser::Token > tokens
The list of tokens.
Definition: turingStyleMixedSymbolPatternParser.h:355
TuringSim::Symbol::TuringStyleMixedSymbolPatternParser::parse
SymbolPattern parse(const std::string &pattern) const
Parse a string into a symbol pattern. The usual entry point.
Definition: turingStyleMixedSymbolPatternParser.cpp:70
TuringSim::Symbol::TuringStyleMixedSymbolPatternParser::parse_negative_pattern
std::pair< SymbolPattern, size_t > parse_negative_pattern(const std::string &pattern, const std::vector< Token > &tokens, size_t position) const
Parse a negative list of symbols.
Definition: turingStyleMixedSymbolPatternParser.cpp:124
TuringSim::Symbol::TuringStyleMixedSymbolPatternParser::TuringStyleMixedSymbolPatternParser
TuringStyleMixedSymbolPatternParser()
Builds TuringStyleMixedSymbolPatternParser with default parameters.
Definition: turingStyleMixedSymbolPatternParser.cpp:61
TuringSim::Symbol::TuringStyleMixedSymbolPatternParser::TokenKind::NON
@ NON
"non" keyword.
TuringSim::Symbol::TuringStyleMixedSymbolPatternParser::TokenKind::LEFT
@ LEFT
Left parenthesis.
TuringSim::Symbol::TuringStyleMixedSymbolPatternSyntaxErrorException::position
size_t position
Definition: turingStyleMixedSymbolPatternParser.h:358
TuringSim::Symbol::TuringStyleMixedSymbolPatternParser::parse_positive_pattern
std::pair< SymbolPattern, size_t > parse_positive_pattern(const std::string &pattern, const std::vector< Token > &tokens, size_t position) const
Parse a positive list of symbols.
Definition: turingStyleMixedSymbolPatternParser.cpp:197
TuringSim::Symbol::TuringStyleMixedSymbolPatternParser::TokenKind::NONE
@ NONE
"none" keyword.
TuringSim::Symbol::TuringStyleMixedSymbolPatternParser::TokenKind
TokenKind
Category of tokens.
Definition: turingStyleMixedSymbolPatternParser.h:41
TuringSim::Symbol::TuringStyleMixedSymbolPatternParserBadInitializationException::separator
char separator
The separator in lists.
Definition: turingStyleMixedSymbolPatternParser.h:282
TuringSim::Symbol::TuringStyleMixedSymbolPatternParser::checkInitialization
void checkInitialization() const
Check if parameters of the parser are consistent. This function is called by constructors.
Definition: turingStyleMixedSymbolPatternParser.cpp:5
TuringSim::Symbol::TuringStyleMixedSymbolPatternParser::translateKeyword
std::optional< Token > translateKeyword(const std::string &pattern, const TuringStyleMixedSymbolPatternParser::Token &token) const
Translate a single token by recognizing keyword.
Definition: turingStyleMixedSymbolPatternParser.cpp:298
TuringSim::Symbol::TuringStyleMixedSymbolPatternParser::tokenize
std::vector< Token > tokenize(const std::string &pattern) const
Fully lex a string, without recognizing keyword.
Definition: turingStyleMixedSymbolPatternParser.cpp:269
TuringSim::Symbol::TuringStyleMixedSymbolPatternSyntaxErrorException::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: turingStyleMixedSymbolPatternParser.h:327
TuringSim::Symbol::TuringStyleMixedSymbolPatternSyntaxErrorException::additionalMessage
std::string additionalMessage
Additional error message.
Definition: turingStyleMixedSymbolPatternParser.h:349
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::Symbol::TuringStyleMixedSymbolPatternParser::TokenKind::SEPARATOR
@ SEPARATOR
Separator of symbols, usually, the comma.
TuringSim::Symbol::TuringStyleMixedSymbolPatternParserBadInitializationException::variablePrefix
std::string variablePrefix
Prefix to mark variable names.
Definition: turingStyleMixedSymbolPatternParser.h:291
TuringSim::Symbol::TuringStyleMixedSymbolPatternParser::translateKeywords
void translateKeywords(const std::string &pattern, std::vector< Token > &tokens) const
Translate a full sequence of tokens.
Definition: turingStyleMixedSymbolPatternParser.cpp:318