cmGeneratorExpressionLexer.cxx 1.8 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364
  1. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  2. file Copyright.txt or https://cmake.org/licensing for details. */
  3. #include "cmGeneratorExpressionLexer.h"
  4. cmGeneratorExpressionLexer::cmGeneratorExpressionLexer() = default;
  5. static void InsertText(const char* upto, const char* c,
  6. std::vector<cmGeneratorExpressionToken>& result)
  7. {
  8. if (upto != c) {
  9. result.emplace_back(cmGeneratorExpressionToken::Text, upto, c - upto);
  10. }
  11. }
  12. std::vector<cmGeneratorExpressionToken> cmGeneratorExpressionLexer::Tokenize(
  13. const std::string& input)
  14. {
  15. std::vector<cmGeneratorExpressionToken> result;
  16. if (input.find('$') == std::string::npos) {
  17. result.emplace_back(cmGeneratorExpressionToken::Text, input.c_str(),
  18. input.size());
  19. return result;
  20. }
  21. const char* c = input.c_str();
  22. const char* upto = c;
  23. for (; *c; ++c) {
  24. switch (*c) {
  25. case '$':
  26. if (c[1] == '<') {
  27. InsertText(upto, c, result);
  28. result.emplace_back(cmGeneratorExpressionToken::BeginExpression, c,
  29. 2);
  30. upto = c + 2;
  31. ++c;
  32. this->SawBeginExpression = true;
  33. }
  34. break;
  35. case '>':
  36. InsertText(upto, c, result);
  37. result.emplace_back(cmGeneratorExpressionToken::EndExpression, c, 1);
  38. upto = c + 1;
  39. this->SawGeneratorExpression = this->SawBeginExpression;
  40. break;
  41. case ':':
  42. InsertText(upto, c, result);
  43. result.emplace_back(cmGeneratorExpressionToken::ColonSeparator, c, 1);
  44. upto = c + 1;
  45. break;
  46. case ',':
  47. InsertText(upto, c, result);
  48. result.emplace_back(cmGeneratorExpressionToken::CommaSeparator, c, 1);
  49. upto = c + 1;
  50. break;
  51. default:
  52. break;
  53. }
  54. }
  55. InsertText(upto, c, result);
  56. return result;
  57. }