cmExprParser.y 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. %{
  2. /*=========================================================================
  3. Program: CMake - Cross-Platform Makefile Generator
  4. Module: $RCSfile$
  5. Language: C++
  6. Date: $Date$
  7. Version: $Revision$
  8. Copyright (c) 2002 Kitware, Inc., Insight Consortium. All rights reserved.
  9. See Copyright.txt or http://www.cmake.org/HTML/Copyright.html for details.
  10. This software is distributed WITHOUT ANY WARRANTY; without even
  11. the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
  12. PURPOSE. See the above copyright notices for more information.
  13. =========================================================================*/
  14. /*
  15. This file must be translated to C and modified to build everywhere.
  16. Run bison like this:
  17. bison --yacc --name-prefix=cmExpr_yy --defines=cmExprParserTokens.h -ocmExprParser.cxx cmExprParser.y
  18. Modify cmExprParser.cxx:
  19. - remove TABs
  20. - add __HP_aCC to the #if test for yyerrorlab warning suppression
  21. */
  22. /* Configure the parser to use a lexer object. */
  23. #define YYPARSE_PARAM yyscanner
  24. #define YYLEX_PARAM yyscanner
  25. #define YYERROR_VERBOSE 1
  26. #define cmExpr_yyerror(x) \
  27. cmExprError(yyscanner, x)
  28. #define yyGetParser (cmExpr_yyget_extra(yyscanner))
  29. /*-------------------------------------------------------------------------*/
  30. #include "cmExprParserHelper.h" /* Interface to parser object. */
  31. #include "cmExprLexer.h" /* Interface to lexer object. */
  32. #include "cmExprParserTokens.h" /* Need YYSTYPE for YY_DECL. */
  33. #include <math.h>
  34. /* Forward declare the lexer entry point. */
  35. YY_DECL;
  36. /* Internal utility functions. */
  37. static void cmExprError(yyscan_t yyscanner, const char* message);
  38. #define YYDEBUG 1
  39. //#define YYMAXDEPTH 100000
  40. //#define YYINITDEPTH 10000
  41. /* Disable some warnings in the generated code. */
  42. #ifdef __BORLANDC__
  43. # pragma warn -8004 /* Variable assigned a value that is not used. */
  44. #endif
  45. #ifdef _MSC_VER
  46. # pragma warning (disable: 4102) /* Unused goto label. */
  47. # pragma warning (disable: 4065) /* Switch statement contains default but no case. */
  48. #endif
  49. %}
  50. /* Generate a reentrant parser object. */
  51. %pure_parser
  52. /*-------------------------------------------------------------------------*/
  53. /* Tokens */
  54. %token exp_PLUS
  55. %token exp_MINUS
  56. %token exp_TIMES
  57. %token exp_DIVIDE
  58. %token exp_MOD
  59. %token exp_SHIFTLEFT
  60. %token exp_SHIFTRIGHT
  61. %token exp_OPENPARENT
  62. %token exp_CLOSEPARENT
  63. %token exp_OR;
  64. %token exp_AND;
  65. %token exp_XOR;
  66. %token exp_NOT;
  67. %token exp_NUMBER;
  68. /*-------------------------------------------------------------------------*/
  69. /* grammar */
  70. %%
  71. Start:
  72. exp
  73. {
  74. yyGetParser->SetResult($<Number>1);
  75. }
  76. exp:
  77. bitwiseor
  78. {$<Number>$ = $<Number>1;}
  79. |
  80. exp exp_OR bitwiseor
  81. {$<Number>$ = $<Number>1 | $<Number>3;}
  82. bitwiseor:
  83. bitwisexor
  84. {$<Number>$ = $<Number>1;}
  85. |
  86. bitwiseor exp_XOR bitwisexor
  87. {$<Number>$ = $<Number>1 ^ $<Number>3;}
  88. bitwisexor:
  89. bitwiseand
  90. {$<Number>$ = $<Number>1;}
  91. |
  92. bitwisexor exp_AND bitwiseand
  93. {$<Number>$ = $<Number>1 & $<Number>3;}
  94. bitwiseand:
  95. shift
  96. {$<Number>$ = $<Number>1;}
  97. |
  98. bitwiseand exp_SHIFTLEFT shift
  99. {$<Number>$ = $<Number>1 << $<Number>3;}
  100. |
  101. bitwiseand exp_SHIFTRIGHT shift
  102. {$<Number>$ = $<Number>1 >> $<Number>3;}
  103. shift:
  104. term
  105. {$<Number>$ = $<Number>1;}
  106. |
  107. shift exp_PLUS term
  108. {$<Number>$ = $<Number>1 + $<Number>3;}
  109. |
  110. shift exp_MINUS term
  111. {$<Number>$ = $<Number>1 - $<Number>3;}
  112. term:
  113. factor
  114. {$<Number>$ = $<Number>1;}
  115. |
  116. term exp_TIMES factor
  117. {$<Number>$ = $<Number>1 * $<Number>3;}
  118. |
  119. term exp_DIVIDE factor
  120. {$<Number>$ = $<Number>1 / $<Number>3;}
  121. |
  122. term exp_MOD factor
  123. {$<Number>$ = $<Number>1 % $<Number>3;}
  124. factor:
  125. exp_NUMBER
  126. {$<Number>$ = $<Number>1;}
  127. |
  128. exp_OPENPARENT exp exp_CLOSEPARENT
  129. {$<Number>$ = $<Number>2;}
  130. ;
  131. %%
  132. /* End of grammar */
  133. /*--------------------------------------------------------------------------*/
  134. void cmExprError(yyscan_t yyscanner, const char* message)
  135. {
  136. yyGetParser->Error(message);
  137. }