cmGeneratorExpressionLexer.cxx 1.9 KB

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