math(EXPR): Implement ~(exp_NOT) expression as documented

Fixes: #19252
stage/master/nightly/2019/07/24
Gabor Bencze 2019-07-19 22:18:11 +02:00 committed by Brad King
parent 59b3000c08
commit d427f12b73
4 changed files with 75 additions and 59 deletions

View File

@ -425,18 +425,18 @@ union yyalloc
#endif /* !YYCOPY_NEEDED */
/* YYFINAL -- State number of the termination state. */
#define YYFINAL 17
#define YYFINAL 19
/* YYLAST -- Last index in YYTABLE. */
#define YYLAST 30
#define YYLAST 34
/* YYNTOKENS -- Number of terminals. */
#define YYNTOKENS 17
/* YYNNTS -- Number of nonterminals. */
#define YYNNTS 10
/* YYNRULES -- Number of rules. */
#define YYNRULES 23
#define YYNRULES 24
/* YYNSTATES -- Number of states. */
#define YYNSTATES 39
#define YYNSTATES 41
#define YYUNDEFTOK 2
#define YYMAXUTOK 271
@ -486,7 +486,7 @@ static const yytype_uint8 yyrline[] =
{
0, 77, 77, 82, 85, 90, 93, 98, 101, 106,
109, 112, 117, 120, 123, 128, 131, 134, 140, 145,
148, 151, 156, 159
148, 151, 154, 159, 162
};
#endif
@ -513,10 +513,10 @@ static const yytype_uint16 yytoknum[] =
};
# endif
#define YYPACT_NINF -8
#define YYPACT_NINF -11
#define yypact_value_is_default(Yystate) \
(!!((Yystate) == (-8)))
(!!((Yystate) == (-11)))
#define YYTABLE_NINF -1
@ -527,10 +527,11 @@ static const yytype_uint16 yytoknum[] =
STATE-NUM. */
static const yytype_int8 yypact[] =
{
0, 0, 0, 0, -8, 2, -7, -5, 8, 3,
10, 1, -8, -8, -8, -8, 6, -8, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, -8, -5,
8, 3, 10, 10, 1, 1, -8, -8, -8
1, 1, 1, 1, 1, -11, 6, -10, -4, 9,
4, 11, 2, -11, -11, -11, -11, 7, -11, -11,
1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
-11, -4, 9, 4, 11, 11, 2, 2, -11, -11,
-11
};
/* YYDEFACT[STATE-NUM] -- Default reduction number in state STATE-NUM.
@ -538,22 +539,23 @@ static const yytype_int8 yypact[] =
means the default is an error. */
static const yytype_uint8 yydefact[] =
{
0, 0, 0, 0, 22, 0, 2, 3, 5, 7,
9, 12, 15, 19, 20, 21, 0, 1, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 23, 4,
6, 8, 10, 11, 13, 14, 16, 17, 18
0, 0, 0, 0, 0, 23, 0, 2, 3, 5,
7, 9, 12, 15, 19, 20, 21, 0, 22, 1,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
24, 4, 6, 8, 10, 11, 13, 14, 16, 17,
18
};
/* YYPGOTO[NTERM-NUM]. */
static const yytype_int8 yypgoto[] =
{
-8, -8, 12, 5, 11, 9, -2, 4, -1, -8
-11, -11, 22, 10, 8, 12, -3, -2, -1, -11
};
/* YYDEFGOTO[NTERM-NUM]. */
static const yytype_int8 yydefgoto[] =
{
-1, 5, 6, 7, 8, 9, 10, 11, 12, 13
-1, 6, 7, 8, 9, 10, 11, 12, 13, 14
};
/* YYTABLE[YYPACT[STATE-NUM]] -- What to do in state STATE-NUM. If
@ -561,28 +563,29 @@ static const yytype_int8 yydefgoto[] =
number is the opposite. If YYTABLE_NINF, syntax error. */
static const yytype_uint8 yytable[] =
{
14, 15, 17, 1, 2, 18, 25, 26, 27, 19,
3, 21, 22, 23, 24, 16, 4, 28, 18, 32,
33, 20, 0, 29, 36, 37, 38, 34, 35, 31,
30
15, 16, 20, 18, 1, 2, 19, 27, 28, 29,
21, 3, 23, 24, 25, 26, 4, 5, 30, 20,
34, 35, 22, 36, 37, 17, 38, 39, 40, 32,
31, 0, 0, 0, 33
};
static const yytype_int8 yycheck[] =
{
1, 2, 0, 3, 4, 12, 5, 6, 7, 14,
10, 8, 9, 3, 4, 3, 16, 11, 12, 21,
22, 13, -1, 18, 25, 26, 27, 23, 24, 20,
19
1, 2, 12, 4, 3, 4, 0, 5, 6, 7,
14, 10, 8, 9, 3, 4, 15, 16, 11, 12,
23, 24, 13, 25, 26, 3, 27, 28, 29, 21,
20, -1, -1, -1, 22
};
/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing
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, 15, 16, 18, 19, 20, 21,
22, 23, 24, 25, 26, 25, 25, 19, 25, 0,
12, 14, 13, 8, 9, 3, 4, 5, 6, 7,
11, 20, 21, 22, 23, 23, 24, 24, 25, 25,
25
};
/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
@ -590,7 +593,7 @@ 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
25, 25, 25, 26, 26
};
/* YYR2[YYN] -- Number of symbols on the right hand side of rule YYN. */
@ -598,7 +601,7 @@ static const yytype_uint8 yyr2[] =
{
0, 2, 1, 1, 3, 1, 3, 1, 3, 1,
3, 3, 1, 3, 3, 1, 3, 3, 3, 1,
2, 2, 1, 3
2, 2, 2, 1, 3
};
@ -1294,7 +1297,7 @@ yyreduce:
{
cmExpr_yyget_extra(yyscanner)->SetResult((yyvsp[0].Number));
}
#line 1298 "cmExprParser.cxx" /* yacc.c:1652 */
#line 1301 "cmExprParser.cxx" /* yacc.c:1652 */
break;
case 3:
@ -1302,7 +1305,7 @@ yyreduce:
{
(yyval.Number) = (yyvsp[0].Number);
}
#line 1306 "cmExprParser.cxx" /* yacc.c:1652 */
#line 1309 "cmExprParser.cxx" /* yacc.c:1652 */
break;
case 4:
@ -1310,7 +1313,7 @@ yyreduce:
{
(yyval.Number) = (yyvsp[-2].Number) | (yyvsp[0].Number);
}
#line 1314 "cmExprParser.cxx" /* yacc.c:1652 */
#line 1317 "cmExprParser.cxx" /* yacc.c:1652 */
break;
case 5:
@ -1318,7 +1321,7 @@ yyreduce:
{
(yyval.Number) = (yyvsp[0].Number);
}
#line 1322 "cmExprParser.cxx" /* yacc.c:1652 */
#line 1325 "cmExprParser.cxx" /* yacc.c:1652 */
break;
case 6:
@ -1326,7 +1329,7 @@ yyreduce:
{
(yyval.Number) = (yyvsp[-2].Number) ^ (yyvsp[0].Number);
}
#line 1330 "cmExprParser.cxx" /* yacc.c:1652 */
#line 1333 "cmExprParser.cxx" /* yacc.c:1652 */
break;
case 7:
@ -1334,7 +1337,7 @@ yyreduce:
{
(yyval.Number) = (yyvsp[0].Number);
}
#line 1338 "cmExprParser.cxx" /* yacc.c:1652 */
#line 1341 "cmExprParser.cxx" /* yacc.c:1652 */
break;
case 8:
@ -1342,7 +1345,7 @@ yyreduce:
{
(yyval.Number) = (yyvsp[-2].Number) & (yyvsp[0].Number);
}
#line 1346 "cmExprParser.cxx" /* yacc.c:1652 */
#line 1349 "cmExprParser.cxx" /* yacc.c:1652 */
break;
case 9:
@ -1350,7 +1353,7 @@ yyreduce:
{
(yyval.Number) = (yyvsp[0].Number);
}
#line 1354 "cmExprParser.cxx" /* yacc.c:1652 */
#line 1357 "cmExprParser.cxx" /* yacc.c:1652 */
break;
case 10:
@ -1358,7 +1361,7 @@ yyreduce:
{
(yyval.Number) = (yyvsp[-2].Number) << (yyvsp[0].Number);
}
#line 1362 "cmExprParser.cxx" /* yacc.c:1652 */
#line 1365 "cmExprParser.cxx" /* yacc.c:1652 */
break;
case 11:
@ -1366,7 +1369,7 @@ yyreduce:
{
(yyval.Number) = (yyvsp[-2].Number) >> (yyvsp[0].Number);
}
#line 1370 "cmExprParser.cxx" /* yacc.c:1652 */
#line 1373 "cmExprParser.cxx" /* yacc.c:1652 */
break;
case 12:
@ -1374,7 +1377,7 @@ yyreduce:
{
(yyval.Number) = (yyvsp[0].Number);
}
#line 1378 "cmExprParser.cxx" /* yacc.c:1652 */
#line 1381 "cmExprParser.cxx" /* yacc.c:1652 */
break;
case 13:
@ -1382,7 +1385,7 @@ yyreduce:
{
(yyval.Number) = (yyvsp[-2].Number) + (yyvsp[0].Number);
}
#line 1386 "cmExprParser.cxx" /* yacc.c:1652 */
#line 1389 "cmExprParser.cxx" /* yacc.c:1652 */
break;
case 14:
@ -1390,7 +1393,7 @@ yyreduce:
{
(yyval.Number) = (yyvsp[-2].Number) - (yyvsp[0].Number);
}
#line 1394 "cmExprParser.cxx" /* yacc.c:1652 */
#line 1397 "cmExprParser.cxx" /* yacc.c:1652 */
break;
case 15:
@ -1398,7 +1401,7 @@ yyreduce:
{
(yyval.Number) = (yyvsp[0].Number);
}
#line 1402 "cmExprParser.cxx" /* yacc.c:1652 */
#line 1405 "cmExprParser.cxx" /* yacc.c:1652 */
break;
case 16:
@ -1406,7 +1409,7 @@ yyreduce:
{
(yyval.Number) = (yyvsp[-2].Number) * (yyvsp[0].Number);
}
#line 1410 "cmExprParser.cxx" /* yacc.c:1652 */
#line 1413 "cmExprParser.cxx" /* yacc.c:1652 */
break;
case 17:
@ -1417,7 +1420,7 @@ yyreduce:
}
(yyval.Number) = (yyvsp[-2].Number) / (yyvsp[0].Number);
}
#line 1421 "cmExprParser.cxx" /* yacc.c:1652 */
#line 1424 "cmExprParser.cxx" /* yacc.c:1652 */
break;
case 18:
@ -1425,7 +1428,7 @@ yyreduce:
{
(yyval.Number) = (yyvsp[-2].Number) % (yyvsp[0].Number);
}
#line 1429 "cmExprParser.cxx" /* yacc.c:1652 */
#line 1432 "cmExprParser.cxx" /* yacc.c:1652 */
break;
case 19:
@ -1433,7 +1436,7 @@ yyreduce:
{
(yyval.Number) = (yyvsp[0].Number);
}
#line 1437 "cmExprParser.cxx" /* yacc.c:1652 */
#line 1440 "cmExprParser.cxx" /* yacc.c:1652 */
break;
case 20:
@ -1441,7 +1444,7 @@ yyreduce:
{
(yyval.Number) = + (yyvsp[0].Number);
}
#line 1445 "cmExprParser.cxx" /* yacc.c:1652 */
#line 1448 "cmExprParser.cxx" /* yacc.c:1652 */
break;
case 21:
@ -1449,27 +1452,35 @@ yyreduce:
{
(yyval.Number) = - (yyvsp[0].Number);
}
#line 1453 "cmExprParser.cxx" /* yacc.c:1652 */
#line 1456 "cmExprParser.cxx" /* yacc.c:1652 */
break;
case 22:
#line 156 "cmExprParser.y" /* yacc.c:1652 */
#line 154 "cmExprParser.y" /* yacc.c:1652 */
{
(yyval.Number) = (yyvsp[0].Number);
(yyval.Number) = ~ (yyvsp[0].Number);
}
#line 1461 "cmExprParser.cxx" /* yacc.c:1652 */
#line 1464 "cmExprParser.cxx" /* yacc.c:1652 */
break;
case 23:
#line 159 "cmExprParser.y" /* yacc.c:1652 */
{
(yyval.Number) = (yyvsp[0].Number);
}
#line 1472 "cmExprParser.cxx" /* yacc.c:1652 */
break;
case 24:
#line 162 "cmExprParser.y" /* yacc.c:1652 */
{
(yyval.Number) = (yyvsp[-1].Number);
}
#line 1469 "cmExprParser.cxx" /* yacc.c:1652 */
#line 1480 "cmExprParser.cxx" /* yacc.c:1652 */
break;
#line 1473 "cmExprParser.cxx" /* yacc.c:1652 */
#line 1484 "cmExprParser.cxx" /* yacc.c:1652 */
default: break;
}
/* User semantic actions sometimes alter yychar, and that requires
@ -1702,7 +1713,7 @@ yyreturn:
#endif
return yyresult;
}
#line 164 "cmExprParser.y" /* yacc.c:1918 */
#line 167 "cmExprParser.y" /* yacc.c:1918 */
/* End of grammar */

View File

@ -151,6 +151,9 @@ unary:
| exp_MINUS unary {
$<Number>$ = - $<Number>2;
}
| exp_NOT unary {
$<Number>$ = ~ $<Number>2;
}
factor:
exp_NUMBER {

View File

@ -16,6 +16,8 @@ set(expressions
"1000 -12*5"
"1000 +12*-5"
"1000 -12*-5"
"~~1"
"1000 & ~0"
)
set(FILE_EXPRESSIONS "extern void test_expression(int x, int y, const char * text);\n")

View File

@ -1,5 +1,5 @@
^CMake Error at MATH-InvalidExpression.cmake:1 \(math\):
math cannot parse the expression: "INVALID": syntax error, unexpected \$end,
expecting exp_PLUS or exp_MINUS or exp_OPENPARENT or exp_NUMBER \(7\).
math cannot parse the expression: "INVALID": syntax error, unexpected \$end
\(7\).
Call Stack \(most recent call first\):
CMakeLists.txt:3 \(include\)$