cmGeneratorExpressionLexer.cxx 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  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. const char* c = input.c_str();
  21. const char* upto = c;
  22. for (; *c; ++c) {
  23. switch (*c) {
  24. case '$':
  25. if (c[1] == '<') {
  26. InsertText(upto, c, result);
  27. result.emplace_back(cmGeneratorExpressionToken::BeginExpression, c,
  28. 2);
  29. upto = c + 2;
  30. ++c;
  31. SawBeginExpression = true;
  32. }
  33. break;
  34. case '>':
  35. InsertText(upto, c, result);
  36. result.emplace_back(cmGeneratorExpressionToken::EndExpression, c, 1);
  37. upto = c + 1;
  38. SawGeneratorExpression = SawBeginExpression;
  39. break;
  40. case ':':
  41. InsertText(upto, c, result);
  42. result.emplace_back(cmGeneratorExpressionToken::ColonSeparator, c, 1);
  43. upto = c + 1;
  44. break;
  45. case ',':
  46. InsertText(upto, c, result);
  47. result.emplace_back(cmGeneratorExpressionToken::CommaSeparator, c, 1);
  48. upto = c + 1;
  49. break;
  50. default:
  51. break;
  52. }
  53. }
  54. InsertText(upto, c, result);
  55. return result;
  56. }