cmGeneratorExpressionLexer.cxx 1.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566
  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()
  5. {
  6. }
  7. static void InsertText(const char* upto, const char* c,
  8. std::vector<cmGeneratorExpressionToken>& result)
  9. {
  10. if (upto != c) {
  11. result.emplace_back(cmGeneratorExpressionToken::Text, upto, c - upto);
  12. }
  13. }
  14. std::vector<cmGeneratorExpressionToken> cmGeneratorExpressionLexer::Tokenize(
  15. const std::string& input)
  16. {
  17. std::vector<cmGeneratorExpressionToken> result;
  18. if (input.find('$') == std::string::npos) {
  19. result.emplace_back(cmGeneratorExpressionToken::Text, input.c_str(),
  20. input.size());
  21. return result;
  22. }
  23. const char* c = input.c_str();
  24. const char* upto = c;
  25. for (; *c; ++c) {
  26. switch (*c) {
  27. case '$':
  28. if (c[1] == '<') {
  29. InsertText(upto, c, result);
  30. result.emplace_back(cmGeneratorExpressionToken::BeginExpression, c,
  31. 2);
  32. upto = c + 2;
  33. ++c;
  34. SawBeginExpression = true;
  35. }
  36. break;
  37. case '>':
  38. InsertText(upto, c, result);
  39. result.emplace_back(cmGeneratorExpressionToken::EndExpression, c, 1);
  40. upto = c + 1;
  41. SawGeneratorExpression = SawBeginExpression;
  42. break;
  43. case ':':
  44. InsertText(upto, c, result);
  45. result.emplace_back(cmGeneratorExpressionToken::ColonSeparator, c, 1);
  46. upto = c + 1;
  47. break;
  48. case ',':
  49. InsertText(upto, c, result);
  50. result.emplace_back(cmGeneratorExpressionToken::CommaSeparator, c, 1);
  51. upto = c + 1;
  52. break;
  53. default:
  54. break;
  55. }
  56. }
  57. InsertText(upto, c, result);
  58. return result;
  59. }