cmExprParser.y 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. %{
  2. /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
  3. file Copyright.txt or https://cmake.org/licensing for details. */
  4. /*
  5. This file must be translated to C and modified to build everywhere.
  6. Run bison like this:
  7. bison --yacc --name-prefix=cmExpr_yy --defines=cmExprParserTokens.h -ocmExprParser.cxx cmExprParser.y
  8. Modify cmExprParser.cxx:
  9. - "#if 0" out yyerrorlab block in range ["goto yyerrlab1", "yyerrlab1:"]
  10. */
  11. #include "cmConfigure.h" // IWYU pragma: keep
  12. #include <stdlib.h>
  13. #include <string.h>
  14. /*-------------------------------------------------------------------------*/
  15. #define YYDEBUG 1
  16. #include "cmExprParserHelper.h" /* Interface to parser object. */
  17. #include "cmExprLexer.h" /* Interface to lexer object. */
  18. #include "cmExprParserTokens.h" /* Need YYSTYPE for YY_DECL. */
  19. /* Forward declare the lexer entry point. */
  20. YY_DECL;
  21. /* Helper function to forward error callback from parser. */
  22. static void cmExpr_yyerror(yyscan_t yyscanner, const char* message);
  23. /* Disable some warnings in the generated code. */
  24. #ifdef _MSC_VER
  25. # pragma warning (disable: 4102) /* Unused goto label. */
  26. # pragma warning (disable: 4065) /* Switch statement contains default but no case. */
  27. #endif
  28. %}
  29. /* Generate a reentrant parser object. */
  30. %define api.pure
  31. /* Configure the parser to use a lexer object. */
  32. %lex-param {yyscan_t yyscanner}
  33. %parse-param {yyscan_t yyscanner}
  34. %define parse.error verbose
  35. /*-------------------------------------------------------------------------*/
  36. /* Tokens */
  37. %token exp_PLUS
  38. %token exp_MINUS
  39. %token exp_TIMES
  40. %token exp_DIVIDE
  41. %token exp_MOD
  42. %token exp_SHIFTLEFT
  43. %token exp_SHIFTRIGHT
  44. %token exp_OPENPARENT
  45. %token exp_CLOSEPARENT
  46. %token exp_OR;
  47. %token exp_AND;
  48. %token exp_XOR;
  49. %token exp_NOT;
  50. %token exp_NUMBER;
  51. /*-------------------------------------------------------------------------*/
  52. /* grammar */
  53. %%
  54. start:
  55. exp {
  56. cmExpr_yyget_extra(yyscanner)->SetResult($<Number>1);
  57. }
  58. exp:
  59. bitwiseor {
  60. $<Number>$ = $<Number>1;
  61. }
  62. | exp exp_OR bitwiseor {
  63. $<Number>$ = $<Number>1 | $<Number>3;
  64. }
  65. bitwiseor:
  66. bitwisexor {
  67. $<Number>$ = $<Number>1;
  68. }
  69. | bitwiseor exp_XOR bitwisexor {
  70. $<Number>$ = $<Number>1 ^ $<Number>3;
  71. }
  72. bitwisexor:
  73. bitwiseand {
  74. $<Number>$ = $<Number>1;
  75. }
  76. | bitwisexor exp_AND bitwiseand {
  77. $<Number>$ = $<Number>1 & $<Number>3;
  78. }
  79. bitwiseand:
  80. shift {
  81. $<Number>$ = $<Number>1;
  82. }
  83. | bitwiseand exp_SHIFTLEFT shift {
  84. $<Number>$ = $<Number>1 << $<Number>3;
  85. }
  86. | bitwiseand exp_SHIFTRIGHT shift {
  87. $<Number>$ = $<Number>1 >> $<Number>3;
  88. }
  89. shift:
  90. term {
  91. $<Number>$ = $<Number>1;
  92. }
  93. | shift exp_PLUS term {
  94. $<Number>$ = $<Number>1 + $<Number>3;
  95. }
  96. | shift exp_MINUS term {
  97. $<Number>$ = $<Number>1 - $<Number>3;
  98. }
  99. term:
  100. unary {
  101. $<Number>$ = $<Number>1;
  102. }
  103. | term exp_TIMES unary {
  104. $<Number>$ = $<Number>1 * $<Number>3;
  105. }
  106. | term exp_DIVIDE unary {
  107. $<Number>$ = $<Number>1 / $<Number>3;
  108. }
  109. | term exp_MOD unary {
  110. $<Number>$ = $<Number>1 % $<Number>3;
  111. }
  112. unary:
  113. factor {
  114. $<Number>$ = $<Number>1;
  115. }
  116. | exp_PLUS unary {
  117. $<Number>$ = + $<Number>2;
  118. }
  119. | exp_MINUS unary {
  120. $<Number>$ = - $<Number>2;
  121. }
  122. factor:
  123. exp_NUMBER {
  124. $<Number>$ = $<Number>1;
  125. }
  126. | exp_OPENPARENT exp exp_CLOSEPARENT {
  127. $<Number>$ = $<Number>2;
  128. }
  129. ;
  130. %%
  131. /* End of grammar */
  132. /*--------------------------------------------------------------------------*/
  133. void cmExpr_yyerror(yyscan_t yyscanner, const char* message)
  134. {
  135. cmExpr_yyget_extra(yyscanner)->Error(message);
  136. }