CMake Nightly Date Stamp
[kiteware-cmake.git] / Source / LexerParser / cmExprParser.y
blob51df56efcc2742cff3d4f8008feb5c2c1a9a9d15
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 /*
6 This file must be translated to C and modified to build everywhere.
8 Run bison like this:
10 bison --name-prefix=cmExpr_yy --defines=cmExprParserTokens.h -ocmExprParser.cxx cmExprParser.y
14 #include "cmConfigure.h" // IWYU pragma: keep
16 #include <stdlib.h>
17 #include <string.h>
18 #include <stdexcept>
20 /*-------------------------------------------------------------------------*/
21 #define YYDEBUG 1
22 #include "cmExprParserHelper.h" /* Interface to parser object. */
23 #include "cmExprLexer.h" /* Interface to lexer object. */
24 #include "cmExprParserTokens.h" /* Need YYSTYPE for YY_DECL. */
26 /* Forward declare the lexer entry point. */
27 YY_DECL;
29 /* Helper function to forward error callback from parser. */
30 static void cmExpr_yyerror(yyscan_t yyscanner, const char* message);
32 /* Disable some warnings in the generated code. */
33 #ifdef _MSC_VER
34 # pragma warning (disable: 4102) /* Unused goto label. */
35 # pragma warning (disable: 4065) /* Switch statement contains default but no case. */
36 #endif
37 #if defined(__GNUC__) && __GNUC__ >= 8
38 # pragma GCC diagnostic ignored "-Wconversion"
39 # pragma GCC diagnostic ignored "-Wfree-nonheap-object"
40 #endif
41 #if defined(__clang__) && defined(__has_warning)
42 # if __has_warning("-Wunused-but-set-variable")
43 # pragma clang diagnostic ignored "-Wunused-but-set-variable"
44 # endif
45 # if __has_warning("-Wused-but-marked-unused")
46 # pragma clang diagnostic ignored "-Wused-but-marked-unused"
47 # endif
48 #endif
50 #if defined(__NVCOMPILER)
51 # pragma diag_suppress 550 /* variable set but never used */
52 #endif
55 /* Generate a reentrant parser object. */
56 %define api.pure
58 /* Configure the parser to use a lexer object. */
59 %lex-param {yyscan_t yyscanner}
60 %parse-param {yyscan_t yyscanner}
62 %define parse.error verbose
64 /*-------------------------------------------------------------------------*/
65 /* Tokens */
66 %token exp_PLUS
67 %token exp_MINUS
68 %token exp_TIMES
69 %token exp_DIVIDE
70 %token exp_MOD
71 %token exp_SHIFTLEFT
72 %token exp_SHIFTRIGHT
73 %token exp_OPENPARENT
74 %token exp_CLOSEPARENT
75 %token exp_OR;
76 %token exp_AND;
77 %token exp_XOR;
78 %token exp_NOT;
79 %token exp_NUMBER;
81 /*-------------------------------------------------------------------------*/
82 /* grammar */
86 start:
87 exp {
88 cmExpr_yyget_extra(yyscanner)->SetResult($<Number>1);
91 exp:
92 bitwiseor {
93 $<Number>$ = $<Number>1;
95 | exp exp_OR bitwiseor {
96 $<Number>$ = $<Number>1 | $<Number>3;
99 bitwiseor:
100 bitwisexor {
101 $<Number>$ = $<Number>1;
103 | bitwiseor exp_XOR bitwisexor {
104 $<Number>$ = $<Number>1 ^ $<Number>3;
107 bitwisexor:
108 bitwiseand {
109 $<Number>$ = $<Number>1;
111 | bitwisexor exp_AND bitwiseand {
112 $<Number>$ = $<Number>1 & $<Number>3;
115 bitwiseand:
116 shift {
117 $<Number>$ = $<Number>1;
119 | bitwiseand exp_SHIFTLEFT shift {
120 $<Number>$ = $<Number>1 << $<Number>3;
122 | bitwiseand exp_SHIFTRIGHT shift {
123 $<Number>$ = $<Number>1 >> $<Number>3;
126 shift:
127 term {
128 $<Number>$ = $<Number>1;
130 | shift exp_PLUS term {
131 $<Number>$ = $<Number>1 + $<Number>3;
133 | shift exp_MINUS term {
134 $<Number>$ = $<Number>1 - $<Number>3;
137 term:
138 unary {
139 $<Number>$ = $<Number>1;
141 | term exp_TIMES unary {
142 $<Number>$ = $<Number>1 * $<Number>3;
144 | term exp_DIVIDE unary {
145 if (yyvsp[0].Number == 0) {
146 throw std::overflow_error("divide by zero");
148 $<Number>$ = $<Number>1 / $<Number>3;
150 | term exp_MOD unary {
151 $<Number>$ = $<Number>1 % $<Number>3;
154 unary:
155 factor {
156 $<Number>$ = $<Number>1;
158 | exp_PLUS unary {
159 $<Number>$ = + $<Number>2;
161 | exp_MINUS unary {
162 $<Number>$ = - $<Number>2;
164 | exp_NOT unary {
165 $<Number>$ = ~ $<Number>2;
168 factor:
169 exp_NUMBER {
170 $<Number>$ = $<Number>1;
172 | exp_OPENPARENT exp exp_CLOSEPARENT {
173 $<Number>$ = $<Number>2;
178 /* End of grammar */
180 /*--------------------------------------------------------------------------*/
181 void cmExpr_yyerror(yyscan_t yyscanner, const char* message)
183 cmExpr_yyget_extra(yyscanner)->Error(message);