1
0

cmGeneratorExpressionLexer.cxx 2.6 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283
  1. /*============================================================================
  2. CMake - Cross Platform Makefile Generator
  3. Copyright 2012 Stephen Kelly <[email protected]>
  4. Distributed under the OSI-approved BSD License (the "License");
  5. see accompanying file Copyright.txt for details.
  6. This software is distributed WITHOUT ANY WARRANTY; without even the
  7. implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  8. See the License for more information.
  9. ============================================================================*/
  10. #include "cmGeneratorExpressionLexer.h"
  11. //----------------------------------------------------------------------------
  12. cmGeneratorExpressionLexer::cmGeneratorExpressionLexer()
  13. : SawBeginExpression(false), SawGeneratorExpression(false)
  14. {
  15. }
  16. //----------------------------------------------------------------------------
  17. static void InsertText(const char *upto, const char *c,
  18. std::vector<cmGeneratorExpressionToken> &result)
  19. {
  20. if (upto != c)
  21. {
  22. result.push_back(cmGeneratorExpressionToken(
  23. cmGeneratorExpressionToken::Text, upto, c - upto));
  24. }
  25. }
  26. //----------------------------------------------------------------------------
  27. std::vector<cmGeneratorExpressionToken>
  28. cmGeneratorExpressionLexer::Tokenize(const std::string& input)
  29. {
  30. std::vector<cmGeneratorExpressionToken> result;
  31. const char *c = input.c_str();
  32. const char *upto = c;
  33. for ( ; *c; ++c)
  34. {
  35. switch(*c)
  36. {
  37. case '$':
  38. if(c[1] == '<')
  39. {
  40. InsertText(upto, c, result);
  41. result.push_back(cmGeneratorExpressionToken(
  42. cmGeneratorExpressionToken::BeginExpression, c, 2));
  43. upto = c + 2;
  44. ++c;
  45. SawBeginExpression = true;
  46. }
  47. break;
  48. case '>':
  49. InsertText(upto, c, result);
  50. result.push_back(cmGeneratorExpressionToken(
  51. cmGeneratorExpressionToken::EndExpression, c, 1));
  52. upto = c + 1;
  53. SawGeneratorExpression = SawBeginExpression;
  54. break;
  55. case ':':
  56. InsertText(upto, c, result);
  57. result.push_back(cmGeneratorExpressionToken(
  58. cmGeneratorExpressionToken::ColonSeparator, c, 1));
  59. upto = c + 1;
  60. break;
  61. case ',':
  62. InsertText(upto, c, result);
  63. result.push_back(cmGeneratorExpressionToken(
  64. cmGeneratorExpressionToken::CommaSeparator, c, 1));
  65. upto = c + 1;
  66. break;
  67. default:
  68. break;
  69. }
  70. }
  71. InsertText(upto, c, result);
  72. return result;
  73. }