Merge topic 'math-hex'

5dbee9d2d0 math: Add options to calculate and format output as hexadecimal
8661e7052c math: Diagnose divide-by-zero
7c4c13ffef math: Reject unexpected expression input explicitly
5b0f73a15a math: Use 64-bit integer type for computation
963b8d9f6c math: Add RunCMake.math test to prepare for error cases

Acked-by: Kitware Robot <kwrobot@kitware.com>
Merge-request: !2056
This commit is contained in:
Brad King
2018-07-05 14:25:56 +00:00
committed by Kitware Robot
31 changed files with 399 additions and 149 deletions
+73 -53
View File
@@ -548,8 +548,8 @@ static void yynoreturn yy_fatal_error ( const char* msg , yyscan_t yyscanner );
yyg->yy_hold_char = *yy_cp; \
*yy_cp = '\0'; \
yyg->yy_c_buf_p = yy_cp;
#define YY_NUM_RULES 15
#define YY_END_OF_BUFFER 16
#define YY_NUM_RULES 18
#define YY_END_OF_BUFFER 19
/* This struct is not used in this scanner,
but its presence is necessary. */
struct yy_trans_info
@@ -557,29 +557,29 @@ struct yy_trans_info
flex_int32_t yy_verify;
flex_int32_t yy_nxt;
};
static const flex_int16_t yy_accept[23] =
static const flex_int16_t yy_accept[29] =
{ 0,
0, 0, 16, 15, 6, 8, 13, 14, 4, 2,
3, 5, 1, 15, 15, 9, 7, 10, 1, 11,
12, 0
0, 0, 19, 17, 1, 18, 8, 10, 15, 16,
6, 4, 5, 7, 2, 2, 17, 17, 11, 9,
12, 2, 0, 13, 14, 3, 3, 0
} ;
static const YY_CHAR yy_ec[256] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 2, 3,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 2, 1, 1, 1, 1, 4, 5, 1, 6,
7, 8, 9, 1, 10, 1, 11, 12, 13, 13,
13, 13, 13, 13, 13, 13, 13, 1, 1, 14,
1, 15, 1, 1, 16, 16, 16, 16, 16, 16,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 2, 3, 1, 4,
5, 6, 7, 1, 8, 1, 9, 10, 10, 10,
10, 10, 10, 10, 10, 10, 10, 1, 1, 11,
1, 12, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 13, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 17, 1, 1,
1, 1, 1, 18, 1, 1, 16, 16, 16, 16,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 14, 1, 15, 1, 1, 1, 1,
16, 16, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 17,
1, 1, 1, 19, 1, 20, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
@@ -596,40 +596,46 @@ static const YY_CHAR yy_ec[256] =
1, 1, 1, 1, 1
} ;
static const YY_CHAR yy_meta[16] =
static const YY_CHAR yy_meta[21] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1
1, 2, 2, 1, 1, 3, 4, 1, 1, 1
} ;
static const flex_int16_t yy_base[23] =
static const flex_int16_t yy_base[32] =
{ 0,
0, 0, 20, 21, 21, 21, 21, 21, 21, 21,
21, 21, 9, 7, 5, 21, 21, 21, 6, 21,
21, 21
0, 0, 34, 35, 35, 35, 35, 35, 35, 35,
35, 35, 35, 35, 16, 9, 18, 11, 35, 35,
35, 11, 0, 35, 35, 0, 0, 35, 23, 26,
28
} ;
static const flex_int16_t yy_def[23] =
static const flex_int16_t yy_def[32] =
{ 0,
22, 1, 22, 22, 22, 22, 22, 22, 22, 22,
22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
22, 0
28, 1, 28, 28, 28, 28, 28, 28, 28, 28,
28, 28, 28, 28, 29, 28, 28, 28, 28, 28,
28, 28, 30, 28, 28, 31, 31, 0, 28, 28,
28
} ;
static const flex_int16_t yy_nxt[37] =
static const flex_int16_t yy_nxt[56] =
{ 0,
4, 5, 6, 7, 8, 9, 10, 11, 12, 13,
14, 15, 16, 17, 18, 19, 21, 20, 19, 22,
3, 22, 22, 22, 22, 22, 22, 22, 22, 22,
22, 22, 22, 22, 22, 22
14, 15, 16, 17, 18, 4, 4, 19, 20, 21,
22, 22, 22, 22, 22, 25, 22, 26, 26, 27,
27, 24, 23, 28, 3, 28, 28, 28, 28, 28,
28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
28, 28, 28, 28, 28
} ;
static const flex_int16_t yy_chk[37] =
static const flex_int16_t yy_chk[56] =
{ 0,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
1, 1, 1, 1, 1, 19, 15, 14, 13, 3,
22, 22, 22, 22, 22, 22, 22, 22, 22, 22,
22, 22, 22, 22, 22, 22
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
16, 16, 22, 22, 29, 18, 29, 30, 30, 31,
31, 17, 15, 3, 28, 28, 28, 28, 28, 28,
28, 28, 28, 28, 28, 28, 28, 28, 28, 28,
28, 28, 28, 28, 28
} ;
/* The intent behind this definition is that it'll catch
@@ -668,6 +674,8 @@ Modify cmExprLexer.cxx:
/* Include the set of tokens from the parser. */
#include "cmExprParserTokens.h"
#include <string>
/*--------------------------------------------------------------------------*/
#define INITIAL 0
@@ -946,13 +954,13 @@ yy_match:
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
if ( yy_current_state >= 23 )
if ( yy_current_state >= 29 )
yy_c = yy_meta[yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
++yy_cp;
}
while ( yy_base[yy_current_state] != 21 );
while ( yy_base[yy_current_state] != 35 );
yy_find_action:
yy_act = yy_accept[yy_current_state];
@@ -978,62 +986,74 @@ do_action: /* This label is used only to access EOF actions. */
case 1:
YY_RULE_SETUP
{ yylvalp->Number = atoi(yytext); return exp_NUMBER; }
{}
YY_BREAK
case 2:
YY_RULE_SETUP
{ return exp_PLUS; }
{ yylvalp->Number = std::stoll(yytext, nullptr, 10); return exp_NUMBER; }
YY_BREAK
case 3:
YY_RULE_SETUP
{ return exp_MINUS; }
{ yylvalp->Number = std::stoll(yytext, nullptr, 16); return exp_NUMBER; }
YY_BREAK
case 4:
YY_RULE_SETUP
{ return exp_TIMES; }
{ return exp_PLUS; }
YY_BREAK
case 5:
YY_RULE_SETUP
{ return exp_DIVIDE; }
{ return exp_MINUS; }
YY_BREAK
case 6:
YY_RULE_SETUP
{ return exp_MOD; }
{ return exp_TIMES; }
YY_BREAK
case 7:
YY_RULE_SETUP
{ return exp_OR; }
{ return exp_DIVIDE; }
YY_BREAK
case 8:
YY_RULE_SETUP
{ return exp_AND; }
{ return exp_MOD; }
YY_BREAK
case 9:
YY_RULE_SETUP
{ return exp_XOR; }
{ return exp_OR; }
YY_BREAK
case 10:
YY_RULE_SETUP
{ return exp_NOT; }
{ return exp_AND; }
YY_BREAK
case 11:
YY_RULE_SETUP
{ return exp_SHIFTLEFT; }
{ return exp_XOR; }
YY_BREAK
case 12:
YY_RULE_SETUP
{ return exp_SHIFTRIGHT; }
{ return exp_NOT; }
YY_BREAK
case 13:
YY_RULE_SETUP
{ return exp_OPENPARENT; }
{ return exp_SHIFTLEFT; }
YY_BREAK
case 14:
YY_RULE_SETUP
{ return exp_CLOSEPARENT; }
{ return exp_SHIFTRIGHT; }
YY_BREAK
case 15:
YY_RULE_SETUP
{ return exp_OPENPARENT; }
YY_BREAK
case 16:
YY_RULE_SETUP
{ return exp_CLOSEPARENT; }
YY_BREAK
case 17:
YY_RULE_SETUP
{return exp_UNEXPECTED;}
YY_BREAK
case 18:
YY_RULE_SETUP
ECHO;
YY_BREAK
case YY_STATE_EOF(INITIAL):
@@ -1334,7 +1354,7 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
if ( yy_current_state >= 23 )
if ( yy_current_state >= 29 )
yy_c = yy_meta[yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
@@ -1363,11 +1383,11 @@ static int yy_get_next_buffer (yyscan_t yyscanner)
while ( yy_chk[yy_base[yy_current_state] + yy_c] != yy_current_state )
{
yy_current_state = (int) yy_def[yy_current_state];
if ( yy_current_state >= 23 )
if ( yy_current_state >= 29 )
yy_c = yy_meta[yy_c];
}
yy_current_state = yy_nxt[yy_base[yy_current_state] + yy_c];
yy_is_jam = (yy_current_state == 22);
yy_is_jam = (yy_current_state == 28);
(void)yyg;
return yy_is_jam ? 0 : yy_current_state;
+6 -1
View File
@@ -28,6 +28,8 @@ Modify cmExprLexer.cxx:
/* Include the set of tokens from the parser. */
#include "cmExprParserTokens.h"
#include <string>
/*--------------------------------------------------------------------------*/
%}
@@ -38,8 +40,10 @@ Modify cmExprLexer.cxx:
%pointer
%%
[ \t] {}
[0-9][0-9]* { yylvalp->Number = atoi(yytext); return exp_NUMBER; }
[0-9][0-9]* { yylvalp->Number = std::stoll(yytext, nullptr, 10); return exp_NUMBER; }
0[xX][0-9a-fA-F][0-9a-fA-F]* { yylvalp->Number = std::stoll(yytext, nullptr, 16); return exp_NUMBER; }
"+" { return exp_PLUS; }
"-" { return exp_MINUS; }
@@ -54,5 +58,6 @@ Modify cmExprLexer.cxx:
">>" { return exp_SHIFTRIGHT; }
"(" { return exp_OPENPARENT; }
")" { return exp_CLOSEPARENT; }
. {return exp_UNEXPECTED;}
%%
+72 -65
View File
@@ -89,6 +89,7 @@ Modify cmExprParser.cxx:
#include <stdlib.h>
#include <string.h>
#include <stdexcept>
/*-------------------------------------------------------------------------*/
#define YYDEBUG 1
@@ -108,7 +109,7 @@ static void cmExpr_yyerror(yyscan_t yyscanner, const char* message);
# pragma warning (disable: 4065) /* Switch statement contains default but no case. */
#endif
#line 112 "cmExprParser.cxx" /* yacc.c:339 */
#line 113 "cmExprParser.cxx" /* yacc.c:339 */
# ifndef YY_NULLPTR
# if defined __cplusplus && 201103L <= __cplusplus
@@ -156,7 +157,8 @@ extern int cmExpr_yydebug;
exp_AND = 268,
exp_XOR = 269,
exp_NOT = 270,
exp_NUMBER = 271
exp_NUMBER = 271,
exp_UNEXPECTED = 272
};
#endif
/* Tokens. */
@@ -174,6 +176,7 @@ extern int cmExpr_yydebug;
#define exp_XOR 269
#define exp_NOT 270
#define exp_NUMBER 271
#define exp_UNEXPECTED 272
/* Value type. */
@@ -185,7 +188,7 @@ int cmExpr_yyparse (yyscan_t yyscanner);
/* Copy the second part of user declarations. */
#line 189 "cmExprParser.cxx" /* yacc.c:358 */
#line 192 "cmExprParser.cxx" /* yacc.c:358 */
#ifdef short
# undef short
@@ -430,7 +433,7 @@ union yyalloc
#define YYLAST 30
/* YYNTOKENS -- Number of terminals. */
#define YYNTOKENS 17
#define YYNTOKENS 18
/* YYNNTS -- Number of nonterminals. */
#define YYNNTS 10
/* YYNRULES -- Number of rules. */
@@ -441,7 +444,7 @@ union yyalloc
/* YYTRANSLATE[YYX] -- Symbol number corresponding to YYX as returned
by yylex, with out-of-bounds checking. */
#define YYUNDEFTOK 2
#define YYMAXUTOK 271
#define YYMAXUTOK 272
#define YYTRANSLATE(YYX) \
((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK)
@@ -477,16 +480,16 @@ static const yytype_uint8 yytranslate[] =
2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
2, 2, 2, 2, 2, 2, 1, 2, 3, 4,
5, 6, 7, 8, 9, 10, 11, 12, 13, 14,
15, 16
15, 16, 17
};
#if YYDEBUG
/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
static const yytype_uint8 yyrline[] =
{
0, 73, 73, 78, 81, 86, 89, 94, 97, 102,
105, 108, 113, 116, 119, 124, 127, 130, 133, 138,
141, 144, 149, 152
0, 75, 75, 80, 83, 88, 91, 96, 99, 104,
107, 110, 115, 118, 121, 126, 129, 132, 138, 143,
146, 149, 154, 157
};
#endif
@@ -498,8 +501,9 @@ static const char *const yytname[] =
"$end", "error", "$undefined", "exp_PLUS", "exp_MINUS", "exp_TIMES",
"exp_DIVIDE", "exp_MOD", "exp_SHIFTLEFT", "exp_SHIFTRIGHT",
"exp_OPENPARENT", "exp_CLOSEPARENT", "exp_OR", "exp_AND", "exp_XOR",
"exp_NOT", "exp_NUMBER", "$accept", "start", "exp", "bitwiseor",
"bitwisexor", "bitwiseand", "shift", "term", "unary", "factor", YY_NULLPTR
"exp_NOT", "exp_NUMBER", "\"character\"", "$accept", "start", "exp",
"bitwiseor", "bitwisexor", "bitwiseand", "shift", "term", "unary",
"factor", YY_NULLPTR
};
#endif
@@ -509,7 +513,7 @@ static const char *const yytname[] =
static const yytype_uint16 yytoknum[] =
{
0, 256, 257, 258, 259, 260, 261, 262, 263, 264,
265, 266, 267, 268, 269, 270, 271
265, 266, 267, 268, 269, 270, 271, 272
};
# endif
@@ -579,18 +583,18 @@ static const yytype_int8 yycheck[] =
symbol of state STATE-NUM. */
static const yytype_uint8 yystos[] =
{
0, 3, 4, 10, 16, 18, 19, 20, 21, 22,
23, 24, 25, 26, 25, 25, 19, 0, 12, 14,
13, 8, 9, 3, 4, 5, 6, 7, 11, 20,
21, 22, 23, 23, 24, 24, 25, 25, 25
0, 3, 4, 10, 16, 19, 20, 21, 22, 23,
24, 25, 26, 27, 26, 26, 20, 0, 12, 14,
13, 8, 9, 3, 4, 5, 6, 7, 11, 21,
22, 23, 24, 24, 25, 25, 26, 26, 26
};
/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
static const yytype_uint8 yyr1[] =
{
0, 17, 18, 19, 19, 20, 20, 21, 21, 22,
22, 22, 23, 23, 23, 24, 24, 24, 24, 25,
25, 25, 26, 26
0, 18, 19, 20, 20, 21, 21, 22, 22, 23,
23, 23, 24, 24, 24, 25, 25, 25, 25, 26,
26, 26, 27, 27
};
/* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
@@ -1281,183 +1285,186 @@ yyreduce:
switch (yyn)
{
case 2:
#line 73 "cmExprParser.y" /* yacc.c:1646 */
#line 75 "cmExprParser.y" /* yacc.c:1646 */
{
cmExpr_yyget_extra(yyscanner)->SetResult((yyvsp[0].Number));
}
#line 1289 "cmExprParser.cxx" /* yacc.c:1646 */
#line 1293 "cmExprParser.cxx" /* yacc.c:1646 */
break;
case 3:
#line 78 "cmExprParser.y" /* yacc.c:1646 */
#line 80 "cmExprParser.y" /* yacc.c:1646 */
{
(yyval.Number) = (yyvsp[0].Number);
}
#line 1297 "cmExprParser.cxx" /* yacc.c:1646 */
#line 1301 "cmExprParser.cxx" /* yacc.c:1646 */
break;
case 4:
#line 81 "cmExprParser.y" /* yacc.c:1646 */
#line 83 "cmExprParser.y" /* yacc.c:1646 */
{
(yyval.Number) = (yyvsp[-2].Number) | (yyvsp[0].Number);
}
#line 1305 "cmExprParser.cxx" /* yacc.c:1646 */
#line 1309 "cmExprParser.cxx" /* yacc.c:1646 */
break;
case 5:
#line 86 "cmExprParser.y" /* yacc.c:1646 */
#line 88 "cmExprParser.y" /* yacc.c:1646 */
{
(yyval.Number) = (yyvsp[0].Number);
}
#line 1313 "cmExprParser.cxx" /* yacc.c:1646 */
#line 1317 "cmExprParser.cxx" /* yacc.c:1646 */
break;
case 6:
#line 89 "cmExprParser.y" /* yacc.c:1646 */
#line 91 "cmExprParser.y" /* yacc.c:1646 */
{
(yyval.Number) = (yyvsp[-2].Number) ^ (yyvsp[0].Number);
}
#line 1321 "cmExprParser.cxx" /* yacc.c:1646 */
#line 1325 "cmExprParser.cxx" /* yacc.c:1646 */
break;
case 7:
#line 94 "cmExprParser.y" /* yacc.c:1646 */
#line 96 "cmExprParser.y" /* yacc.c:1646 */
{
(yyval.Number) = (yyvsp[0].Number);
}
#line 1329 "cmExprParser.cxx" /* yacc.c:1646 */
#line 1333 "cmExprParser.cxx" /* yacc.c:1646 */
break;
case 8:
#line 97 "cmExprParser.y" /* yacc.c:1646 */
#line 99 "cmExprParser.y" /* yacc.c:1646 */
{
(yyval.Number) = (yyvsp[-2].Number) & (yyvsp[0].Number);
}
#line 1337 "cmExprParser.cxx" /* yacc.c:1646 */
#line 1341 "cmExprParser.cxx" /* yacc.c:1646 */
break;
case 9:
#line 102 "cmExprParser.y" /* yacc.c:1646 */
#line 104 "cmExprParser.y" /* yacc.c:1646 */
{
(yyval.Number) = (yyvsp[0].Number);
}
#line 1345 "cmExprParser.cxx" /* yacc.c:1646 */
#line 1349 "cmExprParser.cxx" /* yacc.c:1646 */
break;
case 10:
#line 105 "cmExprParser.y" /* yacc.c:1646 */
#line 107 "cmExprParser.y" /* yacc.c:1646 */
{
(yyval.Number) = (yyvsp[-2].Number) << (yyvsp[0].Number);
}
#line 1353 "cmExprParser.cxx" /* yacc.c:1646 */
#line 1357 "cmExprParser.cxx" /* yacc.c:1646 */
break;
case 11:
#line 108 "cmExprParser.y" /* yacc.c:1646 */
#line 110 "cmExprParser.y" /* yacc.c:1646 */
{
(yyval.Number) = (yyvsp[-2].Number) >> (yyvsp[0].Number);
}
#line 1361 "cmExprParser.cxx" /* yacc.c:1646 */
#line 1365 "cmExprParser.cxx" /* yacc.c:1646 */
break;
case 12:
#line 113 "cmExprParser.y" /* yacc.c:1646 */
#line 115 "cmExprParser.y" /* yacc.c:1646 */
{
(yyval.Number) = (yyvsp[0].Number);
}
#line 1369 "cmExprParser.cxx" /* yacc.c:1646 */
#line 1373 "cmExprParser.cxx" /* yacc.c:1646 */
break;
case 13:
#line 116 "cmExprParser.y" /* yacc.c:1646 */
#line 118 "cmExprParser.y" /* yacc.c:1646 */
{
(yyval.Number) = (yyvsp[-2].Number) + (yyvsp[0].Number);
}
#line 1377 "cmExprParser.cxx" /* yacc.c:1646 */
#line 1381 "cmExprParser.cxx" /* yacc.c:1646 */
break;
case 14:
#line 119 "cmExprParser.y" /* yacc.c:1646 */
#line 121 "cmExprParser.y" /* yacc.c:1646 */
{
(yyval.Number) = (yyvsp[-2].Number) - (yyvsp[0].Number);
}
#line 1385 "cmExprParser.cxx" /* yacc.c:1646 */
#line 1389 "cmExprParser.cxx" /* yacc.c:1646 */
break;
case 15:
#line 124 "cmExprParser.y" /* yacc.c:1646 */
#line 126 "cmExprParser.y" /* yacc.c:1646 */
{
(yyval.Number) = (yyvsp[0].Number);
}
#line 1393 "cmExprParser.cxx" /* yacc.c:1646 */
#line 1397 "cmExprParser.cxx" /* yacc.c:1646 */
break;
case 16:
#line 127 "cmExprParser.y" /* yacc.c:1646 */
#line 129 "cmExprParser.y" /* yacc.c:1646 */
{
(yyval.Number) = (yyvsp[-2].Number) * (yyvsp[0].Number);
}
#line 1401 "cmExprParser.cxx" /* yacc.c:1646 */
#line 1405 "cmExprParser.cxx" /* yacc.c:1646 */
break;
case 17:
#line 130 "cmExprParser.y" /* yacc.c:1646 */
#line 132 "cmExprParser.y" /* yacc.c:1646 */
{
if (yyvsp[0].Number == 0) {
throw std::overflow_error("divide by zero");
}
(yyval.Number) = (yyvsp[-2].Number) / (yyvsp[0].Number);
}
#line 1409 "cmExprParser.cxx" /* yacc.c:1646 */
#line 1416 "cmExprParser.cxx" /* yacc.c:1646 */
break;
case 18:
#line 133 "cmExprParser.y" /* yacc.c:1646 */
#line 138 "cmExprParser.y" /* yacc.c:1646 */
{
(yyval.Number) = (yyvsp[-2].Number) % (yyvsp[0].Number);
}
#line 1417 "cmExprParser.cxx" /* yacc.c:1646 */
#line 1424 "cmExprParser.cxx" /* yacc.c:1646 */
break;
case 19:
#line 138 "cmExprParser.y" /* yacc.c:1646 */
#line 143 "cmExprParser.y" /* yacc.c:1646 */
{
(yyval.Number) = (yyvsp[0].Number);
}
#line 1425 "cmExprParser.cxx" /* yacc.c:1646 */
#line 1432 "cmExprParser.cxx" /* yacc.c:1646 */
break;
case 20:
#line 141 "cmExprParser.y" /* yacc.c:1646 */
#line 146 "cmExprParser.y" /* yacc.c:1646 */
{
(yyval.Number) = + (yyvsp[0].Number);
}
#line 1433 "cmExprParser.cxx" /* yacc.c:1646 */
#line 1440 "cmExprParser.cxx" /* yacc.c:1646 */
break;
case 21:
#line 144 "cmExprParser.y" /* yacc.c:1646 */
#line 149 "cmExprParser.y" /* yacc.c:1646 */
{
(yyval.Number) = - (yyvsp[0].Number);
}
#line 1441 "cmExprParser.cxx" /* yacc.c:1646 */
#line 1448 "cmExprParser.cxx" /* yacc.c:1646 */
break;
case 22:
#line 149 "cmExprParser.y" /* yacc.c:1646 */
#line 154 "cmExprParser.y" /* yacc.c:1646 */
{
(yyval.Number) = (yyvsp[0].Number);
}
#line 1449 "cmExprParser.cxx" /* yacc.c:1646 */
#line 1456 "cmExprParser.cxx" /* yacc.c:1646 */
break;
case 23:
#line 152 "cmExprParser.y" /* yacc.c:1646 */
#line 157 "cmExprParser.y" /* yacc.c:1646 */
{
(yyval.Number) = (yyvsp[-1].Number);
}
#line 1457 "cmExprParser.cxx" /* yacc.c:1646 */
#line 1464 "cmExprParser.cxx" /* yacc.c:1646 */
break;
#line 1461 "cmExprParser.cxx" /* yacc.c:1646 */
#line 1468 "cmExprParser.cxx" /* yacc.c:1646 */
default: break;
}
/* User semantic actions sometimes alter yychar, and that requires
@@ -1687,7 +1694,7 @@ yyreturn:
#endif
return yyresult;
}
#line 157 "cmExprParser.y" /* yacc.c:1906 */
#line 162 "cmExprParser.y" /* yacc.c:1906 */
/* End of grammar */
+5
View File
@@ -18,6 +18,7 @@ Modify cmExprParser.cxx:
#include <stdlib.h>
#include <string.h>
#include <stdexcept>
/*-------------------------------------------------------------------------*/
#define YYDEBUG 1
@@ -63,6 +64,7 @@ static void cmExpr_yyerror(yyscan_t yyscanner, const char* message);
%token exp_XOR;
%token exp_NOT;
%token exp_NUMBER;
%token exp_UNEXPECTED "character";
/*-------------------------------------------------------------------------*/
/* grammar */
@@ -128,6 +130,9 @@ term:
$<Number>$ = $<Number>1 * $<Number>3;
}
| term exp_DIVIDE unary {
if (yyvsp[0].Number == 0) {
throw std::overflow_error("divide by zero");
}
$<Number>$ = $<Number>1 / $<Number>3;
}
| term exp_MOD unary {
+3 -1
View File
@@ -58,7 +58,8 @@ extern int cmExpr_yydebug;
exp_AND = 268,
exp_XOR = 269,
exp_NOT = 270,
exp_NUMBER = 271
exp_NUMBER = 271,
exp_UNEXPECTED = 272
};
#endif
/* Tokens. */
@@ -76,6 +77,7 @@ extern int cmExpr_yydebug;
#define exp_XOR 269
#define exp_NOT 270
#define exp_NUMBER 271
#define exp_UNEXPECTED 272
/* Value type. */