2 /* Distributed under the OSI-approved BSD 3-Clause License. See accompanying
3 file Copyright.txt or https://cmake.org/licensing for details. */
6 This file must be translated to C and modified to build everywhere.
10 bison --name-prefix=cmExpr_yy --defines=cmExprParserTokens.h -ocmExprParser.cxx cmExprParser.y
14 #include "cmConfigure.h" // IWYU pragma: keep
20 /*-------------------------------------------------------------------------*/
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. */
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. */
34 # pragma warning (disable: 4102) /* Unused goto label. */
35 # pragma warning (disable: 4065) /* Switch statement contains default but no case. */
37 #if defined(__GNUC__) && __GNUC__ >= 8
38 # pragma GCC diagnostic ignored "-Wconversion"
39 # pragma GCC diagnostic ignored "-Wfree-nonheap-object"
41 #if defined(__clang__) && defined(__has_warning)
42 # if __has_warning("-Wunused-but-set-variable")
43 # pragma clang diagnostic ignored "-Wunused-but-set-variable"
45 # if __has_warning("-Wused-but-marked-unused")
46 # pragma clang diagnostic ignored "-Wused-but-marked-unused"
50 #if defined(__NVCOMPILER)
51 # pragma diag_suppress 550 /* variable set but never used */
55 /* Generate a reentrant parser object. */
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 /*-------------------------------------------------------------------------*/
74 %token exp_CLOSEPARENT
81 /*-------------------------------------------------------------------------*/
88 cmExpr_yyget_extra
(yyscanner
)->SetResult
($
<Number
>1);
93 $
<Number
>$
= $
<Number
>1;
95 | exp exp_OR bitwiseor
{
96 $
<Number
>$
= $
<Number
>1 | $
<Number
>3;
101 $
<Number
>$
= $
<Number
>1;
103 | bitwiseor exp_XOR bitwisexor
{
104 $
<Number
>$
= $
<Number
>1 ^ $
<Number
>3;
109 $
<Number
>$
= $
<Number
>1;
111 | bitwisexor exp_AND bitwiseand
{
112 $
<Number
>$
= $
<Number
>1 & $
<Number
>3;
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;
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;
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;
156 $
<Number
>$
= $
<Number
>1;
159 $
<Number
>$
= + $
<Number
>2;
162 $
<Number
>$
= - $
<Number
>2;
165 $
<Number
>$
= ~ $
<Number
>2;
170 $
<Number
>$
= $
<Number
>1;
172 | exp_OPENPARENT exp exp_CLOSEPARENT
{
173 $
<Number
>$
= $
<Number
>2;
180 /*--------------------------------------------------------------------------*/
181 void cmExpr_yyerror
(yyscan_t yyscanner
, const char* message
)
183 cmExpr_yyget_extra
(yyscanner
)->Error
(message
);