mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-08-16 06:05:14 +00:00
Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0e0d7d2975 | ||
|
|
5abbc66fe4 | ||
|
|
bf338b7cd2 | ||
|
|
3967e46a2d | ||
|
|
b994c3bf78 | ||
|
|
03a13ce793 | ||
|
|
f5fc21240f |
+1
-1
@@ -1 +1 @@
|
|||||||
3.1
|
3.1.90
|
||||||
|
|||||||
@@ -1,5 +1,11 @@
|
|||||||
GNU Bison NEWS
|
GNU Bison NEWS
|
||||||
|
|
||||||
|
* Noteworthy changes in release 3.1.91 (2018-10-18) [beta]
|
||||||
|
|
||||||
|
** Bug fixes
|
||||||
|
|
||||||
|
With modern C++, the parser stack failed to grow properly.
|
||||||
|
|
||||||
* Noteworthy changes in release 3.1.90 (2018-10-17) [beta]
|
* Noteworthy changes in release 3.1.90 (2018-10-17) [beta]
|
||||||
|
|
||||||
** Backward incompatible changes
|
** Backward incompatible changes
|
||||||
|
|||||||
@@ -602,6 +602,10 @@ m4_if(b4_prefix, [yy], [],
|
|||||||
{]b4_variant_if([
|
{]b4_variant_if([
|
||||||
b4_symbol_variant([that.type_get ()],
|
b4_symbol_variant([that.type_get ()],
|
||||||
[value], [YY_MOVE_OR_COPY], [YY_MOVE (that.value)])])[
|
[value], [YY_MOVE_OR_COPY], [YY_MOVE (that.value)])])[
|
||||||
|
#if defined __cplusplus && 201103L <= __cplusplus
|
||||||
|
// that is emptied.
|
||||||
|
that.state = empty_state;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
]b4_parser_class_name[::stack_symbol_type::stack_symbol_type (state_type s, YY_MOVE_REF (symbol_type) that)
|
]b4_parser_class_name[::stack_symbol_type::stack_symbol_type (state_type s, YY_MOVE_REF (symbol_type) that)
|
||||||
@@ -622,6 +626,8 @@ m4_if(b4_prefix, [yy], [],
|
|||||||
[value], [move], [YY_MOVE (that.value)])],
|
[value], [move], [YY_MOVE (that.value)])],
|
||||||
[[value = YY_MOVE (that.value);]])[]b4_locations_if([
|
[[value = YY_MOVE (that.value);]])[]b4_locations_if([
|
||||||
location = YY_MOVE (that.location);])[
|
location = YY_MOVE (that.location);])[
|
||||||
|
// that is emptied.
|
||||||
|
that.state = empty_state;
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
+38
-13
@@ -1,21 +1,46 @@
|
|||||||
This directory contains examples of Bison grammar files.
|
This directory contains examples of Bison grammar files.
|
||||||
|
|
||||||
* mfcalc
|
Most of them come from the documentation, which should be installed together
|
||||||
A C example of a multi-function calculator. Extracted from the
|
with Bison. The URLs are provided for convenience.
|
||||||
documentation.
|
|
||||||
|
|
||||||
* calc++
|
|
||||||
A C++ version of the canonical example for parsers: a calculator. Also uses
|
|
||||||
Flex for the scanner. Extracted from the documentation.
|
|
||||||
|
|
||||||
* variant.yy
|
* Examples in C
|
||||||
A C++ example that uses variants (they allow to use any C++ type as semantic
|
|
||||||
value type) and symbol constructors (they ensure consistency between
|
** rpcalc - Reverse Polish Notation Calculator
|
||||||
declared token type and effective semantic value).
|
The first example is that of a simple double-precision Reverse Polish
|
||||||
|
Notation calculator (a calculator using postfix operators). This example
|
||||||
|
provides a good starting point, since operator precedence is not an issue.
|
||||||
|
|
||||||
|
Extracted from the documentation: "Reverse Polish Notation Calculator"
|
||||||
|
https://www.gnu.org/software/bison/manual/html_node/RPN-Calc.html
|
||||||
|
|
||||||
|
** mfcalc - Multi-Function Calculator
|
||||||
|
A more complete C example: a multi-function calculator.
|
||||||
|
|
||||||
|
Extracted from the documentation: "Multi-Function Calculator: mfcalc".
|
||||||
|
https://www.gnu.org/software/bison/manual/html_node/Multi_002dfunction-Calc.html
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
* Examples in C++
|
||||||
|
|
||||||
|
** variant.yy - Self-contained example in C++
|
||||||
|
A simple C++ example in a single file, based on variants and symbol
|
||||||
|
constructors. Variants allow to use any C++ type as semantic value type,
|
||||||
|
and symbol constructors ensure consistency between declared token type and
|
||||||
|
effective semantic value.
|
||||||
|
|
||||||
|
** variant-11.yy - Self-contained example in modern C++
|
||||||
|
Another simple C++ example, closely related to the previous one, but
|
||||||
|
exhibiting support for C++11's move semantics.
|
||||||
|
|
||||||
|
** calc++ - A Complete C++ Example
|
||||||
|
A fully featured C++ version of the canonical example for parsers: a
|
||||||
|
calculator. Also uses Flex for the scanner.
|
||||||
|
|
||||||
|
Extracted from the documentation: "A Complete C++ Example".
|
||||||
|
https://www.gnu.org/software/bison/manual/html_node/A-Complete-C_002b_002b-Example.html
|
||||||
|
|
||||||
* variant-11.yy
|
|
||||||
Another C++ example, closely related to the previous one, but exhibiting
|
|
||||||
support for C++11's move semantics.
|
|
||||||
|
|
||||||
-----
|
-----
|
||||||
|
|
||||||
|
|||||||
@@ -16,4 +16,6 @@
|
|||||||
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
# along with this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
|
|
||||||
: >input
|
: >input
|
||||||
run 0 "{I have three numbers for you., 1, 2, 3, And that's all!}"
|
run 0 "{I have numbers for you., 1, 2, 3, And that's all!}" 4
|
||||||
|
|
||||||
|
run 0 "{I have numbers for you., 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 123, 124, 125, 126, 127, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 256, 257, 258, 259, 260, 261, 262, 263, 264, 265, 266, 267, 268, 269, 270, 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 281, 282, 283, 284, 285, 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 298, 299, 300, 301, 302, 303, 304, 305, 306, 307, 308, 309, 310, 311, 312, 313, 314, 315, 316, 317, 318, 319, 320, 321, 322, 323, 324, 325, 326, 327, 328, 329, 330, 331, 332, 333, 334, 335, 336, 337, 338, 339, 340, 341, 342, 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, 358, 359, 360, 361, 362, 363, 364, 365, 366, 367, 368, 369, 370, 371, 372, 373, 374, 375, 376, 377, 378, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, 390, 391, 392, 393, 394, 395, 396, 397, 398, 399, 400, 401, 402, 403, 404, 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 419, 420, 421, 422, 423, 424, 425, 426, 427, 428, 429, 430, 431, 432, 433, 434, 435, 436, 437, 438, 439, 440, 441, 442, 443, 444, 445, 446, 447, 448, 449, 450, 451, 452, 453, 454, 455, 456, 457, 458, 459, 460, 461, 462, 463, 464, 465, 466, 467, 468, 469, 470, 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, 486, 487, 488, 489, 490, 491, 492, 493, 494, 495, 496, 497, 498, 499, 500, 501, 502, 503, 504, 505, 506, 507, 508, 509, 510, 511, 512, 513, 514, 515, 516, 517, 518, 519, 520, 521, 522, 523, 524, 525, 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, 545, 546, 547, 548, 549, 550, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, 571, 572, 573, 574, 575, 576, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, 595, 596, 597, 598, 599, 600, 601, 602, 603, 604, 605, 606, 607, 608, 609, 610, 611, 612, 613, 614, 615, 616, 617, 618, 619, 620, 621, 622, 623, 624, 625, 626, 627, 628, 629, 630, 631, 632, 633, 634, 635, 636, 637, 638, 639, 640, 641, 642, 643, 644, 645, 646, 647, 648, 649, 650, 651, 652, 653, 654, 655, 656, 657, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 669, 670, 671, 672, 673, 674, 675, 676, 677, 678, 679, 680, 681, 682, 683, 684, 685, 686, 687, 688, 689, 690, 691, 692, 693, 694, 695, 696, 697, 698, 699, 700, 701, 702, 703, 704, 705, 706, 707, 708, 709, 710, 711, 712, 713, 714, 715, 716, 717, 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 739, 740, 741, 742, 743, 744, 745, 746, 747, 748, 749, 750, 751, 752, 753, 754, 755, 756, 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 770, 771, 772, 773, 774, 775, 776, 777, 778, 779, 780, 781, 782, 783, 784, 785, 786, 787, 788, 789, 790, 791, 792, 793, 794, 795, 796, 797, 798, 799, 800, 801, 802, 803, 804, 805, 806, 807, 808, 809, 810, 811, 812, 813, 814, 815, 816, 817, 818, 819, 820, 821, 822, 823, 824, 825, 826, 827, 828, 829, 830, 831, 832, 833, 834, 835, 836, 837, 838, 839, 840, 841, 842, 843, 844, 845, 846, 847, 848, 849, 850, 851, 852, 853, 854, 855, 856, 857, 858, 859, 860, 861, 862, 863, 864, 865, 866, 867, 868, 869, 870, 871, 872, 873, 874, 875, 876, 877, 878, 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, 893, 894, 895, 896, 897, 898, 899, 900, 901, 902, 903, 904, 905, 906, 907, 908, 909, 910, 911, 912, 913, 914, 915, 916, 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 930, 931, 932, 933, 934, 935, 936, 937, 938, 939, 940, 941, 942, 943, 944, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, 958, 959, 960, 961, 962, 963, 964, 965, 966, 967, 968, 969, 970, 971, 972, 973, 974, 975, 976, 977, 978, 979, 980, 981, 982, 983, 984, 985, 986, 987, 988, 989, 990, 991, 992, 993, 994, 995, 996, 997, 998, 999, And that's all!}" 1000
|
||||||
|
|||||||
+14
-14
@@ -107,6 +107,9 @@ item:
|
|||||||
;
|
;
|
||||||
%%
|
%%
|
||||||
|
|
||||||
|
// The last number return by the scanner is max - 1.
|
||||||
|
int max = 4;
|
||||||
|
|
||||||
namespace yy
|
namespace yy
|
||||||
{
|
{
|
||||||
// The yylex function providing subsequent tokens:
|
// The yylex function providing subsequent tokens:
|
||||||
@@ -125,19 +128,14 @@ namespace yy
|
|||||||
auto stage = count;
|
auto stage = count;
|
||||||
++count;
|
++count;
|
||||||
auto loc = parser::location_type{nullptr, stage + 1, stage + 1};
|
auto loc = parser::location_type{nullptr, stage + 1, stage + 1};
|
||||||
switch (stage)
|
if (stage == 0)
|
||||||
{
|
return parser::make_TEXT (make_string_uptr ("I have numbers for you."), std::move (loc));
|
||||||
case 0:
|
else if (stage < max)
|
||||||
return parser::make_TEXT (make_string_uptr ("I have three numbers for you."), std::move (loc));
|
return parser::make_NUMBER (stage, std::move (loc));
|
||||||
case 1:
|
else if (stage == max)
|
||||||
case 2:
|
return parser::make_TEXT (make_string_uptr ("And that's all!"), std::move (loc));
|
||||||
case 3:
|
else
|
||||||
return parser::make_NUMBER (stage, std::move (loc));
|
return parser::make_END_OF_FILE (std::move (loc));
|
||||||
case 4:
|
|
||||||
return parser::make_TEXT (make_string_uptr ("And that's all!"), std::move (loc));
|
|
||||||
default:
|
|
||||||
return parser::make_END_OF_FILE (std::move (loc));
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mandatory error function
|
// Mandatory error function
|
||||||
@@ -149,8 +147,10 @@ namespace yy
|
|||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
main ()
|
main (int argc, const char *argv[])
|
||||||
{
|
{
|
||||||
|
if (2 <= argc && isdigit (*argv[1]))
|
||||||
|
max = strtol (argv[1], YY_NULLPTR, 10);
|
||||||
auto&& p = yy::parser{};
|
auto&& p = yy::parser{};
|
||||||
p.set_debug_level (!!getenv ("YYDEBUG"));
|
p.set_debug_level (!!getenv ("YYDEBUG"));
|
||||||
return p.parse ();
|
return p.parse ();
|
||||||
|
|||||||
+4
-4
@@ -307,10 +307,10 @@ grammar_rule_check_and_complete (symbol_list *r)
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Install the default action only for C++. */
|
/* Install the default action only for C++. */
|
||||||
bool is_cxx =
|
const bool is_cxx =
|
||||||
skeleton
|
STREQ (language->language, "c++")
|
||||||
? STREQ (skeleton, "glr.cc") || STREQ (skeleton, "lalr1.cc")
|
|| (skeleton && (STREQ (skeleton, "glr.cc")
|
||||||
: STREQ (language->language, "c++");
|
|| STREQ (skeleton, "lalr1.cc")));
|
||||||
if (is_cxx)
|
if (is_cxx)
|
||||||
{
|
{
|
||||||
code_props_rule_action_init (&r->action_props, "{ $$ = $1; }",
|
code_props_rule_action_init (&r->action_props, "{ $$ = $1; }",
|
||||||
|
|||||||
+14
-6
@@ -162,19 +162,27 @@ int main()
|
|||||||
std::cerr << ss.value.as<int>() << '\n';
|
std::cerr << ss.value.as<int>() << '\n';
|
||||||
}
|
}
|
||||||
|
|
||||||
// pushing on the stack.
|
// Pushing on the stack.
|
||||||
|
// Sufficiently many so that it will be resized.
|
||||||
|
// Probably 3 times (starting at 200).
|
||||||
{
|
{
|
||||||
parser::stack_type st;
|
parser::stack_type st;
|
||||||
for (int i = 0; i < 100; ++i)
|
const int mucho = 1700;
|
||||||
|
for (int i = 0; i < mucho; ++i)
|
||||||
{
|
{
|
||||||
#if defined __cplusplus && 201103L <= __cplusplus
|
#if defined __cplusplus && 201103L <= __cplusplus
|
||||||
st.push(parser::stack_symbol_type{1, parser::make_INT(123)});
|
st.push(parser::stack_symbol_type{1, parser::make_INT (i)});
|
||||||
#else
|
#else
|
||||||
parser::symbol_type s = parser::make_INT(123);
|
parser::symbol_type s = parser::make_INT (i);
|
||||||
parser::stack_symbol_type ss(1, s);
|
parser::stack_symbol_type ss (1, s);
|
||||||
st.push(ss);
|
st.push (ss);
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
for (int i = mucho - 1; 0 <= i; --i)
|
||||||
|
{
|
||||||
|
assert (st[0].value.as<int>() == i);
|
||||||
|
st.pop ();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
]])
|
]])
|
||||||
|
|||||||
Reference in New Issue
Block a user