From 3c1f9d059e491977eb88ee04854fe71e0b7eadfc Mon Sep 17 00:00:00 2001 From: Brad King Date: Thu, 26 Feb 2026 14:03:03 -0500 Subject: [PATCH] cmExprParserHelper: Factor operation bodies out of the parser --- Source/LexerParser/cmExprParser.cxx | 96 ++++++++++++++--------------- Source/LexerParser/cmExprParser.y | 28 ++++----- Source/cmExprParserHelper.cxx | 41 ++++++++++++ Source/cmExprParserHelper.h | 8 +++ 4 files changed, 111 insertions(+), 62 deletions(-) diff --git a/Source/LexerParser/cmExprParser.cxx b/Source/LexerParser/cmExprParser.cxx index b63fbf4173..128e502cd0 100644 --- a/Source/LexerParser/cmExprParser.cxx +++ b/Source/LexerParser/cmExprParser.cxx @@ -90,7 +90,6 @@ Run bison like this: #include #include -#include /*-------------------------------------------------------------------------*/ #define YYDEBUG 1 @@ -126,7 +125,7 @@ static void cmExpr_yyerror(yyscan_t yyscanner, const char* message); # pragma diag_suppress 550 /* variable set but never used */ #endif -#line 130 "cmExprParser.cxx" +#line 129 "cmExprParser.cxx" # ifndef YY_CAST # ifdef __cplusplus @@ -568,8 +567,8 @@ static const yytype_int8 yytranslate[] = /* YYRLINE[YYN] -- Source line where rule number YYN was defined. */ static const yytype_uint8 yyrline[] = { - 0, 87, 87, 92, 95, 100, 103, 108, 111, 116, - 119, 122, 127, 130, 133, 138, 141, 144, 150, 158, + 0, 86, 86, 91, 94, 99, 102, 107, 110, 115, + 118, 122, 128, 131, 135, 141, 144, 148, 152, 158, 161, 164, 167, 172, 175 }; #endif @@ -1431,73 +1430,74 @@ yyreduce: switch (yyn) { case 2: /* start: exp */ -#line 87 "cmExprParser.y" +#line 86 "cmExprParser.y" { cmExpr_yyget_extra(yyscanner)->SetResult((yyvsp[0].Number)); } -#line 1439 "cmExprParser.cxx" +#line 1438 "cmExprParser.cxx" break; case 3: /* exp: bitwiseor */ -#line 92 "cmExprParser.y" +#line 91 "cmExprParser.y" { (yyval.Number) = (yyvsp[0].Number); } -#line 1447 "cmExprParser.cxx" +#line 1446 "cmExprParser.cxx" break; case 4: /* exp: exp exp_OR bitwiseor */ -#line 95 "cmExprParser.y" +#line 94 "cmExprParser.y" { (yyval.Number) = (yyvsp[-2].Number) | (yyvsp[0].Number); } -#line 1455 "cmExprParser.cxx" +#line 1454 "cmExprParser.cxx" break; case 5: /* bitwiseor: bitwisexor */ -#line 100 "cmExprParser.y" +#line 99 "cmExprParser.y" { (yyval.Number) = (yyvsp[0].Number); } -#line 1463 "cmExprParser.cxx" +#line 1462 "cmExprParser.cxx" break; case 6: /* bitwiseor: bitwiseor exp_XOR bitwisexor */ -#line 103 "cmExprParser.y" +#line 102 "cmExprParser.y" { (yyval.Number) = (yyvsp[-2].Number) ^ (yyvsp[0].Number); } -#line 1471 "cmExprParser.cxx" +#line 1470 "cmExprParser.cxx" break; case 7: /* bitwisexor: bitwiseand */ -#line 108 "cmExprParser.y" +#line 107 "cmExprParser.y" { (yyval.Number) = (yyvsp[0].Number); } -#line 1479 "cmExprParser.cxx" +#line 1478 "cmExprParser.cxx" break; case 8: /* bitwisexor: bitwisexor exp_AND bitwiseand */ -#line 111 "cmExprParser.y" +#line 110 "cmExprParser.y" { (yyval.Number) = (yyvsp[-2].Number) & (yyvsp[0].Number); } -#line 1487 "cmExprParser.cxx" +#line 1486 "cmExprParser.cxx" break; case 9: /* bitwiseand: shift */ -#line 116 "cmExprParser.y" +#line 115 "cmExprParser.y" { (yyval.Number) = (yyvsp[0].Number); } -#line 1495 "cmExprParser.cxx" +#line 1494 "cmExprParser.cxx" break; case 10: /* bitwiseand: bitwiseand exp_SHIFTLEFT shift */ -#line 119 "cmExprParser.y" +#line 118 "cmExprParser.y" { - (yyval.Number) = (yyvsp[-2].Number) << (yyvsp[0].Number); + (yyval.Number) = cmExpr_yyget_extra(yyscanner) + ->ShL((yyvsp[-2].Number), (yyvsp[0].Number)); } #line 1503 "cmExprParser.cxx" break; @@ -1505,69 +1505,69 @@ yyreduce: case 11: /* bitwiseand: bitwiseand exp_SHIFTRIGHT shift */ #line 122 "cmExprParser.y" { - (yyval.Number) = (yyvsp[-2].Number) >> (yyvsp[0].Number); + (yyval.Number) = cmExpr_yyget_extra(yyscanner) + ->ShR((yyvsp[-2].Number), (yyvsp[0].Number)); } -#line 1511 "cmExprParser.cxx" +#line 1512 "cmExprParser.cxx" break; case 12: /* shift: term */ -#line 127 "cmExprParser.y" +#line 128 "cmExprParser.y" { (yyval.Number) = (yyvsp[0].Number); } -#line 1519 "cmExprParser.cxx" +#line 1520 "cmExprParser.cxx" break; case 13: /* shift: shift exp_PLUS term */ -#line 130 "cmExprParser.y" +#line 131 "cmExprParser.y" { - (yyval.Number) = (yyvsp[-2].Number) + (yyvsp[0].Number); + (yyval.Number) = cmExpr_yyget_extra(yyscanner) + ->Add((yyvsp[-2].Number), (yyvsp[0].Number)); } -#line 1527 "cmExprParser.cxx" +#line 1529 "cmExprParser.cxx" break; case 14: /* shift: shift exp_MINUS term */ -#line 133 "cmExprParser.y" +#line 135 "cmExprParser.y" { - (yyval.Number) = (yyvsp[-2].Number) - (yyvsp[0].Number); + (yyval.Number) = cmExpr_yyget_extra(yyscanner) + ->Sub((yyvsp[-2].Number), (yyvsp[0].Number)); } -#line 1535 "cmExprParser.cxx" +#line 1538 "cmExprParser.cxx" break; case 15: /* term: unary */ -#line 138 "cmExprParser.y" +#line 141 "cmExprParser.y" { (yyval.Number) = (yyvsp[0].Number); } -#line 1543 "cmExprParser.cxx" +#line 1546 "cmExprParser.cxx" break; case 16: /* term: term exp_TIMES unary */ -#line 141 "cmExprParser.y" +#line 144 "cmExprParser.y" { - (yyval.Number) = (yyvsp[-2].Number) * (yyvsp[0].Number); + (yyval.Number) = cmExpr_yyget_extra(yyscanner) + ->Mul((yyvsp[-2].Number), (yyvsp[0].Number)); } -#line 1551 "cmExprParser.cxx" +#line 1555 "cmExprParser.cxx" break; case 17: /* term: term exp_DIVIDE unary */ -#line 144 "cmExprParser.y" +#line 148 "cmExprParser.y" { - if (yyvsp[0].Number == 0) { - throw std::overflow_error("divide by zero"); - } - (yyval.Number) = (yyvsp[-2].Number) / (yyvsp[0].Number); + (yyval.Number) = cmExpr_yyget_extra(yyscanner) + ->Div((yyvsp[-2].Number), (yyvsp[0].Number)); } -#line 1562 "cmExprParser.cxx" +#line 1564 "cmExprParser.cxx" break; case 18: /* term: term exp_MOD unary */ -#line 150 "cmExprParser.y" +#line 152 "cmExprParser.y" { - if (yyvsp[0].Number == 0) { - throw std::overflow_error("modulo by zero"); - } - (yyval.Number) = (yyvsp[-2].Number) % (yyvsp[0].Number); + (yyval.Number) = cmExpr_yyget_extra(yyscanner) + ->Mod((yyvsp[-2].Number), (yyvsp[0].Number)); } #line 1573 "cmExprParser.cxx" break; diff --git a/Source/LexerParser/cmExprParser.y b/Source/LexerParser/cmExprParser.y index 0cb120cbb5..52ac337b5c 100644 --- a/Source/LexerParser/cmExprParser.y +++ b/Source/LexerParser/cmExprParser.y @@ -15,7 +15,6 @@ Run bison like this: #include #include -#include /*-------------------------------------------------------------------------*/ #define YYDEBUG 1 @@ -117,10 +116,12 @@ bitwiseand: $$ = $1; } | bitwiseand exp_SHIFTLEFT shift { - $$ = $1 << $3; + $$ = cmExpr_yyget_extra(yyscanner) + ->ShL($1, $3); } | bitwiseand exp_SHIFTRIGHT shift { - $$ = $1 >> $3; + $$ = cmExpr_yyget_extra(yyscanner) + ->ShR($1, $3); } shift: @@ -128,10 +129,12 @@ shift: $$ = $1; } | shift exp_PLUS term { - $$ = $1 + $3; + $$ = cmExpr_yyget_extra(yyscanner) + ->Add($1, $3); } | shift exp_MINUS term { - $$ = $1 - $3; + $$ = cmExpr_yyget_extra(yyscanner) + ->Sub($1, $3); } term: @@ -139,19 +142,16 @@ term: $$ = $1; } | term exp_TIMES unary { - $$ = $1 * $3; + $$ = cmExpr_yyget_extra(yyscanner) + ->Mul($1, $3); } | term exp_DIVIDE unary { - if (yyvsp[0].Number == 0) { - throw std::overflow_error("divide by zero"); - } - $$ = $1 / $3; + $$ = cmExpr_yyget_extra(yyscanner) + ->Div($1, $3); } | term exp_MOD unary { - if (yyvsp[0].Number == 0) { - throw std::overflow_error("modulo by zero"); - } - $$ = $1 % $3; + $$ = cmExpr_yyget_extra(yyscanner) + ->Mod($1, $3); } unary: diff --git a/Source/cmExprParserHelper.cxx b/Source/cmExprParserHelper.cxx index d9aade4272..82f62f8464 100644 --- a/Source/cmExprParserHelper.cxx +++ b/Source/cmExprParserHelper.cxx @@ -118,3 +118,44 @@ void cmExprParserHelper::SetError(std::string errorString) { this->ErrorString = std::move(errorString); } + +std::int64_t cmExprParserHelper::ShL(std::int64_t l, std::int64_t r) +{ + return l << r; +} + +std::int64_t cmExprParserHelper::ShR(std::int64_t l, std::int64_t r) +{ + return l >> r; +} + +std::int64_t cmExprParserHelper::Add(std::int64_t l, std::int64_t r) +{ + return l + r; +} + +std::int64_t cmExprParserHelper::Sub(std::int64_t l, std::int64_t r) +{ + return l - r; +} + +std::int64_t cmExprParserHelper::Mul(std::int64_t l, std::int64_t r) +{ + return l * r; +} + +std::int64_t cmExprParserHelper::Div(std::int64_t l, std::int64_t r) +{ + if (r == 0) { + throw std::overflow_error("divide by zero"); + } + return l / r; +} + +std::int64_t cmExprParserHelper::Mod(std::int64_t l, std::int64_t r) +{ + if (r == 0) { + throw std::overflow_error("modulo by zero"); + } + return l % r; +} diff --git a/Source/cmExprParserHelper.h b/Source/cmExprParserHelper.h index a476c4b80e..90cce78e22 100644 --- a/Source/cmExprParserHelper.h +++ b/Source/cmExprParserHelper.h @@ -34,6 +34,14 @@ public: std::string const& GetWarning() const { return this->WarningString; } + std::int64_t ShL(std::int64_t l, std::int64_t r); + std::int64_t ShR(std::int64_t l, std::int64_t r); + std::int64_t Add(std::int64_t l, std::int64_t r); + std::int64_t Sub(std::int64_t l, std::int64_t r); + std::int64_t Mul(std::int64_t l, std::int64_t r); + std::int64_t Div(std::int64_t l, std::int64_t r); + std::int64_t Mod(std::int64_t l, std::int64_t r); + private: std::string::size_type InputBufferPos; std::string InputBuffer;