cmGeneratorExpressionLexer.cxx 2.5 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  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 char *input)
  29. {
  30. std::vector<cmGeneratorExpressionToken> result;
  31. if (!input)
  32. return result;
  33. const char *c = input;
  34. const char *upto = c;
  35. for ( ; *c; ++c)
  36. {
  37. if(c[0] == '$' && c[1] == '<')
  38. {
  39. InsertText(upto, c, result);
  40. upto = c;
  41. result.push_back(cmGeneratorExpressionToken(
  42. cmGeneratorExpressionToken::BeginExpression, upto, 2));
  43. upto = c + 2;
  44. ++c;
  45. SawBeginExpression = true;
  46. }
  47. else if(c[0] == '>')
  48. {
  49. InsertText(upto, c, result);
  50. upto = c;
  51. result.push_back(cmGeneratorExpressionToken(
  52. cmGeneratorExpressionToken::EndExpression, upto, 1));
  53. upto = c + 1;
  54. SawGeneratorExpression = SawBeginExpression;
  55. }
  56. else if(c[0] == ':')
  57. {
  58. InsertText(upto, c, result);
  59. upto = c;
  60. result.push_back(cmGeneratorExpressionToken(
  61. cmGeneratorExpressionToken::ColonSeparator, upto, 1));
  62. upto = c + 1;
  63. }
  64. else if(c[0] == ',')
  65. {
  66. InsertText(upto, c, result);
  67. upto = c;
  68. result.push_back(cmGeneratorExpressionToken(
  69. cmGeneratorExpressionToken::CommaSeparator, upto, 1));
  70. upto = c + 1;
  71. }
  72. }
  73. InsertText(upto, c, result);
  74. return result;
  75. }