From 77ed7e62e5a599d3205079527a136f5ba06ffb1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Tue, 1 Jun 2004 09:52:43 +0000 Subject: [PATCH] Added GNU bison 1.875d git-svn-id: file:///srv/svn/repos/haiku/trunk/current@7726 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- src/apps/bin/bison/ABOUT-NLS | 768 + src/apps/bin/bison/AUTHORS | 8 + src/apps/bin/bison/COPYING | 340 + src/apps/bin/bison/ChangeLog | 12139 ++++ src/apps/bin/bison/GNUmakefile | 58 + src/apps/bin/bison/INSTALL | 229 + src/apps/bin/bison/Jamfile | 4 + src/apps/bin/bison/Makefile.am | 27 + src/apps/bin/bison/Makefile.cfg | 50 + src/apps/bin/bison/Makefile.in | 633 + src/apps/bin/bison/Makefile.maint | 516 + src/apps/bin/bison/NEWS | 591 + src/apps/bin/bison/OChangeLog | 1500 + src/apps/bin/bison/README | 49 + src/apps/bin/bison/README-alpha | 38 + src/apps/bin/bison/REFERENCES | 30 + src/apps/bin/bison/THANKS | 74 + src/apps/bin/bison/TODO | 357 + src/apps/bin/bison/aclocal.m4 | 979 + src/apps/bin/bison/config.h | 372 + src/apps/bin/bison/config.hin | 370 + src/apps/bin/bison/config/Makefile.am | 2 + src/apps/bin/bison/config/Makefile.in | 338 + src/apps/bin/bison/config/config.guess | 1459 + src/apps/bin/bison/config/config.rpath | 548 + src/apps/bin/bison/config/config.sub | 1549 + src/apps/bin/bison/config/depcomp | 526 + src/apps/bin/bison/config/install-sh | 325 + src/apps/bin/bison/config/mdate-sh | 170 + src/apps/bin/bison/config/missing | 360 + src/apps/bin/bison/config/mkinstalldirs | 150 + src/apps/bin/bison/config/move-if-change | 17 + src/apps/bin/bison/config/prev-version.txt | 1 + src/apps/bin/bison/config/texinfo.tex | 7006 +++ src/apps/bin/bison/config/ylwrap | 222 + src/apps/bin/bison/configure | 16198 +++++ src/apps/bin/bison/configure.ac | 125 + src/apps/bin/bison/data/Makefile.am | 21 + src/apps/bin/bison/data/Makefile.in | 385 + src/apps/bin/bison/data/README | 45 + src/apps/bin/bison/data/c.m4 | 412 + src/apps/bin/bison/data/glr.c | 2043 + src/apps/bin/bison/data/lalr1.cc | 1225 + src/apps/bin/bison/data/m4sugar/m4sugar.m4 | 1803 + src/apps/bin/bison/data/yacc.c | 1285 + src/apps/bin/bison/doc/FAQ | 109 + src/apps/bin/bison/doc/Makefile.am | 31 + src/apps/bin/bison/doc/Makefile.in | 570 + src/apps/bin/bison/doc/bison.1 | 369 + src/apps/bin/bison/doc/bison.info | 7548 +++ src/apps/bin/bison/doc/bison.texinfo | 7229 +++ src/apps/bin/bison/doc/fdl.texi | 452 + src/apps/bin/bison/doc/gpl.texi | 392 + src/apps/bin/bison/doc/refcard.tex | 512 + src/apps/bin/bison/doc/stamp-vti | 4 + src/apps/bin/bison/doc/version.texi | 4 + src/apps/bin/bison/lib/Jamfile | 42 + src/apps/bin/bison/lib/Makefile.am | 53 + src/apps/bin/bison/lib/Makefile.in | 600 + src/apps/bin/bison/lib/abitset.c | 830 + src/apps/bin/bison/lib/abitset.h | 28 + src/apps/bin/bison/lib/alloca.c | 491 + src/apps/bin/bison/lib/alloca_.h | 54 + src/apps/bin/bison/lib/argmatch.c | 277 + src/apps/bin/bison/lib/argmatch.h | 111 + src/apps/bin/bison/lib/basename.c | 79 + src/apps/bin/bison/lib/bbitset.h | 302 + src/apps/bin/bison/lib/bitset.c | 505 + src/apps/bin/bison/lib/bitset.h | 389 + src/apps/bin/bison/lib/bitset_stats.c | 732 + src/apps/bin/bison/lib/bitset_stats.h | 32 + src/apps/bin/bison/lib/bitsetv-print.c | 74 + src/apps/bin/bison/lib/bitsetv-print.h | 27 + src/apps/bin/bison/lib/bitsetv.c | 172 + src/apps/bin/bison/lib/bitsetv.h | 59 + src/apps/bin/bison/lib/dirname.c | 119 + src/apps/bin/bison/lib/dirname.h | 43 + src/apps/bin/bison/lib/ebitset.c | 1367 + src/apps/bin/bison/lib/ebitset.h | 30 + src/apps/bin/bison/lib/error.c | 310 + src/apps/bin/bison/lib/error.h | 66 + src/apps/bin/bison/lib/exit.h | 32 + src/apps/bin/bison/lib/exitfail.c | 27 + src/apps/bin/bison/lib/exitfail.h | 20 + src/apps/bin/bison/lib/get-errno.c | 45 + src/apps/bin/bison/lib/get-errno.h | 20 + src/apps/bin/bison/lib/getopt.c | 1254 + src/apps/bin/bison/lib/getopt.h | 176 + src/apps/bin/bison/lib/getopt1.c | 191 + src/apps/bin/bison/lib/getopt_int.h | 129 + src/apps/bin/bison/lib/gettext.h | 68 + src/apps/bin/bison/lib/gnulib.mk | 61 + src/apps/bin/bison/lib/hard-locale.c | 74 + src/apps/bin/bison/lib/hard-locale.h | 24 + src/apps/bin/bison/lib/hash.c | 1048 + src/apps/bin/bison/lib/hash.h | 88 + src/apps/bin/bison/lib/lbitset.c | 1406 + src/apps/bin/bison/lib/lbitset.h | 30 + src/apps/bin/bison/lib/libiberty.h | 36 + src/apps/bin/bison/lib/main.c | 38 + src/apps/bin/bison/lib/malloc.c | 36 + src/apps/bin/bison/lib/mbswidth.c | 219 + src/apps/bin/bison/lib/mbswidth.h | 51 + src/apps/bin/bison/lib/obstack.c | 424 + src/apps/bin/bison/lib/obstack.h | 506 + src/apps/bin/bison/lib/quote.c | 41 + src/apps/bin/bison/lib/quote.h | 22 + src/apps/bin/bison/lib/quotearg.c | 672 + src/apps/bin/bison/lib/quotearg.h | 137 + src/apps/bin/bison/lib/realloc.c | 39 + src/apps/bin/bison/lib/stdbool_.h | 93 + src/apps/bin/bison/lib/stpcpy.c | 50 + src/apps/bin/bison/lib/stpcpy.h | 33 + src/apps/bin/bison/lib/stripslash.c | 39 + src/apps/bin/bison/lib/strndup.c | 55 + src/apps/bin/bison/lib/strndup.h | 30 + src/apps/bin/bison/lib/strnlen.c | 48 + src/apps/bin/bison/lib/subpipe.c | 180 + src/apps/bin/bison/lib/subpipe.h | 30 + src/apps/bin/bison/lib/timevar.c | 565 + src/apps/bin/bison/lib/timevar.def | 56 + src/apps/bin/bison/lib/timevar.h | 93 + src/apps/bin/bison/lib/unlocked-io.h | 132 + src/apps/bin/bison/lib/vbitset.c | 1140 + src/apps/bin/bison/lib/vbitset.h | 28 + src/apps/bin/bison/lib/xalloc.h | 87 + src/apps/bin/bison/lib/xmalloc.c | 255 + src/apps/bin/bison/lib/xstrdup.c | 33 + src/apps/bin/bison/lib/xstrndup.c | 39 + src/apps/bin/bison/lib/xstrndup.h | 24 + src/apps/bin/bison/lib/yyerror.c | 30 + src/apps/bin/bison/m4/alloca.m4 | 44 + src/apps/bin/bison/m4/dirname.m4 | 15 + src/apps/bin/bison/m4/dmalloc.m4 | 22 + src/apps/bin/bison/m4/dos.m4 | 70 + src/apps/bin/bison/m4/error.m4 | 15 + src/apps/bin/bison/m4/exitfail.m4 | 13 + src/apps/bin/bison/m4/extensions.m4 | 29 + src/apps/bin/bison/m4/getopt.m4 | 13 + src/apps/bin/bison/m4/gettext.m4 | 371 + src/apps/bin/bison/m4/gnulib.m4 | 49 + src/apps/bin/bison/m4/hard-locale.m4 | 14 + src/apps/bin/bison/m4/hash.m4 | 13 + src/apps/bin/bison/m4/iconv.m4 | 103 + src/apps/bin/bison/m4/lib-ld.m4 | 112 + src/apps/bin/bison/m4/lib-link.m4 | 551 + src/apps/bin/bison/m4/lib-prefix.m4 | 155 + src/apps/bin/bison/m4/m4.m4 | 29 + src/apps/bin/bison/m4/mbrtowc.m4 | 27 + src/apps/bin/bison/m4/mbstate_t.m4 | 32 + src/apps/bin/bison/m4/mbswidth.m4 | 55 + src/apps/bin/bison/m4/nls.m4 | 49 + src/apps/bin/bison/m4/obstack.m4 | 19 + src/apps/bin/bison/m4/onceonly.m4 | 86 + src/apps/bin/bison/m4/po.m4 | 426 + src/apps/bin/bison/m4/progtest.m4 | 91 + src/apps/bin/bison/m4/quote.m4 | 13 + src/apps/bin/bison/m4/quotearg.m4 | 16 + src/apps/bin/bison/m4/stdbool.m4 | 89 + src/apps/bin/bison/m4/stpcpy.m4 | 24 + src/apps/bin/bison/m4/strndup.m4 | 24 + src/apps/bin/bison/m4/strnlen.m4 | 27 + src/apps/bin/bison/m4/subpipe.m4 | 30 + src/apps/bin/bison/m4/timevar.m4 | 61 + src/apps/bin/bison/m4/unlocked-io.m4 | 22 + src/apps/bin/bison/m4/warning.m4 | 32 + src/apps/bin/bison/m4/xalloc.m4 | 32 + src/apps/bin/bison/m4/xstrndup.m4 | 17 + src/apps/bin/bison/po/LINGUAS | 16 + src/apps/bin/bison/po/Makefile.in.in | 367 + src/apps/bin/bison/po/Makevars | 41 + src/apps/bin/bison/po/POTFILES.in | 23 + src/apps/bin/bison/po/Rules-quot | 47 + src/apps/bin/bison/po/bison.pot | 698 + src/apps/bin/bison/po/boldquot.sed | 10 + src/apps/bin/bison/po/da.gmo | Bin 0 -> 14350 bytes src/apps/bin/bison/po/da.po | 740 + src/apps/bin/bison/po/de.gmo | Bin 0 -> 14927 bytes src/apps/bin/bison/po/de.po | 1038 + src/apps/bin/bison/po/en@boldquot.header | 25 + src/apps/bin/bison/po/en@quot.header | 22 + src/apps/bin/bison/po/es.gmo | Bin 0 -> 14972 bytes src/apps/bin/bison/po/es.po | 1048 + src/apps/bin/bison/po/et.gmo | Bin 0 -> 14225 bytes src/apps/bin/bison/po/et.po | 734 + src/apps/bin/bison/po/fr.gmo | Bin 0 -> 15131 bytes src/apps/bin/bison/po/fr.po | 1210 + src/apps/bin/bison/po/hr.gmo | Bin 0 -> 6661 bytes src/apps/bin/bison/po/hr.po | 922 + src/apps/bin/bison/po/id.gmo | Bin 0 -> 14428 bytes src/apps/bin/bison/po/id.po | 750 + src/apps/bin/bison/po/insert-header.sin | 23 + src/apps/bin/bison/po/it.gmo | Bin 0 -> 12359 bytes src/apps/bin/bison/po/it.po | 787 + src/apps/bin/bison/po/ja.gmo | Bin 0 -> 6792 bytes src/apps/bin/bison/po/ja.po | 1080 + src/apps/bin/bison/po/ms.gmo | Bin 0 -> 14582 bytes src/apps/bin/bison/po/ms.po | 738 + src/apps/bin/bison/po/nl.gmo | Bin 0 -> 14803 bytes src/apps/bin/bison/po/nl.po | 750 + src/apps/bin/bison/po/pt_BR.gmo | Bin 0 -> 14670 bytes src/apps/bin/bison/po/pt_BR.po | 736 + src/apps/bin/bison/po/quot.sed | 6 + src/apps/bin/bison/po/remove-potcdate.sin | 19 + src/apps/bin/bison/po/ro.gmo | Bin 0 -> 14732 bytes src/apps/bin/bison/po/ro.po | 743 + src/apps/bin/bison/po/ru.gmo | Bin 0 -> 12402 bytes src/apps/bin/bison/po/ru.po | 989 + src/apps/bin/bison/po/stamp-po | 1 + src/apps/bin/bison/po/sv.gmo | Bin 0 -> 14296 bytes src/apps/bin/bison/po/sv.po | 741 + src/apps/bin/bison/po/tr.gmo | Bin 0 -> 14479 bytes src/apps/bin/bison/po/tr.po | 928 + src/apps/bin/bison/src/Jamfile | 41 + src/apps/bin/bison/src/LR0.c | 380 + src/apps/bin/bison/src/LR0.h | 28 + src/apps/bin/bison/src/Makefile.am | 79 + src/apps/bin/bison/src/Makefile.in | 623 + src/apps/bin/bison/src/assoc.c | 44 + src/apps/bin/bison/src/assoc.h | 35 + src/apps/bin/bison/src/bison.rdef | 11 + src/apps/bin/bison/src/closure.c | 247 + src/apps/bin/bison/src/closure.h | 59 + src/apps/bin/bison/src/complain.c | 145 + src/apps/bin/bison/src/complain.h | 62 + src/apps/bin/bison/src/conflicts.c | 529 + src/apps/bin/bison/src/conflicts.h | 34 + src/apps/bin/bison/src/derives.c | 121 + src/apps/bin/bison/src/derives.h | 37 + src/apps/bin/bison/src/files.c | 338 + src/apps/bin/bison/src/files.h | 71 + src/apps/bin/bison/src/getargs.c | 445 + src/apps/bin/bison/src/getargs.h | 87 + src/apps/bin/bison/src/gram.c | 335 + src/apps/bin/bison/src/gram.h | 260 + src/apps/bin/bison/src/lalr.c | 455 + src/apps/bin/bison/src/lalr.h | 67 + src/apps/bin/bison/src/location.c | 46 + src/apps/bin/bison/src/location.h | 65 + src/apps/bin/bison/src/main.c | 194 + src/apps/bin/bison/src/muscle_tab.c | 239 + src/apps/bin/bison/src/muscle_tab.h | 108 + src/apps/bin/bison/src/nullable.c | 143 + src/apps/bin/bison/src/nullable.h | 33 + src/apps/bin/bison/src/output.c | 646 + src/apps/bin/bison/src/output.h | 29 + src/apps/bin/bison/src/parse-gram.c | 2059 + src/apps/bin/bison/src/parse-gram.h | 170 + src/apps/bin/bison/src/parse-gram.y | 560 + src/apps/bin/bison/src/print.c | 575 + src/apps/bin/bison/src/print.h | 26 + src/apps/bin/bison/src/print_graph.c | 233 + src/apps/bin/bison/src/print_graph.h | 26 + src/apps/bin/bison/src/reader.c | 535 + src/apps/bin/bison/src/reader.h | 78 + src/apps/bin/bison/src/reduce.c | 469 + src/apps/bin/bison/src/reduce.h | 31 + src/apps/bin/bison/src/relation.c | 183 + src/apps/bin/bison/src/relation.h | 48 + src/apps/bin/bison/src/scan-gram.c | 3353 + src/apps/bin/bison/src/scan-gram.l | 1072 + src/apps/bin/bison/src/scan-skel.c | 1727 + src/apps/bin/bison/src/scan-skel.l | 98 + src/apps/bin/bison/src/state.c | 371 + src/apps/bin/bison/src/state.h | 257 + src/apps/bin/bison/src/symlist.c | 115 + src/apps/bin/bison/src/symlist.h | 62 + src/apps/bin/bison/src/symtab.c | 597 + src/apps/bin/bison/src/symtab.h | 149 + src/apps/bin/bison/src/system.h | 222 + src/apps/bin/bison/src/tables.c | 861 + src/apps/bin/bison/src/tables.h | 119 + src/apps/bin/bison/src/uniqstr.c | 151 + src/apps/bin/bison/src/uniqstr.h | 53 + src/apps/bin/bison/src/vcg.c | 873 + src/apps/bin/bison/src/vcg.h | 1011 + src/apps/bin/bison/src/vcg_defaults.h | 181 + src/apps/bin/bison/tests/Makefile.am | 98 + src/apps/bin/bison/tests/Makefile.in | 411 + src/apps/bin/bison/tests/actions.at | 560 + src/apps/bin/bison/tests/atlocal.in | 27 + src/apps/bin/bison/tests/bison.in | 8 + src/apps/bin/bison/tests/calc.at | 633 + src/apps/bin/bison/tests/conflicts.at | 621 + src/apps/bin/bison/tests/cxx-type.at | 376 + src/apps/bin/bison/tests/existing.at | 2753 + src/apps/bin/bison/tests/glr-regression.at | 220 + src/apps/bin/bison/tests/headers.at | 136 + src/apps/bin/bison/tests/input.at | 237 + src/apps/bin/bison/tests/local.at | 206 + src/apps/bin/bison/tests/output.at | 83 + src/apps/bin/bison/tests/package.m4 | 6 + src/apps/bin/bison/tests/reduce.at | 355 + src/apps/bin/bison/tests/regression.at | 794 + src/apps/bin/bison/tests/sets.at | 254 + src/apps/bin/bison/tests/synclines.at | 173 + src/apps/bin/bison/tests/testsuite | 60357 +++++++++++++++++++ src/apps/bin/bison/tests/testsuite.at | 63 + src/apps/bin/bison/tests/torture.at | 473 + 299 files changed, 198480 insertions(+) create mode 100644 src/apps/bin/bison/ABOUT-NLS create mode 100644 src/apps/bin/bison/AUTHORS create mode 100644 src/apps/bin/bison/COPYING create mode 100644 src/apps/bin/bison/ChangeLog create mode 100644 src/apps/bin/bison/GNUmakefile create mode 100644 src/apps/bin/bison/INSTALL create mode 100644 src/apps/bin/bison/Jamfile create mode 100644 src/apps/bin/bison/Makefile.am create mode 100644 src/apps/bin/bison/Makefile.cfg create mode 100644 src/apps/bin/bison/Makefile.in create mode 100644 src/apps/bin/bison/Makefile.maint create mode 100644 src/apps/bin/bison/NEWS create mode 100644 src/apps/bin/bison/OChangeLog create mode 100644 src/apps/bin/bison/README create mode 100644 src/apps/bin/bison/README-alpha create mode 100644 src/apps/bin/bison/REFERENCES create mode 100644 src/apps/bin/bison/THANKS create mode 100644 src/apps/bin/bison/TODO create mode 100644 src/apps/bin/bison/aclocal.m4 create mode 100644 src/apps/bin/bison/config.h create mode 100644 src/apps/bin/bison/config.hin create mode 100644 src/apps/bin/bison/config/Makefile.am create mode 100644 src/apps/bin/bison/config/Makefile.in create mode 100644 src/apps/bin/bison/config/config.guess create mode 100644 src/apps/bin/bison/config/config.rpath create mode 100644 src/apps/bin/bison/config/config.sub create mode 100644 src/apps/bin/bison/config/depcomp create mode 100644 src/apps/bin/bison/config/install-sh create mode 100644 src/apps/bin/bison/config/mdate-sh create mode 100644 src/apps/bin/bison/config/missing create mode 100644 src/apps/bin/bison/config/mkinstalldirs create mode 100644 src/apps/bin/bison/config/move-if-change create mode 100644 src/apps/bin/bison/config/prev-version.txt create mode 100644 src/apps/bin/bison/config/texinfo.tex create mode 100644 src/apps/bin/bison/config/ylwrap create mode 100644 src/apps/bin/bison/configure create mode 100644 src/apps/bin/bison/configure.ac create mode 100644 src/apps/bin/bison/data/Makefile.am create mode 100644 src/apps/bin/bison/data/Makefile.in create mode 100644 src/apps/bin/bison/data/README create mode 100644 src/apps/bin/bison/data/c.m4 create mode 100644 src/apps/bin/bison/data/glr.c create mode 100644 src/apps/bin/bison/data/lalr1.cc create mode 100644 src/apps/bin/bison/data/m4sugar/m4sugar.m4 create mode 100644 src/apps/bin/bison/data/yacc.c create mode 100644 src/apps/bin/bison/doc/FAQ create mode 100644 src/apps/bin/bison/doc/Makefile.am create mode 100644 src/apps/bin/bison/doc/Makefile.in create mode 100644 src/apps/bin/bison/doc/bison.1 create mode 100644 src/apps/bin/bison/doc/bison.info create mode 100644 src/apps/bin/bison/doc/bison.texinfo create mode 100644 src/apps/bin/bison/doc/fdl.texi create mode 100644 src/apps/bin/bison/doc/gpl.texi create mode 100644 src/apps/bin/bison/doc/refcard.tex create mode 100644 src/apps/bin/bison/doc/stamp-vti create mode 100644 src/apps/bin/bison/doc/version.texi create mode 100644 src/apps/bin/bison/lib/Jamfile create mode 100644 src/apps/bin/bison/lib/Makefile.am create mode 100644 src/apps/bin/bison/lib/Makefile.in create mode 100644 src/apps/bin/bison/lib/abitset.c create mode 100644 src/apps/bin/bison/lib/abitset.h create mode 100644 src/apps/bin/bison/lib/alloca.c create mode 100644 src/apps/bin/bison/lib/alloca_.h create mode 100644 src/apps/bin/bison/lib/argmatch.c create mode 100644 src/apps/bin/bison/lib/argmatch.h create mode 100644 src/apps/bin/bison/lib/basename.c create mode 100644 src/apps/bin/bison/lib/bbitset.h create mode 100644 src/apps/bin/bison/lib/bitset.c create mode 100644 src/apps/bin/bison/lib/bitset.h create mode 100644 src/apps/bin/bison/lib/bitset_stats.c create mode 100644 src/apps/bin/bison/lib/bitset_stats.h create mode 100644 src/apps/bin/bison/lib/bitsetv-print.c create mode 100644 src/apps/bin/bison/lib/bitsetv-print.h create mode 100644 src/apps/bin/bison/lib/bitsetv.c create mode 100644 src/apps/bin/bison/lib/bitsetv.h create mode 100644 src/apps/bin/bison/lib/dirname.c create mode 100644 src/apps/bin/bison/lib/dirname.h create mode 100644 src/apps/bin/bison/lib/ebitset.c create mode 100644 src/apps/bin/bison/lib/ebitset.h create mode 100644 src/apps/bin/bison/lib/error.c create mode 100644 src/apps/bin/bison/lib/error.h create mode 100644 src/apps/bin/bison/lib/exit.h create mode 100644 src/apps/bin/bison/lib/exitfail.c create mode 100644 src/apps/bin/bison/lib/exitfail.h create mode 100644 src/apps/bin/bison/lib/get-errno.c create mode 100644 src/apps/bin/bison/lib/get-errno.h create mode 100644 src/apps/bin/bison/lib/getopt.c create mode 100644 src/apps/bin/bison/lib/getopt.h create mode 100644 src/apps/bin/bison/lib/getopt1.c create mode 100644 src/apps/bin/bison/lib/getopt_int.h create mode 100644 src/apps/bin/bison/lib/gettext.h create mode 100644 src/apps/bin/bison/lib/gnulib.mk create mode 100644 src/apps/bin/bison/lib/hard-locale.c create mode 100644 src/apps/bin/bison/lib/hard-locale.h create mode 100644 src/apps/bin/bison/lib/hash.c create mode 100644 src/apps/bin/bison/lib/hash.h create mode 100644 src/apps/bin/bison/lib/lbitset.c create mode 100644 src/apps/bin/bison/lib/lbitset.h create mode 100644 src/apps/bin/bison/lib/libiberty.h create mode 100644 src/apps/bin/bison/lib/main.c create mode 100644 src/apps/bin/bison/lib/malloc.c create mode 100644 src/apps/bin/bison/lib/mbswidth.c create mode 100644 src/apps/bin/bison/lib/mbswidth.h create mode 100644 src/apps/bin/bison/lib/obstack.c create mode 100644 src/apps/bin/bison/lib/obstack.h create mode 100644 src/apps/bin/bison/lib/quote.c create mode 100644 src/apps/bin/bison/lib/quote.h create mode 100644 src/apps/bin/bison/lib/quotearg.c create mode 100644 src/apps/bin/bison/lib/quotearg.h create mode 100644 src/apps/bin/bison/lib/realloc.c create mode 100644 src/apps/bin/bison/lib/stdbool_.h create mode 100644 src/apps/bin/bison/lib/stpcpy.c create mode 100644 src/apps/bin/bison/lib/stpcpy.h create mode 100644 src/apps/bin/bison/lib/stripslash.c create mode 100644 src/apps/bin/bison/lib/strndup.c create mode 100644 src/apps/bin/bison/lib/strndup.h create mode 100644 src/apps/bin/bison/lib/strnlen.c create mode 100644 src/apps/bin/bison/lib/subpipe.c create mode 100644 src/apps/bin/bison/lib/subpipe.h create mode 100644 src/apps/bin/bison/lib/timevar.c create mode 100644 src/apps/bin/bison/lib/timevar.def create mode 100644 src/apps/bin/bison/lib/timevar.h create mode 100644 src/apps/bin/bison/lib/unlocked-io.h create mode 100644 src/apps/bin/bison/lib/vbitset.c create mode 100644 src/apps/bin/bison/lib/vbitset.h create mode 100644 src/apps/bin/bison/lib/xalloc.h create mode 100644 src/apps/bin/bison/lib/xmalloc.c create mode 100644 src/apps/bin/bison/lib/xstrdup.c create mode 100644 src/apps/bin/bison/lib/xstrndup.c create mode 100644 src/apps/bin/bison/lib/xstrndup.h create mode 100644 src/apps/bin/bison/lib/yyerror.c create mode 100644 src/apps/bin/bison/m4/alloca.m4 create mode 100644 src/apps/bin/bison/m4/dirname.m4 create mode 100644 src/apps/bin/bison/m4/dmalloc.m4 create mode 100644 src/apps/bin/bison/m4/dos.m4 create mode 100644 src/apps/bin/bison/m4/error.m4 create mode 100644 src/apps/bin/bison/m4/exitfail.m4 create mode 100644 src/apps/bin/bison/m4/extensions.m4 create mode 100644 src/apps/bin/bison/m4/getopt.m4 create mode 100644 src/apps/bin/bison/m4/gettext.m4 create mode 100644 src/apps/bin/bison/m4/gnulib.m4 create mode 100644 src/apps/bin/bison/m4/hard-locale.m4 create mode 100644 src/apps/bin/bison/m4/hash.m4 create mode 100644 src/apps/bin/bison/m4/iconv.m4 create mode 100644 src/apps/bin/bison/m4/lib-ld.m4 create mode 100644 src/apps/bin/bison/m4/lib-link.m4 create mode 100644 src/apps/bin/bison/m4/lib-prefix.m4 create mode 100644 src/apps/bin/bison/m4/m4.m4 create mode 100644 src/apps/bin/bison/m4/mbrtowc.m4 create mode 100644 src/apps/bin/bison/m4/mbstate_t.m4 create mode 100644 src/apps/bin/bison/m4/mbswidth.m4 create mode 100644 src/apps/bin/bison/m4/nls.m4 create mode 100644 src/apps/bin/bison/m4/obstack.m4 create mode 100644 src/apps/bin/bison/m4/onceonly.m4 create mode 100644 src/apps/bin/bison/m4/po.m4 create mode 100644 src/apps/bin/bison/m4/progtest.m4 create mode 100644 src/apps/bin/bison/m4/quote.m4 create mode 100644 src/apps/bin/bison/m4/quotearg.m4 create mode 100644 src/apps/bin/bison/m4/stdbool.m4 create mode 100644 src/apps/bin/bison/m4/stpcpy.m4 create mode 100644 src/apps/bin/bison/m4/strndup.m4 create mode 100644 src/apps/bin/bison/m4/strnlen.m4 create mode 100644 src/apps/bin/bison/m4/subpipe.m4 create mode 100644 src/apps/bin/bison/m4/timevar.m4 create mode 100644 src/apps/bin/bison/m4/unlocked-io.m4 create mode 100644 src/apps/bin/bison/m4/warning.m4 create mode 100644 src/apps/bin/bison/m4/xalloc.m4 create mode 100644 src/apps/bin/bison/m4/xstrndup.m4 create mode 100644 src/apps/bin/bison/po/LINGUAS create mode 100644 src/apps/bin/bison/po/Makefile.in.in create mode 100644 src/apps/bin/bison/po/Makevars create mode 100644 src/apps/bin/bison/po/POTFILES.in create mode 100644 src/apps/bin/bison/po/Rules-quot create mode 100644 src/apps/bin/bison/po/bison.pot create mode 100644 src/apps/bin/bison/po/boldquot.sed create mode 100644 src/apps/bin/bison/po/da.gmo create mode 100644 src/apps/bin/bison/po/da.po create mode 100644 src/apps/bin/bison/po/de.gmo create mode 100644 src/apps/bin/bison/po/de.po create mode 100644 src/apps/bin/bison/po/en@boldquot.header create mode 100644 src/apps/bin/bison/po/en@quot.header create mode 100644 src/apps/bin/bison/po/es.gmo create mode 100644 src/apps/bin/bison/po/es.po create mode 100644 src/apps/bin/bison/po/et.gmo create mode 100644 src/apps/bin/bison/po/et.po create mode 100644 src/apps/bin/bison/po/fr.gmo create mode 100644 src/apps/bin/bison/po/fr.po create mode 100644 src/apps/bin/bison/po/hr.gmo create mode 100644 src/apps/bin/bison/po/hr.po create mode 100644 src/apps/bin/bison/po/id.gmo create mode 100644 src/apps/bin/bison/po/id.po create mode 100644 src/apps/bin/bison/po/insert-header.sin create mode 100644 src/apps/bin/bison/po/it.gmo create mode 100644 src/apps/bin/bison/po/it.po create mode 100644 src/apps/bin/bison/po/ja.gmo create mode 100644 src/apps/bin/bison/po/ja.po create mode 100644 src/apps/bin/bison/po/ms.gmo create mode 100644 src/apps/bin/bison/po/ms.po create mode 100644 src/apps/bin/bison/po/nl.gmo create mode 100644 src/apps/bin/bison/po/nl.po create mode 100644 src/apps/bin/bison/po/pt_BR.gmo create mode 100644 src/apps/bin/bison/po/pt_BR.po create mode 100644 src/apps/bin/bison/po/quot.sed create mode 100644 src/apps/bin/bison/po/remove-potcdate.sin create mode 100644 src/apps/bin/bison/po/ro.gmo create mode 100644 src/apps/bin/bison/po/ro.po create mode 100644 src/apps/bin/bison/po/ru.gmo create mode 100644 src/apps/bin/bison/po/ru.po create mode 100644 src/apps/bin/bison/po/stamp-po create mode 100644 src/apps/bin/bison/po/sv.gmo create mode 100644 src/apps/bin/bison/po/sv.po create mode 100644 src/apps/bin/bison/po/tr.gmo create mode 100644 src/apps/bin/bison/po/tr.po create mode 100644 src/apps/bin/bison/src/Jamfile create mode 100644 src/apps/bin/bison/src/LR0.c create mode 100644 src/apps/bin/bison/src/LR0.h create mode 100644 src/apps/bin/bison/src/Makefile.am create mode 100644 src/apps/bin/bison/src/Makefile.in create mode 100644 src/apps/bin/bison/src/assoc.c create mode 100644 src/apps/bin/bison/src/assoc.h create mode 100644 src/apps/bin/bison/src/bison.rdef create mode 100644 src/apps/bin/bison/src/closure.c create mode 100644 src/apps/bin/bison/src/closure.h create mode 100644 src/apps/bin/bison/src/complain.c create mode 100644 src/apps/bin/bison/src/complain.h create mode 100644 src/apps/bin/bison/src/conflicts.c create mode 100644 src/apps/bin/bison/src/conflicts.h create mode 100644 src/apps/bin/bison/src/derives.c create mode 100644 src/apps/bin/bison/src/derives.h create mode 100644 src/apps/bin/bison/src/files.c create mode 100644 src/apps/bin/bison/src/files.h create mode 100644 src/apps/bin/bison/src/getargs.c create mode 100644 src/apps/bin/bison/src/getargs.h create mode 100644 src/apps/bin/bison/src/gram.c create mode 100644 src/apps/bin/bison/src/gram.h create mode 100644 src/apps/bin/bison/src/lalr.c create mode 100644 src/apps/bin/bison/src/lalr.h create mode 100644 src/apps/bin/bison/src/location.c create mode 100644 src/apps/bin/bison/src/location.h create mode 100644 src/apps/bin/bison/src/main.c create mode 100644 src/apps/bin/bison/src/muscle_tab.c create mode 100644 src/apps/bin/bison/src/muscle_tab.h create mode 100644 src/apps/bin/bison/src/nullable.c create mode 100644 src/apps/bin/bison/src/nullable.h create mode 100644 src/apps/bin/bison/src/output.c create mode 100644 src/apps/bin/bison/src/output.h create mode 100644 src/apps/bin/bison/src/parse-gram.c create mode 100644 src/apps/bin/bison/src/parse-gram.h create mode 100644 src/apps/bin/bison/src/parse-gram.y create mode 100644 src/apps/bin/bison/src/print.c create mode 100644 src/apps/bin/bison/src/print.h create mode 100644 src/apps/bin/bison/src/print_graph.c create mode 100644 src/apps/bin/bison/src/print_graph.h create mode 100644 src/apps/bin/bison/src/reader.c create mode 100644 src/apps/bin/bison/src/reader.h create mode 100644 src/apps/bin/bison/src/reduce.c create mode 100644 src/apps/bin/bison/src/reduce.h create mode 100644 src/apps/bin/bison/src/relation.c create mode 100644 src/apps/bin/bison/src/relation.h create mode 100644 src/apps/bin/bison/src/scan-gram.c create mode 100644 src/apps/bin/bison/src/scan-gram.l create mode 100644 src/apps/bin/bison/src/scan-skel.c create mode 100644 src/apps/bin/bison/src/scan-skel.l create mode 100644 src/apps/bin/bison/src/state.c create mode 100644 src/apps/bin/bison/src/state.h create mode 100644 src/apps/bin/bison/src/symlist.c create mode 100644 src/apps/bin/bison/src/symlist.h create mode 100644 src/apps/bin/bison/src/symtab.c create mode 100644 src/apps/bin/bison/src/symtab.h create mode 100644 src/apps/bin/bison/src/system.h create mode 100644 src/apps/bin/bison/src/tables.c create mode 100644 src/apps/bin/bison/src/tables.h create mode 100644 src/apps/bin/bison/src/uniqstr.c create mode 100644 src/apps/bin/bison/src/uniqstr.h create mode 100644 src/apps/bin/bison/src/vcg.c create mode 100644 src/apps/bin/bison/src/vcg.h create mode 100644 src/apps/bin/bison/src/vcg_defaults.h create mode 100644 src/apps/bin/bison/tests/Makefile.am create mode 100644 src/apps/bin/bison/tests/Makefile.in create mode 100644 src/apps/bin/bison/tests/actions.at create mode 100644 src/apps/bin/bison/tests/atlocal.in create mode 100644 src/apps/bin/bison/tests/bison.in create mode 100644 src/apps/bin/bison/tests/calc.at create mode 100644 src/apps/bin/bison/tests/conflicts.at create mode 100644 src/apps/bin/bison/tests/cxx-type.at create mode 100644 src/apps/bin/bison/tests/existing.at create mode 100644 src/apps/bin/bison/tests/glr-regression.at create mode 100644 src/apps/bin/bison/tests/headers.at create mode 100644 src/apps/bin/bison/tests/input.at create mode 100644 src/apps/bin/bison/tests/local.at create mode 100644 src/apps/bin/bison/tests/output.at create mode 100644 src/apps/bin/bison/tests/package.m4 create mode 100644 src/apps/bin/bison/tests/reduce.at create mode 100644 src/apps/bin/bison/tests/regression.at create mode 100644 src/apps/bin/bison/tests/sets.at create mode 100644 src/apps/bin/bison/tests/synclines.at create mode 100644 src/apps/bin/bison/tests/testsuite create mode 100644 src/apps/bin/bison/tests/testsuite.at create mode 100644 src/apps/bin/bison/tests/torture.at diff --git a/src/apps/bin/bison/ABOUT-NLS b/src/apps/bin/bison/ABOUT-NLS new file mode 100644 index 0000000000..2f50c6693e --- /dev/null +++ b/src/apps/bin/bison/ABOUT-NLS @@ -0,0 +1,768 @@ +Notes on the Free Translation Project +************************************* + +Free software is going international! The Free Translation Project is +a way to get maintainers of free software, translators, and users all +together, so that will gradually become able to speak many languages. +A few packages already provide translations for their messages. + + If you found this `ABOUT-NLS' file inside a distribution, you may +assume that the distributed package does use GNU `gettext' internally, +itself available at your nearest GNU archive site. But you do _not_ +need to install GNU `gettext' prior to configuring, installing or using +this package with messages translated. + + Installers will find here some useful hints. These notes also +explain how users should proceed for getting the programs to use the +available translations. They tell how people wanting to contribute and +work at translations should contact the appropriate team. + + When reporting bugs in the `intl/' directory or bugs which may be +related to internationalization, you should tell about the version of +`gettext' which is used. The information can be found in the +`intl/VERSION' file, in internationalized packages. + +Quick configuration advice +========================== + +If you want to exploit the full power of internationalization, you +should configure it using + + ./configure --with-included-gettext + +to force usage of internationalizing routines provided within this +package, despite the existence of internationalizing capabilities in the +operating system where this package is being installed. So far, only +the `gettext' implementation in the GNU C library version 2 provides as +many features (such as locale alias, message inheritance, automatic +charset conversion or plural form handling) as the implementation here. +It is also not possible to offer this additional functionality on top +of a `catgets' implementation. Future versions of GNU `gettext' will +very likely convey even more functionality. So it might be a good idea +to change to GNU `gettext' as soon as possible. + + So you need _not_ provide this option if you are using GNU libc 2 or +you have installed a recent copy of the GNU gettext package with the +included `libintl'. + +INSTALL Matters +=============== + +Some packages are "localizable" when properly installed; the programs +they contain can be made to speak your own native language. Most such +packages use GNU `gettext'. Other packages have their own ways to +internationalization, predating GNU `gettext'. + + By default, this package will be installed to allow translation of +messages. It will automatically detect whether the system already +provides the GNU `gettext' functions. If not, the GNU `gettext' own +library will be used. This library is wholly contained within this +package, usually in the `intl/' subdirectory, so prior installation of +the GNU `gettext' package is _not_ required. Installers may use +special options at configuration time for changing the default +behaviour. The commands: + + ./configure --with-included-gettext + ./configure --disable-nls + +will respectively bypass any pre-existing `gettext' to use the +internationalizing routines provided within this package, or else, +_totally_ disable translation of messages. + + When you already have GNU `gettext' installed on your system and run +configure without an option for your new package, `configure' will +probably detect the previously built and installed `libintl.a' file and +will decide to use this. This might be not what is desirable. You +should use the more recent version of the GNU `gettext' library. I.e. +if the file `intl/VERSION' shows that the library which comes with this +package is more recent, you should use + + ./configure --with-included-gettext + +to prevent auto-detection. + + The configuration process will not test for the `catgets' function +and therefore it will not be used. The reason is that even an +emulation of `gettext' on top of `catgets' could not provide all the +extensions of the GNU `gettext' library. + + Internationalized packages have usually many `po/LL.po' files, where +LL gives an ISO 639 two-letter code identifying the language. Unless +translations have been forbidden at `configure' time by using the +`--disable-nls' switch, all available translations are installed +together with the package. However, the environment variable `LINGUAS' +may be set, prior to configuration, to limit the installed set. +`LINGUAS' should then contain a space separated list of two-letter +codes, stating which languages are allowed. + +Using This Package +================== + +As a user, if your language has been installed for this package, you +only have to set the `LANG' environment variable to the appropriate +`LL_CC' combination. Here `LL' is an ISO 639 two-letter language code, +and `CC' is an ISO 3166 two-letter country code. For example, let's +suppose that you speak German and live in Germany. At the shell +prompt, merely execute `setenv LANG de_DE' (in `csh'), +`export LANG; LANG=de_DE' (in `sh') or `export LANG=de_DE' (in `bash'). +This can be done from your `.login' or `.profile' file, once and for +all. + + You might think that the country code specification is redundant. +But in fact, some languages have dialects in different countries. For +example, `de_AT' is used for Austria, and `pt_BR' for Brazil. The +country code serves to distinguish the dialects. + + The locale naming convention of `LL_CC', with `LL' denoting the +language and `CC' denoting the country, is the one use on systems based +on GNU libc. On other systems, some variations of this scheme are +used, such as `LL' or `LL_CC.ENCODING'. You can get the list of +locales supported by your system for your country by running the command +`locale -a | grep '^LL''. + + Not all programs have translations for all languages. By default, an +English message is shown in place of a nonexistent translation. If you +understand other languages, you can set up a priority list of languages. +This is done through a different environment variable, called +`LANGUAGE'. GNU `gettext' gives preference to `LANGUAGE' over `LANG' +for the purpose of message handling, but you still need to have `LANG' +set to the primary language; this is required by other parts of the +system libraries. For example, some Swedish users who would rather +read translations in German than English for when Swedish is not +available, set `LANGUAGE' to `sv:de' while leaving `LANG' to `sv_SE'. + + Special advice for Norwegian users: The language code for Norwegian +bokma*l changed from `no' to `nb' recently (in 2003). During the +transition period, while some message catalogs for this language are +installed under `nb' and some older ones under `no', it's recommended +for Norwegian users to set `LANGUAGE' to `nb:no' so that both newer and +older translations are used. + + In the `LANGUAGE' environment variable, but not in the `LANG' +environment variable, `LL_CC' combinations can be abbreviated as `LL' +to denote the language's main dialect. For example, `de' is equivalent +to `de_DE' (German as spoken in Germany), and `pt' to `pt_PT' +(Portuguese as spoken in Portugal) in this context. + +Translating Teams +================= + +For the Free Translation Project to be a success, we need interested +people who like their own language and write it well, and who are also +able to synergize with other translators speaking the same language. +Each translation team has its own mailing list. The up-to-date list of +teams can be found at the Free Translation Project's homepage, +`http://www.iro.umontreal.ca/contrib/po/HTML/', in the "National teams" +area. + + If you'd like to volunteer to _work_ at translating messages, you +should become a member of the translating team for your own language. +The subscribing address is _not_ the same as the list itself, it has +`-request' appended. For example, speakers of Swedish can send a +message to `sv-request@li.org', having this message body: + + subscribe + + Keep in mind that team members are expected to participate +_actively_ in translations, or at solving translational difficulties, +rather than merely lurking around. If your team does not exist yet and +you want to start one, or if you are unsure about what to do or how to +get started, please write to `translation@iro.umontreal.ca' to reach the +coordinator for all translator teams. + + The English team is special. It works at improving and uniformizing +the terminology in use. Proven linguistic skill are praised more than +programming skill, here. + +Available Packages +================== + +Languages are not equally supported in all packages. The following +matrix shows the current state of internationalization, as of January +2004. The matrix shows, in regard of each package, for which languages +PO files have been submitted to translation coordination, with a +translation percentage of at least 50%. + + Ready PO files af am ar az be bg bs ca cs da de el en en_GB eo es + +----------------------------------------------------+ + a2ps | [] [] [] [] | + aegis | () | + ant-phone | () | + anubis | | + ap-utils | | + aspell | [] | + bash | [] [] [] [] | + batchelor | | + bfd | [] [] | + binutils | [] [] | + bison | [] [] [] | + bluez-pin | [] [] [] | + clisp | | + clisp | [] [] [] | + console-tools | [] [] | + coreutils | [] [] [] [] | + cpio | [] [] [] | + darkstat | [] () [] | + diffutils | [] [] [] [] [] [] [] | + e2fsprogs | [] [] [] | + enscript | [] [] [] [] | + error | [] [] [] [] [] | + fetchmail | [] () [] [] [] [] | + fileutils | [] [] [] | + findutils | [] [] [] [] [] [] [] | + flex | [] [] [] [] | + fslint | | + gas | [] | + gawk | [] [] [] [] | + gbiff | [] | + gcal | [] | + gcc | [] [] | + gettext | [] [] [] [] [] | + gettext-examples | [] [] [] [] | + gettext-runtime | [] [] [] [] [] | + gettext-tools | [] [] [] | + gimp-print | [] [] [] [] [] | + gliv | | + glunarclock | [] [] | + gnubiff | [] | + gnucash | [] () [] [] | + gnucash-glossary | [] () [] | + gnupg | [] () [] [] [] [] | + gpe-aerial | [] | + gpe-beam | [] [] | + gpe-calendar | [] [] | + gpe-clock | [] [] | + gpe-conf | [] [] | + gpe-contacts | [] [] | + gpe-edit | [] | + gpe-go | [] | + gpe-login | [] [] | + gpe-ownerinfo | [] [] | + gpe-sketchbook | [] [] | + gpe-su | [] [] | + gpe-taskmanager | [] [] | + gpe-timesheet | [] | + gpe-today | [] [] | + gpe-todo | [] [] | + gphoto2 | [] [] [] [] | + gprof | [] [] [] | + gpsdrive | () () () | + gramadoir | [] | + grep | [] [] [] [] [] [] | + gretl | [] | + gtick | [] () | + hello | [] [] [] [] [] [] | + id-utils | [] [] | + indent | [] [] [] [] | + iso_3166 | [] [] [] [] [] [] [] [] [] [] | + iso_3166_1 | [] [] [] [] [] [] | + iso_3166_2 | | + iso_3166_3 | [] | + iso_4217 | [] [] [] [] | + iso_639 | | + jpilot | [] [] [] | + jtag | | + jwhois | [] | + kbd | [] [] [] [] [] | + latrine | () | + ld | [] [] | + libc | [] [] [] [] [] [] | + libgpewidget | [] [] | + libiconv | [] [] [] [] [] | + lifelines | [] () | + lilypond | [] | + lingoteach | | + lingoteach_lessons | () () | + lynx | [] [] [] [] | + m4 | [] [] [] [] | + mailutils | [] [] | + make | [] [] [] | + man-db | [] () [] [] () | + minicom | [] [] [] | + mysecretdiary | [] [] [] | + nano | [] () [] [] [] | + nano_1_0 | [] () [] [] [] | + opcodes | [] | + parted | [] [] [] [] [] | + ptx | [] [] [] [] [] | + python | | + radius | [] | + recode | [] [] [] [] [] [] [] | + rpm | [] [] | + screem | | + scrollkeeper | [] [] [] [] [] [] | + sed | [] [] [] [] [] [] | + sh-utils | [] [] [] | + shared-mime-info | | + sharutils | [] [] [] [] [] [] | + silky | () | + skencil | [] () [] | + sketch | [] () [] | + soundtracker | [] [] [] | + sp | [] | + tar | [] [] [] [] | + texinfo | [] [] [] | + textutils | [] [] [] [] | + tin | () () | + tp-robot | | + tuxpaint | [] [] [] [] [] [] [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux | [] [] [] [] [] | + vorbis-tools | [] [] [] [] | + wastesedge | () | + wdiff | [] [] [] [] | + wget | [] [] [] [] [] [] | + xchat | [] [] [] [] | + xfree86_xkb_xml | [] [] | + xpad | [] | + +----------------------------------------------------+ + af am ar az be bg bs ca cs da de el en en_GB eo es + 4 0 0 1 9 4 1 40 41 60 78 17 1 5 13 68 + + et eu fa fi fr ga gl he hr hu id is it ja ko lg + +-------------------------------------------------+ + a2ps | [] [] [] () () | + aegis | | + ant-phone | [] | + anubis | [] | + ap-utils | [] | + aspell | [] [] | + bash | [] [] | + batchelor | [] [] | + bfd | [] | + binutils | [] [] | + bison | [] [] [] [] | + bluez-pin | [] [] [] [] [] | + clisp | | + clisp | [] | + console-tools | | + coreutils | [] [] [] [] [] [] | + cpio | [] [] [] [] | + darkstat | () [] [] [] | + diffutils | [] [] [] [] [] [] [] | + e2fsprogs | | + enscript | [] [] | + error | [] [] [] [] | + fetchmail | [] | + fileutils | [] [] [] [] [] [] | + findutils | [] [] [] [] [] [] [] [] [] [] [] | + flex | [] [] [] | + fslint | [] | + gas | [] | + gawk | [] [] [] | + gbiff | [] | + gcal | [] | + gcc | [] | + gettext | [] [] [] | + gettext-examples | [] [] | + gettext-runtime | [] [] [] [] [] | + gettext-tools | [] [] [] | + gimp-print | [] [] | + gliv | () | + glunarclock | [] [] [] [] | + gnubiff | [] | + gnucash | () [] | + gnucash-glossary | [] | + gnupg | [] [] [] [] [] [] [] | + gpe-aerial | [] | + gpe-beam | [] | + gpe-calendar | [] [] [] | + gpe-clock | [] | + gpe-conf | [] | + gpe-contacts | [] [] | + gpe-edit | [] [] | + gpe-go | [] | + gpe-login | [] [] | + gpe-ownerinfo | [] [] [] | + gpe-sketchbook | [] | + gpe-su | [] | + gpe-taskmanager | [] | + gpe-timesheet | [] [] [] | + gpe-today | [] [] | + gpe-todo | [] [] | + gphoto2 | [] [] [] | + gprof | [] [] | + gpsdrive | () () () | + gramadoir | [] [] | + grep | [] [] [] [] [] [] [] [] [] [] [] | + gretl | [] [] | + gtick | [] [] [] | + hello | [] [] [] [] [] [] [] [] [] [] [] [] [] | + id-utils | [] [] [] [] | + indent | [] [] [] [] [] [] [] [] [] | + iso_3166 | [] [] [] [] [] [] [] | + iso_3166_1 | [] [] [] [] [] | + iso_3166_2 | | + iso_3166_3 | | + iso_4217 | [] [] [] [] [] [] | + iso_639 | | + jpilot | [] () | + jtag | [] | + jwhois | [] [] [] [] | + kbd | [] | + latrine | [] | + ld | [] | + libc | [] [] [] [] [] [] | + libgpewidget | [] [] [] [] | + libiconv | [] [] [] [] [] [] [] [] [] | + lifelines | () | + lilypond | [] | + lingoteach | [] [] | + lingoteach_lessons | | + lynx | [] [] [] [] | + m4 | [] [] [] [] | + mailutils | | + make | [] [] [] [] [] [] | + man-db | () () | + minicom | [] [] [] [] | + mysecretdiary | [] [] | + nano | [] [] [] [] | + nano_1_0 | [] [] [] [] | + opcodes | [] | + parted | [] [] [] | + ptx | [] [] [] [] [] [] [] | + python | | + radius | [] | + recode | [] [] [] [] [] [] | + rpm | [] [] | + screem | | + scrollkeeper | [] | + sed | [] [] [] [] [] [] [] [] [] | + sh-utils | [] [] [] [] [] [] [] | + shared-mime-info | [] [] [] | + sharutils | [] [] [] [] [] | + silky | () [] () () | + skencil | [] | + sketch | [] | + soundtracker | [] [] | + sp | [] () | + tar | [] [] [] [] [] [] [] [] [] | + texinfo | [] [] [] [] | + textutils | [] [] [] [] [] [] | + tin | [] () | + tp-robot | [] | + tuxpaint | [] [] [] [] [] [] [] [] [] | + unicode-han-tra... | | + unicode-transla... | [] [] | + util-linux | [] [] [] [] () [] | + vorbis-tools | [] | + wastesedge | () | + wdiff | [] [] [] [] [] [] | + wget | [] [] [] [] [] [] [] | + xchat | [] [] [] | + xfree86_xkb_xml | [] [] | + xpad | [] [] | + +-------------------------------------------------+ + et eu fa fi fr ga gl he hr hu id is it ja ko lg + 22 2 1 26 106 28 24 8 10 41 33 1 26 33 12 0 + + lt lv mk mn ms mt nb nl nn no nso pl pt pt_BR ro ru + +-----------------------------------------------------+ + a2ps | [] [] () () [] [] [] | + aegis | () () () | + ant-phone | [] [] | + anubis | [] [] [] [] [] [] | + ap-utils | [] () [] | + aspell | [] | + bash | [] [] [] | + batchelor | [] | + bfd | [] | + binutils | [] | + bison | [] [] [] [] [] | + bluez-pin | [] [] [] | + clisp | | + clisp | [] | + console-tools | [] | + coreutils | [] [] | + cpio | [] [] [] [] [] | + darkstat | [] [] [] [] | + diffutils | [] [] [] [] [] [] | + e2fsprogs | [] | + enscript | [] [] [] [] | + error | [] [] [] | + fetchmail | [] [] () [] | + fileutils | [] [] [] | + findutils | [] [] [] [] [] | + flex | [] [] [] [] | + fslint | [] [] | + gas | | + gawk | [] [] [] | + gbiff | [] [] | + gcal | | + gcc | | + gettext | [] [] [] | + gettext-examples | [] [] [] | + gettext-runtime | [] [] [] [] | + gettext-tools | [] [] | + gimp-print | [] | + gliv | [] [] [] | + glunarclock | [] [] [] [] | + gnubiff | [] | + gnucash | [] [] () [] | + gnucash-glossary | [] [] | + gnupg | [] | + gpe-aerial | [] [] [] [] | + gpe-beam | [] [] [] [] | + gpe-calendar | [] [] [] [] | + gpe-clock | [] [] [] [] | + gpe-conf | [] [] [] [] | + gpe-contacts | [] [] [] [] | + gpe-edit | [] [] [] [] | + gpe-go | [] [] [] | + gpe-login | [] [] [] [] | + gpe-ownerinfo | [] [] [] [] | + gpe-sketchbook | [] [] [] [] | + gpe-su | [] [] [] [] | + gpe-taskmanager | [] [] [] [] | + gpe-timesheet | [] [] [] [] | + gpe-today | [] [] [] [] | + gpe-todo | [] [] [] [] | + gphoto2 | [] | + gprof | [] [] | + gpsdrive | () () [] | + gramadoir | () [] | + grep | [] [] [] [] [] | + gretl | | + gtick | [] [] [] | + hello | [] [] [] [] [] [] [] [] [] [] | + id-utils | [] [] [] [] | + indent | [] [] [] [] | + iso_3166 | [] [] [] | + iso_3166_1 | [] [] | + iso_3166_2 | | + iso_3166_3 | [] | + iso_4217 | [] [] [] [] [] [] [] [] | + iso_639 | [] | + jpilot | () () | + jtag | | + jwhois | [] [] [] [] () | + kbd | [] [] [] | + latrine | [] | + ld | | + libc | [] [] [] [] | + libgpewidget | [] [] [] | + libiconv | [] [] [] [] [] | + lifelines | | + lilypond | | + lingoteach | | + lingoteach_lessons | | + lynx | [] [] [] | + m4 | [] [] [] [] [] | + mailutils | [] [] [] | + make | [] [] [] [] | + man-db | [] | + minicom | [] [] [] [] | + mysecretdiary | [] [] [] | + nano | [] [] [] [] [] | + nano_1_0 | [] [] [] [] [] [] | + opcodes | [] [] | + parted | [] [] [] [] | + ptx | [] [] [] [] [] [] [] [] | + python | | + radius | [] [] | + recode | [] [] [] [] | + rpm | [] [] [] | + screem | | + scrollkeeper | [] [] [] [] [] | + sed | [] [] [] | + sh-utils | [] [] | + shared-mime-info | [] [] | + sharutils | [] [] | + silky | () | + skencil | [] [] | + sketch | [] [] | + soundtracker | | + sp | | + tar | [] [] [] [] [] [] | + texinfo | [] [] [] [] | + textutils | [] [] | + tin | | + tp-robot | [] | + tuxpaint | [] [] [] [] [] [] [] [] | + unicode-han-tra... | | + unicode-transla... | | + util-linux | [] [] [] | + vorbis-tools | [] [] [] | + wastesedge | | + wdiff | [] [] [] [] [] | + wget | [] [] [] | + xchat | [] [] [] | + xfree86_xkb_xml | [] [] | + xpad | [] [] | + +-----------------------------------------------------+ + lt lv mk mn ms mt nb nl nn no nso pl pt pt_BR ro ru + 1 2 0 3 12 0 10 69 6 7 1 40 26 36 76 63 + + sk sl sr sv ta th tr uk ven vi wa xh zh_CN zh_TW zu + +-----------------------------------------------------+ + a2ps | [] [] [] [] | 16 + aegis | | 0 + ant-phone | | 3 + anubis | [] [] | 9 + ap-utils | () | 3 + aspell | | 4 + bash | | 9 + batchelor | | 3 + bfd | [] [] | 6 + binutils | [] [] [] | 8 + bison | [] [] | 14 + bluez-pin | [] [] [] | 14 + clisp | | 0 + clisp | | 5 + console-tools | | 3 + coreutils | [] [] [] [] | 16 + cpio | [] [] | 14 + darkstat | [] [] [] () () | 12 + diffutils | [] [] [] | 23 + e2fsprogs | [] [] | 6 + enscript | [] [] | 12 + error | [] [] [] | 15 + fetchmail | [] [] | 11 + fileutils | [] [] [] [] [] | 17 + findutils | [] [] [] [] [] [] | 29 + flex | [] [] | 13 + fslint | | 3 + gas | [] | 3 + gawk | [] [] | 12 + gbiff | | 4 + gcal | [] [] | 4 + gcc | [] | 4 + gettext | [] [] [] [] [] | 16 + gettext-examples | [] [] [] [] [] | 14 + gettext-runtime | [] [] [] [] [] [] [] [] | 22 + gettext-tools | [] [] [] [] [] [] | 14 + gimp-print | [] [] | 10 + gliv | | 3 + glunarclock | [] [] [] | 13 + gnubiff | | 3 + gnucash | [] [] | 9 + gnucash-glossary | [] [] [] | 8 + gnupg | [] [] [] [] | 17 + gpe-aerial | [] | 7 + gpe-beam | [] | 8 + gpe-calendar | [] [] [] [] | 13 + gpe-clock | [] [] [] | 10 + gpe-conf | [] [] | 9 + gpe-contacts | [] [] [] | 11 + gpe-edit | [] [] [] [] [] | 12 + gpe-go | | 5 + gpe-login | [] [] [] [] [] | 13 + gpe-ownerinfo | [] [] [] [] | 13 + gpe-sketchbook | [] [] | 9 + gpe-su | [] [] [] | 10 + gpe-taskmanager | [] [] [] | 10 + gpe-timesheet | [] [] [] [] | 12 + gpe-today | [] [] [] [] [] | 13 + gpe-todo | [] [] [] [] | 12 + gphoto2 | [] [] [] | 11 + gprof | [] [] | 9 + gpsdrive | [] [] | 3 + gramadoir | [] | 5 + grep | [] [] [] [] | 26 + gretl | | 3 + gtick | | 7 + hello | [] [] [] [] [] | 34 + id-utils | [] [] | 12 + indent | [] [] [] [] | 21 + iso_3166 | [] [] [] [] [] [] [] | 27 + iso_3166_1 | [] [] [] | 16 + iso_3166_2 | | 0 + iso_3166_3 | | 2 + iso_4217 | [] [] [] [] [] [] | 24 + iso_639 | | 1 + jpilot | [] [] [] [] [] | 9 + jtag | [] | 2 + jwhois | () [] [] | 11 + kbd | [] [] | 11 + latrine | | 2 + ld | [] [] | 5 + libc | [] [] [] [] | 20 + libgpewidget | [] [] [] [] | 13 + libiconv | [] [] [] [] [] [] [] [] | 27 + lifelines | [] | 2 + lilypond | [] | 3 + lingoteach | | 2 + lingoteach_lessons | () | 0 + lynx | [] [] [] | 14 + m4 | [] [] | 15 + mailutils | | 5 + make | [] [] [] | 16 + man-db | [] | 5 + minicom | | 11 + mysecretdiary | [] [] | 10 + nano | [] [] [] [] | 17 + nano_1_0 | [] [] [] | 17 + opcodes | [] [] | 6 + parted | [] [] [] | 15 + ptx | [] [] | 22 + python | | 0 + radius | | 4 + recode | [] [] [] | 20 + rpm | [] [] | 9 + screem | [] [] | 2 + scrollkeeper | [] [] [] | 15 + sed | [] [] [] [] [] [] | 24 + sh-utils | [] [] | 14 + shared-mime-info | [] [] | 7 + sharutils | [] [] [] [] | 17 + silky | () | 3 + skencil | [] | 6 + sketch | [] | 6 + soundtracker | [] [] | 7 + sp | [] | 3 + tar | [] [] [] [] [] | 24 + texinfo | [] [] [] | 14 + textutils | [] [] [] [] | 16 + tin | | 1 + tp-robot | | 2 + tuxpaint | [] [] [] [] [] | 29 + unicode-han-tra... | | 0 + unicode-transla... | | 2 + util-linux | [] [] | 15 + vorbis-tools | | 8 + wastesedge | | 0 + wdiff | [] [] [] | 18 + wget | [] [] [] [] [] [] [] [] | 24 + xchat | [] [] [] [] [] | 15 + xfree86_xkb_xml | [] [] [] [] [] | 11 + xpad | | 5 + +-----------------------------------------------------+ + 63 teams sk sl sr sv ta th tr uk ven vi wa xh zh_CN zh_TW zu + 131 domains 47 19 28 83 0 0 59 13 1 1 11 0 22 22 0 1373 + + Some counters in the preceding matrix are higher than the number of +visible blocks let us expect. This is because a few extra PO files are +used for implementing regional variants of languages, or language +dialects. + + For a PO file in the matrix above to be effective, the package to +which it applies should also have been internationalized and +distributed as such by its maintainer. There might be an observable +lag between the mere existence a PO file and its wide availability in a +distribution. + + If January 2004 seems to be old, you may fetch a more recent copy of +this `ABOUT-NLS' file on most GNU archive sites. The most up-to-date +matrix with full percentage details can be found at +`http://www.iro.umontreal.ca/contrib/po/HTML/matrix.html'. + +Using `gettext' in new packages +=============================== + +If you are writing a freely available program and want to +internationalize it you are welcome to use GNU `gettext' in your +package. Of course you have to respect the GNU Library General Public +License which covers the use of the GNU `gettext' library. This means +in particular that even non-free programs can use `libintl' as a shared +library, whereas only free software can use `libintl' as a static +library or use modified versions of `libintl'. + + Once the sources are changed appropriately and the setup can handle +the use of `gettext' the only thing missing are the translations. The +Free Translation Project is also available for packages which are not +developed inside the GNU project. Therefore the information given above +applies also for every other Free Software Project. Contact +`translation@iro.umontreal.ca' to make the `.pot' files available to +the translation teams. + diff --git a/src/apps/bin/bison/AUTHORS b/src/apps/bin/bison/AUTHORS new file mode 100644 index 0000000000..0a3ca6fd51 --- /dev/null +++ b/src/apps/bin/bison/AUTHORS @@ -0,0 +1,8 @@ +Authors of GNU Bison. + +Bison was written primarily by Robert Corbett. + +Richard Stallman made it Yacc-compatible. + +Wilfred Hansen of Carnegie Mellon University added multicharacter +string literals and other features. diff --git a/src/apps/bin/bison/COPYING b/src/apps/bin/bison/COPYING new file mode 100644 index 0000000000..d60c31a97a --- /dev/null +++ b/src/apps/bin/bison/COPYING @@ -0,0 +1,340 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA + + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/src/apps/bin/bison/ChangeLog b/src/apps/bin/bison/ChangeLog new file mode 100644 index 0000000000..ba9bc5989e --- /dev/null +++ b/src/apps/bin/bison/ChangeLog @@ -0,0 +1,12139 @@ +2004-05-21 Paul Eggert + + * NEWS: Version 1.875d. + * configure.ac (AC_INIT): Likewise. + * src/parse-gram.c, src/parse-gram.h: Regenerate with 1.875d. + + * configure.ac (--enable-gcc-warnings): Do not enable -Wshadow, + -Wmissing-prototypes, or -Wstrict-prototypes for C++. The current + lalr1.cc runs afoul of the first, and the last two are no longer + supported by GCC 3.4.0. + * README: Mention GNU m4 1.4 or later; mention m4 patches. + * HACKING: Use ./bootstrap, not "make update" to import foreign files. + +2004-05-06 Paul Eggert + + * src/muscle_tab.c (hash_muscle): Accept and return size_t, not + unsigned int, for compatibility with latest gnulib hash module. + * src/state.c (state_hash, state_hasher): Likewise. + * src/symtab.c (hash_symbol, hash_symbol_hasher): Likewise. + * src/uniqstr.c (hash_uniqstr): Likewise. + +2004-05-03 Paul Eggert + + * NEWS: Unescaped newlines are no longer allowed in char & strings. + + * src/scan-gram.l (): Reject unescaped newlines in + character and string literals. + (unexpected_end): New function. + (unexpected_eof): Use it. + (unexpected_newline): New function. + (): Coalesce duplicate + actions. + + * NEWS: Document %expect-rr. + + * bootstrap (--gnulib-srcdir=*, --cvs-user=*): + Fix typo by replacing $1 with $option. + Remove more 'intl'-related files. + Don't DEFUN AM_INTL_SUBDIR twice. + + * lib/.cvsignore: Add strndup.h. Remove memchr.c, memcmp.c, + memrchr.c, strcasecmp.c, strchr.c, strrchr.c, strspn.c, strtol.c, + strtoul.c. + * m4/.cvsignore: Add exitfail.m4, extensions.m4, gnulib.m4, + hard-locale.m4, mbstate_t.m4, strerror_r.m4, strndup.m4, + xstrndup.m4. Remove glibc21.m4, intdiv0.m4, inttypes-pri.m4, + inttypes.m4, inttypes_h.m4, isc-posix.m4, lcmessage.m4, + stdint_h.m4, uintmax_t.m4, ulonglong.m4. + * src/.cvsignore: Add *.output. + + * src/parse-gram.y: Put copyright notice inside %{ %} so it + gets copied to the output file. + +2004-04-28 Paul Eggert + + Get files from the gnulib and po repositories, instead of relying + on them being in our CVS. Upgrade to latest versions of gnulib + and Automake. + + * Makefile.am (SUBDIRS): Remove m4; Automake now does m4. + * bootstrap: Bootstrap from gnulib and po repositories. + Much of this code was stolen from GNU diff and GNU tar's bootstrap. + * README-cvs: Document these changes. Remove version numbers from + mentions of build tools, since they change so often. Mention Flex. + + * configure.ac (AC_CONFIG_MACRO_DIR): Add, with m4 as arg. + (gl_USE_SYSTEM_EXTENSIONS): Add. + (AC_GNU_SOURCE, AC_AIX, AC_MINIX): + Remove; no longer needed, as gl_USE_SYSTEM_EXTENSIONS + does this for us. + (AC_ISC_POSIX): Remove; we no longer support this + ancient OS, as it gets in the way of latest Autoconf & gnulib. + (AC_HEADER_STDC): Remove: we now assume C89 or better. + (AC_CHECK_HEADERS_ONCE): Use instead of AC_CHECK_HEADERS. + Do not check for C89 headers, except for locale.h which is used + by the Yacc library and must port to K&R hosts. + (AC_CHECK_FUNCS_ONCE): Use instead of AC_CHECK_FUNCS. + Do not check for C89 functions, except for setlocale which is + used by the Yacc library. + (AC_CHECK_DECLS, AC_REPLACE_FUNCS): Remove; no longer needed. + (gl_DIRNAME, gl_ERROR, gl_FUNC_ALLOCA, gl_FUNC_MEMCHR, + gl_FUNC_MEMRCHR, gl_FUNC_STPCPY, gl_FUNC_STRNLEN, gl_FUNC_STRTOL, + gl_GETOPT, gl_HASH, gl_MBSWIDTH, gl_OBSTACK, gl_QUOTE, + gl_QUOTEARG, gl_XALLOC, jm_FUNC_GLIBC_UNLOCKED_IO, jm_FUNC_MALLOC, + AM_GNU_GETTEXT): Remove; now done by: + (GNULIB_AUTOCONF_SNIPPET): Add. "bootstrap" builds this for us. + (AC_CONFIG_FILES): Remove m4/Makefile, as Automake now does this + for us. + + * lib/Makefile.am: Include gnulib.mk, built for us by "bootstrap". + (BUILT_SOURCES, EXTRA_DIST, MOSTLYCLEANFILES): + Define to empty, as gnulib.mk will do the rest for us. + ($(libbison_a_OBJECTS), stdbool.h): Remove, as gnulib.mk does this + for us. + (libbison_a_SOURCES): Define to $(lib_SOURCES) now. + (lib_SOURCES): New symbol, containing only the non-gnulib libs. + + * src/files.c: Include gnulib's xstrndup.h. + + * src/system.h (MALLOC): Use xnmalloc, for better overflow checking. + (REALLOC): Use xnrealloc, for likewise. + (xstrndup, stpcpy): Remove decls, as gnulib does this for us now. + (strnlen, memrchr): Remove decls; functions no longer used. + Include . + + * config/depcomp, config/install-sh, lib/alloca.c, lib/argmatch.c, + lib/argmatch.h, lib/basename.c, lib/dirname.c, lib/dirname.h, + lib/error.c, lib/error.h, lib/getopt.c, lib/getopt.h, + lib/getopt1.c, lib/gettext.h, lib/hash.c, lib/hash.h, + lib/malloc.c, lib/mbswidth.c, lib/mbswidth.h, lib/memchr.c, + lib/memcmp.c, lib/memrchr.c, lib/obstack.c, lib/obstack.h, + lib/quote.c, lib/quote.h, lib/quotearg.c, lib/quotearg.h, + lib/realloc.c, lib/stdbool_.h, lib/stpcpy.c, lib/strcasecmp.c, + lib/strchr.c, lib/strncasecmp.c, lib/strnlen.c, lib/strrchr.c, + lib/strspn.c, lib/strtol.c, lib/strtoul.c, lib/unlocked-io.h, + lib/xalloc.h, lib/xmalloc.c, lib/xstrdup.c, lib/xstrndup.c, + m4/Makefile.am, m4/alloca.m4, m4/dirname.m4, m4/dos.m4, + m4/error.m4, m4/getopt.m4, m4/hash.m4, m4/malloc.m4, + m4/mbrtowc.m4, m4/mbswidth.m4, m4/memchr.m4, m4/memcmp.m4, + m4/memrchr.m4, m4/obstack.m4, m4/onceonly.m4, m4/prereq.m4, + m4/quote.m4, m4/quotearg.m4, m4/realloc.m4, m4/stdbool.m4, + m4/stpcpy.m4, m4/strnlen.m4, m4/strtol.m4, m4/strtoul.m4, + m4/unlocked-io.m4, m4/xalloc.m4, po/LINGUAS, po/Makefile.in.in, + po/Makevars, po/da.po, po/de.po, po/es.po, po/et.po, po/fr.po, + po/hr.po, po/id.po, po/it.po, po/ja.po, po/ms.po, po/nl.po, + po/pt_BR.po, po/ro.po, po/ru.po, po/sv.po, po/tr.po: + Remove, as these files are now generated automatically + by bootstrap or automake. + + * po/ChangeLog: Remove: all but one entry was a duplicate + of this file, and I moved that 2000-11-02 entry here. + + * config/.cvsignore: Add Makefile, depcomp, install-sh. + * lib/.cvsignore: Add alloca.c, alloca.h, alloca_.h, argmatch.c, + argmatch.h, basename.c, dirname.c, dirname.h, error.c, error.h, + exit.h, exitfail.c, exitfail.h, getopt.c, getopt.h, getopt1.c, + getopt_int.h, gettext.h, gnulib.mk, hard-locale.c, hard-locale.h, + hash.c, hash.h, malloc.c, mbswidth.c, mbswidth.h, memchr.c, + memcmp.c, memrchr.c, obstack.c, obstack.h, quote.c, quote.h, + quotearg.c, quotearg.h, realloc.c, stdbool_.h, stpcpy.c, stpcpy.h, + strcasecmp.c, strchr.c, stripslash.c, strncasecmp.c, strndup.c, + strnlen.c, strrchr.c, strspn.c, strtol.c, strtoul.c, + unlocked-io.h, xalloc.h, xmalloc.c, xstrdup.c, xstrndup.c, + xstrndup.h. + * m4/.cvsignore: Remove Makefile, Makefile.in. Add alloca.m4, + dirname.m4, dos.m4, error.m4, getopt.m4, hash.m4, mbrtowc.m4, + mbswidth.m4, obstack.m4, onceonly.m4, quote.m4, quotearg.m4, + stdbool.m4, stpcpy.m4, strnlen.m4, unlocked-io.m4, xalloc.m4. + * po/.cvsignore: Add *.po, LINGUAS, Makefile.in.in, Makevars. + * src/.cvsignore: Remove *_.c. + + + * Makefile.maint (GZIP_ENV): Don't use --rsyncable if gzip doesn't + support it. (The latest stable gzip doesn't.) + +2004-04-27 Paul Eggert + + * data/lalr1.cc (Parser::stos_) [! YYDEBUG]: Define even in this + case, as stos_ is now used by destructors due to the 2004-02-09 + change. + + Remove more K&R C support. + * lib/libiberty.y (PARAMS): Remove. All uses removed. + * lib/subpipe.c (errno): Remove decl. + Include unconditionally. + (EXIT_FAILURE): Remove macro. + * src/complain.c (vfprintf, strerror): Remove. + * src/system.h: Include limits.h, stdlib.h, string.h, locale.h + unconditionally. + (EXIT_FAILURE, EXIT_SUCCESS, setlocale): Remove defns. + Use latest Autoconf recommendations for including inttypes.h, stdint.h. + (strchr, strspn, memchr): Remove decls. + * tests/calc.at (_AT_DATA_CALC_Y): Include stdlib.h, string.h + unconditionally. Do not declare perror. + * tests/conflicts.at (%nonassoc and eof): Include stdlib.h + unconditionally. + + * src/complain.c (_): Remove useless defn, as system.h defines this. + + * lib/bitset.h (__INT_TO_PTR): Remove; workaround no longer needed + with latest obstack.h. + * lib/ebitset.c (ebitset_elt_alloc): Don't bother to cast args + to procedure types, as obstack.h now does that for us. + * lib/lbitset.c (lbitset_elt_alloc): Likewise. + + * lib/subpipe.h [HAVE_SYS_TYPES_H]: Include , + so that this include file can stand alone. + * lib/subpipe.c: Do not include , as subpipe.h + does this now. Include subpipe.h first after config.h, to + test whether it can stand alone. + + * tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Don't + declare yyerror when using lalr.cc, as GCC 3.4.0 warns about the + unused declaration. + + * tests/synclines.at (%union synch line): Put a dummy member in + the union, because empty unions aren't allowed in C. Caught + by GCC 3.4.0. + +2004-04-13 Jim Meyering + + * src/conflicts.c (conflicts_print): Correct format string typo: + use `%%' to produce literal `%'. (trivial change) + +2004-03-30 Paul Eggert + + * src/getargs.c (version): Update copyright year to 2004. + + * data/c.m4 (b4_int_type): Use 'short int' rather than + 'short', and similarly for 'long', 'unsigned', etc. + * data/glr.c (YYTRANSLATE, yyconfl, yySymbol, yyItemNum, + yygetLRActions, yyprocessOneStack, yyrecoverSyntaxError, + yy_yypstack, yydumpstack): Likewise. + * data/lalr1.cc (user_token_number_max_, user_token_number_max_, + translate_, seq_, [], pop, Slice, range_, operator+, operator+=): + Likewise. + * data/yacc.c (b4_int_type, yyss, YYSTACK_BYTES, yysigned_char, + yy_stack_print, yyparse): Likewise. + * doc/bison.texinfo (Prologue, Multiple Types): Likewise. + * lib/bbitset.h (bitset_word, BITSET_WORD_BITS): Likewise. + * lib/bitset.c (bitset_print): Likewise. + * lib/bitset_stats.c (bitste_log_histogram_print): Likewise. + * lib/bitsetv-print.c (bitsetv_matrix_dump): Likewise. + * lib/bitsetv.c (bitsetv_dump): Likewise. + * lib/ebitset.c (EBITSET_ELT_BITS, ebitset_elt_alloc): Likewise. + * lib/lbitset.c (LBITSET_ELT_BITS, lbitset_elt_alloc, debug_lbitset): + Likewise. + * src/LR0.c (allocate_itemsets): Likewise. + * src/gram.h (rule_number, rule): Likewise. + * src/lalr.h (goto_number): Likewise. + * src/nullable.c (nullable_compute): Likewise. + * src/output.c (prepare_rules): Likewise. + * src/relation.c (relation_print, relation_digraph): Likewise. + * src/relation.h (relation_node): Likewise. + * src/state.h (state_number, transitions, errs, reductions, + struct state): Likewise. + * src/symtab.h (symbol_number, struct symbol): Likewise. + * src/tables.c (vector_number, tally, action_number, + default_goto, goto_actions): Likewise. + * tests/existing.at (GNU Cim Grammar): Likewise. + * tests/regression.at (Web2c Actions): Likewise. + + * src/output.c (muscle_insert_short_int_table): Renamed from + muscle_insert_short_table. All uses changed. + +2004-03-25 Paul Hilfinger + + * src/parse-gram.y: Define PERCENT_EXPECT_RR. + (declaration): Replace expected_conflicts with expected_sr_conflicts. + Add %expect-rr rule. + + * src/scan-gram.l: Recognize %expect-rr. + + * src/conflicts.h (expected_sr_conflicts): Rename from + expected_conflicts. + (expected_rr_conflicts): Declare. + + * src/conflicts.c (expected_sr_conflicts): Rename from + expected_conflicts. + (expected_rr_conflicts): Define. + (conflicts_print): Check r/r conflicts against expected_rr_conflicts + for GLR parsers. + Use expected_sr_conflicts in place of expected_conflicts. + Warn if expected_rr_conflicts used in non-GLR parser. + + * doc/bison.texinfo: Add documentation for %expect-rr. + +2004-03-08 Paul Eggert + + Add support for hex token numbers. Suggested by Odd Arild Olsen in + . + + * NEWS: Document hexadecimal tokens, no NUL bytes, %destructor + in lalr1.cc. + * doc/bison.texinfo (Token Decl): Add hexadecimal token numbers. + * src/scan-gram.l (scan_integer): New function. + ({int}): Use it. + (0[xX][0-9abcdefABCDEF]+): New pattern, to support hex numbers. + (, \\x[0-9abcdefABCDEF]+, + handle_action_dollar, handle_action_at, convert_ucn_to_byte): + Say "long int", not "long", for uniformity with GNU style. + +2004-02-25 Paul Eggert + + * tests/local.at (AT_COMPILE, AT_COMPILE_CXX): Ignore stdout from + compilers. This fixes a problem with Intel's C++ compiler being + chatty, reported by Guido Trentalancia in + . + +2004-02-09 Alexandre Duret-Lutz + + Support %destructor and merge error locations in lalr1.cc. + + * data/lalr1.cc (b4_cxx_destruct_def): New macro. + (Parser::stos_): Define unconditionally. + (Parser::destruct_): New method. Generate its body with + b4_yydestruct_generate. + (Parser::error_start_): New attribute. + (Parser::parse) : Call destruct_ on erroneous + token which are discarded. + (Parser::parse) : Update + error_start_ when erroneous token are discarded. + (Parser::parse) : Compute the location of the error + token so that it covers all the discarded tokens. + * tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Adjust so + it can be called with `%skeleton "lalr1.cc"', and do that. + +2004-02-02 Paul Eggert + + * src/Makefile.am (AM_CPPFLAGS): New macro. It mentions + $(top_srcdir)/lib and ../lib. This fixes a bug reported + by Paul Hilfinger; the old INCLUDES value didn't mention ../lib. + There's no need to mention top_builddir since Automake does that + for us. + (INCLUDES): Remove, as Automake says it's obsolescent. + Contents migrated into AM_CPPFLAGS as described above. + * lib/Makefile.am (INCLUDES): Remove; obsolescent. + +2004-01-14 Paul Hilfinger + + * data/glr.c (yytokenName): Bullet-proof against YYEMPTY token. + (yyreportSyntaxError): Handle case where lookahead token is + YYEMPTY. + +2004-01-13 Paul Hilfinger + + * data/glr.c: Put casts on uses of YYREALLOC and YYMALLOC so that + resulting parsers are compilable with C++. + +2003-12-23 Paul Eggert + + * config/depcomp, config/install-sh: Sync with Automake 1.8. + * src/output.c (output_skeleton): Rename local var. + * tests/input.at (Torturing the Scanner): Don't use \x0 or \0 in + Bison tokens, as this runs afoul of the 2003-10-07 change that + disallowed NUL bytes in character constants or string literals. + + * tests/local.at: Require Autoconf 2.59's Autotest. + * tests/testsuite.at: Don't include local.at, since we now assume + Autoconf 2.59 or later. Autoconf 2.59 had some problems with + including it. + * tests/Makefile.am ($(TESTSUITE)): Remove warning about ignoring + multiple inclusion warnings. + +2003-12-02 Akim Demaille + + * doc/bison.texinfo (How Can I Reset the Parser): More about start + conditions. + From Bruno Haible. + +2003-11-18 Alexandre Duret-Lutz + + * doc/bison.texinfo (Bison Options): Escape `@' in `$@'. + +2003-10-07 Paul Eggert + + * tests/Makefile.am (clean-local): Don't run 'testsuite --clean' + if testsuite doesn't exist. + + * doc/bison.texinfo (Symbols): NUL bytes are not allowed in string + literals, unfortunately. + * src/scan-gram.l (): + Complain about NUL bytes in character constants or string literals. + +2003-10-05 Paul Eggert + + * NEWS: Don't document %no-default-prec, as it's still + too experimental. + * doc/bison.texinfo: Document %no-default-prec only if + the defaultprec flag is set. Normally it's not. + +2003-10-04 Paul Eggert + + * data/glr.c (b4_rhs_value, b4_rhs_location): Yield a + non-modifiable lvalue, instead of a modifiable one. + * doc/bison.texinfo (Actions): Document that $$ can + be assigned to. Do not claim that $$ and $N are + array element references: user code should not rely on this. + +2003-10-01 Paul Eggert + + * src/parse-gram.h (PERCENT_NO_DEFAULT_PREC): New token. + (grammar_declaration): Use it. + * src/scan-gram.l: New token %no-default-prec. + * tests/conflicts.at: Revamp tests to use %no-default-prec. + * NEWS, doc/bison.texinfo: Document the above. + +2003-10-01 Akim Demaille + + VCG no longer supports long_straight_phase. + + * src/vcg.c, src/vcg.h: Remove the handling of long_straight_phase. + * src/print_graph.c (print_graph): Adjust. + +2003-09-30 Frank Heckenbach + and Paul Eggert + + * doc/bison.texinfo (Decl Summary, Contextual Precedence, + Table of Symbols): Document %default-prec. + * src/parse-gram.y (PERCENT_DEFAULT_PREC): New token. + (grammar_declaration): Set default_prec on %default-prec. + * src/scan-gram.l (%default-prec): New token. + * src/reader.h (default_prec): New flag. + * src/reader.c: Likewise. + (packgram): Handle it. + * tests/conflicts.at (%default-prec without %prec, + %default-prec with %prec, %default-prec 1): New tests. + +2003-09-30 Paul Eggert + + * tests/testsuite.at: Include local.at, not input.at, fixing + a typo in the 2003-08-25 patch. + +2003-08-27 Akim Demaille + + * data/lalr1.cc (yyparse) [__GNUC__]: "Use" yyerrorlab to pacify + GCC warnings. + +2003-08-26 Akim Demaille + + * config/announce-gen (print_changelog_deltas): Neutralize "<#" as + "<\#" to avoid magic from Gnus when posting parts of this script. + +2003-08-26 Akim Demaille + + * data/lalr1.cc (Parser::report_syntax_error_): New, extracted from + (Parser::parse): here. + Adjust: nerrs and errstatus is now replaced by... + (Parser::nerrs_, Parser::errstatus_): New. + +2003-08-25 Akim Demaille + + * config/announce-gen, Makefile.cfg: New. + * Makefile.am: Adjust. + * GNUmakefile, Makefile.maint: Update from CVS Autoconf, but + keeping local WGET and WGETFLAGS modifications from Paul Eggert. + +2003-08-25 Akim Demaille + + When reducing initial empty rules, Bison parser read an initial + location that is not defined. This results in garbage, and that + affects Bison's own parser. Therefore we need (i) to extend Bison + to support a means to initialize this location, and (ii) to use + this CVS Bison to fix CVS Bison's parser. + + * src/reader.h, reader.c (epilogue_augment): Remove, replace + with... + * src/muscle_tab.h, src/muscle_tab.c (muscle_code_grow): this. + * src/parse-gram.y: Adjust. + (%initial-action): New. + (%error-verbose): Since we require CVS Bison, there is no reason + not to use it. + * src/scan-gram.l: Adjust. + * src/Makefile.am (YACC): New, to make sure we use our own parser. + * data/yacc.c (yyparse): Use b4_initial_action. + +2003-08-25 Akim Demaille + + * doc/bison.texinfo: Don't promote stdout for error messages. + +2003-08-25 Akim Demaille + + * data/lalr1.cc (Parser::reduce_print_): Remove unused yyi. + From Alexandre Duret-Lutz. + +2003-08-25 Akim Demaille + + Version 1.875c. + +2003-08-25 Akim Demaille + + * data/lalr1.cc (Parser::stack_print_, YY_STACK_PRINT): New. + Use them. + +2003-08-25 Akim Demaille + + * data/lalr1.cc (Parser::reduce_print_): New. + Use it. + +2003-08-25 Akim Demaille + + Have lalr1.cc catch with Paul Eggert's patch to fix the infinite + error recovery loops. This patch is based on + . + Also, augment the similarity between lalr1.cc and yacc.c. + Note: the locations of error recovery rules are not correct yet. + + * data/lalr1.cc: Comment changes to augment the similarity between + lalr1.cc and yacc.c. + (YYERROR): Goto to yyerrorlab, not yyerrlab1. + (yyerrlab1): Remove, but where it used to be (now the bottom part of + yyerrlab), when hitting EOF, pop the whole stack here instead of + merely falling thru the default error handling mechanism. + (yyerrorlab): New label, with the old contents of YYERROR, + plus the following change: pop the stack of rhs corresponding + to the production that invoked YYERROR. That is how Yacc + behaves (required by POSIX). + * tests/calc.at (AT_CHECK_CALC_LALR1_CC): No longer expected to + fail. + +2003-08-25 Akim Demaille + + Tune local.at so that people can "autom4te -l autotest calc.at -o + calc" for instance, to extract a sub test suite. + + * tests/testsuite.at: Move the initialization, Autotest version + requirement, and AT_TESTED invocation into... + * tests/local.at: here. + * tests/testsuite.at: Include it for compatibility with Autoconf + 2.57. + * tests/Makefile.am ($(TESTSUITE)): Report that the warning should + be ignore. + +2003-08-04 Paul Eggert + + Rework code slightly to avoid gcc -Wtraditional warnings. + * data/glr.c (yyuserMerge): Return void, not YYSTYPE. + The returned value is now stored in *YY0. All callers changed. + * src/output.c (merge_output): Adjust to the above change. + +2003-07-26 Paul Eggert + + * data/glr.c (YYASSERT): New macro. + (yyfillin, yydoAction, yyglrReduce, yysplitStack, + yyresolveStates, yyprocessOneStack): + Use `YYASSERT (FOO);' rather than `if (! (FOO)) abort ();'. + Derived from a suggestion by Frank Heckenbach. + +2003-07-25 Paul Eggert + + * data/glr.c (yyglrReduce): Don't use C89 string concatenation, + for portability to K&R C (after ansi2knr, presumably). See + + by Frank Heckenbach, though I have omitted the structure-initialization + part of his glr-knr.diff patch since I recall that the Portable + C Compiler didn't require that change. + + Let the user specify how to allocate and free memory. + Derived from a suggestion by Frank Heckenbach in + . + * data/glr.c (YYFREE, YYMALLOC, YYREALLOC): New macros. + All uses of free, malloc, realloc changed to use these macros, + and unnecessary casts removed. + * data/yacc.c (YYFREE, YYMALLOC): Likewise. + +2003-07-06 Matthias Mann + + * data/lalr1.cc (operator<<(std::ostream&, const Position&)): + use s.empty() rather than s == "" to test for empty string; see + + (trivial change) + +2003-06-25 Akim Demaille + + * config/depcomp, config/install-sh: Update from masters. + +2003-06-20 Paul Eggert + + * data/glr.c (YYLLOC_DEFAULT): Parenthesize arguments as needed, + and return properly parenthesized result. + * data/lalar1.cc (YYLLOC_DEFAULT): Likewise. + * data/yacc.c (YYLLOC_DEFAULT): Likewise. + Remove unnecessary parentheses from uses. + * doc/bison.texinfo (Location Default Action): Describe the + conventions for parentheses. + +2003-06-19 Paul Eggert + + * data/glr.c (yyremoveDeletes, yy_reduce_print, yyglrReduce, + yyreportTree): Do not assume that size_t is the same width as int, + when printing sizes. Print sizes using an unsigned format. + Problem reported by Frank Heckenbach in + . + + Port to Forte Developer 7 C compiler. + * data/glr.c (struct YYLTYPE): If locations are not being used, + declare a single dummy member, as empty structs do not conform + to the C standard. + (YYERROR, YYBACKUP): Do not use "do { ...; return foo; } while (0)"; + the Forte Developer 7 C compiler complains that end-of-loop + code is not reached. + +2003-06-17 Paul Eggert + + * lib/libiberty.h (PARAMS): Spell argument as Args, not as X, to + avoid warnings from picky compilers about redefinition of PARAMS. + +2003-06-17 Paul Eggert + + Version 1.875b. + + * NEWS: Document 1.875b. + + * lib/bbitset.h: Do not include config.h; that's the includer's job. + Do not include ; shouldn't be needed on a C89 host. + * lib/bitset.h (bitset_compatible_p): Indent as per GNU standard. + Don't use 'index' in comments, as it's a builtin fn on some hosts. + * lib/bitset_stats.c: Include gettext.h unconditionally, as + per recent gettext manual's suggestion. + * lib/ebitset.c (ebitset_resize, ebitset_unused_clear): + Use prototypes, not old-style definitions. + * lib/lbitset.c (lbitset_unused_clear): Likewise. + * lib/vbitset.c (vbitset_resize, vbitset_ones, vbitset_zero, + vbitset_empty_p, vbitset_copy1, vbitset_not, vbitset_equal_p, + vbitset_subset_p, vbitset_disjoint_p, vbitset_and, vbitset_and_cmp, + vbitset_andn, vbitset_andn_cmp, vbitset_or, vbitset_or_cmp, + vbitset_xor, vbitset_xor_cmp, vbitset_and_or, vbitset_and_or_cmp, + vbitset_andn_or, vbitset_andn_or_cmp, vbitset_or_and, + vbitset_or_and_cmp, vbitset_copy): Likewise. + + * lib/libiberty.h: Do not include config.h; that's the includer's job. + Do not include . + (PARAMS): Define unconditionally for C89. + (ATTRIBUTE_NORETURN): Remove. + (ATTRIBUTE_UNUSED): Define unconditionally. + + Upgrade to 2003-06-08 libbitset, submitted by Michael Hayes in: + + * lib/Makefile.am (bitsets_sources): Add vbitset.c, vbitset.h. + * lib/vbitset.c, lib/vbitset.h: New files. + * lib/abitset.c, lib/bbitset.h, lib/bitset.c, lib/bitset.h, + lib/bitset_stats.c, lib/ebitset.c, lib/lbitset.c: Import + from libbitset. + + * doc/bison.texinfo (How Can I Reset the Parser): Renamed from + `How Can I Reset @code{yyparse}', since texinfo does not allow + arbitrary @ in node names. + + * m4/Makefile.am (EXTRA_DIST): Add the following files, which + shouldn't be needed according to the gettext 0.12.1 documentation + but which seem to be needed anyway: codeset.m4 glibc21.m4 + intdiv0.m4 inttypes-pri.m4 inttypes.m4 inttypes_h.m4 isc-posix.m4 + lcmessage.m4 nls.m4 po.m4 stdint_h.m4 uintmax_t.m4 ulonglong.m4. + * po/Makefile.in.in: Upgrade to gettext 0.12.1 version. + + * lib/.cvsignore: Add stdbool.h. + * m4/.cvsignore: Add nls.m4, po.m4. + + Upgrade to CVS gnulib. + * stdbool_.h: File renamed from stdbool.h.in. + * configure.ac (AM_STDBOOL_H): Invoke this instead of + AC_HEADER_STDBOOL. + (AM_GNU_GETTEXT): Put brackets around args, as latest manual suggests. + (AM_GNU_GETTEXT_VERSION): Update to 0.12.1. + * lib/Makefile.am (EXTRA_DIST): Add stdbool_.h. + (MOSTLYCLEANFILES): New var. + ($(libbison_a_OBJECTS)): Depend on $(STDBOOL_H). + (stdbool.h): New rule. + * lib/dirname.c, lib/dirname.h, lib/hash.c, lib/hash.h, + lib/malloc.c, lib/obstack.h, lib/quote.c, lib/realloc.c, + lib/strcasecmp.c, lib/xalloc.h, m4/alloca.m4, m4/onceonly.m4, + m4/quote.m4: Upgrade to today's gnulib. + + * tests/calc.at (AT_CHECK_CALC): New option EXPECTED-TO-FAIL. + (AT_CHECK_CALC_LALR1_CC): Use it, since the C++ LALR parser fails + the tests right now. + * tests/cxx-type.at (_AT_TEST_GLR_CXXTYPES): Ensure yylex and + yyerror are declared before use; C99 requires this. + +2003-06-09 Paul Hilfinger + + * data/glr.c (YYERROR): Update definition to reset yyerrState to 0 + first. + (yyrecoverSyntaxError): Correct the logic for setting and testing + yyerrState. + Correct comment on handling EOF. + Allow states with only a default reduction, rather than failing + (I can't quite reconstruct why these were not allowed before). + + Fixes to avoid problem that $-N rules in GLR parsers can cause + buffer overruns, corrupting state. + + * src/output.c (prepare_rules): Output max_left_semantic_context + definition. + * src/reader.h (max_left_semantic_context): New variable declaration. + * src/scan-gram.l (max_left_semantic_context): Define. + (handle_action_dollar): Update max_left_semantic_context. + * data/glr.c (YYMAXLEFT): New definition. + (yydoAction): Increase size of yyrhsVals by YYMAXLEFT. + (yyresolveAction): Ditto. + + Fixes to problems with location handling in GLR parsers reported by + Frank Heckenbach (2003/06/05). + + * data/glr.c (YYLTYPE): Make trivial if locations not used. + (YYRHSLOC): Add parentheses, and define only if locations used. + (YYLLOC_DEFAULT): Add parentheses, and give trivial definition if + locations not used. + (yyuserAction): Use YYLLOC_DEFAULT to set *yylocp. + (yydoAction): Remove redundant initialization of *yyvalp and *yylocp. + + * tests/cxx-type.at: Exercise location information; update tests + to differentiate output with and without locations. + Remove forward declarations of yylex and yyerror---caused errors + because default YYLTYPE not yet defined. + Change semantic actions to compute strings, rather than printing + them directly (to test proper passing of semantics values). Change + output to prefix notation and update test data and expected results. + (yylex): Track locations. + (stmtMerge): Return value rather than printing, and include arguments + in value. + +2003-06-03 Paul Eggert + + Avoid warnings generated by GCC 2.95.4 when Bison is + configured with --enable-gcc-warnings. + * data/lalr1.cc (yy::]b4_parser_class_name[::parse, + yy::]b4_parser_class_name[::translate_, + yy::Stack::operator[] (unsigned), + yy::Stack::operator[] (unsigned) const, + yy::Slice::operator[] (unsigned), + yy::Slice::operator[] (unsigned) const): + Rename local vars to avoid warnings. + * tests/glr-regression.at (Improper handling of embedded actions + and $-N in GLR parsers): Remove unused local variable from yylex. + * tests/regression.at (_AT_DATA_DANCER_Y): Declare yylex to take + (void) as arg when not pure, since we now assume C89 when building + Bison. Pacify GCC by using parameter. + +2003-06-02 Paul Eggert + + * data/lalr1.cc (yy::Position::lines, yy::Position::columns, + yy::Location::lines, yy::Location::columns): Rename arguments + to avoid shadowing; this removes a warning generated by GCC 3.3. + +2003-06-01 Paul Eggert + + Don't pass C-only warning optins (e.g., -Wmissing-declarations) + to g++, as GCC 3.3 complains if you do it. + * configure.ac (WARNING_CXXFLAGS): New subst. Set it to + everything that WARNING_CFLAGS has, except omit warnings + not suitable for C++. + (AC_PROG_CXX): Use this instead of AC_CHECK_PROGS([CXX], [g++]). + * tests/atlocal.in (CXXFLAGS): New var. + * tests/local.at (AT_COMPILE_CXX): Use it instead of CFLAGS. + + Fix a GLR parser bug I reported in February; see + . + The problem was that GLR parsers did not conform to the C standard, + because actions like { $1 = $2 + $3; } expanded to expressions + that invoked YYFILL in separate subexpressions, and YYFILL assigned + to a local variable. The C standard says that expressions + like (var = f ()) + (var = f ()) have undefined behavior. + Another problem was that GCC sometimes issues warnings that + yyfill and its parameters are unused. + + * data/glr.c (yyfillin): Renamed from the old yyfill. Mark + as possibly unused. + (yyfill): New function. + (YYFILL): Use it. + (yyuserAction): Change type of yynormal to bool, so that it matches + the new yyfill signature. Mark it as possibly unused. + + + Follow up on a bug I reported in February, where a Bison-generated + parser can loop. Provide a test case and a fix for yacc.c. I + don't have a fix for lalr1.cc or for glr.c, unfortunately. + The original bug report is in: + + + * data/yacc.c (YYERROR): Now just 'goto yyerrorlab', since the + macro's size was becoming unwieldy. + (yyerrlab): Do not discard an empty lookahead symbol, as this + might destroy garbage. + (yyerrorlab): New label, with the old contents of YYERROR, + plus the following change: pop the stack of rhs corresponding + to the production that invoked YYERROR. That is how Yacc + behaves, and POSIX requires this behavior. + (yyerrlab1): Use YYPOPSTACK instead of its definiens. + * tests/calc.at (_AT_DATA_CALC_Y): Include unistd.h if available. + Define 'alarm' to do nothing if unistd.h is not available. + Add a new rule "exp: '-' error;" to test the above change to + data/yacc.c. Use 'alarm' to abort any test taking longer than + 10 seconds, as it's probably looping. + (AT_CHECK_CALC): Test recovery from error in new grammar rule. + Also, the new yacc.c generates two fewer diagnostics for an + existing test. + +2003-05-24 Paul Eggert + + * data/glr.c (YYSTACKEXPANDABLE): Do not evaluate + YYSTYPE_IS_TRIVIAL or YYSTYPE_IS_TRIVIAL unless they are defined. + This fixes a problem reported by John Bowman when the Compaq/HP + Alpha cxx compiler happy (e.g. using cxx -D__USE_STD_IOSTREAM + -ansi -Wall -gall). + * data/yacc.c (union yyalloc): Likewise. + (YYCOPY): Do not evaluate __GNUC__ unless it is defined. + + Switch from 'int' to 'bool' where that makes sense. + + * lib/abitset.c (abitset_test, abitset_empty_p, abitset_equal_p, + abitset_subset_p, abitset_disjoint_p, abitset_and_cmp, + abitset_andn_cmp, abitset_or_cmp, abitset_xor_cmp, abitset_and_or, + abitset_and_or_cmp, abitset_andn_or_cmp, abitset_or_and_cmp): + Return or accept bool, not int. All callers changed. + * lib/bbitset.h: (bitset_toggle_, bitset_copy_, bitset_and_or_cmp_, + bitset_andn_or_cmp_, bitset_or_and_cmp_): Likewise. + * lib/bitset.c (bitset_only_set_p, bitset_print, bitset_toggle_, + bitset_copy_, bitset_op4_cmp, bitset_and_or_cmp_, bitset_andn_or_cmp_, + bitset_or_and_cmp_): Likewise. + * lib/bitset.h (bitset_test, bitset_only_set_p): Likewise. + * lib/bitset_stats.c (bitset_stats_print, bitset_stats_toggle, + bitset_stats_test, bitset_stats_empty_p, bitset_stats_disjoint_p, + bitset_stats_equal_p, bitset_stats_subset_p, bitset_stats_and_cmp, + bitset_stats_andn_cmp, bitset_stats_or_cmp, bitset_stats_xor_cmp, + bitset_stats_and_or_cmp, bitset_stats_andn_or_cmp, + bitset_stats_or_and_cmp): Likewise. + * lib/ebitset.c (ebitset_elt_zero_p, ebitset_equal_p, ebitset_copy_cmp, + ebitset_test, ebitset_empty_p, ebitset_subset_p, ebitset_disjoint_p, + ebitset_op3_cmp, ebitset_and_cmp, ebitset_andn_cmp, ebitset_or_cmp, + ebitset_xor_cmp): Likewise. + * lib/lbitset.c (lbitset_elt_zero_p, lbitset_equal_p, lbitset_copy_cmp, + lbitset_test, lbitset_empty_p, lbitset_subset_p, lbitset_disjoint_p, + lbitset_op3_cmp, lbitset_and_cmp, lbitset_andn_cmp, lbitset_or_cmp, + lbitset_xor_cmp): Likewise. + * lib/bbitset.h: Include . + (struct bitset_vtable): The following members now return bool, not + int: toggle, test, empty_p, disjoint_p, equal_p, subset_p, + and_cmp, andn_cmp, or_cmp, xor_cmp, and_or_cmp, andn_or_cmp, + or_and_cmp). + * src/conflicts.c (count_rr_conflicts): Likewise. + * lib/bitset_stats.h (bitset_stats_enabled): Now bool, not int. + All uses changed. + * lib/ebitset.c (ebitset_obstack_init): Likewise. + * lib/lbitset.c (lbitset_obstack_init): Likewise. + * src/getargs.c (debug_flag, defines_flag, locations_flag, + no_lines_flag, no_parser_flag, token_table_flag, yacc_flag, + graph_flag): Likewise. + * src/getargs.h (debug_flag, defines_flag, locations_flag, + no_lines_flag, no_parser_flag, token_table_flag, yacc_flag, + graph_flag): Likewise. + * src/output.c (error_verbose): Likewise. + * src/output.h (error_verbose): Likewise. + * src/reader.c (start_flag, typed): Likewise. + * src/reader.h (typed): Likewise. + * src/getargs.c (LOCATIONS_OPTION): New constant. + (long_options, getargs): Use it. + * src/lalr.c (build_relations): Use bool, not int. + * src/nullable.c (nullable_compute): Likewise. + * src/print.c (print_reductions): Likewise. + * src/tables.c (action_row, pack_vector): Likewise. + * src/muscle_tab.h (MUSCLE_INSERT_BOOL): New macro. + * src/output.c (prepare): Use it. + * src/output.c (token_definitions_output, + symbol_destructors_output, symbol_destructors_output): Use string, + not boolean integer, to keep track of whether to output separator. + * src/print_graph.c (print_core): Likewise. + * src/state.c (state_rule_lookaheads_print): Likewise. + + * config/install-sh: Sync from automake 1.7.5. + +2003-05-14 Paul Eggert + + * src/parse-gram.y (rules_or_grammar_declaration): Require a + semicolon after a grammar declaration, in the interest of possible + future changes to the Bison input language. + Do not allow a stray semicolon at the start of the grammar. + (rhses.1): Allow one or more semicolons after any rule, including + just before "|" as required by POSIX. + * tests/input.at (Torturing the Scanner): Add tests for ";|" in a + grammar. + +2003-05-14 Alexandre Duret-Lutz + + %parse-param support for lalr1.cc. + + * data/lalr1.cc (b4_parse_param_decl, b4_parse_param_cons, + b4_cc_constructor_calls, b4_cc_constructor_call, + b4_parse_param_vars, b4_cc_var_decls, b4_cc_var_decl): New m4 + definitions. + (yy::b4_parser_class_name::b4_parser_class_name): Take extra + parse-param arguments. + (yy::b4_parser_class_name): Declare instance variables to + hold parse-param arguments. + * tests/calc.at: s/value/semantic_value/ because value clashes + with a member of yy::b4_parser_class_name. Adjust C++ code + to handle %parse-param. Enable %parse-param test in C++. + +2003-05-12 Paul Eggert + + * doc/bison.texinfo (How Can I Reset @code{yyparse}): Reword the + English a bit. Fix fclose typo. Change "const char" to "char + const", and use ANSI C rather than K&R for "main". Suggest + YY_FLUSH_BUFFER over yyrestart (as that is what Flex recommends) + and suggest yy_switch_to_buffer. + +2003-05-05 Paul Eggert + + * lib/bitset.h (__INT_TO_PTR): Define to a value that presumes + C89. This avoids a diagnostic on compilers that define __STDC__ + to 0, fixing a problem with Tru64 cc reported by Martin Mokrejs in + . + +2003-05-03 Paul Eggert + + * lib/bitset.h (BITSET_FOR_EACH, BITSET_FOR_EACH_REVERSE): + Do not overrun array bounds. + This should fix a bug reported today by Olatunji Oluwabukunmi in + . + +2003-04-29 Akim Demaille + + * src/gram.h, src/gram.c (pure_parser, glr_parser): Move to... + * src/getargs.c, src/getargs.h: here, as bool, not int. + (nondeterministic_parser): New. + * src/parse-gram.y, src/scan-gram.l: Support + %nondeterministic-parser. + * src/output.c (prepare): Use nondeterministic_parser instead + of glr_parser where appropriate. + * src/tables.c (conflict_row, action_row, save_row) + (token_actions, token_actions, pack_vector): Ditto. + +2003-04-29 Akim Demaille + + * doc/bison.texinfo (C++ Parsers, Implementing Loops): New. + +2003-04-29 Akim Demaille + + * tests/calc.at: Also test yacc.c and glr.c (but not lalr1.cc yet) + with %pure-parser and %locations to exercise the patch from Yakov + Markovitch below. + +2003-04-28 Tim Van Holder + + * data/yacc.c: (b4_lex_param): Corrected for the case where + %lex-param is provided and %pure-parser isn't. + +2003-04-27 Paul Eggert + + Avoid gcc -Wundef warnings reported by Gerald Pfeifer in + . + * data/yacc.c (YYSTACK_ALLOC): Don't evaluate YYSTACK_USE_ALLOCA + if it is not defined. + (YYMAXDEPTH): Don't evaluate YYMAXDEPTH if it is not defined. + +2003-04-26 Paul Eggert + + * data/lalr1.cc (yy::Parser::pact_ninf_, yy::Parser::table_ninf_): + Declare to be of type suitable for the ninf value itself, not of + type suitable for the corresponding table, since the latter might + be unsigned but the ninf value might be negative. This fixes a + bug reported by Alexandre Duret-Lutz in + . + + * configure.ac (AC_FUNC_ERROR_AT_LINE): Remove, since gl_ERROR + invokes it. We shouldn't invoke it twice because it will attempt + to put error.o in the archive twice. This fixes a glitch reported + by Martin Mokrejs in + . + +2003-04-21 Paul Eggert + + * m4/error.m4: Update from Bruno Haible's 2003-04-14 patch + to gnulib. + +2003-04-21 Yakov Markovitch + + * data/glr.c (yyexpandGLRStack) [!YYSTACKEXPANDABLE]: + Fix obvious typo that results in uncompilable GLR parsers + when both %pure-parser and %locations are used. (trivial change) + +2003-04-17 Paul Eggert + + * src/scan-gram.l: Add %option nounput, since we no longer use unput. + (unexpected_eof): Renamed from unexpected_end_of_file, for brevity. + Do not insert the expected token via unput, as this runs afoul + of a POSIX-compatibility bug in flex 2.5.31. + All uses changed to BEGIN the parent state, + since we no longer insert the expected token via unput. + * tests/regression.at (Invalid inputs): Remove cascaded diagnostic + that is no longer emitted after the above change. + + * src/conflicts.c (set_conflicts): Resolve all conflicts, not just + the first one. This change is from Paul Hilfinger, and it fixes + regression reported by Werner Lemberg in + . + + (resolve_sr_conflict): Don't invoke state_errs_set + unless one or more tokens have been explicitly made errors. + Otherwise, the above change causes Bison to abort. + + * tests/existing.at (GNU pic Grammar): New test case, taken from + Lemberg's email. + +2003-03-31 Akim Demaille + + * doc/Makefile.am (AM_MAKEINFOFLAGS): Don't split the info file. + +2003-03-31 Akim Demaille + + * src/output.c (prepare_symbols): Avoid trailing spaces in the + output. + +2003-03-31 Akim Demaille + + * doc/bison.texinfo (Strings are Destroyed): s/losses/loses/. + From Paul Hilfinger. + +2003-03-29 Akim Demaille + + * m4/error.m4: Do not put under dynamic conditions some code which + expansion is under static control. + +2003-03-29 Akim Demaille + + * doc/bison.texinfo (How Can I Reset @code{yyparse}): New. + +2003-03-29 Akim Demaille + + * doc/bison.texinfo (Strings are Destroyed): New. + +2003-03-13 Paul Eggert + + * .cvsignore: Add configure.lineno. + * src/.cvsignore: Add yacc. + * tests/.cvsignore: Add testsuite.log. + * doc/fdl.texi: Sync with latest FSF version. + +2003-03-12 Paul Eggert + + * scan-gram.l (YY_USER_INIT): Initialize code_start, too. + (<>, <>): Set *loc to the scanner + cursor, instead of leaving it undefined. This fixes a bug + reported by Tim Van Holder in + . + * tests/input.at (Torturing the Scanner): Test the scanner on + an empty input file, which was Tim Van Holder's test case. + + * m4/timevar.m4 (BISON_PREREQ_TIMEVAR): When checking whether + can be included, include sys/time.h and + sys/times.h first, if available. This works around the SunOS + 4.1.4 porting bug reported by Bruce Becker in + . + + * m4/subpipe.m4 (BISON_PREREQ_SUBPIPE): Don't + AC_CHECK_HEADERS([sys/wait.h]), as this interferes with + AC_HEADER_SYS_WAIT. + + Merge changes from gnulib. This was prompted because the CVS + snapshot didn't build on Solaris 7 due to strnlen problems. + + These changes need to be merged back into gnulib: + * lib/hash.c: Include unconditionally. + * m4/onceonly.m4 (m4_quote): New macro. + (AC_CHECK_HEADERS_ONCE, AC_CHECK_FUNCS_ONCE, AC_CHECK_DECLS_ONCE): + Quote AC_FOREACH variable-expansions properly. + The 2003-01-03 obstack.h change also needs merging. + {end of changes requiring merging} + + * lib/stdbool.h.in, m4/alloca.m4, m4/dirname.m4, m4/dos.m4, + m4/getopt.m4, m4/hash.m4, m4/malloc.m4, m4/memchr.m4, + m4/memrchr.m4, m4/obstack.m4, m4/onceonly.m4, m4/quote.m4, + m4/quotearg.m4, m4/realloc.m4, m4/stpcpy.m4, m4/strnlen.m4, + m4/strtol.m4, m4/strtoul.m4, m4/unlocked-io.m4, m4/xalloc.m4: + New files, imported from gnulib. + * m4/Makefile.am (EXTRA_DIST): Add the new m4/*.m4 files mentioned + above. + + * lib/mbswidth.c, m4/error.m4, m4/mbrtowc.m4, m4/mbswidth.m4, + m4/memcmp.m4, m4/prereq.m4, m4/stdbool.m4: Update to current + gnulib sources. + + * configure.ac (gl_DIRNAME, gl_GETOPT, gl_HASH, gl_QUOTE, gl_XALLOC): + Add. + (gl_ERROR): New, replacing jm_PREREQ_ERROR. + (gl_FUNC_ALLOCA): New, replacing AC_FUNC_ALLOCA. + (gl_FUNC_STPCPY): New, replacing AC_REPLACE_FUNCS(stpcpy). + (gl_FUNC_STRNLEN): New, replacing AC_FUNC_STRNLEN. + (gl_MBSWIDTH): New, replacing jm_PREREQ_MBSWIDTH. + (gl_OBSTACK): New, replacing AC_FUNC_OBSTACK. + (gl_QUOTEARG): New, replacing jm_PREREQ_QUOTEARG. + (jm_FUNC_GLIBC_UNLOCKED_IO, gl_FUNC_STPCPY, gl_FUNC_STRTOL): New. + (jm_FUNC_MALLOC): New, replacing AC_FUNC_MALLOC. + (jm_FUNC_REALLOC): New, replacing AC_FUNC_REALLOC. + (jm_PREREQ_ARGMATCH): Remove. + (AC_REPLACE_FUNCS): Remove memchr, memrchr, stpcpy, strtol, strtoul. + * lib/Makefile.am (libbison_a_SOURCES): Add argmatch.c, argmatch.h. + + * src/system.h: Include unconditionally. + + * lib/bbitset.h: Include unconditionally. We have been + assuming at least C89 in the bitset code for some time now. + +2003-03-03 Akim Demaille + + * ro.po: New. + +2003-03-02 Akim Demaille + + * doc/bison.texinfo (Table of Symbols): Reactivate the + documentation for %lex-param, and %parse-param. + +2003-03-02 Akim Demaille + + * data/yacc.c, data/glr.c, data/lal1.cc: Use similar code to + generate verbose error messages. + Use the number of tokens as an upper bound in yytname, as it + cannot be a non terminal. + +2003-03-02 Akim Demaille + + * tests/regression.at (_AT_DATA_DANCER_Y): Fix the expected error + message. + +2003-03-02 Akim Demaille + + * tests/regression.at (_AT_DATA_DANCER_Y, AT_CHECK_DANCER): New. + Use them to exercise yycheck overrun. + Based on Andrew Suffield's grammar. + +2003-03-02 Akim Demaille + + Create tests/local.at for Bison generic testing macros. + + * tests/calc.at (AT_CHECK_PUSHDEFS, AT_CHECK_POPDEFS): Move to... + * tests/local.at (AT_BISON_OPTION_PUSHDEFS, AT_BISON_OPTION_POPDEFS): + This new file. + * tests/calc.at (AT_CHECK_CALC): Adjust. + * tests/testsuite.at (AT_DATA_GRAMMAR_PROLOGUE, AT_DATA_GRAMMAR) + (AT_COMPILE, AT_COMPILE_CXX, AT_PARSER_CHECK): Move to... + * tests/local.at: here. + (AT_COMPILE_CXX): Tags the tests using it as c++. + Ignore the test if CXX is not functional. + +2003-03-01 Paul Eggert + + * src/scan-gram.l (code_start): Initialize it to scanner_cursor, + not loc->end, since loc->end might contain garbage and this leads + to undefined behavior on some platforms. + (id_loc, token_start): Use (IF_LINTed) initial values that do not + depend on *loc, so that the reader doesn't give the the false + impression that *loc is initialized. + ("%%"): Do not bother setting code_start, since its value + does not survive the return. + +2003-03-01 Akim Demaille + + * src/scan-gram.l (code_start): Always initialize it when entering + into yylex, as SC_EPILOGUE is activated *before* the corresponding + yylex invocation. An alternative would be making it static, but + then it starts with the second %%'s beginning, instead of its end. + +2003-02-28 Paul Eggert + + * lib/mbswidth.c: Include before "mbswidth.h", to work + around a UnixWare 7.1.1 porting bug reported by John Hughes in + . + +2003-02-26 Paul Eggert + + * README: Mention compiler bug in Sun Forte Developer 6 update 2. + Remove Sequent/Pyramid discussion (nobody uses them any more). + Merge VMS and MS-DOS discussion; these ports may well be dead + but let's keep mentioning them for now. Put <> around email + addresses. Add copyright notice. + +2003-02-24 Paul Eggert + + * data/glr.c (yy_reduce_print): yylineno -> yylno, + to avoid collision with flex use of yylineno. + Problem reported by Bruce Lilly in + . + * data/lalr1.cc (yy::]b4_parser_class_name[::parse): Likewise. + * data/yacc.c (yy_reduce_print): Likewise. + + * config/depcomp: Sync with Automake 1.7.3. + +2003-02-21 Akim Demaille + + * data/lalr1.cc: Use temporary variables instead of casts to + change integer types. + Suggested by Paul Eggert. + +2003-02-21 Akim Demaille + + * doc/bison.texinfo: Use "location" consistently to refer to @n, + to avoid confusions with lalr1.cc's notion of Position. + Suggested by Paul Eggert. + +2003-02-20 Akim Demaille + + * data/lalr1.cc (position.hh): Make sure "columns" never pushes + before initial_columns. + (location.hh): Use consistent variable names when defining the + operator<<. + Use "last" so that we subtract from Positions, not from unsigned. + +2003-02-20 Akim Demaille + + * data/lalr1.cc (position.hh): New subfile, including the extended + and Doxygen'ed documentation of class Position. + (location.hh): Use it. + Document a` la Doxygen. + With the help of Benoit Perrot. + +2003-02-20 Akim Demaille + + * tests/calc.at (AT_CHECK_PUSHDEFS, AT_CHECK_POPDEFS): Define + AT_YACC_IF. + Redefine AT_YYERROR_SEES_LOC_IF using it. + (_AT_DATA_CALC_Y): Don't declare yyerror when lalr1.cc, as it is + not defined. + Don't use the location in yy::Parser::error_ and + yy::Parser::print_ when not %locations. + Activate more lalr1.cc tests. + +2003-02-19 Akim Demaille + + * data/lalr1.cc: When displaying a line number, be sure to make it + an int. + +2003-02-19 Akim Demaille + + * data/lalr1.cc (b4_stack_depth_init, yy::Parser::initdepth_): + Remove, useless. + (YYABORT, YYACCEPT, YYERROR): New. + * tests/calc.at: Renable the lalr1.cc test. + +2003-02-19 Akim Demaille + + * tests/calc.at (AT_CHECK_CALC): Check different scenarios of + error recovery, mixing with/without pops and discarding of the + lookahead. + Exercise YYERROR. + Disable the lalr1.cc tests as currently it doesn't support YYERROR. + +2003-02-17 Paul Eggert + + * tests/atlocal.in (LDFLAGS, LIBS): New vars. + * tests/testsuite.at (AT_COMPILE): Use them. + This fixes the testsuite problem reported by Robert Lentz in + . + +2003-02-12 Paul Eggert + + * data/yacc.c (yyerrlab) [YYERROR_VERBOSE]: + Avoid subscript error in yycheck. Bug reported by Andrew Suffield in + . + * data/glr.c (yyreportSyntaxError) [YYERROR_VERBOSE]: Likewise. + Check for malloc failure, for consistency with yacc.c. + (yytname_size): Remove, for consistency with yacc.c. + + The bug still remains in data/lalr1.cc, as I didn't have time + to fix it there. + +2003-02-06 Akim Demaille + + * configure.ac (GXX): Rename as... + (CXX): this, to keep the original Autoconf semantics. + Require 2.57. + * data/lalr1.cc: Fix b4_copyright invocations. + If YYDEBUG is not defined, don't depend upon name_ being defined. + (location.hh): Include string and iostream. + (Position::filename): New member. + (Position::Position ()): New. + (operator<< (Position)): New. + (operator- (Position, int)): New. + (Location::first, Location::last): Rename as... + (Location::begin, Location::end): these, to mock the conventional + iterator names. + (operator<< (Location)): New. + * tests/atlocal.in (CXX): New. + * tests/testsuite.at (AT_COMPILE_CXX): New. + * tests/calc.at (_AT_DATA_CALC_Y): Adjust yyerror to report the + locations in a more synthetic way. + (AT_CHECK_PUSHDEFS): AT_YYERROR_SEES_LOC_IF is positive if + lalr1.cc is used. + Adjust the C locations to match those from Emacs: first column is + column 0. + Change all the expected results. + Conform to the GCS: simplify the locations when applicable. + (LOC, VAL, YYLLOC_FORMAL, YYLLOC_ARG, USE_YYLLOC, LEX_FORMALS) + (LEX_ARGS, USE_LEX_ARGS, LEX_PRE_FORMALS, LEX_PRE_ARGS): Replace + these CPP macros with the m4 macros new defined by... + (AT_CHECK_PUSHDEFS): this, i.e.: + (AT_LALR1_CC_IF, AT_PURE_LEX_IF, AT_LOC, AT_VAL, AT_LEX_FORMALS) + (AT_LEX_ARGS, AT_USE_LEX_ARGS, AT_LEX_PRE_FORMALS, AT_LEX_PRE_ARGS) + New macros. + (AT_CHECK_POPDEFS): Undefine them. + (AT_CHECK_CALC_LALR1_CC): New. + Use it for the first lalr1.cc test. + +2003-02-04 Akim Demaille + + * data/lalr1.cc (YYLLOC_DEFAULT): Fix its definition: be based on + Location as is defined. + +2003-02-04 Akim Demaille + + * data/lalr1.cc: If YYDEBUG is not defined, don't depend upon + name_ being defined. + +2003-02-03 Paul Eggert + + * src/gram.h (start_symbol): Remove unused decl. + + Use more-consistent naming conventions for local vars. + + * src/derives.c (derives_compute): Change type of local var from + int to rule_number. + * src/gram.c (grammar_rules_partial_print): Likewise. + * src/print.c (print_core): Likewise. + * src/reduce.c (reduce_grammar_tables): Likewise. + + * src/gram.c (grammar_dump): Change name of item_number * + local var from r to rp. + * src/nullable.c (nullable_compute): Likewise. + + * src/gram.h (ISTOKEN, ISVAR): Use i, not s, for int var. + + * src/gram.h (symbol_number_as_item_number): Use sym, not s, + for symbol or symbol_number var. + * src/reader.c (grammar_start_symbol_set): Likewise. + * src/reader.h (grammar_start_symbol_set, grammar_symbol_append): + Likewise. + * src/state.c (transitions_to): Likewise. + * src/state.h: Likewise. + * src/tables.c (symbol_number_to_vector_number): Likewise. + + * src/muscle_tab.h (MUSCLE_OBSTACK_SGROW): Use p, not s, for + char * var. + + * src/parse-gram.y (lloc_default): Use loc, not r, for YYLTYPE + var. + + * src/scan-gram.l (no_cr_read): Use bytes_read, not s, for size + var. + + * src/system.h (xstrndup, strchr, strspn, strnlen, memchr, memrchr): + Use str, not s, for char * var. Use ch, not c, for character var. + Use size for size var. + + * src/uniqstr.c (uniqstr_new, uniqstr_assert): Use str, not s, for + char * var. + (uniqstr_print, uniqst_print_processor): Use ustr, not s, for + uniqstr var. + * src/uniqstr.h: Likewise. + + * src/vcg.c (get_color_str, get_textmode_str, get_shape_str, + get_layoutalgorithm_str, get_decision_str, get_orientation_str, + get_node_alignment_str, get_arrow_mode_str, get_crossing_type_str, + get_view_str, get_linestyle_str, get_arrowstyle_str): Rename + param to have same name as that of enum, so that we don't use + "s" to stand for a non-state. + +2003-02-02 Akim Demaille + + * src/scan-skel.l: Scan more than one inert character per yylex + invocation. + +2003-02-01 Paul Eggert + + Version 1.875a. + + * po/LINGUAS: Add ms. + +2003-01-30 Akim Demaille + + * doc/Makefile.am (CLEANFILES): Add bison.fns for distcheck. + +2003-01-29 Paul Hilfinger + + * tests/cxx-type.at: Correct apparent typo in Bison input: $$ instead + of $1. + + Changes in response to error report by S. Eken: GLR mode does not + handle negative $ indices or $ indices in embedded rules correctly. + See . + + * data/glr.c (b4_rhs_value): Change to use YYFILL macro. + (b4_rhs_location): Ditto. + (yyfill): New function to copy from stack tree into array + incrementally. + (yyuserAction): Modify to allow incremental move of semantic values + to rhs array when in GLR mode. + Define YYFILL to use in user-defined actions to fill semantic array + as needed. + Remove dummy use of yystack, as there is now a guaranteed use. + (yydoAction): Modify to allow incremental move of semantic values + to rhs array when in GLR mode. + (yyresolveAction): Ditto. + (yyglrShiftDefer): Update comment. + (yyresolveStates): Use X == NULL for pointers, not !X. + (yyglrReduce): Ditto. + (yydoAction): Ditto + + * tests/glr-regr1.at: Rename to ... + * tests/glr-regression.at: Add new regression test for the problems + described above (adapted from S. Eken). + Update copyright notice. + * tests/testsuite.at: Rename glr-regr1.at to glr-regression.at. + * tests/Makefile.am: Ditto. + +2003-01-28 Paul Eggert + + * data/lalr1.cc: Do not use @output_header_name@ unless + b4_defines_flag is set. This fixes two bugs reported by + Tim Van Holder in + + and . + +2003-01-21 Paul Eggert + + * data/yacc.c (YYERROR): Move code from yyerrlab1 to here, so that + we don't need to worry about yyerrlab1 being reported as an + "unused label" by non-GCC C compilers. The downside is that if + locations are used then a couple of statements are duplicated each + time YYERROR is invoked, but the upside is that the warnings + should vanish. + (yyerrlab1): Move code to YERROR. + (yyerrlab2): Remove. Change uses back to yyerrlab1. + This reverts some of the 2002-12-27 change. + +2003-01-17 Paul Eggert + + * src/output.c (symbol_printers_output): Fix typo that led + to core dump. Problem reported by Antonio Rus in + . + +2003-01-13 Akim Demaille , + Quoc Peyrot , + Robert Anisko + + * data/lalr1.cc (parse::yyerrlab1): When popping the stack, stop + when the stacks contain one element, as the loop would otherwise + free the last state, and then use the top state (the one we just + popped). This means that the initial elements will not be freed + explicitly, as is the case in yacc.c; it is not a problem, as + these elements have fake values. + +2003-01-11 Paul Eggert + + * NEWS: %expect-violations are now just warnings, reverting + to Bison 1.30 and 1.75 behavior. This fixes the GCC 3.2 + bootstrapping problem reported by Matthias Klose; see + . + * src/conflicts.c (conflicts_print): Likewise. + * tests/conflicts.at (%expect not enough, %expect too much, + %expect with reduce conflicts): Likewise. + * doc/bison.texinfo (Expect Decl): Document this. Also mention + that the warning is enabled if the number of conflicts changes + (not necessarily increases). + + * src/getargs.c (version): Update copyright year. + +2003-01-09 Akim Demaille + + * src/Makefile.am, lib/Makefile.am: Use $(VAR) instead of @VAR@. + +2003-01-08 Paul Eggert + + * Makefile.maint (WGETFLAGS): + New macro, containing "-C off" to disable proxy caches. + All uses of $(WGET) changed to $(WGET) $(WGETFLAGS). + (rel-check): Use $(WGET) instead of wget. + +2003-01-06 Paul Eggert + + * doc/bison.texinfo (Generalized LR Parsing): Add a reference to + the GLR paper of Scott, Johnstone and Hussain. + +2003-01-04 Paul Eggert + + * configure.ac (AC_ARG_ENABLE): Add --disable-yacc. + (YACC_SCRIPT, YACC_LIBRARY): New vars to AC_SUBST. + * lib/Makefile.am (lib_LIBRARIES): liby.a -> @YACC_LIBRARY@. + (EXTRA_LIBRARIES): New var, for liby.a. + * src/Makefile.am (bin_SCRIPTS): yacc -> @YACC_SCRIPT@. + (EXTRA_SCRIPTS): New var, for yacc. + + * data/yacc.c (yyerrlab1): Omit attribute if __cplusplus is defined, + since GNU C++ (as of 3.2.1) does not allow attributes on labels. + Problem reported by Nelson H. F. Beebe. + +2003-01-03 Paul Eggert + + * lib/obstack.h (__INT_TO_PTR) [__STDC__]: Cast result to + (void *) to avoid diagnostic with native c89 on SGI IRIX 6.5 + when compiling Bison 1.875's `bitset bset = obstack_alloc + (bobstack, bytes);'. Problem reported by Nelson H. F. Beebe. + + * src/scan-skel.l (QPUTS): Omit redundant `;' from macro definition. + ([^@\n]): Renamed from [^@\n]+ so that the token buffer does not + grow to a huge size with typical invocation. + + * lib/hash.c (_Bool, bool, false, true, __bool_true_false_are_defined): + Use the pattern recommended by Autoconf 2.57, except also protect + against double-definition. + * src/system.h: Likewise. + Portability issues reported by Nelson H. F. Beebe. + + * data/glr.c (yybool): Renamed from bool, to avoid collisions in C. + All uses changed. Provide a definition in both C and C++. + (yytrue, yyfalse): Define even if defined (__cplusplus). + + * lib/bitset_stats.c (bitset_stats_list): Remove unused var. + Reported by Nelson H. F. Beebe. + + * src/scan-skel.l ("@oline@"): Output lineno+1, not lineno. + +2003-01-02 Paul Eggert + + * data/yacc.c (yyerrlab1): Append `;' after attribute, to + pacify the buggy "smart preprocessor" in MacOS 10.2.3. + Bug reported by Nelson H. F. Beebe. + +2003-01-01 Paul Eggert + + * Version 1.875. + +2002-12-30 Paul Eggert + + * src/scan-gram.l (","): + Moved here from... + (","): Here. This causes stray "," to be treated + more uniformly. + + * src/scan-gram.l ("}"): Output ";" before the + last brace in braced code when not in Yacc mode, for compatibility + with Bison 1.35. This resurrects the 2001-12-15 patch to + src/reader.c. + + * src/reader.h (YYDECL): Use YYSTYPE, not its deprecated alias + yystype. This follows up the 2002-12-24 YYSTYPE bug fix. + +2002-12-28 Paul Eggert + + * src/symtab.c (symbol_make_alias): Set type of SYMVAL to be + that of SYM's type. This fixes Debian bug 168069, reported by + Thomas Olsson. + +2002-12-28 Paul Eggert + + Version 1.75f. + + Switch back to the Yacc style of conflict reports, undoing some + of the 2002-07-30 change. + * doc/bison.texinfo (Understanding): Use Yacc style for + conflict reports. Also, use new way of locating rules. + * src/conflicts.c (conflict_report): + Renamed from conflict_report_yacc, removing the old + 'conflict_report'. Translate the entire conflict report at once, + so that we don't assume that "," has the same interpretation in + all languages. + (conflicts_output): Use Yacc-style conflict report for each state, + instead of our more-complicated style. + (conflicts_print): Use Yacc-style conflict report, except print + the input file name when not emulating Yacc. + * tests/conflicts.at (Unresolved SR Conflicts, Defaulted + Conflicted Reduction, %expect not enough, %expect too much, + %expect with reduce conflicts): Switch to Yacc-style conflict reports. + * tests/existing.at (GNU Cim Grammar): Likewise. + * tests/glr-regr1.at (Badly Collapsed GLR States): Likewise. + + * src/complain.c (warn_at, warn, complain_at, complain, fatal_at, + fatal): Don't invoke fflush; it's not needed and it might even be + harmful for stdout, as stdout might not be open. + * src/reduce.c (reduce_print): Likewise. + +2002-12-27 Paul Eggert + + Fix a bug where error locations were not being recorded correctly. + This problem was originally reported by Paul Hilfinger in + . + + * data/yacc.c (yyparse): New local var yylerrsp, to record the + top of the location stack's error locations. + (yyerrlab): Set it. When discarding a token, push its location + onto yylerrsp so that we don't lose track of the error's end. + (yyerrlab1): Now is only the target of YYERROR, so that we can + properly record the location of the action that failed. For GCC + 2.93 and later, insert an __attribute__ ((__unused__)) to avoid + GCC warning about yyerrlab1 being unused if YYERROR is unused. + (yyerrlab2): New label, which yyerrlab now falls through to. + Compute the error's location by applying YYLLOC_DEFAULT to + the locations of all the symbols that went into the error. + * doc/bison.texinfo (Location Default Action): Mention that + YYLLOC_DEFAULT is also invoked for syntax errors. + * tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): + Error locations include the locations of all the tokens that were + discarded, not just the last token. + +2002-12-26 Paul Eggert + + * src/files.c: Include quote.h. + (compute_output_file_names): Warn if we detect conflicting + outputs to the same file. This should catch the misunderstanding + exemplified by Debian Bug 165349, reported by Bruce Stephens.. + + * src/conflicts.c (conflicts_print): If the user specifies + "%expect N", report an error if there are any reduce/reduce + conflicts. This is what the manual says should happen. + This fixes Debian bug 130890, reported by Anthony DeRobertis. + * tests/conflicts.at (%expect with reduce conflicts): New test. + + Don't use m4_include on relative file names, as it doesn't work as + desired if there happens to be a file with that name under ".". + + * m4sugar/version.m4: Remove; it was included but it wasn't used. + * data/Makefile.am (dist_m4sugar_DATA): Remove m4sugar/version.m4. + * data/m4sugar/m4sugar.m4: Don't include m4sugar/version.m4. + * data/glr.c, data/lalr1.cc, data/yacc.c: Don't include c.m4. + * src/output.c (output_skeleton): Use full path names when + specifying a file to include; don't rely on include path, as + it's unreliable when the working file contains a file with + that name. + +2002-12-25 Paul Eggert + + Remove obsolete references to bison.simple and bison.hairy. + Problem mentioned by Aubin Mahe in + . + * data/glr.c: Comment fix. + * doc/bison.1: Remove references. Also, mention "yacc". + + * src/getargs.c (getargs) [MSDOS]: Don't assume optarg != NULL + with -g option. + + * src/parse-gram.y (declaration): Use enum "report_states" rather + than its numeric value 1. + + * src/scan-skel.l ("@output ".*\n): Close any old yyout before + opening a new one. This fixes Debian bug 165349, reported by + Bruce Stephens. + +2002-12-24 Paul Eggert + + Version 1.75e. + + * Makefile.maint (cvs-update): Don't assume that the shell + supports $(...), as Solaris sh doesn't. + + * src/parse-gram.y (lloc_default): Remove test for empty + nonterminals at the end, since it didn't change the result. + +2002-12-24 Paul Eggert + + If the user does not define YYSTYPE as a macro, Bison now declares it + using typedef instead of defining it as a macro. POSIX requires this. + For consistency, YYLTYPE is also declared instead of defined. + + %union directives can now have a tag before the `{', e.g., the + directive `%union foo {...}' now generates the C code + `typedef union foo { ... } YYSTYPE;'; this is for Yacc compatibility. + The default union tag is `YYSTYPE', for compatibility with Solaris 9 + Yacc. For consistency, YYLTYPE's struct tag is now `YYLTYPE' + instead of `yyltype'. + + `yystype' and `yyltype' are now obsolescent macros instead of being + typedefs or tags; they are no longer documented and will be + withdrawn in a future release. + + * data/glr.c (b4_location_type): Remove. + (YYSTYPE): Renamed from yystype. + (YYSTYPE_IS_DECLARED): New macro, used to prevent double-typedef. + (struct YYLTYPE): Renamed from struct yyltype. + (YYLTYPE): Renamed from yyltype. + (yyltype, yystype): New (and obsolescent) macros, + for backward compatibility. + * data/yacc.c: Likewise. + + * data/yacc.c (YYSTYPE): Declare as union YYSTYPE if the user + does not specify a union tag. This is for compatibility with + Solaris 9 yacc. + + * src/parse-gram.y (add_param): 2nd arg is now char * not char + const *, since it is now modified by stripping surrounding { }. + (current_braced_code): Remove. + (PERCENT_DESTRUCTOR, PERCENT_PRINTER, PERCENT_UNION, + PERCENT_LEX_PARAM, PERCENT_PARSE_PARAM): Change names to include + trailing " {...}". Now of type . + (grammar_declaration): Adjust to bundled tokens. + (code_content): Remove; stripping is now done by add_param. + (print_token_value): Print contents of bundled tokens. + (token_name): New function. + + * src/reader.h (braced_code, current_braced_code): Remove. + (token_name): New decl. + + * src/scan-gram.l (handle_dollar, handle_at): Now takes int + token_type, not braced_code code_kind. All uses changed. + (SC_PRE_CODE): New state, for scanning after a keyword that + has (or usually has) an immediately-following braced code. + (token_type): New local var, to keep track of which token type + to return when scanning braced code. + ("%destructor", "%lex-param", + "%parse-param", "%printer", + "%union"): Set token type and BEGIN SC_PRE_CODE + instead of returning a token type immediately. + ("{"): Set token type. + ("}"): Use it. + (handle_action_dollar, handle_action_at): Now returns bool + indicating success. Fail if ! current_rule; this prevents a core dump. + (handle_symbol_code_dollar, handle_symbol_code_at): + Remove; merge body into caller. + (handle_dollar, handle_at): Complain in invalid contexts. + + * NEWS, doc/bison.texinfo: Document the above. + * NEWS: Fix years and program names in copyright notice. + +2002-12-17 Paul Eggert + + * NEWS, doc/bison.texinfo (Parser Function, Pure Calling, Error + Reporting, Table of Symbols): Omit mentions of %lex-param and + %parse-param from the documentation for now. + +2002-12-15 Paul Eggert + + Undo most of the 2002-11-12 yychar -> yytoken patch, as it broke + GCC 3.2.1 (which depends on yychar == YYEMPTY when there is no + lookahead symbol, and which sets yychar in parser actions) and it + disagreed with the Bison documentation. Bug + reported by Andrew Walrond. + + * data/yacc.c (YYTRANSLATE): Don't check for negative argument, + as the caller now does that. + (yyclearin, YYBACKUP, yyparse): Use yychar, not yytoken. + (YYEMPTY): Parenthesize right hand side, since others use it. + (yyparse): Don't assume that our generated code is the only code + that sets yychar. + +2002-12-13 Paul Eggert + + Version 1.75d. + + POSIX requires a "yacc" command. + * src/Makefile.am (bin_SCRIPTS): New macro, for yacc. + (MOSTLYCLEANFILES): Add yacc. + (yacc): New rule. + * doc/bison.texinfo (Invocation, Bison Options): Mention yacc + as an alias for bison y. + + * po/LINGUAS: Add da. + + * src/getargs.c (__GNU_LIBRARY__) [lint]: Define to work around + problem with latest . + (HACK_FOR___GNU_LIBRARY___PROTOTYPE): New macro. + + * doc/fdl.texi: Upgrade to 1.2. + * lib/alloca.c, lib/error.c, lib/getopt.c, lib/getopt.h + lib/getopt1.c, lib/gettext.h, lib/memrchr.c, lib/obstack.c, + lib/obstack.h, lib/strnlen.c, lib/unlocked-io.h: Sync with + gnulib. + * config/install-sh: Sync with autotools. + + Fix a bad interaction with flex 2.5.23 reported by Bruce Lilly in + . + * data/yacc.c (YYLTYPE, struct yyltype): Do not define unless + locations are requested. + (union yyalloc): Do not depend on YYLTYPE_IS_TRIVIAL unless + locations are requested. + +2002-12-12 Paul Eggert + + Remove unportable casts and storage allocation tricks. + While we're at it, remove almost all casts, since they + usually aren't needed and are a sign of trouble. + + * configure.ac (AC_CHECK_TYPES): Check for uintptr_t. + + * src/derives.c (derives_compute): Do not subtract NTOKENS from + the pointer DSET returned by malloc; this isn't portable. + Instead, always use DSET[i - NTOKENS] rather than DSET[i]. + Similarly for DERIVES. + * src/lalr.c (set_goto_map): Likewise, for GOTO_MAP and TEMP_MAP. + * src/nullable.c (nullable_compute): Likewise, for RSETS and NULLABLE. + * src/reduce.c (reduce_grammar_tables): Likewise, for nontermmap + + * src/derives.c (derives_compute): Do not bother invoking + int_of_rule_number, since rule numbers are integers. + + * src/files.c (concat2, tr, compute_base_name): Use xmalloc (N) + rather than XMALLOC (char, N). + + * src/files.c (filename_split): Rewrite to avoid cast. + + * src/gram.h (symbol_number_as_item_number, + item_number_as_symbol_number, rule_number_as_item_number, + item_number_as_rule_number): + Now inline functions rather than macros, to avoid casts. + * src/state.h (state_number_as_int): Likewise. + * src/tables.c (state_number_to_vector_number, + symbol_number_to_vector_number): Likewise. + + * src/gram.h (int_of_rule_number): Remove; no longer used. + + * src/lalr.c (add_lookback_edge): Use malloc rather than calloc, + since the resulting storage is always stored into. + + * src/main.c (alloca) [C_ALLOCA]: Add decl here, the only place + where it's needed. + + * src/muscle_tab.c (muscle_m4_output): + Now inline. Return bool, not int. + * src/state.c (state_compare): Likewise. + * src/symtab.c (symbol_check_defined, + symbol_check_alias_consistency, symbol_pack, symbol_translation, + hash_compare_symbol, hash_symbol): + Likewise. + * src/uniqstr.c (uniqstr_print): Likewise. + * src/muscle_tab.c (muscle_m4_output_processor): + New function, to avoid casts. + * src/state.c (state_comparator, stage_hasher): Likewise. + * src/symtab.c (symbol_check_defined_processor, + symbol_check_alias_consistency_processor, symbol_pack_processor, + symbol_translation_processor, hash_symbol_comparator, + hash_symbol_hasher): Likewise. + * src/uniqstr.c (uniqstr_print_processor): Likewise. + * src/muscle_tab.c (muscles_m4_output): + Use new functions instead of casting old functions unportably. + * src/state.c (state_hash_new): Likewise. + * src/symtab.c (symbols_new, symbols_do, symbols_check_defined, + symbols_token_translations_init): + Likewise. + * src/uniqstr.c (uniqstrs_new, hash_initialize, uniqstrs_do): Likewise. + + * src/output.c (GENERATE_MUSCLE_INSERT_TABLE): Use long local + var instead of casting to long, to avoid casts. + (prepare_states): Use MALLOC rather than alloca, so that we don't + have to worry about alloca. + * src/state.c (state_hash_lookup): Likewise. + + * src/scan-gram.l ("'"): Use unsigned char + local var instead of casting to unsigned char, to avoid casts. + + * src/state.c (TRANSITIONS_ALLOC, ERRS_ALLOC, REDUCTIONS_ALLOC, + STATE_ALLOC): Remove. + (transitions_new, errs_new, reductions_new, state_new): Use malloc + rather than calloc, and use offsetof to avoid allocating slightly + too much storage. + (state_new): Initialize all members. + + * src/state.c (state_hash): Use unsigned accumulator, not signed. + + * src/symtab.c (symbol_free): Remove; unused. + (symbol_get): Remove cast in lhs of assignment. + (symbols_do): Now static. Accept generic arguments, not + hashing-related ones. + + * src/symtab.h: (NUMBER_UNDEFINED): Remove unnecessary cast. + (symbol_processor): Remove. + (symbols_do): Remove decl; now static. + + * src/system.h (alloca): Remove; decl no longer needed. + (): Include, for offsetof. + (, ): Include if available. + (uintptr_t): New type, if system lacks it. + (CALLOC, MALLOC, REALLOC): New macros. + All uses of XCALLOC, XMALLOC, and XREALLOC changed to use these + new macros. + + * src/tables.c (table_size): Now int, to pacify GCC. + (table_grow, table_ninf_remap): Use signed table size. + (save_row): Don't bother initializing locals when not needed. + (default_goto, goto_actions, pack_vector): Remove unnecessary casts. + * src/uniqstr.c (hash_compare_uniqstr): Likewise. + + * src/vcg.h: Correct misspellings. + + * src/vcg_defaults.h (G_CMAX): Now INT_MAX. + + + * src/getargs.c (getargs): Don't assume EOF == -1. + +2002-12-09 Paul Eggert + + Change identifier spellings to avoid collisions with names + that are reserved by POSIX. + + Don't use names ending in _t, since POSIX reserves them. + For consistency, remove _e and _s endings -- they're weren't + needed to remove ambiguity. All uses changed. + * src/uniqstr.h (uniqstr): Renamed from uniqstr_t, which in + turn was just renamed from struniq_t. + * src/uniqstr.c (uniqstr_processor): Renamed from struniq_processor, + which in turn was just renamed from struniq_processor_t. + (hash_compare_uniqstr): Renamed from hash_compare_struniq, which + in turn was renamed from hash_compare_struniq_t. + * src/LR0.c (struct state_list): Renamed from struct state_list_s. + (state_list): Renamed from state_list_t. + * src/assoc.h (assoc): Renamed from assoc_t. + * src/conflicts.c (enum conflict_resolution): Renamed from + enum conflict_resolution_e. + * src/derives.c (struct rule_list): Renamed from struct rule_list_s. + (rule_list): Renamed from rule_list_t. + * src/getargs.h (enum trace): Renamed from enum trace_e. + (enum report): Renamed from enum report_e. + * src/gram.h (item_number): Renamed from item_number_t. + (rule_number): Renamed from rule_number_t. + (struct rule_s): Remove the "rule_s" part; not used. + (rule): Renamed from rule_t. + (rule_filter): Renamed from rule_filter_t. + * src/lalr.c (struct goto_list): Renamed from struct goto_list_s. + (goto_list): Renamed from goto_list_t. + * src/lalr.h (goto_number): Renamed from goto_number_t. + * src/location.h (location): Renamed from location_t. + * src/muscle_tab.c (muscle_entry): Renamed from muscle_entry_t, + and moved here from: + * src/muscle_tab.h (muscle_entry_t): here. + * src/nullable.c (struct rule_list): Renamed from struct rule_list_s. + (rule_list): Renamed from rule_list_t. + * src/print_graph.c (static_graph): Renamed from graph. + * src/reader.h (braced_code): Renamed from braced_code_t. + Remove brace_code_e tag. + * src/relation.h (relation_node): Renamed from relation_node_t. + (relation_nodes): Renamed from relation_nodes_t. + (relation): Renamed from relation_t. + * src/state.h (state_number): Renamed from state_number_t. + (struct state): Renamed from struct state_s. + (state): Renamed from state_t. + (transitions): Renamed from transitions_t. Unused (and + misspelled) transtion_s tag removed. + (errs): Renamed from errs_t. Unused errs_s tag removed. + (reductions): Renamed from reductions_t. Unused tag + reductions_s removed. + * src/symlist.h (symbol_list): Renamed from symbol_list_t. + (struct symbol_list): Renamed from struct symbol_list_s. + * src/symtab.h (symbol_number): Renamed from symbol_number_t. + (struct symbol): Renamed from struct symbol_s. + (symbol): Renamed from symbol_t. + * src/tables.c (vector_number): Renamed from vector_number_t. + (action_number): Renamed from action_t. + * src/tables.h (base_number): Renamed from base_t. + * src/vcg.h (enum color): Renamed from enum color_e. + (enum textmode): Renamed from enum textmode_e. + (enum shape): Renamed from enum shape_e. + (struct colorentry): Renamed from struct colorentry_s. + (struct classname): Renamed from struct classname_s. + (struct infoname): Renamed from struct infoname_s. + (enum layoutalgorithm): Renamed from enum layoutalgorithm_e. + (enum decision): Renamed from enum decision_e. + (enum orientation): Renamed from enum orientation_e. + (enum alignment): Renamed from enum alignment_e. + (enum arrow_mode): Renamed from enum arrow_mode_e. + (enum crossing_type): Renamed from enum crossing_type_e. + (enum view): Renamed from enum view_e. + (struct node): Renamed from struct node_s. + (node): Renamed from node_t. + (enum linestyle): Renamed from enum linestyle_e. + (enum arrowstyle): Renamed from enum arrowstyle_e. + (struct edge): Renamed from struct edge. + (edge): Renamed from edge_t. + (struct graph): Renamed from struct graph_s. + (graph): Renamed from graph_t. + * tests/calc.at (_AT_DATA_CALC_Y, Simple LALR Calculator): + Rename value_t -> value. + * tests/input.at (Torturing the Scanner): Rename value_t -> value, + value_t_as_yystype -> value_as_yystype. + + Don't include in the mainstream code, since it + reserves E[A-Z0-9]* and we want to use symbols like 'EQUALS'. + * lib/get-errno.c, lib/get-errno.h: New files. + * lib/Makefile.am (libbison_a_SOURCES): Add get-errno.h, + get-errno.c. + * src/files.c (xfopen, xfclose): Use get_errno instead of errno. + * src/output.c (output_skeleton): Likewise. + * src/scan-gram.l ({int}): Use set_errno and get_errno + instead of errno. + (\\x[0-9abcdefABCDEF]+): + Likewise. + (handle_action_dollar, handle_action_at): Likewise. + * src/system.h: Do not include . + (TAB_EXT): Renamed from EXT_TAB. + (OUTPUT_EXT): Renamed from EXT_OUTPUT. + + Avoid str[a-z]*, since reserves that name space. + Change all instances of "struniq" in names to "uniqstr", and + likewise for "STRUNIQ" and "UNIQSTR". + * src/uniqstr.c: Renamed from src/struniq.c. + * src/uniqstr.h: Renamed from src/struniq.h. + * src/Makefile.am (bison_SOURCES): Adjust to these renamings. + * src/files.c (strsuffix): Remove; unused. + (concat2): Renamed from stringappend. Now static. + * src/files.h (strsuffix, stringappend): Remove; unused. + * src/parse-gram.y (): Renamed from . + (): Renamed from . + * src/scan-gram.l (obstack_for_string): Renamed from string_obstack. + * src/vcg.h (struct node_s.expand): Renamed from struct node_s.stretch. + (struct graph_s.expand): Renamed from struct graph_s.stretch. + * src/vcg_defaults.h (G_EXPAND): Renamed from G_STRETCH. + (G_LONG_STRAIGHT_PHASE): Renamed from G_STRAIGHT_PHASE. + (N_EXPAND): Renamed from N_STRETCH. + + Avoid *_MAX and *_MIN, since reserves that name space. + * data/yacc.c (YYSTACK_GAP_MAXIMUM): Renamed from YYSTACK_GAP_MAX. + * src/gram.h (ITEM_NUMBER_MAX, ITEM_NUMBER_MIN, RULE_NUMBER_MAX): + Remove; unused. + * src/lalr.h (GOTO_NUMBER_MAXIMUM): Renamed from GOTO_NUMBER_MAX. + * src/state.h (STATE_NUMBER_MAXIMUM): Renamed from STATE_NUMBER_MAX. + * src/symtab.h (SYMBOL_NUMBER_MAXIMUM): Renamed from SYMBOL_NUMBER_MAX. + * src/tables.c (VECTOR_NUMBER_MAX, VECTOR_NUMBER_MIN): Remove; unused. + (BASE_MAXIMUM): Renamed from BASE_MAX. + (BASE_MINIMUM): Renamed from BASE_MIN. + (ACTION_MAX): Remove; unused. + (ACTION_NUMBER_MINIMUM): Renamed from ACTION_MIN. + Unnecessary casts removed from above defines. + + + Fix misspelling in names. + * src/vcg.h (enum_alignment_e): Renamed from enum_alignement_e. + * src/vcg_defaults.h (G_NODE_ALIGNMENT): Renamed from + G_NODE_ALIGNEMENT. + + + * lib/timevar.c (timevar_report): Renamed from time_report, + for consistency with other names. + * lib/timevar.h (timevar_report): New decl. + * src/system.h (time_report): Remove; decl is now in lib/timevar.h. + + + Sort include-file uses. + + Reorder all include files under src to be in the order "system.h". + then the ../lib include files in angle brackets (alphabetized), + then the . include files in double-quotes (alphabetized). Fix + dependency breakages encountered in this process, as follows: + * src/closure.h, src/derives.h, src/state.h: Include "gram.h". + * src/complain.c: Don't include stdlib.h, string.h _LIBC stuff. + * src/state.h: Include "symtab.h". + +2002-12-08 Paul Eggert + + * data/glr.c, data/lalr1.cc, data/yacc.c: Do not use __file__, + since this causes problems when __file__ contains character + sequences like "@" that are treated specially by src/scan-skel.l. + Instead, just use the file's basename. This fixes the bug + reported by Martin Mokrejs in + . + +2002-12-06 Paul Eggert + + Add support for rules that do not have trailing semicolons, as + POSIX requires. Improve the quality of locations in Bison + diagnostics. + + * src/location.c: Include . + (empty_location): Now const. + (location_print): New function. Follow the recommendation of the + GNU Coding Standards for locations that span file boundaries. + * src/location.h: Do not include ; no longer needed. + (boundary): New type. + (location_t): Use it. This allows locations to span file boundaries. + All member uses changed: file -> start.file or end.file (as needed), + first_line -> start.line, first_column -> start.column, + last_line -> end.line, last_column -> end.column. + (equal_boundaries): New function. + (LOCATION_RESET, LOCATION_STEP): Remove. + (LOCATION_PRINT): Remove. All callers changed to use location_print. + (empty_location): Now const. + (location_print): New decl. + * src/parse-gram.y (lloc_default): New function, which handles + empty locations more accurately. + (YYLLOC_DEFAULT): Use it. + (%token COLON): Remove. + (%token ID_COLON): New token. + (rules): Use it. + (declarations, rules): Remove trailing semicolon. + (declaration, rules_or_grammar_declaration): + Allow empty (";") declaration. + (symbol_def): Remove empty actions; no longer needed. + (rules_or_grammar_declaration): Remove trailing semicolon. + (semi_colon.opt): Remove. + * src/reader.h: Include location.h. + (scanner_cursor): New decl. + * src/reduce.c (nonterminals_reduce): Use warn_at rather than + rolling our own. + * src/scan-gram.l (YY_USER_INIT): Initialize scanner_cursor instead + of *loc. + (STEP): Remove. No longer needed, now that adjust_location does + the work. All uses removed. + (scanner_cursor): New var. + (adjust_location): Renamed from extend_location. It now sets + *loc and adjusts the scanner cursor. All uses changed. + Don't bother testing for CR. + (handle_syncline): Remove location arg; now updates scanner cursor. + All callers changed. + (unexpected_end_of_file): Now accepts start boundary of token or + comment, not location. All callers changed. Update scanner cursor, + not the location. + (SC_AFTER_IDENTIFIER): New state. + (context_state): Renamed from c_context. All uses changed. + (id_loc, code_start, token_start): New local vars. + (): New initial context. Move all + processing of Yacc white space and equivalents here. + ({id}): Save id_loc. Begin state SC_AFTER_IDENTIFIER + instead of returning ID immediately, since we need to search for + a subsequent colon. + ("'", "\""): Save token_start. + ("%{", "{", "%%"): Save code_start. + (): New state, looking for a colon. + (, , ): + BEGIN context_state at end, not INITIAL. + ("\"", "'", + "}", "%}", <>): + Return correct token start. + (): Save start boundary when + the start of a character, string or multiline comment is found. + * tests/conflicts.at (S/R in initial, Defaulted Conflicted + Reduction): Adjust reported locations to match the more-precise + results now expected. + * tests/input.at (Invalid $n, Invalid @n, Type Clashes): Likewise. + * tests/reduce.at (Useless Rules, Reduced Automaton, + Underivable Rules): Likewise. + * tests/regression.at (Invalid inputs): No longer `expecting ";" + or "|"' now that so many other tokens are allowed by the new grammar. + + * src/complain.h (current_file): Remove duplicate decl; + current_file is now owned by files.h. + * src/complain.c, src/scan-gram.l: Include files.h. + +2002-12-06 Paul Eggert + + * data/glr.c (yy_reduce_print): Don't assume that yyrline[yyrule] + promotes to int; it might be unsigned int. + * data/yacc.c (yy_reduce_print): Likewise. + + * doc/bison.texinfo (Table of Symbols): YYERROR_VERBOSE should + be #defined in the prologue, not in the Bison declarations. + This fixes Debian Bug 102878, reported by Shaul Karl. + +2002-12-02 Paul Eggert + + * configure.ac (AC_REPLACE_FUNCS): Add strtoul. + * lib/strtoul.c: New file, from gnulib. + This fixes a porting bug reported by Peter Klein in + . + +2002-11-30 Paul Eggert + + * src/scan-gram.l (no_cr_read, extend_location): Move to epilogue, + and put only a forward declaration in the prologue. This is for + consistency with the other scanner helper functions. + + Type clashes now generate warnings, not errors, since it + appears that POSIX may allow some grammars with type clashes. + * src/reader.c (grammar_current_rule_check): Warn about + type clashes instead of complaining. + * tests/input.at (Type Clashes): Expect warnings, not complaints. + + Add Yacc library, since POSIX requires it. + * doc/bison.texinfo (Yacc Library): New node. Regenerate top menu. + * lib/Makefile.am (lib_LIBRARIES, liby_a_SOURCES): New macros. + * lib/main.c, lib/yyerror.c: New files. + + gram_error can be static; it need not be extern. + * src/reader.h (gram_error): Remove decl. + * src/parse-gram.y (gram_error): Now static. Add static decl. + (print_token_value): Omit parameter names from forward decl, + for consistency. + +2002-11-29 Paul Eggert + + * doc/bison.texinfo: Emphasize that yylex and yyerror must + be declared before being used. E.g., one should typically + declare them in the prologue. Use GNU coding style in examples. + Put "const" consistently after the type it modifies. Mention + that C99 supports "inline". Mention that yyerror traditionally + returns "int". + + %parse-param and %lex-param now take just one argument, the + declaration; the argument name is deduced from the declaration. + + * doc/bison.texinfo (Parser Function, Pure Calling, Error + Reporting, Table of Symbols): Document this. + * src/parse-gram.y (add_param): New function. + (COMMA): Remove. + (declaration): Implement new rule for %parse-param and %lex-param. + * src/scan-gram.l: "," now elicits a warning, rather than being + a token; this is more compatible with byacc. + * tests/calc.at (Simple LALR Calculator): Adopt new convention. + +2002-11-27 Paul Eggert + + Rename identifiers to avoid real and potential collisions. + + * data/c.m4 (b4_yysymprint_generate): yyout -> yyoutput, + to avoid collision with lex macro described by Bruce Lilly in + . + * tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Likewise. + * doc/bison.texinfo (Prologue, Tracing): yyprint -> print_token_value. + * src/parse-gram.y (print_token_value): Renamed from yyprint. + All uses changed. + (YYPARSE_PARAM, YYLEX_PARAM, yycontrol): Remove. All uses changed. + The name "yycontrol" violates the name space rules, and this stuff + wasn't being used anyway. + (input): Remove action; this stuff wasn't being used. + (gram_error): Rename local variable yylloc -> loc. + * src/reader.h (struct gram_control_s, gram_control_t): Remove. + (YY_DECL): Don't use "yy" at start of local variables. + All uses changed, e.g., yylloc -> loc. + * src/scan-gram.l (STEP): Renamed from YY_STEP. All uses changed. + (STRING_GROW): Renamed from YY_OBS_GROW. All uses changed. + (STRING_FINISH): Renamed from YY_OBS_FINISH. All uses changed. + (STRING_FREE): Renamed from YY_OBS_FREE. All uses changed. + + * src/parse-gram.y (gram_error): loc is now const *. + * src/reader.h (gram_error): Likewise. + +2002-11-24 Paul Eggert + + Version 1.75c. + + * tests/actions.at (Actions after errors): Use an output format + more similar to that of the Printers and Destructors test. + Test the position of the ';' token too. + (Printers and Destructors): Likewise. + (Printers and Destructors: %glr-parser): Remove for now, to avoid + unnecessarily alarming people when the test fails. + + * data/yacc.c (yyerrlab1): Move this label down, so that the + parser does not discard the lookahead token if the user code + invokes YYERROR. This change is required for POSIX conformance. + + * lib/error.c: Sync with gnulib. + +2002-11-22 Paul Eggert + + * lib/quotearg.c, lib/quotearg.h: Sync with gnulib. + * lib/mbswidth.c, lib/mbswidth.h: Likewise. + * lib/xmalloc.c: Likewise. + +2002-11-20 Paul Eggert + + * lib/argmatch.c, lib/argmatch.h: Sync with gnulib. + +2002-11-20 Paul Eggert + + Avoid use of , as the GNU Coding Standards hint that one + should use `if (! x) abort ();' rather than `assert (x);', and + anyway it's one less thing to worry about configuring. + + * data/glr.c, lib/hash.c, src/system.h: Do not include . + * tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Likewise, + and replace all instances of assert with abort. + * tests/calc.at (_AT_DATA_CALC_Y): Likewise. + * tests/cxx-type.at (_AT_TEST_GLR_CXXTYPES): Likewise. + + * data/glr.c (yydoAction, yyglrReduce, yysplitStack, yyresolveStates, + yyresolveAction, yyprocessOneStack): Use abort rather than assert. + * lib/hash.c (hash_lookup, hash_get_first, hash_get_next, + hash_find_entry, hash_rehash, hash_insert): Likewise. + * src/conflicts.c (resolve_sr_conflict): Likewise. + * src/lalr.c (set_goto_map, map_goto): Likewise. + * src/nullable.c (nullable_compute): Likewise. + * src/output.c (prepare_rules, token_definitions_output): Likewise. + * src/reader.c (packgram, reader): Likewise. + * src/state.c (state_new, state_free, state_transitions_set, + state_reduction_find): Likewise. + * src/symtab.c (symbol_user_token_number_set, symbol_make_alias, + symbol_pack): Likewise. + * src/tables.c (conflict_row, pack_vector): Likewise. + * src/vcg.c (get_color_str, get_textmode_str, get_shape_str, + get_layoutalgorithm_str, get_decision_str, get_orientation_str, + get_node_alignement_str, get_arrow_mode_str, get_crossing_type_str, + get_view_str, get_linestyle_str, get_arrowstyle_str): Likewise. + + * lib/argmatch.h (ARRAY_CARDINALITY): Do not bother to #undef. + (ARGMATCH_CONSTRAINT): New macro. + (ARGMATCH_ASSERT): Use it. + + * src/system.h (verify): New macro. + * src/getargs.c (trace_argmatch, report_argmatch): Use verify + rather than assert. + * src/tables.c (tables_generate): Likewise. + + * src/struniq.c (struniq_assert): Now returns void, and aborts + if the assertion is false. + (struniq_assert_p): Remove. + * src/struniq.h: Likewise. + +2002-11-18 Paul Eggert + + * data/glr.c (yygetLRActions): Replace `yyindex' with + `yytable[yyindex]' to fix typo introduced in my 2002-11-09 patch. + This fixes the regression with Sun ONE Studio 7 cc that I reported in + . + +2002-11-18 Akim Demaille + + * doc/bison.texinfo (Tracing): `yyprint' shouldn't prepend a + space. + From Tim Van Holder. + +2002-11-17 Paul Eggert + + Pacify Sun ONE Studio 7 lint. Also, rename "ParseError" + to "SyntaxError" for consistency with my 2002-11-15 change. + + * data/glr.c (YYDPRINTF, YYDSYMPRINT, YYDSYMPRINTF) [!YYDEBUG]: Do + not define to {}, since this breaks the common use of `YYDPRINTF + ((...));' if a single statement is desired (e.g. before `else'). + Work around GCC warnings by surrounding corresponding calls with + {} if needed. + (yyhasResolvedValue): Remove unused function. + (yymergeOptionSets, yyresolvStack): Use `continue;' for empty + loop body. + (yyreportSyntaxError): Renamed from yyreportParseError. + (yyrecoverSyntaxError): Renamed from yyrecoverParseError. + All uses changed. + * tests/calc.at (_AT_DATA_CALC_Y): Make vars static instead of + extern when possible. Remove unused initializations. + +2002-11-16 Akim Demaille + + Augment the similarity between GLR and LALR traces. + + * data/yacc.c (yy_stack_print, YY_STACK_PRINT, yy_reduce_print) + (YY_REDUCE_PRINT): New. + (yyparse): Use them. + * data/glr.c (yy_reduce_print): Use YYFPRINTF, no need for + YYDPRINT here. + (yyglrReduce, yyrecoverParseError, yyparse): Don't report the + state reached after the reduction/recovery, since... + (yyparse, yyprocessOneStack): Report the state we are entering in. + +2002-11-16 Akim Demaille + + * src/getargs.h, src/getargs.c (trace_e, trace_args, trace_types): + Add support for --trace=skeleton. + * src/scan-skel.l: %option debug. + Scan strings of non-@ or \n instead of character by character. + (scan_skel): Handle trace_skeleton. + (QPUTS): New. + (@output_parser_name@, @output_header_name@): ``Restore'' their + support (used to be M4 macros). + * data/yacc.c: Quote larger chunks, a la glr.c. + * data/lalr1.cc: Likewise. + The header guards are no longer available, so use some other + string than `YYLSP_NEEDED'. + +2002-11-16 Akim Demaille + + Make the ``Printers and Destructors'' test more verbose, taking + `yacc.c''s behavior as (possibly wrong) reference. + + * tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Use printf + instead of fprint on stdout. + Set and report the last_line of the symbols. + Consistently display values and locations. + +2002-11-16 Paul Eggert + + * data/yacc.c: Avoid over-quoting of __line__ and __file__. + +2002-11-15 Paul Eggert + + * tests/actions.at (Actions after errors): New test case. + + * data/glr.c, data/lalr1.cc, data/yacc.cc, doc/bison.texinfo, + src/conflicts.c, src/parse-gram.y, src/tables.c, src/tables.h, + tests/action.at, tests/calc.at, tests/conflicts.at, + tests/cxx-type.at, tests/regression.at: + "parse error" -> "syntax error" for POSIX compatibility. + "parsing stack overflow..." -> "parser stack overflow" so + that code matches Bison documentation. + +2002-11-15 Akim Demaille + + * src/parse-gram.y (declaration): Have %parse-param and %lex-param + take two BRACED_CODE, not two string_content. + Free the scanner's obstack when we are done. + (code_content): New. + * tests/calc.at: Adjust. + * doc/bison.texinfo: Adjust. + Also, make sure to include the `,' for these declarations. + +2002-11-15 Tim Van Holder + + * m4/prereq.m4: Removed the commented jm_PREREQ_HASH + definition; avoids potential autoreconf problems. + +2002-11-15 Akim Demaille + + Always check the value returned by yyparse. + + * tests/calc.at (_AT_DATA_CALC_Y): Have `main' exit with the value + returned by yyparse. + (_AT_CHECK_CALC_ERROR): Take the expected exit value as argument. + Adjust calls. + * tests/glr-regr1.at (glr-regr1.y): Have `main' exit with the value + returned by yyparse. + +2002-11-14 Paul Hilfinger + + * data/glr.c (yyFail): Always set yyerrflag. Corrects regression + on input.at test. + +2002-11-14 Paul Eggert + + * src/output.c (output_skeleton): Call xfopen instead of + duplicating xfopen's body. + + Fix bugs reported by Nelson H. F. Beebe in + . + + * tests/headers.at (AT_TEST_CPP_GUARD_H): Don't assume that + "$CC -E foo.h" is allowed, as this doesn't work with the Portland + Group compiler. Instead, use "$CC -E bar.c". Include the .h + file twice in the grammar, as an extra check. + + * tests/input.at (Torturing the Scanner): Surround the + backslash-newline tests with "#if 0", to make it less likely that + we'll run into compiler bugs. Bring back solitary \ inside + comment, but add a closing comment to work around HP C bug. Don't + test backslash-newline in C character constant. + +2002-11-14 Akim Demaille + + * tests/synclines.at (AT_SYNCLINES_COMPILE): Ignore the exit + status of the compiler. + Calling `exit 1' is no longer needed. + Reported by Nelson H. F. Beebe. + +2002-11-14 Akim Demaille + + * tests/atlocal.in (CPPFLAGS): We have config.h. + * tests/testsuite.at (AT_DATA_GRAMMAR_PROLOGUE, AT_DATA_GRAMMAR): + New. + * tests/actions.at, tests/calc.at, tests/conflicts.at, + * tests/cxx-type.at, tests/glr-regr1.at, tests/headers.at, + * tests/regression.at, tests/torture.at: Use them for all the + grammars that are to be compiled. + * tests/cxx-type.at (_AT_TEST_GLR_CALC): Rename as... + * tests/cxx-type.at (_AT_TEST_GLR_CXXTYPES): this. + * doc/bison.texinfo (GLR Parsers): Document `inline'. + +2002-11-14 Akim Demaille + + * doc/bison.texinfo: Various formatting changes (alignments in + samples, additional @group/@end group, GCS in samples. + Use @deffn instead of simple @table to define the directives, + macros, variables etc. + +2002-11-13 Paul Eggert + + Fix some bugs reported by Albert Chin-A-Young in + . + + * tests/input.at (Torturing the Scanner): Don't invoke "cc a.c b.c + -o c"; the HP C compiler chatters during compilation. + Instead, invoke "cc -c a.c -o a.o; cc -c b.c -o b.o; cc a.o b.o -o c". + * tests/headers.at (export YYLTYPE): Likewise. + + * tests/input.at (Torturing the Scanner): Remove lines containing + solitary backslashes, as they tickle a bug in the HP C compiler. + + * tests/glr-regr1.at (Badly Collapsed GLR States): Avoid // + comments, since they're not portable. Use GNU coding style. + +2002-11-13 Akim Demaille + + * data/yacc.c: Leave bigger chunks of quoted text. + (YYDSYMPRINTF): New. + Use it to report symbol activities. + * data/glr.c (YYDSYMPRINTF): New. + Use it. + +2002-11-12 Paul Eggert + + Version 1.75b. + + * data/glr.c (yydoAction): Return YYRESULTTAG, not int. + (yyglrReduce): Return yyok, not 0. + This should avoid the enumerated-type warnings reported + by Nelson H. F. Beebe in + . + + * lib/bbitset.h (BITSET_INLINE): Remove. + * lib/bitset.h [! BITSET_INLINE]: Remove. + (bitset_set, bitset_reset, bitset_test): Rename local vars + to avoid shadowing warnings by GCC. + + * data/glr.c (inline): Remove #define. It's the user's + responsibility to #define it away, just like 'const'. + This fixes one of the bugs reported by Nelson H. F. Beebe in + . + + * Makefile.maint (po-check): Scan .l and .y files instead of the + .c and the .h files that they generate. This fixes the bug + reported by Tim Van Holder in: + + Look for N_ as well as for _. Try to avoid matching #define for + N_ and _. + * po/POTFILES.in: Remove src/parse-gram.c, src/scan-gram.c, + src/system.h. Add src/parse-gram.y, src/scan-gram.l. + * src/scan-gram.l: Revamp regular expressions so that " and ' + do not confuse xgettext. + + * src/struniq.h (struniq_new): Do not declare the return type + to be 'const'; this violates the C standard. + * src/struniq.c (struniq_new): Likewise. + +2002-11-12 Albert Chin-A-Young + + * src/Makefile.am (LDADD): Link $(LIBINTL) last to avoid the + duplicate definition of optind on Tru64 UNIX 4.0D with the Compaq + linker. + +2002-11-12 Akim Demaille + + * Makefile.maint: Sync with Autoconf: + (local_updates): New. + +2002-11-12 Akim Demaille + + * po/POTFILES.in (src/lalr.c, src/state.c): Remove + +2002-11-12 Akim Demaille + + * tests/actions.at (_AT_CHECK_PRINTER_AND_DESTRUCTOR): Display the + locations. + +2002-11-12 Akim Demaille + + * data/c.m4 (b4_yysymprint_generate): Pass *yyvaluep to YYPRINT, + not yyvalue. + +2002-11-12 Akim Demaille + + * tests/actions.at (AT_CHECK_PRINTER_AND_DESTRUCTOR): New. + Use it to test the GLR parser. + +2002-11-12 Akim Demaille + + * tests/regression.at (input.y): s/YYEOF/MYEOF/, as the skeleton + defines it. + * data/glr.c (yystos): New. + (b4_yysymprint_generate, b4_yydestruct_generate): Invoke. + (YYDSYMPRINT): New. + (yyval): Don't define it, it is handled via M4. + (yyrecoverParseError): Free verbosely the discarded symbols. + * data/yacc.c (yysymprint): Remove, rather... + (b4_yysymprint_generate): invoke. + * data/c.m4 (b4_yysymprint_generate): New. + Accept pointers as arguments, as opposed to the version from + yacc.c. + (b4_yydestruct_generate): Likewise. + * tests/cations.at (Printers and Destructors): Use Bison directives + instead of CPP macros. + Don't rely on internal details. + +2002-11-12 Akim Demaille + + * data/c.m4 (b4_yydestruct_generate, b4_symbol_actions): New. + * data/yacc.c: Rename yychar1 as yytoken, as in glr.c. + Don't work on yychar (i.e., do set it to YYEMPTY, don't match + it against YYEMPTY and so forth), work on yytoken (i.e., set + it to YYEMPTY etc.). + (yydestruct): Replace with a b4_yydestruct_generate invocation. + (b4_symbol_actions): Remove. + * data/glr.c (YYTRANSLATE): As for yacc.c, if negative, it stands + for 0, end-of-input. + +2002-11-12 Akim Demaille + + * doc/bison.texinfo (Destructor Decl): New. + +2002-11-12 Akim Demaille + + * src/tables.c (tables_generate): Use free for pointers that + cannot be NULL, not XFREE. + (pack_vector): Use assert, not fatal, for bound violations. + * src/state.c (state_new): Likewise. + * src/reader.c (reader): Likewise. + * src/lalr.c (set_goto_map): Likewise. + * src/location.h (LOCATION_PRINT): If first_line is 0, just issue + the file name. + +2002-11-12 Akim Demaille + + * src/scan-gram.l, src/reader.h (scanner_last_string_free): + Restore. + * src/scan-gram.l (last_string): Is global to the file, not to + yylex. + * src/parse-gram.y (input): Don't append the epilogue here, + (epilogue.opt): do it here, and free the scanner's obstack. + * src/reader.c (epilogue_set): Rename as... + (epilogue_augment): this. + * data/c.m4 (b4_epilogue): Defaults to empty. + +2002-11-12 Akim Demaille + + * src/getargs.c (long_options): Remove duplicates. + * src/vmsgetargs.c, src/build.com, src/bison.cld, src/vmshlp.mar: + Remove. + * doc/bison.rnh: Remove. + * doc/bison.texinfo (VMS Invocation): Remove. + +2002-11-12 Akim Demaille + + * src/struniq.h, src/struniq.c (struniq_t): Is const. + (STRUNIQ_EQ, struniq_assert, struniq_assert_p): New. + + Use struniq for symbols. + + * src/symtab.h (symbol_t): The tag member is a struniq. + (symbol_type_set): Adjust. + * src/symtab.c (symbol_new): Takes a struniq. + (symbol_free): Don't free the tag member. + (hash_compare_symbol_t, hash_symbol_t): Rename as... + (hash_compare_symbol, hash_symbol): these. + Use the fact that tags as struniqs. + (symbol_get): Use struniq_new. + * src/symlist.h, src/symlist.c (symbol_list_n_type_name_get): + Returns a strniq. + * src/reader.h (merger_list, grammar_currentmerge_set): The name + and type members are struniqs. + * src/reader.c (get_merge_function) + (grammar_current_rule_merge_set): Adjust. + (TYPE, current_type): Are struniq. + + Use struniq for file names. + + * src/files.h, src/files.c (infile): Split into... + (grammar_file, current_file): these. + * src/scan-gram.c (YY_USER_INIT, handle_syncline): Adjust. + * src/reduce.c (reduce_print): Likewise. + * src/getargs.c (getargs): Likewise. + * src/complain.h, src/complain.c: Likewise. + * src/main.c (main): Call struniqs_new early enough to use it for + file names. + Don't free the input file name. + +2002-11-12 Akim Demaille + + * src/symtab.c (symbol_free): Remove dead deactivated code: + type_name are properly removed. + Don't use XFREE to free items that cannot be NULL. + * src/struniq.h, src/struniq.c: New. + * src/main.c (main): Initialize/free struniqs. + * src/parse-gram.y (%union): Add astruniq member. + (yyprint): Adjust. + * src/scan-gram.l (<{tag}>): Return a struniq. + Free the obstack bit that used to store it. + * src/symtab.h (symbol_t): The 'type_name' member is a struniq. + +2002-11-11 Paul Eggert + + Revamp to fix many (but not all) of the C- and M4-related quoting + problems. Among other things, this fixes the Bison bug reported + by Jan Hubicka when processing the Bash grammar; see: + + + Use new @ escapes consistently. Represent brackets with @{ and @} + rather than @<:@ and @:>@, since this works a bit better with dumb + editors like vi. Represent @ with @@, since @ is now consistently + an escape. Use @oline@ and @ofile@ rather than __oline__ and + __ofile__, to avoid unexpected expansions. Similarly, use @output + rather than #output. + + * data/c.m4 (b4_copyright): Omit file name from comment, since + the file name could contain "*/". + (b4_synclines_flag): Don't quote the 2nd argument; it should already + be quoted. All uses changed. + + * data/glr.c: Use new @ escapes consistently. + (b4_input_suffix, b4_output_parser_suffix, b4_output_parser_name, + b4_output_header_suffix, b4_output_header_name, b4_header_guard): + Remove, since they couldn't handle arbitrary characters in file + names. + * data/lalr1.cc: Likewise. + * data/yacc.c: Likewise. + + * src/files.c (output_infix): Remove; all uses removed. + * src/files.h: Likewise. + + * data/glr.c: Remove use of "#ifdef b4_header_guard", since it + mishandled funny characters in file names, and anyway it isn't + needed any more. + * data/yacc.c: Likewise. + * data/lalr1.cc: Use YYSLP_NEEDED instead of b4_header_guard. + + * data/glr.c (YYSTYPE_IS_TRIVIAL): Define when the .h file would. + * data/yacc.c: Likewise. + + * src/muscle_tab.c: Include quotearg.h, since we need to quote C + strings now. + (muscle_init): Quote filename as a C string. + * src/muscle_tab.h (MUSCLE_GROW_STRING_PAIR): Remove; unused. + (MUSCLE_OBSTACK_SGROW, MUSCLE_INSERT_C_STRING): New macros. + * src/output.c (escaped_file_name_output): New function. + (prepare_symbols): Quote tokens for M4. + (prepare): Don't insert output_infix, output_prefix, + output_parser_name, output_header_name; this is now down by scan-skel. + Insert skeleton as a C string. + + * src/output.c (user_actions_output, symbol_destructors_output, + symbol_printers_output): Quote filenames for C and M4. + * src/reader.c (prologue_augment, epilogue_set): Likewise. + + * src/scan-gram.l (): Don't worry about any backslash + escapes other than \\ and \'; this simplifies the code. + (): Likewise, for \\ and \". + (): Escape $ and @, too. + Use new escapes @{ and @} for [ and ]. + + * src/scan-skel.l (yylineno, yyoutname): Remove static vars, replacing + them with auto vars. + Switch to new escape scheme, where @ is the escape character uniformly. + Abort if a stray escape character is found. Avoid unbounded input + buffer when parsing non-escaped text. + + * tests/input.at (Torturing the Scanner): Add tests that @oline@, + __oline__, #output, $@, and @{ do not have unintended meanings. + +2002-11-09 Paul Eggert + + Fix the test failure due to GCC warnings described in + . + * data/glr.c (yyis_pact_ninf, yyis_table_ninf): New macros, which + evaluate to 0 if it's impossible for NINF to be in the respective + table. + (yygetLRActions, yyrecoverParseError): Use them. + + * src/scan-gram.l (unexpected_end_of_file): Fix bug: columns were + counted in the token inserted at end of file. Now takes + location_t *, not location_t, so that the location can be + adjusted. All uses changed. + + * tests/regression.at (Invalid inputs): Adjust wording in + diagnostic to match the new behavior. + + * tests/torture.at (AT_DATA_TRIANGULAR_GRAMMAR, + AT_DATA_HORIZONTAL_GRAMMAR, AT_DATA_LOOKAHEADS_GRAMMAR, + AT_DATA_STACK_TORTURE): Replace `assert (x);' with `if (! (x)) + abort ();'. This reduces the runtime of the "Many lookaheads" + test from 27.6 to 2.7 minutes on a 440 MHz Ultrasparc III running + GCC 3.2. + +2002-11-07 Paul Eggert + + * src/parse-gram.y (CHARACTER): Remove unused token. + All uses removed. + + * src/scan-gram.l: Remove stack option. We no longer use the + stack, since the stack was never deeper than 1; instead, use the + new auto var c_context to record the stacked value. + + Remove nounput option. At an unexpected end of file, we now unput + the minimal input necessary to end cleanly; this simplifies the + code. + + Avoid unbounded token sizes where this is easy. + + (unexpected_end_of_file): New function. + Use it to systematize the error message on unexpected EOF. + (last-string): Now auto, not static. + (YY_OBS_FREE): Remove unnecessary do while (0) wrapper. + (scanner_last_string_free): Remove; not used. + (percent_percent_count): Move decl to just before use. + (SC_ESCAPED_CHARACTER): Return ID at unexpected end of file, + not the (never otherwised-used) CHARACTER. + +2002-11-07 Akim Demaille + + Let yyerror always receive the msg as last argument, so that + yyerror can be variadic. + + * data/yacc.c (b4_yyerror_args): New. + Use it when calling yyerror. + * data/glr.c (b4_yyerror_args, b4_lyyerror_args): New. + Use it when calling yyerror. + * doc/bison.texinfo (Error Reporting): Adjust. + * tests/calc.at (_AT_DATA_CALC_Y): Adjust. + * tests/cxx-type.at (_AT_TEST_GLR_CALC): Adjust. + +2002-11-06 Akim Demaille + + #line should have quoted strings. + Ideally, this should be done by m4_quotearg. + + * src/scan-skel.l: Include quotearg.h. + Quote __ofile__. + * src/output.c (symbol_printers_output) + (symbol_destructors_output): Quote the file name. + +2002-11-06 Akim Demaille + + * tests/regression.at (Invalid inputs): Adjust to the recent + messages. + +2002-11-06 Akim Demaille + + Restore --no-lines. + Reported by Jim Kent. + + * data/c.m4 (b4_syncline): New. + * data/glr.c, data/yacc.c, data/lalr1.cc: Use it. + * src/reader.c (prologue_augment, epilogue_set): Use b4_syncline. + * src/output.c (user_actions_output): Likewise. + (prepare): Define 'b4_synclines_flag'. + * src/muscle_tab.c (muscle_init): Don't define b4_linef. + +2002-11-06 Akim Demaille + + * src/main.c (main): Free `infile'. + * src/scan-gram.l (handle_syncline): New. + Recognize `#line'. + * src/output.c (user_actions_output, symbol_destructors_output) + (symbol_printers_output): Use the location's file name, not + infile. + * src/reader.c (prologue_augment, epilogue_set): Likewise. + +2002-11-05 Paul Hilfinger + + * src/tables.c (matching_state): Don't allow states to match if + either has GLR conflict entries. + +2002-11-05 Paul Eggert + + * src/scan-gram.l: Use more accurate diagnostics, e.g. + "integer out of range" rather than "invalid value". + * tests/input.at (Invalid $n, Invalid @n): Change expected wording + accordingly. + + Scan <% and %> digraphs in C code as POSIX 1003.1-2001 requires. + Also, remove one static variable in the scanner. + + * src/scan-gram.l (braces_level): Now auto, not static. + Initialize to zero if the compiler is being picky. + (INITIAL): Clear braces_level instead of incrementing it. + (SC_BRACED_CODE): Treat <% and %> as { and } when inside C code, + as POSIX 1003.1-2001 requires. + * src/system.h (IF_LINT): New macro, taken from coreutils. + * configure.ac: Define "lint" if --enable-gcc-warnings. + +2002-11-05 Akim Demaille + + * src/scan-gram.l: When it starts with `%', complain about the + whole directive, not just that `invalid character: %'. + +2002-11-04 Akim Demaille + + * Makefile.maint: Update from Autoconf. + (update, cvs-update, po-update, do-po-update): New. + +2002-11-04 Akim Demaille + + * tests/glr-regr1.at (Badly Collapsed GLR States): Prototype yylex + and yyerror. + Have yyerror `use' its arguments. + * tests/calc.at (AT_CHECK_PUSHDEFS): AT_YYERROR_SEES_LOC_IF + returns true when location & yacc & pure & parse-param. + (_AT_DATA_CALC_Y): Let yyerror ``use'' its arguments. + +2002-11-04 Akim Demaille + + * src/location.h (LOCATION_PRINT): Use quotearg slot 3 to avoid + clashes. + * src/scan-gram.l: Use [\'] instead of ['] to pacify + font-lock-mode. + Use complain_at. + Use quote, not quote_n since LOCATION_PRINT no longer uses the + slot 0. + +2002-11-03 Paul Eggert + + * src/reader.c (get_merge_function, grammar_current_rule_check): + Use consistent diagnostics for reporting type name clashes. + Quote the types with <>, for consistency with Yacc. + * tests/input.at (Type Clashes): Adjust to diagnostic changes. + +2002-11-03 Akim Demaille + + * data/c.m4 (b4_identification, b4_user_args, b4_parse_param): + New. + * data/yacc.m4 (b4_pure_args, b4_Pure_args): New. + (b4_parse_param): Remove. + Use b4_identification. + Propagate b4_pure_args where needed to pass them to yyerror. + * data/glr.m4 (b4_parse_param): Remove. + (b4_user_formals, b4_pure_args, b4_pure_formals, b4_lpure_args) + (b4_lpure_formals): New. + Use b4_identification. + (YY_USER_FORMALS, YY_USER_ARGS): Remove, replaced by + b4_user_formals and b4_user_args. + (yyexpandGLRStack, yyFail, yyaddDeferredAction, yyglrShiftDefer) + (yyreportAmbiguity): When using a pure parser, also need + the location, and the parse-params. + Adjust callers. + (yyuserAction, yyglrShift, yyreportParseError, yyrecoverParseError): + When using a pure parser, also need the parse-params. + Adjust callers. + * tests/calc.at: Test pure (%pure-parser) and absolutely pure + (%pure-parser + %parse-param) LALR and GLR parsers. + (AT_CHECK_PUSHDEFS, AT_CHECK_POPDEFS): New, define AT_PARAM_IF, + AT_LOCATION_IF, AT_PURE_IF, AT_GLR_IF, AAT_PURE_AND_LOC_IF, + AT_GLR_OR_PARAM_IF, AT_YYERROR_ARG_LOC_IF, AT_YYERROR_SEES_LOC_IF. + (_AT_DATA_CALC_Y): Equip for purity of yyerror. + (_AT_CHECK_CALC_ERROR): Use AT_YYERROR_SEES_LOC_IF. + * tests/cxx-type.at (_AT_TEST_GLR_CALC): Equip for yyerror purity. + * doc/bison.texinfo: Untabify the whole file. + (Parser Function): Document %parse-param, deprecate YYPARSE_PARAM. + (Pure Calling): Document %lex-param, deprecate YYLEX_PARAM. + (Error Reporting): Adjust to these new directives. + Document %error-verbose, deprecate YYERROR_VERBOSE. + +2002-11-03 Akim Demaille + + * tests/calc.at: Change all the AT_CHECK_CALC_LALR and + AT_CHECK_CALC_GLR invocations to use % directives, instead of + command line options. + * tests/cxx-type.at: Formatting changes. + +2002-11-03 Paul Eggert + + * src/scan-gram.l: Revamp to fix POSIX incompatibilities, + to count columns correctly, and to check for invalid inputs. + + Use mbsnwidth to count columns correctly. Account for tabs, too. + Include mbswidth.h. + (YY_USER_ACTION): Invoke extend_location rather than LOCATION_COLUMNS. + (extend_location): New function. + (YY_LINES): Remove. + + Handle CRLF in C code rather than in Lex code. + (YY_INPUT): New macro. + (no_cr_read): New function. + + Scan UCNs, even though we don't fully handle them yet. + (convert_ucn_to_byte): New function. + + Handle backslash-newline correctly in C code. + (SC_LINE_COMMENT, SC_YACC_COMMENT): New states. + (eols, blanks): Remove. YY_USER_ACTION now counts newlines etc.; + all uses changed. + (tag, splice): New EREs. Do not allow NUL or newline in tags. + Use {splice} wherever C allows backslash-newline. + YY_STEP after space, newline, vertical-tab. + ("/*"): BEGIN SC_YACC_COMMENT, not yy_push_state (SC_COMMENT). + + (letter, id): Don't assume ASCII; e.g., spell out a-z. + + ({int}, handle_action_dollar, handle_action_at): Check for integer + overflow. + + (YY_STEP): Omit trailing semicolon, so that it's more like C. + + (): Allow \0 and \00 + as well as \000. Check for UCHAR_MAX, not 255. + Allow \x with an arbitrary positive number of digits, as in C. + Check for overflow here. + Allow \? and UCNs, for compatibility with C. + + (handle_symbol_code_dollar): Use quote_n slot 1 to avoid collision + with quote slot used by complain_at. + + * tests/input.at: Add tests for backslash-newline, m4 quotes + in symbols, long literals, and funny escapes in strings. + + * configure.ac (jm_PREREQ_MBSWIDTH): Add. + * lib/Makefile.am (libbison_a_SOURCES): Add mbswidth.h, mbswidth.c. + * lib/mbswidth.h, lib/mbswidth.c: New files, from GNU gettext. + * m4/Makefile.am (EXTRA_DIST): Add mbswidth.m4. + * m4/mbswidth.m4: New file, from GNU coreutils. + + * doc/bison.texinfo (Grammar Outline): Document // comments. + (Symbols): Document that trigraphs have no special meaning in Bison, + nor is backslash-newline allowed. + (Actions): Document that trigraphs have no special meaning. + + * src/location.h (LOCATION_COLUMNS, LOCATION_LINES): Remove; + no longer used. + +2002-11-02 Paul Eggert + + * src/reader.c: Don't include quote.h; not needed. + (get_merge_function): Reword warning to be consistent with + type clash diagnostic in grammar_current_rule_check. + + * lib/quotearg.c (quotearg_buffer_restyled): Fix off-by-two + bug in trigraph handling. + + * src/output.c (prepare_symbols): When printing token names, + escape "[" as "@<:@" and likewise for "]". + + * src/system.h (errno): Remove declaration, as we are now + assuming C89 or better, and C89 guarantees errno. + +2002-10-30 Paul Eggert + + * lib/bitset_stats.c (bitset_stats_read, bitset_stats_write): + Check for close failures. + * src/files.h (xfclose): Return void, not int, since it always + returned zero. + * src/files.c (xfclose): Likewise. Report I/O error if ferror + indicates one. + * src/output.c (output_skeleton): Use xfclose rather than fclose + and ferror. xfclose now checks ferror. + + * data/glr.c (YYLEFTMOST_STATE): Remove. + (yyreportTree): Use a stack-based leftmost state. This avoids + our continuing battles with bogus warnings about initializers. + +2002-10-30 Akim Demaille + + * src/system.h: Don't use #ifdef/#ifndef on HAVE_ values, only + #if. + +2002-10-29 Paul Hilfinger + + * tests/glr-regr1.at: New test for reported regressions. + * tests/testsuite.at: Add glr-regr1.at test. + * tests/Makefile.am: Add glr-regr1.at test. + +2002-10-24 Paul Eggert + + Version 1.75a. + + * tests/calc.at (_AT_DATA_CALC_Y): Remove unused strcat declaration. + * tests/cxx-type.at (_AT_TEST_GLR_CALC): Include stdlib.h, since + we use malloc. Don't assume 'A' through 'Z' are contiguous. + Don't assume strdup exists; POSIX says its an XSI extension. + Check for buffer overflow on input. + +2002-10-24 Akim Demaille + + * src/output.c (output_skeleton): Don't disable M4sugar comments + too soon: it results in comments being expanded. + * data/yacc.c, data/glr.c, data/lalr1.cc: Do it right before the + first output. + +2002-10-24 Akim Demaille + + * data/yacc.c (m4_int_type): New. + * data/c.m4 (m4_int_type): Don't use yysigned_char, but `signed + char' as only yacc.c wants K&R portability. + * data/glr.c (yysigned_char): Remove. + * data/lalr1.cc: Rename the trailing b4_name as b4_parser_class_name. + Reported by Quoc Peyrot. + +2002-10-23 Paul Eggert + + * src/main.c (main): With --trace=time, report times even if a + non-fatal error occurs. Formerly, the times were reported in some + such cases but not in others. + * src/reader.c (reader): Just return if a complaint has been issued, + instead of exiting, so that 'main' can report times. + +2002-10-22 Akim Demaille + + * src/system.h: Include sys/types. + Reported by Bert Deknuydt. + +2002-10-23 Paul Eggert + + * configure.ac (AC_PROG_LEX): Use instead of AM_PROG_LEX. + Suggested by Art Haas. + +2002-10-22 Paul Eggert + + * src/complain.c (exit) [! (STDC_HEADERS || _LIBC)]: Remove exit + decl; not needed any more. + * src/main.c (main): Use return to exit, undoing yesterday's change. + The last OS that we could find where this wouldn't work is + SunOS 3.5, and that's too old to worry about now. + + * data/glr.c (struct yyltype): Define members even when not + doing locations. This is more consistent with yacc.c, and it + works around the following bug reports: + http://mail.gnu.org/archive/html/bug-bison/2002-10/msg00106.html + http://mail.gnu.org/archive/html/bug-bison/2002-10/msg00111.html + + * doc/bison.texinfo: Minor spelling and typographical fixes. Use + @acronym consistently. Standardize on "Yacc" instead of "YACC", + "Algol" instead of "ALGOL". Give a bit more history about BNF. + +2002-10-22 Akim Demaille + + * data/README: New. + +2002-10-21 Paul Eggert + + Be consistent about 'bool'; the old code used an enum in one + module and an int in another, and this violates the C standard. + * m4/stdbool.m4: New file, from coreutils 4.5.3. + * configure.ac (AC_HEADER_STDBOOL): Add. + * m4/Makefile.am (EXTRA_DIST): Add stdbool.m4. + * src/muscle_tab.c (hash_compare_muscles): (a ? FALSE : TRUE) -> (! a) + * src/symtab.c (hash_compare_symbol_t): Likewise. + * src/system.h (bool, false, true): Use a definition consistent + with ../lib/hash.c. All uses changed. + + * src/complain.c (warning_issued): Renamed from warn_message_count, + so that we needn't worry about integer overflow (!). + Now of type bool. All uses changed. + (complaint_issued): Renamed from complain_message_count; likewise. + + * src/main.c (main): Use exit to exit with failure. + + * src/complain.c (fatal_at, fatal): Use EXIT_FAILURE and EXIT_SUCCESS + rather than 1 and 0. + * src/main.c (main): Likewise. + * src/getargs.c (getargs): Likewise. + * src/reader.c (reader): Likewise. + + * src/getarg.c (getargs): Remove duplicate code for + "Try `bison --help'". + + * src/files.c (xfopen, xfclose): Use EXIT_FAILURE rather than 2. + What was that "2" for? + + * src/complain.h (fatal, fatal_at): Add __attribute__((__noreturn__)). + * src/getargs.c (usage): Likewise. + + * src/getargs.c (getargs): When there are too few operands, report + the last one. When there are too many, report the first extra + one. This is how diffutils does it. + +2002-10-20 Paul Eggert + + Remove K&R vestiges. + * configure.ac (AC_C_CONST, AM_C_PROTOTYPES): Remove. + * src/complain.c (VA_START): Remove. Assume prototypes. + (vfprintf) [! (HAVE_VPRINTF || defined vfprintf)]: New macro. + (private_strerror, warn_at, warn, complain_at, complain, fatal_at, + fatal): Assume prototypes. + * src/complain.h: Assume prototypes. + * src/system.h (PARAMS): Remove. + Include unconditionally, since it's guaranteeed even + for a freestanding C89 compiler. + (SHRT_MIN, SHRT_MAX): Remove, since C89 guarantees them. + * src/vmsgetargs.c (getargs, cli_present, cli_get_value): Prototype. + +2002-10-20 Akim Demaille + + * src/muscle_tab.c (muscle_grow): Remove trailing debugging code. + * data/glr.c (YY_USER_FORMALS, YY_USER_ARGS): New. + (yyuserAction, yydoAction, yyglrReduce, yyresolveValue) + (yyresolveStates, yyresolveAction, yyresolveStack) + (yyprocessOneStack): Use them. + (yy_reduce_print): New. + * tests/calc.at (_AT_DATA_CALC_Y): Exercise %parse-param. + +2002-10-20 Akim Demaille + + * data/c.m4 (b4_c_ansi_args): Recognize functions with no + arguments and output `void'. + (b4_c_function): Rename as... + (b4_c_function_def): this. + (b4_c_function_decl, b4_c_ansi_function_def) + (b4_c_ansi_function_decl): New. + Change the interpretation of the arguments: before `int, foo', now + `int foo, foo'. + * data/yacc.c (yyparse): Prototype and define thanks to these. + Adjust b4_c_function_def uses. + * data/glr.c (yyparse): Likewise, but ANSI only. + +2002-10-20 Akim Demaille + + * src/output.c (prepare): Move the definition of `tokens_number', + `nterms_number', `undef_token_number', `user_token_number_max' + to... + (prepare_tokens): Here. + (prepare_tokens): Rename as... + (prepare_symbols): this. + (prepare): Move the definition of `rules_number' to... + (prepare_rules): here. + (prepare): Move the definition of `last', `final_state_number', + `states_number' to... + (prepare_states): here. + * data/yacc.c, data/lalr1.cc, data/glr.c: Normalize `>' into `<'. + +2002-10-20 Akim Demaille + + * src/tables.h, src/tables.c, src/output.c: Comment changes. + +2002-10-20 Akim Demaille + + * data/yacc.c, data/yacc.c (b4_location_if, b4_pure_if): Move to... + * data/c.m4: here. + +2002-10-20 Akim Demaille + + * src/output.c (prepare): Use MUSCLE_INSERT_STRING. + * src/muscle_tab.c (muscle_pair_list_grow): Rename `val as + `pair'. + (muscle_init): Move the `b4_ltype', `b4_maxdepth', `b4_initdepth', + `name' to... + * data/glr.c, data/lalr1.cc, data/yacc.c (b4_location_type) + (b4_stack_depth_init, b4_stack_depth_max, b4_parser_class_name): + These. + +2002-10-19 Paul Eggert + + Do not create a temporary file, as that involves security and + cleanup headaches. Instead, use a pair of pipes. + Derived from a suggestion by Florian Krohm. + * lib/subpipe.c, lib/subpipe.h, m4/subpipe.m4: New files. + * lib/mkstemp.c, lib/readpipe.c, lib/tempname.c, m4/mkstemp.m4: Remove. + * configure.ac (UTILS_FUNC_MKSTEMP, jm_PREREQ_TEMPNAME): Remove. + (BISON_PREREQ_SUBPIPE): Add. + * lib/Makefile.am (libbison_a_SOURCES): Remove readpipe.c. + Add subpipe.h, subpipe.c. + * m4/Makefile.am (EXTRA_DIST): Remove mkstemp.m4. Add subpipe.m4. + * po/POTFILES.in: Add lib/subpipe.c. + * src/output.c: Include "subpipe.h". + (m4_invoke): Remove decl. + (scan_skel): New decl. + (output_skeleton): Use pipe rather than temporary file for m4 input. + Check that m4sugar.m4 is readable, to avoid deadlock. + Check for pipe I/O error. + * src/scan-skel.l (readpipe): Remove decl. + (scan_skel): New function, to be used in place of m4_invoke. + Read from stream rather than file. + + * lib/timevar.c (TICKS_TO_MSEC, CLOCKS_TO_MSEC): Do not cast to + float, as this generates a warning on Solaris 8 + GCC 3.2 with + --enable-gcc-warnings. Instead, divide into 1.0 rather than 1; + this generates a more-accurate value anyway. + + * lib/timevar.c (timervar_accumulate): Rename locals to + avoid confusion with similarly-named more-global. + * src/muscle_tab.c (muscle_pair_list_grow): Likewise. + + * src/output.c (prepare): Use xstrdup to convert char const * + to char *, to avoid GCC warning. + +2002-10-19 Akim Demaille + + * tests/calc.at (_AT_DATA_CALC_Y): Define VAL, LOC, LEX_FORMALS, + LEX_PRE_FORMALS, LEX_ARGS, LEX_PRE_ARGS, USE_LEX_ARGS. + Use them to have `calc.y' ready for %pure-parser. + * data/yacc.c (YYLEX): Pass a yylex return type to + b4_c_function_call. + +2002-10-19 Akim Demaille + + Prototype support of %lex-param and %parse-param. + + * src/parse-gram.y: Add the definition of the %lex-param and + %parse-param tokens, plus their rules. + Drop the `_' version of %glr-parser. + Add the "," token. + * src/scan-gram.l (INITIAL): Scan them. + * src/muscle_tab.c: Comment changes. + (muscle_insert, muscle_find): Rename `pair' as `probe'. + * src/muscle_tab.h (MUSCLE_INSERT_PREFIX): Remove unused. + (muscle_entry_s): The `value' member is no longer const. + Adjust all dependencies. + * src/muscle_tab.c (muscle_init): Adjust: use + MUSCLE_INSERT_STRING. + Initialize the obstack earlier. + * src/muscle_tab.h, src/muscle_tab.c (muscle_grow) + (muscle_pair_list_grow): New. + * data/c.m4 (b4_c_function_call, b4_c_args): New. + * data/yacc.c (YYLEX): Use b4_c_function_call to honor %lex-param. + * tests/calc.at: Use %locations, not --locations. + (AT_CHECK_CALC_GLR): Use %glr-parser, not %glr_parser. + +2002-10-19 Akim Demaille + + * src/getargs.c (usage): Take status as argument and exit + accordingly. + Report the traditional `Try ... --help' message when status != 0. + (usage, version): Don't take a FILE * as arg, it is pointless. + (getargs): When there is an incorrect number of arguments, make it + an error, and report it GNUlically thanks to `usage ()'. + +2002-10-18 Paul Eggert + + * data/glr.c (yyreportParseError): Don't assume that sprintf + yields the length of the printed string, as this is not true + on SunOS 4.1.4. Reported by Peter Klein. + + * tests/calc.at (_AT_DATA_CALC_Y): #undef memcmp and realloc. + * tests/conflicts.at (%nonassoc and eof): Likewise. + Fixes SunOS 4.1.4 test failure reported by Peter Klein. + +2002-10-17 Akim Demaille + + * src/getargs.h (trace_e): Add trace_scan, and trace_parse. + * src/getargs.c (trace_types, trace_args): Adjust. + * src/reader.c (grammar_current_rule_prec_set) + (grammar_current_rule_dprec_set, grammar_current_rule_merge_set): + Standardize error messages. + And s/@prec/%prec/! + (reader): Use trace_flag to enable scanner/parser debugging, + instead of an adhoc scheme. + * src/scan-gram.l: Remove trailing debugging code. + +2002-10-16 Paul Eggert + + * src/muscle_tab.h (MUSCLE_TAB_H_): Was misspelled as + MUSCLE_TAB_H. + + * NEWS: Officially drop support for building Bison with K&R C, + since it didn't work anyway and it's not worth worrying about. + * Makefile.maint (wget_files): Remove ansi2knr.c. + (ansi2knr.c-url_prefix): Remove. + * lib/.cvsignore: Remove ansi2knr, ansi2knr.*. + * lib/Makefile.am (AUTOMAKE_OPTIONS): Remove. + * src/Makefile.am (AUTOMAKE_OPTIONS): Remove. + +2002-10-15 Paul Eggert + + Stop using the "enum_" trick for K&R-style function definitions; + it confused me, and I was the author! Instead, assume that people + who want to use K&R C compilers (when using these modules in GCC, + perhaps?) will run ansi2knr. + + * lib/bbitset.h: (enum_bitset_ops, enum_bitset_type): Remove. + All uses of "enum_" changed to "enum ". + * lib/ebitset.c (enum_ebitset_find_mode): Likewise. + * lib/lbitset.c (enum_lbitset_find_mode): Likewise. + + * lib/abitset.c (abitset_and, abitset_and_cmp, abitset_and_or, + abitset_and_or_cmp, abitset_andn, abitset_andn_cmp, + abitset_andn_or, abitset_andn_or_cmp, abitset_bytes, abitset_copy, + abitset_copy1, abitset_disjoint_p, abitset_empty_p, + abitset_equal_p, abitset_init, abitset_list, abitset_list_reverse, + abitset_not, abitset_ones, abitset_or, abitset_or_and, + abitset_or_and_cmp, abitset_or_cmp, abitset_reset, abitset_set, + abitset_size, abitset_small_list, abitset_subset_p, abitset_test, + abitset_unused_clear, abitset_xor, abitset_xor_cmp, abitset_zero): + Use function prototypes; this removes the need for declaring + static functions simply to provide their prototypes. + * lib/bitset.c (bitset_alloc, bitset_and_or_, bitset_and_or_cmp_, + bitset_andn_or_, bitset_andn_or_cmp_, bitset_bytes, bitset_copy_, + bitset_count_, bitset_create, bitset_dump, bitset_first, + bitset_free, bitset_init, bitset_last, bitset_next, + bitset_obstack_alloc, bitset_obstack_free, bitset_only_set_p, + bitset_op4_cmp, bitset_or_and_, bitset_or_and_cmp_, bitset_prev, + bitset_print, bitset_release_memory, bitset_toggle_, + bitset_type_choose, bitset_type_get, bitset_type_name_get, + debug_bitset): Likewise. + * lib/bitset.h (bitset_set, bitset_reset, bitset_test): Likewise. + * lib/bitset_stats.c (bitset_log_histogram_print, + bitset_percent_histogram_print, bitset_stats_and, + bitset_stats_and_cmp, bitset_stats_and_or, + bitset_stats_and_or_cmp, bitset_stats_andn, bitset_stats_andn_cmp, + bitset_stats_andn_or, bitset_stats_andn_or_cmp, bitset_stats_copy, + bitset_stats_count, bitset_stats_disable, bitset_stats_disjoint_p, + bitset_stats_dump, bitset_stats_empty_p, bitset_stats_enable, + bitset_stats_equal_p, bitset_stats_free, bitset_stats_init, + bitset_stats_list, bitset_stats_list_reverse, bitset_stats_not, + bitset_stats_ones, bitset_stats_or, bitset_stats_or_and, + bitset_stats_or_and_cmp, bitset_stats_or_cmp, bitset_stats_print, + bitset_stats_print_1, bitset_stats_read, bitset_stats_reset, + bitset_stats_set, bitset_stats_size, bitset_stats_subset_p, + bitset_stats_test, bitset_stats_toggle, bitset_stats_type_get, + bitset_stats_write, bitset_stats_xor, bitset_stats_xor_cmp, + bitset_stats_zero): Likewise. + * lib/bitsetv.c (bitsetv_alloc, bitsetv_create, bitsetv_free, + bitsetv_zero, bitsetv_ones, bitsetv_transitive_closure, + bitsetv_dump, debug_bitsetv): Likewise. + * lib/ebitset.c (ebitset_and, ebitset_and_cmp, ebitset_andn, + ebitset_andn_cmp, ebitset_bytes, ebitset_copy, ebitset_copy_, + ebitset_copy_cmp, ebitset_disjoint_p, ebitset_elt_add, + ebitset_elt_alloc, ebitset_elt_calloc, ebitset_elt_find, + ebitset_elt_free, ebitset_elt_last, ebitset_elt_remove, + ebitset_elt_zero_p, ebitset_elts_grow, ebitset_empty_p, + ebitset_equal_p, ebitset_free, ebitset_init, ebitset_list, + ebitset_list_reverse, ebitset_not, ebitset_ones, ebitset_op3_cmp, + ebitset_or, ebitset_or_cmp, ebitset_release_memory, ebitset_reset, + ebitset_set, ebitset_size, ebitset_subset_p, ebitset_test, + ebitset_weed, ebitset_xor, ebitset_xor_cmp, ebitset_zero): + Likewise. + * lib/lbitset.c (debug_lbitset, lbitset_and, lbitset_and_cmp, + lbitset_andn, lbitset_andn_cmp, lbitset_bytes, lbitset_copy, + lbitset_copy_cmp, lbitset_disjoint_p, lbitset_elt_alloc, + lbitset_elt_calloc, lbitset_elt_find, lbitset_elt_free, + lbitset_elt_link, lbitset_elt_unlink, lbitset_elt_zero_p, + lbitset_empty_p, lbitset_equal_p, lbitset_free, lbitset_init, + lbitset_list, lbitset_list_reverse, lbitset_not, lbitset_ones, + lbitset_op3_cmp, lbitset_or, lbitset_or_cmp, lbitset_prune, + lbitset_release_memory, lbitset_reset, lbitset_set, lbitset_size, + lbitset_subset_p, lbitset_test, lbitset_weed, lbitset_xor, + lbitset_xor_cmp, lbitset_zero): Likewise. + +2002-10-14 Akim Demaille + + Version 1.75. + +2002-10-14 Akim Demaille + + * tests/Makefile.am (maintainer-check-posix): New. + +2002-10-14 Akim Demaille + + * data/glr.c [YYDEBUG] (YYLEFTMOST_STATE): Initialize the yyloc + member. + +2002-10-14 Akim Demaille + + * src/tables.c (table_ninf_remap): base -> tab. + Reported by Matt Rosing. + +2002-10-14 Paul Eggert + + * tests/action.at, tests/calc.at, tests/conflicts.at, + tests/cxx-type.at, tests/headers.at, tests/input.at, + tests/regression.at, tests/synclines.at, tests/torture.at: + Say "bison -o foo.c foo.y", not "bison foo.y -o foo.c", + so that the tests still work even if POSIXLY_CORRECT is set. + * doc/bison.texinfo (Rpcalc Compile, Invocation): Likewise. + + * data/c.m4 (b4_int_type): Use yysigned_char instead of signed char, + for portability to K&R hosts. Fix typo: signed char is guaranteed + only to 127, not to 128. + * data/glr.c (yysigned_char): New type. + * data/yacc.c (yysigned_char): Likewise. + * tests/regression.at (Web2c Actions): signed char -> yysigned_char. + +2002-10-13 Paul Eggert + + * data/yacc.c (yyparse): Rewrite to avoid "comparison is always + true due to limited range of data type" warning from GCC. + + * data/c.m4 (b4_token_defines): Protect against double-inclusion + by wrapping enum yytokentype's definition inside #ifndef + YYTOKENTYPE. This undoes a bug I introduced on 2002-10-12. + +2002-10-13 Akim Demaille + + * data/glr.c (yyglrShiftDefer, yyaddDeferredAction, yydoAction): + Un yy- yyrhs to avoid the name clash with the global YYRHS. + +2002-10-13 Akim Demaille + + * Makefile.maint: Update from Autoconf 2.54. + * m4/strerror_r.m4 (AC_FUNC_STRERROR_R): Remove, shipped with 2.54. + +2002-10-13 Akim Demaille + + * src/print.c (print_state): Separate the list of solved conflicts + from the other items. + * tests/conflicts.at (Resolved SR Conflicts): Adjust. + +2002-10-13 Akim Demaille + + Let nondeterministic skeletons be usable with deterministic + tables. + + With the patch, GAWK compiled by GCC without -O2 passes its test + suite using a GLR parser driven by LALR tables. It fails with -O2 + because `struct stat' gives two different answers on my machine: + 88 (definition of an auto var) and later 96 (memset on this var). + Hence the stack is badly corrumpted. The headers inclusion is to + blame: if I move the awk.h inclusion before GLR's system header + inclusion, the two struct stat have the same size. + + * src/tables.c (pack_table): Always create conflict_table. + (token_actions): Always create conflict_list. + * data/glr.c (YYFLAG): Remove, unused. + +2002-10-13 Akim Demaille + + * configure.ac (AC_GNU_SOURCE): Use it instead of hand written code. + (O0FLAGS): New. + (VALGRIND, GXX): New. + * tests/atlocal.in (CFLAGS): Use O0FLAGS. + * tests/bison.in: Run $PREBISON a pre-command. + * tests/Makefile.am (maintainer-check, maintainer-check-valgrind) + (maintainer-check-g++): New. + * Makefile.am (maintainer-check): New. + +2002-10-13 Akim Demaille + + * data/glr.c: Formatting changes. + Tweak some trace messages to match yacc.c's. + +2002-10-13 Akim Demaille + + GLR parsers sometimes raise parse errors instead of performing the + default reduction. + Reported by Charles-Henry de Boysson. + + * tests/calc.at (_AT_CHECK_CALC, _AT_CHECK_CALC_ERROR): Don't + check the length of the traces when %glr. + (_AT_CHECK_CALC_ERROR): Also skip `^Stack' lines, coming from + GLR's traces. + (AT_CHECK_CALC_LALR, AT_CHECK_CALC_GLR): New. + Test GLR parsers. + * data/glr.c (YYLEFTMOST_STATE): Fix its value. + (yyltype): Remove the yy prefix from the member names. + (yytable): Complete its comment. + (yygetLRActions): Map error action number from YYTABLE from + YYTABLE_NINF to 0. + (yyisErrorAction): No longer compare YYACTION to YYPACT_NINF + (which was a bug: it should have been YYTABEL_NINF, and yet it was + not satisfying as we could compare an YYACTION computed from + YYDEFACT to YYTABLE_NINF although they are unrelated): 0 is the + only value for error actions. + (yyreportParseError): In verbose parse error messages, don't issue + `error' in the list of expected tokens. + * data/yacc.c (yyparse) : Rewrite the decoding of the + next action to perform to match glr.c's decoding. + (yytable): Complete its comment. + +2002-10-13 Paul Eggert + + Fix problem reported by Henrik Grubbstroem in + : + "nonterm: { $$ = 123; } { $$ = $1; };" was wrongly rejected, + because the Bison parser reads the second action before reducing + the first one. + * src/scan-gram.l (rule_length): New static var. + Use it to keep track of the rule length in the scanner, since + we can't expect the parser to be in lock-step sync with the scanner. + (handle_action_dollar, handle_action_at): Use this var. + * tests/actions.at (Exotic Dollars): Test for the problem. + +2002-10-12 Paul Eggert + + * lib/timevar.c [! IN_GCC && HAVE_SYS_TIME_H]: Include . + * m4/timevar.m4 (BISON_PREREQ_TIMEVAR): Check for . + Include when checking for clock_t and struct tms. + Use same include order as source. + This is for the SunOS 4.1.4 porting bug reported by Peter Klein in + . + + * lib/timevar.c: Update copyright date and clarify comments. + (get_time) [IN_GCC]: Keep the GCC version for reference. + + * lib/timevar.c, lib/timevar.h, lib/timevar.def: Import + GCC version as of today, then merge Bison's changes. + Change "GCC" to "Bison" in copyright notice. timevar.def's + author is Akim, so change that too. + + * src/reader.c (grammar_current_rule_check): + Don't worry about the default action if $$ is untyped. + Prevents bogus warnings reported by Jim Gifford in + . + + * data/c.m4 (b4_token_enum): Do not define YYTOKENTYPE. + * data/glr.c, data/lalr1.cc, data/yacc.c: + Output token definitions before the first part of user declarations. + Fixes compatibility problem reported by Jim Gifford for kbd in + . + +2002-10-11 Paul Eggert + + * data/yacc.c (yyreport_parse_error): Remove, putting its body into... + (yyparse): here. This undoes some of the 2002-07-25 change. + Compatibility problem reported by Ralf S. Engelschall with + OSSP cfg . + +2002-10-11 Akim Demaille + + * tests/regression.at Characters Escapes): New. + * src/scan-gram.l (SC_ESCAPED_CHARACTER): Accept \' in strings and + characters. + Reported by Jan Nieuwenhuizen. + +2002-10-11 Akim Demaille + + * po/id.po: New. + +2002-10-10 Paul Eggert + + Portability fixes for bitsets; this also avoids several GCC + warnings. + + * lib/abitset.c: Include , for offsetof. + * lib/lbitset.c: Likewise. + + * lib/abitset.c (abitset_bytes): Return a size that is aligned + properly for vectors of objects. Do not assume that adding a + header size to a multiple of a word size yields a value that is + properly aligned for the whole union. + * lib/bitsetv.c (bitsetv_alloc): Likewise. + + * lib/bitset_stats.c (bitset_stats_bytes): Adjust to new, + unique names for structures. + * lib/ebitset.c (ebitset_bytes): Likewise. + * lib/lbitset.c (lbitset_bytes): Likewise. + + * lib/abitset.c (abitset_ones, abitset_zero, abitset_empty_p, + abitset_copy1, abitset_not, abitset_equal_p, abitset_subset_p, + abitset_disjoint_p, abitset_and, abitset_and_cmp, abitset_andn, + abitset_andn_cmp, abitset_or, abitset_or_cmp, abitset_xor, + abitset_xor_cmp, abitset_and_or, abitset_and_or_cmp, + abitset_andn_or, abitset_andn_or_cmp, abitset_or_and, + abitset_or_and_cmp, abitset_copy): Supply prototype decls, + to improve the type-checking that GCC can do. + * lib/bitset.c (bitset_op4_cmp): Likewise. + * lib/bitset_stats.c (bitset_stats_count, + bitset_stats_empty_p, bitset_stats_ones, bitset_stats_zero, + bitset_stats_copy, bitset_stats_disjoint_p, + bitset_stats_equal_p, bitset_stats_not, bitset_stats_subset_p, + bitset_stats_and, bitset_stats_and_cmp, bitset_stats_andn, + bitset_stats_andn_cmp, bitset_stats_or, bitset_stats_or_cmp, + bitset_stats_xor, bitset_stats_xor_cmp, bitset_stats_and_or, + bitset_stats_and_or_cmp, bitset_stats_andn_or, + bitset_stats_andn_or_cmp, bitset_stats_or_and, + bitset_stats_or_and_cmp): Likewise. + * lib/lbitset.c (lbitset_and, lbitset_and_cmp, lbitset_andn, + lbitset_andn_cmp, lbitset_or, lbitset_or_cmp, lbitset_xor, + lbitset_xor_cmp, lbitset_empty_p, lbitset_ones, lbitset_not, + lbitset_subset_p, lbitset_disjoint_p, debug_lbitset): Likewise. + + * lib/abitset.h: Include bitset.h, not bbitset.h. + * lib/ebitset.h: Likewise. + * lib/lbitset.h: Likewise. + + * lib/bbitset.h: (enum_bitset_ops, enum_bitset_type): New types. + All instances of parameters of type enum bitset_opts are now of + type enum_bitset_opts, to conform to the C Standard, and similarly + for enum_bitset_type. + * lib/ebitset.c (enum_ebitset_find_mode): Likewise. + * lib/lbitset.c (enum_lbitset_find_mode): Likewise. + + Do not use "struct bitset_struct" to mean different things in + different modules. Not only is this confusing, it violates + the C Standard, which requires that structure types in different + modules must be compatible if one is to be passed to the other. + * lib/bbitset.h (bitset): Now points to a union, not to a struct. + All instances of "struct bitset_struct *" replaced with "bitset". + * lib/bitset.h (struct bitset_struct): Remove, replacing with.... + (union bitset_union, struct abitset_struct, struct ebitset_struct, + struct lbitset_struct, struct bitset_stats_struct): New types. + All uses of struct bitset_struct changed to union bitset_union, + etc. + * lib/abitset.c (struct abitset_struct, abitset, + struct bitset_struct): Remove. + * lib/bitset_stats.c (struct bitset_stats_struct, bitset_stats, + struct bitset_struct): Remove. + * lib/ebitset.c (struct ebitset_struct, ebitset, struct + bitset_struct): Remove. + * lib/lbitset.c (struct lbitset_struct, lbitset, bitset_struct): + Likewise. + + Do not call a function of type T using a call that assumes the + function is of a different type U. Standard C requires that a + function must be called with a type that is compatible with its + definition. + * lib/bbitset.h (bitset_and_or_, bitset_andn_or_, bitset_or_and_): + New decls. + * lib/bitset.c (bitset_and_or_, bitset_andn_or_, bitset_or_and_): + New functions. + * lib/ebitset.c (PFV): Remove. + * lib/lbitset.c (PFV): Likewise. + * lib/ebitset.c (ebitset_and, ebitset_andn, ebitset_or, + ebitset_xor, ebitset_copy, ebitset_ones, ebitset_empty_p): New + decls. + (ebitset_and, ebitset_andn, ebitset_or, ebitset_xor): New functions. + (ebitset_vtable): Use them. + * lib/lbitset.c (lbitset_and, lbitset_andn, lbitset_or, + lbitset_xor): New functions. + (lbitset_vtable): Use them. + + * lib/bitset.h (bitset_next, bitset_prev, bitset_only_set_p): + Declare. + + * lib/bitsetv.c (bitsetv_alloc): Add a cast to (void *) to avoid a + GCC warning. + * lib/lbitset.c (LBITSET_CURRENT1): Likewise. + Use offsetof, for simplicity. + +2002-10-06 Paul Eggert + + * lib/bitset.h (bitset_reset): Do not assume that bitset_word is + the same width as int. This reapplies a hunk of the 2002-08-12 patch + , + which was inadvertently undone by the 2002-09-30 patch. + * lib/lbitset.c (debug_lbitset): Do not assume that bitset_word is + the same width as int. + +2002-10-04 Paul Eggert + + Version 1.50. + + * configure.ac (AC_INIT), NEWS: Increment version number. + + * doc/bison.texinfo: Minor spelling, grammar, and white space + fixes. + (Symbols): Mention that any negative value returned from yylex + signifies end-of-input. Warn about negative chars. Mention + the portable Standard C character set. + + The GNU coding standard says CFLAGS and YFLAGS are reserved + for the installer to set. + * lib/Makefile.am (AM_CFLAGS): Renamed from CFLAGS. + * src/Makefile.am (AM_CFLAGS): Likewise. + (AM_YFLAGS): Renamed from YFLAGS. + + Fix some MAX and MIN problems. + * src/gram.h (ITEM_NUMBER_MIN): MIN_MAX -> INT_MIN. + * src/lalr.h (GOTO_NUMBER_MAX): INT_MAX -> SHRT_MAX. + * src/symtab.h (SYMBOL_NUMBER_MAX): New macro. + * src/reader.c (reader): Use it. + + * tests/regression.at (Braces parsing): Use grep, not fgrep, as + POSIX 1003.1-2001 has removed fgrep. + +2002-10-04 Michael Hayes + + * lib/bbitset.h (BITSET_WINDEX_MAX): Redefine so that it cannot be + interpreted as signed. + * lib/ebitset.c (ebitset_list): Fix bug. + +2002-10-01 Paul Eggert + + More fixes for 64-bit hosts and large bitsets. + + * lib/abitset.c (struct abitset_struct.n_bits, abitset_small_list, + abitset_size, abitset_list, abitset_list_reverse, abitset_list): + Use bitset_bindex, not int or unsigned int or size_t, to count bits. + * lib/bbitset.h (struct bitset_vtable.size, struct bitset_vtable.count, + struct bitset_vtable.list, struct bitset_vtable.list_reverse, + bitset_count_, bitset_next, bitset_prev, bitset_first, bitset_last, + bitset_count_): Likewise. + * lib/bitset.h (bitset_iterator.num, bitset_iterator.i, + bitset_first, bitset_last): Likewise. + * lib/bitset_stats.c (bitset_stats_size, bitset_stats_list, + bitset_stats_list_reverse, bitset_stats_size, + bitset_stats_count, bitset_stats_list, bitset_stat_list_reverse): + Likewise. + * lib/bitsetv-print.c (bitsetv_matrix_dump): Likewise. + * lib/bitsetv.c (bitsetv_alloc, bitsetv_create, bitsetv_free, + bitsetv_zero, bitsetv_ones, bitsetv_transitive_closure, + bitsetv_reflexive_transitive_closure): Likewise. + * lib/bitsetv.h (bitsetv_alloc, bitsetv_create): Likewise. + * lib/ebitset.c (ebitset_size, ebitset_list, ebitset_list_reverse): + Likewise. + * lib/lbitset.c (lbitset_size, lbitset_list, lbitset_list_merge): + Likewise. + + * lib/abitset.c (abitset_ones, abitset_zero, abitset_bytes): + Use size_t, not unsigned int, to count bytes. + * lib/abitset.h (abitset_bytes): Likewise. + * lib/bitset.c (bitset_bytes, bitset_alloc, bitset_obstack_alloc): + Likewise. + * lib/bitset.h (bitset_bytes): Likewise. + * lib/bitset_stats.c (bitset_stats_bytes, bitset_stats_init): Likewise. + * lib/bitset_stats.h (bitset_stats_bytes): Likewise. + * lib/bitsetv.c (bitsetv_alloc): Likewise. + * lib/ebitset.c (ebitset_bytes): Likewise. + * lib/ebitset.h (ebitset_bytes): Likewise. + * lib/lbitset.c (lbitset_bytes): Likewise. + * lib/lbitset.h (lbitset_bytes): Likewise. + + * lib/abitset.c (abitset_empty_p, abitset_not, abitset_equal_p, + abitset_subset_p, abitset_disjoint_p, abitset_and, + abitset_and_cmp, abitset_andn, abitset_andn_cmp, abitset_or, + abitset_or_cmp, abitset_xor, abitset_xor_cmp, abitset_and_or, + abitset_and_or_cmp, abitset_andn_or, abitset_andn_or_cmp, + abitset_or_and, abitset_or_and_cmp): + Use bitset_windex instead of unsigned int. + * lib/bitsetv.c (bitsetv_dump, debug_bitsetv): Likewise. + * lib/ebitset.c (struct ebitset_struct.size, ebitset_elts_grow, + ebitset_elt_add, ebitset_elt_remove, ebitset_weed, + ebitset_elt_find, ebitset_list_reverse, ebitset_list, ebitset_init): + Likewise. + * lib/lbitset.c (lbitset_ones, lbitset_not): Likewise. + + * lib/bitset.c (bitset_print): + Use proper printf formats for widths of integer types. + * lib/bitset_stats.c (bitset_percent_histogram_print, + bitset_log_histogram_print, bitset_stats_print_1): Likewise. + * lib/bitsetv-print.c (bitsetv_matrix_dump): Likewise. + * lib/bitsetv.c (bitsetv_dump, debug_bitsetv): Likewise. + * lib/lbitset.c (lbitset_bytes): Likewise. + + * lib/bbitset.h (BITSET_BINDEX_MAX, BITSET_WINDEX_MAX, + BITSET_SIZE_MAX): New macros. + (BITSET_INDEX_MAX): Remove. It wasn't right, since it assumed that + sizeof (bitset_word) == sizeof (bitset_windex). All uses changed + to BITSET_WINDEX_MAX. + + * lib/bitset.c (bitset_next, bitset_prev, bitset_first, + bitset_last): Return BITSET_BINDEX_MAX (not -1) for no value, + since we now return the bitset_bindex type (not int). + + * lib/bitsetv.c (bitsetv_alloc): Check for arithmetic overflow + when computing sizes. + * lib/ebitset.c (ebitset_elts_grow): Likewise. + + * lib/lbitset.c (lbitset_elt_find): Simplify windex calculation + and avoid cast to unsigned. + +2002-09-30 Akim Demaille + + * lib/abitset.c, lib/bbitset.h, lib/bitset.c, lib/bitset.h, + * lib/bitset_stats.c, lib/bitsetv.c, lib/ebitset.c, lib/lbitset.c: + Updates from Michael Hayes. + +2002-09-30 Art Haas + + * configure.ac: Update AC_OUTPUT and AM_CONFIG_HEADER + invocations. + * tests/cxx-type.at (declarator): Don't rely on NDEBUG being not + defined. + +2002-09-27 Akim Demaille + + Version 1.49c. + +2002-09-27 Akim Demaille + + * configure.ac (AM_INIT_AUTOMAKE): We _need_ 1.7. + (Because of AC_LIBSOURCE). + +2002-09-27 Akim Demaille + + Playing with Autoscan. + + * configure.ac: Remove the old LIBOBJ tweaks. + (AC_REPLACE_FUNCS): Add strrchr and strtol. + * lib/strrchr.c: New. + * lib/strtol.c: New, from the Coreutils 4.5.1. + +2002-09-27 Akim Demaille + + Playing with Autoscan. + + * m4/prereq.m4 (jm_PREREQ_ARGMATCH, jm_FUNC_ARGMATCH): New. + * lib/Makefile.am (libbison_a_SOURCES): No longer include + argmatch.c and argmatch.h, since they are AC_LIBSOURCE'd. + * lib/strcasecmp.c, lib/strncasecmp.c, lib/memcmp.c: New, from the + Coreutils 4.5.1. + +2002-09-24 Akim Demaille + + * doc/bison.texinfo (Stack Overflow): xref to Recursion. + (Frequently Asked Questions, Parser Stack Overflow): New. + +2002-09-13 Akim Demaille + + Playing with autoscan. + + * src/reader.c (get_merge_function): Use xstrdup, not strdup. + * src/files.c (skeleton_find): Remove, unused. + * m4/memcmp.m4: New, from the Coreutils 4.5.1. + * m4/prereq.m4 (jm_PREREQ_QUOTEARG): Run jm_FUNC_MEMCMP. + +2002-09-13 Akim Demaille + + * configure.ac (AM_INIT_AUTOMAKE): Require Automake 1.6.3. + * Makefile.am (AUTOMAKE_OPTIONS): Don't. + +2002-09-13 Akim Demaille + + * configure.ac: Require 2.54. + s/jm_FUNC_MALLOC/AC_FUNC_MALLOC/. + s/jm_FUNC_REALLOC/AC_FUNC_REALLOC/. + * m4/c-bs-a.m4, m4/malloc.m4, m4/mbstate_t.m4, m4/realloc.m4: + Remove, provided by Autoconf macros. + +2002-09-12 Akim Demaille + + * m4/prereq.m4: Update, from Coreutils 4.5.1. + +2002-09-12 Akim Demaille + + * m4/prereq.m4: Update, from Fileutils 4.1.5. + * configure.ac (jm_PREREQ_TEMPNAME): Invoke it. + Reported by Martin Mokrejs. + +2002-09-10 Akim Demaille + + * src/parse-gram.y: Associate a human readable string to each + token type. + * tests/regression.at (Invalid inputs): Adjust. + +2002-09-10 Gary V. Vaughan + + * tests/Makefile.am ($(srcdir)/package.m4): Bison now ships + with an Autoconf-2.5x style configure.ac. + +2002-09-06 Paul Eggert + + * doc/bison.texinfo (Conditions): Make explicit that the GPL + exception applies only to yacc.c. This is a modification of a + patch originally suggested by Akim Demaille. + +2002-09-06 Akim Demaille + + * data/c.m4 (b4_copyright): Move the GPL exception comment from + here to... + * data/yacc.c: here. + + * data/lalr1.cc (struct yyltype): Don't define it, since we use + LocationType. + (b4_ltype): Default to yy::Location from location.hh. + +2002-09-04 Jim Meyering + + * data/yacc.c: Guard the declaration of yytoknum also with + `#ifdef YYPRINT', so it is declared only when used. + +2002-09-04 Akim Demaille + + * configure.in: Rename as... + * configure.ac: this. + Bump to 1.49c. + +2002-09-04 Akim Demaille + + * src/assoc.c, src/closure.c, src/gram.c, src/injections.c, + * src/lalr.c, src/LR0.c, src/relation.c, src/tables.c: Don't + translate maintainer only messages. + +2002-08-12 Paul Eggert + + Version 1.49b. + + * Makefile.am (SUBDIRS): Remove intl. + (DISTCLEANFILES): Remove. + * NEWS: Mention that GNU M4 is now required. Clarify what is + meant by "larger grammars". Mention the pt_BR translation. + * configure.in (AC_CHECK_DECLS): Add getenv, getopt. + (AM_GNU_GETTEXT_VERSION): New macro, replacing GETTEXT_VERSION var. + Bump version from 0.11.2 to 0.11.5. + (BISON_PREREQ_STAGE): Remove. + (AM_GNU_GETTEXT): Use external gettext. + (AC_OUTPUT): Remove intl/Makefile. + + * config/depcomp, config/install-sh: Sync with Automake 1.6.3. + + * data/glr.c: Include string.h, for strlen. + (yyreportParseError): Use size_t for yysize. + (yy_yypstack): No longer nested inside yypstates, as nested + functions are not portable. Do not assume size_t is the + same width as int. + (yypstates): Do not assume that ptrdiff_t is the same width + as int, and similarly for yyposn and YYINDEX. + + * data/yacc.c: Fix comment about `$$ = $1': it can copy garbage. + + * lib/Makefile.am (INCLUDES): Do not include from the intl + directory, which has been removed. + * src/Makefile.am (INCLUDES): Likewise. + + * lib/Makefile.am (libbison_a_SOURCES): Add unlocked-io.h. + (bitsets_sources, additional_bitsets_sources, timevars_sources): + New vars. + + * lib/Makefile.am (libbison_a_SOURCES): Avoid +=, a GNU make extension. + * tests/Makefile.am (EXTRA_DIST): Likewise. + + * lib/abitset.c (abitset_reverse_list, ebitset_reverse_list): + Do not assume that bitset_windex is the same width as unsigned. + + * lib/abitset.c (abitset_unused_clear): Do not assume that + bitset_word is the same width as int. + * lib/bbitset.h (BITSET_INDEX_MAX, BITSET_MSB): Likewise. + * lib/bitset.h (bitset_set, bitset_reset): Likewise. + * lib/bitset_stats.c (bitset_stats_set, bitset_stats_reset): Likewise. + * lib/ebitset.c (ebitset_set, ebitset_reset): Likewise. + * lib/lbitset.c (lbitset_set, lbitset_reset): Likewise. + + * lib/abitset.c (abitset_op1): Use -1, not ~0, as memset arg (for + portability to one's complement hosts!). + * lib/ebitset.c (ebitset_op1): Likewise. + * lib/lbitset.c (lbitset_op1): Likewise. + + * lib/argmatch.c, lib/quotearg.c, quotearg.h: Sync with GNU tar. + * lib/argmatch.h, lib/basename.c, lib/dirname.c, lib/dirname.h, + lib/hash.c, lib/hash.h, lib/strnlen.c, lib/xmalloc.c: + Sync with fileutils. + * lib/error.c, lib/getopt.c, lib/getopt.h, lib/getopt1.c, + lib/gettext.h: Sync with diffutils. + + * lib/memrchr.c, lib/mkstemp.c, lib/strchr.c, lib/strnlen.c, + lib/strspn.c, lib/tempname.c: Use GPL, not LGPL. + + * lib/obstack.c, lib/obstack.h: Sync with fileutils, except use + PROTOTYPES to check for prototypes, and "defined __STDC__" to + check for void *. + + * lib/bbitset.h (BITSET_WORD_BITS): Now of type unsigned, not + size_t; the old version tried to do this but casted improperly. + (bitset_bindex, bitset_windex): Now size_t, not unsigned long. + (bitset_test): Now returns int, not unsigned long. + + * lib/bitset_stats.c: Include "gettext.h". + (_): New macro. + (bitset_stats_set, bitset_stats_reset, bitset_stats_test): Don't + name locals "index", as it generates unnecessary warnings on some + hosts that have an "index" function. + + * lib/bitset_stats.c (bitset_stats_print_1, bitset_stats_print, + bitset_stats_read, bitset_stats_write): Wrap strings in _() if + they need translation. + * src/LR0.c (state_list_append, new_itemsets, get_state, + append_states, generate_states): Likewise. + * src/assoc.c (assoc_to_string): Likewise. + * src/closure.c (print_closure, set_firsts, closure): Likewise. + * src/gram.c (grammar_dump): Likewise. + * src/injections.c (injections_compute): Likewise. + * src/lalr.c (lookaheads_print): Likewise. + * src/relation.c (relation_transpose): Likewise. + * src/scan-gram.l: Likewise. + * src/tables.c (table_grow, pack_vector): Likewise. + + * m4/Makefile.am (EXTRA_DIST): Remove codeset.m4, + glibc21.m4, isc-posix.m4 lcmessage.m4, stage.m4. + * m4/malloc.m4, m4/realloc.m4: Sync with diffutils. + * m4/mbstate_t.m4: Sync with fileutils. + * m4/prereq.m4 (jm_PREREQ_QUOTEARG): AC_MBSTATE_T -> AC_TYPE_MBSTATE_T. + + * po/LINGUAS: Add pt_BR. + * po/POTFILES.in: Add src/assoc.c, src/closure.c, src/gram.c, + src/main.c, src/relation.c, src/state.c, lib/bitset_stats.c, + lib/timevar.c. + Use src/parse-gram.y instead of src/parse-gram.c, as the gettext + manual recommends. + Similarly, use src/scan-gram.l instead of src/scan-gram.c. + + * src/complain.c (strerror_r): Remove decl; not needed. + (strerror): Use same pattern as ../lib/error.c. + + * src/files.c, src/files.h (compute_header_macro): Remove; unused. + + * src/gram.c (grammar_dump): Do not assume ptrdiff_t fits in int. + + * src/main.c (main): Cast result of bindtextdomain and textdomain + to void, to avoid a GCC warning when --disable-nls is in effect. + + * src/scan-gram.l: Use strings rather than escapes when possible, + to minimize the number of warnings from xgettext. + (handle_action_dollar, handle_action_at): Don't use isdigit, + as it mishandles negative chars and it may not work as expected + outside the C locale. + + * src/symtab.c (symbol_get): Don't cast LHS of an assignment; + this is a GCC extension and is not portable to other compilers. + + * src/system.h (alloca): Use same pattern as ../lib/error.c. + Do not include ; no longer needed. + Do not include ; no longer needed (and generates + warnings on OpenBSD 3.0). + + * tests/cxx-type.at (yylex): Do not pass signed char to isupper; + it's not portable. + + * tests/regression.at: Do not use 'cc -c input.c -o input'; + Sun C rejects this. Instead, use 'cc -c input.c -o input.o'. + + * tests/synclines.at (AC_SYNCLINES_COMPILE): Accept any nonzero + exit status as failure, not just exit status 1. Sun C exits + with status 2 sometimes. + + * tests/torture.at (AT_INCREASE_DATA_SIZE): New macro. + Use it for the two large tests. + +2002-08-02 Akim Demaille + + * src/conflicts.c (conflicts_output): Don't output rules never + reduced here, since anyway that computation doesn't work. + * src/gram.h, src/gram.h (rule_filter_t, rule_useful_p) + (rule_useless_p, rule_never_reduced_p): New. + (grammar_rules_partial_print): Use a filter instead of a range. + Display the title only if needed. + (grammar_rules_print): Adjust. + (grammar_rules_never_reduced_report): New. + * src/tables.c (action_row): Move the computation of rules never + reduced to... + (token_actions): here. + * src/main.c (main): Make the parser before making the report, so + that rules never reduced are computed. + Call grammar_rules_never_reduced_report. + * src/print.c (print_results): Report rules never reduced. + * tests/conflicts.at, tests/reduce.at: Adjust. + +2002-08-01 Akim Demaille + + Instead of attaching lookaheads and duplicating the rules being + reduced by a state, attach the lookaheads to the reductions. + + * src/state.h (state_t): Remove the `lookaheads', + `lookaheads_rule' member. + (reductions_t): Add a `lookaheads' member. + Use a regular array for the `rules'. + * src/state.c (reductions_new): Initialize the lookaheads member + to 0. + (state_rule_lookaheads_print): Adjust. + * src/state.h, src/state.c (state_reductions_find): New. + * src/conflicts.c (resolve_sr_conflict, set_conflicts) + (count_rr_conflicts): Adjust. + * src/lalr.c (LArule): Remove. + (add_lookback_edge): Adjust. + (state_lookaheads_count): New. + (states_lookaheads_initialize): Merge into... + (initialize_LA): this. + (lalr_free): Adjust. + * src/main.c (main): Don't free nullable and derives too early: it + is used by --verbose. + * src/print.c, src/print_graph.c, src/tables.c: Adjust. + +2002-08-01 Akim Demaille + + * src/derives.h, src/derives.c (derives): A `rule_t***' instead of + `rule_number_t**'. + (set_derives, free_derives): Rename as... + (derives_compute, derives_free): this. + Adjust all dependencies. + * src/nullable.c (set_nullable, free_nullable): Rename as... + (nullable_compute, nullable_free): these. + (rule_list_t): Store rule_t *, not rule_number_t. + * src/state.c (state_rule_lookaheads_print): Directly compare rule + pointers, instead of their numbers. + * src/main.c (main): Call nullable_free, and derives_free earlier, + as they were lo longer used. + +2002-08-01 Akim Demaille + + * lib/timevar.c (get_time): Include children time. + * src/lalr.h (LA, LArule): Don't export them: used with the + state_t. + * src/lalr.c (LA, LArule): Static. + * src/lalr.h, src/lalr.c (lalr_free): New. + * src/main.c (main): Call it. + * src/tables.c (pack_vector): Check whether loc is >= to the + table_size, not >. + (pack_tables): Don't free froms, tos, conflict_tos, and pos... + (tables_generate): do it, since that's also it which allocates + them. + Don't free LA and LArule, main does. + +2002-07-31 Akim Demaille + + Separate parser tables computation and output. + + * src/output.c (nvectors, base_t, base, base_ninf, conflict_table) + (conflict_list, conflict_list_cnt, table, check, table_ninf) + (yydefgoto, yydefact, high): Move to... + * src/tables.h, src/tables.c: here. + * src/output.c (vector_number_t, VECTOR_NUMBER_MAX) + (VECTOR_NUMBER_MIN, state_number_to_vector_number) + (symbol_number_to_vector_number, nvectors, BASE_MAX, BASE_MIN) + (froms, tos, conflict_tos, tally, width, action_t, ACTION_MAX) + (ACTION_MIN, actrow, order, nentries, pos, conflrow) + (conflict_list_free, table_size, lowzero, table_grow, conflict_row) + (action_row, save_row, token_actions, save_column, default_goto) + (goto_actions, sort_actions, matching_state, pack_vector) + (table_ninf_remap, pack_table, prepare_actions): Move to... + * src/tables.c: here. + * src/tables.h, src/tables.c(tables_generate, tables_free): New. + * src/output.c (token_actions, output_base, output_conflicts) + (output_check): Merge into... + (prepare_actions): this. + (actions_output): Rename as... + (user_actions_output): this. + * src/main.c (main): Call tables_generate and tables_free. + +2002-07-31 Akim Demaille + + Steal GCC's --time-report support. + + * lib/timevar.c, lib/timevar.h, lib/timevar.def: New, + stolen/adjusted from GCC. + * m4/stage.m4: Remove time related checks. + * m4/timevar.m4: New. + * configure.in: Adjust. + * src/system.h: Adjust to using timevar.h. + * src/getargs.h, src/getargs.c: Support trace_time for + --trace=time. + * src/main.c (stage): Remove. + (main): Replace `stage' invocations with timevar calls. + * src/output.c: Insert pertinent timevar calls. + +2002-07-31 Akim Demaille + + Let --trace have arguments. + + * src/getargs.h (enum trace_e): New. + * src/getargs.c (trace_args, trace_types, trace_argmatch): New. + (long_options, short_options): --trace/-T takes an optional + argument. + Change all the uses of trace_flag to reflect the new flags. + * tests/sets.at (Firsts, Nullable, Broken Closure): Use --trace=sets. + + Strengthen `stage' portability. + + * m4/stage.m4 (BISON_PREREQ_STAGE): New. + * configure.in: Use it. + Don't check for malloc.h and sys/times.h. + * src/system.h: Include them when appropriate. + * src/main.c (stage): Compile only when mallinfo, struct mallinfo, + times and struct tms are available. + +2002-07-30 Akim Demaille + + In verbose parse error message, don't report `error' as an + expected token. + * tests/actions.at (Printers and Destructors): Adjust. + * tests/calc.at (Calculator $1): Adjust. + * data/yacc.c, data/glr.c, data/lalr1.c: When making the verbose + error message, do not report the parser accepts the error token in + that state. + +2002-07-30 Akim Demaille + + Normalize conflict related messages. + + * src/complain.h, src/complain.c (warn, complain): New. + * src/conflicts.c (conflicts_print): Use them. + (conflict_report_yacc): New, extracted from... + (conflicts_print): here. + * tests/conflicts.at, tests/existing.at: Adjust. + +2002-07-30 Akim Demaille + + Report rules which are never reduced by the parser: those hidden + by conflicts. + + * src/LR0.c (save_reductions): Don't make the final state too + different: save its reduction (accept) instead of having a state + without any action (no shift or goto, no reduce). + Note: the final state is now a ``regular'' state, i.e., the + parsers now contain `reduce 0' as default reduction. + Nevertheless, since they decide to `accept' when yystate = + final_state, they still will not reduce rule 0. + * src/print.c (print_actions, print_reduction): Adjust. + * src/output.c (action_row): Track reduced rules. + (token_actions): Report rules never reduced. + * tests/conflicts.at, tests/regression.at: Adjust. + +2002-07-30 Akim Demaille + + `stage' was accidently included in a previous patch. + Initiate its autoconfiscation. + + * configure.in: Look for malloc.h and sys/times.h. + * src/main.c (stage): Adjust. + Report only when trace_flag. + +2002-07-29 Akim Demaille + + * src/state.h, src/state.c (transitions_t): Holds state_t*'s, not + state_number_t. + (errs_t): symbol_t*, not symbol_number_t. + (reductions_t): rule_t*, not rule_number_t. + (FOR_EACH_SHIFT): New. + * src/LR0.c, src/conflicts.c, src/lalr.c, src/output.c + * src/print.c, src/print_graph.c: Adjust. + +2002-07-29 Akim Demaille + + Use $accept and $end, as BYacc and BTYacc do, instead of $axiom and $. + + * src/symtab.h, src/symtab.c (eoftoken, axiom): Rename as... + (endtoken, accept): these. + * src/reader.c (reader): Set endtoken's default tag to "$end". + Set undeftoken's tag to "$undefined" instead of "$undefined.". + * doc/bison.texinfo (Table of Symbols): Mention $accept and $end. + Adjust. + +2002-07-29 Akim Demaille + + * src/reduce.c (reduce_grammar): When the language is empty, + complain about the start symbol, not the axiom. + Use its location. + * tests/reduce.at (Empty Language): New. + +2002-07-26 Akim Demaille + + * src/reader.h, src/reader.c (gram_error): ... can't get + yycontrol without making too strong assumptions on the parser + itself. + * src/output.c (prepare_tokens): Use the real 0th value of + token_translations instead of `0'. + * src/parse-gram.y (yyerror): Don't rely on yycontrol being + visible here. + * data/yacc.c (yyreport_parse_error): Rename yylocation as yylloc + for the time being: %locations ought to provide it to yyerror. + +2002-07-25 Akim Demaille + + * src/output.c (prepare_tokens): Go up to ntokens, not ntokens + 1. + * doc/bison.texinfo (Decl Summary): s/$illegal/$undefined./. + * tests/regression.at (Web2c Actions): Adjust. + +2002-07-25 Akim Demaille + + Stop storing rules from 1 to nrules + 1. + + * src/LR0.c, src/closure.c, src/derives.c, src/gram.c, src/lalr.c + * src/nullable.c, src/output.c, src/print.c, src/reader.c + * src/reduce.c: Allocate and free from &rules[0], not &rules[1]. + Iterate from 0 to nrules. + Use rule_number_as_item_number and item_number_as_rule_number. + Adjust to `derive' now containing possibly 0. + * src/gram.h (rule_number_as_item_number, item_number_as_rule_number): + Handle the `- 1' part in rule numbers from/to item numbers. + * src/conflicts.c (log_resolution): Fix the message which reversed + shift and reduce. + * src/output.c (action_row): Initialize default_rule to -1. + (token_actions): Adjust. + * tests/sets.at (Nullable, Firsts): Fix the previously bogus + expected output. + * tests/conflicts.at (Resolved SR Conflicts): Likewise. + +2002-07-25 Akim Demaille + + * data/c.m4 (b4_c_function, b4_c_ansi_args, b4_c_ansi_arg) + (b4_c_knr_arg_names, b4_c_knr_arg_name, b4_c_knr_arg_decls) + (b4_c_knr_arg_decl): New. + * data/yacc.c: Use it to define yysymprint, yydestruct, and + yyreport_parse_error. + +2002-07-25 Akim Demaille + + * data/yacc.c (yyreport_parse_error): New, extracted from... + (yyparse): here. + (yydestruct, yysymprint): Move above yyparse. + Be K&R compliant. + +2002-07-25 Akim Demaille + + * data/c.m4 (b4_ints_in, b4_int_type, b4_int_type_for): New, + replace... + (b4_sint_type, b4_uint_type): these. + * data/yacc.c, data/glr.c, data/lalr1.cc: Use b4_int_type_for. + * tests/regression.at (Web2c Actions): Adjust. + +2002-07-25 Akim Demaille + + * src/gram.h (TIEM_NUMBER_MAX): New. + (item_number_of_rule_number, rule_number_of_item_number): Rename + as... + (rule_number_as_item_number, item_number_as_rule_number): these. + Adjust dependencies. + * src/output.c (vector_number_t, VECTOR_NUMBER_MAX) + (VECTOR_NUMBER_MIN, state_number_to_vector_number) + (symbol_number_to_vector_number): New. + (order): Of vector_number_t* type. + (base_t, BASE_MAX, BASE_MIN): New. + (froms, tos, width, pos, check): Of base_t type. + (action_number_t, ACTION_MIN, ACTION_MAX): New. + (actrow): Of action_number_t type. + (conflrow): Of unsigned int type. + (table_ninf, base_ninf): New. + (GENERATE_MUSCLE_INSERT_TABLE): Also output the `*_min' value. + (muscle_insert_int_table, muscle_insert_base_table) + (muscle_insert_rule_number_table): New. + (prepare_tokens): Output `toknum' as int_table. + (action_row): Returns a rule_number_t. + Use ACTION_MIN, not SHRT_MIN. + (token_actions): yydefact is rule_number_t*. + (table_ninf_remap): New. + (pack_table): Use it for `base' and `table'. + * data/yacc.c, data/glr.c, data/lalr1.cc (YYFLAG): Remove, + replaced with... + (YYPACT_NINF, YYTABLE_NINF): these. + (yypact, yytable): Compute their types instead of hard-coded + `short'. + * tests/regression.at (Web2c Actions): Adjust. + +2002-07-19 Akim Demaille + + * src/scan-gram.l (id): Can start with an underscore. + +2002-07-16 Akim Demaille + + * src/assoc.c, src/asssoc.h (assoc_t, assoc_to_string): New. + Adjust all former `associativity' dependencies. + * src/symtab.c (symbol_new): Default associativity is `undef', not + `right'. + (symbol_check_alias_consistence): Adjust. + +2002-07-09 Akim Demaille + + * doc/bison.texinfo: Properly set the ``header'' part. + Use @dircategory ``GNU programming tools'' as per Texinfo's + documentation. + Use @copying. + +2002-07-09 Akim Demaille + + * lib/quotearg.h: Protect against multiple inclusions. + * src/location.h (location_t): Add a `file' member. + (LOCATION_RESET, LOCATION_PRINT): Adjust. + * src/complain.c (warn_at, complain_at, fatal_at): Drop + `error_one_per_line' support. + +2002-07-09 Akim Demaille + + * src/complain.h, src/complain.c (warn, complain): Remove, unused. + * src/reader.c (lineno): Remove. + Adjust all dependencies. + (get_merge_function): Take a location and use complain_at. + * src/symtab.h, src/symtab.c (symbol_make_alias): Likewise. + * tests/regression.at (Invalid inputs, Mixing %token styles): + Adjust. + +2002-07-09 Akim Demaille + + * src/parse-gram.y (rules_or_grammar_declaration): Add an error + recovery rule, and forbid extensions when --yacc. + (gram_error): Use complain_at. + * src/reader.c (reader): Exit if there were parse errors. + +2002-07-09 Akim Demaille + + * tests/synclines.at (AT_SYNCLINES_COMPILE): New. + (AT_TEST_SYNCLINE): Adjust to unusual GCC outputs. + Reported by R Blake . + +2002-07-09 Akim Demaille + + * data/yacc.c: Output the copyright notive in the header. + +2002-07-03 Akim Demaille + + * src/output.c (froms, tos): Are state_number_t. + (save_column): sp, sp1, and sp2 are state_number_t. + (prepare): Rename `final' as `final_state_number', `nnts' as + `nterms_number', `nrules' as `rules_number', `nstates' as + `states_number', and `ntokens' as `tokens_number'. Remove `nsym', + unused. + * data/yacc.c, data/glr.c, data/lalr1.cc: Adjust. + * data/lalr1.cc (nsym_): Remove, unused. + +2002-07-03 Akim Demaille + + * src/lalr.h, src/lalr.c (goto_number_t): New. + * src/lalr.c (goto_list_t): New. + Propagate them. + * src/nullable.c (rule_list_t): New. + Propagate. + * src/types.h: Remove. + +2002-07-03 Akim Demaille + + * src/closure.c (print_fderives): Use rule_rhs_print. + * src/derives.c (print_derives): Use rule_rhs_print. + (rule_list_t): New, replaces `shorts'. + (set_derives): Add comments. + * tests/sets.at (Nullable, Firsts): Adjust. + +2002-07-03 Akim Demaille + + * src/output.c (prepare_actions): Free `tally' and `width'. + (prepare_actions): Allocate and free `order'. + * src/symtab.c (symbols_free): Free `symbols'. + * src/scan-gram.l (scanner_free): Clear Flex's scanners memory. + * src/output.c (m4_invoke): Move to... + * src/scan-skel.l: here. + (<>): Close yyout, and free its name. + +2002-07-03 Akim Demaille + + Fix some memory leaks, and fix a bug: state 0 was examined twice. + + * src/LR0.c (new_state): Merge into... + (state_list_append): this. + (new_states): Merge into... + (generate_states): here. + (set_states): Don't ensure a proper `errs' state member here, do it... + * src/conflicts.c (conflicts_solve): here. + * src/state.h, src/state.c: Comment changes. + (state_t): Rename member `shifts' as `transitions'. + Adjust all dependencies. + (errs_new): For consistency, also take the values as argument. + (errs_dup): Remove. + (state_errs_set): New. + (state_reductions_set, state_transitions_set): Assert that no + previous value was assigned. + (state_free): New. + (states_free): Use it. + * src/conflicts.c (resolve_sr_conflict): Don't use an `errs_t' as + temporary storage: use `errs' and `nerrs' as elsewhere. + (set_conflicts): Allocate and free this `errs'. + +2002-07-02 Akim Demaille + + * lib/libiberty.h: New. + * lib: Update the bitset implementation from upstream. + * src/closure.c, src/lalr.c, src/output.c, src/print_graph.c, + * src/state.c: Use BITSET_FOR_EACH, not BITSET_EXECUTE. + * src/main.c: Adjust bitset stats calls. + +2002-07-01 Paul Eggert + + * src/scan-gram.l (): Convert to unsigned + char, so that negative chars don't collide with $. + +2002-06-30 Akim Demaille + + Have the GLR tests be `warning' checked, and fix the warnings. + + * data/glr.c (YYFPRINTF): Always define it, not only when YYDEBUG + (yyuserAction, yyreportAmbiguity): `Use' all the arguments. + (yyremoveDeletes): `yyi' and `yyj' are size_t. + Use YYFPRINTF when under if (YYDEBUG) to avoid empty `if' bodies. + (yyaddDeferredAction): static. + (yyglrReduce): yyi, yyk, amd yyposn are size_t. + (yyreportParseError): yyprefix is const. + yytokenp is used only when verbose. + (yy__GNUC__): Replace with __GNUC__. + (yypdumpstack): yyi is size_t. + (yypreference): Un-yy local variables and arguments, to avoid + clashes with `yyr1'. Anyway, we are not in the user name space. + (yytname_size): be an int, as is compared with ints. + * tests/testsuite.at (AT_COMPILE, AT_PARSER_CHECK): New. + Use them. + * tests/cxx-gram.at: Use quotation to protect $1. + Use AT_COMPILE to enable warnings hunts. + Prototype yylex and yyerror. + `Use' argc. + Include `string.h', not `strings.h'. + Produce and prototype stmtMerge only when used. + yylex takes a location. + +2002-06-30 Akim Demaille + + We spend a lot of time in quotearg, in particular when --verbose. + + * src/symtab.c (symbol_get): Store a quoted version of the key. + (symbol_tag_get, symbol_tag_get_n, symbol_tag_print): Remove. + Adjust all callers. + +2002-06-30 Akim Demaille + + * src/state.h (reductions_t): Rename member `nreds' as num. + (errs_t): Rename members `nerrs' and `errs' as `num' and `symbols'. + * src/state.c (ERRS_ALLOC, REDUCTIONS_ALLOC): Use the correct types. + +2002-06-30 Akim Demaille + + * src/state.h, src/state.c (shift_t, SHIFT_SYMBOL, SHIFT_IS_SHIFT) + (SHIFT_IS_GOTO, SHIFT_IS_ERROR, SHIFT_DISABLE, SHIFT_IS_DISABLED) + (shifts_to): Rename as... + (transition_t, TRANSITION_SYMBOL, TRANSITION_IS_TRANSITION) + (TRANSITION_IS_GOTO, TRANSITION_IS_ERROR, TRANSITION_DISABLE) + (TRANSITION_IS_DISABLED, transitions_to): these. + +2002-06-30 Akim Demaille + + * src/print.c (print_shifts, print_gotos): Merge into... + (print_transitions): this. + (print_transitions, print_errs, print_reductions): Align the + lookaheads columns. + (print_core, print_transitions, print_errs, print_state, + print_grammar): Output empty lines separator before, not after. + (state_default_rule_compute): Rename as... + (state_default_rule): this. + * tests/conflicts.at (Defaulted Conflicted Reduction), + (Unresolved SR Conflicts, Resolved SR Conflicts): Adjust. + * tests/regression.at (Rule Line Numbers, Web2c Report): Adjust. + +2002-06-30 Akim Demaille + + Display items as we display rules. + + * src/gram.h, src/gram.c (rule_lhs_print): New. + * src/gram.c (grammar_rules_partial_print): Use it. + * src/print.c (print_core): Likewise. + * tests/conflicts.at (Defaulted Conflicted Reduction), + (Unresolved SR Conflicts): Adjust. + (Unresolved SR Conflicts): Adjust and rename as... + (Resolved SR Conflicts): this, as was meant. + * tests/regression.at (Web2c Report): Adjust. + +2002-06-30 Akim Demaille + + * src/print.c (state_default_rule_compute): New, extracted from... + (print_reductions): here. + Pessimize, but clarify the code. + * tests/conflicts.at (Defaulted Conflicted Reduction): New. + +2002-06-30 Akim Demaille + + * src/output.c (action_row): Let default_rule be always a rule + number. + +2002-06-30 Akim Demaille + + * src/closure.c (print_firsts, print_fderives, closure): + Use BITSET_EXECUTE. + * src/lalr.c (lookaheads_print): Likewise. + * src/state.c (state_rule_lookaheads_print): Likewise. + * src/print_graph.c (print_core): Likewise. + * src/print.c (print_reductions): Likewise. + * src/output.c (action_row): Likewise. + Use SHIFT_IS_DISABLED, SHIFT_IS_SHIFT and SHIFT_SYMBOL. + +2002-06-30 Akim Demaille + + * src/print_graph.c: Use report_flag. + +2002-06-30 Akim Demaille + + * src/lalr.c (traverse, digraph, matrix_print, transpose): Move + to... + * src/relation.h, src/relation.c (traverse, relation_digraph) + (relation_print, relation_transpose): New. + +2002-06-30 Akim Demaille + + * src/state.h, src/state.c (shifts_to): New. + * src/lalr.c (build_relations): Use it. + +2002-06-30 Akim Demaille + + * src/gram.h (rule_number_t, RULE_NUMBER_MAX, int_of_rule_number) + (item_number_of_rule_number, rule_number_of_item_number): New. + * src/LR0.c, src/closure.c, src/derives.c, src/derives.h, + * src/gram.c, src/lalr.c, src/nullable.c, src/output.c, src/print.c, + * src/print_graph.c, src/reader.c, src/reduce.c, src/reduce.h: + Propagate their use. + Much remains to be done, in particular wrt `shorts' from types.h. + +2002-06-30 Akim Demaille + + * src/symtab.c (symbol_new): Initialize the `printer' member. + +2002-06-30 Akim Demaille + + * src/LR0.c (save_reductions): Remove, replaced by... + * src/state.h, src/state.c (state_reductions_set): New. + (reductions, errs): Rename as... + (reductions_t, errs_t): these. + Adjust all dependencies. + +2002-06-30 Akim Demaille + + * src/LR0.c (state_list_t, state_list_append): New. + (first_state, last_state): Now symbol_list_t. + (this_state): Remove. + (new_itemsets, append_states, save_reductions): Take a state_t as + argument. + (set_states, generate_states): Adjust. + (save_shifts): Remove, replaced by... + * src/state.h, src/state.c (state_shifts_set): New. + (shifts): Rename as... + (shifts_t): this. + Adjust all dependencies. + * src/state.h (state_t): Remove the `next' member. + +2002-06-30 Akim Demaille + + * src/vcg.c (quote): Use slot 2, since we often pass symbol tag + escaped in slot 0. + +2002-06-30 Akim Demaille + + Use hash.h for the state hash table. + + * src/LR0.c (STATE_HASH_SIZE, state_hash): Remove. + (allocate_storage): Use state_hash_new. + (free_storage): Use state_hash_free. + (new_state, get_state): Adjust. + * src/lalr.h, src/lalr.c (states): Move to... + * src/states.h (state_t): Remove the `link' member, no longer + used. + * src/states.h, src/states.c: here. + (state_hash_new, state_hash_free, state_hash_lookup) + (state_hash_insert, states_free): New. + * src/states.c (state_table, state_compare, state_hash): New. + * src/output.c (output_actions): Do not free states now, since we + still need to know the final_state number in `prepare', called + afterwards. Do it... + * src/main.c (main): here: call states_free after `output'. + +2002-06-30 Akim Demaille + + * src/state.h, src/state.c (state_new): New, extracted from... + * src/LR0.c (new_state): here. + * src/state.h (STATE_ALLOC): Move to... + * src/state.c: here. + * src/LR0.h, src/LR0.c (nstates, final_state): Move to... + * src/state.h, src/state.c: here. + +2002-06-30 Akim Demaille + + * src/reader.c (gensym): Rename as... + * src/symtab.h, src/symtab.c (dummy_symbol_get): this. + (getsym): Rename as... + (symbol_get): this. + +2002-06-30 Akim Demaille + + * src/state.h (state_number_t, STATE_NUMBER_MAX): New. + * src/LR0.c, src/LR0.h, src/conflicts.c, src/lalr.c, src/lalr.h, + * src/output.c, src/print.c, src/print_graph.c: Propagate. + * src/LR0.h, src/LR0.h (final_state): Is a state_t*. + +2002-06-30 Akim Demaille + + Make the test suite pass with warnings checked. + + * tests/actions.at (Printers and Destructors): Improve. + Avoid unsigned vs. signed issues. + * tests/calc.at: Don't exercise the scanner here, do it... + * tests/input.at (Torturing the Scanner): here. + +2002-06-28 Paul Hilfinger + + * data/glr.c: Correct typo in Emacs-mode directive. Slightly + reorganize first lines parallel to yacc.c. + +2002-06-28 Akim Demaille + + * data/c.m4 (b4_copyright, b4_sint_type, b4_uint_type, b4_token_define) + (b4_token_enum, b4_token_defines): New, factored from... + * data/lalr1.cc, data/yacc.c, glr.c: here. + +2002-06-28 Akim Demaille + + * data/yacc.c (yydestruct, yysymprint): Pacify GCC warnings for + unused variables. + * src/output.c (merger_output): static. + +2002-06-28 Akim Demaille + + * src/reader.h: s/grammer_current_rule_merge_set/grammar_.../. + * src/conflicts.c (conflicts_total_count): `i' is unsigned, to + pacify GCC. + * src/output.c (save_row): Initialize all the variables to pacify GCC. + +2002-06-27 Paul Hilfinger + + Accumulated changelog for new GLR parsing features. + + * src/conflicts.c (count_total_conflicts): Change name to + conflicts_total_count. + * src/conflicts.h: Ditto. + * src/output.c (token_actions): Use the new name. + (output_conflicts): Change conflp => conflict_list_heads, and + confl => conflict_list for better readability. + * data/glr.c: Use the new names. + * NEWS: Add self to GLR announcement. + + * src/reader.c (free_merger_functions): Cleanup: XFREE->free. + + * doc/bison.texinfo (GLR Parsers): Make corrections suggested by + Akim Demaille. + + * data/bison.glr: Change name to glr.c + * data/glr.c: Renamed from bison.glr. + * data/Makefile.am: Add glr.c + + * src/getargs.c: + + * src/symlist.h: Add dprec and merger fields to symbol_list_s. + * src/symlist.c (symbol_list_new): Initialize dprec and merger fields. + + Originally 2002-06-16 Paul Hilfinger + + * data/bison.glr: Be sure to restore the + current #line when returning to the skeleton contents after having + exposed the input file's #line. + + Originally 2002-06-13 Paul Hilfinger + + * data/bison.glr: Bring up to date with changes to bison.simple. + + Originally 2002-06-03 Paul Hilfinger + + * data/bison.glr: Correct definitions that use b4_prefix. + Various reformatting. + (GLRStack): Make yychar (in YYPURE case) and yytokenp as part of stack. + (yyreportParseError, yyrecoverParseError, yyprocessOneStack): remove + yytokenp argument; now part of stack. + (yychar): Define to behave as documented. + (yyclearin): Ditto. + + Originally 2002-05-14 Paul Hilfinger + + * src/reader.h: Add declaration for free_merger_functions. + + * src/reader.c (merge_functions): New variable. + (get_merge_function): New function. + (free_merger_functions): New function. + (readgram): Check for %prec that is not followed by a symbol. + Handle %dprec and %merge declarations. + (packgram): Initialize dprec and merger fields in rules array. + + * src/output.c (conflict_tos, conflrow, conflict_table, conflict_list, + conflict_list_cnt, conflict_list_free): New variables. + (table_grow): Also grow conflict_table. + (prepare_rules): Output dprec and merger tables. + (conflict_row): New function. + (action_row): Output conflict lists for GLR parser. Don't use + default reduction in conflicted states for GLR parser so that there + are spaces for the conflict lists. + (save_row): Also save conflict information. + (token_actions): Allocate conflict list. + (merger_output): New function. + (pack_vector): Pack conflict table, too. + (output_conflicts): New function to output yyconflp and yyconfl. + (output_check): Allocate conflict_tos. + (output_actions): Output conflict tables, also. + (output_skeleton): Output b4_mergers definition. + (prepare): Output b4_max_rhs_length definition. + Use 'bison.glr' as default skeleton for GLR parsers. + + * src/gram.c (glr_parser): New flag. + (grammar_free): Call free_merger_functions. + + * src/conflicts.c (count_rr_conflicts): Augment to optionally count + all pairs of conflicting reductions, rather than just all tokens + causing conflicts. Needed to size conflict tables. + (conflicts_output): Modify call to count_rr_conflicts for new + interface. + (conflicts_print): Ditto. + (count_total_conflicts): New function. + + * src/reader.h (merger_list): New type. + (merge_functions): New variable. + + * src/lex.h (tok_dprec, tok_merge): New token types. + + * src/gram.h (rule_s): Add dprec and merger fields. + (glr_parser): New flag. + + * src/conflicts.h (count_total_conflicts): New function. + + * src/options.c (option_table): Add %dprec, %merge, and %glr-parser. + + * doc/bison.texinfo (Generalized LR Parsing): New section. + (GLR Parsers): New section. + (Language and Grammar): Mention GLR parsing. + (Table of Symbols): Add %dprec, %glr-parser, %merge, GLR + Correct typo ("tge" -> "the"). + + * data/bison.glr: New skeleton for GLR parsing. + + * tests/cxx-gram.at: New tests for GLR parsing. + + * tests/testsuite.at: Include cxx-gram.at. + + * tests/Makefile.am: Add cxx-gram.at. + + * src/parse-gram.y: + + * src/scan-gram.l: Add %dprec, %glr-parser, %merge. + + * src/parse-gram.y: Grammar for %dprec, %merge, %glr-parser. + +2002-06-27 Akim Demaille + + * src/options.h, src/options.c: Remove. + * src/getargs.c (short_options, long_options): New. + +2002-06-27 Akim Demaille + + * data/bison.simple, data/bison.c++: Rename as... + * data/yacc.c, data/lalr1.cc: these. + * doc/bison.texinfo (Environment Variables): Remove. + +2002-06-25 Raja R Harinath + + * src/getargs.c (report_argmatch): Initialize strtok(). + +2002-06-20 Akim Demaille + + * data/bison.simple (b4_symbol_actions): New, replaces... + (b4_symbol_destructor, b4_symbol_printer): these. + (yysymprint): Be sure to call YYPRINT only for tokens, and using + user token numbers. + +2002-06-20 Akim Demaille + + * data/bison.simple (yydestructor): Rename as... + (yydestruct): this. + +2002-06-20 Akim Demaille + + * src/symtab.h, src/symtab.c (symbol_type_set) + (symbol_destructor_set, symbol_precedence_set): The location is + the last argument. + Adjust all callers. + +2002-06-20 Akim Demaille + + * src/parse-gram.y (YYPRINT, yyprint): Don't mess with the parser + internals. + * src/reader.h, src/reader.c (grammar_current_rule_prec_set): + Takes a location. + * src/symtab.h, src/symtab.c (symbol_class_set) + (symbol_user_token_number_set): Likewise. + Adjust all callers. + Promote complain_at. + * tests/input.at (Type Clashes): Adjust. + +2002-06-20 Akim Demaille + + * data/bison.simple (YYLEX): Fix the declaration when + %pure-parser. + +2002-06-20 Akim Demaille + + * data/bison.simple (yysymprint): Don't print the token number, + just its name. + * tests/actions.at (Destructors): Rename as... + (Printers and Destructors): this. + Also exercise %printer. + +2002-06-20 Akim Demaille + + * data/bison.simple (YYDSYMPRINT): New. + Use it to remove many of the #if YYDEBUG/if (yydebug). + +2002-06-20 Akim Demaille + + * src/symtab.h, src/symtab.c (symbol_t): printer and + printer_location are new members. + (symbol_printer_set): New. + * src/parse-gram.y (PERCENT_PRINTER): New token. + Handle its associated rule. + * src/scan-gram.l: Adjust. + (handle_destructor_at, handle_destructor_dollar): Rename as... + (handle_symbol_code_at, handle_symbol_code_dollar): these. + * src/output.c (symbol_printers_output): New. + (output_skeleton): Call it. + * data/bison.simple (yysymprint): New. Cannot be named yyprint + since there are already many grammar files with a user `yyprint'. + Replace the calls to YYPRINT to calls to yysymprint. + * tests/calc.at: Adjust. + * tests/torture.at (AT_DATA_STACK_TORTURE): Remove YYPRINT: it was + taking advantage of parser very internal details (stack size!). + +2002-06-20 Akim Demaille + + * src/scan-gram.l: Complete the scanner with the missing patterns + to pacify Flex. + Use `quote' and `symbol_tag_get' where appropriate. + +2002-06-19 Akim Demaille + + * tests/actions.at (Destructors): Augment to test locations. + * data/bison.simple (yydestructor): Pass it the current location + if locations are enabled. + Prototype only when __STDC__ or C++. + Change the argument names to move into the yy name space: there is + user code here. + +2002-06-19 Akim Demaille + + * data/bison.simple (b4_pure_if): New. + Use it instead of #ifdef YYPURE. + +2002-06-19 Akim Demaille + + * data/bison.simple (b4_location_if): New. + Use it instead of #ifdef YYLSP_NEEDED. + +2002-06-19 Akim Demaille + + Prepare @$ in %destructor, but currently don't bind it in the + skeleton, as %location use is not cleaned up yet. + + * src/scan-gram.l (handle_dollar, handle_destructor_at) + (handle_action_at): New. + (handle_at, handle_action_dollar, handle_destructor_dollar): Take + a braced_code_t and a location as additional arguments. + (handle_destructor_dollar): Instead of requiring `b4_eval', just + unquote one when outputting `b4_dollar_dollar'. + Adjust callers. + * data/bison.simple (b4_eval): Remove. + (b4_symbol_destructor): Adjust. + * tests/input.at (Invalid @n): Adjust. + +2002-06-19 Zack Weinberg + + * doc/bison.texinfo: Document ability to have multiple + prologue sections. + +2002-06-18 Akim Demaille + + * src/files.c (compute_base_names): When computing the output file + names from the input file name, strip the directory part. + +2002-06-18 Akim Demaille + + * data/bison.simple.new: Comment changes. + Reported by Andreas Schwab. + +2002-06-18 Matt Kraai + + * data/bison.simple (yyoverflowlab): #ifndef yyoverflow, so that + there are no `label `yyoverflowlab' defined but not used' warnings + when yyoverflow is defined. + +2002-06-18 Akim Demaille + + * src/symtab.h, src/symtab.c (symbol_t): destructor_location is a + new member. + (symbol_destructor_set): Adjust. + * src/output.c (symbol_destructors_output): Output the destructor + locations. + Output the symbol name. + * data/bison.simple (b4_symbol_destructor): Adjust. + +2002-06-18 Cris Bailiff + and Akim Demaille + + * data/bison.simple.new (yyerrlab1): Be sure to pop and destroy + what's left on the stack when the error recovery hits EOF. + * tests/actions.at (Destructors): Complete to exercise this case. + +2002-06-17 Akim Demaille + + * data/m4sugar/m4sugar.m4 (m4_map): Recognize when the list of + arguments is really empty, not only equal to `[]'. + * src/symtab.h, src/symtab.c (symbol_t): `destructor' is a new + member. + (symbol_destructor_set): New. + * src/output.c (symbol_destructors_output): New. + * src/reader.h (brace_code_t, current_braced_code): New. + * src/scan-gram.l (BRACED_CODE): Use it to branch on... + (handle_dollar): Rename as... + (handle_action_dollar): this. + (handle_destructor_dollar): New. + * src/parse-gram.y (PERCENT_DESTRUCTOR): New. + (grammar_declaration): Use it. + * data/bison.simple (yystos): Is always defined. + (yydestructor): New. + * tests/actions.at (Destructors): New. + * tests/calc.at (_AT_CHECK_CALC_ERROR): Don't rely on egrep. + +2002-06-17 Akim Demaille + + * src/symlist.h, src/symlist.c (symbol_list_length): New. + * src/scan-gram.l (handle_dollar, handle_at): Compute the + rule_length only when needed. + * src/output.c (actions_output, token_definitions_output): Output + the full M4 block. + * src/symtab.c: Don't access directly to the symbol tag, use + symbol_tag_get. + * src/parse-gram.y: Use symbol_list_free. + +2002-06-17 Akim Demaille + + * src/reader.h, src/reader.c (symbol_list, symbol_list_new) + (symbol_list_prepend, get_type_name): Move to... + * src/symlist.h, src/symlist.c (symbol_list_t, symbol_list_new) + (symbol_list_prepend, symbol_list_n_type_name_get): here. + Adjust all callers. + (symbol_list_free): New. + * src/scan-gram.l (handle_dollar): Takes a location. + * tests/input.at (Invalid $n): Adjust. + +2002-06-17 Akim Demaille + + * src/reader.h, src/reader.c (symbol_list_new): Export it. + (symbol_list_prepend): New. + * src/parse-gram.y (%union): `list' is a new member. + (symbols.1): New, replaces... + (terms_to_prec.1, nterms_to_type.1): these. + * src/symtab.h, src/symtab.c (symbol_type_set, symbol_precedence_set) + Take a location as additional argument. + Adjust all callers. + +2002-06-15 Akim Demaille + + * src/parse-gram.y: Move %token in the declaration section so that + we don't depend upon CVS Bison. + +2002-06-15 Akim Demaille + + * src/state.h, src/state.c (state_rule_lookaheads_print): New. + * src/print.c (print_core): Use it. + +2002-06-15 Akim Demaille + + * src/conflicts.c (log_resolution): Accept the rule involved in + the sr conflicts instead of the lookahead number that points to + that rule. + (flush_reduce): Accept the current lookahead vector as argument, + instead of the index in LA. + (resolve_sr_conflict): Accept the current number of lookahead + bitset to consider for the STATE, instead of the index in LA. + (set_conflicts): Adjust. + * src/lalr.c, src/lalr.h, src/state.h: Comment changes. + +2002-06-15 Akim Demaille + + * src/state.h (state_t): Replace the `lookaheadsp' member, a + short, with `lookaheads' (bitsetv), `lookaheads_rule' (rule_t**). + Adjust all dependencies. + * src/lalr.c (initialize_lookaheads): Split into... + (states_lookaheads_count, states_lookaheads_initialize): these. + (lalr): Adjust. + +2002-06-15 Akim Demaille + + * src/gram.h, src/gram.c (grammar_rules_partial_print): New, eved + out of... + (grammar_rules_print): here. + * src/reduce.c (reduce_output): Use it. + * tests/reduce.at (Useless Rules, Reduced Automaton) + (Underivable Rules): Adjust. + +2002-06-15 Akim Demaille + + Copy BYacc's nice way to report the grammar. + + * src/gram.h, src/gram.c (grammar_rhs_print, grammar_rules_print): + New. + Don't print the rules' location, it is confusing and useless. + (rule_print): Use grammar_rhs_print. + * src/print.c (print_grammar): Use grammar_rules_print. + +2002-06-15 Akim Demaille + + Complete and rationalize `useless thing' warnings. + + * src/symtab.h, src/symtab.c (symbol_tag_get, symbol_tag_get_n) + (symbol_tag_print): New. + Use them everywhere in place of accessing directly the tag member. + * src/gram.h, src/gram.c (rule_print): New. + Use it where a rule used to be printed `by hand'. + * src/reduce.c (nonterminals_reduce): Report the use nonterminals. + (reduce_grammar_tables): Report the useless rules. + (reduce_print): Useless things are a warning, not an error. + Report it as such. + * tests/reduce.at (Useless Nonterminals, Useless Rules): + (Reduced Automaton, Underivable Rules): Adjust. + * tests/regression.at (Web2c Report, Web2c Report): Adjust. + * tests/conflicts.at (Unresolved SR Conflicts) + (Solved SR Conflicts): Adjust. + +2002-06-15 Akim Demaille + + Let symbols have a location. + + * src/symtab.h, src/symtab.c (symbol_t): Location is a new member. + (getsym): Adjust. + Adjust all callers. + * src/complain.h, src/complain.c (complain_at, fatal_at, warn_at): + Use location_t, not int. + * src/symtab.c (symbol_check_defined): Take advantage of the + location. + * tests/regression.at (Invalid inputs): Adjust. + +2002-06-15 Akim Demaille + + * src/parse-gram.y (YYLLOC_DEFAULT, current_lhs_location): New. + (input): Don't try to initialize yylloc here, do it in the + scanner. + * src/scan-gram.l (YY_USER_INIT): Initialize yylloc. + * src/gram.h (rule_t): Change line and action_line into location + and action_location, of location_t type. + Adjust all dependencies. + * src/location.h, src/location.c (empty_location): New. + * src/reader.h, src/reader.c (grammar_start_symbol_set) + (grammar_symbol_append, grammar_rule_begin, grammar_rule_end) + (grammar_current_rule_symbol_append) + (grammar_current_rule_action_append): Expect a location as argument. + * src/reader.c (grammar_midrule_action): Adjust to attach an + action's location as dummy symbol location. + * src/symtab.h, src/symtab.c (startsymbol_location): New. + * tests/regression.at (Web2c Report, Rule Line Numbers): Adjust + the line numbers. + +2002-06-14 Akim Demaille + + Grammar declarations may be found in the grammar section. + + * src/parse-gram.y (rules_or_grammar_declaration): New. + (declarations): Each declaration may end with a semicolon, not + just... + (grammar_declaration): `"%union"'. + (grammar): Branch to rules_or_grammar_declaration. + +2002-06-14 Akim Demaille + + * src/main.c (main): Invoke scanner_free. + +2002-06-14 Akim Demaille + + * src/output.c (m4_invoke): Extracted from... + (output_skeleton): here. + Free tempfile. + +2002-06-14 Akim Demaille + + * src/parse-gram.y (directives, directive, gram) + (grammar_directives, precedence_directives, precedence_directive): + Rename as... + (declarations, declaration, grammar, grammar_declaration) + (precedence_declaration, precedence_declarator): these. + (symbol_declaration): New. + +2002-06-14 Akim Demaille + + * src/files.c (action_obstack): Remove, unused. + (output_obstack): Remove it, and all its dependencies, as it is no + longer needed. + * src/reader.c (epilogue_set): Build the epilogue in the + muscle_obstack. + * src/output.h, src/output.c (muscle_obstack): Move to... + * src/muscle_tab.h, src/muscle_tab.h: here. + (muscle_init): Initialize muscle_obstack. + (muscle_free): New. + * src/main.c (main): Call it. + +2002-06-14 Akim Demaille + + * src/location.h: New, extracted from... + * src/reader.h: here. + * src/Makefile.am (noinst_HEADERS): Merge into + (bison_SOURCES): this. + Add location.h. + * src/parse-gram.y: Use location_t instead of Bison's. + * src/reader.h, src/reader.c (prologue_augment, epilogue_set): + Use location_t instead of ints. + +2002-06-14 Akim Demaille + + * data/bison.simple, data/bison.c++: Be sure to restore the + current #line when returning to the skeleton contents after having + exposed the input file's #line. + +2002-06-12 Akim Demaille + + * src/scan-gram.l (SC_BRACED_CODE): Don't use `<.*>', it is too + eager. + * tests/actions.at (Exotic Dollars): New. + +2002-06-12 Akim Demaille + + * src/scan-gram.l (SC_PROLOGUE): Don't eat characters amongst + ['"/] too eagerly. + * tests/input.at (Torturing the Scanner): New. + +2002-06-11 Akim Demaille + + * src/scan-gram.l (YY_OBS_INIT): Remove, replace with... + [SC_COMMENT,SC_STRING,SC_CHARACTER,SC_BRACED_CODE,SC_PROLOGUE] + [SC_EPILOGUE]: Output the quadrigraphs only when not in a comment. + * src/reader.h, src/scan-gram.l (scanner_initialize): this. + * src/reader.c (reader): Use it. + +2002-06-11 Akim Demaille + + * src/scan-gram.l (YY_OBS_FINISH): Don't set yylval. + Adjust all callers. + (scanner_last_string_free): New. + +2002-06-11 Akim Demaille + + * src/scan-gram.l (YY_INIT, YY_GROW, YY_FINISH): Rename as... + (YY_OBS_INIT, YY_OBS_GROW, YY_OBS_FINISH): these. + (last_string, YY_OBS_FREE): New. + Use them when returning an ID. + +2002-06-11 Akim Demaille + + Have Bison grammars parsed by a Bison grammar. + + * src/reader.c, src/reader.h (prologue_augment): New. + * src/reader.c (copy_definition): Remove. + + * src/reader.h, src/reader.c (gram_start_symbol_set, prologue_augment) + (grammar_symbol_append, grammar_rule_begin, grammar_midrule_action) + (grammar_current_rule_prec_set, grammar_current_rule_check) + (grammar_current_rule_symbol_append) + (grammar_current_rule_action_append): Export. + * src/parse-gram.y (symbol_list_new, symbol_list_symbol_append_ + (symbol_list_action_append): Remove. + Hook the routines from reader. + * src/scan-gram.l: In INITIAL, characters and strings are tokens. + * src/system.h (ATTRIBUTE_NORETURN, ATTRIBUTE_UNUSED): Now. + + * src/reader.c (read_declarations): Remove, unused. + + * src/parse-gram.y: Handle the epilogue. + * src/reader.h, src/reader.c (gram_start_symbol_set): Rename as... + (grammar_start_symbol_set): this. + * src/scan-gram.l: Be sure to ``use'' yycontrol to keep GCC quiet. + * src/reader.c (readgram): Remove, unused. + (reader): Adjust to insert eoftoken and axiom where appropriate. + + * src/reader.c (copy_dollar): Replace with... + * src/scan-gram.h (handle_dollar): this. + * src/parse-gram.y: Remove `%thong'. + + * src/reader.c (copy_at): Replace with... + * src/scan-gram.h (handle_at): this. + + * src/complain.h, src/complain.c (warn_at, complain_at, fatal_at): + New. + + * src/scan-gram.l (YY_LINES): Keep lineno synchronized for the + time being. + + * src/reader.h, src/reader.c (grammar_rule_end): New. + + * src/parse.y (current_type, current_class): New. + Implement `%nterm', `%token' support. + Merge `%term' into `%token'. + (string_as_id): New. + * src/symtab.h, src/symtab.c (symbol_make_alias): Don't pass the + type name. + + * src/parse-gram.y: Be sure to handle properly the beginning of + rules. + + * src/parse-gram.y: Handle %type. + * src/reader.c (grammar_rule_end): Call grammar_current_rule_check. + + * src/parse-gram.y: More directives support. + * src/options.c: No longer handle source directives. + + * src/parse-gram.y: Fix %output. + + * src/parse-gram.y: Handle %union. + Use the prologue locations. + * src/reader.c (parse_union_decl): Remove. + + * src/reader.h, src/reader.c (epilogue_set): New. + * src/parse-gram.y: Use it. + + * data/bison.simple, data/bison.c++: b4_stype is now either not + defined, then default to int, or to the contents of %union, + without `union' itself. + Adjust. + * src/muscle_tab.c (muscle_init): Don't predefine `stype'. + + * src/output.c (actions_output): Don't output braces, as they are + already handled by the scanner. + + * src/scan-gram.l (SC_CHARACTER): Set the user_token_number of + characters to themselves. + + * tests/reduce.at (Reduced Automaton): End the grammars with %% so + that the epilogue has a proper #line. + + * src/parse-gram.y: Handle precedence/associativity. + + * src/symtab.c (symbol_precedence_set): Requires the symbol to be + a terminal. + * src/scan-gram.l (SC_BRACED_CODE): Catch strings and characters. + * tests/calc.at: Do not use `%token "foo"' as it makes not sense + at all to define terminals that cannot be emitted. + + * src/scan-gram.l: Escape M4 characters. + + * src/scan-gram.l: Working properly with escapes in user + strings/characters. + + * tests/torture.at (AT_DATA_TRIANGULAR_GRAMMAR) + (AT_DATA_HORIZONTAL_GRAMMAR): Respect the `%token ID NUM STRING' + grammar. + Use more modest sizes, as for the time being the parser does not + release memory, and therefore the process swallows a huge amount + of memory. + + * tests/torture.at (AT_DATA_LOOKAHEADS_GRAMMAR): Adjust to the + stricter %token grammar. + + * src/symtab.h (associativity): Add `undef_assoc'. + (symbol_precedence_set): Do nothing when passed an undef_assoc. + * src/symtab.c (symbol_check_alias_consistence): Adjust. + + * tests/regression.at (Invalid %directive): Remove, as it is now + meaningless. + (Invalid inputs): Adjust to the new error messages. + (Token definitions): The new grammar doesn't allow too many + eccentricities. + + * src/lex.h, src/lex.c: Remove. + * src/reader.c (lastprec, skip_to_char, read_signed_integer) + (copy_character, copy_string2, copy_string, copy_identifier) + (copy_comment, parse_token_decl, parse_type_decl, parse_assoc_decl) + (parse_muscle_decl, parse_dquoted_param, parse_skel_decl) + (parse_action): Remove. + * po/POTFILES.in: Adjust. + +2002-06-11 Akim Demaille + + * src/reader.c (parse_action): Don't store directly into the + rule's action member: return the action as a string. + Don't require `rule_length' as an argument: compute it. + (grammar_current_rule_symbol_append) + (grammar_current_rule_action_append): New, eved out from + (readgram): here. + Remove `action_flag', `rulelength', unused now. + +2002-06-11 Akim Demaille + + * src/reader.c (grammar_current_rule_prec_set). + (grammar_current_rule_check): New, eved out from... + (readgram): here. + Remove `xaction', `first_rhs': useless. + * tests/input.at (Type clashes): New. + * tests/existing.at (GNU Cim Grammar): Adjust. + +2002-06-11 Akim Demaille + + * src/reader.c (grammar_midrule_action): New, Eved out from + (readgram): here. + +2002-06-11 Akim Demaille + + * src/reader.c (grammar_rule_begin, previous_rule, current_rule): + New. + (readgram): Use them as replacement of inlined code, crule and + crule1. + +2002-06-11 Akim Demaille + + * src/reader.c (grammar_end, grammar_symbol_append): New. + (readgram): Use them. + Make the use of `p' as local as possible. + +2002-06-10 Akim Demaille + + GCJ's parser requires the tokens to be defined before the prologue. + + * data/bison.simple: Output the token definition before the user's + prologue. + * tests/regression.at (Braces parsing, Duplicate string) + (Mixing %token styles): Check the output from bison. + (Early token definitions): New. + +2002-06-10 Akim Demaille + + * src/symtab.c (symbol_user_token_number_set): Don't complain when + assigning twice the same user number to a token, so that we can + use it in... + * src/lex.c (lex): here. + Also use `symbol_class_set' instead of hand written code. + * src/reader.c (parse_assoc_decl): Likewise. + +2002-06-10 Akim Demaille + + * src/symtab.c, src/symtab.c (symbol_class_set) + (symbol_user_token_number_set): New. + * src/reader.c (parse_token_decl): Use them. + Use a switch instead of ifs. + Use a single argument. + +2002-06-10 Akim Demaille + + Remove `%thong' support as it is undocumented, unused, duplicates + `%token's job, and creates useless e-mail traffic with people who + want to know what it is, why it is undocumented, unused, and + duplicates `%token's job. + + * src/reader.c (parse_thong_decl): Remove. + * src/options.c (option_table): Remove "thong". + * src/lex.h (tok_thong): Remove. + +2002-06-10 Akim Demaille + + * src/symtab.c, src/symtab.c (symbol_type_set) + (symbol_precedence_set): New. + * src/reader.c (parse_type_decl, parse_assoc_decl): Use them. + (value_components_used): Remove, unused. + +2002-06-09 Akim Demaille + + Move symbols handling code out of the reader. + + * src/reader.h, src/reader.c (errtoken, undeftoken, eoftoken) + (axiom): Move to... + * src/symtab.h, src/symtab.c: here. + + * src/gram.c (start_symbol): Remove: use startsymbol->number. + * src/reader.c (startval): Rename as... + * src/symtab.h, src/symtab.c (startsymbol): this. + * src/reader.c: Adjust. + + * src/reader.c (symbol_check_defined, symbol_make_alias) + (symbol_check_alias_consistence, symbol_pack, symbol_translation) + (token_translations_init) + Move to... + * src/symtab.c: here. + * src/reader.c (packsymbols): Move to... + * src/symtab.h, src/symtab.c (symbols_pack): here. + * src/symtab.h, src/symtab.c (symbol_make_alias): Takes SYMVAL as + argument. + +2002-06-03 Akim Demaille + + * src/muscle_tab.c (muscle_insert, muscle_find): Declarations, + then statements. + +2002-06-03 Akim Demaille + + * src/muscle_tab.c (muscle_find, muscle_insert): Don't initialize + structs with non literals. + * src/scan-skel.l: never-interactive. + * src/conflicts.c (enum conflict_resolution_e): No trailing + comma. + * src/getargs.c (usage): Split long literal strings. + Reported by Hans Aberg. + +2002-05-28 Akim Demaille + + * data/bison.c++: Use C++ ostreams. + (cdebug_): New member. + +2002-05-28 Akim Demaille + + * src/output.c (output_skeleton): Be sure to allocate enough room + for `/' _and_ for `\0' in full_skeleton. + +2002-05-28 Akim Demaille + + * data/bison.c++: Catch up with bison.simple: + 2002-05-24 Paul Hilfinger + and Paul Eggert : `error' handing. + 2002-05-26 Akim Demaille : stos_, token_number_, + and popping traces. + +2002-05-27 Paul Hilfinger + + * src/output.c (output_skeleton): Put an explicit path in front of + the skeleton file name, rather than relying on the -I directory, + to partially alleviate effects of having a skeleton file lying around + in the current directory. + +2002-05-27 Paul Hilfinger + + * src/conflicts.c (log_resolution): Correct typo: + obstack_printf should be obstack_fgrow1. + +2002-05-26 Akim Demaille + + * src/state.h (state_t): `solved_conflicts' is a new member. + * src/LR0.c (new_state): Set it to 0. + * src/conflicts.h, src/conflicts.c (print_conflicts) + (free_conflicts, solve_conflicts): Rename as... + (conflicts_print, conflicts_free, conflicts_solve): these. + Adjust callers. + * src/conflicts.c (enum conflict_resolution_e) + (solved_conflicts_obstack): New, used by... + (log_resolution): this. + Adjust to attach the conflict resolution to each state. + Complete the description with the precedence/associativity + information. + (resolve_sr_conflict): Adjust. + * src/print.c (print_state): Output its solved_conflicts. + * tests/conflicts.at (Unresolved SR Conflicts) + (Solved SR Conflicts): Exercise --report=all. + +2002-05-26 Akim Demaille + + * src/LR0.c, src/derives.c, src/gram.c, src/gram.h, src/lalr.c, + * src/nullable.c, src/output.c, src/print.c, src/print_graph.c, + * src/reader.c, src/reduce.c, src/state.h, src/symtab.h + (token_number_t, item_number_as_token_number) + (token_number_as_item_number, muscle_insert_token_number_table): + Rename as... + (symbol_number_t, item_number_as_symbol_number) + (symbol_number_as_item_number, muscle_insert_symbol_number_table): + these, since it is more appropriate. + +2002-05-26 Akim Demaille + + * tests/calc.at (AT_CHECK_CALC): Adjust: there are now additional + `Error:' lines. + * data/bison.simple (yystos) [YYDEBUG]: New. + (yyparse) [YYDEBUG]: Display the symbols which are popped during + error recovery. + * tests/regression.at (Web2c Actions): Adjust: yystos is output now. + +2002-05-25 Akim Demaille + + * doc/bison.texinfo (Debugging): Split into... + (Tracing): this new section, its former contents, and... + (Understanding): this new section. + * src/getargs.h, src/getargs.c (verbose_flag): Remove, replaced + by... + (report_flag): this. + Adjust all dependencies. + (report_args, report_types, report_argmatch): New. + (usage, getargs): Report/support -r, --report. + * src/options.h + (struct option_table_struct): Rename as.., + (struct option_table_s): this. + Rename the `set_flag' member to `flag' to match with getopt_long's + struct. + * src/options.c (option_table): Split verbose into an entry for + %verbose, and another for --verbose. + Support --report/-r, so remove -r from the obsolete --raw. + * src/print.c: Attach full item sets and lookaheads reports to + report_flag instead of trace_flag. + * lib/argmatch.h, lib/argmatch.c: New, from Fileutils 4.1. + +2002-05-24 Paul Hilfinger + and Paul Eggert + + * data/bison.simple (yyparse): Correct error handling to conform to + POSIX and yacc. Specifically, after syntax error is discovered, + do not reduce further before shifting the error token. + Clean up the code a bit by removing the labels yyerrdefault, + yyerrhandle, yyerrpop. + * NEWS: Document the above. + +2002-05-20 Paul Hilfinger + + * data/bison.simple (yyr1): Don't use yy_token_number_type as element + type; it isn't always big enough, since it doesn't necessarily + include non-terminals. + (yytranslate): Expand definition of yy_token_number_type, so that + the latter can be removed. + (yy_token_number_type): Remove, only one use. + * data/bison.c++ (r1_): Parallel change to yyr1 in bison.simple--- + don't use TokenNumberType as element type. + + * tests/regression.at: Modify expected output to agree with change + to yyr1 and yytranslate. + +2002-05-13 Florian Krohm + + * src/reader.c (parse_action): Use copy_character instead of + obstack_1grow. + +2002-05-13 Akim Demaille + + * tests/regression.at (Token definitions): Prototype yylex and + yyerror. + +2002-05-12 Paul Hilfinger + + * src/scan-skel.l: Correct off-by-one error in handling of __oline__. + * data/bison.simple (b4_sint_type, b4_uint_type): Correct to reflect + 32-bit arithmetic. + * data/bison.c++ (b4_sint_type, b4_uint_type): Ditto. + +2002-05-07 Akim Demaille + + * tests/synclines.at: Be sure to prototype yylex and yyerror to + avoid GCC warnings. + +2002-05-07 Akim Demaille + + Kill GCC warnings. + + * src/reduce.c (nonterminals_reduce): Don't loop over RITEM: loop + over the RHS of each rule. + * src/gram.h, src/gram.c (nritems): Is `unsigned int', not int. + * src/state.h (state_t): Member `nitems' is unsigned short. + * src/LR0.c (get_state): Adjust. + * src/reader.c (packgram): Likewise. + * src/output.c (GENERATE_MUSCLE_INSERT_TABLE): `max' is of type + `Type'. + (muscle_insert_int_table): Remove, unused. + (prepare_rules): Remove `max'. + +2002-05-06 Akim Demaille + + * src/closure.c (print_firsts): Display of the symbol tags. + (bitmatrix_print): Move to... + * lib/bitsetv-print.h, lib/bitsetv-print.c (bitsetv_matrix_dump): + here. + * tests/sets.at (Nullable, Broken Closure, Firsts): Adjust. + +2002-05-06 Akim Demaille + + * src/muscle_tab.c (muscle_m4_output): Must return TRUE for + hash_do_for_each. + +2002-05-06 Akim Demaille + + * src/LR0.c (new_state, get_state): Instead of using the global + `kernel_size' and `kernel_base', have two new arguments: + `core_size' and `core'. + Adjust callers. + +2002-05-06 Akim Demaille + + * src/reader.c (packgram): No longer end `ritem' with a 0 + sentinel: it is not used. + +2002-05-05 Akim Demaille + + New experimental feature: display the lookaheads in the report and + graph. + + * src/print (print_core): When --trace-flag, display the rules + lookaheads. + * src/print_graph.c (print_core): Likewise. + Swap the arguments. + Adjust caller. + +2002-05-05 Akim Demaille + + * tests/torture.at (Many lookaheads): New test. + +2002-05-05 Akim Demaille + + * src/output.c (GENERATE_OUTPUT_TABLE): Replace with... + (GENERATE_MUSCLE_INSERT_TABLE): this. + (output_int_table, output_unsigned_int_table, output_short_table) + (output_token_number_table, output_item_number_table): Replace with... + (muscle_insert_int_table, muscle_insert_unsigned_int_table) + (muscle_insert_short_table, muscle_insert_token_number_table) + (muscle_insert_item_number_table): these. + Adjust all callers. + (prepare_tokens): Don't free `translations', since... + * src/reader.h, src/reader.c (grammar_free): do it. + Move to... + * src/gram.h, src/gram.c (grammar_free): here. + * data/bison.simple, data/bison.c++: b4_token_number_max is now + b4_translate_max. + +2002-05-05 Akim Demaille + + * src/output.c (output_unsigned_int_table): New. + (prepare_rules): `i' is unsigned. + `prhs', `rline', `r2' are unsigned int. + Rename muscle `rhs_number_max' as `rhs_max'. + Output muscles `prhs_max', `rline_max', and `r2_max'. + Free rline and r1. + * data/bison.simple, data/bison.c++: Adjust to use these muscles + to compute types instead of constant types. + * tests/regression.at (Web2c Actions): Adjust. + +2002-05-04 Akim Demaille + + * src/symtab.h (SALIAS, SUNDEF): Rename as... + (USER_NUMBER_ALIAS, USER_NUMBER_UNDEFINED): these. + Adjust dependencies. + * src/output.c (token_definitions_output): Be sure not to output a + `#define 'a'' when fed with `%token 'a' "a"'. + * tests/regression.at (Token definitions): New. + +2002-05-03 Paul Eggert + + * data/bison.simple (b4_token_defines): Also define YYTOKENTYPE + for K&R C. + +2002-05-03 gettextize + + * Makefile.am (SUBDIRS): Remove intl. + (EXTRA_DIST): Add config/config.rpath. + +2002-05-03 Akim Demaille + + * data/bison.simple (m4_if): Don't output empty enums. + And actually, output valid enum definitions :(. + +2002-05-03 Akim Demaille + + * configure.bat: Remove, completely obsolete. + * Makefile.am (EXTRA_DIST): Adjust. + Don't distribute config.rpath... + * config/Makefile.am (EXTRA_DIST): Do it. + +2002-05-03 Akim Demaille + + * configure.in (GETTEXT_VERSION): New. + Suggested by Bruno Haible for the forthcoming Gettext 0.10.3. + +2002-05-03 Akim Demaille + + * data/bison.simple (b4_token_enum): New. + (b4_token_defines): Use it to output tokens both as #define and + enums. + Suggested by Paul Eggert. + * src/output.c (token_definitions_output): Don't output spurious + white spaces. + +2002-05-03 Akim Demaille + + * data/m4sugar/m4sugar.m4: Update from CVS Autoconf. + +2002-05-02 Robert Anisko + + * data/bison.c++: Adapt expansion of $s and @s to the C++ parser. + Update the stack class, give a try to deque as the default container. + +2002-05-02 Akim Demaille + + * data/bison.simple (yyparse): Do not implement @$ = @1. + (YYLLOC_DEFAULT): Adjust to do it. + * doc/bison.texinfo (Location Default Action): Fix. + +2002-05-02 Akim Demaille + + * src/reader.c (parse_braces): Merge into... + (parse_action): this. + +2002-05-02 Akim Demaille + + * configure.in (ALL_LINGUAS): Remove. + * po/LINGUAS, hr.po: New. + +2002-05-02 Akim Demaille + + Remove the so called hairy (semantic) parsers. + + * src/system.h (EXT_GUARD_C, EXT_STYPE_H): Remove. + * src/gram.h, src/gram.c (semantic_parser): Remove. + (rule_t): Remove the guard and guard_line members. + * src/lex.h (token_t): remove tok_guard. + * src/options.c (option_table): Remove %guard and %semantic_parser + support. + * src/output.c, src/output.h (guards_output): Remove. + (prepare): Adjust. + (token_definitions_output): Don't output the `T' + tokens (???). + (output_skeleton): Don't output the guards. + * src/files.c, src/files.c (attrsfile): Remove. + * src/reader.c (symbol_list): Remove the guard and guard_line + members. + Adjust dependencies. + (parse_guard): Remove. + * data/bison.hairy: Remove. + * doc/bison.texinfo (Environment Variables): Remove occurrences of + BISON_HAIRY. + +2002-05-02 Akim Demaille + + * src/reader.c (copy_at, copy_dollarm parse_braces, parse_action) + (parse_guard): Rename the formal argument `stack_offset' as + `rule_length', which is more readable. + Adjust callers. + (copy_at, copy_dollar): Instead of outputting the hard coded + values of $$, $n and so forth, output invocation to b4_lhs_value, + b4_lhs_location, b4_rhs_value, and b4_rhs_location. + Note: this patch partially drops `semantic-parser' support: it + always does `rule_length - n', where semantic parsers ought to + always use `-n'. + * data/bison.simple, data/bison.c++ (b4_lhs_value) + (b4_lhs_location, b4_rhs_value, and b4_rhs_location: New. + +2002-05-02 Akim Demaille + + * configure.in (AC_INIT): Bump to 1.49b. + (AM_INIT_AUTOMAKE): Short invocation. + +2002-05-02 Akim Demaille + + Version 1.49a. + +2002-05-01 Akim Demaille + + * src/skeleton.h: Remove. + +2002-05-01 Akim Demaille + + * src/skeleton.h: Fix the #endif. + Reported by Magnus Fromreide. + +2002-04-26 Paul Eggert + + * data/bison.simple (YYSTYPE_IS_TRIVIAL, YYLTYPE_IS_TRIVIAL): + Define if we define YYSTYPE and YYLTYPE, respectively. + (YYCOPY): Fix [] quoting problem in the non-GCC case. + +2002-04-25 Robert Anisko + + * src/scan-skel.l: Postprocess quadrigraphs. + + * src/reader.c (copy_character): New function, used to output + single characters while replacing `[' and `]' with quadrigraphs, to + avoid troubles with M4 quotes. + (copy_comment): Output characters with copy_character. + (read_additionnal_code): Likewise. + (copy_string2): Likewise. + (copy_definition): Likewise. + + * tests/calc.at: Exercise M4 quoting. + +2002-04-25 Akim Demaille + + * tests/sets.at (AT_EXTRACT_SETS): Sed portability issue: no space + between `!' and the command. + Reported by Paul Eggert. + +2002-04-24 Robert Anisko + + * tests/calc.at: Exercise prologue splitting. + + * data/bison.simple, data/bison.c++: Use `b4_pre_prologue' and + `b4_post_prologue' instead of `b4_prologue'. + + * src/output.c (prepare): Add the `pre_prologue' and `post_prologue' + muscles. + (output): Free pre_prologue_obstack and post_prologue_obstack. + * src/files.h, src/files.c (attrs_obstack): Remove. + (pre_prologue_obstack, post_prologue_obstack): New. + * src/reader.c (copy_definition): Add a parameter to specify the + obstack to fill, instead of using attrs_obstack unconditionally. + (read_declarations): Pass pre_prologue_obstack to copy_definition if + `%union' has not yet been seen, pass post_prologue_obstack otherwise. + +2002-04-23 Paul Eggert + + * data/bison.simple: Remove unnecessary commentary and white + space differences from 1_29-branch. + Depend on YYERROR_VERBOSE, not defined (YYERROR_VERBOSE). + + (union yyalloc, YYSTACK_GAP_MAX, YYSTACK_BYTES, YYCOPY, + YYSTACK_RELOCATE): Do not define if yyoverflow is defined, or + if this is a C++ parser and YYSTYPE or YYLTYPE has nontrivial + constructors or destructors. + + (yyparse) [! defined YYSTACK_RELOCATE]: Do not relocate the stack. + +2002-04-23 Akim Demaille + + * tests/sets.at (AT_EXTRACT_SETS): Don't use 8 char long sed labels. + * tests/synclines.at (AT_TEST_SYNCLINE): Be robust to GCC's + location with columns. + * tests/conflicts.at (%nonassoc and eof): Don't use `error.h'. + All reported by Paul Eggert. + +2002-04-22 Akim Demaille + + * src/reduce.c (dump_grammar): Move to... + * src/gram.h, src/gram.c (grammar_dump): here. + Be sure to separate long item numbers. + Don't read the members of a rule's prec if its nil. + +2002-04-22 Akim Demaille + + * src/output.c (table_size, table_grow): New. + (MAXTABLE): Remove, replace uses with table_size. + (pack_vector): Instead of dying when the table is too big, grow it. + +2002-04-22 Akim Demaille + + * data/bison.simple (yyr1): Its type is that of a token number. + * data/bison.c++ (r1_): Likewise. + * tests/regression.at (Web2c Actions): Adjust. + +2002-04-22 Akim Demaille + + * src/reader.c (token_translations_init): 256 is now the default + value for the error token, i.e., it will be assigned another + number if the user assigned 256 to one of her tokens. + (reader): Don't force 256 to error. + * doc/bison.texinfo (Symbols): Adjust. + * tests/torture.at (AT_DATA_HORIZONTAL_GRAMMAR) + (AT_DATA_TRIANGULAR_GRAMMAR): Number the tokens as 1, 2, 3 + etc. instead of 10, 20, 30 (which was used to `jump' over error + (256) and undefined (2)). + +2002-04-22 Akim Demaille + + Propagate more token_number_t. + + * src/gram.h (token_number_as_item_number) + (item_number_as_token_number): New. + * src/output.c (GENERATE_OUTPUT_TABLE): New. + Use it to create output_item_number_table and + output_token_number_table. + * src/LR0.c, src/derives.c, src/gram.c, src/gram.h, src/lalr.c, + * src/lex.c, src/nullable.c, src/output.c, src/print.c, + * src/print_graph.c, src/reader.c, src/reduce.c, src/state.h, + * src/symtab.c, src/symtab.h: Use token_number_t instead of shorts. + +2002-04-22 Akim Demaille + + * src/output.h, src/output.c (get_lines_number): Remove. + +2002-04-19 Akim Demaille + + * doc/bison.texinfo (Actions): Make clear that `|' is not the same + as Lex/Flex'. + (Debugging): More details about enabling the debugging features. + (Table of Symbols): Describe $$, $n, @$, and @n. + Suggested by Tim Josling. + +2002-04-19 Akim Demaille + + * doc/bison.texinfo: Remove the uses of the obsolete @refill. + +2002-04-10 Akim Demaille + + * src/system.h: Rely on HAVE_LIMITS_H. + Suggested by Paul Eggert. + +2002-04-09 Akim Demaille + + * tests/calc.at (_AT_CHECK_CALC_ERROR): Receive as argument the + full stderr, and strip it according to the bison options, instead + of composing the error message from different bits. + This makes it easier to check for several error messages. + Adjust all the invocations. + Add an invocation exercising the error token. + Add an invocation demonstrating a stupid error message. + (_AT_DATA_CALC_Y): Follow the GCS: initial column is 1, not 0. + Adjust the tests. + Error message are for stderr, not stdout. + +2002-04-09 Akim Demaille + + * src/gram.h, src/gram.c (error_token_number): Remove, use + errtoken->number. + * src/reader.c (reader): Don't specify the user token number (2) + for $undefined, as it uselessly prevents using it. + * src/gram.h (token_number_t): Move to... + * src/symtab.h: here. + (state_t.number): Is a token_number_t. + * src/print.c, src/reader.c: Use undeftoken->number instead of + hard coded 2. + (Even though this 2 is not the same as above: the number of the + undeftoken remains being 2, it is its user token number which + might not be 2). + * src/output.c (prepare_tokens): Rename the `maxtok' muscle with + `user_token_number_max'. + Output `undef_token_number'. + * data/bison.simple, data/bison.c++: Use them. + Be sure to map invalid yylex return values to + `undef_token_number'. This saves us from gratuitous SEGV. + + * tests/conflicts.at (Solved SR Conflicts) + (Unresolved SR Conflicts): Adjust. + * tests/regression.at (Web2c Actions): Adjust. + +2002-04-08 Akim Demaille + + * data/bison.c++: s/b4_item_number_max/b4_rhs_number_max/. + Adding #line. + Remove the duplicate `typedefs'. + (RhsNumberType): Fix the declaration and various other typos. + Use __ofile__. + * data/bison.simple: Use __ofile__. + * src/scan-skel.l: Handle __ofile__. + +2002-04-08 Akim Demaille + + * src/gram.h (item_number_t): New, the type of item numbers in + RITEM. Note that it must be able to code symbol numbers as + positive number, and the negation of rule numbers as negative + numbers. + Adjust all dependencies (pretty many). + * src/reduce.c (rule): Remove this `short *' pointer: use + item_number_t. + * src/system.h (MINSHORT, MAXSHORT): Remove. + Include `limits.h'. + Adjust dependencies to using SHRT_MAX and SHRT_MIN. + (shortcpy): Remove. + (MAXTABLE): Move to... + * src/output.c (MAXTABLE): here. + (prepare_rules): Use output_int_table to output rhs. + * data/bison.simple, data/bison.c++: Adjust. + * tests/torture.at (Big triangle): Move the limit from 254 to + 500. + * tests/regression.at (Web2c Actions): Ajust. + + Trying with bigger grammars shows various phenomena: at 3000 (28Mb + of grammar file) bison is killed by my system, at 2000 (12Mb) bison + passes, but produces negative #line number, once fixed, GCC is + killed while compiling 14Mb, at 1500 (6.7 Mb of grammar, 8.2Mb of + C), it passes. + * src/state.h (state_h): Code input lines on ints, not shorts. + +2002-04-08 Akim Demaille + + * src/reduce.c (reduce_grammar): First reduce the nonterminals, + and then the grammar. + +2002-04-08 Akim Demaille + + * src/system.h: No longer using strndup. + +2002-04-07 Akim Demaille + + * src/muscle_tab.h (MUSCLE_INSERT_LONG_INT): New. + * src/output.c (output_table_data): Return the longest number. + (prepare_tokens): Output `token_number_max'). + * data/bison.simple, data/bison.c++ (b4_sint_type, b4_uint_type): + New. + Use them to define yy_token_number_type/TokenNumberType. + Use this type for yytranslate. + * tests/torture.at (Big triangle): Push the limit from 124 to + 253. + * tests/regression.at (Web2c Actions): Adjust. + +2002-04-07 Akim Demaille + + * tests/torture.at (Big triangle): New. + (GNU AWK Grammar, GNU Cim Grammar): Move to... + * tests/existing.at: here. + +2002-04-07 Akim Demaille + + * src/gram.h, src/gram.c (nitems): Remove, it is an alias of + nritems. + Adjust dependencies. + +2002-04-07 Akim Demaille + + * src/reader.c: Normalize increments to prefix form. + +2002-04-07 Akim Demaille + + * src/reader.c, symtab.c: Remove debugging code. + +2002-04-07 Akim Demaille + + Rename all the `bucket's as `symbol_t'. + + * src/gram.c, src/gram.h, src/lex.c, src/lex.h, src/output.c, + * src/reader.c, src/reader.h, src/reduce.c, src/state.h, + * src/symtab.c, src/symtab.h (bucket): Rename as... + (symbol_t): this. + (symbol_list_new, bucket_check_defined, bucket_make_alias) + (bucket_check_alias_consistence, bucket_pack, bucket_translation) + (bucket_new, bucket_free, hash_compare_bucket, hash_bucket) + (buckets_new, buckets_free, buckets_do): Rename as... + (symbol_list_new, symbol_check_defined, symbol_make_alias) + (symbol_check_alias_consistence, symbol_pack, symbol_translation) + (symbol_new, symbol_free, hash_compare_symbol_t, hash_symbol_t) + (symbols_new, symbols_free, symbols_do): these. + +2002-04-07 Akim Demaille + + Use lib/hash for the symbol table. + + * src/gram.c (ntokens): Initialize to 1, to reserve a slot for + EOF. + * src/lex.c (lex): Set the `number' member of new terminals. + * src/reader.c (bucket_check_defined, bucket_make_alias) + (bucket_check_alias_consistence, bucket_translation): New. + (reader, grammar_free, readgram, token_translations_init) + (packsymbols): Adjust. + (reader): Number the predefined tokens. + * src/reduce.c (inaccessable_symbols): Just use hard coded numbers + for predefined tokens. + * src/symtab.h (bucket): Remove all the hash table related + members. + * src/symtab.c (symtab): Replace by... + (bucket_table): this. + (bucket_new, bucket_free, hash_compare_bucket, hash_bucket) + (buckets_new, buckets_do): New. + +2002-04-07 Akim Demaille + + * src/gram.c (nitems, nrules, nsyms, ntokens, nvars, nritems) + (start_symbol, max_user_token_number, semantic_parser) + (error_token_number): Initialize. + * src/reader.c (grammar, start_flag, startval, typed, lastprec): + Initialize. + (reader): Don't. + (errtoken, eoftoken, undeftoken, axiom): Extern. + +2002-04-07 Akim Demaille + + * src/gram.h (rule_s): prec and precsym are now pointers + to the bucket giving the priority/associativity. + Member `associativity' removed: useless. + * src/reduce.c, src/conflicts.c: Adjust. + +2002-04-07 Akim Demaille + + * src/lalr.c, src/LR0.c, src/closure.c, src/gram.c, src/reduce.c: + Properly escape the symbols' TAG when outputting them. + +2002-04-07 Akim Demaille + + * src/lalr.h (LA): Is a bitsetv, not bitset*. + +2002-04-07 Akim Demaille + + * src/lalr.h, src/lalr.c (LAruleno): Replace with... + (LArule): this, which is an array to rule_t*. + * src/print.c, src/conflicts.c: Adjust. + +2002-04-07 Akim Demaille + + * src/gram.h (rule_t): Rename `number' as `user_number'. + `number' is a new member. + Adjust dependencies. + * src/reduce.c (reduce_grammar_tables): Renumber rule_t.number. + +2002-04-07 Akim Demaille + + As a result of the previous patch, it is no longer needed + to reorder ritem itself. + + * src/reduce.c (reduce_grammar_tables): Don't sort RITEM. + +2002-04-07 Akim Demaille + + Be sure never to walk through RITEMS, but use only data related to + the rules themselves. RITEMS should be banished. + + * src/output.c (output_token_translations): Rename as... + (prepare_tokens): this. + In addition to `translate', prepare the muscles `tname' and + `toknum', which were handled by... + (output_rule_data): this. + Remove, and move the remainder of its outputs into... + (prepare_rules): this new routines, which also merges content from + (output_gram): this. + (prepare_rules): Be sure never to walk through RITEMS. + (output_stos): Rename as... + (prepare_stos): this. + (output): Always invoke prepare_states, after all, just don't use it + in the output if you don't need it. + +2002-04-07 Akim Demaille + + * src/LR0.c (new_state): Display `nstates' as the name of the + newly created state. + Adjust to initialize first_state and last_state if needed. + Be sure to distinguish the initial from the final state. + (new_states): Create the itemset of the initial state, and use + new_state. + * src/closure.c (closure): Now that the initial state has its + items properly set, there is no need for a special case when + creating `ruleset'. + + As a result, now the rule 0, reducing to $axiom, is visible in the + outputs. Adjust the test suite. + + * tests/conflicts.at (Solved SR Conflicts) + (Unresolved SR Conflicts): Adjust. + * tests/regression.at (Web2c Report, Rule Line Numbers): Idem. + * tests/conflicts.at (S/R in initial): New. + +2002-04-07 Akim Demaille + + * src/LR0.c (allocate_itemsets): Don't loop over ritem: loop over + the RHS of the rules. + * src/output.c (output_gram): Likewise. + +2002-04-07 Akim Demaille + + * src/gram.h (rule_t): `lhs' is now a pointer to the symbol's + bucket. + Adjust all dependencies. + * src/reduce.c (nonterminals_reduce): Don't forget to renumber the + `number' of the buckets too. + * src/gram.h: Include `symtab.h'. + (associativity): Move to... + * src/symtab.h: here. + No longer include `gram.h'. + +2002-04-07 Akim Demaille + + * src/gram.h, src/gram.c (rules_rhs_length): New. + (ritem_longest_rhs): Use it. + * src/gram.h (rule_t): `number' is a new member. + * src/reader.c (packgram): Set it. + * src/reduce.c (reduce_grammar_tables): Move the useless rules at + the end of `rules', and count them out of `nrules'. + (reduce_output, dump_grammar): Adjust. + * src/print.c (print_grammar): It is no longer needed to check for + the usefulness of a rule, as useless rules are beyond `nrules + 1'. + * tests/reduce.at (Reduced Automaton): New test. + +2002-04-07 Akim Demaille + + * src/reduce.c (inaccessable_symbols): Fix a buglet: because of a + lacking `+ 1' to nrules, Bison reported as useless a token if it + was used solely to set the precedence of the last rule... + +2002-04-07 Akim Demaille + + * data/bison.c++, data/bison.simple: Don't output the current file + name in #line, to avoid useless diffs between two identical + outputs under different names. + +2002-04-07 Akim Demaille + + * src/closure.c, src/print.c, src/reader.c, src/reduce.c: + Normalize loops to using `< nrules + 1', not `<= nrules'. + +2002-04-07 Akim Demaille + + * TODO: Update. + +2002-04-07 Akim Demaille + + * src/output.c, src/reader.c, src/symtab.c, src/symtab.h: Rename + bucket.value as bucket.number. + +2002-04-07 Akim Demaille + + * src/closure.c, src/derives.c, src/gram.h, src/lalr.c, + * src/nullable.c, src/output.c, src/print.c, src/print_graph.c, + * src/reader.c, src/reduce.c: Let rule_t.rhs point directly to the + RHS, instead of being an index in RITEMS. + +2002-04-04 Paul Eggert + + * doc/bison.texinfo: Update copyright date. + (Rpcalc Lexer, Symbols, Token Decl): Don't assume ASCII. + (Symbols): Warn about running Bison in one character set, + but compiling and/or running in an incompatible one. + Warn about character code 256, too. + +2002-04-03 Paul Eggert + + * src/bison.data (YYSTACK_ALLOC): Depend on whether + YYERROR_VERBOSE is nonzero, not whether it is defined. + + Merge changes from bison-1_29-branch. + +2002-03-20 Paul Eggert + + Merge fixes from Debian bison_1.34-1.diff. + + * configure.in (AC_PREREQ): 2.53. + +2002-03-20 Akim Demaille + + * src/conflicts.c (log_resolution): Argument `resolution' is const. + +2002-03-19 Paul Eggert + + * src/bison.simple (YYCOPY): New macro. + (YYSTACK_RELOCATE): Use it. + Remove Type arg; no longer needed. All callers changed. + (yymemcpy): Remove; no longer needed. + + * Makefile.am (AUTOMAKE_OPTIONS): 1.6. + * doc/Makefile.am (AUTOMAKE_OPTIONS): Remove. + +2002-03-19 Akim Demaille + + Test and fix the #line outputs. + + * tests/atlocal.at (GCC): New. + * tests/synclines.at (AT_TEST_SYNCLINE): New macro. + (Prologue synch line, ,%union synch line, Postprologue synch line) + (Action synch line, Epilogue synch line): New tests. + * src/reader.c (parse_union_decl): Define the muscle stype_line. + * data/bison.simple, data/bison.c++: Use it. + +2002-03-19 Akim Demaille + + * tests/regression.at (%nonassoc and eof, Unresolved SR Conflicts) + (Solved SR Conflicts, %expect not enough, %expect right) + (%expect too much): Move to... + * tests/conflicts.at: this new file. + +2002-03-19 Akim Demaille + + * data/m4sugar/m4sugar.m4: Update from CVS Autoconf. + * data/bison.simple, data/bison.c++: Handle the `#define' part, so + that we can move to enums for instance. + * src/output.c (token_definitions_output): Output a list of + `token-name, token-number' instead of the #define. + (output_skeleton): Name this list `b4_tokens', not `b4_tokendefs'. + +2002-03-14 Akim Demaille + + Use Gettext 0.11.1. + +2002-03-09 Robert Anisko + + * data/bison.c++: Make the user able to add members to the generated + parser by subclassing. + +2002-03-05 Robert Anisko + + * src/reader.c (read_additionnal_code): `c' should be an integer, not + a character. + Reported by Nicolas Tisserand and Nicolas Burrus. + +2002-03-04 Robert Anisko + + * src/reader.c: Warn about lacking semi-colons, do not complain. + +2002-03-04 Robert Anisko + + * data/bison.c++: Remove a debug line. + +2002-03-04 Robert Anisko + + * data/bison.c++: Unmerge value as yylval and value as yyval. Unmerge + location as yylloc and location as yyloc. Use YYLLOC_DEFAULT, and + provide a default implementation. + +2002-03-04 Akim Demaille + + * tests/input.at (Invalid $n, Invalid @n): Add the ending `;'. + * tests/output.at (AT_CHECK_OUTPUT): Likewise. + * tests/headers.at (AT_TEST_CPP_GUARD_H): Ditto. + * tests/semantic.at (Parsing Guards): Similarly. + * src/reader.at (readgram): Complain if the last rule is not ended + with a semi-colon. + +2002-03-04 Akim Demaille + + * src/warshall.h, src/warshall.c (bitmatrix_print): Move to... + * src/closure.c: here. + (set_firsts): Use bitsetv_reflexive_transitive_closure instead of + RTC. + * src/warshall.h, src/warshall.c: Remove. + * tests/sets.at (Broken Closure): Adjust. + +2002-03-04 Akim Demaille + + * src/output.c (output_skeleton): tempdir is const. + bytes_read is unused. + +2002-03-04 Akim Demaille + + * lib/bbitset.h, lib/bitset.c, lib/bitset.h, lib/bitsetv.c, + * lib/bitsetv.h, lib/ebitset.c, lib/lbitset.c, lib/sbitset.c: + Update. + From Michael Hayes. + +2002-03-04 Akim Demaille + + * src/closure.c (closure): `r' is unused. + +2002-03-04 Akim Demaille + + * tests/sets.at (Broken Closure): Add the ending `;'. + * src/reader.at (readgram): Complain if a rule is not ended with a + semi-colon. + +2002-03-04 Akim Demaille + + * src/conflicts.c (set_conflicts): Use bitset_disjoint_p. + (count_sr_conflicts): Use bitset_count. + * src/reduce.c (inaccessable_symbols): Ditto. + (bits_size): Remove. + * src/warshall.h, src/warshall.c: Convert to bitsetv. + +2002-03-04 Akim Demaille + + * src/closure.c, src/conflicts.c, src/lalr.c, src/print.c, + * src/reduce.c: Remove the `bitset_zero's following the + `bitset_create's, as now it is performed by the latter. + +2002-03-04 Akim Demaille + + * lib/bitset.c, lib/bitset.h, lib/bitsetv.c, lib/bitsetv.h, + * lib/ebitset.c, lib/ebitset.h, lib/lbitset.c, lib/lbitset.h, + * lib/sbitset.c, lib/sbitset.h, lib/bbitset.h: Update from the + latest sources from Michael. + +2002-03-04 Akim Demaille + + * src/output.c (output): Don't free the grammar. + * src/reader.c (grammar_free): New. + * src/main.c (main): Call it and don't free symtab here. + +2002-03-04 Akim Demaille + + * src/lex.c (parse_percent_token): Be sure to 0-end token_buffer + before returning. + Reported by Benoit Perrot. + +2002-03-04 Akim Demaille + + Use bitset operations when possible, not loops over bits. + + * src/conflicts.c (set_conflicts, count_sr_conflicts): Use + bitset_or. + * src/print.c (print_reductions): Use bitset_and, bitset_andn. + * src/reduce.c (useless_nonterminals): Formatting changes. + * src/warshall.c (TC): Use bitset_or. + +2002-03-04 Akim Demaille + + * src/lalr.h, src/lalr.c (tokensetsize): Remove, unused. + * src/system.h (BITS_PER_WORD, WORDSIZE, SETBIT, RESETBIT, BITISSET): + Ditto. + +2002-03-04 Akim Demaille + + * src/lalr.c (F): Now a bitset*. + Adjust all dependencies. + +2002-03-04 Akim Demaille + + * src/conflicts.c (shiftset, lookaheadset): Now bitset. + Adjust all dependencies. + +2002-03-04 Akim Demaille + + * src/L0.c, src/LR0.h (nstates): Be size_t. + Adjust comparisons (signed vs unsigned). + * src/conflics.c, src/lalr.c, src/lalr.h, src/output.c (LA): Now a + bitset*. + Adjust all dependencies. + +2002-03-04 Akim Demaille + + * src/closure.c (firsts): Now, also a bitset. + Adjust all dependencies. + (varsetsize): Remove, now unused. + * src/warshall.h, src/warshall.c: Now work on arrays of bitsets. + +2002-03-04 Akim Demaille + + * src/print.c: Convert to use bitset.h, not hand coded iterations + over ints. + +2002-03-04 Akim Demaille + + * src/reduce.c: Convert to use bitset.h, not hand coded BSet. + +2002-03-04 Akim Demaille + + * src/closure.c (ruleset): Be a bitset. + (rulesetsize): Remove. + +2002-03-04 Akim Demaille + + * lib/bitset-int.h, lib/bitset.c, lib/bitset.h, lib/bitsetv.c, + * lib/bitsetv.h, lib/ebitset.c, lib/ebitset.h, lib/lbitset.c, + * lib/lbitset.h, lib/sbitset.c, lib/sbitset.h: New. + * src/closure.c (fderives): Be an array of bitsets. + +2002-02-28 Robert Anisko + + * data/bison.c++: Merge the two generated headers. Insert a copyright + notice in each output file. + +2002-02-28 Akim Demaille + + * data/bison.c++: Copy the prologue of bison.simple to fetch + useful M4 definitions, such as b4_header_guard. + +2002-02-25 Akim Demaille + + * src/getargs.c (version): Give the name of the authors, and use a + translator friendly scheme for the bgr + copyright notice. + +2002-02-25 Akim Demaille + + * src/output.c (header_output): Remove, now handled completely via + M4. + +2002-02-25 Akim Demaille + + * m4/m4.m4: New, from CVS Autoconf. + * configure.in: Invoke it. + * src/output.c (output_skeleton): Use its result instead of the + hard coded name. + +2002-02-25 Akim Demaille + + * lib/tempname.c, lib/mkstemp.c, m4/mkstemp.m4: New, stolen from + Fileutils 4.1.5. + * configure.in: Invoke UTILS_FUNC_MKSTEMP. + * src/output.c (output_skeleton): Use mkstemp to create a real + temporary file. + Move the filling of `skeleton' and its muscle to... + (prepare): here. + (output): Move the definition of the prologue muscle to... + (prepare): here. + * src/system.h (DEFAULT_TMPDIR): New. + +2002-02-14 Paul Eggert + + Remove the support for C++ namespace cleanliness; it was + causing more problems than it was curing, since it didn't work + properly on some nonstandard C++ compilers. This can wait + for a proper C++ parser. + + * NEWS: Document this. + * doc/bison.texinfo (Bison Parser, Debugging): Remove special mention + of C++, as it's treated like C now. + * src/bison.simple (YYSTD): Remove. + (YYSIZE_T, YYFPRINTF, YYPARSE_PARAM_ARG, YYPARSE_PARAM_DECL): + Treat C++ just like Standard C instead of trying to support + namespace cleanliness. + +2002-02-14 Akim Demaille + + * tests/regression.at (else): Adjust to Andreas' change. + +2002-02-14 Akim Demaille + + * lib/Makefile.am (EXTRA_DIST): Ship strnlen.c. + +2002-02-13 Andreas Schwab + + * src/output.c (output_rule_data): Don't output NULL, it might + not be defined yet. + +2002-02-11 Robert Anisko + + * data/bison.c++ (YYDEBUG, YYERROR_VERBOSE): After the prologue. + (Copyright notice): Update. + +2002-02-11 Akim Demaille + + * tests/regression.at (%nonassoc and eof): Don't include + nonportable headers. + +2002-02-08 Robert Anisko + + * data/bison.c++: Correct error recovery. Make the user able to + initialize the starting location. + +2002-02-07 Akim Demaille + + * tests/input.at: New. + +2002-02-07 Robert Anisko + + * data/bison.c++: Replace some direct m4 expansions by constants. Be + more consistent when naming methods and variables. Put preprocessor + directives around tables only needed for debugging. + +2002-02-07 Robert Anisko + + * data/bison.c++ (yy::b4_name::print_): New method, replaces yyprint in + C++ parsers. + (yy::b4_name::parse): Use print_. + +2002-02-07 Robert Anisko + + * data/bison.c++ (yy::b4_name::parse): Error recovery is back. + +2002-02-07 Robert Anisko + + * data/bison.c++ (yy::b4_name::error_): New method, replaces yyerror in + C++ parsers. + (yy::b4_name::parse): Build verbose error messages, and use error_. + +2002-02-06 Robert Anisko + + * data/bison.c++: Fix m4 quoting in comments. + +2002-02-06 Robert Anisko + + * data/bison.c++: Adjust the parser code. Fix some muscles that were + not expanded by m4. + +2002-02-05 Akim Demaille + + * data/bison.c++: Adjust to the M4 back end. + More is certainly needed. + +2002-02-05 Akim Demaille + + Give a try to M4 as a back end. + + * lib/readpipe.c: New, from wdiff. + * src/Makefile.am (DEFS): Define PKGDATADIR, not BISON_SIMPLE and + BISON_HAIRY. + * src/system.h (BISON_HAIRY, BISON_SIMPLE): Remove the DOS and VMS + specific values. Now it is m4 that performs the lookup. + * src/parse-skel.y: Remove. + * src/muscle_tab.c, src/muscle_tab.h (muscles_m4_output): New. + * src/output.c (actions_output, guards_output) + (token_definitions_output): No longer keeps track of the output + line number, hence remove the second argument. + (guards_output): Check against the guard member of a rule, not the + action member. + Adjust callers. + (output_skeleton): Don't look for the skeleton location, let m4 do + that. + Create `/tmp/muscles.m4'. This is temporary, a proper temporary + file will be used. + Invoke `m4' on m4sugar.m4, muscles.m4, and the skeleton. + (prepare): Given that for the time being changesyntax is not + usable in M4, rename the muscles using `-' to `_'. + Define `defines_flag', `output_parser_name' and `output_header_name'. + * src/output.h (actions_output, guards_output) + (token_definitions_output): Adjust prototypes. + * src/scan-skel.l: Instead of scanning the skeletons, it now + processes the output of m4: `__oline__' and `#output'. + * data/bison.simple: Adjust to be used by M4(sugar). + * tests/Makefile.am: Use check_SCRIPTS to make sure `bison' is up + to date. + * tests/bison.in: Use the secrete envvar `BISON_PKGDATADIR' + instead of the dead `BISON_SIMPLE' and `BISON_HAIRY'. + * data/m4sugar/m4sugar.m4, data/m4sugar/version.m4: New, + shamelessly stolen from CVS Autoconf. + +2002-02-05 Akim Demaille + + * lib/hash.c, lib/hash.h: Replace with Fileutils 4.1's version. + * configure.in: Check for the declarations of free and malloc. + * src/muscle_tab.c: Adjust. + +2002-02-05 Akim Demaille + + * src/muscle_tab.c (muscle_init): Don't default to NULL muscle + which have no values. + +2002-02-05 Akim Demaille + + * src/bison.simple, src/bison.hairy, src/bison.c++: Move to... + * data/: here. + +2002-01-29 Paul Eggert + + * src/bison.simple (YYSIZE_T): Do not define merely because + YYSTACK_USE_ALLOCA is nonzero or alloca or _ALLOCA_H are defined. + On some platforms, does not declare YYSTD (size_t). + +2002-01-27 Akim Demaille + + Fix `%nonassoc and eof'. + + * src/state.c (errs_dup): Aaaah! The failure was due to bytes + which were not properly copied! Replace + memcpy (res->errs, src->errs, src->nerrs); + with + memcpy (res->errs, src->errs, src->nerrs * sizeof (src->errs[0])); + !!! + * tests/regression.at (%nonassoc and eof): Adjust to newest + Autotest: `.' is not in the PATH. + +2002-01-27 Akim Demaille + + * tests/sets.at (AT_EXTRACT_SETS): New. + (Nullable): Use it. + (Firsts): New. + +2002-01-26 Akim Demaille + + * tests/actions.at, tests/calc.at, tests/headers.at, + * tests/torture.at: Adjust to the newest Autotest which no longer + forces `.' in the PATH. + +2002-01-25 Akim Demaille + + * tests/regression.at (%nonassoc and eof): New. + Suggested by Robert Anisko. + +2002-01-24 Akim Demaille + + Bison dumps core when trying to complain about broken input files. + Reported by Cris van Pelt. + + * src/lex.c (parse_percent_token): Be sure to set token_buffer. + * tests/regression.at (Invalid input: 1, Invalid input: 2): Merge + into... + (Invalid inputs): Strengthen: exercise parse_percent_token. + +2002-01-24 Robert Anisko + + * src/Makefile.am: Add bison.c++. + * src/bison.c++: New skeleton. + +2002-01-21 Paolo Bonzini + + * po/it.po: New. + +2002-01-21 Kees Zeelenberg + + * src/files.c (skeleton_find) [MSDOS]: Fix cp definition. + +2002-01-20 Marc Autret + + * src/files.c (compute_output_file_names): Fix + +2002-01-20 Marc Autret + + * tests/output.at: New test. + * src/files.c (compute_base_names): Don't map extensions when + the YACC flag is set, use defaults. + Reported by Evgeny Stambulchik. + +2002-01-20 Marc Autret + + * src/system.h: Need to define __attribute__ away for non-GCC + compilers as well (i.e. the vendor C compiler). + Suggested by Albert Chin-A-Young. + +2002-01-11 Tim Van Holder + + * lib/hash.h, lib/hash.c: Renamed __P to PARAMS and used the + canonical definition. + * src/system.h: Use the canonical definition for PARAMS (avoids + a conflict with the macro from lib/hash.h). + +2002-01-11 Akim Demaille + + * configure.in: Use AC_FUNC_STRNLEN. + Fixes the failures observed on AIX 4.3 by H.Merijn Brand. + +2002-01-09 Akim Demaille + + * src/files.c, src/files.h (output_infix): New. + (tab_extension): Remove. + (compute_base_names): Compute the former, drop the latter. + * src/output.c (prepare): Insert the muscles `output-infix', and + `output-suffix'. + * src/parse-skel.y (string, string.1): New. + (section.header): Use it. + (section.yacc): Remove. + (prefix): Remove too. + * src/scan-skel.l: Adjust. + * src/bison.simple, src/bison.hairy: Adjust. + +2002-01-09 Akim Demaille + + * configure.in (WERROR_CFLAGS): Compute it. + * src/Makefile.am (CFLAGS): Pass it. + * tests/atlocal.in (CFLAGS): Idem. + * src/files.c: Fix a few warnings. + (get_extension_index): Remove, unused. + +2002-01-08 Akim Demaille + + * src/getargs.c (AS_FILE_NAME): New. + (getargs): Use it to convert DOSish file names. + * src/files.c (base_name): Rename as full_base_name to avoid + clashes with `base_name ()'. + (filename_split): New. + (compute_base_names): N-th rewrite, using filename_split. + +2002-01-08 Akim Demaille + + * lib/basename.c, lib/dirname.h, lib/dirname.c, lib/memrchr.c: + New, stolen from the Fileutils 4.1. + * lib/Makefile.am (libbison_a_SOURCES): Adjust. + * configure.in: Check for the presence of memrchr, and of its + prototype. + +2002-01-07 Tim Van Holder + + * lib/hash.h (__P): Added definition for this macro. + * src/Makefile.am: Add parse-skel.c and scan-skel.c to + BUILT_SOURCES, to ensure they are generated first. + * src/parse-skel.y: Use YYERROR_VERBOSE instead of + %error-verbose to allow bootstrapping with bison 1.30x. + +2002-01-06 Akim Demaille + + * src/reader.c (parse_braces): Don't fetch the next char, the + convention is to fetch on entry. + * tests/torture.at (GNU Cim Grammar): Reintroduce their weird + 'switch' without a following semicolon. + * tests/regression.at (braces parsing): New. + +2002-01-06 Akim Demaille + + Bison is dead wrong in its RR conflict reports. + + * tests/torture.at (GNU Cim Grammar): New. + * src/conflicts.c (count_rr_conflicts): Fix. + +2002-01-06 Akim Demaille + + Creating package.m4 from configure.ac causes too many problems. + + * tests/Makefile.am (package.m4): Create it by hand, + AC_CONFIG_TESTDIR no longer does in the most recent CVS Autoconf. + +2002-01-06 Akim Demaille + + * src/Makefile.am (bison_SOURCES): Add parse-skel.h and + skeleton.h. + +2002-01-04 Paul Eggert + + * doc/bison.texinfo (Debugging): + Remove YYSTDERR; it's no longer defined or used. + Also, s/cstdio.h/cstdio/. + +2002-01-03 Akim Demaille + + * tests/bison.in, tests/atlocal.in: Adjust to CVS Autoconf. + +2002-01-03 Akim Demaille + + * src/parse-skel.y (process_skeleton): Don't bind the parser's + tracing code to --trace, wait for a better --trace option, with + args. + +2002-01-03 Akim Demaille + + * src/bison.simple (YYSTDERR): Remove, replace `stderr'. + The ISO C++ standard is extremely clear about it: stderr is + considered a macro, not a regular symbol (see table 94 `Header + synopsis', [lib.c.files] 27.8.2 C Library files). + Therefore std:: does not apply to it. It still does with fprintf. + Also, s/cstdio.h/cstdio/. + +2002-01-03 Akim Demaille + + * lib/quotearg.c: Use `#include "..."' instead of `#include <...>' + for non system headers. + +2002-01-02 Akim Demaille + + Equip the skeleton chain with location tracking, runtime trace, + pure parser and scanner. + + * src/parse-skel.y: Request a pure parser, locations, and prefix + renaming. + (%union): Having several members with the same type does not help + type mismatches, simplify. + (YYPRINT, yyprint): New. + (yyerror): ``Rename'' (there is a #define yyerror skel_error) as... + (skel_error): this. + Handle locations. + * src/scan-skel.l: Adjust to these changes. + * src/skeleton.h (LOCATION_RESET, LOCATION_LINES, LOCATION_STEP) + (LOCATION_PRINT, skel_control_t): New. + +2001-12-30 Akim Demaille + + * src/parse-skel.y: Get rid of the shift/reduce conflict: + replace `gb' with BLANKS. + * src/scan-skel.l: Adjust. + +2001-12-30 Akim Demaille + + * src/system.h: We don't need nor want bcopy. + Throw away MS-DOS crap: we don't need getpid. + * configure.in: We don't need strndup. It was even causing + problems: because Flex includes the headers *before* us, + _GNU_SOURCE is not defined by config.h, and therefore strndup was + not visible. + * lib/xstrndup.c: New. + * src/scan-skel.l: Use it. + Be sure to initialize yylval.muscle member when scanning a MUSCLE. + * src/parse-skel.y: Use %directives instead of #defines. + +2001-12-30 Akim Demaille + + * src/skeleton.h: New. + * src/output.c (output_parser, output_master_parser): Remove, dead + code. + * src/output.h (get_lines_number, actions_output, guards_output) + (token_definitions_output): Prototype them. + * src/parse-skel.y: Add the license notice. + Include output.h and skeleton.h. + (process_skeleton): Returns void, and takes a single parameter. + * src/scan-skel.l: Add the license notice. + Include skeleton.h. + Don't use %option yylineno: it seems that then Flex imagines + REJECT has been used, and therefore it won't reallocate its + buffers (which makes no other sense to me than a bug). It results + in warnings for `unused: yy_flex_realloc'. + +2001-12-30 Robert Anisko + + * src/muscle_tab.h (MUSCLE_INSERT_INT, MUSCLE_INSERT_STRING) + (MUSCLE_INSERT_PREFIX): ...to there. + * src/output.c (MUSCLE_INSERT_INT, MUSCLE_INSERT_STRING) + (MUSCLE_INSERT_PREFIX): Move from here... + + * src/bison.hairy: Add a section directive. Put braces around muscle + names. This parser skeleton is still broken, but Bison should not + choke on a bad muscle 'syntax'. + * src/bison.simple: Add a section directive. Put braces around muscle + names. + + * src/files.h (strsuffix, stringappend): Add declarations. + (tab_extension): Add declaration. + (short_base_name): Add declaration. + + * src/files.c (strsuffix, stringappend): No longer static. These + functions are used in the skeleton parser. + (tab_extension): New. + (compute_base_names): Use the computations done in this function + to guess if the generated parsers should have '.tab' in their + names. + (short_base_name): No longer static. + + * src/output.c (output_skeleton): New. + (output): Disable call to output_master_parser, and give a try to + a new skeleton handling system. + (guards_output, actions_output): No longer static. + (token_definitions_output, get_lines_number): No longer static. + + * configure.in: Use AM_PROG_LEX and AC_PROG_YACC. + + * src/Makefile.am (bison_SOURCES): Add scan-skel.l and + parse-skel.y. + + * src/parse-skel.y: New file. + * src/scan-skel.l: New file. + +2001-12-29 Akim Demaille + + %name-prefix is broken. + + * src/files.c (spec_name_prefix): Initialize to NULL, not to "yy". + Adjust all dependencies. + * tests/headers.at (export YYLTYPE): Strengthen this test: use + %name-prefix. + + Renaming yylval but not yylloc is not consistent. Now we do. + + * src/bison.simple: Prefix yylloc if used. + * doc/bison.texinfo (Decl Summary): Document that. + +2001-12-29 Akim Demaille + + * doc/bison.texinfo: Promote `%long-directive' over + `%long_directive'. + Remove all references to fixed-output-files, yacc is enough. + +2001-12-29 Akim Demaille + + * src/bison.simple: Define YYDEBUG and YYERROR_VERBOSE *after* the + user prologue. These are defaults. + * tests/actions.at (Mid-rule actions): Make sure the user can + define YYDEBUG and YYERROR_VERBOSE. + +2001-12-29 Akim Demaille + + * src/output.c (header_output): Don't forget to export YYLTYPE and + yylloc. + * tests/headers.at (export YYLTYPE): New, make sure it does. + * tests/regression.at (%union and --defines, Invalid CPP headers): + Move to... + * tests/headers.at: here. + +2001-12-29 Akim Demaille + + * src/gram.h (rule_s): Member `assoc' is of type `associativity'. + +2001-12-29 Akim Demaille + + * tests/actions.at (Mid-rule actions): Output on a single line + instead of several. + +2001-12-29 Akim Demaille + + * doc/bison.texinfo: Formatting changes. + +2001-12-29 Akim Demaille + + Don't store the token defs in a muscle, just be ready to output it + on command. Now possible via `symbols'. Fixes a memory leak. + + * src/output.c (token_definitions_output): New. + (output_parser, header_output): Use it. + * src/reader.c (symbols_save): Remove. + +2001-12-29 Akim Demaille + + * src/bison.simple: Do not provide a default for YYSTYPE and + YYLTYPE before the user's prologue. Otherwise it's hardly... a + default. + +2001-12-29 Akim Demaille + + Mid-rule actions are simply... ignored! + + * src/reader.c (readgram): Be sure to attach mid-rule actions to + the empty-rule associated to the dummy symbol, not to the host + rule. + * tests/actions.at (Mid-rule actions): New. + +2001-12-29 Akim Demaille + + Memory leak. + + * src/reader.c (reader): Free grammar. + +2001-12-29 Akim Demaille + + Memory leak. + + * src/LR0.c (new_itemsets): Don't allocate `shift_symbol' here, + since it allocates it for each state, although only one is needed. + (allocate_storage): Do it here. + +2001-12-29 Akim Demaille + + * src/options.h, src/options.c (create_long_option_table): Rename + as... + (long_option_table_new): this, with a clearer prototype. + (percent_table): Remove, unused, + * src/getargs.c (getargs): Adjust. + +2001-12-29 Akim Demaille + + * src/LR0.c, src/conflicts.c, src/lalr.c, src/lalr.h, src/output.c + * src/print.c, src/print_graph.c, src/state.h: Rename state_table + as states. + +2001-12-29 Akim Demaille + + * src/lalr.c (build_relations): Rename `states' as `states1'. + Sorry, I don't understand exactly what it is, no better name... + +2001-12-29 Akim Demaille + + * src/closure.c, src/conflicts.c, src/derives.c, src/gram.c + * src/gram.h, src/lalr.c, src/nullable.c, src/output.c, src/print.c + * src/print_graph.c, src/reader.c, src/reduce.c: Rename rule_table + as rules. + +2001-12-29 Akim Demaille + + * src/gram.c (rprec, rprecsym, rassoc): Remove, unused since long + ago. + +2001-12-29 Akim Demaille + + * src/reader.c, src/reader.h (user_toknums): Remove. + Adjust all users to use symbols[i]->user_token_number. + +2001-12-29 Akim Demaille + + * src/gram.c, src/gram.h (sprec, sassoc): Remove. + Adjust all users to use symbols[i]->prec or ->assoc. + +2001-12-29 Akim Demaille + + * src/reader.c, src/reader.h (tags): Remove. + Adjust all users to use symbols[i]->tag. + +2001-12-29 Akim Demaille + + * src/gram.h, src/gram.c (symbols): New, similar to state_table + and rule_table. + * src/reader.c (packsymbols): Fill this table. + Drop sprec. + * src/conflicts.c (resolve_sr_conflict): Adjust. + * src/reduce.c (reduce_grammar): Adjust: just sort symbols, a + single table. + Use symbols[i]->tag instead of tags[i]. + +2001-12-29 Akim Demaille + + * tests/calc.at (_AT_DATA_CALC_Y): Also use %union. + In addition, put a comment in there, to replace... + * tests/regression.at (%union and C comments): Remove. + +2001-12-29 Akim Demaille + + * tests/regression.at (Web2c Actions): Blindly move the actual + output as expected output. The contents *seem* right to me, but I + can't pretend reading perfectly parser tables... Nonetheless, all + the other tests pass correctly, the table look OK, even though the + presence of `$axiom' is to be noted: AFAICS it is useless (but + harmless). + +2001-12-29 Akim Demaille + + * src/reader.c (readgram): Don't add the rule 0 if there were no + rules read. In other words, add it _after_ having performed + grammar sanity checks. + Fixes the `tests/regression.at (Invalid input: 1)' Failure. + +2001-12-29 Akim Demaille + + * tests/regression.at (Web2c Report): Catch up: the rule 0 is now + visible, and some states have now a different number. + +2001-12-29 Akim Demaille + + * src/reader.c (readgram): Bind the initial rule's lineno to that + of the first rule. + * tests/regression.at (Rule Line Numbers, Unresolved SR Conflicts): + (Solved SR Conflicts): Adjust rule 0's line number. + +2001-12-29 Akim Demaille + + Fix the `GAWK Grammar' failure. + + * src/LR0.c (final_state): Initialize to -1 so that we do compute + the reductions of the first state which was mistakenly confused + with the final state because precisely final_state was initialized + to 0. + * tests/sets.at (Nullable): Adjust: state 0 does have lookaheads, + now noticed by Bison. + * tests/regression.at (Rule Line Numbers): Adjust: state 0 does + have a reduction on $default. + +2001-12-29 Akim Demaille + + * src/gram.c (ritem_print): Be sure to subtract 1 when displaying + rule line numbers. + * src/closure.c (print_closure): Likewise. + * src/derives.c (print_derives): Likewise. + * tests/sets.at (Nullable): Adjust: the rule numbers are correct + now. + +2001-12-29 Akim Demaille + + * src/lalr.c (lookaheads_print): New. + (lalr): Call it when --trace-flag. + * tests/sets.at (Nullable): Adjust: when tracing, the lookaheads + are dumped. + +2001-12-29 Akim Demaille + + * src/derives.c (print_derives): Be sure to use `>= 0', not `> 0', + when walking through ritem, even via rule->rhs. + * src/reduce.c (dump_grammar, useful_production, reduce_output) + (useful_production, useless_nonterminals): Likewise. + (reduce_grammar_tables): Likewise, plus update nritems. + * src/nullable.c (set_nullable): Likewise. + * src/lalr.c (build_relations): Likewise. + * tests/sets.at (Nullable): Adjust. + Fortunately, now, the $axiom is no longer nullable. + +2001-12-29 Akim Demaille + + * src/LR0.c (generate_states): Use nritems, not nitems, nor using + the 0-sentinel. + * src/gram.c (ritem_longest_rhs): Likewise. + * src/reduce.c (nonterminals_reduce): Likewise. + * src/print_graph.c (print_graph): Likewise. + * src/output.c (output_rule_data): Likewise. + * src/nullable.c (set_nullable): Likewise. + +2001-12-29 Akim Demaille + + * src/output.c: Comment changes. + +2001-12-27 Paul Eggert + + * src/bison.simple (YYSTACK_ALLOC, YYSIZE_T): Remove special + cases for non-GNU systems like AIX, HP-UX, SGI, Sun, and + Sparc, as they were causing more porting problems than the + (minor) performance improvement was worth. + + Also, catch up with 1.31's YYSTD. + +2001-12-27 Akim Demaille + + * src/output.c (output_gram): Rely on nritems, not the + 0-sentinel. See below. + Use -1 as separator, not 0. + * src/bison.simple (yyparse): Subtract 1 to the rule numbers. + Rely on -1 as separator in yyrhs, instead of 0. + * tests/calc.at (AT_CHECK_CALC): Now, the parsers no longer issue + twice `Now at end of input', therefore there are two lines less to + expect. + +2001-12-27 Akim Demaille + + * tests/regression.at (Unresolved SR Conflicts): + (Solved SR Conflicts, Rule Line Numbers): Adjust to the changes + below. + +2001-12-27 Akim Demaille + + * src/LR0.c (new_state): Recognize the final state by the fact it + is reached by eoftoken. + (insert_start_shifting_state, insert_eof_shifting_state) + (insert_accepting_state, augment_automaton): Remove, since now + these states are automatically computed from the initial state. + (generate_states): Adjust. + * src/print.c: When reporting a rule number to the user, substract + 1, so that the axiom rule is rule 0, and the first user rule is 1. + * src/reduce.c: Likewise. + * src/print_graph.c (print_core): For the time being, just as for + the report, depend upon --trace-flags to dump the full set of + items. + * src/reader.c (readgram): Once the grammar read, insert the rule + 0: `$axiom: START-SYMBOL $'. + * tests/set.at: Adjust: rule 0 is now displayed, and since the + number of the states has changed (the final state is no longer + necessarily the last), catch up. + +2001-12-27 Akim Demaille + + Try to make the use of the eoftoken valid. Given that its value + is 0 which was also used as a sentinel in ritem, (i) make sure >= 0 + is used instead of > 0 where appropriate, (ii), depend upon nritems + instead of the 0-sentinel. + + * src/gram.h, src/gram.c (nritems): New. + Expected to be duplication of nitems, but for the time being... + * src/reader.c (packgram): Assert nritems and nitems are equal. + * src/LR0.c (allocate_itemsets, new_itemsets): Adjust. + * src/closure.c (print_closure, print_fderives): Likewise. + * src/gram.c (ritem_print): Likewise. + * src/print.c (print_core, print_grammar): Likewise. + * src/print_graph.c: Likewise. + +2001-12-27 Akim Demaille + + * src/main.c (main): If there are complains after grammar + reductions, then output the report anyway if requested, then die. + * src/symtab.c (bucket_new): Initialize `value' to -1, not 0. + * src/reader.c (eoftoken): New. + (parse_token_decl): If the token being defined has value `0', it + is the eoftoken. + (packsymbols): No longer hack `tags' to insert `$' by hand. + Be sure to preserve the value of the eoftoken. + (reader): Make sure eoftoken is defined. + Initialize nsyms to 0: now eoftoken is created just like the others. + * src/print.c (print_grammar): Don't special case the eof token. + * src/regression.at: Adjust: `$' has value 0, not -1, which was a + lie anyway, albeit pleasant. + * tests/calc.at: Exercise error messages with eoftoken. + Change the grammar so that empty input is invalid. + Adjust expectations. + When yyungeting, be sure to use a valid yylloc: use last_yylloc. + +2001-12-27 Akim Demaille + + * configure.in: Check the protos of strchr ans strspn. + Replace strchr if needed. + * src/system.h: Provide the protos of strchr, strspn and memchr if + missing. + * lib/strchr.c: New. + * src/reader.c (symbols_save): Use strchr. + +2001-12-27 Akim Demaille + + * src/print.c, src/print_graph.c (escape): New. + Use it to quote the TAGS outputs. + * src/print_graph.c (print_state): Now errors are in red, and + reductions in green. + Prefer high to wide: output the state number on a line of its own. + +2001-12-27 Akim Demaille + + * src/state.h, src/state.c (reductions_new): New. + * src/LR0.c (set_state_table): Let all the states have a + `reductions', even if reduced to 0. + (save_reductions): Adjust. + * src/lalr.c (initialize_LA, initialize_lookaheads): Adjust. + * src/print.c (print_reductions, print_actions): Adjust. + * src/output.c (action_row): Adjust. + +2001-12-27 Akim Demaille + + * src/state.h, src/state.c (errs_new, errs_dup): New. + * src/LR0.c (set_state_table): Let all the states have an errs, + even if reduced to 0. + * src/print.c (print_errs, print_reductions): Adjust. + * src/output.c (output_actions, action_row): Adjust. + * src/conflicts.c (resolve_sr_conflict): Adjust. + +2001-12-27 Akim Demaille + + * src/lalr.c (set_goto_map, initialize_F): Use SHIFT_SYMBOL. + +2001-12-27 Akim Demaille + + * src/conflicts.c, src/conflicts.h (print_reductions): Move to... + * src/print.c: here. + (lookaheadset, shiftset): New, used as additional storage by + print_reductions. + (print_results): Adjust. + (print_shifts, print_gotos, print_errs): New, extracted from... + (print_actions): here. + * src/print_graph.c (print_actions): Remove dead code. + +2001-12-27 Akim Demaille + + * src/reader.c (copy_dollar, copy_at): Better checking of `n' in + `$n' and `@n'. + +2001-12-27 Akim Demaille + + * src/lalr.c (add_lookback_edge): Use state_t instead of ints. + (build_relations): Adjust. + +2001-12-27 Akim Demaille + + * src/lalr.c (set_goto_map): Remove a wrong but benign loop + duplication. + +2001-12-27 Akim Demaille + + * src/reader.c (packgram): Catch nitems overflows. + +2001-12-27 Akim Demaille + + * src/files.c, src/files.h (guard_obstack): Remove. + * src/output.c (output): Adjust. + * src/reader.c (parse_braces): New, factoring... + (copy_action, copy_guard): these two which are renamed as... + (parse_action, parse_guard): these. + As a voluntary consequence, using braces around guards is now + mandatory. + +2001-12-27 Akim Demaille + + * src/gram.h (rule_t): `guard' and `guard_line' are new members. + * src/reader.c (symbol_list): `guard' and `guard_line' are new + members. + (symbol_list_new): Adjust. + (copy_action): action_line is the first line, not the last. + (copy_guard): Just as for actions, store the `action' only, not + the switch/case/break flesh. + Don't parse the user action that might follow the guard, let... + (readgram): do it, i.e., now, there can be an action after a + guard. + In other words the guard is just explicitly optional. + (packgram): Adjust. + * src/output.c (guards_output): New. + (output_parser): Call it when needed. + (output): Also free the guard and attrs obstacks. + * src/files.c, src/files.h (obstack_save): Remove. + (output_files): Remove. + As a result, if one needs the former `.act' file, using an + appropriate skeleton which requires actions and guards is now + required. + * src/main.c (main): Adjust. + * tests/semantic.at: New. + * tests/regression.at: Use `input.y' as input file name. + Avoid 8+3 problems by requiring input.c when the test needs the + parser. + +2001-12-27 Akim Demaille + + * src/reader.c (symbol_list_new): Be sure to initialize all the + fields. + +2001-12-27 Akim Demaille + + All the hacks using a final pseudo state are now useless. + + * src/LR0.c (set_state_table): state_table holds exactly nstates. + * src/lalr.c (nLA): New. + (initialize_LA, compute_lookaheads, initialize_lookaheads): Use it + instead of lookaheadsp from the pseudo state (nstate + 1). + +2001-12-27 Akim Demaille + + * src/output.c (action_row, token_actions): Use a state_t instead + of a integer, and nlookaheads instead of the following state's + lookaheadsp. + +2001-12-27 Akim Demaille + + * src/conflicts.c (log_resolution, flush_shift) + (resolve_sr_conflict, set_conflicts, solve_conflicts) + (count_sr_conflicts, count_rr_conflicts, conflicts_output) + (conflicts_print, print_reductions): Use a state_t instead of an + integer when referring to a state. + As much as possible, depend upon nlookaheads, instead of the + `lookaheadsp' member of the following state (since lookaheads of + successive states are successive, the difference between state n + 1 + and n served as the number of lookaheads for state n). + * src/lalr.c (add_lookback_edge): Likewise. + * src/print.c (print_core, print_actions, print_state) + (print_results): Likewise. + * src/print_graph.c (print_core, print_actions, print_state) + (print_graph): Likewise. + * src/conflicts.h: Adjust. + +2001-12-27 Akim Demaille + + * src/bison.hairy: Formatting/comment changes. + ANSIfy. + Remove `register' indications. + Add plenty of `static'. + +2001-12-27 Akim Demaille + + * src/output.c (prepare): Drop the muscle `ntbase' which + duplicates ntokens. + * src/bison.simple: Formatting/comment changes. + Use YYNTOKENS only, which is documented, but not YYNTBASE, which + is an undocumented synonym. + +2001-12-22 Akim Demaille + + * src/output.c (output_table_data): Change the prototype to use + `int' for array ranges: some invocations do pass an int, not a + short. + Reported by Wayne Green. + +2001-12-22 Akim Demaille + + Some actions of web2c.y are improperly triggered. + Reported by Mike Castle. + + * src/lalr.c (traverse): s/F (i)[k] = F (j)[k]/F (j)[k] = F (i)[k]/. + * tests/regression.at (Web2c): Rename as... + (Web2c Report): this. + (Web2c Actions): New. + +2001-12-22 Akim Demaille + + Reductions in web2c.y are improperly reported. + Reported by Mike Castle. + + * src/conflicts.c (print_reductions): Fix. + * tests/regression.at (Web2c): New. + +2001-12-18 Akim Demaille + + Some host fail on `assert (!"foo")', which expands to + ((!"foo") ? (void)0 : __assert("!"foo."", __FILE__, __LINE__)) + Reported by Nelson Beebee. + + * src/output.c, src/vcg.c: Replace `assert (!"it succeeded")' with + `#define it_succeeded 0' and `assert (it_succeeded)'. + +2001-12-17 Marc Autret + + * src/bison.simple: Don't hard code the skeleton line and filename. + * src/output.c (output_parser): Rename 'line' as 'output_line'. + New line counter 'skeleton_line' (skeleton-line muscle). + +2001-12-17 Paul Eggert + + * NEWS, doc/bison.texinfo, doc/bison.1, doc/bison.rnh: Document that + YYDEBUG must be defined to a nonzero value. + + * src/bison.simple (yytname): Do not assume that the user defines + YYDEBUG to a properly parenthesized expression. + +2001-12-17 Akim Demaille + + * src/state.h (state_t): Rename lookaheads as lookaheadsp. + nlookaheads is a new member. + Adjust all users. + * src/lalr.h (nlookaheads): Remove this orphan declaration. + * src/lalr.c (initialize_lookaheads): Set nlookaheads for each + state. + +2001-12-17 Akim Demaille + + * src/files.h, src/files.c (open_files, close_files): Remove. + * src/main.c (main): Don't open/close files, nor invoke lex_free, + let... + * src/reader.c (reader): Do it. + +2001-12-17 Akim Demaille + + * src/conflicts.c (print_reductions): Formatting changes. + +2001-12-17 Akim Demaille + + * src/conflicts.c (flush_shift): Also adjust lookaheadset. + (flush_reduce): New. + (resolve_sr_conflict): Adjust. + +2001-12-17 Akim Demaille + + * src/output.c (output_obstack): Be static and rename as... + (format_obstack): this, to avoid any confusion with files.c's + output_obstack. + * src/reader.h (muscle_obstack): Move to... + * src/output.h: here, since it's defined in output.c. + +2001-12-17 Akim Demaille + + * src/output.c (action_row, save_column, default_goto) + (sort_actions, matching_state, pack_vector): Better variable + locality. + +2001-12-17 Akim Demaille + + * src/output.c: Various formatting changes. + +2001-12-17 Akim Demaille + + * src/files.c (output_files): Free the output_obstack. + * src/main.c (main): Call print and print_graph conditionally. + * src/print.c (print): Work unconditionally. + * src/print_graph.c (print_graph): Work unconditionally. + * src/conflicts.c (log_resolution): Output only if verbose_flag. + +2001-12-16 Marc Autret + + * src/output.c (actions_output): Fix. When we use %no-lines, + there is one less line per action. + +2001-12-16 Marc Autret + + * src/bison.simple: Remove a useless #line directive. + s/#line %%line %%skeleton/#line %%line "%%parser-file-name"/'. + * src/output.c (get_lines_number): New. + (output_parser): Adjust, now takes care about the lines of a + output muscles. + Fix line numbering. + (actions_output): Computes the number of lines taken by actions. + (output_master_parser): Insert new skeleton which is the name of + the output parser file name. + +2001-12-15 Marc Autret + + * src/bison.simple [YYERROR_VERBOSE]: Restore backward compatibility. + +2001-12-15 Marc Autret + + * src/output.c (output_gram): Keep track of the hairy one. + +2001-12-15 Akim Demaille + + Make `make distcheck' work. + + * lib/Makefile.am (INCLUDES): Add top_srcdir/intl, since hash uses + system.h which uses libgettext.h. + +2001-12-15 Akim Demaille + + * src/nullable.c (set_nullable): Useless rules must be skipped, + otherwise, since we range over their symbols, we might look at a + nonterminal which no longer ``exists'', i.e., it is not counted in + `nvars', hence we overflow our arrays. + +2001-12-15 Akim Demaille + + The header can also be produced directly, without any obstack! + Yahoo! + + * src/files.c, src/files.h (defines_obstack): Remove. + (compute_header_macro): Global. + (defines_obstack_save): Remove. + * src/reader.c (parse_union_decl): No longer output to + defines_obstack: its content can be found in the `stype' muscle + anyway. + (output_token_translations): Merge into... + (symbols_output): this. + Rename as... + (symbols_save): this. + (reader): Adjust. + * src/output.c (header_output): New. + (output): Call it. + +2001-12-15 Akim Demaille + + * src/reader.c (parse_union_decl): Instead of handling two obstack + simultaneously, use one to define the `stype' muscle, and use the + value of the latter to fill defines_obstack. + (copy_comment): Remove. + (copy_comment2): Work for a single obstack. + Rename as... + (copy_comment): this. + +2001-12-15 Akim Demaille + + * src/lex.c, src/lex.h (xgetc): No longer static. + * src/reader.c (parse_union_decl): Revamp. + +2001-12-15 Akim Demaille + + Still making progress in separating Bison into (i) input, (ii) + process, (iii) output: now we can directly output the parser file + without using table_obstack at all. + + * src/files.c, src/files.h (table_obstack): Bye bye. + (parser_file_name): New. + * src/files.c (compute_output_file_names): Compute it. + * src/output.c (actions_output, output_parser) + (output_master_parser): To a file instead of an obstack. + +2001-12-15 Akim Demaille + + Attach actions to rules, instead of pre-outputting them to + actions_obstack. + + * src/gram.h (rule_t): action and action_line are new members. + * src/reader.c (symbol_list): Likewise. + (copy_action): Save the actions within the rule. + (packgram): Save them in rule_table. + * src/output.c (actions_output): New. + (output_parser): Use it on `%%actions'. + (output_rule_data): Don't free rule_table. + (output): Do it. + (prepare): Don't save the `action' muscle. + * src/bison.simple: s/%%action/%%actions/. + +2001-12-15 Akim Demaille + + * src/reader.c (copy_action): When --yacc, don't append a `;' + to the user action: let it fail if lacking. + Suggested by Arnold Robbins and Tom Tromey. + +2001-12-14 Akim Demaille + + * src/lex.c (literalchar): Simply return the char you decoded, non + longer mess around with obstacks and int pointers. + Adjust all callers. + +2001-12-14 Akim Demaille + + * src/lex.c (literalchar): Don't escape the special characters, + just decode them, and keep them as char (before, eol was output as + the 2 char string `\n' etc.). + * src/output.c (output_rule_data): Use quotearg to output the + token strings. + +2001-12-13 Paul Eggert + + * src/bison.simple (YYSIZE_T, YYSTACK_ALLOC, YYSTACK_FREE): + Do not infringe on the global user namespace when using C++. + (YYFPRINTF, YYSTDERR): New macros, needed for the above. + All uses of `fprintf' and `stderr' changed. + + * doc/bison.texinfo: Document YYFPRINTF, YYSTDERR. + +2001-12-13 Akim Demaille + + The computation of nullable is broken: it doesn't handle empty + RHS's properly. + + * tests/torture.at (GNU AWK Grammar): New. + * tests/sets.at (Nullable): New. + * src/nullable.c (set_nullable): Instead of blindly looping over + `ritems', loop over the rules, and then over their rhs's. + + Work around Autotest bugs. + + * src/warshall.c (bitmatrix_print): Don't use `+--+' as table + frame, because Autotest understand lines starting with a `+' as + traces from the shell. Then, they are not processed properly. + Admittedly an Autotest bug, but we don't have time to wait for + Autotest to catch up. + * tests/regression.at (Broken Closure): Adjust to the new table + frames. + Move to... + * tests/sets.at: here. + +2001-12-13 Akim Demaille + + * src/closure.c (closure): Use nrules instead of playing tricks + with BITS_PER_WORD. + +2001-12-13 Akim Demaille + + * src/print.c (print_actions): Output the handling of `$' as the + traces do: shifting the token EOF. Before EOF was treated as a + nonterminal. + * tests/regression.at: Adjust some tests. + * src/print_graph.c (print_core): Complete the set of items via + closure. The next-to-final and final states are still unsatisfying, + but that's to be addressed elsewhere. + No longer output the rule numbers, but do output the state number. + A single loop for the shifts + gotos is enough, but picked a + distinct color for each. + (print_graph): Initialize and finalize closure. + +2001-12-13 Akim Demaille + + * src/reader.c (readgram): Remove dead code, an strip useless + braces. + (get_type): Remove, unused. + +2001-12-12 Akim Demaille + + * src/complain.h, src/complain.c: Remove error_one_per_line, rely + on that of lib/error.c. + +2001-12-12 Akim Demaille + + Some hosts don't like `/' in includes. + + * src/system.h: Include libgettext.h without qualifying the path. + * src/Makefile.am (INCLUDES): Add $(top_srcdir)/intl, remove + $(top_srcdir). + +2001-12-11 Marc Autret + + * src/output.c (output_parser): Remove useless muscle. + +2001-12-11 Marc Autret + + * src/bison.simple: Remove #line just before %%epilogue. It + is now handled in ... + * src/reader.c (read_additionnal_code): Add the output of a + #line for the epilogue. + +2001-12-10 Marc Autret + + * src/reader.c (copy_definition): Re-use CPP-outed code which + replace precedent remove. + * src/bison.simple: Remove #line before %%prologue because + %%input-line is wrong at this time. + +2001-12-10 Marc Autret + + * src/reader.c (symbols_output): Clean up. + * src/output.c (output_gram, output): Clean up. + +2001-12-10 Akim Demaille + + * src/lalr.c (initialize_lookaheads): New. Extracted from... + * src/LR0.c (set_state_table): here. + * src/lalr.c (lalr): Call it. + +2001-12-10 Akim Demaille + + * src/state.h (shifts): Remove the `number' member: shifts are + attached to state, hence no longer need to be labelled with a + state number. + +2001-12-10 Akim Demaille + + Now that states have a complete set of members, the linked list of + shifts is useless: just fill directly the state's shifts member. + + * src/state.h (shifts): Remove the `next' member. + * src/LR0.c (first_state, last_state): Remove. + Adjust the callers. + (augment_automaton): Don't look for the shifts that must be added + a shift on EOF: it is those of the state we looked for! But now, + since shifts are attached, it is no longer needed to looking + merely by its id: its number. + +2001-12-10 Akim Demaille + + * src/LR0.c (augment_automaton): Better variable locality. + Remove an impossible branch: if there is a state corresponding to + the start symbol being shifted, then there is shift for the start + symbol from the initial state. + +2001-12-10 Akim Demaille + + * src/LR0.c (augment_automaton): Call `insert_eof_shifting_state' + only when appropriate: when insert_start_shifting_state' is not + invoked. + * tests/regression.at (Rule Line Numbers): Adjust. + +2001-12-10 Akim Demaille + + * src/LR0.c (augment_automaton): Now that all states have shifts, + merge the two cases addition shifts to the initial state. + +2001-12-10 Akim Demaille + + * src/lalr.c (set_state_table): Move to... + * src/LR0.c: here. + * src/lalr.c (lalr): Don't call it... + * src/LR0.c (generate_states): do it. + * src/LR0.h (first_state): Remove, only the table is used. + +2001-12-10 Akim Demaille + + * src/LR0.h (first_shift, first_reduction): Remove. + * src/lalr.c: Don't use first_shift: find shifts through the + states. + +2001-12-10 Akim Demaille + + * src/LR0.c: Attach shifts to states as soon as they are + computed. + * src/lalr.c (set_state_table): Instead of assigning shifts to + state, just assert that the mapping was properly done. + +2001-12-10 Akim Demaille + + * src/LR0.c (insert_start_shift): Rename as... + (insert_start_shifting_state): this. + (insert_eof_shifting_state, insert_accepting_state): New. + (augment_automaton): Adjust. + Better locality of the variables. + When looking if the start_symbol is shifted from the initial + state, using `while (... symbol != start_symbol ...)' sounds + better than `while (... symbol < start_symbol ...)': If fail + to see how the order between symbols could be relevant! + +2001-12-10 Akim Demaille + + * src/getargs.h: Don't declare `spec_name_prefix' and + `spec_file_prefix', declared by src/files.h. + * src/files.c, src/files.h: Default for spec_name_prefix is "yy". + * src/muscle_tab.c (muscle_init): Default prefix to NULL. + * src/output.c (prepare): Adjust. + * src/reader.c (symbols_output): Likewise. + * src/vmsgetargs.c: Vaguely adjust, but who cares? + +2001-12-10 Akim Demaille + + * src/muscle_tab.c (muscle_init): NULL is a better default than + `"0"'. + +2001-12-10 Akim Demaille + + * src/reader.c (reader): Calling symbols_output once is enough. + +2001-12-10 Akim Demaille + + Now that states have a complete set of members, the linked list of + reductions is useless: just fill directly the state's reductions + member. + + * src/state.h (struct reductions): Remove member `number' and + `next'. + * src/LR0.c (first_reduction, last_reduction): Remove. + (save_reductions): Don't link the new reductions, store them in + this_state. + * src/lalr.c (set_state_table): No need to attach reductions to + states, it's already done. + * src/output.c (output_actions): No longer free the shifts, then + the reductions, then the states: free all the states and their + members. + +2001-12-10 Akim Demaille + + * src/options.c (OPTN, DRTV, BOTH): New. + (option_table): Use them. + + * src/muscle_tab.c: Don't include xalloc.h and string.h: that's + the job of system.h. + * src/options.c: Don't include stdio.h and xalloc.h for the same + reasons. + +2001-12-10 Akim Demaille + + * src/output.c (output, prepare): Make sure the values of the + muscles `action' and `prologue' are 0-terminated. + +2001-12-10 Akim Demaille + + Clean up GCC warnings. + + * src/reader.c (copy_action): `buf' is not used. + (parse_skel_decl): Be static. + * src/muscle_tab.c (mhash1, mhash2, muscle_insert): Preserve `const'. + * src/options.h (create_long_option_table): Have a real prototype. + * lib/hash.c, lib/hash.h (hash_insert, hash_insert_at, hash_delete) + (hash_delete_at): Return const void *. + Adjust casts to preserve the const. + +2001-12-10 Akim Demaille + + * configure.in: Require 2.52g. + M4 is not needed, but AUTOM4TE is. + * m4/m4.m4: Remove. + * tests/Makefile.am: Adjust. + +2001-12-10 Akim Demaille + + One structure for states is enough, even though theoretically + there are LR(0) states and LALR(1) states. + + * src/lalr.h (state_t): Remove. + (state_table): Be state_t **, not state_t *. + * src/state.h (core, CORE_ALLOC): Rename as... + (state_t, STATE_ALLOC): this. + Add the LALR(1) members: shifts, reductions, errs. + * src/LR0.c (state_table): Rename as... + (state_hash): this, to avoid name clashes with the global + `state_table'. + * src/print_graph.c, src/LR0.c, src/LR0.h, src/conflicts.c + * src/lalr.c, src/lalr.h, src/output.c, src/print.c: Adjust. + +2001-12-10 Akim Demaille + + Bison dumps core on bash.y. + Reported by Pascal Bart. + + * src/warshall.c (bitmatrix_print): New. + (TC): Use it. + When performing a transitive closure R(i, j) && R(j, k) => R(i, k), + j must be the outer loop. + * tests/regression.at (Broken Closure): New. + +2001-12-05 Akim Demaille + + * tests/atlocal.in (CPPFLAGS): Do not leave a space between -I and + its argument. + Reported by Peter Hamorsky. + +2001-12-05 Akim Demaille + + * src/conflicts.c (err_table): Remove. + (resolve_sr_conflict): Adjust. + * src/lalr.h (state_t.reduction_table, state_t.shift_table): + Rename as... + (state_t.reductions, state_t.shifts): this. + +2001-12-05 Akim Demaille + + * src/reduce.c (reduce_grammar_tables): No longer disable the + removal of useless rules via CPP but via `if (0)', so that the + compiler still check the code is valid. + For instance, it should have noticed `rline' no longer exists: use + the `line' member of rule_t. + * src/gram.c (dummy, rline): Remove, unused. + +2001-12-05 Akim Demaille + + * src/output.c (pack_vector): Use assert, not berror. + * src/main.c (berror): Remove, unused. + +2001-12-05 Akim Demaille + + New experimental feature: if --verbose --trace output all the + items of a state, not only its kernel. + + * src/print.c (print_core): If `trace_flag', then invoke closure + before outputting the items of the state (print_core is no longer + a correct name them). + (print_results): Invoke new_closure/free_closure if needed. + +2001-12-05 Akim Demaille + + * src/LR0.c (new_itemsets): Use nshifts only, not shiftcount. + * src/closure.c, src/closure.h (itemsetsize): Rename as... + (nitemset): for consistency with the rest of the project. + +2001-12-05 Akim Demaille + + * src/closure.c (print_closure): Improve. + (closure): Use it for printing input and output. + +2001-12-05 Akim Demaille + + * src/closure.c (FIRSTS, FDERIVES): Adjust to reality: they are + indexed by nonterminals. + +2001-12-05 Akim Demaille + + * src/warshall.c (TC, RTC): De-obsfucate (source reduced to 22% of + what it was!). + * src/warshall.h: Remove accidental duplication of the content. + +2001-12-05 Akim Demaille + + * src/closure.c (set_fderives): De-obfuscate. + +2001-12-05 Akim Demaille + + * src/closure.c (print_firsts, print_fderives): De-obfuscate. + +2001-12-05 Akim Demaille + + * src/closure.c (set_firsts): De-obfuscate. + +2001-12-05 Akim Demaille + + * src/output.c (action_row): De-obfuscate + using the good o' techniques: arrays not pointers, variable + locality, BITISSET, RESETBIT etc. + +2001-12-05 Akim Demaille + + Pessimize the code to simplify it: from now on, all the states + have a valid SHIFTS, which NSHIFTS is possibly 0. + + * src/LR0.c (shifts_new): Be global and move to.. + * src/state.c, src/state.h: here. + * src/conflicts, src/lalr.c, src/output.c, src/print.c, + * src/print_graph: Adjust. + +2001-12-05 Akim Demaille + + * src/state.h (SHIFT_DISABLE, SHIFT_IS_DISABLED): New. + * src/conflicts.c: Use it. + Restore a few missing `if (!SHIFT_IS_DISABLED)' which were + incorrectly ``simplified''. + +2001-12-05 Akim Demaille + + * src/conflicts.c (flush_shift, resolve_sr_conflict): De-obfuscate + using the good o' techniques: arrays not pointers, variable + locality, BITISSET, RESETBIT etc. + +2001-12-05 Akim Demaille + + * src/state.h (SHIFT_SYMBOL): New. + * src/conflicts.c: Use it to deobfuscate. + +2001-12-05 Akim Demaille + + * src/conflicts.c (count_sr_conflicts, count_rr_conflicts) + (print_reductions): De-obfuscate using the good o' techniques: + arrays not pointers, variable locality, BITISSET. + +2001-12-05 Akim Demaille + + * src/conflicts.c (print_reductions): Arrays, not pointers. + Use BITISSET. + +2001-12-05 Akim Demaille + + * src/conflicts.c (print_reductions): Pessimize, but clarify. + +2001-12-05 Akim Demaille + + * src/conflicts.c (print_reductions): Improve variable locality. + +2001-12-05 Akim Demaille + + * src/conflicts.c (print_reductions): Pessimize, but clarify. + +2001-12-05 Akim Demaille + + * src/conflicts.c (print_reductions): Improve variable locality. + +2001-12-05 Akim Demaille + + * src/state.h (SHIFT_IS_ERROR, SHIFT_IS_GOTO, SHIFT_IS_SHIFT): New. + * src/lalr.c: Use them. + +2001-12-05 Akim Demaille + + * src/LR0.c (augment_automaton): Formatting changes. + Better variable locality. + +2001-12-05 Akim Demaille + + * src/lalr.c (matrix_print): New. + (transpose): Use it. + Use arrays instead of pointers. + +2001-12-05 Akim Demaille + + * src/lalr.c (maxrhs): Move to... + * src/gram.c, src/gram.h (ritem_longest_rhs): here. + * src/lalr.c (build_relations): Adjust. + +2001-12-05 Akim Demaille + + * src/lalr.c (transpose): Free the memory allocated to the + argument, as it is replaced by the results by the unique caller. + (build_relations): Merely invoke transpose: it handles the memory + deallocation. + Improve variable locality. + Avoid variables used as mere abbreviations. + (compute_lookaheads): Use arrays instead of pointers. + +2001-12-05 Akim Demaille + + * src/lalr.c (initialize_F): Improve variable locality. + Avoid variables used as mere abbreviations. + +2001-12-05 Akim Demaille + + * src/derives.c (print_derives): Display the ruleno. + * src/lalr.c (initialize_F, transpose): Better variable locality + to improve readability. + Avoid variables used as mere abbreviations. + +2001-12-05 Akim Demaille + + * src/lalr.c (traverse): Use arrays instead of pointers. + +2001-12-05 Akim Demaille + + * src/nullable.c (set_nullable): Use a for loop to de-obfuscate + the handling of squeue. + `symbol >= 0' is wrong now, use `rule_table[ruleno].useful'. + +2001-12-05 Akim Demaille + + Because useless nonterminals are now kept alive (instead of being + `destroyed'), we now sometimes examine them, and store information + related to them. Hence we need to know their number, and adjust + memory allocations. + + * src/reduce.c, src/reduce.h (nuseless_nonterminals): No longer + static. + * src/LR0.c (allocate_itemsets): The memory allocated to + `symbol_count' was used for two different purpose: once to count + the number of occurrences of each symbol, and later reassigned to + `shift_symbol', containing the symbol that can be shifted from a + given state. + Deobfuscate, i.e., allocate, use and free `symbol_count' here + only, and... + (new_itemsets): Allocate `shift_symbol' here. + (allocate_itemsets): symbol_count includes useless nonterminals. + Make room for them. + (free_storage): Use `free', not `XFREE', for pointers that cannot + be null. + +2001-12-05 Akim Demaille + + * src/nullable.c (set_nullable): Deobfuscate the handling of + ritem. + `symbol >= 0' is wrong now, use `rule_table[ruleno].useful'. + +2001-12-05 Akim Demaille + + * src/gram.c, src/gram.h (ritem_print): New. + * src/gram.c (dummy): Remove, now there is actual code in gram.c. + (This useless function was defined only to work around VMS linkers + that can't handle compilation units with variables only). + * src/reduce.c (dump_grammar): Use it to trace the construction of + ritem. + +2001-12-04 Paul Eggert + + * src/bison.simple (union yyalloc): Change member names + to be the same as the stack names. + (yyparse): yyptr is now union yyalloc *, not char *. + (YYSTACK_RELOCATE): Likewise. This avoids a GCC warning, + and may generate better code on some machines. + (yystpcpy): Use prototype if __STDC__ is defined, not just + if __cplusplus is defined. + +2001-11-30 Akim Demaille + + * configure.in (WARNING_CFLAGS): Add -Werror when possible. + (CFLAGS): Do not include the WARNING_CFLAGS here, since GNU + Gettext doesn't compile cleanly, and dies with -Werror. + * src/Makefile.am, lib/Makefile.am, tests/atlocal.in (CFLAGS): + Include WARNING_CFLAGS here. + * lib/xstrdup.c: Include xalloc.h, so that xstrdup be declared + before being defined. + +2001-11-27 Paul Eggert + + * lib/quotearg.h (quotearg_n, quotearg_n_style): + First arg is int, not unsigned. + * lib/quotearg.c (quotearg_n, quotearg_n_style): Likewise. + (SIZE_MAX, UINT_MAX): New macros. + (quotearg_n_options): Abort if N is negative. + Avoid overflow check on hosts where size_t is 64 bits and int + is 32 bits, as overflow is impossible there. + Fix off-by-one typo that caused unnecessary reallocation. + +2001-11-29 Paul Eggert + + Name space cleanup in generated parser. + + * doc/bison.texinfo (Bison Parser): Discuss system headers + and their effect on the user name space. + + * src/bison.simple: + (YYSTACK_ALLOC, YYSTACK_FREE, union yyalloc, YYSTACK_GAP_MAX, + YYSTACK_BYTES, YYSTACK_RELOCATE): Do not define unless necessary, + i.e. unless ! defined (yyoverflow) || defined (YYERROR_VERBOSE). + + (YYSIZE_T): New macro. Use it instead of size_t, to avoid infringing + on user names when possible. + + (YYSTACK_USE_ALLOCA): Do not define; just use any existing defn. + Simplify test for whather exists. + + (): Include if we will use malloc, and if standard C or C++. + + (): Include if YYDEBUG. + + (yymemcpy): Renamed from __yy_memcpy. Do not define unless + ! defined (yyoverflow) && ! defined (yymemcpy). + + (yymemcpy, yyparse): Rename local variables as needed so that + they all begin with 'yy'. + + (yystrlen, yystpcpy): New functions. + + (YY_DECL_NON_LSP_VARIABLES): Renamed from _YY_DECL_VARIABLES. + All uses changed. + + (yyparse): size_t -> YYSIZE_T. Use yystrlen and yystpcpy + instead of relying on string.h functions. Use YYSTACK_ALLOC + and YYSTACK_FREE instead of malloc and free. + +2001-11-30 Akim Demaille + + * src/bison.simple (YYSTYPE, YYLTYPE): Move their definitions + before their first uses. + (YYBISON, YYPURE): Move to the top of the output. + +2001-11-30 Akim Demaille + + * tests/reduce.at (Useless Nonterminals): Fix. + +2001-11-30 Akim Demaille + + * src/bison.simple (YYSTACK_FREE): Use `do {;} while (0)' as empty + if body instead of `;' to pacify GCC's warnings. + +2001-11-30 Akim Demaille + + Instead of mapping the LHS of unused rules to -1, keep the LHS + valid, but flag the rules as invalid. + + * src/gram.h (rule_t): `useful' is a new member. + * src/print.c (print_grammar): Adjust. + * src/derives.c (set_derives): Likewise. + * src/reader.c (packgram, reduce_output): Likewise. + * src/reduce.c (reduce_grammar_tables): Likewise. + * tests/reduce.at (Underivable Rules, Useless Rules): New. + +2001-11-30 Akim Demaille + + * src/reduce.c (reduce_output): Formatting changes. + * src/print.c (print_results, print_grammar): Likewise. + * tests/regression.at (Rule Line Numbers) + (Solved SR Conflicts, Unresolved SR Conflicts): Adjust. + +2001-11-30 Akim Demaille + + * src/reduce.c (nonterminals_reduce): Instead of throwing away + useless nonterminals, move them at the end of the symbol arrays. + (reduce_output): Adjust. + * tests/reduce.at (Useless Nonterminals): Adjust. + +2001-11-30 Akim Demaille + + * src/reduce.c: Various comment/formatting changes. + (nonterminals_reduce): New, extracted from... + (reduce_grammar_tables): here. + (reduce_grammar): Call nonterminals_reduce. + +2001-11-29 Paul Eggert + + * src/bison.simple (YYSTACK_REALLOC): Remove. + (YYSTACK_ALLOC): Resurrect this macro, with its old meaning. + (YYSTACK_FREE, YYSTACK_GAP_MAX, YYSTACK_BYTES, YYSTACK_RELOCATE): + New macros. + (union yyalloc): New type. + (__yy_memcpy): Last arg is size_t, not unsigned int, to remove + an arbitrary restriction on hosts where size_t is wider than int. + + (yyparse): Don't dump core if alloca or malloc fails; instead, report + a parser stack overflow. Allocate just one block of memory for all + three stacks, instead of allocating three blocks; this typically is + faster and reduces fragmentation. + + Do not limit the number of items in the stack to a value that fits + in 'int', as this is an arbitrary limit on hosts with 64-bit + size_t and 32-bit int. + +2001-11-29 Marc Autret + + * tests/calc.at [AT_DATA_CALC_Y]: Use %error-verbose instead + of defining YYERROR_VERBOSE. + [AT_DATA]: $4 is now out of C declarations in the prologue. + +2001-11-28 Marc Autret + + * src/reader.c (parse_dquoted_param): New. + (parse_skel_decl): Use it. + * src/lex.h: Add its prototype. + * src/lex.c (literalchar): Become not static. + +2001-11-28 Marc Autret + + * src/output.h: And put its extern declaration here. + * src/output.c (error_verbose): Define here. + (prepare): Echo name modification. + * src/getargs.h: Clean its extern declaration. + * src/getargs.c (error_verbose_flag): Remove. + (getargs): Remove case 'e'. + * src/options.c (option_table): 'error-verbose' is now seen as simple + percent option. + Include output.h. + + * src/reader.c (read_declarations): Remove case tok_include. + (parse_include_decl): Remove. + * src/lex.h (token_t): Remove tok_include. + * src/options.c (option_table): 'include' is now a simple command line + option. + +2001-11-28 Marc Autret + + * src/bison.simple: Adjust muscle names. + * src/muscle_tab.c (muscle_init): Also rename the muscles. + * src/output.c (prepare): s/_/-/ for the muscles names. + (output_parser): When scanning for a muscle, allow '-' instead of '_'. + +2001-11-28 Marc Autret + + * src/bison.simple: Fix debug. + [YYERROR_VERBOSE]: Re-integrate as an internal macro. + +2001-11-28 Akim Demaille + + * src/LR0.c (shifts_new): New. + (save_shifts, insert_start_shift, augment_automaton): Use it. + +2001-11-28 Akim Demaille + + * src/closure.c (closure): `b' and `ruleno' denote the same value: + keep ruleno only. + +2001-11-28 Akim Demaille + + * src/closure.c (closure): Instead of looping over word in array + then bits in words, loop over bits in array. + +2001-11-28 Akim Demaille + + * src/closure.c (closure): No longer optimize the special case + where all the bits of `ruleset[r]' are set to 0, to make the code + clearer. + +2001-11-28 Akim Demaille + + * src/closure.c (closure): `r' and `c' are new variables, used to + de-obfuscate accesses to RULESET and CORE. + +2001-11-28 Akim Demaille + + * src/reduce.c (reduce_print): Use ngettext. + (dump_grammar): Improve the trace accuracy. + +2001-11-28 Akim Demaille + + * src/reduce.c (dump_grammar): Don't translate trace messages. + +2001-11-28 Akim Demaille + + * tests/reduce.at (Useless Terminals, Useless Nonterminals): New. + * src/reduce.c (reduce_grammar_tables): Do not free useless tags, + as all tags are free'ed afterwards. + From Enrico Scholz. + +2001-11-27 Paul Eggert + + * src/bison.simple (YYSTACK_REALLOC): Fix typo that caused us to + use alloca when we didn't want to, and vice versa. + +2001-11-27 Marc Autret + + * src/muscle_tab.c (muscle_init): Remove 'verbose' muscle + initialization. + * src/output.c (prepare): Remove its update. + +2001-11-27 Marc Autret + + * tests/torture.at [AT_DATA]: Remove YYERROR_VERBOSE definition. + Use %error-verbose. + +2001-11-27 Marc Autret + + * src/bison.simple: Remove YYERROR_VERBOSE using. + Use %%error_verbose. + (yyparse): Likewise. + * src/output.c (prepare): Give its final value. + * src/muscle_tab.c (muscle_init): Init new muscle 'error_verbose'. + * src/getargs.h: Add its extern declaration. + * src/getargs.c (error_verbose_flag): New int. + (getargs): Update to catch new case. + * src/options.c (option_table): 'error-verbose' is a new option. + (shortopts): Update. + +2001-11-27 Akim Demaille + + * src/system.h: Use intl/libgettext.h. + * src/Makefile.am (INCLUDES): Add -I $(top_srcdir). + +2001-11-27 Akim Demaille + + * tests/torture.at (Exploding the Stack Size with Malloc): + s/YYSTACK_USE_ALLOCA_ALLOCA/YYSTACK_USE_ALLOCA/. + +2001-11-27 Akim Demaille + + * src/files.c: Include error.h. + Reported by Hans Aberg. + +2001-11-26 Marc Autret + + * src/reader.c (parse_include_decl): New, not yet implemented. + (read_declarations): Add case tok_include. + * src/getargs.h (include): Add its extern definition. + * src/getargs.c (include): New const char *. + (getargs): Add case '-I'. + * src/options.c (option_table): Add include as command line and + percent option. + * src/lex.h (token_t): Add tok_include. + +2001-11-26 Akim Demaille + + * src/reader.c (readgram): Make sure rules for mid-rule actions + have a lineno equal to that of their host rule. + Reported by Hans Aberg. + * tests/regression.at (Rule Line Numbers): New. + +2001-11-26 Akim Demaille + + * src/LR0.c (allocate_itemsets): kernel_size contains ints, not + size_ts. + +2001-11-26 Akim Demaille + + * src/complain.c, src/complain.h (error): Remove, provided by + lib/error.[ch]. + +2001-11-26 Akim Demaille + + * src/reader.c (read_declarations): Don't abort on tok_illegal, + issue an error message. + * tests/regression.at (Invalid %directive): New. + Reported by Hans Aberg. + +2001-11-26 Akim Demaille + + * configure.in: Invoke AC_FUNC_OBSTACK and AC_FUNC_ERROR_AT_LINE. + * lib/Makefile.am (libbison_a_SOURCES): Adjust. + +2001-11-26 Akim Demaille + + * src/conflicts.c (conflicts_print): Don't complain at all when + there are no reduce/reduce conflicts, and as many shift/reduce + conflicts as expected. + * tests/regression.at (%expect right): Adjust. + +2001-11-23 Akim Demaille + + * lib/alloca.c: Update, from fileutils. + +2001-11-23 Akim Demaille + + * lib/Makefile.am (libbison_a_LIBADD): Add @ALLOCA@. + +2001-11-23 Akim Demaille + + * src/system.h: Include alloca.h. + * src/main.c (main) [C_ALLOCA]: Call alloca (0). + +2001-11-23 Akim Demaille + + * src/print_graph.c (print_actions): Remove `rule', unused. + * src/LR0.c (kernel_size): Contain `int' instead of `size_t' to + pacify GCC's signed < unsigned warnings. + * src/closure.c (itemsetsize): Likewise. + * src/reader.c (symbol_list_new): Static. + +2001-11-23 Akim Demaille + + Attaching lineno to buckets is stupid, since only one copy of each + symbol is kept, only the line of the first occurrence is kept too. + + * src/symtab.h, src/symtab.c (bucket): Remove the line member. + * src/reader.c (rline_allocated): Remove, unused. + (symbol_list): Have a `line' member. + (symbol_list_new): New. + (readgram): Use it. + * src/print.c (print_grammar): Output the rule line numbers. + * tests/regression.at (Solved SR Conflicts) + (Unresolved SR Conflicts): Adjust. + Reported by Hans Aberg. + +2001-11-22 Marc Autret + + * src/bison.simple [YYERROR_VERBOSE]: Force its value to be 1 or 0. + +2001-11-22 Marc Autret + + * src/muscle_tab.c (muscle_init): Remove initialization of + skeleton muscle. + * src/output.c (output_master_parser): Do it here. + +2001-11-20 Akim Demaille + + * po/sv.po: New. + * configure.in (ALL_LINGUAS): Adjust. + * po/POTFILE.in: Remove `nullable.c' and `derives.c' which no + longer contains strings to translate. + +2001-11-19 Akim Demaille + + * src/conflicts.c (conflicts_print): Add a missing \n. + +2001-11-19 Akim Demaille + + * src/nullable.c (nullable_print): New. + (set_nullable): Call it when tracing. + Better locality of variables. + +2001-11-19 Akim Demaille + + * src/print.c (print_actions): Better locality of variables. + +2001-11-19 Akim Demaille + + * src/derives.c (print_derives): Fix and enrich. + * src/closure.c (print_fderives): Likewise. + +2001-11-19 Akim Demaille + + * src/closure.c (itemsetend): Remove, replaced with... + (itemsetsize): new. + +2001-11-19 Akim Demaille + + * src/LR0.c (kernel_end): Remove, replaced with... + (kernel_size): new. + +2001-11-19 Akim Demaille + + * src/conflicts.c (set_conflicts): Use arrays instead of pointers + to clarify. + +2001-11-19 Akim Demaille + + * src/closure.c (closure): Use arrays instead of pointers to clarify. + +2001-11-19 Akim Demaille + + * src/closure.c, src/derives.c, src/nullable.c: Adjust various + trace messages. + * src/LR0.c: Likewise. + (allocate_itemsets): Use arrays instead of pointers to clarify. + +2001-11-19 Akim Demaille + + * src/getargs.c (statistics_flag): Replace with... + (trace_flag): New. + (longopts): Accept --trace instead of --statistics. + * src/getargs.h, src/options.c: Adjust. + * src/LR0.c, src/closure.c, src/derives.c, src/nullable.c, + * src/reduce.c: Use trace_flags instead of the CPP conditional TRACE. + +2001-11-19 Akim Demaille + + * src/LR0.c (new_itemsets, get_state): Use more arrays and fewer + pointers to clarify the code. + (save_reductions, save_shifts): Factor common parts of alternatives. + +2001-11-19 Akim Demaille + + * src/LR0.c (new_state, get_state): Complete TRACE code. + * src/closure.c: Include `reader.h' to get `tags', needed by the + trace code. + Rename the conditional DEBUG as TRACE. + Output consistently TRACEs to stderr, not stdout. + * src/derives.c: Likewise. + * src/reduce.c: (inaccessable_symbols): Using if is better style + than goto. + Use `#if TRACE' instead of `#if 0' for tracing code. + +2001-11-19 Akim Demaille + + * src/system.h (LIST_FREE, shortcpy): New. + * src/LR0.c: Use them. + * src/output.c (free_itemsets, free_reductions, free_shifts): + Remove, replaced by LIST_FREE. + +2001-11-19 Akim Demaille + + * src/state.h (CORE_ALLOC, SHIFTS_ALLOC, ERRS_ALLOC) + (REDUCTIONS_ALLOC): New. + * src/LR0.c, src/conflicts.c: Use them to de-obfuscate memory + allocation. + +2001-11-19 Akim Demaille + + * src/LR0.c (new_state): Complete trace code. + * src/nullable.c (set_nullable): Don't translate traces. + +2001-11-19 Akim Demaille + + * src/print_graph.c (print_core): Better locality of variables. + * src/print.c (print_core): Likewise. + +2001-11-19 Akim Demaille + + * src/vcg.c: You do the output, so you are responsible of the + handling of VCG syntax, in particular: use quotearg. + * src/print_graph.c: Don't. + (print_actions): Don't output the actions as part of the nodes, + since that's the job of the edges. + (print_state): Don't output by hand: fill the node description, + and ask for its output. + +2001-11-19 Akim Demaille + + * src/bison.simple (yyparse): When verbosely reporting an error, + no longer put additional quotes around token names. + * tests/calc.at: Adjust. + +2001-11-19 Akim Demaille + + * src/symtab.h, src/symtab.c: `line' is a new member of `bucket'. + * src/reader.c (record_rule_lines, rline, rline_allocated): Remove. + * src/output.c: Adjust. + +2001-11-19 Akim Demaille + + * src/gram.h (rprec, rprecsym, rassoc): Remove, now part of... + (rule_t): this. + * src/conflicts.c, src/reader.c, src/reduce.c: Adjust. + +2001-11-19 Akim Demaille + + * src/gram.h (rule_t): New. + (rule_table): New. + (rrhs, rlhs): Remove, part of state_t. + * src/print_graph.c, src/closure.c, src/conflicts.c, src/derives.c, + * src/lalr.c, src/nullable.c, src/output.c, src/print.c, + * src/reader.c, src/reduce.c: Adjust. + +2001-11-19 Akim Demaille + + * src/reader.c (symbols_output): New, extracted from... + (packsymbols): Here. + (reader): Call it. + +2001-11-19 Akim Demaille + + * src/lalr.c (set_maxrhs, maxrhs): Remove, replaced with... + (maxrhs): this new function. + +2001-11-19 Akim Demaille + + * src/lalr.c (F): New macro to access the variable F. + Adjust. + +2001-11-19 Akim Demaille + + * src/lalr.h (LA): New macro to access the variable LA. + * src/output.c, src/lalr.c, src/print_graph.c, src/conflicts.c: + * src/lalr.c: Adjust. + +2001-11-19 Akim Demaille + + * src/lalr.c (initialize_LA): Only initialize LA. Let... + (set_state_table): handle the `lookaheads' members. + +2001-11-19 Akim Demaille + + * src/lalr.h (lookaheads): Removed array, whose contents is now + a member of... + (state_t): this structure. + * src/output.c, src/lalr.c, src/print_graph.c, src/conflicts.c: + Adjust. + +2001-11-19 Akim Demaille + + * src/lalr.h (consistent): Removed array, whose contents is now + a member of... + (state_t): this structure. + * src/output.c, src/lalr.c, src/print_graph.c, src/conflicts.c: + Adjust. + +2001-11-19 Akim Demaille + + * src/lalr.h (reduction_table, shift_table): Removed arrays, whose + contents are now members of... + (state_t): this structure. + * src/output.c, src/lalr.c, src/print_graph.c, src/conflicts.c: + Adjust. + +2001-11-19 Akim Demaille + + * src/lalr.h (state_t): New. + (state_table): Be a state_t * instead of a core **. + (accessing_symbol): Remove, part of state_t. + * src/lalr.c: Adjust. + (set_accessing_symbol): Merge into... + (set_state_table): this. + * src/print_graph.c, src/conflicts.c: Adjust. + +2001-11-14 Akim Demaille + + * tests/calc.at, tests/output.at, tests/regression.at, + * tests/testsuite.at, tests/torture.at: Rely on Autotest 2.52g: + now the tests are run in private dirs, therefore AC_CLEANUP and + family can be simplified to 0-ary. + * tests/atlocal.in: Now that we run `elsewhere' than in tests/, + use abs. path to find config.h. + * tests/calc.at (AT_CHECK_CALC): Don't try to check the compiler's + stderr, there can be way too much random noise. + Instead pass -Werror to GCC and rely on the exit status. + Reported by Wolfram Wagner. + +2001-11-14 Akim Demaille + + * src/bison.simple (yyparse): Let yyls1, yyss1 and yyvs1 be + defined only if yyoverflow is defined, to avoid `warning: unused + variable `yyvs1''. + Reported by The Test Suite. + +2001-11-14 Akim Demaille + + * src/print.c: Include reduce.h. + Reported by Hans Aberg. + +2001-11-14 Akim Demaille + + * src/lex.c, src/lex.h (token_buffer, unlexed_token_buffer): + Revert a previous patch: these are really const. + * src/conflicts.c (conflict_report): Additional useless pair of + braces to pacify GCC's warnings for `if () if () {} else {}'. + * src/lex.c (parse_percent_token): Replace equal_offset with + arg_offset. + arg is const. + Be sure to strdup `arg' when used, since there is no reason for + token_buffer not to change. + +2001-11-14 Akim Demaille + + * src/system.h (EXIT_SUCCESS, EXIT_FAILURE): Ensure a proper + definition. + * src/main.c (main): Use them. + Suggested by Hans Aberg. + +2001-11-12 Akim Demaille + + * src/system.h (ngettext): Now that we use ngettext, be sure to + provide a default definition when NLS are not used. + +2001-11-12 Akim Demaille + + * doc/bison.texinfo: Use `$' as shell prompt, not `%'. + Use @kbd to denote user input. + (Language and Grammar): ANSIfy the example. + Adjust its layout for info/notinfo. + (Location Tracking Calc): Output error messages to stderr. + Output locations in a more GNUtically correct way. + Fix a couple of Englishos. + Adjust @group/@end group pairs. + +2001-11-12 Akim Demaille + + %expect was not functioning at all. + + * src/conflicts.c (expected_conflicts): Set to -1. + (conflict_report): Use ngettext. + (conflicts_print): Check %expect and make its violation an error. + * doc/bison.texinfo (Expect Decl): Adjust. + * configure.in (AM_GNU_GETTEXT): Ask for ngettext. + * tests/regression.at (%expect not enough, %expect right) + (%expect too much): New. + +2001-11-12 Akim Demaille + + * tests/regression.at (Conflicts): Rename as... + (Unresolved SR Conflicts): this. + (Solved SR Conflicts): New. + +2001-11-12 Akim Demaille + + * src/reduce.c (print_results): Rename as... + (reduce_output): This. + Output to OUT, passed as argument, instead of output_obstack. + (dump_grammar): Likewise. + (reduce_free): New. + Also free V1. + (reduce_grammar): No longer call reduce_output, since... + * src/print.c (print_results): do it. + * src/main.c (main): Call reduce_free; + +2001-11-12 Akim Demaille + + * src/conflicts.c (print_reductions): Accept OUT as argument. + Output to it, not to output_obstack. + * src/print.c (print_actions): Adjust. + +2001-11-12 Akim Demaille + + * src/conflicts.c (count_sr_conflicts, count_rr_conflicts): Return + the result instead of using... + (src_total, rrc_total, src_count, rrc_count): Remove. + (any_conflicts): Remove. + (print_conflicts): Split into... + (conflicts_print, conflicts_output): New. + * src/conflicts.h: Adjust. + * src/main.c (main): Invoke both conflicts_output and conflicts_print. + * src/print.c (print_grammar): Issue `\n' between two rules. + * tests/regression.at (Conflicts): New. + Reported by Tom Lane. + +2001-11-12 Akim Demaille + + * tests/regression.at (Invalid input): Remove, duplicate with + ``Invalid input: 1''. + +2001-11-12 Akim Demaille + + * tests/torture.at (AT_DATA_STACK_TORTURE) + (Exploding the Stack Size with Alloca) + (Exploding the Stack Size with Malloc): New. + +2001-11-12 Akim Demaille + + * src/bison.simple (YYSTACK_REALLOC): New. + (yyparse) [!yyoverflow]: Use it and free the old stack. + Reported by Per Allansson. + +2001-11-12 Pascal Bart + + * src/bison.simple: Define type yystype instead of YYSTYPE, and + define CPP macro, which substitute YYSTYPE by yystype. + * src/reader.c (parse_union_decl): Output yystype/YYSTYPE as we do + with yyltype/YYLTYPE. This allows inclusion of the generated + header within the parser if the compiler, such as GGC, accepts + multiple equivalent #defines. + From Akim. + +2001-11-05 Akim Demaille + + * src/reader.c (symbols_output): New, extracted from... + (packsymbols): here. + (reader): Adjust. + +2001-11-05 Akim Demaille + + * src/lex.c (parse_percent_token): s/quotearg/quote/. + +2001-11-05 Akim Demaille + + * tests/regression.at (AT_TEST_CPP_GUARD_H): Adjust the clean up + pattern. + +2001-11-05 Akim Demaille + + * src/options.h (struct option_table_struct): set_flags is void*. + * src/options.c (longopts): Support `--output' and `%output'. + (usage): Adjust. + * src/lex.h (tok_setopt): Remove, replaced with... + (tok_intopt, tok_stropt): these new guys. + * src/lex.c (getopt.h): Not needed. + (token_buffer, unlexed_token_buffer): Not const. + (percent_table): Promote `-' over `_' in directive names. + Active `%name-prefix', `file-prefix', and `output'. + (parse_percent_token): Accept possible arguments to directives. + Promote `-' over `_' in directive names. + +2001-11-04 Akim Demaille + + * doc/bison.texinfo (Decl Summary): Split the list into + `directives for grammars' and `directives for bison'. + Sort'em. + Add description of `%name-prefix', `file-prefix', and `output'. + Promote `-' over `_' in directive names. + (Bison Options): s/%locactions/%locations/. Nice Freudian slip. + Simplify the description of `--name-prefix'. + Promote `-' over `_' in directive names. + Promote `--output' over `--output-file'. + Fix the description of `--defines'. + * tests/output.at: Exercise %file-prefix and %output. + +2001-11-02 Akim Demaille + + * doc/refcard.tex: Update. + +2001-11-02 Akim Demaille + + * src/symtab.h (SUNDEF): New. + * src/symtab.c (bucket_new): Init user_token_number to SUNDEF to + stand for `uninitialized', instead of 0. + * src/reader.c (packsymbols, parse_thong_decl): Adjust. + * src/lex.c (lex): Adjust. + + * tests/calc.at (_AT_DATA_CALC_Y): Declare a token for EOF. + Number it 0. + Let yylex return it instead of a plain 0. + Reported by Dick Streefland. + +2001-11-02 Akim Demaille + + * tests/regression.at (Mixing %token styles): New test. + +2001-11-02 Akim Demaille + + * src/reader.c (parse_thong_decl): Formatting changes. + (token_translations_init): New, extracted from... + (packsymbols): Here. + Adjust. + +2001-11-01 Akim Demaille + + * tests/regression.at (AT_TEST_CPP_GUARD_H): New. + Check that `9foo.y' produces correct cpp guards. + * src/files.c (compute_header_macro): Prepend `BISON_' to CPP + guards. + Reported by Wwp. + +2001-11-01 Akim Demaille + + * tests/regression.at (Invalid input: 2): New. + * src/lex.c (unlexed_token_buffer): New. + (lex, unlex): Adjust: when unlexing, be sure to save token_buffer + too. + Reported by Wwp. + +2001-11-01 Akim Demaille + + * tests/calc.at: Catch up with 1.30. + * configure.in: Bump to 1.49a. + Adjust to newer Autotest. + +2001-10-19 Pascal Bart + + * src/conflicts.c: Move global variables rrc_total and src_total ... + (print_conflicts): here. + * src/output.c (output): Free global variable user_toknums. + * src/lex.c (token_obstack): Become static. + +2001-10-18 Akim Demaille + + * tests/atlocal.in (GCC): Add. + * tests/calc.at: s/m4_match/m4_bmatch/. + s/m4_patsubst/m4_bpatsubst/. + (AT_CHECK_CALC): Check the compiler's stderr only if it's GCC. + * configure.in: AC_SUBST(GCC). + +2001-10-14 Marc Autret + + * src/options.c (create_long_option_table): Fix. + +2001-10-10 Akim Demaille + + * src/bison.simple: Be sure to set YYSTACK_USE_ALLOCA. + +2001-10-04 Akim Demaille + + * src/reader.c (parse_union_decl): Push the caracters in + union_obstack, not attrs_obstack. + +2001-10-04 Akim Demaille + + Merge in the branch 1.29. + + * src/reader.c (packsymbols): Use a temporary obstack for + `%%tokendef', since output_stack is already used elsewhere. + + 2001-10-02 Akim Demaille + + Bump 1.29d. + + 2001-10-02 Akim Demaille + + Version 1.29c. + + 2001-10-02 Akim Demaille + + * tests/regression.at (Invalid CPP headers): New. + From Alexander Belopolsky. + * src/files.c (compute_header_macro): Map non alnum chars to `_'. + + 2001-10-02 Akim Demaille + + * tests/regression.at (Invalid input): New. + * src/lex.c (lex): Be sure to set `token_buffer' in any case. + Reported by Shura. + + 2001-10-02 Akim Demaille + + * tests/calc.at: Now that --debug works, the tests must be adjusted. + + 2001-10-02 Akim Demaille + + * src/output.c (output_parser): Assert `skeleton'. + * src/files.c (skeleton_find): Look harder for skeletons on DOSish + systems. + From Shura. + + 2001-10-01 Marc Autret + + * src/lex.h: Echo modifications. + * src/lex.c (unlex): Parameter is now token_t. + From Hans Aberg. + + 2001-10-01 Marc Autret + + * src/main.c: Include lex.h. + From Hans Aberg. + + 2001-09-29 Akim Demaille + + * src/getargs.c (longopts): `--debug' is `-t', not `-d'. + + 2001-09-28 Akim Demaille + + * tests/testsuite.at: Update to newer Autotest. + * tests/Makefile.am (EXTRA_DIST): bison is not to be shipped. + + 2001-09-27 Akim Demaille + + Position independent wrapper. + + * tests/bison: Remove. + * tests/bison.in: New. + * configure.in: Adjust. + + 2001-09-27 Paul Eggert + + Port quotearg fixes from tar 1.13.24. + + * lib/quotearg.c: BSD/OS 4.1 wchar.h requires FILE and struct + tm to be declared. + (HAVE_MBSINIT): Undef if !HAVE_MBRTOWC. + (mbsinit): Define to 1 if !defined mbsinit && !HAVE_MBSINIT. + + * m4/Makefile.am (EXTRA_DIST): Add mbrtowc.m4. + * m4/mbrtowc.m4: New file. + * m4/prereq.m4 (jm_PREREQ_QUOTEARG): Check for mbsinit and stddef.h. + Use jm_FUNC_MBRTOWC instead of AC_CHECK_FUNCS(mbrtowc). + + 2001-09-27 Akim Demaille + + Bump to 1.29c. + + 2001-09-27 Akim Demaille + + Version 1.29b. + + 2001-09-25 Akim Demaille + + * src/system.h: Include `xalloc.h'. + Remove it from the C files. + * src/files.c (output_files): Free the obstacks. + * src/lex.c (init_lex): Rename as... + (lex_init): this. + (lex_free): New. + * src/main.c (main): Use it. + + 2001-09-24 Marc Autret + + * src/vcg.c (open_edge, close_edge, open_node, close_node): Change + to output informations in fout (FILE*). + (open_graph, close_graph): Likewise. + (output_graph, output_edge, output_node): Likewise. + * src/vcg.h: Update function prototypes. + * src/print_graph.c (print_graph): Open output graph file. + (print_actions): Adjust. + * src/files.h: Remove extern declaration. + * src/files.c: Remove graph_obstack declaration. + (open_files): Remove graph_obstack initialization. + (output_files): Remove graph_obstack saving. + + 2001-09-24 Marc Autret + + * src/files.c (compute_output_file_names): Fix. + + 2001-09-24 Marc Autret , + Akim Demaille + + * src/reader.c (reader): Remove call to free_symtab (). + * src/main.c (main): Call it here. + Include symtab.h. + * src/conflicts.c (initialize_conflicts): Rename as... + (solve_conflicts): this. + * src/print.c (print_core, print_actions, print_state) + (print_grammar): Dump to a file instead a `output_obstack'. + (print_results): Dump `output_obstack', and then proceed with the + FILE *. + * src/files.c (compute_output_file_names, close_files): New. + (output_files): Adjust. + * src/main.c (main): Adjust. + + 2001-09-23 Marc Autret + + * src/files.c (compute_header_macro): Computes header macro name + from spec_defines_file when given. + + 2001-09-23 Marc Autret + + * src/files.c (output_files): Add default extensions. + + 2001-09-22 Akim Demaille + + * src/conflicts.c (finalize_conflicts): Rename as... + (free_conflicts): this. + + 2001-09-22 Akim Demaille + + * src/gram.c (gram_free): Rename back as... + (dummy): this. + (output_token_translations): Free `token_translations'. + * src/symtab.c (free_symtab): Free the tag field. + + 2001-09-22 Akim Demaille + + Remove `translations' as it is always set to true. + + * src/gram.h: Adjust. + * src/reader.c (packsymbols, parse_token_decl): Adjust + * src/print.c (print_grammar): Adjust. + * src/output.c (output_token_translations): Adjust. + * src/lex.c (lex): Adjust. + * src/gram.c: Be sure the set pointers to NULL. + (dummy): Rename as... + (gram_free): this. + + 2001-09-22 Akim Demaille + + * configure.in: Invoke AM_LIB_DMALLOC. + * src/system.h: Use dmalloc. + * src/LR0.c: Be sure to have pointers initialized to NULL. + (allocate_itemsets): Allocate kernel_items only if needed. + + 2001-09-22 Akim Demaille + + * configure.in: Bump to 1.29b. + * tests/Makefile.am (DISTCLEANFILES): Add package.m4. + * tests/calc.at (_AT_DATA_CALC_Y): #undef malloc so that we don't + need xmalloc.c in calc.y. + From Pascal Bart. + + 2001-09-21 Akim Demaille + + Version 1.29a. + * Makefile.maint, config/config.guess, config/config.sub, + * config/missing: Update from masters. + * tests/Makefile.am ($(srcdir)/$(TESTSUITE)): No longer depend + upon package.m4. + * configure.in (ALL_LINGUAS): Add `tr'. + + 2001-09-21 Akim Demaille + + * tests/Makefile.am (package.m4): Move to... + ($(srcdir)/$(TESTSUITE)): here. + + 2001-09-20 Akim Demaille + + * src/complain.c: No longer try to be standalone: use system.h. + Don't assume __STDC__ is defined to 1. Just test if it is defined. + * src/complain.h: Likewise. + * src/reduce.c (useless_nonterminals, inaccessable_symbols): + Remove the unused variable `n'. + From Albert Chin-A-Young. + + 2001-09-18 Marc Autret + + * doc/bison.1: Update. + * doc/bison.texinfo (Bison Options): Update --defines and --graph + descriptions. + (Option Cross Key): Update. + Add --graph. + + 2001-09-18 Marc Autret + + * tests/regression.at: New test (comment in %union). + + 2001-09-18 Marc Autret + + * src/reader.c (parse_union_decl): Do not output '/'. Let copy_comment + do that. + Reported by Keith Browne. + + 2001-09-18 Marc Autret + + * tests/output.at: Add tests for --defines and --graph. + + 2001-09-18 Marc Autret + + * tests/output.at: Removes tests of %{header,src}_extension features. + + 2001-09-18 Akim Demaille + + * tests/Makefile.am (package.m4): New. + * tests/calc.at (_AT_CHECK_CALC): Just run `calc input'. + (_AT_CHECK_CALC_ERROR): Likewise. + Factor the `, ' part of verbose error messages. + + 2001-09-18 Marc Autret + + * src/getargs.c (longopts): Declare --defines and --graph as options + with optional arguments. + * src/files.h: Add extern declarations. + * src/files.c (spec_graph_file, spec_defines_file): New. + (output_files): Update. + Remove CPP-outed code. + + 2001-09-18 Marc Autret + + Turn off %{source,header}_extension feature. + + * src/files.c (compute_exts_from_gf): Update. + (compute_exts_from_src): Update. + (output_files): CPP-out useless code. + * src/files.h: Remove {header,source}_extension extern declarations. + * src/reader.c (parse_dquoted_param): CPP-out. + (parse_header_extension_decl): Remove. + (parse_source_extension_decl): Remove. + (read_declarations): Remove cases tok_{hdrext,srcext}. + * src/lex.c (percent_table): Remove {header,source}_extension entries. + * src/lex.h (token_t): Remove tok_hdrext and tok_srcext. + + 2001-09-10 Akim Demaille + + * tests/output.at (AT_CHECK_BISON_FLAGS, AT_CHECK_BISON_PERCENT): + (AT_CHECK_BISON_PERCENT_FLAGS): Merge into... + (AT_CHECK_OUTPUT): this. + Merely check ls' exit status, its output is useless. + + 2001-09-10 Akim Demaille + + * tests/calc.at: Use m4_match. + (_AT_DATA_CALC_Y): Check `yyin != NULL', not `stdin != NULL'. + + 2001-09-10 Marc Autret , + Akim Demaille + + * src/vcg.h (graph_s): color, textcolor, bordercolor are now + enum color_e. + * src/print_graph.c (print_graph): Initalize graph.layoutalgorithm + to `normal'. + * src/reader.c (parse_token_decl): Initialize token with tok_eof. + * src/lex.h: Adjust prototype. + (token_t): Add `tok_undef'. + * src/lex.c (struct percent_table_struct): Retval is now a token_t. + (parse_percent_token): Now returns token_t. + Add default statement in switch. + (lex): Separate `c' as an input variable, from the token_t result + part. + (unlexed): Is a token_t. + + 2001-09-10 Akim Demaille + + * configure.in: Bump to 1.29a. + + 2001-09-07 Akim Demaille + + Version 1.29. + + 2001-08-30 Akim Demaille + + * tests/atgeneral.m4, tests/atconfig.in, tests/suite.at: Remove. + * m4/atconfig.m4: Remove. + * tests/testsuite.at, tests/atlocal.in, tests/output.at, + * tests/bison: New. + * tests/regression.at, tests/calc.at: Use m4_define, AT_BANNER, + m4_if, m4_patsubst, and m4_regexp. + * tests/calc.at (_AT_CHECK_CALC, _AT_CHECK_CALC_ERROR): Use an + `input' file instead of echo. + + 2001-08-29 Akim Demaille + + Bump to 1.28e. + + 2001-08-29 Akim Demaille + + Version 1.28d. + + 2001-08-29 Paul Eggert + + * src/bison.simple (yyparse): Don't take the address of an + item before the start of an array, as that doesn't conform to + the C Standard. + + 2001-08-29 Robert Anisko + + * doc/bison.texinfo (Location Tracking Calc): New node. + + 2001-08-29 Paul Eggert + + * src/output.c (output): Do not define const, as this now + causes more problems than it cures. + + 2001-08-29 Akim Demaille + + * doc/bison.texinfo: Modernize `@node' and `@top' use: just name + the nodes. + Be sure to tag the `detailmenu'. + + 2001-08-29 Akim Demaille + + * Makefile.maint (do-po-update): Wget refuses to overwrite files: + download in a tmp dir. + + 2001-08-28 Marc Autret + + * config/depcomp: New file. + + 2001-08-28 Marc Autret + + * doc/bison.1 (mandoc): Adjust. + From Juan Manuel Guerrero. + + 2001-08-28 Marc Autret + + * src/print_graph.c (print_state): Fix. + + 2001-08-27 Marc Autret + + * src/vcg.h (classname_s, infoname_s, node_s): Constify the + char * members. + Echo modifications to the functions prototypes. + * src/vcg.c (add_classname, add_infoname): Adjust arguments. + + 2001-08-27 Marc Autret + + * src/vcg.c: Include `xalloc.h'. + (add_colorentry): New. + (add_classname): New. + (add_infoname): New. + * src/vcg.h: Add new prototypes. + + 2001-08-27 Akim Demaille + + * Makefile.maint: Sync. again with CVS Autoconf. + + 2001-08-27 Akim Demaille + + * Makefile.maint: Formatting changes. + (po-update, cvs-update, update): New targets. + (AMTAR): Remove. + + 2001-08-27 Akim Demaille + + * Makefile.am (AUTOMAKE_OPTIONS): 1.5. + * Makefile.maint: Sync. with CVS Autoconf. + + 2001-08-27 Marc Autret + + * src/vcg.h (struct infoname_s): New. + (struct colorentry_s): New. + (graph_s): New fields {vertical,horizontal}_order in structure. + Add `infoname' field. + Add `colorentry' field; + * src/vcg_defaults.h (G_VERTICAL_ORDER): New. + (G_HORIZONTAL_ORDER): New. + (G_INFONAME): New. + (G_COLORENTRY): New. + * src/vcg.c (output_graph): Add output of {vertical,horizontal}_order. + Add output of `infoname'. + Add output of `colorentry'. + + 2001-08-27 Marc Autret + + * src/reader.c (parse_dquoted_param): Rename variable `index' to `i'. + This one shadowed a global parameter. + + 2001-08-24 Marc Autret + + * src/print_graph.c (node_output_size): Declared POSIX `size_t' type, + instead of `unsigned'. + (print_state): Do not call obstack_object_size () in obstack_grow () + to avoid macro variables shadowing. + + 2001-08-23 Marc Autret + + * src/lex.c (percent_table): Typo: s/naem/name/. + Add graph option. + Normalize new options declarations. + + 2001-08-20 Pascal Bart + + * tests/suite.at: Exercise %header_extension and %source_extension. + + 2001-08-16 Marc Autret + + * src/reader.c (parse_dquoted_param): New. + (parse_header_extension_decl): Use it. + (parse_source_extension_decl): Likewise. + + 2001-08-16 Marc Autret + + * src/vcg.c: Remove includes of `complain.h' and `xalloc.h'. + (get_xxxx_str): Use assert () instead of complain (). + Remove return invokations in default cases. + (get_decision_str): Modify default behaviour. Remove second argument. + Echo modifications on calls. + (output_graph): Fix. + + 2001-08-16 Marc Autret + + * src/getargs.c (usage): Update with ``-g, --graph''. + + 2001-08-16 Marc Autret + + * doc/bison.texinfo (Bison Options): Add items `-g', `--graph'. + (Option Cross Key): Likewise. + * doc/bison.1: Update. + +2001-09-25 Pascal Bart + + * src/output.c (output_master_parser): Don't finish action_obstack. + (output_parser): Don't care about the muscle action, here. + (prepare): Copy the action_obstack in the action muscle. + (output): Free action_obstack. + +2001-09-23 Pascal Bart + + * src/reader.c (parse_union_decl): Add new obstack union_obstack. Which + will contain `%union' declaration. + (parse_union_decl): Delete #line directive output. + (parse_union_decl): Substitute /attrs_obstack/union_obstack for all + informations about %union. + (parse_union_decl): Copy the union_obstack in the muscle stype. + * src/bison.simple: Add new #line directive. + Add typdef %%stype YYSTYPE. + +2001-09-23 Pascal Bart + + * src/bison.simple: Add new `#line' directive. + +2001-09-22 Pascal Bart + + * src/bison.simple: New `#line' directive. + * src/output.c (output_parser): Support new dynamic muscle input_line. + +2001-09-22 Marc Autret + + * src/output.c (output_master_parser): New. + (output_parser): Be more re-entrant. + +2001-09-21 Marc Autret + + * src/reader.c (copy_definition, parse_union_decl): Update and use + `linef' muscle. + (copy_action): Likewise. + Use obstack_1grow (). + * src/muscle_tab.c (muscle_init): Add muscle `linef'. + +2001-09-21 Marc Autret + + * src/options.c (option_table): Adjust. + * src/lex.c (parse_percent_token): Fix. + +2001-09-20 Pascal Bart + + * src/options.c (symtab.h): Include it, need by lex.h. + +2001-09-20 Pascal Bart + + * src/lex.c (parse_percent_token): Change type of variable `tx', which + is now an option_table_struct*. + (option_strcmp): New function option_strcmp. + (parse_percent_token): Call option_strcmp. + * src/getargs.c (xalloc.h, options.h): Include it. + (getargs): Call create_long_option_table. + (getargs): Free longopts at the end of the function. + (shortopts): Move in options.c. + * src/options.c (create_long_option_table): New function. Convert + information from option_table to option structure. + * src/reader.c (options.h): Include it. + + * src/Makefile.am: Adjust. + * src/options.c (option_table): Create from longopts and percent_table. + * src/getargs.c (longopts): Delete. + * src/lex.c (struct percent_table_struct): Delete. + (percent_table): Delete. + (options.h): Include it. + * src/options.c: Create. + * src/options.h: Create. + Declare enum opt_access_e. + Define struct option_table_struct. + +2001-09-20 Marc Autret + + * doc/bison.texinfo: Adjust terminologies about prologue and epilogue + sections of Bison. + +2001-09-19 Pascal Bart + + * src/bison.simple: s/%%filename/%%skeleton. + * src/muscle_tab.c (getargs.h): Include it. + (muscle_init): Insert new muscle skeleton. + +2001-09-18 Pascal Bart + + * src/output.c (output_parser): Delete unused variable actions_dumped. + +2001-09-07 Pascal Bart + + * src/output.c (output): Delete call to reader_output_yylsp. + * src/reader.c (reader): Likewise. + * src/reader.h: Delete declaration of reader_output_yylsp. + +2001-09-02 Marc Autret + + * src/reader.c: Include muscle_tab.h. + (parse_union_decl): Update. + (parse_macro_decl): Rename parse_muscle_decl. + Update to use renamed functions and variable. + (read_declarations, copy_action, read_additionnal_code, : Updated + with correct variables and functions names. + (packsymbols, reader): Likewise. + + * src/reader.h (muscle_obstack): Extern declaration update. + + * src/output.c: Include muscle_tab.h + In all functions using macro_insert, change by using muscle_insert (). + (macro_obstack): Rename muscle_obstack. + Echo modifications in the whole file. + (MACRO_INSERT_INT): Rename MUSCLE_INSERT_INT. + (MACRO_INSERT_STRING): Rename MUSCLE_INSERT_STRING. + (MACRO_INSERT_PREFIX): Rename MUSCLE_INSERT_PREFIX. + + * src/muscle_tab.h: Update double inclusion macros. + (macro_entry_s): Rename muscle_entry_s. + Update prototypes. + + * src/muscle_tab.c: Include muscle_tab.h. + Rename macro_tabble to muscle_table. + (mhash1, mhash2, mcmp): Use muscle_entry. + (macro_init): Rename muscle_init. Update. + (macro_insert): Rename muscle_insert. Update. + (macro_find): Rename muscle_find. Update. + + * src/main.c: Include muscle_tab.h. + (main): Call muscle_init (). + * src/Makefile.am (bison_SOURCES): Echo modifications. + +2001-09-02 Marc Autret + + Now the files macro_tab.[ch] are named muscle_tab.[ch]. + + * src/muscle_tab.c, src/muscle_tab.h: Add files. + +2001-09-02 Marc Autret + + * src/macrotab.c, src/macrotab.h: Remove. + +2001-09-01 Pascal Bart + + * src/reader.c (copy_guard): Use muscle to specify the `#line' + filename. + +2001-09-01 Marc Autret + + * tests/calc.at (exp): Now, YYERROR_VERBOSE need to be set + to an explicit value to activate the feature. We do it here. + +2001-08-31 Pascal Bart + + * src/output.c (prepare): Delete the `filename' muscule insertion. + * src/reader.c (copy_action): Use `filename' muscule with `#line'. + (parse_union_decl): Likewise. + * src/macrotab.c (macro_init): Initialize filename by infile. + +2001-08-31 Marc Autret + + * src/bison.simple (YYLSP_NEEDED): New definition. + * src/output.c (prepare): Add macro insertion of `locations_flag' + +2001-08-31 Pascal Bart + + * src/output.c (prepare): Delete insertion of previous muscles, + and insert the `prefix' muscles. + * src/macrotab.c (macro_init): Likewise. + (macro_init): Initialization prefix directive by `yy'. + * src/bison.simple: Substitute all %%yylex, %%yychar, %%yylval, + %%yydebug, %%yyerror, %%yynerrs and %%yyparse by yylex, yychar, + yylval, yydebug, yyerror, yynerrs and yyparse. + New directive `#define' to substitute yydebug, ... with option + name_prefix. + +2001-08-31 Pascal Bart + + * src/main.c (main): Standardize. + * src/output.c (output_table_data, output_parser): Likewise. + * src/macrotab.h, src/macrotab.c, src/bison.simple: Likewise. + +2001-08-31 Pascal Bart , Marc Autret + + * src/reader.c (read_additionnal_code): Rename %%user_code to + %%epilogue. + * src/output.c (output): Rename %%declarations to %%prologue. + * src/bison.simple: Echo modifications. + +2001-08-31 Marc Autret + + * src/reader.c (readgram): CleanUp. + (output_token_defines): Likewise. + (packsymbols): Likewise. + (reader): Likewise. + * src/output.c (output): CPP-out useless code. + +2001-08-31 Pascal Bart + + * src/reader.c (reader): Delete obsolete call to function + output_trailers and output_headers. + * src/output.h: Remove obsolete functions prototypes of output_headers + and output_trailers. + +2001-08-30 Pascal Bart + + * src/main.c: Include macrotab.h. + * src/macrotab.h (macro_entry_s): Constify fields. + Adjust functions prototypes. + * src/macrotab.c (macro_insert): Constify key and value. + (macro_find): Constify key. + (macro_insert): Include 'xalloc.h' + (macro_insert): Use XMALLOC. + (macro_find): Constify return value. + * src/output.c (output_table_data): Rename table to table_data. + (output_parser): Constify macro_key, macro_value. + +2001-08-30 Marc Autret + + * src/reader.c (parse_skel_decl): New. + (read_declarations): Add case `tok_skel', call parse_skel_decl (). + * src/lex.h (token_t): New token `tok_skel'. + * src/lex.c (percent_table): Add skeleton option entry. + Standardize. + +2001-08-29 Marc Autret + + * src/bison.simple: Add %%user_code directive at the end. + * src/reader.c (read_additionnal_code): New. + (reader): Use it. + * src/output.c (output_program): Remove. + (output): Update. + +2001-08-28 Marc Autret + + * src/output.c (output_actions): Clean up. + (output_gram): CPP-out useless code. + * src/reader.c (reader): Clean up, CPP-out useless code. + +2001-08-28 Pascal Bart + + * src/output.c (output): Copy attrs_obstack in the '%%definitions' + directive. + * src/bison.simple: Add `%%definitions'. + +2001-08-28 Marc Autret + + * config/depcomp: New file. + +2001-08-27 Paul Eggert + + * src/bison.simple (yyparse): Don't take the address of an + item before the start of an array, as that doesn't conform to + the C Standard. + +2001-08-27 Robert Anisko + + * src/output.c (output): Remove the initialization of the macro + obstack. It was done too late here. + + * src/reader.c (parse_macro_decl): Fix. Use of the macro obstack was + completely wrong. + (reader): Initialize the macro obstack here, since we need it to grow + '%define' directives. + + * src/reader.h: Declare the macro obstack as extern. + +2001-08-27 Robert Anisko + + * src/output.c (output_parser): Fix. Store single '%' characters in + the output obstack instead of throwing them away. + +2001-08-27 Akim Demaille + + * Makefile.am (AUTOMAKE_OPTIONS): 1.5. + +2001-08-25 Robert Anisko + + * lib/Makefile.am: Adjust. + +2001-08-25 Robert Anisko + + * src/bison.simple: Update and add '%%' directives. + +2001-08-25 Robert Anisko + + * src/reader.c (reader): Remove calls to 'output_headers' and + 'output_trailers'. Remove some C output. + (readgram): Disable a piece of code that was writing a default + definition for 'YYSTYPE'. + (reader_output_yylsp): Remove. + (packsymbols): Output token defintions to a macro. + (copy_definition): Disable C output. + + * src/reader.c (parse_macro_decl): New function used to parse macro + declarations. + (copy_string2): Put the body of copy_string into this new function. + Add a parameter to let the caller choose whether he wants to copy the + string delimiters or not. + (copy_string): Be a simple call to copy_string2 with the last argument + bound to true. + (read_declarations): Add case for macro definition. + (copy_identifier): New. + (parse_macro_decl): Read macro identifiers using copy_identifier + rather than lex. + +2001-08-25 Robert Anisko + + * src/output.c (prepare): Add prefixed names. + (output_parser): Output semantic actions. + (output_parser): Fix bug on '%%line' directives. + + * src/output.c (output_headers): Remove. The C code printed by this + function should now be in the skeletons. + (output_trailers): Remove. + (output): Disable call to 'reader_output_yylsp'. + (output_rule_data): Do not output tables to the table obstack. + + * src/output.c: Remove some C dedicated output. + Improve the use of macro and output obstacks. + (output_defines): Remove. + + * src/output.c (output_token_translations): Associate 'translate' + table with a macro. No output to the table obstack. + (output_gram): Same for 'rhs' and 'prhs'. + (output_stos): Same for 'stos'. + (output_rule_data): Same for 'r1' and 'r2'. + (token_actions): Same for 'defact'. + (goto_actions): Same for 'defgoto'. + (output_base): Same for 'pact' and 'pgoto'. + (output_table): Same for 'table'. + (output_check): Same for 'check'. + + * src/output.c (output_table_data): New function. + (output_short_table): Remove. + (output_short_or_char_table): Remove. + + * src/output.c (output_parser): Replace most of the skeleton copy code + with something new. Skeletons are now processed character by character + rather than line by line, and Bison looks for '%%' macros. This is the + first step in making Bison's output process (a lot) more flexible. + (output_parser): Use the macro table. + +2001-08-25 Robert Anisko + + * src/main.c (main): Initialize the macro table. + +2001-08-25 Robert Anisko + + * src/lex.c (percent_table): Add tok_define. + * src/lex.h: Add tok_define. + +2001-08-25 Robert Anisko + + * src/macrotab.c: New file. + * src/macrotab.h: New file. + * src/Makefile.am: Update. + +2001-08-25 Robert Anisko + + * lib/hash.c: New file. + * lib/hash.h: New file. + * lib/Makefile.am: Update. + +2001-08-15 Akim Demaille + + Version 1.28c. + +2001-08-15 Marc Autret + + * src/reader.c (readgram): Indent output macro YYSTYPE. + (packsymbols): Likewise. + (output_token_defines): Likewise. + * src/files.c: Standardize. + (compute_header_macro): New. + (defines_obstack_save): New. Use compute_header_macro. + (output_files): Update. Use defines_obstack_save. + +2001-08-15 Akim Demaille + + * doc/bison.texinfo (Table of Symbols): Document + YYSTACK_USE_ALLOCA. + +2001-08-15 Akim Demaille + + * missing: Update from CVS Automake. + * config/config.guess, config/config.sub, config/texinfo.tex: + Update from gnu.org. + +2001-08-15 Akim Demaille + + * Makefile.maint: Sync with CVS Autoconf. + +2001-08-14 Pascal Bart + + * doc/bison.texinfo: Include GNU Free Documentation License from + `fdl.texi'. + * doc/fdl.texi: Add to package. + +2001-08-14 Marc Autret + + Turn on %{source,header}_extension features. + + * src/lex.c (percent_table): Un-CPP out header_extension and + source_extension. + * src/files.c (compute_exts_from_gf): Compare pointers with NULL. + (compute_exts_from_src): Remove conditions. It restores priorities + between options. + +2001-08-14 Marc Autret + + * src/files.c (compute_base_names): Add extensions computing when + `--file-prefix' used. + Standardize function calls. + +2001-08-13 Marc Autret + + * src/bison.simple (YYSTACK_USE_ALLOCA): Changed to allow users + defining it (defined but null disables alloca). + +2001-08-13 Marc Autret + + * src/bison.simple (_yy_memcpy): CPP reformat. + +2001-08-13 Pascal Bart + + * tests/atconfig.in (CPPFLAGS): Fix. + +2001-08-10 Pascal Bart + + * doc/bison.texinfo: Include GNU General Public License from + `gpl.texi'. + * doc/gpl.texi: Add to package. + +2001-08-10 Marc Autret + + * src/print_graph.h: Fix. + * src/reader.c (read_declarations): Use parse_header_extension_decl (). + +2001-08-10 Akim Demaille + + * src/system.h: Provide default declarations for stpcpy, strndup, + and strnlen. + +2001-08-10 Robert Anisko + + * doc/bison.texinfo (Locations): Update @$ stuff. + +2001-08-09 Robert Anisko + + * src/bison.simple (YYLLOC_DEFAULT): Update. + (yyparse): Adjust. + +2001-08-08 Marc Autret + + * doc/bison.texinfo: Change @samp{$<@dots{}>} to + @samp{$<@dots{}>@var{n}} in Section Actions in Mid-Rule. + Reported by Fabrice Bauzac. + +2001-08-08 Marc Autret + + * src/vcg_default.h: Use NULL instead of 0 to initialize pointers. + * src/vcg.c (output_node): Fix. + * src/vcg.h: Cleanup. + * src/print_graph.c: Add comments. + (node_output_size): New global variable. Simplify the formatting of + the VCG graph output. + (print_actions): Unused code is now used. It notifies the final state + and no action states in the VCG graph. It also give the reduce actions. + The `shift and goto' edges are red and the `go to state' edges are + blue. + Get the current node name and node_obstack by argument. + (node_obstack): New variable. + (print_state): Manage node_obstack. + (print_core): Use node_obstack given by argument. + A node is not only computed here but in print_actions also. + (print_graph): CPP out useless code instead of commenting it. + +2001-08-07 Pascal Bart + + * tests/atconfig.in (CPPFLAGS): Fix. + +2001-08-07 Akim Demaille + + * src/print_graph.c (quote): New. + (print_core): Use it. + +2001-08-06 Akim Demaille , Marc Autret + + * src/vcg.c (complain.h): Include it. + Unepitaize `return' invocations. + [NDEBUG] (main): Remove. + * src/vcg.h (node_t, edge_t, graph_t): Constify the char * members. + * src/files.c (open_files): Initialize graph_obstack. + * src/print_graph.c (print_actions): CPP out useless code. + (print_core): Don't output the last `\n' in labels. + Use `quote'. + * src/files.c (output_files): Output the VCG file. + * src/main.c (main): Invoke print_graph (); + +2001-08-06 Marc Autret + + Automaton VCG graph output. + Using option ``-g'' or long option ``--graph'', you can generate + a gram_filename.vcg file containing a VCG description of the LALR (1) + automaton of your grammar. + + * src/main.c: Call to print_graph() function. + * src/getargs.h: Update. + * src/getargs.c (options): Update to catch `-g' and `--graph' options. + (graph_flag): New flag. + (longopts): Update. + (getargs): Add case `g'. + * src/files.c (graph_obstack): New obstack struct. + (open_files): Initialize new obstack. + (output_files): Saves graph_obstack if required. + * src/files.h (graph_obstack): New extern declaration. + * src/Makefile.am: Add new source files. + +2001-08-06 Marc Autret + + * src/print_graph.c, src/print_graph.h (graph): New. + * src/vcg.h: New file. + * src/vcg.c: New file, VCG graph handling. + +2001-08-06 Marc Autret + + Add of %source_extension and %header_extension which specify + the source or/and the header output file extension. + + * src/files.c (compute_base_names): Remove initialisation of + src_extension and header_extension. + (compute_exts_from_gf): Update. + (compute_exts_from_src): Update. + (output_files): Update. + * src/reader.c (parse_header_extension_decl): New. + (parse_source_extension_decl): New. + (read_declarations): New case statements for the new tokens. + * src/lex.c (percent_table): Add entries for %source_extension + and %header_extension. + * src/lex.h (token_e): New tokens tok_hdrext and tok_srcext. + +2001-08-06 Marc Autret + + * configure.in: Bump to 1.28c. + * doc/bison.texinfo: Texinfo thingies. + +2001-08-04 Pascal Bart + + * tests/atconfig.in (CPPFLAGS): Add. + * tests/calc.at (AT_CHECK): Use CPPFLAGS. + +2001-08-03 Akim Demaille + + Version 1.28b. + +2001-08-03 Akim Demaille + + * tests/Makefile.am (check-local): Ship testsuite. + * tests/calc.at (_AT_DATA_CALC_Y): Prototype all the functions. + Include `string.h'. + +2001-08-03 Akim Demaille + + * configure.in: Try using -Wformat when compiling. + +2001-08-03 Akim Demaille + + * configure.in: Bump to 1.28b. + +2001-08-03 Akim Demaille + + * src/complain.c: Adjust strerror_r portability issues. + +2001-08-03 Akim Demaille + + Version 1.28a. + +2001-08-03 Akim Demaille + + * src/getargs.c, src/getarg.h (skeleton)): Constify. + * src/lex.c (literalchar): Avoid name clashes on `buf'. + * src/getargs.c: Include complain.h. + * src/files.c, src/files.h (skeleton_find): Avoid name clashes. + * lib/quotearg.c, lib/quotearg.h: Update from fileutils 4.1. + +2001-08-03 Akim Demaille + + * src/reader.c (readgram): Display hidden chars in error messages. + +2001-08-03 Akim Demaille + + Update to gettext 0.10.39. + +2001-08-03 Akim Demaille + + * lib/strspn.c: New. + +2001-08-01 Marc Autret + + * doc/bison.texinfo: Update. + * doc/bison.1 (mandoc): Update. + * src/system.h (EXT_GUARD_C, EXT_STYPE_H): Remove .c and .h. + * src/files.c: Support output files extensions computing. + (src_extension): New static variable. + (header_extension): New static variable. + (tr): New function. + (get_extension_index): New function, gets the index of an extension + filename in a string. + (compute_exts_from_gf): New function, computes extensions from the + grammar file extension. + (compute_exts_from_src): New functions, computes extensions from the + C source file extension, file given by ``-o'' option. + (compute_base_names): Update. + (output_files): Update. + +2001-08-01 Robert Anisko + + * doc/bison.texi: Document @$. + (Locations): New section. + +2001-07-18 Akim Demaille + + * Makefile.maint, GNUmakefile: New, from Autoconf 2.52. + * config/prev-version.txt, config/move-if-change: New. + * Makefile.am: Adjust. + +2001-07-08 Pascal Bart + + * src/bison.simple (yyparse): Suppress warning `comparaison + between signed and unsigned'. + +2001-07-05 Pascal Bart + + * src/getargs.h (raw_flag): Remove. + * src/getargs.c: Die on `-r'/`--raw'. + * src/lex.c (parse_percent_token): Die on `%raw'. + * src/reader.c (output_token_defines): Suppress call to `raw_flag'. + * tests/calc.at: Suppress test with option `--raw'. + +2001-07-14 Akim Demaille + + * config/: New. + * configure.in: Require Autoconf 2.50. + Update to gettext 0.10.38. + +2001-03-16 Akim Demaille + + * doc/bison.texinfo: ANSIfy the examples. + +2001-03-16 Akim Demaille + + * getargs.c (skeleton): New variable. + (longopts): --skeleton is a new option. + (shortopts, getargs): -S is a new option. + * getargs.h: Declare skeleton. + * output.c (output_parser): Use it. + +2001-03-16 Akim Demaille + + * m4/strerror_r.m4: New. + * m4/error.m4: Run AC_FUNC_STRERROR_R. + * lib/error.h, lib/error.c: Update. + +2001-03-16 Akim Demaille + + * src/getargs.c (longopts): Clean up. + +2001-02-21 Akim Demaille + + * src/reader.c (gensym): `gensym_count' is your own. + Use a static buf to create the symbol name, as token_buffer is no + longer a buffer. + +2001-02-08 Akim Demaille + + * src/conflicts.c (conflict_report): Be sure not to append to res + between two calls, which could happen if both first sprintf were + skipped, but not the first cp += strlen. + +2001-02-08 Akim Demaille + + * lib/memchr.c, lib/stpcpy.c, lib/strndup.c, lib/strnlen.c: + New, from fileutils 4.0.37. + * configure.in: Require Autoconf 2.49c. I took some time before + making this decision. This is the only way out for portability + issues in Bison, it would mean way too much duplicate effort to + import in Bison features implemented in 2.49c since 2.13. + AC_REPLACE_FUNCS and AC_CHECK_DECLS the functions above. + +2001-02-02 Akim Demaille + + * lib/malloc.c, lib/realloc.c: New, from the fileutils 4.0.37. + * lib/xalloc.h, lib/xmalloc.c: Update. + +2001-01-19 Akim Demaille + + Get rid of the ad hoc handling of token_buffer in the scanner: use + the obstacks. + + * src/lex.c (token_obstack): New. + (init_lex): Initialize it. No longer call... + (grow_token_buffer): this. Remove it. + Adjust all the places which used it to use the obstack. + +2001-01-19 Akim Demaille + + * src/lex.h: Rename all the tokens: + s/\bENDFILE\b/tok_eof/g; + s/\bIDENTIFIER\b/tok_identifier/g; + etc. + Let them be enums, not #define, to ease debugging. + Adjust all the code. + +2001-01-18 Akim Demaille + + * src/lex.h (MAXTOKEN, maxtoken, grow_token_buffer): Remove, private. + * src/lex.c (maxtoken, grow_token_buffer): Static. + +2001-01-18 Akim Demaille + + Since we now use obstacks, more % directives can be enabled. + + * src/lex.c (percent_table): Also accept `%yacc', + `%fixed_output_files', `%defines', `%no_parser', `%verbose', and + `%debug'. + Handle the actions for `%semantic_parser' and `%pure_parser' here, + instead of returning a token. + * src/lex.h (SEMANTIC_PARSER, PURE_PARSER): Remove, unused. + * src/reader.c (read_declarations): Adjust. + * src/files.c (open_files): Don't call `compute_base_names', don't + compute `attrsfile' since they depend upon data which might be + *in* the input file now. + (output_files): Do it here. + * src/output.c (output_headers): Document the fact that this patch + introduces a guaranteed SEGV for semantic parsers. + * doc/bison.texinfo: Document them. + * tests/suite.at: Exercise these %options. + +2000-12-20 Akim Demaille + + Also handle the output file (--verbose) with obstacks. + + * files.c (foutput): Remove. + (output_obstack): New. + Adjust all dependencies. + * src/conflicts.c: Return a string. + * src/system.h (obstack_grow_string): Rename as... + (obstack_sgrow): this. Be ready to work with non literals. + (obstack_fgrow4): New. + +2000-12-20 Akim Demaille + + * src/files.c (open_files): Fix the computation of short_base_name + in the case of `-o foo.tab.c'. + +2000-12-20 Akim Demaille + + * src/reader.c (copy_string, copy_comment, copy_comment2, copy_at) + (copy_dollar): Now that everything uses obstacks, get rid of the + FILE * parameters. + +2000-12-20 Akim Demaille + + * src/files.c (open_files): Actually the `.output' file is based + on the short_base_name, not base_name. + * tests/suite.at (Checking output file names): Adjust. + +2000-12-20 Akim Demaille + + * src/bison.s1: Remove, we now use directly... + * src/bison.simple: this. + * src/Makefile.am: Use pkgdata instead of data. + +2000-12-20 Akim Demaille + + * src/files.c (guard_obstack): New. + (open_files): Initialize it. + (output_files): Dump it... + * src/files.h: Export it. + * src/reader.c (copy_guard): Use it. + +2000-12-19 Akim Demaille + + * src/files.c (outfile, defsfile, actfile): Removed as global + vars. + (open_files): Don't compute them. + (output_files): Adjust. + (base_name, short_base_name): Be global. + Adjust dependencies. + +2000-12-19 Akim Demaille + + * src/files.c (strsuffix): New. + (stringappend): Be just like strcat but allocate. + (base_names): Eve out from open_files. + Try to simplify the rather hairy computation of base_name and + short_base_name. + (open_files): Use it. + * tests/suite.at (Checking output file names): New test. + +2000-12-19 Akim Demaille + + * src/system.h (obstack_grow_literal_string): Rename as... + (obstack_grow_string): this. + * src/output.c (output_parser): Recognize `%% actions' instead of + `$'. + * src/bison.s1: s/$/%% actions/. + * src/bison.hairy: Likewise. + +2000-12-19 Akim Demaille + + * src/output.c (output_parser): Compute the `#line' lines when + there are. + * src/Makefile.am (bison.simple): Be a simple copy of bison.s1. + Suggested by Hans Aberg. + +2000-12-19 Akim Demaille + + Let the handling of the skeleton files be local to the procedures + that use it. + + * src/files.c (xfopen, xfclose, skeleton_find, guardfile): No + longer static. + (fparser, open_extra_files): Remove. + (open_files, output_files): Don't take care of fparser. + * src/files.h: Adjust. + * src/output.c (output_parser): Open and close the file to the + skeleton. + * src/reader.c (read_declarations): When %semantic_parser, open + fguard. + +2000-12-19 Akim Demaille + + * src/file.h (BISON_SIMPLE, BISON_HAIRY): Move from here... + * src/system.h (BISON_SIMPLE, BISON_HAIRY): ... to here. + +2000-12-19 Akim Demaille + + * src/files.c (open_files): Yipee! We no longer need all the code + looking for `/tmp' since we have no tmp file. + +2000-12-19 Akim Demaille + + * src/system.h (EXT_TAB, EXT_OUTPUT, EXT_STYPE_H, EXT_GUARD_C): + New macros. + * src/files.c (open_files): Less dependency on MSDOS etc. + +2000-12-14 Akim Demaille + + * src/bison.s1 (YYLLOC_DEFAULT): New macro. + Provide a default definition. + Use it when executing the default @ action. + * src/reader.c (reader_output_yylsp): No longer include + `timestamp' and `text' in the default YYLTYPE. + +2000-12-12 Akim Demaille + + * src/reader.c (copy_definition, parse_union_decl, copy_action) + (copy_guard): Quote the file names. + Reported by Laurent Mascherpa. + +2000-12-12 Akim Demaille + + * src/output.c (output_headers, output_program, output): Be sure + to escape special characters when outputting filenames. + (ACTSTR_PROLOGUE, ACTSTR_EPILOGUE): Remove. + (output_headers): Don't depend on them, Use ACTSTR. + +2000-11-17 Akim Demaille + + * lib/obstack.h: Formatting changes. + (obstack_grow, obstack_grow0): Don't cast WHERE at all: it + prevents type checking. + (obstack_ptr_grow, obstack_ptr_grow_fast): When assigning, don't + cast the value to (void *): assigning a `foo *' to a `void *' + variable is valid. + (obstack_int_grow, obstack_int_grow_fast): Don't cast AINT to int. + * src/reader.c (parse_union_decl): Typo: use obstack_1grow to + append characters. + +2000-11-17 Akim Demaille + + * tests/Makefile.am (suite.m4, regression.m4, calc.m4): Rename + as... + (suite.m4, regression.m4, calc.m4): these. + * tests/atgeneral.m4: Update from CVS Autoconf. + +2000-11-17 Akim Demaille + + * tests/regression.m4 (%union and --defines): New test, + demonstrating a current bug in the obstack implementation. + +2000-11-17 Akim Demaille + + * src/bison.s1 (_YY_DECL_VARIABLES, YY_DECL_VARIABLES): New + macros. + Use them to declare the variables which are global or local to + `yyparse'. + +2000-11-17 Akim Demaille + + * acconfig.h: Remove, no longer used. + +2000-11-07 Akim Demaille + + * src: s/Copyright (C)/Copyright/g. + +2000-11-07 Akim Demaille + + * src/reader.c (reader): #define YYLSP_NEEDED to 1 instead of just + defining. + * src/bison.s1: s/#ifdef YYLSP_NEEDED/#if YYLSP_NEEDED/. + +2000-11-07 Akim Demaille + + * src/bison.s1 (YYLEX): Use #if instead of #ifdef. + Merge in a single CPP if/else. + +2000-11-07 Akim Demaille + + * src/output.c (output): Remove useless variables. + * lib/obstack.c (obstack_grow, obstack_grow0): Rename the second + argument `data' for consistency with the prototypes. + Qualify it `const'. + (obstack_copy, obstack_copy0): Rename the second argument as + `address' for consistency. Qualify it `const'. + * lib/obstack.h (obstack_copy, obstack_copy0, obstack_grow) + (obstack_grow0, obstack_ptr_grow, obstack_ptr_grow_fast): Qualify + `const' their input argument (`data' or `address'). + Adjust the corresponding macros to include `const' in casts. + +2000-11-03 Akim Demaille + + * src/Makefile.am (INCLUDES): s/PFILE/BISON_SIMPLE/. + s/PFILE1/BISON_HAIRY/. + Adjust dependencies. + +2000-11-03 Akim Demaille + + For some reason, this was not applied. + + * src/files.c [VMS]: No longer include `ssdef.h', no longer define + `unlink': it's no longer used. + +2000-11-03 Akim Demaille + + * src/files.c (skeleton_find): New function, eved out of... + (open_files, open_extra_files): here. + +2000-11-03 Akim Demaille + + Don't use `atexit'. + + * src/files.c (obstack_save): New function. + (done): Rename as... + (output_files): this. + Use `obstack_save'. + * src/main.c (main): Don't use `atexit' to register `done', since + it no longer has to remove tmp files, just call `output_files' + when there are no errors. + +2000-11-02 Akim Demaille + + * src/files.c [VMS]: No longer include `ssdef.h', no longer define + `unlink': it's no longer used. + * src/files.h: Formatting changes. + +2000-11-02 Akim Demaille + + Remove the last uses of mktemp and unlink/delete. + + * src/files.c (fdefines, ftable): Removed. + (defines_ostack, table_obstack): New. + Adjust dependencies of the former into uses of the latter. + * src/output.c (output_short_or_char_table, output_short_table): + Convert to using obstacks. + * src/reader.c (copy_comment2): Accept one FILE * and two + obstacks. + (output_token_defines, reader_output_yylsp): Use obstacks. + * src/system.h (obstack_fgrow3): New. + * po/POTFILES.in: Adjust. + +2000-11-01 Akim Demaille + + Change each use of `fattrs' into a use of `attrs_obstack'. + + * src/reader.c (copy_at): Typo: s/yylloc/yyloc/. + * src/files.c (fattrs): Remove. + (attrs_obstack): New. + Adjust all dependencies. + (done): If SEMANTIC_PARSER, dump attrs_obstack into attrsfile. + +2000-11-01 Akim Demaille + + Introduce obstacks. + Change each use of `faction' into a use of `action_obstack'. + + * lib/obstack.h, lib/obstack.c: New files. + * src/files.c (faction): Remove. + (action_obstack): New. + Adjust all dependencies. + +2000-10-20 Akim Demaille + + * lib/quote.h (PARAMS): New macro. Use it. + +2000-10-16 Akim Demaille + + * src/output.c (output_short_or_char_table): New function. + (output_short_table, output_token_translations): Use it. + (goto_actions): Use output_short_table. + +2000-10-16 Akim Demaille + + * src/symtab.c (bucket_new): New function. + (getsym): Use it. + + * src/output.c (output_short_table): New argument to display the + comment associated with the table. + Adjust dependencies. + (output_gram): Use it. + (output_rule_data): Nicer output layout for YYTNAME. + +2000-10-16 Akim Demaille + + * src/lex.c (read_typename): New function. + (lex): Use it. + * src/reader.c (copy_dollar): Likewise. + +2000-10-16 Akim Demaille + + * src/reader.c (copy_comment2): Expect the input stream to be on + the `/' which is suspected to open a comment, instead of being + called after `//' or `/*' was read. + (copy_comment, copy_definition, parse_union_decl, copy_action) + (copy_guard): Adjust. + +2000-10-16 Akim Demaille + + * src/reader.c (parse_expect_decl): Use `skip_white_space' and + `read_signed_integer'. + +2000-10-16 Akim Demaille + + * src/reader.c (copy_dollar): New function. + (copy_guard, copy_action): Use it. + +2000-10-16 Akim Demaille + + * lib/quote.h, lib/quote.c, lib/quotearg.h, lib/quotearg.c: + * m4/prereq.m4, m4/c-bs-a.m4, m4/mbstate.m4: + New files, from Fileutils 4.0.27. + * src/main.c (printable_version): Remove. + * src/lex.c, src/reader.c: Use `quote'. + +2000-10-04 Akim Demaille + + * lib/error.c, lib/error.h: New files, needed by xmalloc.c. + +2000-10-04 Akim Demaille + + * doc/bison.texinfo: Various typos spotted by Neil Booth. + +2000-10-04 Akim Demaille + + When a literal string is used to define two different tokens, + `bison -v' segfaults. + Reported by Piotr Gackiewicz, and fixed by Neil Booth. + + * tests/regression.m4: New file. + Include the core of the sample provided by Piotr Gackiewicz. + * src/reader.c (parse_token_decl): Diagnose bad cases, and proceed + properly. + +2000-10-04 Akim Demaille + + * src/reader.c (parse_expect_decl): Keep `count' within the size + of `buffer'. + From Neil Booth. + +2000-10-02 Paul Eggert + + * bison.s1 (yyparse): Assign the default value + unconditionally, to avoid a GCC warning and make the parser a + tad smaller. + +2000-10-02 Akim Demaille + + * src/getargs.c (getargs): Don't dump `--help' on unrecognized + options. + +2000-10-02 Akim Demaille + + * src/derives.c, src/print.c, src/reduce.c: To ease the + translation, move some `\n' out of the translated strings. + +2000-10-02 Akim Demaille + + The location tracking mechanism is precious for parse error + messages. Nevertheless, it is enabled only when `@n' is used in + the grammar, which is a different issue (you can use it in error + message, but not in the grammar per se). Therefore, there should + be another means to enable it. + + * src/getargs.c (getargs): Support `--locations'. + (usage): Report it. + * src/getargs.h (locationsflag): Export it. + * src/lex.c (percent_table): Support `%locations'. + * src/reader.c (yylsp_needed): Remove this variable, now replaced + with `locationsflag'. + * doc/bison.texinfo: Document `--locations' and `%locations'. + Sort the options. + * tests/calc.m4: Test it. + + For regularity of the names, replace each + (nolineflag, toknumflag, rawtokenumflag, noparserflag): with... + (no_lineflag, token_tableflag, rawflag, no_parserflag): this. + In addition replace each `flag' with `_flag'. + +2000-10-02 Akim Demaille + + Also test parse error messages, including with YYERROR_VERBOSE. + + * tests/calc.m4 (calc.y): Add support for `exp = exp' (non + associative). + Use it to check the computations. + Use it to check `nonassoc' is honored. + (AT_DATA_CALC_Y): Equip `calc.y' with YYERROR_VERBOSE when passed + `--yyerror-verbose'. + (_AT_CHECK_CALC): Adjust to this option. + (_AT_CHECK_CALC_ERROR): New macro to check parse error messages. + +2000-10-02 Akim Demaille + + Test also `--verbose', `--defines' and `--name-prefix'. Testing + the latter demonstrates a flaw in the handling of non debugging + parsers introduced by myself on 2000-03-16: `#define yydebug 0' + was used in order to simplify: + + #if YYDEBUG + if (yydebug) + { + ... + } + #endif + + into + + if (yydebug) + { + ... + } + + unfortunately this leads to a CPP conflict when + `--name-prefix=foo' is used since it produces `#define yydebug + foodebug'. + + * src/bison.s1 [!YYDEBUG]: Do not define yydebug. + (YYDPRINTF): New macro. + Spread its use. + * tests/calc.m4 (AT_CHECK_CALC): Do require a title, build it from + the bison options. + Also test `--verbose', `--defines' and `--name-prefix'. + +2000-10-02 Akim Demaille + + Improve the readability of the produced parsers. + + * src/bison.s1: Formatting changes. + Improve the comment related to the `$' mark. + (yydefault): Don't fall through to `yyresume': `goto' there. + * src/output.c (output_parser): When the `$' is met, skip the end + of its line. + New variable, `number_of_dollar_signs', to check there's exactly + one `$' in the parser skeleton. + +2000-10-02 Akim Demaille + + * lib/xstrdup.c: New file, from the fileutils. + * src/reader.c (parse_token_decl, get_type_name, parse_type_decl) + (parse_assoc_decl, parse_thong_decl, get_type): Use `xstrdup' + instead of strlen + xmalloc + strcpy. + * src/symtab.c (copys): Remove, use xstrdup instead. + +2000-10-02 Akim Demaille + + * src/gram.h (associativity): New enum type which replaces the + former CPP macros `RIGHT_ASSOC', `LEFT_ASSOC' and `NON_ASSOC' with + `right_assoc', `left_assoc' and `non_assoc'. + Adjust all dependencies. + * src/reader.c: Formatting changes. + (LTYPESTR): Don't define it, use it as a literal in + `reader_output_yylsp'. + * src/symtab.h (symbol_class): New enum type which replaces the + former CPP macros `SUNKNOWN', `STOKEN and `SNTERM' with + `sunknown', `stoken and `snterm'. + +2000-10-02 Akim Demaille + + * src/getargs.c (fixed_outfiles): Rename as... + (yaccflag): for consistency and accuracy. + Adjust dependencies. + +2000-10-02 Akim Demaille + + Use the more standard files `xalloc.h' and `xmalloc.c' instead of + Bison's `allocate.c' and `alloc.h'. This patch was surprisingly + difficult and introduced a lot of core dump. It turns out that + Bison used an implementation of `xmalloc' based on `calloc', and + at various places it does depend upon the initialization to 0. I + have not tried to isolate the pertinent places, and all the former + calls to Bison's `xmalloc' are now using `XCALLOC'. Someday, + someone should address this issue. + + * src/allocate.c, src/alloc.h, m4/bison-decl.m4: Remove. + * lib/xmalloc.c, lib/xalloc.h, m4/malloc.m4, m4/realloc.m4: New + files. + Adjust dependencies. + * src/warshall.h: New file. + Propagate. + +2000-10-02 Akim Demaille + + Various anti-`extern in *.c' changes. + + * src/system.h: Include `assert.h'. + +2000-10-02 Akim Demaille + + * src/state.h (nstates, final_state, first_state, first_shift) + (first_reduction): Move their exportation from here... + * src/LR0.h: to here. + Adjust dependencies. + * src/getargs.c (statisticsflag): New variable. + Add support for `--statistics'. + Adjust dependencies. + + Remove a lot of now useless `extern' statements in most files. + +2000-10-02 Akim Demaille + + * src/LR0.h: New file. + Propagate its use. + +2000-10-02 Akim Demaille + + * src/print.h: New file. + Propagate its use. + * src/print.c: Formatting and ordering changes. + (verbose, terse): Replace with... + (print_results): this new function. + Adjust dependencies. + +2000-10-02 Akim Demaille + + * src/conflicts.c (conflict_report): New function. + (conflict_log, verbose_conflict_log): Replace with... + (print_conflicts): this function. + Adjust dependencies. + * src/conflicts.h: New file. + Propagate its inclusion. + +2000-10-02 Akim Demaille + + * src/nullable.h: New file. + Propagate its inclusion. + * src/nullable.c: Formatting changes. + +2000-10-02 Akim Demaille + + * src/reduce.h: New file. + Propagate its inclusion. + * src/reduce.c: Topological sort and other formatting changes. + (bool, TRUE, FALSE): Move their definition to... + * src/system.h: here. + +2000-10-02 Akim Demaille + + * src/files.c: Formatting changes. + (tryopen, tryclose, openfiles): Rename as... + (xfopen, xfclose, open_files): this. + (stringappend): static. + * src/files.h: Complete the list of exported symbols. + Propagate its use. + +2000-10-02 Akim Demaille + + * src/reader.h: New file. + Propagate its use instead of tedious list of `extern' and + prototypes. + * src/reader.c: Formatting changes, topological sort, + s/register//. + +2000-10-02 Akim Demaille + + * src/lex.h: Prototype `lex.c' exported functions. + * src/reader.c: Adjust. + * src/lex.c: Formatting changes. + (safegetc): Rename as... + (xgetc): this. + +2000-10-02 Akim Demaille + + * src/lalr.h: New file. + Propagate its inclusion instead of prototypes and `extern'. + * src/lalr.c: Formatting changes, topological sorting etc. + +2000-10-02 Akim Demaille + + * src/output.c (token_actions): Introduce a temporary array, + YYDEFACT, that makes it possible for this function to use + output_short_table. + +2000-10-02 Akim Demaille + + `user_toknums' is output as a `short[]' in `output.c', while it is + defined as a `int[]' in `reader.c'. For consistency with the + other output tables, `user_toknums' is now defined as a table of + shorts. + + * src/reader.c (user_toknums): Be a short table instead of an int + table. + Adjust dependencies. + + Factor the short table outputs. + + * src/output.c (output_short_table): New function. + * src/output.c (output_gram, output_stos, output_rule_data) + (output_base, output_table, output_check): Use it. + +2000-10-02 Akim Demaille + + * src/output.c (output): Topological sort of the functions, in + order to get rid of the `static' prototypes. + No longer use `register'. + * src/output.h: New file. + Propagate its inclusion in files explicitly prototyping functions + from output.c. + +2000-09-21 Akim Demaille + + * src/atgeneral.m4: Update from Autoconf. + +2000-09-21 Akim Demaille + + * src/closure.h: New file. + * src/closure.c: Formatting changes, topological sort over the + functions, use of closure.h. + (initialize_closure, finalize_closure): Rename as... + (new_closure, free_closure): these. Adjust dependencies. + * src/LR0.c: Formatting changes, topological sort, use of + cloture.h. + (initialize_states): Rename as... + (new_states): this. + * src/Makefile.am (noinst_HEADERS): Adjust. + +2000-09-20 Akim Demaille + + * src/acconfig.h: Don't protect config.h against multiple + inclusion. + Don't define PARAMS. + * src/system.h: Define PARAMS. + Remove some of the ad-hoc CPP magic for DOS, VMS etc.: this is the + purpose of config.h. system.h must not try to fix wrong + definitions in config.h. + +2000-09-20 Akim Demaille + + * src/derives.h: New file. + * src/main.c, src/derives.h: Use it. + Formatting changes. + * src/Makefile.am (noinst_HEADERS): Adjust. + +2000-09-20 Akim Demaille + + * tests/atgeneral.m4: Update from Autoconf. + * tests/calc.m4 (_AT_DATA_CALC_Y, AT_DATA_CALC_Y, _AT_CHECK_CALC) + (AT_CHECK_CALC): New macros. + Use these macros to test bison with options `', `--raw', + `--debug', `--yacc', `--yacc --debug'. + +2000-09-19 Akim Demaille + + * src/output.c: Formatting changes. + * src/machine.h: Remove, leaving its contents in... + * src/system.h: here. + Include stdio.h. + Adjust all dependencies on stdio.h and machine.h. + * src/getargs.h: New file. + Let all `extern' declarations about getargs.c be replaced with + inclusion of `getargs.h'. + * src/Makefile.am (noinst_HEADERS): Adjust. + + * tests/calc.m4 (yyin): Be initialized in main, not on the global + scope. + (yyerror): Returns void, not int. + * doc/bison.texinfo: Formatting changes. + +2000-09-19 Akim Demaille + + * tests/calc.m4 (calc.y): Do not assign to stdin, as it's not + portable. + +2000-09-18 Akim Demaille + + * configure.in: Append WARNING_CFLAGS to CFLAGS. + * src/Makefile.am (INCLUDES): Don't. + Be ready to fetch headers in lib/. + +2000-09-18 Akim Demaille + + * doc/bison.texinfo: Update the copyright. + ANSIfy and GNUify the examples. + Remove the old menu. + +2000-09-18 Akim Demaille + + First set of tests: use the `calc' example from the documentation. + + * src/bison.s1 (yyparse): Condition the code using `yytname' which + is defined only when YYDEBUG is. + * m4/atconfig.m4 (AT_CONFIG): Adjust to Autoconf 2.13. + * src/files.c (tryopen, tryclose): Formatting changes. + Move to the top and be static. + * src/reader.c (read_signed_integer): Likewise. + * tests/calc.m4: New file. + * Makefile.am, suite.m4: Adjust. + * m4/atconfig.m4: Set BISON_SIMPLE and BISON_HAIRY. + +2000-09-18 Akim Demaille + + Add support for an Autotest test suite for Bison. + + * m4/m4.m4, m4/atconfig.m4: New files. + * m4/Makefile.am (EXTRA_DIST): Adjust. + * tests/suite.m4, tests/Makefile.am, tests/atgeneral.m4: New + files. + * src/getargs.c: Display a more standard --version message. + * src/reader.c (reader): Formatting changes. + No longer depend upon VERSION_STRING. + * configure.in: No longer use `dnl'. + Set up the test suite and the new directory `tests/. + (VERSION_STRING): Remove. + +2000-04-14 Akim Demaille + + * src/reader.c (copy_comment2): New function, same as former + `copy_comment', but outputs into two FILE *. + (copy_comment): Use it. + (parse_union_decl): Use it. + (get_type, parse_start_decl): Use the same `invalid' message. + (parse_start_decl, parse_union_decl): Use the same `multiple' + message. + (parse_union_decl, copy_guard, copy_action): Use the same + `unmatched' message. + * m4/Makefile.am (EXTRA_DIST): Add `warning.m4'. + +2000-03-31 Akim Demaille + + * src/files.c (tryopen, tryclose): Move to the top. + Be static. + +2000-03-31 Akim Demaille + + * src/main.c (main): Don't call `done', exit does it. + +2000-03-31 Akim Demaille + + * allocate.c: s/return (foo)/return foo/. + * lalr.c: Likewise. + * LR0.c: Likewise. + * output.c: Likewise. + * reader.c: Likewise. + * symtab.c: Likewise. + * vmsgetargs.c: Likewise. + +2000-03-31 Akim Demaille + + Clean up the error reporting functions. + + * src/report.c: New file. + * src/report.h: Likewise. + * src/Makefile.am: Adjust. + * m4/error.m4: New file. + * m4/Makefile.am: Adjust. + * configure.in (jm_PREREQ_ERROR): Call it. + * src/main.c (int_to_string, banner, fatal_banner, warn_banner): + Remove. + (fatal, fatals): Remove. All callers use complain.c::fatal. + (warn, warni, warns, warnss, warnss): Remove. All callers use + complain.c::complain. + (toomany): Remove, use fatal instead. + * src/files.c (done): No argument, use complain_message_count. + * src/main.c (main): Register `done' to `atexit'. + + * src/getargs.c (usage): More `fputs', less `fprintf'. + +2000-03-28 Akim Demaille + + * lib/: New directory. + * Makefile.am (SUBDIRS): Adjust. + * configure.in: Adjust. + (LIBOBJS): Although not used yet, AC_SUBST it, otherwise it's + useless. + * src/alloca.c: Moved to lib/. + * src/getopt.c: Likewise. + * src/getopt1.c: Likewise. + * src/getopt.h: Likewise. + * src/ansi2knr.c: Likewise. + * src/ansi2knr.1: Likewise. + * src/Makefile.am: Adjust. + * lib/Makefile.am: New file. + +2000-03-28 Akim Demaille + + * src/getargs.c (usage): Refresh the help message. + +2000-03-17 Akim Demaille + + * src/getopt1.c: Updated from textutils 2.0e + * src/getopt.c: Likewise. + * src/getopt.h: Likewise. + +2000-03-17 Akim Demaille + + * src/Makefile.am (bison.simple): Fix the awk program: quote only + the file name, not the whole `#line LINE FILE'. + +2000-03-17 Akim Demaille + + On syntax errors, report the token on which we choked. + + * src/bison.s1 (yyparse): In the label yyerrlab, when + YYERROR_VERBOSE, add yychar in msg. + +2000-03-17 Akim Demaille + + * src/reader.c (copy_at): New function. + (copy_guard): Use it. + (copy_action): Use it. + +2000-03-17 Akim Demaille + + Be kind to translators, save some useless translations. + + * src/main.c (banner): New function. + (fatal_banner): Use it. + (warn_banner): Use it. + +2000-03-17 Akim Demaille + + * src/reader.c (copy_definition): Use copy_string and + copy_comment. Removed now unused `match', `ended', + `cplus_comment'. + (copy_comment, copy_string): Moved, to be visible from + copy_definition. + +2000-03-17 Akim Demaille + + * src/reader.c (copy_string): Declare `static inline'. No + problems with inline, since it is checked by configure. + (copy_comment): Likewise. + +2000-03-17 Akim Demaille + + * src/reader.c (packsymbols): Formatting changes. + +2000-03-17 Akim Demaille + + * src/reader.c (copy_comment): New function, factored out from: + (copy_action): Use it. Removed now unused `match', `ended', + `cplus_comment'. + (copy_guard): Likewise. + +2000-03-17 Akim Demaille + + * src/reader.c (copy_string): New function, factored out from: + (copy_action): Use it. + (copy_guard): Likewise. + +2000-03-17 Akim Demaille + + Change the handling of @s so that they behave exactly like $s. + There is now a pseudo variable @$ (readble and writable), location + of the lhs of the rule (by default ranging from the location of + the first symbol of the rhs, to the location of the last symbol, + or, if the rhs is empty, YYLLOC). + + * src/bison.s1 [YYLSP_NEEDED] (yyloc): New variable, twin of + yyval. + (yyparse): When providing a default semantic action, provide a + default location action. + (after the $): No longer change `*YYLSP', just stack YYLOC the + same way you stack YYVAL. + * src/reader.c (read_declarations): Use warns. + (copy_guard, case '@'): Also recognize `@$', expanded as `YYLOC'. + (copy_action, case '@'): Likewise. + Use a standard error message, to save useless work from + translators. + +2000-03-17 Akim Demaille + + * src/bison.s1: Formatting and cosmetics changes. + * src/reader.c: Likewise. + Update the Copyright notice. + +2000-03-17 Akim Demaille + + * src/bison.s1 (#line): All set to `#line' only, since the + Makefile now handles them. + +2000-03-16 Akim Demaille + + * src/output.c (output_rule_data): Output the documentation of + some of the tables. + (Copyright notice): Update. + Formatting changes. + +2000-03-16 Akim Demaille + + * src/bison.s1 [!YYDEBUG]: Define yydebug to 0. This allows to + remove most `#if YYDEBUG != 0', since `if (yydebug)' is enough. + One `#if YYDEBUG' remains, since it uses variables which are + defined only if `YYDEBUG != 0'. + +2000-03-16 Akim Demaille + + * src/bison.s1 (yyparse): Reorganize the definitions of the stacks + and related variables so that the similarities are highlighted. + +2000-03-16 Akim Demaille + + * src/bison.s1: Properly indent CPP directives. + +2000-03-16 Akim Demaille + + * src/bison.s1: Properly indent the `alloca' CPP section. + +2000-03-16 Akim Demaille + + Do not hard code values of directories in `configure.in'. + Update the `configure' tool chain. + + * configure.in (XPFILE, XPFILE1, LOCALEDIR): Remove, handled by + src/makefile.am. + (VERSION_STRING): Use the third arg of AC_DEFINE_UNQUOTED. + (AC_OUTPUT): Add m4/Makefile. + Bump to bison 1.28a, 1.29 has never been released. + * acconfig.h (XPFILE, XPFILE1, LOCALEDIR): Remove, since they are + handled via src/Makefile.am. + (VERSION_STRING, PROTOTYPES, ENABLE_NLS, HAVE_CATGETS, + HAVE_GETTEXT, HAVE_LC_MESSAGES, HAVE_STPCPY): Remove, handled by + autoheader. + * Makefile.am (SUBDIRS): Add m4. + (ACLOCAL_AM_FLAGS): New variable. + (AUTOMAKE_OPTIONS): Add check-news. + * src/Makefile.am (bison.simple): Use awk to replace #line lines with + the proper line number and file name. + (DEFS): Propagate the location of bison library files and of the + locale files. + (INCLUDES): Added `-I ..' so that one can compile with srcdir != + builddir. + * acinclude.m4: Remove, replaced by the directory m4. + * m4/Makefile.am (EXTRA_DIST): New variable. + * m4/gettext.m4: New file, from the fileutils. + * m4/lcmessage.m4: Likewise + * m4/progtest.m4: Likewise. + * m4/bison-decl.m4: New file, extracted from former acinclude.m4. + +2000-03-10 Akim Demaille + + * src/closure.c: + Formatting changes of various comments. + Respect the GNU coding standards at various places. + Don't use `_()' when no translation is needed. + +1999-12-13 Jesse Thilo + + * src/files.c: + OS/2 honors TMPDIR environment variable. + +1999-12-13 Jesse Thilo + + * doc/bison.texinfo: Tweaked spelling and grammar. + Updated ISBN. + Removed reference to price of printed copy. + Mention BISON_SIMPLE and BISON_HAIRY. + +1999-12-13 Jesse Thilo + + * configure.in, NEWS: + Bison 1.29 released. + +1999-10-27 Jesse Thilo + + * doc/.cvsignore, doc/Makefile.am, doc/refcard.tex: + Added reference card. + +1999-07-26 Jesse Thilo + + * po/ru.po: Added Russian translation. + +1999-07-26 Jesse Thilo + + * configure.in: Added Russian translation. + +1999-07-06 Jesse Thilo + + * configure.in, NEWS, README: + Released version 1.28. + +1999-06-14 Jesse Thilo + + * src/system.h: + Squashed redefinition warning on some systems. + + * src/getargs.c, src/Makefile.am, src/reader.c, src/version.c: + Have configure build version string instead of relying on ANSI string + concatentation. + +1999-06-14 Jesse Thilo + + * po/POTFILES.in: Got rid of version.c. + +1999-06-14 Jesse Thilo + + * acconfig.h, configure.in: + Have configure build version string instead of relying on ANSI string + concatentation. + +1999-06-08 Jesse Thilo + + * doc/bison.1: + Dropped mention of `+' for long-named options. + +1999-05-30 Jesse Thilo + + * src/files.c: Added for unlink(). + + * src/Makefile.am, src/system.h: + I18n fixes. + +1999-05-30 Jesse Thilo + + * README: Added a FAQ list. + + * configure.in, acconfig.h: + I18n fixes. + +1999-05-30 Jesse Thilo + + * doc/FAQ, doc/Makefile.am: + Added a FAQ list. + +1999-05-19 Jesse Thilo + + * src/alloc.h, src/symtab.h, src/version.c: + Protected inclusion of "config.h" with HAVE_CONFIG_H. + +1999-04-18 Jesse Thilo + + * src/.cvsignore, src/Makefile.am: + Reorganized: sources in `src', documentation in `doc'. + + * src/lex.c (literalchar): + fixed the code for escaping double quotes (thanks + Jonathan Czisny.) + +1999-04-18 Jesse Thilo + + * po/de.po, po/es.po, po/fr.po, po/nl.po, po/POTFILES.in: + Adjusted paths to reflect directory reorganization. + +1999-04-18 Jesse Thilo + + * doc/.cvsignore, doc/Makefile.am: + Reorganized: sources in `src', documentation in `doc'. + +1999-04-18 Jesse Thilo + + * configure.in: + Updated AC_INIT file to reflect directory reorganization. + + * configure.in, .cvsignore, Makefile.am, POTFILES.in: + Reorganized: sources in `src', documentation in `doc'. + +1999-04-13 Jesse Thilo + + * src/allocate.c: + Don't declare calloc() and realloc() if not necessary. + +1999-04-13 Jesse Thilo + + * configure.in, acconfig.h, acinclude.m4: + Don't declare calloc() and realloc() if not necessary. + +1999-03-23 Jesse Thilo + + * po/.cvsignore: Added i18n support. + +1999-03-23 Jesse Thilo + + * acconfig.h, configure.in, Makefile.am: + Added i18n support. + +1999-03-22 Jesse Thilo + + * src/bison.s1: Fixed #line numbers. + +1999-03-15 Jesse Thilo + + * po/es.po, po/fr.po, po/nl.po, po/de.po: + Added PO files from Translation Project. + +1999-03-03 Jesse Thilo + + * Makefile.am: + Added support for non-ANSI compilers (ansi2knr). + +1999-02-16 Jesse Thilo + + * configure.in: Bumped version number to 1.27. + + * Makefile.am: + Added `bison.simple' to list of files removed by `make distclean'. + +1999-02-12 Jesse Thilo + + * src/files.c, src/files.h: + Defined locations of parser files in config.h instead of Makefile. + +1999-02-12 Jesse Thilo + + * acconfig.h, acinclude.m4, configure.in, Makefile.am: + Defined locations of parser files in config.h instead of Makefile. + +1999-02-09 Jesse Thilo + + * Makefile.am: + Removed inappropriate use of $< macro. + +1999-02-05 Jesse Thilo + + * po/Makefile.in.in, po/POTFILES.in: + Add `po' directory skeleton. + +1999-01-27 Jesse Thilo + + * README: Document help-bison list. + + * configure.in: Add check for mkstemp(). + +1999-01-20 Jesse Thilo + + * src/conflicts.c, src/LR0.c, src/output.c, src/reader.c: + Hush a few compiler warnings. + + * src/files.c: + Add tryclose(), which verifies that fclose was successful. + Hush a couple of compiler warnings. + +1999-01-20 Jesse Thilo + + * Makefile.am, OChangeLog: + ChangeLog is now automatically generated. Include the old version as + OChangeLog. + +1999-01-14 Jesse Thilo + + * src/gram.h, src/lalr.c, src/lex.c, src/lex.h, src/machine.h, src/main.c, src/nullable.c, src/output.c, src/print.c, src/reader.c, src/reduce.c, src/state.h, src/symtab.c, src/symtab.h, src/types.h, src/vmsgetargs.c, src/warshall.c, src/allocate.c, src/alloc.h, src/bison.s1, src/closure.c, src/conflicts.c, src/derives.c, src/files.c, src/files.h, src/getargs.c, src/gram.c, src/LR0.c: + Update FSF address. + +1999-01-14 Jesse Thilo + + * doc/bison.texinfo: Fix formatting glitch. + + * doc/bison.texinfo: Update FSF address. + +1999-01-14 Jesse Thilo + + * acconfig.h: Update FSF address. + +1999-01-08 Jesse Thilo + + * src/system.h: + Don't define PACKAGE here, since config.h defines it. + +1998-12-30 Jesse Thilo + + * src/reader.c: Update copyright date. + + * src/main.c: + Ditch sprintf to statically-sized buffers in fatal/warn functions in + favor of output directly to stderr (avoids buffer overruns). + + * src/reader.c: Some checks for premature EOF. + + * src/allocate.c, src/alloc.h, src/closure.c, src/conflicts.c, src/derives.c, src/getargs.c, src/gram.c, src/lalr.c, src/lex.c, src/LR0.c, src/main.c, src/nullable.c, src/output.c, src/print.c, src/reduce.c, src/symtab.c, src/symtab.h, src/warshall.c: + Use prototypes if the compiler understands them. + + * src/files.c: Honor TMPDIR on Unix hosts. + Use prototypes if the compiler understands them. + + * src/reader.c: + Fix a couple of buffer overrun bugs. + Use prototypes if the compiler understands them. + + * src/system.h: Include unistd.h and ctype.h. + Use #ifdef instead of #if for NLS symbols. + +1998-12-30 Jesse Thilo + + * doc/bison.texinfo: + Delete comment "consider using @set for edition number, etc..." since + we now are doing so. + +1998-12-30 Jesse Thilo + + * configure.in: + Use prototypes if the compiler understands them. + + * NEWS: Document 1.26 highlights. + + * Makefile.am: Require Automake 1.3 or later. + + * acconfig.h: + Use prototypes if the compiler understands them. + +1998-12-29 Jesse Thilo + + * src/version.c: + Use VERSION symbol from automake for version number. + +1998-12-29 Jesse Thilo + + * acconfig.h, configure.in, version.cin: + Use VERSION symbol from automake for version number. + +1998-11-28 Jesse Thilo + + * Makefile.am: + Distribute original version of simple parser (bison.s1), not built + version (bison.simple). + +1998-11-28 Jesse Thilo + + * doc/bison.texinfo: Add info dir entry. + + * doc/bison.texinfo: + Let automake put version number into documentation. + +1998-11-26 Jesse Thilo + + * src/bison.cld, src/build.com, src/vmshlp.mar: + Add non-RCS files from /gd/gnu/bison. + +1998-11-26 Jesse Thilo + + * doc/bison.1: + Document the BISON_HAIRY and BISON_SIMPLE variables. + +1998-11-25 Jesse Thilo + + * src/version.c: Build version.c automatically. + + * src/reader.c: + Fix token numbering (used to start at 258, not 257). + + * src/system.h: Include config.h. + + * src/getargs.c: Update bug report address. + + * src/alloca.c, src/getopt1.c, src/getopt.c, src/getopt.h: + Get latest copies of alloca.c, getopt.c, getopt.h, getopt1.c from gnu.org. + +1998-11-25 Jesse Thilo + + * Makefile.am: + Rename bison.simple to bison.s1 (bison.simple is then built from bison.s1). + + * configure.in, version.cin: + Build version.c automatically. + + * AUTHORS: Add AUTHORS file. + + * README: Update bug report address. + + * bison.simple: + Rename bison.simple to bison.s1 (bison.simple is then built from bison.s1). + + * configure.in, Makefile.am, Makefile.in, stamp-h.in: + Add automake stuff. + +1998-11-25 Jesse Thilo + + * doc/bison.texinfo: Clean up some formatting. + +1998-05-05 Richard Stallman + + * doc/bison.texinfo: + Explain better why to make a pure parser. + +1998-01-05 Richard Stallman + + * src/files.c (openfiles): + [_WIN32 && !__CYGWIN32__] Use TEMP or Temp to + find a temporary directory, if possible. Do not unlink files while + they are open. + +1997-08-25 Richard Stallman + + * src/reader.c (stack_offset;): + Change some warni to warns. + + * src/lex.c (literalchar): Use warns, not warni. + +1997-06-28 Richard Stallman + + * src/bison.s1: Add a Bison version comment. + + * src/main.c (fatal, warn, berror): + Use program_name. + +1997-06-28 Richard Stallman + + * Makefile.in (bison_version): New variable. + (dist): Use that variable. + (bison.s1): Substitute the Bison version into bison.simple. + + * bison.simple: Add a Bison version comment. + +1997-06-18 Richard Stallman + + * src/main.c (fatal, warn, berror): + Make error messages standard. + (toomany): Improve error message text. + + * src/LR0.c, src/closure.c, src/conflicts.c, src/derives.c, src/files.c, src/lalr.c, src/lex.c, src/nullable.c, src/output.c, src/print.c, src/reader.c, src/reduce.c, src/symtab.c: + new.h renamed to alloc.h. + +1997-06-18 Richard Stallman + + * Makefile.in: new.h renamed to alloc.h. + +1997-05-24 Richard Stallman + + * src/lex.c (literalchar): + Fix the code for escaping \, " and '. + + (lex): Avoid trouble when there are many chars + to discard in a char literal with just several chars in it. + +1997-05-17 Richard Stallman + + * src/bison.s1: + Use malloc, if using alloca is troublesome. + (YYSTACK_USE_ALLOCA): New flag macro. + Define it for some systems and compilers. + (YYSTACK_ALLOC): New macro. + (yyparse): Use YYSTACK_ALLOC to allocate stack. + If it was malloc'd, free it. + +1997-05-17 Richard Stallman + + * bison.simple: + Use malloc, if using alloca is troublesome. + (YYSTACK_USE_ALLOCA): New flag macro. + Define it for some systems and compilers. + (YYSTACK_ALLOC): New macro. + (yyparse): Use YYSTACK_ALLOC to allocate stack. + If it was malloc'd, free it. + +1997-04-23 Richard Stallman + + * src/bison.s1: + (alloca) [__hpux]: Always define as __builtin_alloca. + +1997-04-23 Richard Stallman + + * bison.simple: + (alloca) [__hpux]: Always define as __builtin_alloca. + +1997-04-22 Richard Stallman + + * src/bison.s1: + [__hpux]: Include alloca.h (right for HPUX 10) + instead of declaring alloca (right for HPUX 9). + + * src/bison.s1 (__yy_memcpy): + Declare arg `count' as unsigned int. + (yyparse): Cast third arg to __yy_memcpy to unsigned int. + +1997-04-22 Richard Stallman + + * bison.simple: + [__hpux]: Include alloca.h (right for HPUX 10) + instead of declaring alloca (right for HPUX 9). + + * bison.simple (__yy_memcpy): + Declare arg `count' as unsigned int. + (yyparse): Cast third arg to __yy_memcpy to unsigned int. + +1997-01-03 Richard Stallman + + * src/allocate.c: [__STDC__ or _MSC_VER]: + Declare calloc and realloc to return void *. + +1997-01-02 Richard Stallman + + * src/system.h: + [_MSC_VER]: Include stdlib.h and process.h. + [_MSC_VER] (getpid): Define as macro--translate it to _getpid. + + * src/main.c (main): Return FAILURE as a value. + (printable_version): Declare arg as int, not char. + +1997-01-02 Richard Stallman + + * Makefile.in (dist): + Explicitly check for symlinks, and copy them. + +1996-12-19 Richard Stallman + + * src/files.c: + [_MSC_VER] (XPFILE, XPFILE1): Define, if not already defined. + +1996-12-18 Paul Eggert + + * src/bison.s1 (yyparse): + If __GNUC__ and YYPARSE_PARAM are both defined, + declare yyparse to have a void * argument. + +1996-12-18 Paul Eggert + + * bison.simple (yyparse): + If __GNUC__ and YYPARSE_PARAM are both defined, + declare yyparse to have a void * argument. + +1996-12-17 Richard Stallman + + * src/reduce.c (nbits): Add some casts. + +1996-08-12 Richard Stallman + + * src/bison.s1: Test _MSDOS as well as _MSDOS_. + +1996-08-12 Richard Stallman + + * bison.simple: Test _MSDOS as well as _MSDOS_. + +1996-07-31 Richard Stallman + + * src/bison.s1: + [__sun && __i386]: Include alloca.h. + +1996-07-31 Richard Stallman + + * bison.simple: + [__sun && __i386]: Include alloca.h. + +1996-07-30 Richard Stallman + + * src/bison.s1: Comment change. + + * src/bison.s1: Test _MSDOS_, not MSDOS. + +1996-07-30 Richard Stallman + + * bison.simple: Comment change. + + * bison.simple: Test _MSDOS_, not MSDOS. + +1996-06-01 Richard Stallman + + * src/reduce.c, src/reader.c, src/print.c, src/output.c, src/nullable.c, src/lex.c, src/lalr.c, src/getargs.c, src/derives.c, src/conflicts.c, src/closure.c, src/allocate.c: + Insert `_' macro around many string constants. + + * src/main.c: + Insert `_' macro around many string constants. + + (main): Call setlocale, bindtextdomain and textdomain. + + * src/system.h: [HAVE_LOCALE_H]: Include locale.h. + [! HAVE_LOCALE_H] (setlocale): Define as no-op. + [ENABLE_NLS]: Include libintl.h. + [ENABLE_NLS] (gettext): Define. + [! ENABLE_NLS] (bintextdomain, textdomain, _): Consolation definitions. + (N_, PACKAGE, LOCALEDIR): New macros. + +1996-06-01 Richard Stallman + + * POTFILES.in: New file. + + * Makefile.in (allocate.o): + Define target explicitly. + + * Makefile.in (CFLAGS): Set to @CFLAGS@. + (LDFLAGS): Set to @LDFLAGS@. + (configure): Run autoconf only if preceding `cd' succeeds. + (bison.s1): Redirect output to temporary file then move the + temporary to the target, rather than redirecting directly to bison.s1. + (clean): Remove config.status and config.log. + (distclean): Don't remove config.status here. + +1996-05-12 Richard Stallman + + * src/bison.s1: + (__yy_memcpy) [__cplusplus]: Reorder declarations of variables f and t. + +1996-05-12 Richard Stallman + + * bison.simple: + (__yy_memcpy) [__cplusplus]: Reorder declarations of variables f and t. + +1996-05-11 Richard Stallman + + * src/bison.s1 (__yy_memcpy): + Really reorder the args, as was supposedly done on Feb 14 1995. + (yyparse): Calls changed accordingly. + +1996-05-11 Richard Stallman + + * Makefile.in (dist): Don't use $(srcdir). + + * bison.simple (__yy_memcpy): + Really reorder the args, as was supposedly done on Feb 14 1995. + (yyparse): Calls changed accordingly. + +1996-01-27 Richard Stallman + + * src/output.c (output_rule_data): + Test YYERROR_VERBOSE in the conditional + around the definition of ttyname. + +1995-12-29 Richard Stallman + + * src/bison.s1: + Fix line numbers in #line commands. + +1995-12-29 Richard Stallman + + * bison.simple: + Fix line numbers in #line commands. + +1995-12-27 Richard Stallman + + * src/bison.s1 (YYPARSE_PARAM_DECL): + In C++, make it always null. + (YYPARSE_PARAM_ARG): New macro. + (yyparse): Use YYPARSE_PARAM_ARG. + +1995-12-27 Richard Stallman + + * bison.simple (YYPARSE_PARAM_DECL): + In C++, make it always null. + (YYPARSE_PARAM_ARG): New macro. + (yyparse): Use YYPARSE_PARAM_ARG. + +1995-11-29 Richard Stallman + + * doc/bison.texinfo: + Describe literal string tokens, %raw, %no_lines, %token_table. + +1995-11-29 Daniel Hagerty + + * doc/bison.texinfo: Fixed update date + +1995-10-16 Richard Stallman + + * src/version.c: Version 1.25. + +1995-10-16 Richard Stallman + + * NEWS: *** empty log message *** + +1995-10-16 Richard Stallman + + * doc/bison.1, doc/bison.rnh: + Add new options. + +1995-10-15 Richard Stallman + + * src/vmsgetargs.c, src/getargs.c: + Added -n, -k, and -raw switches. + (noparserflag, toknumflag, rawtoknumflag): New variables. + + * src/symtab.h (SALIAS): + New #define for adding aliases to %token. + (struct bucket): Added `alias' field. + + * src/reduce.c (reduce_grammar): + Revise error message. + (print_notices): Remove final `.' from error message. + + * src/reader.c (reader_output_yylsp): + New function. + (readgram): Use `#if 0' around code that accepted %command + inside grammar rules: The documentation doesn't allow it, + and it will fail since the %command processors scan for the next %. + (parse_token_decl): Extended the %token + declaration to allow a multi-character symbol as an alias. + (parse_thong_decl): New function. + (read_declarations): Added %thong declarations. + (read_declarations): Handle NOOP to deal with allowing + % declarations as another means to specify the flags. + (readgram): Allow %prec prior to semantics embedded in a rule. + (skip_to_char, read_declarations, copy_definition) + (parse_token_decl, parse_start_decl, parse_type_decl) + (parse_assoc_decl, parse_union_decl, parse_expect_decl) + (get_type_name, copy_guard, copy_action, readgram) + (get_type, packsymbols): Revised most error messages. + Changed `fatal' to `warnxxx' to avoid aborting for error. + Revised and use multiple warnxxx functions to avoid using VARARGS1. + (read_declarations): Improve the error message for + an invalid character. Do not abort. + (read_declarations, copy_guard, copy_action): Use + printable_version to avoid unprintable characters in printed output. + (parse_expect_decl): Error if argument to %expect exceeds 10 digits. + (parse_token_decl, parse_assoc_decl, parse_type_decl, get_type): + Allow the type of a non-terminal can be given + more than once, as long as all specifications give the same type. + + * src/output.c: + (output_headers, output_trailers, output, output_gram) + (output_rule_data): Implement noparserflag variable. + Implement toknumflag variable. + (output): Call reader_output_yylsp to output LTYPESTR. + + * src/main.c (main): + If reader sees an error, don't process the grammar. + (fatals): Updated to not use VARARGS1. + (printable_version, int_to_string, warn, warni, warns, warnss) + (warnsss): New error reporting functions. Avoid abort for error. + + * src/lex.h: + Added THONG and NOOP for alias processing. + Added SETOPT for the new code that allows setting options with %flags. + + * src/lex.c: + Include getopt.h. Add some extern decls. + (safegetc): New function to deal with EOF gracefully. + (literalchar); new function to deal with reading \ escapes. + (lex): Use literalchar. + (lex): Implemented "..." tokens. + (literalchar, lex, parse_percent_token): Made tokenbuffer + always contain the token. This includes growing the token + buffer while reading an integer. + (parse_percent_token): Replaced if-else statement with percent_table. + (parse_percent_token): Added % declarations as another + way to specify the flags -n, -l, and -r. Also added hooks for + -d, -k, -y, -v, -t, -p, -b, -o, but implementation requires + major changes to files.c. + (lex) Retain in the incoming stream a character following + an incorrect '/'. + (skip_white_space, lex): Revised most error messages + and changed fatal to warn to avoid aborting. + (percent_table): Added %thong declarations. + + * src/gram.h: Comment changes. + + * src/files.c (openfiles, open_extra_files, done): + Add faction flag + and actfile file. Handle noparserflag. Both for -n switch. + + * src/conflicts.c (resolve_sr_conflict): + Remove use of alloca. + +1995-06-01 Jim Meyering + + * doc/bison.texinfo: *** empty log message *** + +1995-05-06 Richard Stallman + + * src/bison.s1: Comment change. + +1995-05-06 Richard Stallman + + * bison.simple: Comment change. + +1995-05-03 Richard Stallman + + * src/version.c: Version now 1.24. + + * src/bison.s1: Change distribution terms. + + * src/version.c: Version now 1.23. + +1995-05-03 Richard Stallman + + * doc/bison.texinfo: + Rewrite "Conditions for Using Bison". + Update version to 1.24. + +1995-05-03 Richard Stallman + + * bison.simple: Change distribution terms. + +1995-02-23 Richard Stallman + + * src/files.c: Test __VMS_POSIX as well as VMS. + +1995-02-14 Jim Meyering + + * src/bison.s1 (__yy_memcpy): + Renamed from __yy_bcopy to avoid + confusion. Reverse FROM and TO arguments to be consistent with + those of memcpy. + +1995-02-14 Jim Meyering + + * bison.simple (__yy_memcpy): + Renamed from __yy_bcopy to avoid + confusion. Reverse FROM and TO arguments to be consistent with + those of memcpy. + +1994-11-10 David J. MacKenzie + + * NEWS: reformat + + * NEWS: New file. + + * Makefile.in (DISTFILES): Include NEWS. + + * Makefile.in (DISTFILES): + Include install-sh, not install.sh. + + * configure.in: Update to Autoconf v2 macro names. + +1994-10-05 David J. MacKenzie + + * Makefile.in: fix typo + + * Makefile.in (prefix, exec_prefix): + Let configure set them. + +1994-09-28 David J. MacKenzie + + * Makefile.in: Set datadir to $(prefix)/share. + +1994-09-15 Richard Stallman + + * src/bison.s1: + Update copyright notice and GPL version. + +1994-09-15 Richard Stallman + + * bison.simple: + Update copyright notice and GPL version. + +1994-07-12 Richard Stallman + + * src/reduce.c, src/reader.c: + entered into RCS + +1994-05-05 David J. MacKenzie + + * Makefile.in: entered into RCS + +1994-03-26 Richard Stallman + + * src/bison.s1: entered into RCS + +1994-03-26 Richard Stallman + + * bison.simple: entered into RCS + +1994-03-25 Richard Stallman + + * src/main.c: entered into RCS + +1994-03-24 Richard Stallman + + * src/conflicts.c: entered into RCS + +1994-01-02 Richard Stallman + + * Makefile.in: *** empty log message *** + +1993-11-21 Richard Stallman + + * src/bison.s1: *** empty log message *** + +1993-11-21 Richard Stallman + + * doc/bison.texinfo: entered into RCS + + * doc/bison.texinfo: *** empty log message *** + +1993-11-21 Richard Stallman + + * bison.simple: *** empty log message *** + +1993-10-25 David J. MacKenzie + + * doc/bison.texinfo: *** empty log message *** + +1993-10-19 Richard Stallman + + * src/bison.s1: *** empty log message *** + +1993-10-19 Richard Stallman + + * bison.simple: *** empty log message *** + +1993-10-14 Richard Stallman + + * src/bison.s1: *** empty log message *** + +1993-10-14 Richard Stallman + + * bison.simple: *** empty log message *** + +1993-09-14 David J. MacKenzie + + * doc/bison.texinfo: *** empty log message *** + +1993-09-13 Noah Friedman + + * Makefile.in: *** empty log message *** + +1993-09-10 Richard Stallman + + * src/conflicts.c: *** empty log message *** + + * src/system.h: entered into RCS + +1993-09-10 Richard Stallman + + * doc/bison.1: entered into RCS + +1993-09-06 Noah Friedman + + * src/version.c: entered into RCS + +1993-09-06 Noah Friedman + + * Makefile.in: *** empty log message *** + +1993-07-30 David J. MacKenzie + + * Makefile.in: *** empty log message *** + +1993-07-24 Richard Stallman + + * src/bison.s1: *** empty log message *** + +1993-07-24 Richard Stallman + + * bison.simple: *** empty log message *** + +1993-07-08 David J. MacKenzie + + * Makefile.in: *** empty log message *** + +1993-07-04 Richard Stallman + + * src/bison.s1: *** empty log message *** + +1993-07-04 Richard Stallman + + * bison.simple: *** empty log message *** + +1993-06-26 David J. MacKenzie + + * src/getargs.c: entered into RCS + +1993-06-26 David J. MacKenzie + + * doc/bison.texinfo: *** empty log message *** + + * doc/bison.1: New file. + +1993-06-25 Richard Stallman + + * src/getargs.c: New file. + +1993-06-16 Richard Stallman + + * src/bison.s1: *** empty log message *** + +1993-06-16 Richard Stallman + + * bison.simple: *** empty log message *** + +1993-06-03 Richard Stallman + + * src/bison.s1: New file. + +1993-06-03 Richard Stallman + + * doc/bison.texinfo: *** empty log message *** + +1993-06-03 Richard Stallman + + * bison.simple: New file. + +1993-05-19 Richard Stallman + + * doc/bison.texinfo: New file. + +1993-05-07 Noah Friedman + + * Makefile.in: *** empty log message *** + +1993-04-28 Noah Friedman + + * src/reader.c: *** empty log message *** + +1993-04-23 Noah Friedman + + * src/alloc.h: entered into RCS + +1993-04-20 David J. MacKenzie + + * src/version.c: *** empty log message *** + + * src/files.c, src/allocate.c: + entered into RCS + + * src/reader.c: *** empty log message *** + + * src/lex.c: entered into RCS + + * src/conflicts.c: New file. + + * src/symtab.c: entered into RCS + + * src/alloc.h: New file. + + * src/LR0.c: entered into RCS + +1993-04-18 Noah Friedman + + * src/reader.c: New file. + + * src/version.c: *** empty log message *** + +1993-04-18 Noah Friedman + + * Makefile.in: *** empty log message *** + +1993-04-17 Noah Friedman + + * Makefile.in: *** empty log message *** + +1993-04-15 Richard Stallman + + * src/main.c, src/files.c: + New file. + +1993-04-15 Noah Friedman + + * configure.in: entered into RCS + + * configure.in: *** empty log message *** + + * configure.in: New file. + +1993-04-14 Richard Stallman + + * Makefile.in: New file. + +1993-04-13 Richard Stallman + + * src/version.c: New file. + +1993-03-25 Richard Stallman + + * src/output.c: entered into RCS + +1992-09-25 Richard Stallman + + * configure.bat: entered into RCS + +1992-06-22 Richard Stallman + + * src/vmsgetargs.c: entered into RCS + +1992-06-22 Richard Stallman + + * doc/bison.rnh: entered into RCS + +1992-04-20 David J. MacKenzie + + * README: entered into RCS + +1992-01-22 Richard Stallman + + * src/machine.h: entered into RCS + +1991-12-21 Richard Stallman + + * src/lalr.c, src/closure.c: + entered into RCS + +1991-12-20 Richard Stallman + + * src/state.h: entered into RCS + +1991-12-18 Richard Stallman + + * src/print.c, src/nullable.c, src/derives.c: + entered into RCS + +1991-11-03 David J. MacKenzie + + * src/warshall.c, src/types.h, src/symtab.h, src/lex.h, src/gram.c, src/gram.h, src/files.h: + entered into RCS + +1988-09-09 Richard Stallman + + * src/bison.hairy: entered into RCS + +1987-12-16 Richard Stallman + + * REFERENCES: entered into RCS + +----- + +Copyright (C) 1987, 1988, 1991, 1992, 1993, 1994, 1995, 1996, 1997, +1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + +This file is part of Bison, the GNU Compiler Compiler. + +Bison is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +Bison is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Bison; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. diff --git a/src/apps/bin/bison/GNUmakefile b/src/apps/bin/bison/GNUmakefile new file mode 100644 index 0000000000..7e67536c4b --- /dev/null +++ b/src/apps/bin/bison/GNUmakefile @@ -0,0 +1,58 @@ +# Having a separate GNUmakefile lets me `include' the dynamically +# generated rules created via Makefile.maint as well as Makefile.maint itself. +# This makefile is used only if you run GNU Make. +# It is necessary if you want to build targets usually of interest +# only to the maintainer. + +# Copyright (C) 2001, 2003 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License along +# with this program; if not, write to the Free Software Foundation, Inc., +# 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. + +# Systems where /bin/sh is not the default shell need this. The $(shell) +# command below won't work with e.g. stock DOS/Windows shells. +ifeq ($(wildcard /bin/s[h]),/bin/sh) +SHELL = /bin/sh +else +# will be used only with the next shell-test line, then overwritten +# by a configured-in value +SHELL = sh +endif + +have-Makefile := $(shell test -f Makefile && echo yes) + +# If the user runs GNU make but has not yet run ./configure, +# give them a diagnostic. +ifeq ($(have-Makefile),yes) + +# Make tar archive easier to reproduce. +export TAR_OPTIONS = --owner=0 --group=0 --numeric-owner + +include Makefile +include $(srcdir)/Makefile.cfg +include $(srcdir)/Makefile.maint + +else + +all: + @echo There seems to be no Makefile in this directory. + @echo "You must run ./configure before running \`make'." + @exit 1 + +endif + +# Tell version 3.79 and up of GNU make to not build goals in this +# directory in parallel. This is necessary in case someone tries to +# build multiple targets on one command line. +.NOTPARALLEL: diff --git a/src/apps/bin/bison/INSTALL b/src/apps/bin/bison/INSTALL new file mode 100644 index 0000000000..54caf7c190 --- /dev/null +++ b/src/apps/bin/bison/INSTALL @@ -0,0 +1,229 @@ +Copyright (C) 1994, 1995, 1996, 1999, 2000, 2001, 2002 Free Software +Foundation, Inc. + + This file is free documentation; the Free Software Foundation gives +unlimited permission to copy, distribute and modify it. + +Basic Installation +================== + + These are generic installation instructions. + + The `configure' shell script attempts to guess correct values for +various system-dependent variables used during compilation. It uses +those values to create a `Makefile' in each directory of the package. +It may also create one or more `.h' files containing system-dependent +definitions. Finally, it creates a shell script `config.status' that +you can run in the future to recreate the current configuration, and a +file `config.log' containing compiler output (useful mainly for +debugging `configure'). + + It can also use an optional file (typically called `config.cache' +and enabled with `--cache-file=config.cache' or simply `-C') that saves +the results of its tests to speed up reconfiguring. (Caching is +disabled by default to prevent problems with accidental use of stale +cache files.) + + If you need to do unusual things to compile the package, please try +to figure out how `configure' could check whether to do them, and mail +diffs or instructions to the address given in the `README' so they can +be considered for the next release. If you are using the cache, and at +some point `config.cache' contains results you don't want to keep, you +may remove or edit it. + + The file `configure.ac' (or `configure.in') is used to create +`configure' by a program called `autoconf'. You only need +`configure.ac' if you want to change it or regenerate `configure' using +a newer version of `autoconf'. + +The simplest way to compile this package is: + + 1. `cd' to the directory containing the package's source code and type + `./configure' to configure the package for your system. If you're + using `csh' on an old version of System V, you might need to type + `sh ./configure' instead to prevent `csh' from trying to execute + `configure' itself. + + Running `configure' takes awhile. While running, it prints some + messages telling which features it is checking for. + + 2. Type `make' to compile the package. + + 3. Optionally, type `make check' to run any self-tests that come with + the package. + + 4. Type `make install' to install the programs and any data files and + documentation. + + 5. You can remove the program binaries and object files from the + source code directory by typing `make clean'. To also remove the + files that `configure' created (so you can compile the package for + a different kind of computer), type `make distclean'. There is + also a `make maintainer-clean' target, but that is intended mainly + for the package's developers. If you use it, you may have to get + all sorts of other programs in order to regenerate files that came + with the distribution. + +Compilers and Options +===================== + + Some systems require unusual options for compilation or linking that +the `configure' script does not know about. Run `./configure --help' +for details on some of the pertinent environment variables. + + You can give `configure' initial values for configuration parameters +by setting variables in the command line or in the environment. Here +is an example: + + ./configure CC=c89 CFLAGS=-O2 LIBS=-lposix + + *Note Defining Variables::, for more details. + +Compiling For Multiple Architectures +==================================== + + You can compile the package for more than one kind of computer at the +same time, by placing the object files for each architecture in their +own directory. To do this, you must use a version of `make' that +supports the `VPATH' variable, such as GNU `make'. `cd' to the +directory where you want the object files and executables to go and run +the `configure' script. `configure' automatically checks for the +source code in the directory that `configure' is in and in `..'. + + If you have to use a `make' that does not support the `VPATH' +variable, you have to compile the package for one architecture at a +time in the source code directory. After you have installed the +package for one architecture, use `make distclean' before reconfiguring +for another architecture. + +Installation Names +================== + + By default, `make install' will install the package's files in +`/usr/local/bin', `/usr/local/man', etc. You can specify an +installation prefix other than `/usr/local' by giving `configure' the +option `--prefix=PATH'. + + You can specify separate installation prefixes for +architecture-specific files and architecture-independent files. If you +give `configure' the option `--exec-prefix=PATH', the package will use +PATH as the prefix for installing programs and libraries. +Documentation and other data files will still use the regular prefix. + + In addition, if you use an unusual directory layout you can give +options like `--bindir=PATH' to specify different values for particular +kinds of files. Run `configure --help' for a list of the directories +you can set and what kinds of files go in them. + + If the package supports it, you can cause programs to be installed +with an extra prefix or suffix on their names by giving `configure' the +option `--program-prefix=PREFIX' or `--program-suffix=SUFFIX'. + +Optional Features +================= + + Some packages pay attention to `--enable-FEATURE' options to +`configure', where FEATURE indicates an optional part of the package. +They may also pay attention to `--with-PACKAGE' options, where PACKAGE +is something like `gnu-as' or `x' (for the X Window System). The +`README' should mention any `--enable-' and `--with-' options that the +package recognizes. + + For packages that use the X Window System, `configure' can usually +find the X include and library files automatically, but if it doesn't, +you can use the `configure' options `--x-includes=DIR' and +`--x-libraries=DIR' to specify their locations. + +Specifying the System Type +========================== + + There may be some features `configure' cannot figure out +automatically, but needs to determine by the type of machine the package +will run on. Usually, assuming the package is built to be run on the +_same_ architectures, `configure' can figure that out, but if it prints +a message saying it cannot guess the machine type, give it the +`--build=TYPE' option. TYPE can either be a short name for the system +type, such as `sun4', or a canonical name which has the form: + + CPU-COMPANY-SYSTEM + +where SYSTEM can have one of these forms: + + OS KERNEL-OS + + See the file `config.sub' for the possible values of each field. If +`config.sub' isn't included in this package, then this package doesn't +need to know the machine type. + + If you are _building_ compiler tools for cross-compiling, you should +use the `--target=TYPE' option to select the type of system they will +produce code for. + + If you want to _use_ a cross compiler, that generates code for a +platform different from the build platform, you should specify the +"host" platform (i.e., that on which the generated programs will +eventually be run) with `--host=TYPE'. + +Sharing Defaults +================ + + If you want to set default values for `configure' scripts to share, +you can create a site shell script called `config.site' that gives +default values for variables like `CC', `cache_file', and `prefix'. +`configure' looks for `PREFIX/share/config.site' if it exists, then +`PREFIX/etc/config.site' if it exists. Or, you can set the +`CONFIG_SITE' environment variable to the location of the site script. +A warning: not all `configure' scripts look for a site script. + +Defining Variables +================== + + Variables not defined in a site shell script can be set in the +environment passed to `configure'. However, some packages may run +configure again during the build, and the customized values of these +variables may be lost. In order to avoid this problem, you should set +them in the `configure' command line, using `VAR=value'. For example: + + ./configure CC=/usr/local2/bin/gcc + +will cause the specified gcc to be used as the C compiler (unless it is +overridden in the site shell script). + +`configure' Invocation +====================== + + `configure' recognizes the following options to control how it +operates. + +`--help' +`-h' + Print a summary of the options to `configure', and exit. + +`--version' +`-V' + Print the version of Autoconf used to generate the `configure' + script, and exit. + +`--cache-file=FILE' + Enable the cache: use and save the results of the tests in FILE, + traditionally `config.cache'. FILE defaults to `/dev/null' to + disable caching. + +`--config-cache' +`-C' + Alias for `--cache-file=config.cache'. + +`--quiet' +`--silent' +`-q' + Do not print messages saying which checks are being made. To + suppress all normal output, redirect it to `/dev/null' (any error + messages will still be shown). + +`--srcdir=DIR' + Look for the package's source code in directory DIR. Usually + `configure' can determine that directory automatically. + +`configure' also accepts some other, not widely useful, options. Run +`configure --help' for more details. + diff --git a/src/apps/bin/bison/Jamfile b/src/apps/bin/bison/Jamfile new file mode 100644 index 0000000000..e12c61d91b --- /dev/null +++ b/src/apps/bin/bison/Jamfile @@ -0,0 +1,4 @@ +SubDir OBOS_TOP src apps bin bison ; + +SubInclude OBOS_TOP src apps bin bison lib ; +SubInclude OBOS_TOP src apps bin bison src ; diff --git a/src/apps/bin/bison/Makefile.am b/src/apps/bin/bison/Makefile.am new file mode 100644 index 0000000000..93e167a38d --- /dev/null +++ b/src/apps/bin/bison/Makefile.am @@ -0,0 +1,27 @@ +## Process this file with automake to produce Makefile.in -*-Makefile-*- +## Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. + +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +## 02111-1307 USA + +ACLOCAL_AMFLAGS = -I m4 + +SUBDIRS = config po lib data src doc tests + +EXTRA_DIST = REFERENCES OChangeLog Makefile.maint GNUmakefile Makefile.cfg + +.PHONY: maintainer-check +maintainer-check: + cd tests && $(MAKE) $(AM_MAKEFLAGS) $@ diff --git a/src/apps/bin/bison/Makefile.cfg b/src/apps/bin/bison/Makefile.cfg new file mode 100644 index 0000000000..8de8cf954f --- /dev/null +++ b/src/apps/bin/bison/Makefile.cfg @@ -0,0 +1,50 @@ +# Customize Makefile.maint for Bison. -*- makefile -*- +# Copyright (C) 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +prev_version_file = $(srcdir)/config/prev-version.txt +move_if_change = $(srcdir)/config/move-if-change +announce_gen = $(srcdir)/config/announce-gen +release_archive_dir = releases + +# Use alpha.gnu.org for alpha and beta releases. +# Use ftp.gnu.org for major releases. +gnu_ftp_host-alpha = alpha +gnu_ftp_host-beta = alpha +gnu_ftp_host-major = ftp +gnu_rel_host = $(gnu_ftp_host-$(RELEASE_TYPE)) + +url_dir_list = \ + ftp://$(gnu_rel_host).gnu.org/gnu/bison + +# Files to update automatically. +wget_files = \ + $(srcdir)/config/config.guess \ + $(srcdir)/config/config.sub \ + $(srcdir)/config/texinfo.tex \ + +cvs_files = \ + $(srcdir)/config/install-sh \ + $(srcdir)/config/mdate-sh \ + $(srcdir)/config/missing \ + $(srcdir)/config/mkinstalldirs + +# Tests not to run. +# local-checks-to-skip ?= \ +# author_mark_check \ +# strftime-check syntax-check makefile_path_separator_check \ +# makefile-check diff --git a/src/apps/bin/bison/Makefile.in b/src/apps/bin/bison/Makefile.in new file mode 100644 index 0000000000..556fa2147e --- /dev/null +++ b/src/apps/bin/bison/Makefile.in @@ -0,0 +1,633 @@ +# Makefile.in generated by automake 1.8.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = . +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = . +DIST_COMMON = README $(am__configure_deps) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/config.hin \ + $(top_srcdir)/configure ABOUT-NLS AUTHORS COPYING ChangeLog \ + INSTALL NEWS README-alpha THANKS TODO +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/alloca.m4 \ + $(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dmalloc.m4 \ + $(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/error.m4 \ + $(top_srcdir)/m4/exitfail.m4 $(top_srcdir)/m4/extensions.m4 \ + $(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gnulib.m4 $(top_srcdir)/m4/hard-locale.m4 \ + $(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/m4.m4 \ + $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbstate_t.m4 \ + $(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/obstack.m4 $(top_srcdir)/m4/onceonly.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \ + $(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stpcpy.m4 \ + $(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \ + $(top_srcdir)/m4/subpipe.m4 $(top_srcdir)/m4/timevar.m4 \ + $(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/warning.m4 \ + $(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xstrndup.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +am__CONFIG_DISTCLEAN_FILES = config.status config.cache config.log \ + configure.lineno configure.status.lineno +mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs +CONFIG_HEADER = config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +RECURSIVE_TARGETS = all-recursive check-recursive dvi-recursive \ + html-recursive info-recursive install-data-recursive \ + install-exec-recursive install-info-recursive \ + install-recursive installcheck-recursive installdirs-recursive \ + pdf-recursive ps-recursive uninstall-info-recursive \ + uninstall-recursive +ETAGS = etags +CTAGS = ctags +DIST_SUBDIRS = $(SUBDIRS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +distdir = $(PACKAGE)-$(VERSION) +top_distdir = $(distdir) +am__remove_distdir = \ + { test ! -d $(distdir) \ + || { find $(distdir) -type d ! -perm -200 -exec chmod u+w {} ';' \ + && rm -fr $(distdir); }; } +DIST_ARCHIVES = $(distdir).tar.gz $(distdir).tar.bz2 +GZIP_ENV = --best +distuninstallcheck_listfiles = find . -type f -print +distcleancheck_listfiles = find . -type f -print +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALLOCA_H = @ALLOCA_H@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOM4TE = @AUTOM4TE@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GCC = @GCC@ +GMSGFMT = @GMSGFMT@ +HAVE__BOOL = @HAVE__BOOL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +O0CFLAGS = @O0CFLAGS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STDBOOL_H = @STDBOOL_H@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VALGRIND = @VALGRIND@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WERROR_CFLAGS = @WERROR_CFLAGS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +YACC_LIBRARY = @YACC_LIBRARY@ +YACC_SCRIPT = @YACC_SCRIPT@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +ACLOCAL_AMFLAGS = -I m4 +SUBDIRS = config po lib data src doc tests +EXTRA_DIST = REFERENCES OChangeLog Makefile.maint GNUmakefile Makefile.cfg +all: config.h + $(MAKE) $(AM_MAKEFLAGS) all-recursive + +.SUFFIXES: +am--refresh: + @: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + echo ' cd $(srcdir) && $(AUTOMAKE) --gnu '; \ + cd $(srcdir) && $(AUTOMAKE) --gnu \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + echo ' $(SHELL) ./config.status'; \ + $(SHELL) ./config.status;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + $(SHELL) ./config.status --recheck + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(srcdir) && $(AUTOCONF) +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(srcdir) && $(ACLOCAL) $(ACLOCAL_AMFLAGS) + +config.h: stamp-h1 + @if test ! -f $@; then \ + rm -f stamp-h1; \ + $(MAKE) stamp-h1; \ + else :; fi + +stamp-h1: $(srcdir)/config.hin $(top_builddir)/config.status + @rm -f stamp-h1 + cd $(top_builddir) && $(SHELL) ./config.status config.h +$(srcdir)/config.hin: $(am__configure_deps) + cd $(top_srcdir) && $(AUTOHEADER) + rm -f stamp-h1 + touch $@ + +distclean-hdr: + -rm -f config.h stamp-h1 +uninstall-info-am: + +# This directory's subdirectories are mostly independent; you can cd +# into them and run `make' without going through this Makefile. +# To change the values of `make' variables: instead of editing Makefiles, +# (1) if the variable is set in `config.status', edit `config.status' +# (which will cause the Makefiles to be regenerated when you run `make'); +# (2) otherwise, pass the desired values on the `make' command line. +$(RECURSIVE_TARGETS): + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + target=`echo $@ | sed s/-recursive//`; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + dot_seen=yes; \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done; \ + if test "$$dot_seen" = "no"; then \ + $(MAKE) $(AM_MAKEFLAGS) "$$target-am" || exit 1; \ + fi; test -z "$$fail" + +mostlyclean-recursive clean-recursive distclean-recursive \ +maintainer-clean-recursive: + @set fnord $$MAKEFLAGS; amf=$$2; \ + dot_seen=no; \ + case "$@" in \ + distclean-* | maintainer-clean-*) list='$(DIST_SUBDIRS)' ;; \ + *) list='$(SUBDIRS)' ;; \ + esac; \ + rev=''; for subdir in $$list; do \ + if test "$$subdir" = "."; then :; else \ + rev="$$subdir $$rev"; \ + fi; \ + done; \ + rev="$$rev ."; \ + target=`echo $@ | sed s/-recursive//`; \ + for subdir in $$rev; do \ + echo "Making $$target in $$subdir"; \ + if test "$$subdir" = "."; then \ + local_target="$$target-am"; \ + else \ + local_target="$$target"; \ + fi; \ + (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) $$local_target) \ + || case "$$amf" in *=*) exit 1;; *k*) fail=yes;; *) exit 1;; esac; \ + done && test -z "$$fail" +tags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) tags); \ + done +ctags-recursive: + list='$(SUBDIRS)'; for subdir in $$list; do \ + test "$$subdir" = . || (cd $$subdir && $(MAKE) $(AM_MAKEFLAGS) ctags); \ + done + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: tags-recursive $(HEADERS) $(SOURCES) config.hin $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + if ($(ETAGS) --etags-include --version) >/dev/null 2>&1; then \ + include_option=--etags-include; \ + empty_fix=.; \ + else \ + include_option=--include; \ + empty_fix=; \ + fi; \ + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test ! -f $$subdir/TAGS || \ + tags="$$tags $$include_option=$$here/$$subdir/TAGS"; \ + fi; \ + done; \ + list='$(SOURCES) $(HEADERS) config.hin $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: ctags-recursive $(HEADERS) $(SOURCES) config.hin $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) config.hin $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @case `sed 15q $(srcdir)/NEWS` in \ + *"$(VERSION)"*) : ;; \ + *) \ + echo "NEWS not updated; not releasing" 1>&2; \ + exit 1;; \ + esac + $(am__remove_distdir) + mkdir $(distdir) + $(mkdir_p) $(distdir)/m4 $(distdir)/po $(distdir)/tests + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + list='$(SUBDIRS)'; for subdir in $$list; do \ + if test "$$subdir" = .; then :; else \ + test -d "$(distdir)/$$subdir" \ + || mkdir "$(distdir)/$$subdir" \ + || exit 1; \ + (cd $$subdir && \ + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="../$(top_distdir)" \ + distdir="../$(distdir)/$$subdir" \ + distdir) \ + || exit 1; \ + fi; \ + done + -find $(distdir) -type d ! -perm -777 -exec chmod a+rwx {} \; -o \ + ! -type d ! -perm -444 -links 1 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -400 -exec chmod a+r {} \; -o \ + ! -type d ! -perm -444 -exec $(SHELL) $(install_sh) -c -m a+r {} {} \; \ + || chmod -R a+r $(distdir) +dist-gzip: distdir + $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(am__remove_distdir) +dist-bzip2: distdir + $(AMTAR) chof - $(distdir) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +dist-tarZ: distdir + $(AMTAR) chof - $(distdir) | compress -c >$(distdir).tar.Z + $(am__remove_distdir) + +dist-shar: distdir + shar $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).shar.gz + $(am__remove_distdir) + +dist-zip: distdir + -rm -f $(distdir).zip + zip -rq $(distdir).zip $(distdir) + $(am__remove_distdir) + +dist dist-all: distdir + $(AMTAR) chof - $(distdir) | GZIP=$(GZIP_ENV) gzip -c >$(distdir).tar.gz + $(AMTAR) chof - $(distdir) | bzip2 -9 -c >$(distdir).tar.bz2 + $(am__remove_distdir) + +# This target untars the dist file and tries a VPATH configuration. Then +# it guarantees that the distribution is self-contained by making another +# tarfile. +distcheck: dist + case '$(DIST_ARCHIVES)' in \ + *.tar.gz*) \ + GZIP=$(GZIP_ENV) gunzip -c $(distdir).tar.gz | $(AMTAR) xf - ;;\ + *.tar.bz2*) \ + bunzip2 -c $(distdir).tar.bz2 | $(AMTAR) xf - ;;\ + *.tar.Z*) \ + uncompress -c $(distdir).tar.Z | $(AMTAR) xf - ;;\ + *.shar.gz*) \ + GZIP=$(GZIP_ENV) gunzip -c $(distdir).shar.gz | unshar ;;\ + *.zip*) \ + unzip $(distdir).zip ;;\ + esac + chmod -R a-w $(distdir); chmod a+w $(distdir) + mkdir $(distdir)/_build + mkdir $(distdir)/_inst + chmod a-w $(distdir) + dc_install_base=`$(am__cd) $(distdir)/_inst && pwd | sed -e 's,^[^:\\/]:[\\/],/,'` \ + && dc_destdir="$${TMPDIR-/tmp}/am-dc-$$$$/" \ + && cd $(distdir)/_build \ + && ../configure --srcdir=.. --prefix="$$dc_install_base" \ + $(DISTCHECK_CONFIGURE_FLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) \ + && $(MAKE) $(AM_MAKEFLAGS) dvi \ + && $(MAKE) $(AM_MAKEFLAGS) check \ + && $(MAKE) $(AM_MAKEFLAGS) install \ + && $(MAKE) $(AM_MAKEFLAGS) installcheck \ + && $(MAKE) $(AM_MAKEFLAGS) uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) distuninstallcheck_dir="$$dc_install_base" \ + distuninstallcheck \ + && chmod -R a-w "$$dc_install_base" \ + && ({ \ + (cd ../.. && umask 077 && mkdir "$$dc_destdir") \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" install \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" uninstall \ + && $(MAKE) $(AM_MAKEFLAGS) DESTDIR="$$dc_destdir" \ + distuninstallcheck_dir="$$dc_destdir" distuninstallcheck; \ + } || { rm -rf "$$dc_destdir"; exit 1; }) \ + && rm -rf "$$dc_destdir" \ + && $(MAKE) $(AM_MAKEFLAGS) dist \ + && rm -rf $(DIST_ARCHIVES) \ + && $(MAKE) $(AM_MAKEFLAGS) distcleancheck + $(am__remove_distdir) + @(echo "$(distdir) archives ready for distribution: "; \ + list='$(DIST_ARCHIVES)'; for i in $$list; do echo $$i; done) | \ + sed -e '1{h;s/./=/g;p;x;}' -e '$${p;x;}' +distuninstallcheck: + @cd $(distuninstallcheck_dir) \ + && test `$(distuninstallcheck_listfiles) | wc -l` -le 1 \ + || { echo "ERROR: files left after uninstall:" ; \ + if test -n "$(DESTDIR)"; then \ + echo " (check DESTDIR support)"; \ + fi ; \ + $(distuninstallcheck_listfiles) ; \ + exit 1; } >&2 +distcleancheck: distclean + @if test '$(srcdir)' = . ; then \ + echo "ERROR: distcleancheck can only run from a VPATH build" ; \ + exit 1 ; \ + fi + @test `$(distcleancheck_listfiles) | wc -l` -eq 0 \ + || { echo "ERROR: files left in build directory after distclean:" ; \ + $(distcleancheck_listfiles) ; \ + exit 1; } >&2 +check-am: all-am +check: check-recursive +all-am: Makefile config.h +installdirs: installdirs-recursive +installdirs-am: +install: install-recursive +install-exec: install-exec-recursive +install-data: install-data-recursive +uninstall: uninstall-recursive + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-recursive +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-recursive + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -f Makefile +distclean-am: clean-am distclean-generic distclean-hdr distclean-tags + +dvi: dvi-recursive + +dvi-am: + +html: html-recursive + +info: info-recursive + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-recursive + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-recursive + -rm -f $(am__CONFIG_DISTCLEAN_FILES) + -rm -rf $(top_srcdir)/autom4te.cache + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-recursive + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-recursive + +pdf-am: + +ps: ps-recursive + +ps-am: + +uninstall-am: uninstall-info-am + +uninstall-info: uninstall-info-recursive + +.PHONY: $(RECURSIVE_TARGETS) CTAGS GTAGS all all-am am--refresh check \ + check-am clean clean-generic clean-recursive ctags \ + ctags-recursive dist dist-all dist-bzip2 dist-gzip dist-shar \ + dist-tarZ dist-zip distcheck distclean distclean-generic \ + distclean-hdr distclean-recursive distclean-tags \ + distcleancheck distdir distuninstallcheck dvi dvi-am html \ + html-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installdirs installdirs-am maintainer-clean \ + maintainer-clean-generic maintainer-clean-recursive \ + mostlyclean mostlyclean-generic mostlyclean-recursive pdf \ + pdf-am ps ps-am tags tags-recursive uninstall uninstall-am \ + uninstall-info-am + + +.PHONY: maintainer-check +maintainer-check: + cd tests && $(MAKE) $(AM_MAKEFLAGS) $@ +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/apps/bin/bison/Makefile.maint b/src/apps/bin/bison/Makefile.maint new file mode 100644 index 0000000000..a5712d8094 --- /dev/null +++ b/src/apps/bin/bison/Makefile.maint @@ -0,0 +1,516 @@ +# -*-Makefile-*- +# This Makefile fragment is shared between the coreutils, +# CPPI, Bison, and Autoconf. + +## Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. +## +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2, or (at your option) +## any later version. +## +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. +## +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +## 02111-1307, USA. + +# This is reported not to work with make-3.79.1 +# ME := $(word $(words $(MAKEFILE_LIST)),$(MAKEFILE_LIST)) +ME := Makefile.maint + +# Do not save the original name or timestamp in the .tar.gz file. +GZIP_ENV = \ + "--no-name --best$$( \ + case $$(gzip --help) in \ + (*--rsyncable*) echo ' --rsyncable';; \ + esac \ + )" + +CVS = cvs + +ifeq ($(origin prev_version_file), undefined) + prev_version_file = .prev-version +endif + +PREV_VERSION := $(shell cat $(prev_version_file)) + +tag-package = $(shell echo "$(PACKAGE)" | tr '[:lower:]' '[:upper:]') +tag-this-version = $(subst .,_,$(VERSION)) +this-cvs-tag = $(tag-package)-$(tag-this-version) +my_distdir = $(PACKAGE)-$(VERSION) + +# Old releases are stored here. +# Used for diffs and xdeltas. +release_archive_dir ?= ../release + +# Prevent programs like 'sort' from considering distinct strings to be equal. +# Doing it here saves us from having to set LC_ALL elsewhere in this file. +export LC_ALL = C + + + +## --------------- ## +## Sanity checks. ## +## --------------- ## + +# Checks that don't require cvs. +# Run `changelog-check' last, as previous test may reveal problems requiring +# new ChangeLog entries. +local-checks-available = \ + po-check copyright-check writable-files m4-check author_mark_check \ + changelog-check strftime-check syntax-check makefile_path_separator_check \ + makefile-check +.PHONY: $(local-checks-available) + +local-check = $(filter-out $(local-checks-to-skip), $(local-checks-available)) + +# Make sure C source files in src/ don't include xalloc.h directly, +# since they all already include it via sys2.h. +# It's not a big deal -- just aesthetics. +.PHONY: $(syntax-check-rules) +syntax-check-rules = \ + sc_cast_of_argument_to_free \ + sc_cast_of_x_alloc_return_value \ + sc_changelog \ + sc_error_exit_success \ + sc_space_tab \ + sc_sun_os_names \ + sc_system_h_headers \ + sc_unmarked_diagnostics \ + sc_xalloc_h_in_src + +syntax-check: $(syntax-check-rules) +# @grep -E '# *include <(limits|std(def|arg|bool))\.h>' \ +# $$(find -type f -name '*.[chly]') && \ +# { echo '$(ME): found conditional include' 1>&2; \ +# exit 1; } || : + +# grep -E '^# *include <(string|stdlib)\.h>' \ +# $(srcdir)/{lib,src}/*.[chy] && \ +# { echo '$(ME): FIXME' 1>&2; \ +# exit 1; } || : +# FIXME: don't allow `#include .strings\.h' anywhere + +# Look for diagnostics that aren't marked for translation. +# This won't find any for which error's format string is on a separate line. +sc_unmarked_diagnostics: + @grep --exclude=$(srcdir)/src/shred.c -E \ + '\&2; \ + exit 1; } || : + +sc_cast_of_argument_to_free: + @grep -E '\&2; \ + exit 1; } || : + +sc_cast_of_x_alloc_return_value: + @grep -E --exclude=$(srcdir)/lib/regex.c \ + '\*\) *x(m|c|re)alloc\>' $(srcdir)/{lib,src}/*.[chy] && \ + { echo '$(ME): don'\''t cast x*alloc return value' 1>&2; \ + exit 1; } || : + +sc_space_tab: + @( cvsu --list ) > /dev/null 2>&1 || : && \ + grep '[ ] ' \ + $$(cvsu --list | grep -vEf .x-$@ ) && \ + { echo '$(ME): found SPACE-TAB sequence; remove the SPACE' \ + 1>&2; exit 1; } || : + +# Using EXIT_SUCCESS as the first argument to error is misleading, +# since when that parameter is 0, error does not exit. Use `0' instead. +sc_error_exit_success: + @grep -F 'error (EXIT_SUCCESS,' \ + $$(find -type f -name '*.[chly]') && \ + { echo '$(ME): found error (EXIT_SUCCESS' 1>&2; \ + exit 1; } || : + +# FIXME: merge this with sc_system_h_headers below. +# xalloc.h is included via system.h, so should not be included +# directly by any file in src/. +sc_xalloc_h_in_src: + @if test -f $(srcdir)/src/sys2.h; then \ + if grep 'xalloc\.h' $(srcdir)/src/*.c; then \ + exit 1; \ + fi; \ + fi + +# FIXME: warn about definitions of EXIT_FAILURE, EXIT_SUCCESS, STREQ + +# Each nonempty line must start with a year number, or a TAB. +sc_changelog: + @grep '^[^12 ]' $$(find . -name ChangeLog -maxdepth 2) && \ + { echo '$(ME): found unexpected prefix in a ChangeLog' 1>&2; \ + exit 1; } || : + +header_regexp = \ + alloca\ + |closeout\ + |ctype\ + |dirent\ + |errno\ + |fcntl\ + |inttypes\ + |limits\ + |locale\ + |pathmax\ + |std(lib|bool)\ + |string\ + |sys/(stat|dir|time)\ + |time\ + |unistd\ + |utime\ + |version-etc\ + |xalloc +h_re := $(shell echo '$(header_regexp)'|tr -d ' ') + +# Files in src/ should not include directly any of +# the headers already included via system.h. +# Get list of candidates with this: +# grep -h include src/sys*.h|sed 's/.*include //'|sort - +sc_system_h_headers: + @( cvsu --list ) > /dev/null 2>&1 || : && \ + grep -E '^# *include ["<]($(h_re))\.h[">]' \ + $$(cvsu --list src | grep -Ev 'sys(2|tem)\.h$$') \ + && { echo '$(ME): the above are already included via system.h'\ + 1>&2; exit 1; } || : + +sc_sun_os_names: + @( cvsu --list ) > /dev/null 2>&1 || : && \ + grep -Ei \ + 'solaris[^[:alnum:]]*2\.(7|8|9|[1-9][0-9])|sunos[^[:alnum:]][6-9]' \ + $$(cvsu --list | grep -vEf .x-$@ ) && \ + { echo '$(ME): found misuse of Sun OS version numbers' 1>&2; \ + exit 1; } || : + +# Ensure that date's --help output stays in sync with the info +# documentation for GNU strftime. The only exception is %N, +# which date accepts but GNU strftime does not. +extract_char = sed 's/^[^%][^%]*%\(.\).*/\1/' +strftime-check: + if test -f $(srcdir)/src/date.c; then \ + grep '^ %. ' $(srcdir)/src/date.c | sort \ + | $(extract_char) > $@-src; \ + { echo N; \ + info libc date calendar format | grep '^ `%.'\' \ + | $(extract_char); } | sort > $@-info; \ + diff -u $@-src $@-info || exit 1; \ + rm -f $@-src $@-info; \ + fi + +# Ensure that we use only the standard $(VAR) notation, +# not @...@ in Makefile.am, now that we can rely on automake +# to emit a definition for each substituted variable. +makefile-check: + grep -E '@[A-Z_0-9]+@' `find . -name Makefile.am` \ + && { echo 'Makefile.maint: use $(...), not @...@' 1>&2; exit 1; } || : + +changelog-check: + if head ChangeLog | grep 'Version $(VERSION)' >/dev/null; then \ + :; \ + else \ + echo "$(VERSION) not in ChangeLog" 1>&2; \ + exit 1; \ + fi + +m4-check: + @grep 'AC_DEFUN([^[]' m4/*.m4 \ + && { echo 'Makefile.maint: quote the first arg to AC_DEFUN' 1>&2; \ + exit 1; } || : + +# Verify that all source files using _() are listed in po/POTFILES.in. +po-check: + if test -f po/POTFILES.in; then \ + grep -E -v '^(#|$$)' po/POTFILES.in | sort > $@-1; \ + files=; \ + for file in lib/*.[chly] src/*.[chly]; do \ + case $$file in \ + *.[ch]) \ + base=`expr " $$file" : ' \(.*\)\..'`; \ + { test -f $$base.l || test -f $$base.y; } && continue;; \ + esac; \ + files="$$files $$file"; \ + done; \ + grep -E -l '\bN?_\([^)"]*("|$$)' $$files | sort > $@-2; \ + diff -u $@-1 $@-2 || exit 1; \ + rm -f $@-1 $@-2; \ + fi + +# In a definition of #define AUTHORS "... and ..." where the RHS contains +# the English word `and', the string must be marked with `N_ (...)' so that +# gettext recognizes it as a string requiring translation. +author_mark_check: + @grep '^# *define AUTHORS "[^"]* and ' src/*.c |grep -v ' N_ (' && \ + { echo 'Makefile.maint: enclose the above strings in N_ (...)' 1>&2; \ + exit 1; } || : + +# Sometimes it is useful to change the PATH environment variable +# in Makefiles. When doing so, it's better not to use the Unix-centric +# path separator of `:', but rather the automake-provided `@PATH_SEPARATOR@'. +# It'd be better to use `find -print0 ...|xargs -0 ...', but less portable, +# and there probably aren't many projects with so many Makefile.am files +# that we'd have to worry about limits on command line length. +msg = 'Makefile.maint: Do not use `:'\'' above; use @PATH_SEPARATOR@ instead' +makefile_path_separator_check: + @grep 'PATH=.*:' `find $(srcdir) -name Makefile.am` \ + && { echo $(msg) 1>&2; exit 1; } || : + +# Check that `make alpha' will not fail at the end of the process. +writable-files: + if test -d $(release_archive_dir); then :; else \ + mkdir $(release_archive_dir); \ + fi + for file in $(distdir).tar.gz $(xd-delta) \ + $(release_archive_dir)/$(distdir).tar.gz \ + $(release_archive_dir)/$(xd-delta); do \ + test -e $$file || continue; \ + test -w $$file \ + || { echo ERROR: $$file is not writable; fail=1; }; \ + done; \ + test "$$fail" && exit 1 || : + +v_etc_file = lib/version-etc.c +# Make sure that the copyright date in $(v_etc_file) is up to date. +copyright-check: + @if test -f $(v_etc_file); then \ + grep '"Copyright (C) $(shell date +%Y) Free' $(v_etc_file) \ + >/dev/null \ + || { echo 'out of date copyright in $(v_etc_file); update it' 1>&2; \ + exit 1; }; \ + fi + + +# Sanity checks with the CVS repository. +cvs-tag-check: + echo $(this-cvs-tag); \ + if $(CVS) -n log -h README | grep -e $(this-cvs-tag): >/dev/null; then \ + echo "$(this-cvs-tag) as already been used; not tagging" 1>&2; \ + exit 1; \ + else :; fi + +cvs-diff-check: + if $(CVS) diff >cvs-diffs; then \ + rm cvs-diffs; \ + else \ + echo "Some files are locally modified:" 1>&2; \ + cat cvs-diffs; \ + exit 1; \ + fi + +cvs-check: cvs-diff-check cvs-tag-check + +maintainer-distcheck: changelog-check + $(MAKE) distcheck + $(MAKE) my-distcheck + + +# Tag before making distribution. Also, don't make a distribution if +# checks fail. Also, make sure the NEWS file is up-to-date. +# FIXME: use dist-hook/my-dist like distcheck-hook/my-distcheck. +cvs-dist: $(local-check) cvs-check maintainer-distcheck + $(CVS) update po + $(CVS) tag -c $(this-cvs-tag) + $(MAKE) dist + +# Use this to make sure we don't run these programs when building +# from a virgin tgz file, below. +null_AM_MAKEFLAGS = \ + ACLOCAL=false \ + AUTOCONF=false \ + AUTOMAKE=false \ + AUTOHEADER=false \ + MAKEINFO=false + +# Detect format-string/arg-list mismatches that would normally be obscured +# by the use of _(). The --disable-nls effectively defines away that macro, +# and building with CFLAGS='-Wformat -Werror' causes any format warning to be +# treated as a failure. +TMPDIR ?= /tmp +t=$(TMPDIR)/$(PACKAGE)/test +my-distcheck: $(local-check) + -rm -rf $(t) + mkdir -p $(t) + GZIP=$(GZIP_ENV) $(AMTAR) -C $(t) -zxf $(distdir).tar.gz + cd $(t)/$(distdir) \ + && ./configure --disable-nls \ + && $(MAKE) CFLAGS='-Wformat -Werror' \ + AM_MAKEFLAGS='$(null_AM_MAKEFLAGS)' \ + && $(MAKE) dvi \ + && $(MAKE) check \ + && $(MAKE) distclean + (cd $(t) && mv $(distdir) $(distdir).old \ + && $(AMTAR) -zxf - ) < $(distdir).tar.gz + diff -ur $(t)/$(distdir).old $(t)/$(distdir) + -rm -rf $(t) + @echo "========================"; \ + echo "$(distdir).tar.gz is ready for distribution"; \ + echo "========================" + +WGET = wget +WGETFLAGS = -C off + +tgz-md5 = $(shell md5sum < $(my_distdir).tar.gz|sed 's/ -//') +tgz-sha1 = $(shell sha1sum < $(my_distdir).tar.gz|sed 's/ -//') +bz2-md5 = $(shell md5sum < $(my_distdir).tar.bz2|sed 's/ -//') +bz2-sha1 = $(shell sha1sum < $(my_distdir).tar.bz2|sed 's/ -//') +xdelta-md5 = $(shell md5sum < $(xd-delta)|sed 's/ -//') +xdelta-sha1 = $(shell sha1sum < $(xd-delta)|sed 's/ -//') +tgz-size = $(shell du --human $(my_distdir).tar.gz|sed 's/\([MkK]\).*/ \1B/') +bz2-size = $(shell du --human $(my_distdir).tar.bz2|sed 's/\([MkK]\).*/ \1B/') +xd-size = $(shell du --human $(xd-delta)|sed 's/\([MkK]\).*/ \1B/') + +rel-check: + tarz=/tmp/rel-check-tarz-$$$$; \ + md5_tmp=/tmp/rel-check-md5-$$$$; \ + set -e; \ + trap 'status=$$?; rm -f $$tarz $$md5_tmp; exit $$status' 0 1 2 3 15; \ + $(WGET) $(WGETFLAGS) -q --output-document=$$tarz $(url); \ + echo "$(md5) -" > $$md5_tmp; \ + md5sum -c $$md5_tmp < $$tarz + +prev-tgz = $(PACKAGE)-$(PREV_VERSION).tar.gz +xd-delta = $(PACKAGE)-$(PREV_VERSION)-$(VERSION).xdelta + +signatures ?= $(distdir).tar.bz2.asc $(distdir).tar.gz.asc +%.asc: % + rm -f $@ + gpg --armor --detach-sign -o $@ $< + +rel-files = $(xd-delta) $(distdir).tar.bz2 $(distdir).tar.gz $(signatures) +announce_gen ?= ./announce-gen +announcement: NEWS ChangeLog $(rel-files) $(signatures) + @$(announce_gen) \ + --release-type=$(RELEASE_TYPE) \ + --package=$(PACKAGE) \ + --prev=$(PREV_VERSION) \ + --curr=$(VERSION) \ + --release-archive-directory=$(release_archive_dir) \ + --news=NEWS \ + $(addprefix --url-dir=, $(url_dir_list)) \ + + +## ---------------- ## +## Updating files. ## +## ---------------- ## + +ftp-gnu = ftp://ftp.gnu.org/gnu +www-gnu = http://www.gnu.org + +# Use mv, if you don't have/want move-if-change. +move_if_change ?= move-if-change + + +# --------------------- # +# Updating everything. # +# --------------------- # + +.PHONY: update +local_updates ?= wget-update cvs-update po-update +update: $(local_updates) + + +# ------------------- # +# Updating PO files. # +# ------------------- # + +po_repo = http://www.iro.umontreal.ca/contrib/po/maint/$(PACKAGE) +.PHONY: do-po-update po-update +do-po-update: + tmppo=/tmp/$(PACKAGE)-$(VERSION)-po &&\ + rm -rf $$tmppo && \ + mkdir $$tmppo && \ + (cd $$tmppo && \ + $(WGET) $(WGETFLAGS) -r -l1 -nd --no-parent -A '*.po' $(po_repo)) &&\ + cp $$tmppo/*.po po + cd po && $(MAKE) update-po + $(MAKE) po-check + +po-update: + if test -d "po"; then \ + $(MAKE) do-po-update; \ + fi + +# -------------------------- # +# Updating GNU build tools. # +# -------------------------- # + +# The following pseudo table associates a local directory and a URL +# with each of the files that belongs to some other package and is +# regularly updated from the specified URL. +wget_files ?= $(srcdir)/config/config.guess \ + $(srcdir)/config/config.sub \ + $(srcdir)/src/ansi2knr.c \ + $(srcdir)/config/texinfo.tex +get-targets = $(patsubst %, get-%, $(wget_files)) + +config.guess-url_prefix = $(ftp-gnu)/config/ +config.sub-url_prefix = $(ftp-gnu)/config/ + +ansi2knr.c-url_prefix = ftp://ftp.cs.wisc.edu/ghost/ + +texinfo.tex-url_prefix = $(ftp-gnu)/texinfo/ + +standards.texi-url_prefix = $(www-gnu)/prep/ +make-stds.texi-url_prefix = $(standards.texi-url_prefix) + +target = $(patsubst get-%, %, $@) +url = $($(notdir $(target))-url_prefix)$(notdir $(target)) + +.PHONY: $(get-targets) +$(get-targets): + $(WGET) $(WGETFLAGS) $(url) -O $(target).t \ + && $(move_if_change) $(target).t $(target) + +cvs_files ?= \ + $(srcdir)/src/ansi2knr.c \ + $(srcdir)/config/depcomp \ + $(srcdir)/config/install-sh \ + $(srcdir)/config/missing \ + $(srcdir)/config/mkinstalldirs +automake_repo=:pserver:anoncvs:anoncvs@sources.redhat.com:/cvs/automake +.PHONY: wget-update +wget-update: $(get-targets) + +.PHONY: cvs-update +cvs-update: + fail=; \ + for f in $(cvs_files); do \ + test -f $$f || { echo "*** skipping $$f" 1>&2; continue; }; \ + cvs diff $$f > /dev/null \ + || { echo "*** $$f is locally modified; skipping it" 1>&2; \ + fail=yes; continue; }; \ + file=$$(basename $$f); \ + echo checking out $$file...; \ + $(CVS) -d $(automake_repo) co -p automake/lib/$$file> $$f.t \ + && $(move_if_change) $$f.t $$f; \ + done; \ + test "$$fail" && exit 1 + +define emit-upload-commands + echo ===================================== + echo ===================================== + echo upload $(PACKAGE) $(PREV_VERSION) $(VERSION) + echo '# send the /tmp/announcement e-mail' + echo ===================================== + echo ===================================== +endef + +$(xd-delta): $(release_archive_dir)/$(prev-tgz) $(distdir).tar.gz + xdelta delta -9 $^ $@ || : + +.PHONY: alpha beta major +alpha beta major: $(local-check) + $(MAKE) cvs-dist + $(MAKE) $(xd-delta) + $(MAKE) -s announcement RELEASE_TYPE=$@ > /tmp/announce-$(my_distdir) + ln $(rel-files) $(release_archive_dir) + chmod a-w $(rel-files) + echo $(VERSION) > $(prev_version_file) + $(CVS) ci -m. $(prev_version_file) + @$(emit-upload-commands) diff --git a/src/apps/bin/bison/NEWS b/src/apps/bin/bison/NEWS new file mode 100644 index 0000000000..bc66e854a1 --- /dev/null +++ b/src/apps/bin/bison/NEWS @@ -0,0 +1,591 @@ +Bison News +---------- + +Changes in version 1.875d, 2004-05-21: + +* Unescaped newlines are no longer allowed in character constants or + string literals. They were never portable, and GCC 3.4.0 has + dropped support for them. Better diagnostics are now generated if + forget a closing quote. + +* NUL bytes are no longer allowed in Bison string literals, unfortunately. + +* %token numbers can now be hexadecimal integers, e.g., `%token FOO 0x12d'. + This is a GNU extension. + +* A new directive "%expect-rr N" specifies the expected number of + reduce/reduce conflicts in GLR parsers. + +* Experimental %destructor support has been added to lalr1.cc. + +Changes in version 1.875c, 2003-08-25: + + (Just bug fixes.) + +Changes in version 1.875b, 2003-06-17: + +* GLR grammars now support locations. + +* Semicolon changes: + - Semicolons are now allowed before "|" in grammar rules, as POSIX requires. + - Stray semicolons are no longer allowed at the start of a grammar. + - Semicolons are now required after in-grammar declarations. + +Changes in version 1.875a, 2003-02-01: + +* For now, %expect-count violations are now just warnings, not errors. + This is for compatibility with Bison 1.75 and earlier (when there are + reduce/reduce conflicts) and with Bison 1.30 and earlier (when there + are too many or too few shift/reduce conflicts). However, in future + versions of Bison we plan to improve the %expect machinery so that + these violations will become errors again. + +* New configure option --disable-yacc, to disable installation of the + yacc command and -ly library introduced in 1.875 for POSIX conformance. + +Changes in version 1.875, 2003-01-01: + +* The documentation license has been upgraded to version 1.2 + of the GNU Free Documentation License. + +* syntax error processing + + - In Yacc-style parsers YYLLOC_DEFAULT is now used to compute error + locations too. This fixes bugs in error-location computation. + + - %destructor + It is now possible to reclaim the memory associated to symbols + discarded during error recovery. This feature is still experimental. + + - %error-verbose + This new directive is preferred over YYERROR_VERBOSE. + + - #defining yyerror to steal internal variables is discouraged. + It is not guaranteed to work forever. + +* POSIX conformance + + - Semicolons are once again optional at the end of grammar rules. + This reverts to the behavior of Bison 1.33 and earlier, and improves + compatibility with Yacc. + + - `parse error' -> `syntax error' + Bison now uniformly uses the term `syntax error'; formerly, the code + and manual sometimes used the term `parse error' instead. POSIX + requires `syntax error' in diagnostics, and it was thought better to + be consistent. + + - The documentation now emphasizes that yylex and yyerror must be + declared before use. C99 requires this. + + - Bison now parses C99 lexical constructs like UCNs and + backslash-newline within C escape sequences, as POSIX 1003.1-2001 requires. + + - File names are properly escaped in C output. E.g., foo\bar.y is + output as "foo\\bar.y". + + - Yacc command and library now available + The Bison distribution now installs a `yacc' command, as POSIX requires. + Also, Bison now installs a small library liby.a containing + implementations of Yacc-compatible yyerror and main functions. + This library is normally not useful, but POSIX requires it. + + - Type clashes now generate warnings, not errors. + + - If the user does not define YYSTYPE as a macro, Bison now declares it + using typedef instead of defining it as a macro. + For consistency, YYLTYPE is also declared instead of defined. + +* Other compatibility issues + + - %union directives can now have a tag before the `{', e.g., the + directive `%union foo {...}' now generates the C code + `typedef union foo { ... } YYSTYPE;'; this is for Yacc compatibility. + The default union tag is `YYSTYPE', for compatibility with Solaris 9 Yacc. + For consistency, YYLTYPE's struct tag is now `YYLTYPE' not `yyltype'. + This is for compatibility with both Yacc and Bison 1.35. + + - `;' is output before the terminating `}' of an action, for + compatibility with Bison 1.35. + + - Bison now uses a Yacc-style format for conflict reports, e.g., + `conflicts: 2 shift/reduce, 1 reduce/reduce'. + + - `yystype' and `yyltype' are now obsolescent macros instead of being + typedefs or tags; they are no longer documented and are planned to be + withdrawn in a future release. + +* GLR parser notes + + - GLR and inline + Users of Bison have to decide how they handle the portability of the + C keyword `inline'. + + - `parsing stack overflow...' -> `parser stack overflow' + GLR parsers now report `parser stack overflow' as per the Bison manual. + +* Bison now warns if it detects conflicting outputs to the same file, + e.g., it generates a warning for `bison -d -o foo.h foo.y' since + that command outputs both code and header to foo.h. + +* #line in output files + - --no-line works properly. + +* Bison can no longer be built by a K&R C compiler; it requires C89 or + later to be built. This change originally took place a few versions + ago, but nobody noticed until we recently asked someone to try + building Bison with a K&R C compiler. + +Changes in version 1.75, 2002-10-14: + +* Bison should now work on 64-bit hosts. + +* Indonesian translation thanks to Tedi Heriyanto. + +* GLR parsers + Fix spurious parse errors. + +* Pure parsers + Some people redefine yyerror to steal yyparse' private variables. + Reenable this trick until an official feature replaces it. + +* Type Clashes + In agreement with POSIX and with other Yaccs, leaving a default + action is valid when $$ is untyped, and $1 typed: + + untyped: ... typed; + + but the converse remains an error: + + typed: ... untyped; + +* Values of mid-rule actions + The following code: + + foo: { ... } { $$ = $1; } ... + + was incorrectly rejected: $1 is defined in the second mid-rule + action, and is equal to the $$ of the first mid-rule action. + +Changes in version 1.50, 2002-10-04: + +* GLR parsing + The declaration + %glr-parser + causes Bison to produce a Generalized LR (GLR) parser, capable of handling + almost any context-free grammar, ambiguous or not. The new declarations + %dprec and %merge on grammar rules allow parse-time resolution of + ambiguities. Contributed by Paul Hilfinger. + + Unfortunately Bison 1.50 does not work properly on 64-bit hosts + like the Alpha, so please stick to 32-bit hosts for now. + +* Output Directory + When not in Yacc compatibility mode, when the output file was not + specified, running `bison foo/bar.y' created `foo/bar.c'. It + now creates `bar.c'. + +* Undefined token + The undefined token was systematically mapped to 2 which prevented + the use of 2 by the user. This is no longer the case. + +* Unknown token numbers + If yylex returned an out of range value, yyparse could die. This is + no longer the case. + +* Error token + According to POSIX, the error token must be 256. + Bison extends this requirement by making it a preference: *if* the + user specified that one of her tokens is numbered 256, then error + will be mapped onto another number. + +* Verbose error messages + They no longer report `..., expecting error or...' for states where + error recovery is possible. + +* End token + Defaults to `$end' instead of `$'. + +* Error recovery now conforms to documentation and to POSIX + When a Bison-generated parser encounters a syntax error, it now pops + the stack until it finds a state that allows shifting the error + token. Formerly, it popped the stack until it found a state that + allowed some non-error action other than a default reduction on the + error token. The new behavior has long been the documented behavior, + and has long been required by POSIX. For more details, please see + . + +* Traces + Popped tokens and nonterminals are now reported. + +* Larger grammars + Larger grammars are now supported (larger token numbers, larger grammar + size (= sum of the LHS and RHS lengths), larger LALR tables). + Formerly, many of these numbers ran afoul of 16-bit limits; + now these limits are 32 bits on most hosts. + +* Explicit initial rule + Bison used to play hacks with the initial rule, which the user does + not write. It is now explicit, and visible in the reports and + graphs as rule 0. + +* Useless rules + Before, Bison reported the useless rules, but, although not used, + included them in the parsers. They are now actually removed. + +* Useless rules, useless nonterminals + They are now reported, as a warning, with their locations. + +* Rules never reduced + Rules that can never be reduced because of conflicts are now + reported. + +* Incorrect `Token not used' + On a grammar such as + + %token useless useful + %% + exp: '0' %prec useful; + + where a token was used to set the precedence of the last rule, + bison reported both `useful' and `useless' as useless tokens. + +* Revert the C++ namespace changes introduced in 1.31 + as they caused too many portability hassles. + +* Default locations + By an accident of design, the default computation of @$ was + performed after another default computation was performed: @$ = @1. + The latter is now removed: YYLLOC_DEFAULT is fully responsible of + the computation of @$. + +* Token end-of-file + The token end of file may be specified by the user, in which case, + the user symbol is used in the reports, the graphs, and the verbose + error messages instead of `$end', which remains being the default. + For instance + %token MYEOF 0 + or + %token MYEOF 0 "end of file" + +* Semantic parser + This old option, which has been broken for ages, is removed. + +* New translations + Brazilian Portuguese, thanks to Alexandre Folle de Menezes. + Croatian, thanks to Denis Lackovic. + +* Incorrect token definitions + When given `%token 'a' "A"', Bison used to output `#define 'a' 65'. + +* Token definitions as enums + Tokens are output both as the traditional #define's, and, provided + the compiler supports ANSI C or is a C++ compiler, as enums. + This lets debuggers display names instead of integers. + +* Reports + In addition to --verbose, bison supports --report=THINGS, which + produces additional information: + - itemset + complete the core item sets with their closure + - lookahead + explicitly associate lookaheads to items + - solved + describe shift/reduce conflicts solving. + Bison used to systematically output this information on top of + the report. Solved conflicts are now attached to their states. + +* Type clashes + Previous versions don't complain when there is a type clash on + the default action if the rule has a mid-rule action, such as in: + + %type bar + %% + bar: '0' {} '0'; + + This is fixed. + +* GNU M4 is now required when using Bison. + +Changes in version 1.35, 2002-03-25: + +* C Skeleton + Some projects use Bison's C parser with C++ compilers, and define + YYSTYPE as a class. The recent adjustment of C parsers for data + alignment and 64 bit architectures made this impossible. + + Because for the time being no real solution for C++ parser + generation exists, kludges were implemented in the parser to + maintain this use. In the future, when Bison has C++ parsers, this + kludge will be disabled. + + This kludge also addresses some C++ problems when the stack was + extended. + +Changes in version 1.34, 2002-03-12: + +* File name clashes are detected + $ bison foo.y -d -o foo.x + fatal error: header and parser would both be named `foo.x' + +* A missing `;' at the end of a rule triggers a warning + In accordance with POSIX, and in agreement with other + Yacc implementations, Bison will mandate this semicolon in the near + future. This eases the implementation of a Bison parser of Bison + grammars by making this grammar LALR(1) instead of LR(2). To + facilitate the transition, this release introduces a warning. + +* Revert the C++ namespace changes introduced in 1.31, as they caused too + many portability hassles. + +* DJGPP support added. + +* Fix test suite portability problems. + +Changes in version 1.33, 2002-02-07: + +* Fix C++ issues + Groff could not be compiled for the definition of size_t was lacking + under some conditions. + +* Catch invalid @n + As is done with $n. + +Changes in version 1.32, 2002-01-23: + +* Fix Yacc output file names + +* Portability fixes + +* Italian, Dutch translations + +Changes in version 1.31, 2002-01-14: + +* Many Bug Fixes + +* GNU Gettext and %expect + GNU Gettext asserts 10 s/r conflicts, but there are 7. Now that + Bison dies on incorrect %expectations, we fear there will be + too many bug reports for Gettext, so _for the time being_, %expect + does not trigger an error when the input file is named `plural.y'. + +* Use of alloca in parsers + If YYSTACK_USE_ALLOCA is defined to 0, then the parsers will use + malloc exclusively. Since 1.29, but was not NEWS'ed. + + alloca is used only when compiled with GCC, to avoid portability + problems as on AIX. + +* When the generated parser lacks debugging code, YYDEBUG is now 0 + (as POSIX requires) instead of being undefined. + +* User Actions + Bison has always permitted actions such as { $$ = $1 }: it adds the + ending semicolon. Now if in Yacc compatibility mode, the semicolon + is no longer output: one has to write { $$ = $1; }. + +* Better C++ compliance + The output parsers try to respect C++ namespaces. + [This turned out to be a failed experiment, and it was reverted later.] + +* Reduced Grammars + Fixed bugs when reporting useless nonterminals. + +* 64 bit hosts + The parsers work properly on 64 bit hosts. + +* Error messages + Some calls to strerror resulted in scrambled or missing error messages. + +* %expect + When the number of shift/reduce conflicts is correct, don't issue + any warning. + +* The verbose report includes the rule line numbers. + +* Rule line numbers are fixed in traces. + +* Swedish translation + +* Parse errors + Verbose parse error messages from the parsers are better looking. + Before: parse error: unexpected `'/'', expecting `"number"' or `'-'' or `'('' + Now: parse error: unexpected '/', expecting "number" or '-' or '(' + +* Fixed parser memory leaks. + When the generated parser was using malloc to extend its stacks, the + previous allocations were not freed. + +* Fixed verbose output file. + Some newlines were missing. + Some conflicts in state descriptions were missing. + +* Fixed conflict report. + Option -v was needed to get the result. + +* %expect + Was not used. + Mismatches are errors, not warnings. + +* Fixed incorrect processing of some invalid input. + +* Fixed CPP guards: 9foo.h uses BISON_9FOO_H instead of 9FOO_H. + +* Fixed some typos in the documentation. + +* %token MY_EOF 0 is supported. + Before, MY_EOF was silently renumbered as 257. + +* doc/refcard.tex is updated. + +* %output, %file-prefix, %name-prefix. + New. + +* --output + New, aliasing `--output-file'. + +Changes in version 1.30, 2001-10-26: + +* `--defines' and `--graph' have now an optional argument which is the + output file name. `-d' and `-g' do not change; they do not take any + argument. + +* `%source_extension' and `%header_extension' are removed, failed + experiment. + +* Portability fixes. + +Changes in version 1.29, 2001-09-07: + +* The output file does not define const, as this caused problems when used + with common autoconfiguration schemes. If you still use ancient compilers + that lack const, compile with the equivalent of the C compiler option + `-Dconst='. autoconf's AC_C_CONST macro provides one way to do this. + +* Added `-g' and `--graph'. + +* The Bison manual is now distributed under the terms of the GNU FDL. + +* The input and the output files has automatically a similar extension. + +* Russian translation added. + +* NLS support updated; should hopefully be less troublesome. + +* Added the old Bison reference card. + +* Added `--locations' and `%locations'. + +* Added `-S' and `--skeleton'. + +* `%raw', `-r', `--raw' is disabled. + +* Special characters are escaped when output. This solves the problems + of the #line lines with path names including backslashes. + +* New directives. + `%yacc', `%fixed_output_files', `%defines', `%no_parser', `%verbose', + `%debug', `%source_extension' and `%header_extension'. + +* @$ + Automatic location tracking. + +Changes in version 1.28, 1999-07-06: + +* Should compile better now with K&R compilers. + +* Added NLS. + +* Fixed a problem with escaping the double quote character. + +* There is now a FAQ. + +Changes in version 1.27: + +* The make rule which prevented bison.simple from being created on + some systems has been fixed. + +Changes in version 1.26: + +* Bison now uses automake. + +* New mailing lists: and . + +* Token numbers now start at 257 as previously documented, not 258. + +* Bison honors the TMPDIR environment variable. + +* A couple of buffer overruns have been fixed. + +* Problems when closing files should now be reported. + +* Generated parsers should now work even on operating systems which do + not provide alloca(). + +Changes in version 1.25, 1995-10-16: + +* Errors in the input grammar are not fatal; Bison keeps reading +the grammar file, and reports all the errors found in it. + +* Tokens can now be specified as multiple-character strings: for +example, you could use "<=" for a token which looks like <=, instead +of chosing a name like LESSEQ. + +* The %token_table declaration says to write a table of tokens (names +and numbers) into the parser file. The yylex function can use this +table to recognize multiple-character string tokens, or for other +purposes. + +* The %no_lines declaration says not to generate any #line preprocessor +directives in the parser file. + +* The %raw declaration says to use internal Bison token numbers, not +Yacc-compatible token numbers, when token names are defined as macros. + +* The --no-parser option produces the parser tables without including +the parser engine; a project can now use its own parser engine. +The actions go into a separate file called NAME.act, in the form of +a switch statement body. + +Changes in version 1.23: + +The user can define YYPARSE_PARAM as the name of an argument to be +passed into yyparse. The argument should have type void *. It should +actually point to an object. Grammar actions can access the variable +by casting it to the proper pointer type. + +Line numbers in output file corrected. + +Changes in version 1.22: + +--help option added. + +Changes in version 1.20: + +Output file does not redefine const for C++. + +Local Variables: +mode: outline +End: + +----- + +Copyright (C) 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 +Free Software Foundation, Inc. + +This file is part of Bison, the GNU Compiler Compiler. + +Bison is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +Bison is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with autoconf; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. diff --git a/src/apps/bin/bison/OChangeLog b/src/apps/bin/bison/OChangeLog new file mode 100644 index 0000000000..5ae60b926c --- /dev/null +++ b/src/apps/bin/bison/OChangeLog @@ -0,0 +1,1500 @@ +1998-01-04 J.J. van der Heijden + + * src/files.c (openfiles) [_WIN32 && !__CYGWIN32__]: Use TEMP or + Temp to find a temporary directory, if possible. Do not unlink + files while they are open. + +1997-08-25 Richard Stallman + + * src/reader.c (stack_offset;): Change some warni to warns. + + * src/lex.c (literalchar): Use warns, not warni. + +1997-06-28 Richard Stallman + + * src/bison.simple: Add a Bison version comment. + + * Makefile.in (bison_version): New variable. + (dist): Use that variable. + (bison.s1): Substitute the Bison version into bison.simple. + + * src/main.c (fatal, warn, berror): Use program_name. + +1997-06-18 Richard Stallman + + * Makefile.in: new.h renamed to alloc.h. + * src/*.c: src/new.h renamed to src/alloc.h. + + * src/alloc.h: Renamed from src/new.h. + +1997-06-15 Richard Stallman + + * src/main.c (fatal, warn, berror): Make error messages standard. + (toomany): Improve error message text. + +1997-05-24 Richard Stallman + + * src/lex.c (literalchar): Fix the code for escaping \, " and '. + +1997-05-23 Richard Stallman + + * src/lex.c (lex): Avoid trouble when there are many chars + to discard in a char literal with just several chars in it. + +1997-05-17 Richard Stallman + + * src/bison.simple: Use malloc, if using alloca is troublesome. + (YYSTACK_USE_ALLOCA): New flag macro. + Define it for some systems and compilers. + (YYSTACK_ALLOC): New macro. + (yyparse): Use YYSTACK_ALLOC to allocate stack. + If it was malloc'd, free it. + +1997-05-02 Richard Stallman + + * src/bison.simple [_AIX]: Don't include malloc.h. + +1997-04-23 Richard Stallman + + * src/bison.simple (alloca) [__hpux]: Always define as + __builtin_alloca. + +1997-04-22 Richard Stallman + + * src/bison.simple (__yy_memcpy): Declare arg `count' as unsigned + int. + (yyparse): Cast third arg to __yy_memcpy to unsigned int. + + * src/bison.simple (alloca) [__hpux]: Include alloca.h (right for + HPUX 10) instead of declaring alloca (right for HPUX 9). + +1997-01-02 Richard Stallman + + * src/allocate.c [__STDC__ or _MSC_VER]: + Declare calloc and realloc to return void *. + + * Makefile.in (dist): Explicitly check for symlinks, and copy them. + +1996-12-17 Paul Eggert + + * src/bison.simple (yyparse): If __GNUC__ and YYPARSE_PARAM are + both defined, declare yyparse to have a void * argument. + +1996-12-17 Richard Stallman + + * src/system.h [_MSC_VER]: Include stdlib.h and process.h. + [_MSC_VER] (getpid): Define as macro--translate it to _getpid. + + * src/reduce.c (nbits): Add some casts. + + * src/main.c (main): Return FAILURE as a value. + (printable_version): Declare arg as int, not char. + + * src/files.c [_MSC_VER] (XPFILE, XPFILE1): Define, if not already + defined. + +1996-12-16 Richard Stallman + + * src/main.c (printable_version): Use type `int' for the arg. + +1996-08-12 Richard Stallman + + * src/bison.simple: Test _MSDOS as well as _MSDOS_. + +1996-07-31 Richard Stallman + + * src/bison.simple [__sun && __i386]: Include alloca.h. + +1996-07-30 Richard Stallman + + * src/bison.simple: Test _MSDOS_, not MSDOS. + +1996-06-01 Richard Stallman + + * All files: Insert `_' macro around many string constants. + + * src/system.h [HAVE_LOCALE_H]: Include locale.h. + [! HAVE_LOCALE_H] (setlocale): Define as no-op. + [ENABLE_NLS]: Include libintl.h. + [ENABLE_NLS] (gettext): Define. + [! ENABLE_NLS] (bintextdomain, textdomain, _): Consolation definitions. + (N_, PACKAGE, LOCALEDIR): New macros. + + * src/main.c (main): Call setlocale, bindtextdomain and textdomain. + + * POTFILES.in: New file. + + * Makefile.in (allocate.o): Define target explicitly. + +1996-06-01 Jim Meyering + + * Makefile.in (CFLAGS): Set to @CFLAGS@. + (LDFLAGS): Set to @LDFLAGS@. + (configure): Run autoconf only if preceding `cd' succeeds. + (src/bison.s1): Redirect output to temporary file then move the + temporary to the target, rather than redirecting directly to + src/bison.s1. + (clean): Remove config.status and config.log. + (distclean): Don't remove config.status here. + +1996-05-12 Jim Meyering + + * src/bison.simple (__yy_memcpy) [__cplusplus]: Reorder declarations + of variables f and t. + +1996-05-11 Richard Stallman + + * Version 1.25 released. + + * Makefile.in (dist): Don't use $(srcdir). + + * src/bison.simple (__yy_memcpy): Really reorder the args, as was + supposedly done on Feb 14 1995. + (yyparse): Calls changed accordingly. + +1996-01-24 Richard Stallman + + * src/output.c (output_rule_data): Test YYERROR_VERBOSE in the + conditional around the definition of ttyname. + +1995-12-28 Richard Stallman + + * src/bison.simple: Fix line numbers in #line commands. + +1995-12-24 Richard Stallman + + * src/bison.simple (YYPARSE_PARAM_DECL): In C++, make it always + null. + (YYPARSE_PARAM_ARG): New macro. + (yyparse): Use YYPARSE_PARAM_ARG. + +1995-10-15 Richard Stallman + + * src/version.c: Version now 1.25. + + * src/main.c (warn): Set `failure'. + +1995-08-01 Wilfred J. Hansen + + * src/bison.cld, src/getargs.c, src/vmsgetargs.c: Added -n, -k, + and -raw switches. + (noparserflag, toknumflag, rawtoknumflag): New variables. + + * src/conflicts.c (resolve_sr_conflict): Remove use of alloca. + + * src/files.c (openfiles, open_extra_files, done): Add faction flag + and actfile file. Handle noparserflag. Both for -n switch. + + * src/lex.c: Include getopt.h. Add some extern decls. + (safegetc): New function to deal with EOF gracefully. + (literalchar); new function to deal with reading \ escapes. + (lex): Use literalchar. + (lex): Implemented "..." tokens. + (literalchar, lex, parse_percent_token): Made tokenbuffer + always contain the token. This includes growing the token + buffer while reading an integer. + (parse_percent_token): Replaced if-else statement with percent_table. + (parse_percent_token): Added % declarations as another + way to specify the flags -n, -l, and -r. Also added hooks for + -d, -k, -y, -v, -t, -p, -b, -o, but implementation requires + major changes to src/files.c. + (lex) Retain in the incoming stream a character following + an incorrect '/'. + (skip_white_space, lex): Revised most error messages + and changed fatal to warn to avoid aborting. + (percent_table): Added %thong declarations. + + * src/lex.h: Added THONG and NOOP for alias processing. + Added SETOPT for the new code that allows setting options with %flags. + + * src/main.c (main): If reader sees an error, don't process the + grammar. + (fatals): Updated to not use VARARGS1. + (printable_version, int_to_string, warn, warni, warns, warnss) + (warnsss): New error reporting functions. Avoid abort for error. + + * src/output.c (output_headers, output_trailers, output, output_gram) + (output_rule_data): Implement noparserflag variable. + Implement toknumflag variable. + (output): Call reader_output_yylsp to output LTYPESTR. + + * src/reader.c (reader_output_yylsp): New function. + (readgram): Use `#if 0' around code that accepted %command inside + grammar rules: The documentation doesn't allow it, and it will + fail since the %command processors scan for the next %. + (parse_token_decl): Extended the %token declaration to allow a + multi-character symbol as an alias. + (parse_thong_decl): New function. + (read_declarations): Added %thong declarations. + (read_declarations): Handle NOOP to deal with allowing % + declarations as another means to specify the flags. + (readgram): Allow %prec prior to semantics embedded in a rule. + (skip_to_char, read_declarations, copy_definition) + (parse_token_decl, parse_start_decl, parse_type_decl) + (parse_assoc_decl, parse_union_decl, parse_expect_decl) + (get_type_name, copy_guard, copy_action, readgram) + (get_type, packsymbols): Revised most error messages. Changed + `fatal' to `warnxxx' to avoid aborting for error. Revised and use + multiple warnxxx functions to avoid using VARARGS1. + (read_declarations): Improve the error message for an invalid + character. Do not abort. + (read_declarations, copy_guard, copy_action): Use + printable_version to avoid unprintable characters in printed + output. + (parse_expect_decl): Error if argument to %expect exceeds 10 + digits. + (parse_token_decl, parse_assoc_decl, parse_type_decl, get_type): + Allow the type of a non-terminal can be given more than once, as + long as all specifications give the same type. + + * src/reduce.c (reduce_grammar): Revise an error message. + (print_notices): Remove final `.' from error message. + + * src/symtab.h (SALIAS): New #define for adding aliases to %token. + (struct bucket): Added `alias' field. + +1995-05-03 Richard Stallman + + * src/bison.simple: Change distribution terms. + + * src/version.c: Version now 1.23. No, 1.24. + +1995-02-23 Richard Stallman + + * src/files.c: Test __VMS_POSIX as well as VMS. + +1995-02-14 Jim Meyering + + * src/bison.simple (__yy_memcpy): Renamed from __yy_bcopy to avoid + confusion. Reverse FROM and TO arguments to be consistent with + those of memcpy. + +1994-11-10 David J. MacKenzie + + * Makefile.in (DISTFILES): Include install-sh, not install.sh. + Include NEWS. + + * configure.in: Update to Autoconf v2 macro names. + +1994-10-04 David J. MacKenzie + + * Makefile.in (prefix, exec_prefix): Let configure set them. + +1994-09-28 David J. MacKenzie + + * Makefile.in: Set datadir to $(prefix)/share. + +1994-07-12 Richard Stallman + + * src/reader.c (reader): Rename undefined-token token to + `$undefined.'. + +1994-05-05 David J. MacKenzie + + * Makefile.in (DISTFILES): Add install.sh. + (install): Remove chmod commands. + +1994-03-26 Richard Stallman + + * src/bison.simple: Fix #line commands. + +1994-03-24 Richard Stallman + + * src/conflicts.c (print_reductions): Increment both fp1 and fp2 + while printing reductions in multi-rule case. + +1994-01-02 Richard Stallman + + * Makefile.in (LDFLAGS): Make it empty by default. + (bison): Use CFLAGS. + +1993-11-21 Richard Stallman + + * src/bison.simple (YYLEX): Take notice of YYLEX_PARAM. + +1993-10-18 Richard Stallman + + * src/bison.simple (YYPARSE_PARAM_DECL): Always define this. + +1993-10-14 Richard Stallman + + * src/bison.simple (yyparse): Support YYPARSE_PARAM. + +1993-09-13 Noah Friedman + + * Makefile.in (check): New target. + +1993-09-10 Richard Stallman + + * src/conflicts.c (alloca): #undef before defining. + + * src/system.h (bcopy): Don't define if already defined. + +1993-09-06 Noah Friedman + + * Version 1.22 released. + + * mkinstalldirs: New file. + + * Makefile.in (dist): Use .gz for extension, not .z. + (DISTFILES): New variable. + (dist): Use it instead of explicit file list. + Try to link each file separately, then copy file if ln fails. + (installdirs): Use mkinstalldirs script. + +1993-07-29 David J. MacKenzie + + * Makefile.in (config.status): Run config.status --recheck, not + configure, to get the right args passed. + +1993-07-24 Richard Stallman + + * src/bison.simple (yyparse): Init yychar1 to avoid warning. + +1993-07-04 Richard Stallman + + * src/bison.simple (yyparse): Don't set yyval when yylen is 0. + +1993-06-26 David J. MacKenzie + + * src/getargs.c (getargs): Exit after printing the version number. + Add --help and -h options. + (usage): New function. + +1993-06-25 Richard Stallman + + * src/getargs.c (longopts): Allow `output' as an alternative. + +1993-06-16 Richard Stallman + + * src/bison.simple (yyparse): Conditionalize the entire call to + yyoverflow, not just two arguments in it. + +1993-06-03 Richard Stallman + + * src/bison.simple [__hpux] (alloca): Don't specify arg types. + +1993-05-07 Noah Friedman + + * Makefile.in (install): Depend on `uninstall' and `installdirs'. + (installdirs): New target. + +1993-04-28 Noah Friedman + + * src/reader.c: Remove declaration of atoi. + +1993-04-23 Noah Friedman + + * src/new.h [!__STDC__] (FREE): Check x != 0. + Make expr to call `free' evaluate to 0. + +1993-04-20 David J. MacKenzie + + * src/files.c [MSDOS]: Use xmalloc, not malloc. + * src/allocate.c (xmalloc): Renamed from mallocate. Remove old + wrapper. + * src/conflicts.c, src/symtab.c, src/files.c, src/LR0.c, + src/new.h: Change callers. + * src/allocate.c (xrealloc): New function. + * src/new.h: Declare it. + * src/lex.c, src/reader.c: Use it. + +1993-04-18 Noah Friedman + + * Version 1.21 released. + + * src/reader.c : Don't declare `realloc'. + + * Makefile.in (bison.s1): use `rm -f' since it's quieter. + (dist): make gzipped tar file. + +1993-04-16 Noah Friedman + + * Makefile.in (Makefile, config.status, configure): New targets. + +1993-04-15 Richard Stallman + + * src/main.c: Don't declare `abort'. + + * src/files.c: Don't declare `exit'. + +1993-04-15 Noah Friedman + + * configure.in: Add AC_CONST. + +1993-04-14 Richard Stallman + + * Makefile.in (all): Depend on bison.s1. + +1993-04-13 Richard Stallman + + * Version 1.20 released. + +1993-03-24 Richard Stallman + + * src/output.c (output_headers): Rename yynerrs if -p. + +1993-03-18 Noah Friedman + + * src/system.h: Don't try to include stdlib.h unless HAVE_STDLIB_H + is defined. + + * configure.in: Check for stdlib.h. + +1993-03-17 Richard Stallman + + * src/bison.simple [__hpux, not __GNUC__]: Declare alloca. + (yyparse): When printing the expected token types for an error, + Avoid negative indexes in yycheck and yytname. + +1993-03-13 Richard Stallman + + * Makefile.in (files.o, .c.o): Put CPPFLAGS and CFLAGS last. + +1993-03-01 Richard Stallman + + * src/bison.simple: Test __sgi like __sparc. + +1993-02-17 Richard Stallman + + * src/conflicts.c (resolve_sr_conflict): Add extra parens in + alloca call. + + * src/bison.simple [__GNUC__] (yyparse): Declare with prototype. + +1993-01-15 Richard Stallman + + * src/conflicts.c (print_reduction): Near end, increment fp2 when + mask recycles. + +1993-01-13 Richard Stallman + + * Makefile.in (bison.s1): New target. Modifies bison.simple. + (install): Install bison.s1, without changing it. + (clean): Delete bison.s1. + +1993-01-04 Richard Stallman + + * src/reader.c (reader): Put Bison version in comment in output + file. + +1992-12-22 Richard Stallman + + * src/files.c (openfiles): Use .output, not .out, for outfile, + regardless of spec_name_prefix. + +1992-12-15 Richard Stallman + + * src/output.c (output_gram): Include yyrhs in the same #if as + yyprhs. + +1992-12-15 Noah Friedman + + * src/output.c (output): output directives checking for + __cplusplus as well as __STDC__ to determine when to define + "const" as an empty token. (Patch from Wolfgang Glunz + ) + +1992-12-08 David J. MacKenzie + + * src/system.h, src/conflicts.c: Replace USG with HAVE_STRING_H + and HAVE_MEMORY_H. + +1992-11-21 David J. MacKenzie + + * Makefile.in: Set and use $(MAKEINFO). + +1992-11-20 Richard Stallman + + * src/files.c (done) [MSDOS]: Delete the tmpdefsfile with the + rest. + +1992-10-08 Richard Stallman + + * Makefile.in (dist): Put configure.bat in the distribution. + +1992-10-01 David J. MacKenzie + + * Makefile.in (install): cd to $(srcdir) before installing info + files. + +1992-09-30 Richard Stallman + + * Makefile.in (files.o): Supply $(DEFS), and $(CPPFLAGS). + +1992-09-25 Richard Stallman + + * Version 1.19 released. + + * src/reader.c (parse_union_decl): Fix ending of C++ comment; + don't lose the char after the newline. + + * configure.bat: New file. + +1992-09-24 Richard Stallman + + * src/conflicts.c: Check for using alloca.h as getopt.c does. + +1992-09-06 Karl Berry + + * src/files.c (openfiles): open `fdefines' after we have assigned + a name to `tmpdefsfile', and only if `definesflag' is set. + (done): only create the real .tab.h file if `definesflag' is set. + * src/reader.c (packsymbols): don't close `fdefines' here. + +1992-09-05 Richard Stallman + + * src/files.c (openfiles): Open fdefines as temp file, like + ftable. + (done): Copy temp defines file to real one, like main output file. + +1992-08-21 Richard Stallman + + * Makefile.in (dist): Don't release mergedir.awk + (install): Use sed, not awk. Don't depend on mergedir.awk. + * mergedir.awk: File effectively deleted. + +1992-07-29 Richard Stallman + + * src/bison.simple: Test __sparc along with __sparc__. + +1992-07-11 Richard Stallman + + * src/lex.c (skip_white_space): Count \n just once at end of c++ + comment. + +1992-06-26 Richard Stallman + + * src/bison.simple: Comment fix; #line command updated. + +1992-06-24 Richard Stallman + + * Makefile.in (install): Specify full new file name for the + executable. + +1992-06-22 Richard Stallman + + * Makefile.in (dist): Include bison.rnh in distribution. + +Sun Jun 21 22:42:13 1992 Eric Youngdale + + Clean up rough edges in VMS port of bison, add support for + remaining command line options. + + * src/bison.cld: Add /version, /yacc, /file_prefix, and + /name_prefix switches. + + * src/build.com: General cleanup: add logic to automatically sense + which C compiler is present; add code to cwd to the directory that + contains bison sources; do not define XPFILE, XPFILE1 + (correct defaults are applied in src/file.c). + + * src/files.c: Append _tab, not .tab when using /file_prefix under + VMS. + + * src/system.h: Include string.h instead of strings.h (a la USG). + + * src/vmsgetargs.c: Add support for all switches added to + src/bison.cld. + +1992-06-21 Richard Stallman + + * Makefile.in (install): Always specify new file name for install. + Redirect awk output to temp file and install that. + +1992-05-27 Richard Stallman + + * src/bison.simple (yyparse): Make yybackup and yyerrlab1 always + be used. + +1992-05-22 Richard Stallman + + * Makefile.in (dist): Depend on bison.info + (bison.info): Delete spurious <. + +1992-05-17 Richard Stallman + + * Makefile.in (.c.o): New rule. Use $(DEFS) directly. + (CFLAGS): Use just -g by default. + (CDEBUG): Variable deleted. + +1992-05-07 Richard Stallman + + * src/reader.c (copy_guard): Fix typo skipping comment. + +1992-05-04 Richard Stallman + + * Version 1.18. + + * src/getargs.c (getargs): Change '0' to 0 in case for long + options. + +1992-04-19 Richard Stallman + + * src/reader.c (packsymbols): Handle -p when declaring yylval. + +1992-04-18 Richard Stallman + + * src/output.c (output_gram): Output #endif properly at end of + decl. + +1992-03-30 Richard Stallman + + * Version 1.17. + + * Makefile.in (clean): Don't delete configuration files or TAGS. + (distclean): New target; do delete those. + +1992-03-28 Richard Stallman + + * src/output.c (output_gram): Conditionalize yyprhs on YYDEBUG. + + * src/LR0.c (augment_automaton): If copying sp->shifts to insert + new shift, handle case of inserting at end. + +1992-03-21 Richard Stallman + + * src/lex.c (skip_white_space): Handle C++ comments. + * src/reader.c (copy_definition, parse_union_decl, copy_guard): + (copy_action): Likewise. + +1992-03-08 Richard Stallman + + * src/bison.simple (YYPOPSTACK): Fix typo. + +1992-02-29 Richard Stallman + + * Makefile.in (install): Install bison.info* files one by one. + +1992-02-28 David J. MacKenzie + + * src/bison.1: Document long options as starting with `--', not + `+'. + +1992-02-01 Richard Stallman + + * src/getargs.c (getargs): Accept value 0 from getopt_long. + +1992-01-30 Richard Stallman + + * Makefile.in (mostlyclean): Renamed from `clean'. + (clean): Renamed from 'distclean'. Dep on mostlyclean, not + realclean. + (realclean): Dep on clean. + +1992-01-27 Richard Stallman + + * src/bison.simple: Use malloc, not xmalloc, and handle failure + explicitly. + +1992-01-26 Richard Stallman + + * src/conflicts.c (total_conflicts): Delete unused arg to fprintf. + +1992-01-21 Richard Stallman + + * Version 1.16. + +1992-01-06 Richard Stallman + + * Makefile (distclean): Depend on clean, not realclean. Don't rm + TAGS. + (realclean): rm TAGS here. + + * src/symtab.c (free_symtab): Don't free the type names. + +1991-12-29 Richard Stallman + + * src/machine.h: MSDOS has 32-bit ints if __GO32__. + +1991-12-25 David J. MacKenzie + + * src/bison.simple [_AIX]: Indent `#pragma alloca', so old C + compilers don't choke on it. + +1991-12-23 Richard Stallman + + * src/getopt.c, src/getopt1.c, src/getopt.h: Link them to standard + source location. + * src/alloca.c: Likewise. + * Makefile.in (dist): Copy those files from current dir. + + * src/getargs.c: Update usage message. + + * src/LR0.c (augment_automaton): Put new shift in proper order. + +1991-12-20 Richard Stallman + + * src/conflicts.c: Use memcpy if ANSI C library. + + * src/closure.c (set_fderives): Delete redundant assignment to + vrow. + + * src/closure.c (print_firsts): Fix bounds and offset checking + tags. + + * src/closure.c (tags): Declare just once at start of file. + + * src/LR0.c (allocate_itemsets): Eliminate unused var max. + (augment_automaton): Test sp is non-null. + + * src/lalr.c (initialize_LA): Make the vectors at least 1 element + long. + + * src/reader.c (readgram): Remove separate YYSTYPE default for + MSDOS. + +1991-12-18 Richard Stallman + + * src/print.c (print_grammar): Don't print disabled rules. + +1991-12-17 Richard Stallman + + * src/lex.c (lex): Parse hex escapes properly. + Handle \v when filling token_buffer. + + * src/lex.c: Include new.h. + (token_buffer): Change to a pointer. + (init_lex): Allocate initial buffer. + (grow_token_buffer): New function. + (lex, parse_percent_token): Use that. + + * src/reader.c (read_declarations): Call open_extra_files just + once. + (parse_token_decl): Don't free previous typename value. Don't + increment nvars if symbol is already a nonterminal. + (parse_union_decl): Catch unmatched close-brace. + (parse_expect_decl): Null-terminate buffer. + (copy_guard): Set brace_flag for {, not for }. + + * src/reader.c: Fix %% in calls to fatal. + + * src/reader.c (token_buffer): Just one extern decl, at top level. + Declare as pointer. + + * src/symtab.c (free_symtab): Free type_name fields. Free symtab + itself. + +1991-11-25 Richard Stallman + + * src/bison.simple: Handle alloca for AIX. + + * Makefile.in (mandir): Compute default using manext. + +1991-11-02 David J. MacKenzie + + * Update all files to GPL version 2. + +1991-09-06 Richard Stallman + + * src/bison.simple (__yy_bcopy): Use builtin if GCC version 2. + +1991-08-26 Richard Stallman + + * src/reader.c (parse_assoc_decl): Error if same symbol gets two + precs. + +1991-08-26 David J. MacKenzie + + * Makefile.in, configure: Only put $< in Makefile if using VPATH, + because older makes don't understand it. + +1991-08-23 David J. MacKenzie + + * src/conflicts.c [_AIX]: #pragma alloca. + * src/reduce.c: Don't define TRUE and FALSE if already defined. + +1991-08-12 Richard Stallman + + * Makefile.in: Add deps on system.h. + (install): Add some deps. + +1991-08-02 David J. MacKenzie + + * Makefile.in (dist): Include texinfo.tex. + + * configure: Create config.status. Remove it and Makefile if + interrupted while creating them. + +1991-08-01 David J. MacKenzie + + * configure: Check for +srcdir etc. arg and look for + Makefile.in in that directory. Set VPATH if srcdir is not `.'. + * Makefile.in (prefix): Renamed from DESTDIR. + +1991-07-31 Richard Stallman + + * src/print.c (print_grammar): Make output prettier. Break lines. + +1991-07-30 Richard Stallman + + * src/print.c (print_grammar): New function. + (verbose): Call it instead of printing token names here. + +1991-07-22 Richard Stallman + + * src/vmsgetargs.c (spec_name_prefix, spec_file_prefix): Define + variables. + +1991-07-10 David J. MacKenzie + + * configure, Makefile.in: $(INSTALLPROG) -> $(INSTALL), + $(INSTALLTEXT) -> $(INSTALLDATA). + +1991-07-09 David J. MacKenzie + + * src/bison.simple: Don't include malloc.h if __TURBOC__. + +1991-07-06 David J. MacKenzie + + * Replace Makefile with configure and Makefile.in. Update README + with current compilation instructions. + +1991-07-01 Richard Stallman + + * src/reader.c (reader): Make the output define YYBISON. + +1991-06-20 David J. MacKenzie + + * Makefile (MANDIR, MANEXT): Install man page in + /usr/local/man/man1/bison.1 by default, instead of + /usr/man/manl/bison.l, for consistency with other GNU programs. + * Makefile: Rename BINDIR et al. to lowercase to conform to + GNU coding standards. + (install): Make man page non-executable. + +1991-05-31 Richard Stallman + + * Makefile (bison.info): New target. + (realclean): New target. + +1991-05-02 Richard Stallman + + * src/bison.simple: Use YYPRINT to print a token, if it's defined. + +1991-04-29 Richard Stallman + + * src/lalr.c (transpose): Rename R to R_arg. + (initialize_LA): Avoid shadowing variable j. + + * src/reader.c (packsymbols): Avoid shadowing variable i. + + * src/files.c: Declare exit and perror. + + * src/machine.h: Define MAXSHORT and MINSHORT for the eta-10. + +1991-04-02 Richard Stallman + + * src/allocate.c (mallocate): Always allocate at least one byte. + +1991-03-19 Richard Stallman + + * Makefile (dist): Put alloca.c into distribution. + +1991-03-06 Richard Stallman + + * src/print.c (print_actions): Nicer output for final states. + +1991-02-21 Richard Stallman + + * src/output.c (output_rule_data): Break lines in yytline based on + hpos. + +1991-02-07 Richard Stallman + + * src/bison.simple (yyparse): Move decl of yylsa before use. + +1991-01-15 Richard Stallman + + * Version 1.14. + + * src/output.c (output_rule_data): Handle NULL in tags[i]. + +1991-01-11 Richard Stallman + + * src/bison.simple: On MSDOS, include malloc.h. + +1990-12-29 David J. MacKenzie + + * src/files.c: Use `mallocate' instead of `xmalloc' so no extra + decl is needed. + +1990-12-19 Richard Stallman + + * src/reader.c (readgram): Alternate YYSTYPE defn for MSDOS. + * src/files.c [MSDOS]: Declare xmalloc. + +1990-12-13 Richard Stallman + + * src/output.c (output_rule_data): Put all symbols in yytname. + + * src/bison.simple (yyparse): Delete extra fprintf arg + when printing a result of reduction. + +1990-12-10 Richard Stallman + + * src/reader.c (packsymbols): Don't declare yylval if pure_parser. + +1990-10-30 Richard Stallman + + * Version 1.12. + + * src/LR0.c (augment_automaton): Fix bugs adding sp2 to chain of + shifts. + +1990-10-23 Richard Stallman + + * src/bison.simple: Don't define alloca if already defined. + +1990-10-21 Richard Stallman + + * src/getopt.c: On VMS, use string.h. + + * src/main.c (main): Return type int. + +1990-09-10 Richard Stallman + + * src/output.c (output_headers): Output macro defs for -p. + + * src/reader.c (readgram): Handle consecutive actions. + + * src/getargs.c (getargs): Rename -a to -p. + * src/files.c (openfiles): Change names used for -b. + +1990-08-27 Richard Stallman + + * src/reduce.c (reduce_grammar_tables): Don't map rlhs of disabled + rule. + +1990-08-26 Richard Stallman + + * src/closure.c (print_firsts, print_fderives): Use BITISSET to + test bits. + +1990-08-23 Richard Stallman + + * src/closure.c (print_firsts): vrowsize => varsetsize. + (print_fderives): rrowsize => rulesetsize. + +1990-08-10 Richard Stallman + + * src/bison.simple (alloca): Don't define if already defined. + (__yy_bcopy): Alternate definition for C++. + +1990-07-11 David J. MacKenzie + + * src/getargs.c (getargs): Mention +yacc in usage message. + +1990-07-10 Richard Stallman + + * src/reader.c (parse_token_decl, copy_action): Set + value_components_used if appropriate. + (readgram): Inhibit output of YYSTYPE definition in that case. + +1990-06-30 Richard Stallman + + * src/output.c (output_parser): Define YYPURE if pure, and not + otherwise. Don't define YYIMPURE. + * src/bison.simple: Adjust conditionals accordingly. + * src/bison.simple (YYLEX): If locations not in use, don't pass + &yylloc. + +1990-06-28 Richard Stallman + + * src/getargs.c (longopts): Add `yacc'. + +1990-06-28 David J. MacKenzie + + * src/getargs.c (getargs): Add long options. + * Makefile: Link with getopt1.o and add getopt1.c and getopt.h to + dist. + + * Move version number and description back into version.c from + Makefile and getargs.c. + * Makefile (dist): Extract version number from version.c. + +1990-06-26 Richard Stallman + + * src/output.c (output): Always call output_gram. + * src/bison.simple (yyparse): Print rhs and lhs symbols of + reduction rule. + +1990-06-21 David J. MacKenzie + + * src/main.c: New global var `program_name' to hold argv[0] for + error messages. + * src/allocate.c, src/files.c, src/getargs.c, src/reader.c: Use + `program_name' in messages instead of hardcoded "bison". + +1990-06-20 David J. MacKenzie + + * Makefile: Specify Bison version here. Add rule to pass it to + version.c. Encode it in distribution directory and tar file names. + * src/version.c: Use version number from Makefile. + * src/getargs.c (getargs): Print additional text that used to be + part of version_string in version.c. Use -V instead of -version + to print Bison version info. Print a usage message and exit if + given an invalid option. + +1990-06-19 Richard Stallman + + * src/bison.simple: Fix a #line. + + * Makefile (INSTALL): New parameter. + (install): Use that. + (CFLAGS): Move definition to top. + +1990-06-17 Richard Stallman + + * src/reader.c (parse_type_decl): Ignore semicolon. + Remove excess % from error messages. + +1990-06-16 Richard Stallman + + * Version 1.11. + + * Makefile (install): Ensure installed files readable. + +Tue Jun 12 12:50:56 EDT 1990 Jay Fenlason + + * src/getargs.c: Declare spec_file_prefix + + * src/lex.c (lex): \a is '\007' instead of '007' + + * src/reader.c: include machine.h + + * src/files.h: Declare extern spec_name_prefix. + + Trivial patch from Thorsten Ohl + +1990-05-31 Richard Stallman + + * Version 1.10. + + * src/bison.simple (YYBACKUP, YYRECOVERING): New macros. + (YYINITDEPTH): This is what used to be YYMAXDEPTH. + (YYMAXDEPTH): This is what used to be YYMAXLIMIT. + If the value is 0, use the default instead. + (yyparse): Return 2 on stack overflow. + +1990-05-30 Richard Stallman + + * src/bison.simple (YYERROR): Jump to new label; don't print error + message. + (yyparse): Define label yyerrlab1. + +1990-05-16 Richard Stallman + + * src/files.c (openfiles): Support -b. + * src/getargs.c (getargs): Likewise. + + * src/reader.c (readgram): Error if too many symbols. + + * src/lex.c (lex): Handle \a. Make error msgs more reliable. + * src/reader.c (read_declarations): Make error msgs more reliable. + +1990-05-13 Richard Stallman + + * Version 1.09. + + * src/reduce.c (reduce_grammar_tables): Fix backward test. + +1990-05-12 Richard Stallman + + * Makefile (bison-dist.*): Rename targets and files to bison.*. + (bison.tar): Make tar file to unpack into subdirectory named `bison'. + +1990-04-30 Richard Stallman + + * src/reduce.c (reduce_grammar_tables): Set rlhs to -1 for useless + rules. + * src/nullable.c (set_nullable): Ignore those rules. + * src/derives.c (set_derives): Likewise. + +1990-04-23 Richard Stallman + + * src/bison.simple (yyparse): Mention rule number as well as line + number. + +1990-03-29 Richard Stallman + + * src/bison.simple (__yy_bcopy): New function. + (yyparse): Use that, not bcopy. + +1990-03-28 Richard Stallman + + * src/print.c (print_actions): Don't alter i and j spuriously when + errp==0. + +1990-03-12 Jim Kingdon + + * src/bison.simple [__GNUC__]: Use builtin_alloca. + +1990-03-07 Richard Stallman + + * Makefile (install): Use mergedir.awk to process bison.simple + for installation. + + * src/bison.simple (yyparse): New feature to include possible valid + tokens in parse error message. + +1990-03-03 Richard Stallman + + * Version 1.08. + +1990-02-26 Jim Kingdon + + * src/print.c (print_actions) + * src/conflicts.c (print_reductions): Change "shift %d" to + "shift, and go to state %d" and "reduce %d" to "reduce using rule %d" + and "goto %d" to "go to state %d". + * src/print.c (print_core): Change "(%d)" to "(rule %d)". + +1990-02-20 Jay Fenlason + + * src/bison.simple: Comment out unused yyresume: label. + +1990-02-09 Jay Fenlason + + * src/bison.simple : surround all declarations and (remaining) + uses of yyls* and yylloc with #ifdef YYLSP_NEEDED This will + significantly cut down on stack usage, and gets rid of + unused-variable msgs from GCC. + +1990-01-31 Richard Stallman + + * src/files.c (done) [VMS]: Don't delete files that weren't used. + [VMS]: Let user override XPFILE and XPFILE1. + +1990-01-03 Richard Stallman + + * Version 1.07. + +1989-12-16 Richard Stallman + + * src/gram.c (dummy): New function. + + * src/reader.c (readgram): Detect error if two consec actions. + +1989-11-15 Richard Stallman + + * src/reduce.c (reduce_grammar_tables): Update rline like other + tables. + + * Makefile (install): Install the man page. + +1989-11-11 Richard Stallman + + * src/output.c (output_rule_data): Write #if YYDEBUG around yyrline. + +1989-10-18 Richard Stallman + + * Version 1.06. + + * src/vmsgetargs.c (getargs): Downcase specified output file name. + +1989-10-13 Richard Stallman + + * src/reader.c (readgram): Warn if there is no default to use for + $$ and one is needed. + +1989-09-29 Richard Stallman + + * Version 1.05. + + * src/vmsgetargs.h (getargs): Process outfile option. + +1989-09-08 Richard Stallman + + * Version 1.04. + + * src/reader.c (parse_union_decl): Count newlines even in + comments. + +1989-09-06 Richard Stallman + + * src/files.c (openfiles): short_base_length was always == + base_length. + +1989-08-24 Richard Stallman + + * Version 1.03. + + * src/files.c (openfiles): Write output into same dir as input, by + default. + +1989-08-23 Jay Fenlason + + * Makefile: Include system.h in bison-dist.tar + +1989-08-15 Richard Stallman + + * version 1.03. + + * src/reader.c (reader): Output LTYPESTR to fdefines + only after reading the grammar. + +1989-08-06 Richard Stallman + + * src/reader.c (read_declarations): Put space before comment + to avoid bug in Green Hills C compiler. + +1989-06-19 Richard Stallman + + * src/allocate.c (xmalloc): New function. + +1989-06-16 Richard Stallman + + * src/build.com: Compile and link reduce.c. + +1989-06-09 Richard Stallman + + * src/reduce.c (reduce_grammar_tables): Adjust start_symbol when + #s change. + +1989-05-27 Richard Stallman + + * src/reader.c (copy_definition, copy_guard): Don't object to + \-newline inside strings. + +1989-05-22 Richard Stallman + + * src/files.c (openfiles): Alternate file names for MSDOS. + (open_extra_files): Likewise. + (done): On MSDOS, unlink temp files here, not in openfiles. + + * src/machine.h (BITS_PER_WORD): 16 on MSDOS. + (MAXTABLE): Now defined in this file. + + * src/system.h: New file includes system-dependent headers. + All relevant .c files include it. + +1989-04-27 Richard Stallman + + * src/version.c: Version 1.01. + +1989-04-18 Randall Smith + + * src/conflicts.c (total_conflicts): Fixed typo in yacc style + output; mention conflicts if > 0. + +1989-04-15 Richard Stallman + + * src/reader.c (packsymbols): Start new symbols after 256. + +1989-04-12 Richard Stallman + + * src/reader.c (reader): Always assign code 256 to `error' token. + Always set `translations' to 1 so this code gets handled. + * src/bison.simple (YYERRCODE): Define it. + +1989-04-11 Richard Stallman + + * src/conflicts.c: If GNU C, use builtin alloca. + + * Makefile (install): Delete parser files before copying them. + +1989-03-30 Richard Stallman + + * src/getargs.c (getargs): Turn off checking of name Bison was + invoked by. + + * Makefile (dist): Include ChangeLog in distrib. + +1989-03-23 Jay Fenlason + + * src/LR0.c src/closure.c src/conflicts.c src/derives.c + src/files.c src/getargs.c src/lalr.c src/lex.c src/main.c + src/nullable.c src/output.c src/print.c src/reader.c src/reduce.c + src/symtab.c src/warshall.c: A first pass at getting gcc -Wall to + shut up. Mostly declared functions as void, etc. + + * src/reduce.c moved 'extern int fixed_outfiles;' into print_notices + where it belongs. + +1989-03-01 Randall Smith + + * src/types.h, src/symtab.h, src/state.h, src/new.h, + src/machine.h, src/lex.h, src/gram.h, src/files.h, src/closure.c, + src/vmsgetargs.c, src/warshall.c, src/symtab.c, src/reduce.c, + src/reader.c, src/print.c, src/output.c, src/nullable.c, + src/main.c, src/lex.c, src/lalr.c, src/gram.c, src/getargs.c, + src/files.c, src/derives.c, src/conflicts.c, src/allocate.c, + src/LR0.c, Makefile, src/bison.simple: Changed copyright notices + to be in accord with the new General Public License. + * COPYING: Made a link to the new copying file. + +1989-02-22 Richard Stallman + + * src/new.h (FREE): Alternate definition for __STDC__ avoids error + if `free' returns void. + +1989-02-21 Richard Stallman + + * src/reader.c (read_declarations): Double a `%' in a format string. + (copy_definition, parse_start_decl, parse_token_decl): Likewise. + (parse_type_decl, parse_union_decl, copy_guard, readgram, get_type). + (copy_action): change a `fatal' to `fatals'. + + * src/lalr.c (map_goto): Initial high-end of binary search was off + by 1. + +1989-02-18 Richard Stallman + + * src/bison.simple [sparc]: Include alloca.h. + +1989-02-15 Richard Stallman + + * src/reader.c (packsymbols): Write decl of yylval into .tab.h file. + +1989-01-28 Richard Stallman + + * src/bison.simple: Avoid comments on `#line' lines. + + * src/reader.c (LTYPESTR): Rearrange to avoid whitespace after + \-newline. + +1989-01-09 Richard Stallman + + * src/conflicts.c (total_conflicts): if -y, use output syntax + POSIX wants. + * src/reduce.c (print_notices): likewise. + + * src/lex.c (lex): Handle \v, and \x hex escapes. + + * src/reader.c (reader): Merge output_ltype into here. Don't + output YYLTYPE definition to .tab.h file unless the @ construct is + used. + + * src/bison.simple: Define YYERROR, YYABORT, YYACCEPT here. + * src/reader.c (output_ltype): Don't output them here. + + * src/bison.simple: YYDEBUG now should be 0 or 1. + * src/output.c (output): For YYDEBUG, output conditional to define it + only if not previously defined. + +1989-01-02 Richard Stallman + + * src/bison.simple (yyparse) [YYPURE]: Add local yynerrs. + (yydebug): Declare global, but don't initialize, regardless of + YYPURE. + (yyparse): Don't declare yydebug here. + +1988-12-22 Richard Stallman + + * src/reduce.c (print_notices): Typo in message. + +1988-12-11 Richard Stallman + + * src/output.c (pack_table): Free only nonzero the elts of froms & + tos. + +1988-12-08 Richard Stallman + + * src/gram.c (rprecsym): New vector indicates the %prec symbol for + a rule. + * src/reader.c (packgram): Allocate it and fill it in. + * src/reduce.c (inaccessable_symbols): Use it to set V1. + * src/reduce.c (print_results): Don't complain about useless token + if it's in V1. + +1988-12-05 Richard Stallman + + * src/machine.h (RESETBIT, BITISSET): New macros. + (SETBIT, WORDSIZE): Change to use BITS_PER_WORD. + + * src/reduce.c: New file, by David Bakin. Reduces the grammar. + * Makefile: Compile it, link it, put it in dist. + + * src/main.c (main): Call reduce_grammar (in reduce.c). + +1988-11-17 Richard Stallman + + * src/conflicts.c: Don't declare alloca if including alloca.h. + + * src/bison.cld: Define qualifiers `nolines', `debug'. + * src/vmsgetargs.c (getargs): Handle them. + + * src/output.c (output_program): Notice `nolinesflag'. + + * src/output.c (output_parser): Simplify logic for -l and #line. + Avoid writing EOF char into output. + +1988-10-12 Richard Stallman + + * Implement `-l' option. + * src/getopt.c: Set flag `nolinesflag'. + * src/reader.c (copy_definition, parse_union_decl, copy_guard, + copy_action) Obey that flag; don't generate #line. + * src/output.c (output_parser): Discard #line's when copying the + parser. + +1988-09-12 Richard Stallman + + * src/reader.c (copy_guard): Fix brace-counting for + brace-surrounded guard. + +1988-09-08 Richard Stallman + + * src/bison.simple: Correct number in #line command. + (yyparse): Call YYABORT instead of YYERROR, due to last change in + output_ltype. + +1988-09-05 Richard Stallman + + * Makefile: New variable LIBS. Alternatives for USG. + * src/conflicts.c [USG]: Define bcopy. + * src/symtab.c [USG]: Include string.h instead of strings.h. + + * src/conflicts.c [sparc]: Include alloca.h. + +1988-08-02 Richard Stallman + + * src/reader.c (parse_token_decl): Ignore commas. + +1988-06-25 Richard Stallman + + * src/reader.c (output_ltype): Make YYERROR yacc-compatible (like + YYFAIL). + +1988-06-24 Richard Stallman + + * src/getargs.c (getargs): -t sets debugflag. + Eliminate upper case duplicate options. + * src/output.c (output): If debugflag, output `#define YYDEBUG'. + +1988-05-26 Richard Stallman + + * src/allocate.c (mallocate): New name for `allocate' (which loses + in VMS). Calls changed in LR0.c, conflicts.c, symtab.c, new.h. + + * src/getargs.c (getargs): If argv[0] is "yacc", set fixed_outfiles. + +1988-05-17 Richard Stallman + + * src/conflicts.c: Declare alloca. + * src/reader.c: Declare realloc. + * src/warshall.c (TC): Fix one arithmetic op that was omitted last + time. + +1988-05-05 Richard Stallman + + * src/bison.simple: Conditionalize most refs to yylsp on + YYLSP_NEEDED. + * src/reader.c (copy_guard, copy_action): Notice if `@' is used. + (reader): If it was, output `#define YYLSP_NEEDED'. + +1988-04-18 Richard Stallman + + * src/bison.simple: New variable yynerr counts calls to yyerror. + + * src/lex.c (lex, case '='): Update lineno when skipping a newline. + + * src/reader.c (parse_expect_decl): ungetc the char that ends the + number; don't read any further. This handles multi-line comments + right and avoids incorrect lineno. + + * src/reader.c: Delete duplicate decl of symval. + + * src/warshall.c (RTC, TC): Cast ptrs to char *, not unsigned, for + arith. diff --git a/src/apps/bin/bison/README b/src/apps/bin/bison/README new file mode 100644 index 0000000000..d8b45ccf04 --- /dev/null +++ b/src/apps/bin/bison/README @@ -0,0 +1,49 @@ +This directory contains the Bison parser generator. + +See the file INSTALL for generic compilation and installation instructions. +See the file doc/FAQ for frequently asked questions. + +Bison requires GNU m4 1.4 (or later, if a later version of GNU m4 +becomes available). The following m4 patches are recommended: + +http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=92629 +http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=211477 + +Older versions of Sun Forte Developer 6 update 2 have a compiler bug +that cause "make check" to fail with a "Encounter BINCL entry" +diagnostic. To fix the bug, update to the latest set of Solaris and +Forte patches recommended by Sun. + +VMS and MS-DOS builds are probably broken right now. If you are able +to build Bison on either platform and you need to make changes to do +so, please submit those changes as a bug report. On VMS, you will +probably have to create Makefile from Makefile.in by hand. Remember +to do `SET COMMAND BISON' to install the data in `BISON.CLD'. + +Send bug reports to . Please include the version +number from `bison --version', and a complete, self-contained test +case in each bug report. + +If you have questions about using Bison which the documentation does +not answer, send mail to . + +----- + +Copyright (C) 1992, 1998, 1999, 2003, 2004 Free Software Foundation, Inc. + +This file is part of Bison, the GNU Compiler Compiler. + +Bison is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +Bison is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with autoconf; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. diff --git a/src/apps/bin/bison/README-alpha b/src/apps/bin/bison/README-alpha new file mode 100644 index 0000000000..e076d73b84 --- /dev/null +++ b/src/apps/bin/bison/README-alpha @@ -0,0 +1,38 @@ +-*- text -*- + +This is a test release of this package. Using it more or less +implicitly signs you up to help us find whatever problems you report. + +The documentation still needs more work. Suggestions welcome. +Patches even more welcome. + +Please send comments and problem reports about this test release to +bug-bison@gnu.org. This program will get better only if you report +the problems you encounter. + +Please, *do not package this*, *do not distribute it* widely, it is +not ready for full scale use. Because it is not fully functional, if +you distribute this package, we will be buried under bug reports from +panicked users. We don't have time to spend on this, and nor do the +users. + +----- + +Copyright (C) 2002 Free Software Foundation, Inc. + +This file is part of GNU Bison. + +GNU Bison is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Bison is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Bison; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. diff --git a/src/apps/bin/bison/REFERENCES b/src/apps/bin/bison/REFERENCES new file mode 100644 index 0000000000..b02eb18c52 --- /dev/null +++ b/src/apps/bin/bison/REFERENCES @@ -0,0 +1,30 @@ +From phr Tue Jul 8 10:36:19 1986 +Date: Tue, 8 Jul 86 00:52:24 EDT +From: phr (Paul Rubin) +To: riferguson%watmath.waterloo.edu@CSNET-RELAY.ARPA, tower +Subject: Re: Bison documentation? + +The main difference between Bison and Yacc that I know of is that +Bison supports the @N construction, which gives you access to +the starting and ending line number and character number associated +with any of the symbols in the current rule. + +Also, Bison supports the command `%expect N' which says not to mention +the conflicts if there are N shift/reduce conflicts and no reduce/reduce +conflicts. + +The differences in the algorithms stem mainly from the horrible +kludges that Johnson had to perpetrate to make Yacc fit in a PDP-11. + +Also, Bison uses a faster but less space-efficient encoding for the +parse tables (see Corbett's PhD thesis from Berkeley, "Static +Semantics in Compiler Error Recovery", June 1985, Report No. UCB/CSD +85/251), and more modern technique for generating the lookahead sets. +(See "Efficient Construction of LALR(1) Lookahead Sets" by F. DeRemer +and A. Pennello, in ACM TOPLS Vol 4 No 4, October 1982. Their +technique is the standard one now.) + + paul rubin + free software foundation + + diff --git a/src/apps/bin/bison/THANKS b/src/apps/bin/bison/THANKS new file mode 100644 index 0000000000..cb6025c823 --- /dev/null +++ b/src/apps/bin/bison/THANKS @@ -0,0 +1,74 @@ +Bison was originally written by Robert Corbett. It would not be what +it is today without the invaluable help of these people: + +Airy Andre Airy.Andre@edf.fr +Akim Demaille akim@freefriends.org +Albert Chin-A-Young china@thewrittenword.com +Alexander Belopolsky alexb@rentec.com +Andreas Schwab schwab@suse.de +Andrew Suffield asuffield@users.sourceforge.net +Arnold Robbins arnold@skeeve.com +Art Haas ahaas@neosoft.com +Benoit Perrot benoit.perrot@epita.fr +Bert Deknuydt Bert.Deknuydt@esat.kuleuven.ac.be +Bruce Lilly blilly@erols.com +Bruno Haible bruno@clisp.org +Charles-Henri de Boysson de-boy_c@epita.fr +Cris Bailiff c.bailiff+bison@awayweb.com +Cris van Pelt cris@amf03054.office.wxs.nl +Daniel Hagerty hag@gnu.org +David J. MacKenzie djm@gnu.org +Dick Streefland dick.streefland@altium.nl +Enrico Scholz enrico.scholz@informatik.tu-chemnitz.de +Evgeny Stambulchik fnevgeny@plasma-gate.weizmann.ac.il +Fabrice Bauzac noon@cote-dazur.com +Florian Krohm florian@edamail.fishkill.ibm.com +H. Merijn Brand h.m.brand@hccnet.nl +Hans Aberg haberg@matematik.su.se +Jan Nieuwenhuizen janneke@gnu.org +Jesse Thilo jthilo@gnu.org +Jim Kent jkent@arch.sel.sony.com +Jim Meyering jim@meyering.net +Juan Manuel Guerrero ST001906@HRZ1.HRZ.TU-Darmstadt.De +Kees Zeelenberg kzlg@users.sourceforge.net +Keith Browne kbrowne@legato.com +Laurent Mascherpa laurent.mascherpa@epita.fr +Magnus Fromreide magfr@lysator.liu.se +Marc Autret autret_m@epita.fr +Martin Mokrejs mmokrejs@natur.cuni.cz +Matt Kraai kraai@alumni.cmu.edu +Matt Rosing rosing@peakfive.com +Michael Hayes m.hayes@elec.canterbury.ac.nz +Mike Castle dalgoda@ix.netcom.com +Neil Booth NeilB@earthling.net +Nelson H. F. Beebe beebe@math.utah.edu +Nicolas Burrus nicolas.burrus@epita.fr +Nicolas Tisserand nicolas.tisserand@epita.fr +Noah Friedman friedman@gnu.org +Pascal Bart pascal.bart@epita.fr +Paul Eggert eggert@twinsun.com +Paul Hilfinger Hilfinger@CS.Berkeley.EDU +Per Allansson per@appgate.com +Peter Hamorsky hamo@upjs.sk +Piotr Gackiewicz gacek@intertel.com.pl +Quoc Peyrot chojin@lrde.epita.fr +R Blake blakers@mac.com +Raja R Harinath harinath@cs.umn.edu +Richard Stallman rms@gnu.org +Robert Anisko anisko_r@epita.fr +Shura debil_urod@ngs.ru +Tim Josling tej@melbpc.org.au +Tim Van Holder tim.van.holder@pandora.be +Tom Lane tgl@sss.pgh.pa.us +Tom Tromey tromey@cygnus.com +Wayne Green wayne@infosavvy.com +Wolfram Wagner ww@mpi-sb.mpg.de +Wwp subscript@free.fr +Zack Weinberg zack@codesourcery.com + +Many people are not named here because we lost track of them. We +thank them! Please, help us keeping this list up to date. + +Local Variables: +mode: text +End: diff --git a/src/apps/bin/bison/TODO b/src/apps/bin/bison/TODO new file mode 100644 index 0000000000..a300524021 --- /dev/null +++ b/src/apps/bin/bison/TODO @@ -0,0 +1,357 @@ +-*- outline -*- + +* Header guards + +From Franc,ois: should we keep the directory part in the CPP guard? + + +* Yacc.c: CPP Macros + +Do some people use YYPURE, YYLSP_NEEDED like we do in the test suite? +They should not: it is not documented. But if they need to, let's +find something clean (not like YYLSP_NEEDED...). + + +* URGENT: Documenting C++ output +Write a first documentation for C++ output. + + +* Documentation +Before releasing, make sure the documentation ("Understanding your +parser") refers to the current `output' format. + + +* GLR & C++ +Currently, the GLR parser cannot compile with a C++ compiler. + + +* Report + +** GLR +How would Paul like to display the conflicted actions? In particular, +what when two reductions are possible on a given lookahead, but one is +part of $default. Should we make the two reductions explicit, or just +keep $default? See the following point. + +** Disabled Reductions +See `tests/conflicts.at (Defaulted Conflicted Reduction)', and decide +what we want to do. + +** Documentation +Extend with error productions. The hard part will probably be finding +the right rule so that a single state does not exhibit too many yet +undocumented ``features''. Maybe an empty action ought to be +presented too. Shall we try to make a single grammar with all these +features, or should we have several very small grammars? + +** --report=conflict-path +Provide better assistance for understanding the conflicts by providing +a sample text exhibiting the (LALR) ambiguity. See the paper from +DeRemer and Penello: they already provide the algorithm. + + +* Extensions + +** %destructor +I think we should document it as experimental, and allow its use in +the next releases. But we also need to port it to GLR. What about +lalr1.cc? Well, read what Hans reported, maybe we don't want +%detructor. On the other hand, there is no reason not to provide it: +users can avoid its use. + +** $foo +Have a look at the Lemon parser generator: instead of $1, $2 etc. they +can name the values. This is much more pleasant. For instance: + + exp (res): exp (a) '+' exp (b) { $res = $a + $b; }; + +I love this. I have been bitten too often by the removal of the +symbol, and forgetting to shift all the $n to $n-1. If you are +unlucky, it compiles... + +** $-1 +We should find a means to provide an access to values deep in the +stack. For instance, instead of + + baz: qux { $$ = $-1 + $0 + $1; } + +we should be able to have: + + foo($foo) bar($bar) baz($bar): qux($qux) { $baz = $foo + $bar + $qux; } + +Or something like this. + +** yysymprint interface +It should be improved, in particular when using Bison features such as +locations, and YYPARSE_PARAMS. For the time being, it is almost +recommended to yyprint to steal internal variables... + +** Several %unions +I think this is a pleasant (but useless currently) feature, but in the +future, I want a means to %include other bits of grammars, and _then_ +it will be important for the various bits to define their needs in +%union. + +When implementing multiple-%union support, bare the following in mind: + +- when --yacc, this must be flagged as an error. Don't make it fatal + though. + +- The #line must now appear *inside* the definition of yystype. + Something like + + { + #line 12 "foo.y" + int ival; + #line 23 "foo.y" + char *sval; + } + +** %if and the like +It should be possible to have %if/%else/%endif. The implementation is +not clear: should it be lexical or syntactic. Vadim Maslow thinks it +must be in the scanner: we must not parse what is in a switched off +part of %if. Akim Demaille thinks it should be in the parser, so as +to avoid falling into another CPP mistake. + +** -D, --define-muscle NAME=VALUE +To define muscles via cli. Or maybe support directly NAME=VALUE? + +** XML Output +There are couple of available extensions of Bison targeting some XML +output. Some day we should consider including them. One issue is +that they seem to be quite orthogonal to the parsing technique, and +seem to depend mostly on the possibility to have some code triggered +for each reduction. As a matter of fact, such hooks could also be +used to generate the yydebug traces. Some generic scheme probably +exists in there. + +XML output for GNU Bison and gcc + http://www.cs.may.ie/~jpower/Research/bisonXML/ + +XML output for GNU Bison + http://yaxx.sourceforge.net/ + +* Unit rules +Maybe we could expand unit rules, i.e., transform + + exp: arith | bool; + arith: exp '+' exp; + bool: exp '&' exp; + +into + + exp: exp '+' exp | exp '&' exp; + +when there are no actions. This can significantly speed up some +grammars. I can't find the papers. In particular the book `LR +parsing: Theory and Practice' is impossible to find, but according to +`Parsing Techniques: a Practical Guide', it includes information about +this issue. Does anybody have it? + + + +* Documentation + +** History/Bibliography +Some history of Bison and some bibliography would be most welcome. +Are there any Texinfo standards for bibliography? + + + +* Java, Fortran, etc. + + +** Java + +There are a couple of proposed outputs: + +- BYACC/J + which is based on Byacc. + + +- Bison Java + which is based on Bison. + + +Sebastien Serrurier (serrur_s@epita.fr) is working on this: he is +expected to contact the authors, design the output, and implement it +into Bison. + + +* Coding system independence +Paul notes: + + Currently Bison assumes 8-bit bytes (i.e. that UCHAR_MAX is + 255). It also assumes that the 8-bit character encoding is + the same for the invocation of 'bison' as it is for the + invocation of 'cc', but this is not necessarily true when + people run bison on an ASCII host and then use cc on an EBCDIC + host. I don't think these topics are worth our time + addressing (unless we find a gung-ho volunteer for EBCDIC or + PDP-10 ports :-) but they should probably be documented + somewhere. + + + +* --graph +Show reductions. [] + +* Broken options ? +** %no-parser [] +** %token-table [] +** Skeleton strategy. [] +Must we keep %no-parser? + %token-table? + +* src/print_graph.c +Find the best graph parameters. [] + +* doc/bison.texinfo +** Update +informations about ERROR_VERBOSE. [] +** Add explanations about +skeleton muscles. [] +%skeleton. [] + +* testsuite +** tests/pure-parser.at [] +New tests. + +* BTYacc +See if we can integrate backtracking in Bison. Charles-Henri de +Boysson is working on this, and already has some +results. Vadim Maslow, the maintainer of BTYacc was contacted, and we +stay in touch with him. Adjusting the Bison grammar parser will be +needed to support some extra BTYacc features. This is less urgent. + +** Keeping the conflicted actions +First, analyze the differences between byacc and btyacc (I'm referring +to the executables). Find where the conflicts are preserved. + +** Compare with the GLR tables +See how isomorphic the way BTYacc and the way the GLR adjustments in +Bison are compatible. *As much as possible* one should try to use the +same implementation in the Bison executables. I insist: it should be +very feasible to use the very same conflict tables. + +** Adjust the skeletons +Import the skeletons for C and C++. + +** Improve the skeletons +Have them support yysymprint, yydestruct and so forth. + + +* Precedence + +** Partial order +It is unfortunate that there is a total order for precedence. It +makes it impossible to have modular precedence information. We should +move to partial orders (sounds like series/parallel orders to me). + +This will be possible with a Bison parser for the grammar, as it will +make it much easier to extend the grammar. + +** Correlation b/w precedence and associativity +Also, I fail to understand why we have to assign the same +associativity to operators with the same precedence. For instance, +why can't I decide that the precedence of * and / is the same, but the +latter is nonassoc? + +If there is really no profound motivation, we should find a new syntax +to allow specifying this. + +** RR conflicts +See if we can use precedence between rules to solve RR conflicts. See +what POSIX says. + + +* $undefined +From Hans: +- If the Bison generated parser experiences an undefined number in the +character range, that character is written out in diagnostic messages, an +addition to the $undefined value. + +Suggest: Change the name $undefined to undefined; looks better in outputs. + + +* Default Action +From Hans: +- For use with my C++ parser, I transported the "switch (yyn)" statement +that Bison writes to the bison.simple skeleton file. This way, I can remove +the current default rule $$ = $1 implementation, which causes a double +assignment to $$ which may not be OK under C++, replacing it with a +"default:" part within the switch statement. + +Note that the default rule $$ = $1, when typed, is perfectly OK under C, +but in the C++ implementation I made, this rule is different from +$$ = $1. I therefore think that one should implement +a Bison option where every typed default rule is explicitly written out +(same typed ruled can of course be grouped together). + +Note: Robert Anisko handles this. He knows how to do it. + + +* Warnings +It would be nice to have warning support. See how Autoconf handles +them, it is fairly well described there. It would be very nice to +implement this in such a way that other programs could use +lib/warnings.[ch]. + +Don't work on this without first announcing you do, as I already have +thought about it, and know many of the components that can be used to +implement it. + + +* Pre and post actions. +From: Florian Krohm +Subject: YYACT_EPILOGUE +To: bug-bison@gnu.org +X-Sent: 1 week, 4 days, 14 hours, 38 minutes, 11 seconds ago + +The other day I had the need for explicitly building the parse tree. I +used %locations for that and defined YYLLOC_DEFAULT to call a function +that returns the tree node for the production. Easy. But I also needed +to assign the S-attribute to the tree node. That cannot be done in +YYLLOC_DEFAULT, because it is invoked before the action is executed. +The way I solved this was to define a macro YYACT_EPILOGUE that would +be invoked after the action. For reasons of symmetry I also added +YYACT_PROLOGUE. Although I had no use for that I can envision how it +might come in handy for debugging purposes. +All is needed is to add + +#if YYLSP_NEEDED + YYACT_EPILOGUE (yyval, (yyvsp - yylen), yylen, yyloc, (yylsp - yylen)); +#else + YYACT_EPILOGUE (yyval, (yyvsp - yylen), yylen); +#endif + +at the proper place to bison.simple. Ditto for YYACT_PROLOGUE. + +I was wondering what you think about adding YYACT_PROLOGUE/EPILOGUE +to bison. If you're interested, I'll work on a patch. + +* Move to Graphviz +Well, VCG seems really dead. Move to Graphviz instead. Also, equip +the parser with a means to create the (visual) parse tree. + +----- + +Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + +This file is part of GNU Bison. + +GNU Bison is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Bison is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Bison; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. diff --git a/src/apps/bin/bison/aclocal.m4 b/src/apps/bin/bison/aclocal.m4 new file mode 100644 index 0000000000..38141b7b83 --- /dev/null +++ b/src/apps/bin/bison/aclocal.m4 @@ -0,0 +1,979 @@ +# generated automatically by aclocal 1.8.5 -*- Autoconf -*- + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 +# Free Software Foundation, Inc. +# This file is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +# -*- Autoconf -*- +# Copyright (C) 2002, 2003 Free Software Foundation, Inc. +# Generated from amversion.in; do not edit by hand. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + +# AM_AUTOMAKE_VERSION(VERSION) +# ---------------------------- +# Automake X.Y traces this macro to ensure aclocal.m4 has been +# generated from the m4 files accompanying Automake X.Y. +AC_DEFUN([AM_AUTOMAKE_VERSION], [am__api_version="1.8"]) + +# AM_SET_CURRENT_AUTOMAKE_VERSION +# ------------------------------- +# Call AM_AUTOMAKE_VERSION so it can be traced. +# This function is AC_REQUIREd by AC_INIT_AUTOMAKE. +AC_DEFUN([AM_SET_CURRENT_AUTOMAKE_VERSION], + [AM_AUTOMAKE_VERSION([1.8.5])]) + +# AM_AUX_DIR_EXPAND + +# Copyright (C) 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# For projects using AC_CONFIG_AUX_DIR([foo]), Autoconf sets +# $ac_aux_dir to `$srcdir/foo'. In other projects, it is set to +# `$srcdir', `$srcdir/..', or `$srcdir/../..'. +# +# Of course, Automake must honor this variable whenever it calls a +# tool from the auxiliary directory. The problem is that $srcdir (and +# therefore $ac_aux_dir as well) can be either absolute or relative, +# depending on how configure is run. This is pretty annoying, since +# it makes $ac_aux_dir quite unusable in subdirectories: in the top +# source directory, any form will work fine, but in subdirectories a +# relative path needs to be adjusted first. +# +# $ac_aux_dir/missing +# fails when called from a subdirectory if $ac_aux_dir is relative +# $top_srcdir/$ac_aux_dir/missing +# fails if $ac_aux_dir is absolute, +# fails when called from a subdirectory in a VPATH build with +# a relative $ac_aux_dir +# +# The reason of the latter failure is that $top_srcdir and $ac_aux_dir +# are both prefixed by $srcdir. In an in-source build this is usually +# harmless because $srcdir is `.', but things will broke when you +# start a VPATH build or use an absolute $srcdir. +# +# So we could use something similar to $top_srcdir/$ac_aux_dir/missing, +# iff we strip the leading $srcdir from $ac_aux_dir. That would be: +# am_aux_dir='\$(top_srcdir)/'`expr "$ac_aux_dir" : "$srcdir//*\(.*\)"` +# and then we would define $MISSING as +# MISSING="\${SHELL} $am_aux_dir/missing" +# This will work as long as MISSING is not called from configure, because +# unfortunately $(top_srcdir) has no meaning in configure. +# However there are other variables, like CC, which are often used in +# configure, and could therefore not use this "fixed" $ac_aux_dir. +# +# Another solution, used here, is to always expand $ac_aux_dir to an +# absolute PATH. The drawback is that using absolute paths prevent a +# configured tree to be moved without reconfiguration. + +AC_DEFUN([AM_AUX_DIR_EXPAND], +[dnl Rely on autoconf to set up CDPATH properly. +AC_PREREQ([2.50])dnl +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` +]) + + +# Copyright (C) 1996, 1997, 1999, 2000, 2001, 2002, 2003 +# Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +# This was merged into AC_PROG_CC in Autoconf. + +AU_DEFUN([AM_PROG_CC_STDC], +[AC_PROG_CC +AC_DIAGNOSE([obsolete], [$0: + your code should no longer depend upon `am_cv_prog_cc_stdc', but upon + `ac_cv_prog_cc_stdc'. Remove this warning and the assignment when + you adjust the code. You can also remove the above call to + AC_PROG_CC if you already called it elsewhere.]) +am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc +]) +AU_DEFUN([fp_PROG_CC_STDC]) + +# AM_CONDITIONAL -*- Autoconf -*- + +# Copyright (C) 1997, 2000, 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 6 + +# AM_CONDITIONAL(NAME, SHELL-CONDITION) +# ------------------------------------- +# Define a conditional. +AC_DEFUN([AM_CONDITIONAL], +[AC_PREREQ(2.52)dnl + ifelse([$1], [TRUE], [AC_FATAL([$0: invalid condition: $1])], + [$1], [FALSE], [AC_FATAL([$0: invalid condition: $1])])dnl +AC_SUBST([$1_TRUE]) +AC_SUBST([$1_FALSE]) +if $2; then + $1_TRUE= + $1_FALSE='#' +else + $1_TRUE='#' + $1_FALSE= +fi +AC_CONFIG_COMMANDS_PRE( +[if test -z "${$1_TRUE}" && test -z "${$1_FALSE}"; then + AC_MSG_ERROR([conditional "$1" was never defined. +Usually this means the macro was only invoked conditionally.]) +fi])]) + +# serial 7 -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 +# Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + + +# There are a few dirty hacks below to avoid letting `AC_PROG_CC' be +# written in clear, in which case automake, when reading aclocal.m4, +# will think it sees a *use*, and therefore will trigger all it's +# C support machinery. Also note that it means that autoscan, seeing +# CC etc. in the Makefile, will ask for an AC_PROG_CC use... + + + +# _AM_DEPENDENCIES(NAME) +# ---------------------- +# See how the compiler implements dependency checking. +# NAME is "CC", "CXX", "GCJ", or "OBJC". +# We try a few techniques and use that to set a single cache variable. +# +# We don't AC_REQUIRE the corresponding AC_PROG_CC since the latter was +# modified to invoke _AM_DEPENDENCIES(CC); we would have a circular +# dependency, and given that the user is not expected to run this macro, +# just rely on AC_PROG_CC. +AC_DEFUN([_AM_DEPENDENCIES], +[AC_REQUIRE([AM_SET_DEPDIR])dnl +AC_REQUIRE([AM_OUTPUT_DEPENDENCY_COMMANDS])dnl +AC_REQUIRE([AM_MAKE_INCLUDE])dnl +AC_REQUIRE([AM_DEP_TRACK])dnl + +ifelse([$1], CC, [depcc="$CC" am_compiler_list=], + [$1], CXX, [depcc="$CXX" am_compiler_list=], + [$1], OBJC, [depcc="$OBJC" am_compiler_list='gcc3 gcc'], + [$1], GCJ, [depcc="$GCJ" am_compiler_list='gcc3 gcc'], + [depcc="$$1" am_compiler_list=]) + +AC_CACHE_CHECK([dependency style of $depcc], + [am_cv_$1_dependencies_compiler_type], +[if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_$1_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n ['s/^#*\([a-zA-Z0-9]*\))$/\1/p'] < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_$1_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_$1_dependencies_compiler_type=none +fi +]) +AC_SUBST([$1DEPMODE], [depmode=$am_cv_$1_dependencies_compiler_type]) +AM_CONDITIONAL([am__fastdep$1], [ + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_$1_dependencies_compiler_type" = gcc3]) +]) + + +# AM_SET_DEPDIR +# ------------- +# Choose a directory name for dependency files. +# This macro is AC_REQUIREd in _AM_DEPENDENCIES +AC_DEFUN([AM_SET_DEPDIR], +[AC_REQUIRE([AM_SET_LEADING_DOT])dnl +AC_SUBST([DEPDIR], ["${am__leading_dot}deps"])dnl +]) + + +# AM_DEP_TRACK +# ------------ +AC_DEFUN([AM_DEP_TRACK], +[AC_ARG_ENABLE(dependency-tracking, +[ --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors]) +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi +AM_CONDITIONAL([AMDEP], [test "x$enable_dependency_tracking" != xno]) +AC_SUBST([AMDEPBACKSLASH]) +]) + +# Generate code to set up dependency tracking. -*- Autoconf -*- + +# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +#serial 2 + +# _AM_OUTPUT_DEPENDENCY_COMMANDS +# ------------------------------ +AC_DEFUN([_AM_OUTPUT_DEPENDENCY_COMMANDS], +[for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`AS_DIRNAME("$mf")` + else + continue + fi + grep '^DEP_FILES *= *[[^ @%:@]]' < "$mf" > /dev/null || continue + # Extract the definition of DEP_FILES from the Makefile without + # running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" + # We invoke sed twice because it is the simplest approach to + # changing $(DEPDIR) to its actual value in the expansion. + for file in `sed -n ' + /^DEP_FILES = .*\\\\$/ { + s/^DEP_FILES = // + :loop + s/\\\\$// + p + n + /\\\\$/ b loop + p + } + /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`AS_DIRNAME(["$file"])` + AS_MKDIR_P([$dirpart/$fdir]) + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done +])# _AM_OUTPUT_DEPENDENCY_COMMANDS + + +# AM_OUTPUT_DEPENDENCY_COMMANDS +# ----------------------------- +# This macro should only be invoked once -- use via AC_REQUIRE. +# +# This code is only required when automatic dependency tracking +# is enabled. FIXME. This creates each `.P' file that we will +# need in order to bootstrap the dependency handling code. +AC_DEFUN([AM_OUTPUT_DEPENDENCY_COMMANDS], +[AC_CONFIG_COMMANDS([depfiles], + [test x"$AMDEP_TRUE" != x"" || _AM_OUTPUT_DEPENDENCY_COMMANDS], + [AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir"]) +]) + +# Do all the work for Automake. -*- Autoconf -*- + +# This macro actually does too much some checks are only needed if +# your package does certain things. But this isn't really a big deal. + +# Copyright (C) 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003 +# Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 11 + +# AM_INIT_AUTOMAKE(PACKAGE, VERSION, [NO-DEFINE]) +# AM_INIT_AUTOMAKE([OPTIONS]) +# ----------------------------------------------- +# The call with PACKAGE and VERSION arguments is the old style +# call (pre autoconf-2.50), which is being phased out. PACKAGE +# and VERSION should now be passed to AC_INIT and removed from +# the call to AM_INIT_AUTOMAKE. +# We support both call styles for the transition. After +# the next Automake release, Autoconf can make the AC_INIT +# arguments mandatory, and then we can depend on a new Autoconf +# release and drop the old call support. +AC_DEFUN([AM_INIT_AUTOMAKE], +[AC_PREREQ([2.58])dnl +dnl Autoconf wants to disallow AM_ names. We explicitly allow +dnl the ones we care about. +m4_pattern_allow([^AM_[A-Z]+FLAGS$])dnl +AC_REQUIRE([AM_SET_CURRENT_AUTOMAKE_VERSION])dnl +AC_REQUIRE([AC_PROG_INSTALL])dnl +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + AC_MSG_ERROR([source directory already configured; run "make distclean" there first]) +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi +AC_SUBST([CYGPATH_W]) + +# Define the identity of the package. +dnl Distinguish between old-style and new-style calls. +m4_ifval([$2], +[m4_ifval([$3], [_AM_SET_OPTION([no-define])])dnl + AC_SUBST([PACKAGE], [$1])dnl + AC_SUBST([VERSION], [$2])], +[_AM_SET_OPTIONS([$1])dnl + AC_SUBST([PACKAGE], ['AC_PACKAGE_TARNAME'])dnl + AC_SUBST([VERSION], ['AC_PACKAGE_VERSION'])])dnl + +_AM_IF_OPTION([no-define],, +[AC_DEFINE_UNQUOTED(PACKAGE, "$PACKAGE", [Name of package]) + AC_DEFINE_UNQUOTED(VERSION, "$VERSION", [Version number of package])])dnl + +# Some tools Automake needs. +AC_REQUIRE([AM_SANITY_CHECK])dnl +AC_REQUIRE([AC_ARG_PROGRAM])dnl +AM_MISSING_PROG(ACLOCAL, aclocal-${am__api_version}) +AM_MISSING_PROG(AUTOCONF, autoconf) +AM_MISSING_PROG(AUTOMAKE, automake-${am__api_version}) +AM_MISSING_PROG(AUTOHEADER, autoheader) +AM_MISSING_PROG(MAKEINFO, makeinfo) +AM_MISSING_PROG(AMTAR, tar) +AM_PROG_INSTALL_SH +AM_PROG_INSTALL_STRIP +AC_REQUIRE([AM_PROG_MKDIR_P])dnl +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. +AC_REQUIRE([AC_PROG_AWK])dnl +AC_REQUIRE([AC_PROG_MAKE_SET])dnl +AC_REQUIRE([AM_SET_LEADING_DOT])dnl + +_AM_IF_OPTION([no-dependencies],, +[AC_PROVIDE_IFELSE([AC_PROG_CC], + [_AM_DEPENDENCIES(CC)], + [define([AC_PROG_CC], + defn([AC_PROG_CC])[_AM_DEPENDENCIES(CC)])])dnl +AC_PROVIDE_IFELSE([AC_PROG_CXX], + [_AM_DEPENDENCIES(CXX)], + [define([AC_PROG_CXX], + defn([AC_PROG_CXX])[_AM_DEPENDENCIES(CXX)])])dnl +]) +]) + + +# When config.status generates a header, we must update the stamp-h file. +# This file resides in the same directory as the config header +# that is generated. The stamp files are numbered to have different names. + +# Autoconf calls _AC_AM_CONFIG_HEADER_HOOK (when defined) in the +# loop where config.status creates the headers, so we can generate +# our stamp files there. +AC_DEFUN([_AC_AM_CONFIG_HEADER_HOOK], +[# Compute $1's index in $config_headers. +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $1 | $1:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $1" >`AS_DIRNAME([$1])`/stamp-h[]$_am_stamp_count]) + +# AM_PROG_INSTALL_SH +# ------------------ +# Define $install_sh. + +# Copyright (C) 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AC_DEFUN([AM_PROG_INSTALL_SH], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +install_sh=${install_sh-"$am_aux_dir/install-sh"} +AC_SUBST(install_sh)]) + +# -*- Autoconf -*- +# Copyright (C) 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 1 + +# Check whether the underlying file-system supports filenames +# with a leading dot. For instance MS-DOS doesn't. +AC_DEFUN([AM_SET_LEADING_DOT], +[rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null +AC_SUBST([am__leading_dot])]) + +# Check to see how 'make' treats includes. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 2 + +# AM_MAKE_INCLUDE() +# ----------------- +# Check to see how make treats includes. +AC_DEFUN([AM_MAKE_INCLUDE], +[am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +AC_MSG_CHECKING([for style of include used by $am_make]) +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi +AC_SUBST([am__include]) +AC_SUBST([am__quote]) +AC_MSG_RESULT([$_am_result]) +rm -f confinc confmf +]) + +# -*- Autoconf -*- + + +# Copyright (C) 1997, 1999, 2000, 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +# AM_MISSING_PROG(NAME, PROGRAM) +# ------------------------------ +AC_DEFUN([AM_MISSING_PROG], +[AC_REQUIRE([AM_MISSING_HAS_RUN]) +$1=${$1-"${am_missing_run}$2"} +AC_SUBST($1)]) + + +# AM_MISSING_HAS_RUN +# ------------------ +# Define MISSING if not defined so far and test if it supports --run. +# If it does, set am_missing_run to use it, otherwise, to nothing. +AC_DEFUN([AM_MISSING_HAS_RUN], +[AC_REQUIRE([AM_AUX_DIR_EXPAND])dnl +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + AC_MSG_WARN([`missing' script is too old or missing]) +fi +]) + +# AM_PROG_MKDIR_P +# --------------- +# Check whether `mkdir -p' is supported, fallback to mkinstalldirs otherwise. + +# Copyright (C) 2003, 2004 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# Automake 1.8 used `mkdir -m 0755 -p --' to ensure that directories +# created by `make install' are always world readable, even if the +# installer happens to have an overly restrictive umask (e.g. 077). +# This was a mistake. There are at least two reasons why we must not +# use `-m 0755': +# - it causes special bits like SGID to be ignored, +# - it may be too restrictive (some setups expect 775 directories). +# +# Do not use -m 0755 and let people choose whatever they expect by +# setting umask. +# +# We cannot accept any implementation of `mkdir' that recognizes `-p'. +# Some implementations (such as Solaris 8's) are not thread-safe: if a +# parallel make tries to run `mkdir -p a/b' and `mkdir -p a/c' +# concurrently, both version can detect that a/ is missing, but only +# one can create it and the other will error out. Consequently we +# restrict ourselves to GNU make (using the --version option ensures +# this.) +AC_DEFUN([AM_PROG_MKDIR_P], +[if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + # Keeping the `.' argument allows $(mkdir_p) to be used without + # argument. Indeed, we sometimes output rules like + # $(mkdir_p) $(somedir) + # where $(somedir) is conditionally defined. + # (`test -n '$(somedir)' && $(mkdir_p) $(somedir)' is a more + # expensive solution, as it forces Make to start a sub-shell.) + mkdir_p='mkdir -p -- .' +else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + for d in ./-p ./--version; + do + test -d $d && rmdir $d + done + # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. + if test -f "$ac_aux_dir/mkinstalldirs"; then + mkdir_p='$(mkinstalldirs)' + else + mkdir_p='$(install_sh) -d' + fi +fi +AC_SUBST([mkdir_p])]) + +# Helper functions for option handling. -*- Autoconf -*- + +# Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 2 + +# _AM_MANGLE_OPTION(NAME) +# ----------------------- +AC_DEFUN([_AM_MANGLE_OPTION], +[[_AM_OPTION_]m4_bpatsubst($1, [[^a-zA-Z0-9_]], [_])]) + +# _AM_SET_OPTION(NAME) +# ------------------------------ +# Set option NAME. Presently that only means defining a flag for this option. +AC_DEFUN([_AM_SET_OPTION], +[m4_define(_AM_MANGLE_OPTION([$1]), 1)]) + +# _AM_SET_OPTIONS(OPTIONS) +# ---------------------------------- +# OPTIONS is a space-separated list of Automake options. +AC_DEFUN([_AM_SET_OPTIONS], +[AC_FOREACH([_AM_Option], [$1], [_AM_SET_OPTION(_AM_Option)])]) + +# _AM_IF_OPTION(OPTION, IF-SET, [IF-NOT-SET]) +# ------------------------------------------- +# Execute IF-SET if OPTION is set, IF-NOT-SET otherwise. +AC_DEFUN([_AM_IF_OPTION], +[m4_ifset(_AM_MANGLE_OPTION([$1]), [$2], [$3])]) + +# +# Check to make sure that the build environment is sane. +# + +# Copyright (C) 1996, 1997, 2000, 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# serial 3 + +# AM_SANITY_CHECK +# --------------- +AC_DEFUN([AM_SANITY_CHECK], +[AC_MSG_CHECKING([whether build environment is sane]) +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$[*]" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$[*]" != "X $srcdir/configure conftest.file" \ + && test "$[*]" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + AC_MSG_ERROR([ls -t appears to fail. Make sure there is not a broken +alias in your environment]) + fi + + test "$[2]" = conftest.file + ) +then + # Ok. + : +else + AC_MSG_ERROR([newly created file is older than distributed files! +Check your system clock]) +fi +AC_MSG_RESULT(yes)]) + +# AM_PROG_INSTALL_STRIP + +# Copyright (C) 2001, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# One issue with vendor `install' (even GNU) is that you can't +# specify the program used to strip binaries. This is especially +# annoying in cross-compiling environments, where the build's strip +# is unlikely to handle the host's binaries. +# Fortunately install-sh will honor a STRIPPROG variable, so we +# always use install-sh in `make install-strip', and initialize +# STRIPPROG with the value of the STRIP variable (set by the user). +AC_DEFUN([AM_PROG_INSTALL_STRIP], +[AC_REQUIRE([AM_PROG_INSTALL_SH])dnl +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +dnl Don't test for $cross_compiling = yes, because it might be `maybe'. +if test "$cross_compiling" != no; then + AC_CHECK_TOOL([STRIP], [strip], :) +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" +AC_SUBST([INSTALL_STRIP_PROGRAM])]) + +m4_include([m4/alloca.m4]) +m4_include([m4/dirname.m4]) +m4_include([m4/dmalloc.m4]) +m4_include([m4/dos.m4]) +m4_include([m4/error.m4]) +m4_include([m4/exitfail.m4]) +m4_include([m4/extensions.m4]) +m4_include([m4/getopt.m4]) +m4_include([m4/gettext.m4]) +m4_include([m4/gnulib.m4]) +m4_include([m4/hard-locale.m4]) +m4_include([m4/hash.m4]) +m4_include([m4/iconv.m4]) +m4_include([m4/lib-ld.m4]) +m4_include([m4/lib-link.m4]) +m4_include([m4/lib-prefix.m4]) +m4_include([m4/m4.m4]) +m4_include([m4/mbrtowc.m4]) +m4_include([m4/mbstate_t.m4]) +m4_include([m4/mbswidth.m4]) +m4_include([m4/nls.m4]) +m4_include([m4/obstack.m4]) +m4_include([m4/onceonly.m4]) +m4_include([m4/po.m4]) +m4_include([m4/progtest.m4]) +m4_include([m4/quote.m4]) +m4_include([m4/quotearg.m4]) +m4_include([m4/stdbool.m4]) +m4_include([m4/stpcpy.m4]) +m4_include([m4/strndup.m4]) +m4_include([m4/strnlen.m4]) +m4_include([m4/subpipe.m4]) +m4_include([m4/timevar.m4]) +m4_include([m4/unlocked-io.m4]) +m4_include([m4/warning.m4]) +m4_include([m4/xalloc.m4]) +m4_include([m4/xstrndup.m4]) diff --git a/src/apps/bin/bison/config.h b/src/apps/bin/bison/config.h new file mode 100644 index 0000000000..e99e857e64 --- /dev/null +++ b/src/apps/bin/bison/config.h @@ -0,0 +1,372 @@ +/* config.h. Generated by configure. */ +/* config.hin. Generated from configure.ac by autoheader. */ + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +/* #undef CRAY_STACKSEG_END */ + +/* Define to 1 if using `alloca.c'. */ +/* #undef C_ALLOCA */ + +/* Define to 1 if translation of program messages to the user's native + language is requested. */ +/* #undef ENABLE_NLS */ + +/* Define on systems for which file names may have a so-called `drive letter' + prefix, define this to compute the length of that prefix, including the + colon. */ +#define FILESYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX 0 + +/* Define if the backslash character may also serve as a file name component + separator. */ +#define FILESYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR 0 + +#if FILESYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX +# define FILESYSTEM_PREFIX_LEN(Filename) \ + ((Filename)[0] && (Filename)[1] == ':' ? 2 : 0) +#else +# define FILESYSTEM_PREFIX_LEN(Filename) 0 +#endif + +/* Define to 1 if you have `alloca' after including , a header that + may be supplied by this distribution. */ +#define HAVE_ALLOCA 1 + +/* Define HAVE_ALLOCA_H for backward compatibility with older code that + includes only if HAVE_ALLOCA_H is defined. */ +#define HAVE_ALLOCA_H 1 + +/* Define to 1 if the system has the type `clock_t'. */ +#define HAVE_CLOCK_T 1 + +/* Define if the GNU dcgettext() function is already present or preinstalled. + */ +/* #undef HAVE_DCGETTEXT */ + +/* Define to 1 if you have the declaration of `clearerr_unlocked', and to 0 if + you don't. */ +#define HAVE_DECL_CLEARERR_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `clock', and to 0 if you don't. + */ +#define HAVE_DECL_CLOCK 1 + +/* Define to 1 if you have the declaration of `feof_unlocked', and to 0 if you + don't. */ +#define HAVE_DECL_FEOF_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `ferror_unlocked', and to 0 if + you don't. */ +#define HAVE_DECL_FERROR_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `fflush_unlocked', and to 0 if + you don't. */ +#define HAVE_DECL_FFLUSH_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `fgets_unlocked', and to 0 if + you don't. */ +#define HAVE_DECL_FGETS_UNLOCKED 0 + +/* Define to 1 if you have the declaration of `fputc_unlocked', and to 0 if + you don't. */ +#define HAVE_DECL_FPUTC_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `fputs_unlocked', and to 0 if + you don't. */ +#define HAVE_DECL_FPUTS_UNLOCKED 0 + +/* Define to 1 if you have the declaration of `fread_unlocked', and to 0 if + you don't. */ +#define HAVE_DECL_FREAD_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `fwrite_unlocked', and to 0 if + you don't. */ +#define HAVE_DECL_FWRITE_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `getchar_unlocked', and to 0 if + you don't. */ +#define HAVE_DECL_GETCHAR_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you + don't. */ +#define HAVE_DECL_GETC_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `getrusage', and to 0 if you + don't. */ +#define HAVE_DECL_GETRUSAGE 1 + +/* Define to 1 if you have a declaration of mbswidth() in , and to 0 + otherwise. */ +#define HAVE_DECL_MBSWIDTH_IN_WCHAR_H 0 + +/* Define to 1 if you have the declaration of `putchar_unlocked', and to 0 if + you don't. */ +#define HAVE_DECL_PUTCHAR_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `putc_unlocked', and to 0 if you + don't. */ +#define HAVE_DECL_PUTC_UNLOCKED 1 + +/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you + don't. */ +#define HAVE_DECL_STRERROR_R 1 + +/* Define to 1 if you have the declaration of `strnlen', and to 0 if you + don't. */ +/* #undef HAVE_DECL_STRNLEN */ +#define HAVE_DECL_STRNLEN 1 + +/* Define to 1 if you have the declaration of `sysconf', and to 0 if you + don't. */ +#define HAVE_DECL_SYSCONF 1 + +/* Define to 1 if you have the declaration of `times', and to 0 if you don't. + */ +#define HAVE_DECL_TIMES 1 + +/* Define to 1 if you have the declaration of wcwidth(), and to 0 otherwise. + */ +#define HAVE_DECL_WCWIDTH 0 + +/* Define to 1 if you have the `dup2' function. */ +#define HAVE_DUP2 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_FCNTL_H 1 + +/* Define to 1 if you have the `fork' function. */ +#define HAVE_FORK 1 + +/* Define if the GNU gettext() function is already present or preinstalled. */ +/* #undef HAVE_GETTEXT */ + +/* Define if you have the iconv() function. */ +/* #undef HAVE_ICONV */ + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `isascii' function. */ +#define HAVE_ISASCII 1 + +/* Define to 1 if you have the `iswcntrl' function. */ +#define HAVE_ISWCNTRL 1 + +/* Define to 1 if you have the `iswprint' function. */ +#define HAVE_ISWPRINT 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_LOCALE_H 1 + +/* Define to 1 if your system has a GNU libc compatible `malloc' function, and + to 0 otherwise. */ +#define HAVE_MALLOC 1 + +/* Define to 1 if mbrtowc and mbstate_t are properly declared. */ +/* #undef HAVE_MBRTOWC */ + +/* Define to 1 if you have the `mbsinit' function. */ +#define HAVE_MBSINIT 1 + +/* Define to 1 if declares mbstate_t. */ +/* #undef HAVE_MBSTATE_T */ + +/* Define to 1 if you have the header file. */ +#define HAVE_MEMORY_H 1 + +/* Define to 1 if libc includes obstacks. */ +#define HAVE_OBSTACK 1 + +/* Define to 1 if your system has a GNU libc compatible `realloc' function, + and to 0 otherwise. */ +#define HAVE_REALLOC 1 + +/* Define to 1 if you have the `setlocale' function. */ +#define HAVE_SETLOCALE 1 + +/* Define to 1 if stdbool.h conforms to C99. */ +/* #undef HAVE_STDBOOL_H */ + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_STDINT_H */ + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the `stpcpy' function. */ +#define HAVE_STPCPY 1 + +/* Define to 1 if you have the `strerror_r' function. */ +#define HAVE_STRERROR_R 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the `strndup' function. */ +#define HAVE_STRNDUP 1 + +/* Define to 1 if the system has the type `struct tms'. */ +#define HAVE_STRUCT_TMS 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_RESOURCE_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_STAT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIMES_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TIME_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have that is POSIX.1 compatible. */ +#define HAVE_SYS_WAIT_H 1 + +/* Define to 1 if you have the `times' function. */ +#define HAVE_TIMES 1 + +/* Define to 1 if the system has the type `uintptr_t'. */ +//#define HAVE_UINTPTR_T 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_UNISTD_H 1 + +/* Define to 1 if you have the `vfork' function. */ +//#define HAVE_VFORK 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_VFORK_H */ + +/* Define to 1 if you have the `waitpid' function. */ +#define HAVE_WAITPID 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_WCHAR_H 1 + +/* Define to 1 if you have the header file. */ +/* #undef HAVE_WCTYPE_H */ + +/* Define to 1 if you have the `wcwidth' function. */ +#define HAVE_WCWIDTH 1 + +/* Define to 1 if `fork' works. */ +#define HAVE_WORKING_FORK 1 + +/* Define to 1 if `vfork' works. */ +//#define HAVE_WORKING_VFORK 1 + +/* Define to 1 if the system has the type `_Bool'. */ +/* #undef HAVE__BOOL */ + +#if FILESYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +#else +# define ISSLASH(C) ((C) == '/') +#endif + +/* Define to the GNU M4 executable name. */ +#define M4 "/bin/m4" + +/* Name of package */ +#define PACKAGE "bison" + +/* Define to the address where bug reports for this package should be sent. */ +#define PACKAGE_BUGREPORT "bug-bison@gnu.org" + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "GNU Bison" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "GNU Bison 1.875d" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "bison" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION "1.875d" + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at run-time. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +/* #undef STACK_DIRECTION */ + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Define to 1 if strerror_r returns char *. */ +#define STRERROR_R_CHAR_P 1 + +/* Version number of package */ +#define VERSION "1.875d" + +/* Define if using the dmalloc debugging malloc package */ +/* #undef WITH_DMALLOC */ + +/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a + `char[]'. */ +#define YYTEXT_POINTER 1 + +/* Define to 1 if on AIX 3. + System headers sometimes define this. + We just want to avoid a redefinition error message. */ +#ifndef _ALL_SOURCE +/* # undef _ALL_SOURCE */ +#endif + +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# define _GNU_SOURCE 1 +#endif + +/* Define to 1 if on MINIX. */ +/* #undef _MINIX */ + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +/* #undef _POSIX_1_SOURCE */ + +/* Define to 1 if you need to in order for `stat' and other things to work. */ +/* #undef _POSIX_SOURCE */ + +/* Enable extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# define __EXTENSIONS__ 1 +#endif + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +/* #undef inline */ +#endif + +/* Define to 1 if the compiler is checking for lint. */ +/* #undef lint */ + +/* Define to rpl_malloc if the replacement function should be used. */ +/* #undef malloc */ + +/* Define to a type if does not define. */ +//#define mbstate_t int + +/* Define to `int' if does not define. */ +/* #undef pid_t */ + +/* Define to rpl_realloc if the replacement function should be used. */ +/* #undef realloc */ + +/* Define to rpl_strnlen if the replacement function should be used. */ +/* #undef strnlen */ + +/* Define as `fork' if `vfork' does not work. */ +/* #undef vfork */ diff --git a/src/apps/bin/bison/config.hin b/src/apps/bin/bison/config.hin new file mode 100644 index 0000000000..348274bfa7 --- /dev/null +++ b/src/apps/bin/bison/config.hin @@ -0,0 +1,370 @@ +/* config.hin. Generated from configure.ac by autoheader. */ + +/* Define to one of `_getb67', `GETB67', `getb67' for Cray-2 and Cray-YMP + systems. This function is required for `alloca.c' support on those systems. + */ +#undef CRAY_STACKSEG_END + +/* Define to 1 if using `alloca.c'. */ +#undef C_ALLOCA + +/* Define to 1 if translation of program messages to the user's native + language is requested. */ +#undef ENABLE_NLS + +/* Define on systems for which file names may have a so-called `drive letter' + prefix, define this to compute the length of that prefix, including the + colon. */ +#undef FILESYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX + +/* Define if the backslash character may also serve as a file name component + separator. */ +#undef FILESYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR + +#if FILESYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX +# define FILESYSTEM_PREFIX_LEN(Filename) \ + ((Filename)[0] && (Filename)[1] == ':' ? 2 : 0) +#else +# define FILESYSTEM_PREFIX_LEN(Filename) 0 +#endif + +/* Define to 1 if you have `alloca' after including , a header that + may be supplied by this distribution. */ +#undef HAVE_ALLOCA + +/* Define HAVE_ALLOCA_H for backward compatibility with older code that + includes only if HAVE_ALLOCA_H is defined. */ +#undef HAVE_ALLOCA_H + +/* Define to 1 if the system has the type `clock_t'. */ +#undef HAVE_CLOCK_T + +/* Define if the GNU dcgettext() function is already present or preinstalled. + */ +#undef HAVE_DCGETTEXT + +/* Define to 1 if you have the declaration of `clearerr_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_CLEARERR_UNLOCKED + +/* Define to 1 if you have the declaration of `clock', and to 0 if you don't. + */ +#undef HAVE_DECL_CLOCK + +/* Define to 1 if you have the declaration of `feof_unlocked', and to 0 if you + don't. */ +#undef HAVE_DECL_FEOF_UNLOCKED + +/* Define to 1 if you have the declaration of `ferror_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_FERROR_UNLOCKED + +/* Define to 1 if you have the declaration of `fflush_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_FFLUSH_UNLOCKED + +/* Define to 1 if you have the declaration of `fgets_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_FGETS_UNLOCKED + +/* Define to 1 if you have the declaration of `fputc_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_FPUTC_UNLOCKED + +/* Define to 1 if you have the declaration of `fputs_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_FPUTS_UNLOCKED + +/* Define to 1 if you have the declaration of `fread_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_FREAD_UNLOCKED + +/* Define to 1 if you have the declaration of `fwrite_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_FWRITE_UNLOCKED + +/* Define to 1 if you have the declaration of `getchar_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_GETCHAR_UNLOCKED + +/* Define to 1 if you have the declaration of `getc_unlocked', and to 0 if you + don't. */ +#undef HAVE_DECL_GETC_UNLOCKED + +/* Define to 1 if you have the declaration of `getrusage', and to 0 if you + don't. */ +#undef HAVE_DECL_GETRUSAGE + +/* Define to 1 if you have a declaration of mbswidth() in , and to 0 + otherwise. */ +#undef HAVE_DECL_MBSWIDTH_IN_WCHAR_H + +/* Define to 1 if you have the declaration of `putchar_unlocked', and to 0 if + you don't. */ +#undef HAVE_DECL_PUTCHAR_UNLOCKED + +/* Define to 1 if you have the declaration of `putc_unlocked', and to 0 if you + don't. */ +#undef HAVE_DECL_PUTC_UNLOCKED + +/* Define to 1 if you have the declaration of `strerror_r', and to 0 if you + don't. */ +#undef HAVE_DECL_STRERROR_R + +/* Define to 1 if you have the declaration of `strnlen', and to 0 if you + don't. */ +#undef HAVE_DECL_STRNLEN + +/* Define to 1 if you have the declaration of `sysconf', and to 0 if you + don't. */ +#undef HAVE_DECL_SYSCONF + +/* Define to 1 if you have the declaration of `times', and to 0 if you don't. + */ +#undef HAVE_DECL_TIMES + +/* Define to 1 if you have the declaration of wcwidth(), and to 0 otherwise. + */ +#undef HAVE_DECL_WCWIDTH + +/* Define to 1 if you have the `dup2' function. */ +#undef HAVE_DUP2 + +/* Define to 1 if you have the header file. */ +#undef HAVE_FCNTL_H + +/* Define to 1 if you have the `fork' function. */ +#undef HAVE_FORK + +/* Define if the GNU gettext() function is already present or preinstalled. */ +#undef HAVE_GETTEXT + +/* Define if you have the iconv() function. */ +#undef HAVE_ICONV + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the `isascii' function. */ +#undef HAVE_ISASCII + +/* Define to 1 if you have the `iswcntrl' function. */ +#undef HAVE_ISWCNTRL + +/* Define to 1 if you have the `iswprint' function. */ +#undef HAVE_ISWPRINT + +/* Define to 1 if you have the header file. */ +#undef HAVE_LOCALE_H + +/* Define to 1 if your system has a GNU libc compatible `malloc' function, and + to 0 otherwise. */ +#undef HAVE_MALLOC + +/* Define to 1 if mbrtowc and mbstate_t are properly declared. */ +#undef HAVE_MBRTOWC + +/* Define to 1 if you have the `mbsinit' function. */ +#undef HAVE_MBSINIT + +/* Define to 1 if declares mbstate_t. */ +#undef HAVE_MBSTATE_T + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if libc includes obstacks. */ +#undef HAVE_OBSTACK + +/* Define to 1 if your system has a GNU libc compatible `realloc' function, + and to 0 otherwise. */ +#undef HAVE_REALLOC + +/* Define to 1 if you have the `setlocale' function. */ +#undef HAVE_SETLOCALE + +/* Define to 1 if stdbool.h conforms to C99. */ +#undef HAVE_STDBOOL_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the `stpcpy' function. */ +#undef HAVE_STPCPY + +/* Define to 1 if you have the `strerror_r' function. */ +#undef HAVE_STRERROR_R + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the `strndup' function. */ +#undef HAVE_STRNDUP + +/* Define to 1 if the system has the type `struct tms'. */ +#undef HAVE_STRUCT_TMS + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_RESOURCE_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIMES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TIME_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have that is POSIX.1 compatible. */ +#undef HAVE_SYS_WAIT_H + +/* Define to 1 if you have the `times' function. */ +#undef HAVE_TIMES + +/* Define to 1 if the system has the type `uintptr_t'. */ +#undef HAVE_UINTPTR_T + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to 1 if you have the `vfork' function. */ +#undef HAVE_VFORK + +/* Define to 1 if you have the header file. */ +#undef HAVE_VFORK_H + +/* Define to 1 if you have the `waitpid' function. */ +#undef HAVE_WAITPID + +/* Define to 1 if you have the header file. */ +#undef HAVE_WCHAR_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_WCTYPE_H + +/* Define to 1 if you have the `wcwidth' function. */ +#undef HAVE_WCWIDTH + +/* Define to 1 if `fork' works. */ +#undef HAVE_WORKING_FORK + +/* Define to 1 if `vfork' works. */ +#undef HAVE_WORKING_VFORK + +/* Define to 1 if the system has the type `_Bool'. */ +#undef HAVE__BOOL + +#if FILESYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +#else +# define ISSLASH(C) ((C) == '/') +#endif + +/* Define to the GNU M4 executable name. */ +#undef M4 + +/* Name of package */ +#undef PACKAGE + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* If using the C implementation of alloca, define if you know the + direction of stack growth for your system; otherwise it will be + automatically deduced at run-time. + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ +#undef STACK_DIRECTION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Define to 1 if strerror_r returns char *. */ +#undef STRERROR_R_CHAR_P + +/* Version number of package */ +#undef VERSION + +/* Define if using the dmalloc debugging malloc package */ +#undef WITH_DMALLOC + +/* Define to 1 if `lex' declares `yytext' as a `char *' by default, not a + `char[]'. */ +#undef YYTEXT_POINTER + +/* Define to 1 if on AIX 3. + System headers sometimes define this. + We just want to avoid a redefinition error message. */ +#ifndef _ALL_SOURCE +# undef _ALL_SOURCE +#endif + +/* Enable GNU extensions on systems that have them. */ +#ifndef _GNU_SOURCE +# undef _GNU_SOURCE +#endif + +/* Define to 1 if on MINIX. */ +#undef _MINIX + +/* Define to 2 if the system does not provide POSIX.1 features except with + this defined. */ +#undef _POSIX_1_SOURCE + +/* Define to 1 if you need to in order for `stat' and other things to work. */ +#undef _POSIX_SOURCE + +/* Enable extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#endif + +/* Define to `__inline__' or `__inline' if that's what the C compiler + calls it, or to nothing if 'inline' is not supported under any name. */ +#ifndef __cplusplus +#undef inline +#endif + +/* Define to 1 if the compiler is checking for lint. */ +#undef lint + +/* Define to rpl_malloc if the replacement function should be used. */ +#undef malloc + +/* Define to a type if does not define. */ +#undef mbstate_t + +/* Define to `int' if does not define. */ +#undef pid_t + +/* Define to rpl_realloc if the replacement function should be used. */ +#undef realloc + +/* Define to rpl_strnlen if the replacement function should be used. */ +#undef strnlen + +/* Define as `fork' if `vfork' does not work. */ +#undef vfork diff --git a/src/apps/bin/bison/config/Makefile.am b/src/apps/bin/bison/config/Makefile.am new file mode 100644 index 0000000000..b3a810d847 --- /dev/null +++ b/src/apps/bin/bison/config/Makefile.am @@ -0,0 +1,2 @@ +## Process this file with automake to produce Makefile.in -*-Makefile-*- +EXTRA_DIST = move-if-change prev-version.txt config.rpath diff --git a/src/apps/bin/bison/config/Makefile.in b/src/apps/bin/bison/config/Makefile.in new file mode 100644 index 0000000000..40260be8ba --- /dev/null +++ b/src/apps/bin/bison/config/Makefile.in @@ -0,0 +1,338 @@ +# Makefile.in generated by automake 1.8.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = config +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in config.guess \ + config.rpath config.sub depcomp install-sh mdate-sh missing \ + mkinstalldirs texinfo.tex ylwrap +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/alloca.m4 \ + $(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dmalloc.m4 \ + $(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/error.m4 \ + $(top_srcdir)/m4/exitfail.m4 $(top_srcdir)/m4/extensions.m4 \ + $(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gnulib.m4 $(top_srcdir)/m4/hard-locale.m4 \ + $(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/m4.m4 \ + $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbstate_t.m4 \ + $(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/obstack.m4 $(top_srcdir)/m4/onceonly.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \ + $(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stpcpy.m4 \ + $(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \ + $(top_srcdir)/m4/subpipe.m4 $(top_srcdir)/m4/timevar.m4 \ + $(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/warning.m4 \ + $(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xstrndup.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALLOCA_H = @ALLOCA_H@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOM4TE = @AUTOM4TE@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GCC = @GCC@ +GMSGFMT = @GMSGFMT@ +HAVE__BOOL = @HAVE__BOOL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +O0CFLAGS = @O0CFLAGS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STDBOOL_H = @STDBOOL_H@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VALGRIND = @VALGRIND@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WERROR_CFLAGS = @WERROR_CFLAGS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +YACC_LIBRARY = @YACC_LIBRARY@ +YACC_SCRIPT = @YACC_SCRIPT@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +EXTRA_DIST = move-if-change prev-version.txt config.rpath +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu config/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu config/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \ + uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/apps/bin/bison/config/config.guess b/src/apps/bin/bison/config/config.guess new file mode 100644 index 0000000000..51fab47709 --- /dev/null +++ b/src/apps/bin/bison/config/config.guess @@ -0,0 +1,1459 @@ +#! /bin/sh +# Attempt to guess a canonical system name. +# Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, +# 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + +timestamp='2004-03-12' + +# This file is free software; you can redistribute it and/or modify it +# under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Per Bothner . +# Please send patches to . Submit a context +# diff and a properly formatted ChangeLog entry. +# +# This script attempts to guess a canonical system name similar to +# config.sub. If it succeeds, it prints the system name on stdout, and +# exits with 0. Otherwise, it exits with 1. +# +# The plan is that this can be called by configure scripts if you +# don't specify an explicit build system type. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] + +Output the configuration name of the system \`$me' is run on. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.guess ($timestamp) + +Originally written by Per Bothner. +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" >&2 + exit 1 ;; + * ) + break ;; + esac +done + +if test $# != 0; then + echo "$me: too many arguments$help" >&2 + exit 1 +fi + +trap 'exit 1' 1 2 15 + +# CC_FOR_BUILD -- compiler used by this script. Note that the use of a +# compiler to aid in system detection is discouraged as it requires +# temporary files to be created and, as you can see below, it is a +# headache to deal with in a portable fashion. + +# Historically, `CC_FOR_BUILD' used to be named `HOST_CC'. We still +# use `HOST_CC' if defined, but it is deprecated. + +# Portable tmp directory creation inspired by the Autoconf team. + +set_cc_for_build=' +trap "exitcode=\$?; (rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null) && exit \$exitcode" 0 ; +trap "rm -f \$tmpfiles 2>/dev/null; rmdir \$tmp 2>/dev/null; exit 1" 1 2 13 15 ; +: ${TMPDIR=/tmp} ; + { tmp=`(umask 077 && mktemp -d -q "$TMPDIR/cgXXXXXX") 2>/dev/null` && test -n "$tmp" && test -d "$tmp" ; } || + { test -n "$RANDOM" && tmp=$TMPDIR/cg$$-$RANDOM && (umask 077 && mkdir $tmp) ; } || + { tmp=$TMPDIR/cg-$$ && (umask 077 && mkdir $tmp) && echo "Warning: creating insecure temp directory" >&2 ; } || + { echo "$me: cannot create a temporary directory in $TMPDIR" >&2 ; exit 1 ; } ; +dummy=$tmp/dummy ; +tmpfiles="$dummy.c $dummy.o $dummy.rel $dummy" ; +case $CC_FOR_BUILD,$HOST_CC,$CC in + ,,) echo "int x;" > $dummy.c ; + for c in cc gcc c89 c99 ; do + if ($c -c -o $dummy.o $dummy.c) >/dev/null 2>&1 ; then + CC_FOR_BUILD="$c"; break ; + fi ; + done ; + if test x"$CC_FOR_BUILD" = x ; then + CC_FOR_BUILD=no_compiler_found ; + fi + ;; + ,,*) CC_FOR_BUILD=$CC ;; + ,*,*) CC_FOR_BUILD=$HOST_CC ;; +esac ;' + +# This is needed to find uname on a Pyramid OSx when run in the BSD universe. +# (ghazi@noc.rutgers.edu 1994-08-24) +if (test -f /.attbin/uname) >/dev/null 2>&1 ; then + PATH=$PATH:/.attbin ; export PATH +fi + +UNAME_MACHINE=`(uname -m) 2>/dev/null` || UNAME_MACHINE=unknown +UNAME_RELEASE=`(uname -r) 2>/dev/null` || UNAME_RELEASE=unknown +UNAME_SYSTEM=`(uname -s) 2>/dev/null` || UNAME_SYSTEM=unknown +UNAME_VERSION=`(uname -v) 2>/dev/null` || UNAME_VERSION=unknown + +# Note: order is significant - the case branches are not exclusive. + +case "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" in + *:NetBSD:*:*) + # NetBSD (nbsd) targets should (where applicable) match one or + # more of the tupples: *-*-netbsdelf*, *-*-netbsdaout*, + # *-*-netbsdecoff* and *-*-netbsd*. For targets that recently + # switched to ELF, *-*-netbsd* would select the old + # object file format. This provides both forward + # compatibility and a consistent mechanism for selecting the + # object file format. + # + # Note: NetBSD doesn't particularly care about the vendor + # portion of the name. We always set it to "unknown". + sysctl="sysctl -n hw.machine_arch" + UNAME_MACHINE_ARCH=`(/sbin/$sysctl 2>/dev/null || \ + /usr/sbin/$sysctl 2>/dev/null || echo unknown)` + case "${UNAME_MACHINE_ARCH}" in + armeb) machine=armeb-unknown ;; + arm*) machine=arm-unknown ;; + sh3el) machine=shl-unknown ;; + sh3eb) machine=sh-unknown ;; + *) machine=${UNAME_MACHINE_ARCH}-unknown ;; + esac + # The Operating System including object format, if it has switched + # to ELF recently, or will in the future. + case "${UNAME_MACHINE_ARCH}" in + arm*|i386|m68k|ns32k|sh3*|sparc|vax) + eval $set_cc_for_build + if echo __ELF__ | $CC_FOR_BUILD -E - 2>/dev/null \ + | grep __ELF__ >/dev/null + then + # Once all utilities can be ECOFF (netbsdecoff) or a.out (netbsdaout). + # Return netbsd for either. FIX? + os=netbsd + else + os=netbsdelf + fi + ;; + *) + os=netbsd + ;; + esac + # The OS release + # Debian GNU/NetBSD machines have a different userland, and + # thus, need a distinct triplet. However, they do not need + # kernel version information, so it can be replaced with a + # suitable tag, in the style of linux-gnu. + case "${UNAME_VERSION}" in + Debian*) + release='-gnu' + ;; + *) + release=`echo ${UNAME_RELEASE}|sed -e 's/[-_].*/\./'` + ;; + esac + # Since CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM: + # contains redundant information, the shorter form: + # CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM is used. + echo "${machine}-${os}${release}" + exit 0 ;; + amd64:OpenBSD:*:*) + echo x86_64-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + amiga:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + arc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + cats:OpenBSD:*:*) + echo arm-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + hp300:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mac68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + macppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme68k:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvme88k:OpenBSD:*:*) + echo m88k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + mvmeppc:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pegasos:OpenBSD:*:*) + echo powerpc-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + pmax:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sgi:OpenBSD:*:*) + echo mipseb-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + sun3:OpenBSD:*:*) + echo m68k-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + wgrisc:OpenBSD:*:*) + echo mipsel-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:OpenBSD:*:*) + echo ${UNAME_MACHINE}-unknown-openbsd${UNAME_RELEASE} + exit 0 ;; + *:ekkoBSD:*:*) + echo ${UNAME_MACHINE}-unknown-ekkobsd${UNAME_RELEASE} + exit 0 ;; + macppc:MirBSD:*:*) + echo powerppc-unknown-mirbsd${UNAME_RELEASE} + exit 0 ;; + *:MirBSD:*:*) + echo ${UNAME_MACHINE}-unknown-mirbsd${UNAME_RELEASE} + exit 0 ;; + alpha:OSF1:*:*) + case $UNAME_RELEASE in + *4.0) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $3}'` + ;; + *5.*) + UNAME_RELEASE=`/usr/sbin/sizer -v | awk '{print $4}'` + ;; + esac + # According to Compaq, /usr/sbin/psrinfo has been available on + # OSF/1 and Tru64 systems produced since 1995. I hope that + # covers most systems running today. This code pipes the CPU + # types through head -n 1, so we only detect the type of CPU 0. + ALPHA_CPU_TYPE=`/usr/sbin/psrinfo -v | sed -n -e 's/^ The alpha \(.*\) processor.*$/\1/p' | head -n 1` + case "$ALPHA_CPU_TYPE" in + "EV4 (21064)") + UNAME_MACHINE="alpha" ;; + "EV4.5 (21064)") + UNAME_MACHINE="alpha" ;; + "LCA4 (21066/21068)") + UNAME_MACHINE="alpha" ;; + "EV5 (21164)") + UNAME_MACHINE="alphaev5" ;; + "EV5.6 (21164A)") + UNAME_MACHINE="alphaev56" ;; + "EV5.6 (21164PC)") + UNAME_MACHINE="alphapca56" ;; + "EV5.7 (21164PC)") + UNAME_MACHINE="alphapca57" ;; + "EV6 (21264)") + UNAME_MACHINE="alphaev6" ;; + "EV6.7 (21264A)") + UNAME_MACHINE="alphaev67" ;; + "EV6.8CB (21264C)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8AL (21264B)") + UNAME_MACHINE="alphaev68" ;; + "EV6.8CX (21264D)") + UNAME_MACHINE="alphaev68" ;; + "EV6.9A (21264/EV69A)") + UNAME_MACHINE="alphaev69" ;; + "EV7 (21364)") + UNAME_MACHINE="alphaev7" ;; + "EV7.9 (21364A)") + UNAME_MACHINE="alphaev79" ;; + esac + # A Pn.n version is a patched version. + # A Vn.n version is a released version. + # A Tn.n version is a released field test version. + # A Xn.n version is an unreleased experimental baselevel. + # 1.2 uses "1.2" for uname -r. + echo ${UNAME_MACHINE}-dec-osf`echo ${UNAME_RELEASE} | sed -e 's/^[PVTX]//' | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + exit 0 ;; + Alpha*:OpenVMS:*:*) + echo alpha-hp-vms + exit 0 ;; + Alpha\ *:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # Should we change UNAME_MACHINE based on the output of uname instead + # of the specific Alpha model? + echo alpha-pc-interix + exit 0 ;; + 21064:Windows_NT:50:3) + echo alpha-dec-winnt3.5 + exit 0 ;; + Amiga*:UNIX_System_V:4.0:*) + echo m68k-unknown-sysv4 + exit 0;; + *:[Aa]miga[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-amigaos + exit 0 ;; + *:[Mm]orph[Oo][Ss]:*:*) + echo ${UNAME_MACHINE}-unknown-morphos + exit 0 ;; + *:OS/390:*:*) + echo i370-ibm-openedition + exit 0 ;; + *:OS400:*:*) + echo powerpc-ibm-os400 + exit 0 ;; + arm:RISC*:1.[012]*:*|arm:riscix:1.[012]*:*) + echo arm-acorn-riscix${UNAME_RELEASE} + exit 0;; + SR2?01:HI-UX/MPP:*:* | SR8000:HI-UX/MPP:*:*) + echo hppa1.1-hitachi-hiuxmpp + exit 0;; + Pyramid*:OSx*:*:* | MIS*:OSx*:*:* | MIS*:SMP_DC-OSx*:*:*) + # akee@wpdis03.wpafb.af.mil (Earle F. Ake) contributed MIS and NILE. + if test "`(/bin/universe) 2>/dev/null`" = att ; then + echo pyramid-pyramid-sysv3 + else + echo pyramid-pyramid-bsd + fi + exit 0 ;; + NILE*:*:*:dcosx) + echo pyramid-pyramid-svr4 + exit 0 ;; + DRS?6000:unix:4.0:6*) + echo sparc-icl-nx6 + exit 0 ;; + DRS?6000:UNIX_SV:4.2*:7*) + case `/usr/bin/uname -p` in + sparc) echo sparc-icl-nx7 && exit 0 ;; + esac ;; + sun4H:SunOS:5.*:*) + echo sparc-hal-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:5.*:* | tadpole*:SunOS:5.*:*) + echo sparc-sun-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + i86pc:SunOS:5.*:*) + echo i386-pc-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:6*:*) + # According to config.sub, this is the proper way to canonicalize + # SunOS6. Hard to guess exactly what SunOS6 will be like, but + # it's likely to be more like Solaris than SunOS4. + echo sparc-sun-solaris3`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + sun4*:SunOS:*:*) + case "`/usr/bin/arch -k`" in + Series*|S4*) + UNAME_RELEASE=`uname -v` + ;; + esac + # Japanese Language versions have a version number like `4.1.3-JL'. + echo sparc-sun-sunos`echo ${UNAME_RELEASE}|sed -e 's/-/_/'` + exit 0 ;; + sun3*:SunOS:*:*) + echo m68k-sun-sunos${UNAME_RELEASE} + exit 0 ;; + sun*:*:4.2BSD:*) + UNAME_RELEASE=`(sed 1q /etc/motd | awk '{print substr($5,1,3)}') 2>/dev/null` + test "x${UNAME_RELEASE}" = "x" && UNAME_RELEASE=3 + case "`/bin/arch`" in + sun3) + echo m68k-sun-sunos${UNAME_RELEASE} + ;; + sun4) + echo sparc-sun-sunos${UNAME_RELEASE} + ;; + esac + exit 0 ;; + aushp:SunOS:*:*) + echo sparc-auspex-sunos${UNAME_RELEASE} + exit 0 ;; + # The situation for MiNT is a little confusing. The machine name + # can be virtually everything (everything which is not + # "atarist" or "atariste" at least should have a processor + # > m68000). The system name ranges from "MiNT" over "FreeMiNT" + # to the lowercase version "mint" (or "freemint"). Finally + # the system name "TOS" denotes a system which is actually not + # MiNT. But MiNT is downward compatible to TOS, so this should + # be no problem. + atarist[e]:*MiNT:*:* | atarist[e]:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + atari*:*MiNT:*:* | atari*:*mint:*:* | atarist[e]:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + *falcon*:*MiNT:*:* | *falcon*:*mint:*:* | *falcon*:*TOS:*:*) + echo m68k-atari-mint${UNAME_RELEASE} + exit 0 ;; + milan*:*MiNT:*:* | milan*:*mint:*:* | *milan*:*TOS:*:*) + echo m68k-milan-mint${UNAME_RELEASE} + exit 0 ;; + hades*:*MiNT:*:* | hades*:*mint:*:* | *hades*:*TOS:*:*) + echo m68k-hades-mint${UNAME_RELEASE} + exit 0 ;; + *:*MiNT:*:* | *:*mint:*:* | *:*TOS:*:*) + echo m68k-unknown-mint${UNAME_RELEASE} + exit 0 ;; + m68k:machten:*:*) + echo m68k-apple-machten${UNAME_RELEASE} + exit 0 ;; + powerpc:machten:*:*) + echo powerpc-apple-machten${UNAME_RELEASE} + exit 0 ;; + RISC*:Mach:*:*) + echo mips-dec-mach_bsd4.3 + exit 0 ;; + RISC*:ULTRIX:*:*) + echo mips-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + VAX*:ULTRIX*:*:*) + echo vax-dec-ultrix${UNAME_RELEASE} + exit 0 ;; + 2020:CLIX:*:* | 2430:CLIX:*:*) + echo clipper-intergraph-clix${UNAME_RELEASE} + exit 0 ;; + mips:*:*:UMIPS | mips:*:*:RISCos) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c +#ifdef __cplusplus +#include /* for printf() prototype */ + int main (int argc, char *argv[]) { +#else + int main (argc, argv) int argc; char *argv[]; { +#endif + #if defined (host_mips) && defined (MIPSEB) + #if defined (SYSTYPE_SYSV) + printf ("mips-mips-riscos%ssysv\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_SVR4) + printf ("mips-mips-riscos%ssvr4\n", argv[1]); exit (0); + #endif + #if defined (SYSTYPE_BSD43) || defined(SYSTYPE_BSD) + printf ("mips-mips-riscos%sbsd\n", argv[1]); exit (0); + #endif + #endif + exit (-1); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c \ + && $dummy `echo "${UNAME_RELEASE}" | sed -n 's/\([0-9]*\).*/\1/p'` \ + && exit 0 + echo mips-mips-riscos${UNAME_RELEASE} + exit 0 ;; + Motorola:PowerMAX_OS:*:*) + echo powerpc-motorola-powermax + exit 0 ;; + Motorola:*:4.3:PL8-*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:*:*:PowerMAX_OS | Synergy:PowerMAX_OS:*:*) + echo powerpc-harris-powermax + exit 0 ;; + Night_Hawk:Power_UNIX:*:*) + echo powerpc-harris-powerunix + exit 0 ;; + m88k:CX/UX:7*:*) + echo m88k-harris-cxux7 + exit 0 ;; + m88k:*:4*:R4*) + echo m88k-motorola-sysv4 + exit 0 ;; + m88k:*:3*:R3*) + echo m88k-motorola-sysv3 + exit 0 ;; + AViiON:dgux:*:*) + # DG/UX returns AViiON for all architectures + UNAME_PROCESSOR=`/usr/bin/uname -p` + if [ $UNAME_PROCESSOR = mc88100 ] || [ $UNAME_PROCESSOR = mc88110 ] + then + if [ ${TARGET_BINARY_INTERFACE}x = m88kdguxelfx ] || \ + [ ${TARGET_BINARY_INTERFACE}x = x ] + then + echo m88k-dg-dgux${UNAME_RELEASE} + else + echo m88k-dg-dguxbcs${UNAME_RELEASE} + fi + else + echo i586-dg-dgux${UNAME_RELEASE} + fi + exit 0 ;; + M88*:DolphinOS:*:*) # DolphinOS (SVR3) + echo m88k-dolphin-sysv3 + exit 0 ;; + M88*:*:R3*:*) + # Delta 88k system running SVR3 + echo m88k-motorola-sysv3 + exit 0 ;; + XD88*:*:*:*) # Tektronix XD88 system running UTekV (SVR3) + echo m88k-tektronix-sysv3 + exit 0 ;; + Tek43[0-9][0-9]:UTek:*:*) # Tektronix 4300 system running UTek (BSD) + echo m68k-tektronix-bsd + exit 0 ;; + *:IRIX*:*:*) + echo mips-sgi-irix`echo ${UNAME_RELEASE}|sed -e 's/-/_/g'` + exit 0 ;; + ????????:AIX?:[12].1:2) # AIX 2.2.1 or AIX 2.1.1 is RT/PC AIX. + echo romp-ibm-aix # uname -m gives an 8 hex-code CPU id + exit 0 ;; # Note that: echo "'`uname -s`'" gives 'AIX ' + i*86:AIX:*:*) + echo i386-ibm-aix + exit 0 ;; + ia64:AIX:*:*) + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${UNAME_MACHINE}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:2:3) + if grep bos325 /usr/include/stdio.h >/dev/null 2>&1; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + + main() + { + if (!__power_pc()) + exit(1); + puts("powerpc-ibm-aix3.2.5"); + exit(0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + echo rs6000-ibm-aix3.2.5 + elif grep bos324 /usr/include/stdio.h >/dev/null 2>&1; then + echo rs6000-ibm-aix3.2.4 + else + echo rs6000-ibm-aix3.2 + fi + exit 0 ;; + *:AIX:*:[45]) + IBM_CPU_ID=`/usr/sbin/lsdev -C -c processor -S available | sed 1q | awk '{ print $1 }'` + if /usr/sbin/lsattr -El ${IBM_CPU_ID} | grep ' POWER' >/dev/null 2>&1; then + IBM_ARCH=rs6000 + else + IBM_ARCH=powerpc + fi + if [ -x /usr/bin/oslevel ] ; then + IBM_REV=`/usr/bin/oslevel` + else + IBM_REV=${UNAME_VERSION}.${UNAME_RELEASE} + fi + echo ${IBM_ARCH}-ibm-aix${IBM_REV} + exit 0 ;; + *:AIX:*:*) + echo rs6000-ibm-aix + exit 0 ;; + ibmrt:4.4BSD:*|romp-ibm:BSD:*) + echo romp-ibm-bsd4.4 + exit 0 ;; + ibmrt:*BSD:*|romp-ibm:BSD:*) # covers RT/PC BSD and + echo romp-ibm-bsd${UNAME_RELEASE} # 4.3 with uname added to + exit 0 ;; # report: romp-ibm BSD 4.3 + *:BOSX:*:*) + echo rs6000-bull-bosx + exit 0 ;; + DPX/2?00:B.O.S.:*:*) + echo m68k-bull-sysv3 + exit 0 ;; + 9000/[34]??:4.3bsd:1.*:*) + echo m68k-hp-bsd + exit 0 ;; + hp300:4.4BSD:*:* | 9000/[34]??:4.3bsd:2.*:*) + echo m68k-hp-bsd4.4 + exit 0 ;; + 9000/[34678]??:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + case "${UNAME_MACHINE}" in + 9000/31? ) HP_ARCH=m68000 ;; + 9000/[34]?? ) HP_ARCH=m68k ;; + 9000/[678][0-9][0-9]) + if [ -x /usr/bin/getconf ]; then + sc_cpu_version=`/usr/bin/getconf SC_CPU_VERSION 2>/dev/null` + sc_kernel_bits=`/usr/bin/getconf SC_KERNEL_BITS 2>/dev/null` + case "${sc_cpu_version}" in + 523) HP_ARCH="hppa1.0" ;; # CPU_PA_RISC1_0 + 528) HP_ARCH="hppa1.1" ;; # CPU_PA_RISC1_1 + 532) # CPU_PA_RISC2_0 + case "${sc_kernel_bits}" in + 32) HP_ARCH="hppa2.0n" ;; + 64) HP_ARCH="hppa2.0w" ;; + '') HP_ARCH="hppa2.0" ;; # HP-UX 10.20 + esac ;; + esac + fi + if [ "${HP_ARCH}" = "" ]; then + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + + #define _HPUX_SOURCE + #include + #include + + int main () + { + #if defined(_SC_KERNEL_BITS) + long bits = sysconf(_SC_KERNEL_BITS); + #endif + long cpu = sysconf (_SC_CPU_VERSION); + + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1"); break; + case CPU_PA_RISC2_0: + #if defined(_SC_KERNEL_BITS) + switch (bits) + { + case 64: puts ("hppa2.0w"); break; + case 32: puts ("hppa2.0n"); break; + default: puts ("hppa2.0"); break; + } break; + #else /* !defined(_SC_KERNEL_BITS) */ + puts ("hppa2.0"); break; + #endif + default: puts ("hppa1.0"); break; + } + exit (0); + } +EOF + (CCOPTS= $CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null) && HP_ARCH=`$dummy` + test -z "$HP_ARCH" && HP_ARCH=hppa + fi ;; + esac + if [ ${HP_ARCH} = "hppa2.0w" ] + then + # avoid double evaluation of $set_cc_for_build + test -n "$CC_FOR_BUILD" || eval $set_cc_for_build + if echo __LP64__ | (CCOPTS= $CC_FOR_BUILD -E -) | grep __LP64__ >/dev/null + then + HP_ARCH="hppa2.0w" + else + HP_ARCH="hppa64" + fi + fi + echo ${HP_ARCH}-hp-hpux${HPUX_REV} + exit 0 ;; + ia64:HP-UX:*:*) + HPUX_REV=`echo ${UNAME_RELEASE}|sed -e 's/[^.]*.[0B]*//'` + echo ia64-hp-hpux${HPUX_REV} + exit 0 ;; + 3050*:HI-UX:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + int + main () + { + long cpu = sysconf (_SC_CPU_VERSION); + /* The order matters, because CPU_IS_HP_MC68K erroneously returns + true for CPU_PA_RISC1_0. CPU_IS_PA_RISC returns correct + results, however. */ + if (CPU_IS_PA_RISC (cpu)) + { + switch (cpu) + { + case CPU_PA_RISC1_0: puts ("hppa1.0-hitachi-hiuxwe2"); break; + case CPU_PA_RISC1_1: puts ("hppa1.1-hitachi-hiuxwe2"); break; + case CPU_PA_RISC2_0: puts ("hppa2.0-hitachi-hiuxwe2"); break; + default: puts ("hppa-hitachi-hiuxwe2"); break; + } + } + else if (CPU_IS_HP_MC68K (cpu)) + puts ("m68k-hitachi-hiuxwe2"); + else puts ("unknown-hitachi-hiuxwe2"); + exit (0); + } +EOF + $CC_FOR_BUILD -o $dummy $dummy.c && $dummy && exit 0 + echo unknown-hitachi-hiuxwe2 + exit 0 ;; + 9000/7??:4.3bsd:*:* | 9000/8?[79]:4.3bsd:*:* ) + echo hppa1.1-hp-bsd + exit 0 ;; + 9000/8??:4.3bsd:*:*) + echo hppa1.0-hp-bsd + exit 0 ;; + *9??*:MPE/iX:*:* | *3000*:MPE/iX:*:*) + echo hppa1.0-hp-mpeix + exit 0 ;; + hp7??:OSF1:*:* | hp8?[79]:OSF1:*:* ) + echo hppa1.1-hp-osf + exit 0 ;; + hp8??:OSF1:*:*) + echo hppa1.0-hp-osf + exit 0 ;; + i*86:OSF1:*:*) + if [ -x /usr/sbin/sysversion ] ; then + echo ${UNAME_MACHINE}-unknown-osf1mk + else + echo ${UNAME_MACHINE}-unknown-osf1 + fi + exit 0 ;; + parisc*:Lites*:*:*) + echo hppa1.1-hp-lites + exit 0 ;; + C1*:ConvexOS:*:* | convex:ConvexOS:C1*:*) + echo c1-convex-bsd + exit 0 ;; + C2*:ConvexOS:*:* | convex:ConvexOS:C2*:*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + C34*:ConvexOS:*:* | convex:ConvexOS:C34*:*) + echo c34-convex-bsd + exit 0 ;; + C38*:ConvexOS:*:* | convex:ConvexOS:C38*:*) + echo c38-convex-bsd + exit 0 ;; + C4*:ConvexOS:*:* | convex:ConvexOS:C4*:*) + echo c4-convex-bsd + exit 0 ;; + CRAY*Y-MP:*:*:*) + echo ymp-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*[A-Z]90:*:*:*) + echo ${UNAME_MACHINE}-cray-unicos${UNAME_RELEASE} \ + | sed -e 's/CRAY.*\([A-Z]90\)/\1/' \ + -e y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/ \ + -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*TS:*:*:*) + echo t90-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*T3E:*:*:*) + echo alphaev5-cray-unicosmk${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + CRAY*SV1:*:*:*) + echo sv1-cray-unicos${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + *:UNICOS/mp:*:*) + echo nv1-cray-unicosmp${UNAME_RELEASE} | sed -e 's/\.[^.]*$/.X/' + exit 0 ;; + F30[01]:UNIX_System_V:*:* | F700:UNIX_System_V:*:*) + FUJITSU_PROC=`uname -m | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz'` + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | sed -e 's/ /_/'` + echo "${FUJITSU_PROC}-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + 5000:UNIX_System_V:4.*:*) + FUJITSU_SYS=`uname -p | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/\///'` + FUJITSU_REL=`echo ${UNAME_RELEASE} | tr 'ABCDEFGHIJKLMNOPQRSTUVWXYZ' 'abcdefghijklmnopqrstuvwxyz' | sed -e 's/ /_/'` + echo "sparc-fujitsu-${FUJITSU_SYS}${FUJITSU_REL}" + exit 0 ;; + i*86:BSD/386:*:* | i*86:BSD/OS:*:* | *:Ascend\ Embedded/OS:*:*) + echo ${UNAME_MACHINE}-pc-bsdi${UNAME_RELEASE} + exit 0 ;; + sparc*:BSD/OS:*:*) + echo sparc-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:BSD/OS:*:*) + echo ${UNAME_MACHINE}-unknown-bsdi${UNAME_RELEASE} + exit 0 ;; + *:FreeBSD:*:*) + # Determine whether the default compiler uses glibc. + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #if __GLIBC__ >= 2 + LIBC=gnu + #else + LIBC= + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + # GNU/KFreeBSD systems have a "k" prefix to indicate we are using + # FreeBSD's kernel, but not the complete OS. + case ${LIBC} in gnu) kernel_only='k' ;; esac + echo ${UNAME_MACHINE}-unknown-${kernel_only}freebsd`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`${LIBC:+-$LIBC} + exit 0 ;; + i*:CYGWIN*:*) + echo ${UNAME_MACHINE}-pc-cygwin + exit 0 ;; + i*:MINGW*:*) + echo ${UNAME_MACHINE}-pc-mingw32 + exit 0 ;; + i*:PW*:*) + echo ${UNAME_MACHINE}-pc-pw32 + exit 0 ;; + x86:Interix*:[34]*) + echo i586-pc-interix${UNAME_RELEASE}|sed -e 's/\..*//' + exit 0 ;; + [345]86:Windows_95:* | [345]86:Windows_98:* | [345]86:Windows_NT:*) + echo i${UNAME_MACHINE}-pc-mks + exit 0 ;; + i*:Windows_NT*:* | Pentium*:Windows_NT*:*) + # How do we know it's Interix rather than the generic POSIX subsystem? + # It also conflicts with pre-2.0 versions of AT&T UWIN. Should we + # UNAME_MACHINE based on the output of uname instead of i386? + echo i586-pc-interix + exit 0 ;; + i*:UWIN*:*) + echo ${UNAME_MACHINE}-pc-uwin + exit 0 ;; + p*:CYGWIN*:*) + echo powerpcle-unknown-cygwin + exit 0 ;; + prep*:SunOS:5.*:*) + echo powerpcle-unknown-solaris2`echo ${UNAME_RELEASE}|sed -e 's/[^.]*//'` + exit 0 ;; + *:GNU:*:*) + # the GNU system + echo `echo ${UNAME_MACHINE}|sed -e 's,[-/].*$,,'`-unknown-gnu`echo ${UNAME_RELEASE}|sed -e 's,/.*$,,'` + exit 0 ;; + *:GNU/*:*:*) + # other systems with GNU libc and userland + echo ${UNAME_MACHINE}-unknown-`echo ${UNAME_SYSTEM} | sed 's,^[^/]*/,,' | tr '[A-Z]' '[a-z]'``echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'`-gnu + exit 0 ;; + i*86:Minix:*:*) + echo ${UNAME_MACHINE}-pc-minix + exit 0 ;; + arm*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + cris:Linux:*:*) + echo cris-axis-linux-gnu + exit 0 ;; + ia64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + m32r*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + m68*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + mips:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips + #undef mipsel + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mipsel + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 + ;; + mips64:Linux:*:*) + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #undef CPU + #undef mips64 + #undef mips64el + #if defined(__MIPSEL__) || defined(__MIPSEL) || defined(_MIPSEL) || defined(MIPSEL) + CPU=mips64el + #else + #if defined(__MIPSEB__) || defined(__MIPSEB) || defined(_MIPSEB) || defined(MIPSEB) + CPU=mips64 + #else + CPU= + #endif + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^CPU=` + test x"${CPU}" != x && echo "${CPU}-unknown-linux-gnu" && exit 0 + ;; + ppc:Linux:*:*) + echo powerpc-unknown-linux-gnu + exit 0 ;; + ppc64:Linux:*:*) + echo powerpc64-unknown-linux-gnu + exit 0 ;; + alpha:Linux:*:*) + case `sed -n '/^cpu model/s/^.*: \(.*\)/\1/p' < /proc/cpuinfo` in + EV5) UNAME_MACHINE=alphaev5 ;; + EV56) UNAME_MACHINE=alphaev56 ;; + PCA56) UNAME_MACHINE=alphapca56 ;; + PCA57) UNAME_MACHINE=alphapca56 ;; + EV6) UNAME_MACHINE=alphaev6 ;; + EV67) UNAME_MACHINE=alphaev67 ;; + EV68*) UNAME_MACHINE=alphaev68 ;; + esac + objdump --private-headers /bin/sh | grep ld.so.1 >/dev/null + if test "$?" = 0 ; then LIBC="libc1" ; else LIBC="" ; fi + echo ${UNAME_MACHINE}-unknown-linux-gnu${LIBC} + exit 0 ;; + parisc:Linux:*:* | hppa:Linux:*:*) + # Look for CPU level + case `grep '^cpu[^a-z]*:' /proc/cpuinfo 2>/dev/null | cut -d' ' -f2` in + PA7*) echo hppa1.1-unknown-linux-gnu ;; + PA8*) echo hppa2.0-unknown-linux-gnu ;; + *) echo hppa-unknown-linux-gnu ;; + esac + exit 0 ;; + parisc64:Linux:*:* | hppa64:Linux:*:*) + echo hppa64-unknown-linux-gnu + exit 0 ;; + s390:Linux:*:* | s390x:Linux:*:*) + echo ${UNAME_MACHINE}-ibm-linux + exit 0 ;; + sh64*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sh*:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + sparc:Linux:*:* | sparc64:Linux:*:*) + echo ${UNAME_MACHINE}-unknown-linux-gnu + exit 0 ;; + x86_64:Linux:*:*) + echo x86_64-unknown-linux-gnu + exit 0 ;; + i*86:Linux:*:*) + # The BFD linker knows what the default object file format is, so + # first see if it will tell us. cd to the root directory to prevent + # problems with other programs or directories called `ld' in the path. + # Set LC_ALL=C to ensure ld outputs messages in English. + ld_supported_targets=`cd /; LC_ALL=C ld --help 2>&1 \ + | sed -ne '/supported targets:/!d + s/[ ][ ]*/ /g + s/.*supported targets: *// + s/ .*// + p'` + case "$ld_supported_targets" in + elf32-i386) + TENTATIVE="${UNAME_MACHINE}-pc-linux-gnu" + ;; + a.out-i386-linux) + echo "${UNAME_MACHINE}-pc-linux-gnuaout" + exit 0 ;; + coff-i386) + echo "${UNAME_MACHINE}-pc-linux-gnucoff" + exit 0 ;; + "") + # Either a pre-BFD a.out linker (linux-gnuoldld) or + # one that does not give us useful --help. + echo "${UNAME_MACHINE}-pc-linux-gnuoldld" + exit 0 ;; + esac + # Determine whether the default compiler is a.out or elf + eval $set_cc_for_build + sed 's/^ //' << EOF >$dummy.c + #include + #ifdef __ELF__ + # ifdef __GLIBC__ + # if __GLIBC__ >= 2 + LIBC=gnu + # else + LIBC=gnulibc1 + # endif + # else + LIBC=gnulibc1 + # endif + #else + #ifdef __INTEL_COMPILER + LIBC=gnu + #else + LIBC=gnuaout + #endif + #endif + #ifdef __dietlibc__ + LIBC=dietlibc + #endif +EOF + eval `$CC_FOR_BUILD -E $dummy.c 2>/dev/null | grep ^LIBC=` + test x"${LIBC}" != x && echo "${UNAME_MACHINE}-pc-linux-${LIBC}" && exit 0 + test x"${TENTATIVE}" != x && echo "${TENTATIVE}" && exit 0 + ;; + i*86:DYNIX/ptx:4*:*) + # ptx 4.0 does uname -s correctly, with DYNIX/ptx in there. + # earlier versions are messed up and put the nodename in both + # sysname and nodename. + echo i386-sequent-sysv4 + exit 0 ;; + i*86:UNIX_SV:4.2MP:2.*) + # Unixware is an offshoot of SVR4, but it has its own version + # number series starting with 2... + # I am not positive that other SVR4 systems won't match this, + # I just have to hope. -- rms. + # Use sysv4.2uw... so that sysv4* matches it. + echo ${UNAME_MACHINE}-pc-sysv4.2uw${UNAME_VERSION} + exit 0 ;; + i*86:OS/2:*:*) + # If we were able to find `uname', then EMX Unix compatibility + # is probably installed. + echo ${UNAME_MACHINE}-pc-os2-emx + exit 0 ;; + i*86:XTS-300:*:STOP) + echo ${UNAME_MACHINE}-unknown-stop + exit 0 ;; + i*86:atheos:*:*) + echo ${UNAME_MACHINE}-unknown-atheos + exit 0 ;; + i*86:syllable:*:*) + echo ${UNAME_MACHINE}-pc-syllable + exit 0 ;; + i*86:LynxOS:2.*:* | i*86:LynxOS:3.[01]*:* | i*86:LynxOS:4.0*:*) + echo i386-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + i*86:*DOS:*:*) + echo ${UNAME_MACHINE}-pc-msdosdjgpp + exit 0 ;; + i*86:*:4.*:* | i*86:SYSTEM_V:4.*:*) + UNAME_REL=`echo ${UNAME_RELEASE} | sed 's/\/MP$//'` + if grep Novell /usr/include/link.h >/dev/null 2>/dev/null; then + echo ${UNAME_MACHINE}-univel-sysv${UNAME_REL} + else + echo ${UNAME_MACHINE}-pc-sysv${UNAME_REL} + fi + exit 0 ;; + i*86:*:5:[78]*) + case `/bin/uname -X | grep "^Machine"` in + *486*) UNAME_MACHINE=i486 ;; + *Pentium) UNAME_MACHINE=i586 ;; + *Pent*|*Celeron) UNAME_MACHINE=i686 ;; + esac + echo ${UNAME_MACHINE}-unknown-sysv${UNAME_RELEASE}${UNAME_SYSTEM}${UNAME_VERSION} + exit 0 ;; + i*86:*:3.2:*) + if test -f /usr/options/cb.name; then + UNAME_REL=`sed -n 's/.*Version //p' /dev/null >/dev/null ; then + UNAME_REL=`(/bin/uname -X|grep Release|sed -e 's/.*= //')` + (/bin/uname -X|grep i80486 >/dev/null) && UNAME_MACHINE=i486 + (/bin/uname -X|grep '^Machine.*Pentium' >/dev/null) \ + && UNAME_MACHINE=i586 + (/bin/uname -X|grep '^Machine.*Pent *II' >/dev/null) \ + && UNAME_MACHINE=i686 + (/bin/uname -X|grep '^Machine.*Pentium Pro' >/dev/null) \ + && UNAME_MACHINE=i686 + echo ${UNAME_MACHINE}-pc-sco$UNAME_REL + else + echo ${UNAME_MACHINE}-pc-sysv32 + fi + exit 0 ;; + pc:*:*:*) + # Left here for compatibility: + # uname -m prints for DJGPP always 'pc', but it prints nothing about + # the processor, so we play safe by assuming i386. + echo i386-pc-msdosdjgpp + exit 0 ;; + Intel:Mach:3*:*) + echo i386-pc-mach3 + exit 0 ;; + paragon:*:*:*) + echo i860-intel-osf1 + exit 0 ;; + i860:*:4.*:*) # i860-SVR4 + if grep Stardent /usr/include/sys/uadmin.h >/dev/null 2>&1 ; then + echo i860-stardent-sysv${UNAME_RELEASE} # Stardent Vistra i860-SVR4 + else # Add other i860-SVR4 vendors below as they are discovered. + echo i860-unknown-sysv${UNAME_RELEASE} # Unknown i860-SVR4 + fi + exit 0 ;; + mini*:CTIX:SYS*5:*) + # "miniframe" + echo m68010-convergent-sysv + exit 0 ;; + mc68k:UNIX:SYSTEM5:3.51m) + echo m68k-convergent-sysv + exit 0 ;; + M680?0:D-NIX:5.3:*) + echo m68k-diab-dnix + exit 0 ;; + M68*:*:R3V[567]*:*) + test -r /sysV68 && echo 'm68k-motorola-sysv' && exit 0 ;; + 3[345]??:*:4.0:3.0 | 3[34]??A:*:4.0:3.0 | 3[34]??,*:*:4.0:3.0 | 3[34]??/*:*:4.0:3.0 | 4400:*:4.0:3.0 | 4850:*:4.0:3.0 | SKA40:*:4.0:3.0 | SDS2:*:4.0:3.0 | SHG2:*:4.0:3.0) + OS_REL='' + test -r /etc/.relid \ + && OS_REL=.`sed -n 's/[^ ]* [^ ]* \([0-9][0-9]\).*/\1/p' < /etc/.relid` + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4.3${OS_REL} && exit 0 + /bin/uname -p 2>/dev/null | /bin/grep entium >/dev/null \ + && echo i586-ncr-sysv4.3${OS_REL} && exit 0 ;; + 3[34]??:*:4.0:* | 3[34]??,*:*:4.0:*) + /bin/uname -p 2>/dev/null | grep 86 >/dev/null \ + && echo i486-ncr-sysv4 && exit 0 ;; + m68*:LynxOS:2.*:* | m68*:LynxOS:3.0*:*) + echo m68k-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + mc68030:UNIX_System_V:4.*:*) + echo m68k-atari-sysv4 + exit 0 ;; + TSUNAMI:LynxOS:2.*:*) + echo sparc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + rs6000:LynxOS:2.*:*) + echo rs6000-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + PowerPC:LynxOS:2.*:* | PowerPC:LynxOS:3.[01]*:* | PowerPC:LynxOS:4.0*:*) + echo powerpc-unknown-lynxos${UNAME_RELEASE} + exit 0 ;; + SM[BE]S:UNIX_SV:*:*) + echo mips-dde-sysv${UNAME_RELEASE} + exit 0 ;; + RM*:ReliantUNIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + RM*:SINIX-*:*:*) + echo mips-sni-sysv4 + exit 0 ;; + *:SINIX-*:*:*) + if uname -p 2>/dev/null >/dev/null ; then + UNAME_MACHINE=`(uname -p) 2>/dev/null` + echo ${UNAME_MACHINE}-sni-sysv4 + else + echo ns32k-sni-sysv + fi + exit 0 ;; + PENTIUM:*:4.0*:*) # Unisys `ClearPath HMP IX 4000' SVR4/MP effort + # says + echo i586-unisys-sysv4 + exit 0 ;; + *:UNIX_System_V:4*:FTX*) + # From Gerald Hewes . + # How about differentiating between stratus architectures? -djm + echo hppa1.1-stratus-sysv4 + exit 0 ;; + *:*:*:FTX*) + # From seanf@swdc.stratus.com. + echo i860-stratus-sysv4 + exit 0 ;; + *:VOS:*:*) + # From Paul.Green@stratus.com. + echo hppa1.1-stratus-vos + exit 0 ;; + mc68*:A/UX:*:*) + echo m68k-apple-aux${UNAME_RELEASE} + exit 0 ;; + news*:NEWS-OS:6*:*) + echo mips-sony-newsos6 + exit 0 ;; + R[34]000:*System_V*:*:* | R4000:UNIX_SYSV:*:* | R*000:UNIX_SV:*:*) + if [ -d /usr/nec ]; then + echo mips-nec-sysv${UNAME_RELEASE} + else + echo mips-unknown-sysv${UNAME_RELEASE} + fi + exit 0 ;; + BeBox:BeOS:*:*) # BeOS running on hardware made by Be, PPC only. + echo powerpc-be-beos + exit 0 ;; + BeMac:BeOS:*:*) # BeOS running on Mac or Mac clone, PPC only. + echo powerpc-apple-beos + exit 0 ;; + BePC:BeOS:*:*) # BeOS running on Intel PC compatible. + echo i586-pc-beos + exit 0 ;; + SX-4:SUPER-UX:*:*) + echo sx4-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-5:SUPER-UX:*:*) + echo sx5-nec-superux${UNAME_RELEASE} + exit 0 ;; + SX-6:SUPER-UX:*:*) + echo sx6-nec-superux${UNAME_RELEASE} + exit 0 ;; + Power*:Rhapsody:*:*) + echo powerpc-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Rhapsody:*:*) + echo ${UNAME_MACHINE}-apple-rhapsody${UNAME_RELEASE} + exit 0 ;; + *:Darwin:*:*) + case `uname -p` in + *86) UNAME_PROCESSOR=i686 ;; + powerpc) UNAME_PROCESSOR=powerpc ;; + esac + echo ${UNAME_PROCESSOR}-apple-darwin${UNAME_RELEASE} + exit 0 ;; + *:procnto*:*:* | *:QNX:[0123456789]*:*) + UNAME_PROCESSOR=`uname -p` + if test "$UNAME_PROCESSOR" = "x86"; then + UNAME_PROCESSOR=i386 + UNAME_MACHINE=pc + fi + echo ${UNAME_PROCESSOR}-${UNAME_MACHINE}-nto-qnx${UNAME_RELEASE} + exit 0 ;; + *:QNX:*:4*) + echo i386-pc-qnx + exit 0 ;; + NSR-?:NONSTOP_KERNEL:*:*) + echo nsr-tandem-nsk${UNAME_RELEASE} + exit 0 ;; + *:NonStop-UX:*:*) + echo mips-compaq-nonstopux + exit 0 ;; + BS2000:POSIX*:*:*) + echo bs2000-siemens-sysv + exit 0 ;; + DS/*:UNIX_System_V:*:*) + echo ${UNAME_MACHINE}-${UNAME_SYSTEM}-${UNAME_RELEASE} + exit 0 ;; + *:Plan9:*:*) + # "uname -m" is not consistent, so use $cputype instead. 386 + # is converted to i386 for consistency with other x86 + # operating systems. + if test "$cputype" = "386"; then + UNAME_MACHINE=i386 + else + UNAME_MACHINE="$cputype" + fi + echo ${UNAME_MACHINE}-unknown-plan9 + exit 0 ;; + *:TOPS-10:*:*) + echo pdp10-unknown-tops10 + exit 0 ;; + *:TENEX:*:*) + echo pdp10-unknown-tenex + exit 0 ;; + KS10:TOPS-20:*:* | KL10:TOPS-20:*:* | TYPE4:TOPS-20:*:*) + echo pdp10-dec-tops20 + exit 0 ;; + XKL-1:TOPS-20:*:* | TYPE5:TOPS-20:*:*) + echo pdp10-xkl-tops20 + exit 0 ;; + *:TOPS-20:*:*) + echo pdp10-unknown-tops20 + exit 0 ;; + *:ITS:*:*) + echo pdp10-unknown-its + exit 0 ;; + SEI:*:*:SEIUX) + echo mips-sei-seiux${UNAME_RELEASE} + exit 0 ;; + *:DragonFly:*:*) + echo ${UNAME_MACHINE}-unknown-dragonfly`echo ${UNAME_RELEASE}|sed -e 's/[-(].*//'` + exit 0 ;; +esac + +#echo '(No uname command or uname output not recognized.)' 1>&2 +#echo "${UNAME_MACHINE}:${UNAME_SYSTEM}:${UNAME_RELEASE}:${UNAME_VERSION}" 1>&2 + +eval $set_cc_for_build +cat >$dummy.c < +# include +#endif +main () +{ +#if defined (sony) +#if defined (MIPSEB) + /* BFD wants "bsd" instead of "newsos". Perhaps BFD should be changed, + I don't know.... */ + printf ("mips-sony-bsd\n"); exit (0); +#else +#include + printf ("m68k-sony-newsos%s\n", +#ifdef NEWSOS4 + "4" +#else + "" +#endif + ); exit (0); +#endif +#endif + +#if defined (__arm) && defined (__acorn) && defined (__unix) + printf ("arm-acorn-riscix"); exit (0); +#endif + +#if defined (hp300) && !defined (hpux) + printf ("m68k-hp-bsd\n"); exit (0); +#endif + +#if defined (NeXT) +#if !defined (__ARCHITECTURE__) +#define __ARCHITECTURE__ "m68k" +#endif + int version; + version=`(hostinfo | sed -n 's/.*NeXT Mach \([0-9]*\).*/\1/p') 2>/dev/null`; + if (version < 4) + printf ("%s-next-nextstep%d\n", __ARCHITECTURE__, version); + else + printf ("%s-next-openstep%d\n", __ARCHITECTURE__, version); + exit (0); +#endif + +#if defined (MULTIMAX) || defined (n16) +#if defined (UMAXV) + printf ("ns32k-encore-sysv\n"); exit (0); +#else +#if defined (CMU) + printf ("ns32k-encore-mach\n"); exit (0); +#else + printf ("ns32k-encore-bsd\n"); exit (0); +#endif +#endif +#endif + +#if defined (__386BSD__) + printf ("i386-pc-bsd\n"); exit (0); +#endif + +#if defined (sequent) +#if defined (i386) + printf ("i386-sequent-dynix\n"); exit (0); +#endif +#if defined (ns32000) + printf ("ns32k-sequent-dynix\n"); exit (0); +#endif +#endif + +#if defined (_SEQUENT_) + struct utsname un; + + uname(&un); + + if (strncmp(un.version, "V2", 2) == 0) { + printf ("i386-sequent-ptx2\n"); exit (0); + } + if (strncmp(un.version, "V1", 2) == 0) { /* XXX is V1 correct? */ + printf ("i386-sequent-ptx1\n"); exit (0); + } + printf ("i386-sequent-ptx\n"); exit (0); + +#endif + +#if defined (vax) +# if !defined (ultrix) +# include +# if defined (BSD) +# if BSD == 43 + printf ("vax-dec-bsd4.3\n"); exit (0); +# else +# if BSD == 199006 + printf ("vax-dec-bsd4.3reno\n"); exit (0); +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# endif +# else + printf ("vax-dec-bsd\n"); exit (0); +# endif +# else + printf ("vax-dec-ultrix\n"); exit (0); +# endif +#endif + +#if defined (alliant) && defined (i860) + printf ("i860-alliant-bsd\n"); exit (0); +#endif + + exit (1); +} +EOF + +$CC_FOR_BUILD -o $dummy $dummy.c 2>/dev/null && $dummy && exit 0 + +# Apollos put the system type in the environment. + +test -d /usr/apollo && { echo ${ISP}-apollo-${SYSTYPE}; exit 0; } + +# Convex versions that predate uname can use getsysinfo(1) + +if [ -x /usr/convex/getsysinfo ] +then + case `getsysinfo -f cpu_type` in + c1*) + echo c1-convex-bsd + exit 0 ;; + c2*) + if getsysinfo -f scalar_acc + then echo c32-convex-bsd + else echo c2-convex-bsd + fi + exit 0 ;; + c34*) + echo c34-convex-bsd + exit 0 ;; + c38*) + echo c38-convex-bsd + exit 0 ;; + c4*) + echo c4-convex-bsd + exit 0 ;; + esac +fi + +cat >&2 < in order to provide the needed +information to handle your system. + +config.guess timestamp = $timestamp + +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null` + +hostinfo = `(hostinfo) 2>/dev/null` +/bin/universe = `(/bin/universe) 2>/dev/null` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null` +/bin/arch = `(/bin/arch) 2>/dev/null` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null` + +UNAME_MACHINE = ${UNAME_MACHINE} +UNAME_RELEASE = ${UNAME_RELEASE} +UNAME_SYSTEM = ${UNAME_SYSTEM} +UNAME_VERSION = ${UNAME_VERSION} +EOF + +exit 1 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/src/apps/bin/bison/config/config.rpath b/src/apps/bin/bison/config/config.rpath new file mode 100644 index 0000000000..4db13e50f6 --- /dev/null +++ b/src/apps/bin/bison/config/config.rpath @@ -0,0 +1,548 @@ +#! /bin/sh +# Output a system dependent set of variables, describing how to set the +# run time search path of shared libraries in an executable. +# +# Copyright 1996-2003 Free Software Foundation, Inc. +# Taken from GNU libtool, 2001 +# Originally by Gordon Matzigkeit , 1996 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, but +# WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +# General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +# +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. +# +# The first argument passed to this file is the canonical host specification, +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# The environment variables CC, GCC, LDFLAGS, LD, with_gnu_ld +# should be set by the caller. +# +# The set of defined variables is at the end of this script. + +# Known limitations: +# - On IRIX 6.5 with CC="cc", the run time search patch must not be longer +# than 256 bytes, otherwise the compiler driver will dump core. The only +# known workaround is to choose shorter directory names for the build +# directory and/or the installation directory. + +# All known linkers require a `.a' archive for static linking (except M$VC, +# which needs '.lib'). +libext=a +shrext=.so + +host="$1" +host_cpu=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo "$host" | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + +# Code taken from libtool.m4's AC_LIBTOOL_PROG_COMPILER_PIC. + +wl= +if test "$GCC" = yes; then + wl='-Wl,' +else + case "$host_os" in + aix*) + wl='-Wl,' + ;; + mingw* | pw32* | os2*) + ;; + hpux9* | hpux10* | hpux11*) + wl='-Wl,' + ;; + irix5* | irix6* | nonstopux*) + wl='-Wl,' + ;; + newsos6) + ;; + linux*) + case $CC in + icc|ecc) + wl='-Wl,' + ;; + ccc) + wl='-Wl,' + ;; + esac + ;; + osf3* | osf4* | osf5*) + wl='-Wl,' + ;; + sco3.2v5*) + ;; + solaris*) + wl='-Wl,' + ;; + sunos4*) + wl='-Qoption ld ' + ;; + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + wl='-Wl,' + ;; + sysv4*MP*) + ;; + uts4*) + ;; + esac +fi + +# Code taken from libtool.m4's AC_LIBTOOL_PROG_LD_SHLIBS. + +hardcode_libdir_flag_spec= +hardcode_libdir_separator= +hardcode_direct=no +hardcode_minus_L=no + +case "$host_os" in + cygwin* | mingw* | pw32*) + # FIXME: the MSVC++ port hasn't been tested in a loooong time + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + if test "$GCC" != yes; then + with_gnu_ld=no + fi + ;; + openbsd*) + with_gnu_ld=no + ;; +esac + +ld_shlibs=yes +if test "$with_gnu_ld" = yes; then + case "$host_os" in + aix3* | aix4* | aix5*) + # On AIX/PPC, the GNU linker is very broken + if test "$host_cpu" != ia64; then + ld_shlibs=no + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # Samuel A. Falvo II reports + # that the semantics of dynamic libraries on AmigaOS, at least up + # to version 4, is to share data among multiple programs linked + # with the same dynamic library. Since this doesn't match the + # behavior of shared libraries on other platforms, we can use + # them. + ld_shlibs=no + ;; + beos*) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + cygwin* | mingw* | pw32*) + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec='-L$libdir' + if $LD --help 2>&1 | grep 'auto-import' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + netbsd*) + ;; + solaris* | sysv5*) + if $LD -v 2>&1 | grep 'BFD 2\.8' > /dev/null; then + ld_shlibs=no + elif $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + sunos4*) + hardcode_direct=yes + ;; + *) + if $LD --help 2>&1 | grep ': supported targets:.* elf' > /dev/null; then + : + else + ld_shlibs=no + fi + ;; + esac + if test "$ld_shlibs" = yes; then + # Unlike libtool, we use -rpath here, not --rpath, since the documented + # option of GNU ld is called -rpath, not --rpath. + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + fi +else + case "$host_os" in + aix3*) + # Note: this linker hardcodes the directories in LIBPATH if there + # are no directories specified by -L. + hardcode_minus_L=yes + if test "$GCC" = yes; then + # Neither direct hardcoding nor static linking is supported with a + # broken collect2. + hardcode_direct=unsupported + fi + ;; + aix4* | aix5*) + if test "$host_cpu" = ia64; then + # On IA64, the linker does run time linking by default, so we don't + # have to do anything special. + aix_use_runtimelinking=no + else + aix_use_runtimelinking=no + # Test if we are trying to use run time linking or normal + # AIX style linking. If -brtl is somewhere in LDFLAGS, we + # need to do runtime linking. + case $host_os in aix4.[23]|aix4.[23].*|aix5*) + for ld_flag in $LDFLAGS; do + if (test $ld_flag = "-brtl" || test $ld_flag = "-Wl,-brtl"); then + aix_use_runtimelinking=yes + break + fi + done + esac + fi + hardcode_direct=yes + hardcode_libdir_separator=':' + if test "$GCC" = yes; then + case $host_os in aix4.[012]|aix4.[012].*) + collect2name=`${CC} -print-prog-name=collect2` + if test -f "$collect2name" && \ + strings "$collect2name" | grep resolve_lib_name >/dev/null + then + # We have reworked collect2 + hardcode_direct=yes + else + # We have old collect2 + hardcode_direct=unsupported + hardcode_minus_L=yes + hardcode_libdir_flag_spec='-L$libdir' + hardcode_libdir_separator= + fi + esac + fi + # Begin _LT_AC_SYS_LIBPATH_AIX. + echo 'int main () { return 0; }' > conftest.c + ${CC} ${LDFLAGS} conftest.c -o conftest + aix_libpath=`dump -H conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + if test -z "$aix_libpath"; then + aix_libpath=`dump -HX64 conftest 2>/dev/null | sed -n -e '/Import File Strings/,/^$/ { /^0/ { s/^0 *\(.*\)$/\1/; p; } +}'` + fi + if test -z "$aix_libpath"; then + aix_libpath="/usr/lib:/lib" + fi + rm -f conftest.c conftest + # End _LT_AC_SYS_LIBPATH_AIX. + if test "$aix_use_runtimelinking" = yes; then + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + else + if test "$host_cpu" = ia64; then + hardcode_libdir_flag_spec='${wl}-R $libdir:/usr/lib:/lib' + else + hardcode_libdir_flag_spec='${wl}-blibpath:$libdir:'"$aix_libpath" + fi + fi + ;; + amigaos*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + # see comment about different semantics on the GNU ld section + ld_shlibs=no + ;; + bsdi4*) + ;; + cygwin* | mingw* | pw32*) + # When not using gcc, we currently assume that we are using + # Microsoft Visual C++. + # hardcode_libdir_flag_spec is actually meaningless, as there is + # no search path for DLLs. + hardcode_libdir_flag_spec=' ' + libext=lib + ;; + darwin* | rhapsody*) + if $CC -v 2>&1 | grep 'Apple' >/dev/null ; then + hardcode_direct=no + fi + ;; + dgux*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + freebsd1*) + ld_shlibs=no + ;; + freebsd2.2*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + freebsd2*) + hardcode_direct=yes + hardcode_minus_L=yes + ;; + freebsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + hpux9*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + hpux10* | hpux11*) + if test "$with_gnu_ld" = no; then + case "$host_cpu" in + hppa*64*) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=no + ;; + ia64*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=no + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + *) + hardcode_libdir_flag_spec='${wl}+b ${wl}$libdir' + hardcode_libdir_separator=: + hardcode_direct=yes + # hardcode_minus_L: Not really in the search PATH, + # but as the default location of the library. + hardcode_minus_L=yes + ;; + esac + fi + ;; + irix5* | irix6* | nonstopux*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + netbsd*) + hardcode_libdir_flag_spec='-R$libdir' + hardcode_direct=yes + ;; + newsos6) + hardcode_direct=yes + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + openbsd*) + hardcode_direct=yes + if test -z "`echo __ELF__ | $CC -E - | grep __ELF__`" || test "$host_os-$host_cpu" = "openbsd2.8-powerpc"; then + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + else + case "$host_os" in + openbsd[01].* | openbsd2.[0-7] | openbsd2.[0-7].*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + *) + hardcode_libdir_flag_spec='${wl}-rpath,$libdir' + ;; + esac + fi + ;; + os2*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_minus_L=yes + ;; + osf3*) + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + hardcode_libdir_separator=: + ;; + osf4* | osf5*) + if test "$GCC" = yes; then + hardcode_libdir_flag_spec='${wl}-rpath ${wl}$libdir' + else + # Both cc and cxx compiler support -rpath directly + hardcode_libdir_flag_spec='-rpath $libdir' + fi + hardcode_libdir_separator=: + ;; + sco3.2v5*) + ;; + solaris*) + hardcode_libdir_flag_spec='-R$libdir' + ;; + sunos4*) + hardcode_libdir_flag_spec='-L$libdir' + hardcode_direct=yes + hardcode_minus_L=yes + ;; + sysv4) + case $host_vendor in + sni) + hardcode_direct=yes # is this really true??? + ;; + siemens) + hardcode_direct=no + ;; + motorola) + hardcode_direct=no #Motorola manual says yes, but my tests say they lie + ;; + esac + ;; + sysv4.3*) + ;; + sysv4*MP*) + if test -d /usr/nec; then + ld_shlibs=yes + fi + ;; + sysv4.2uw2*) + hardcode_direct=yes + hardcode_minus_L=no + ;; + sysv5OpenUNIX8* | sysv5UnixWare7* | sysv5uw[78]* | unixware7*) + ;; + sysv5*) + hardcode_libdir_flag_spec= + ;; + uts4*) + hardcode_libdir_flag_spec='-L$libdir' + ;; + *) + ld_shlibs=no + ;; + esac +fi + +# Check dynamic linker characteristics +# Code taken from libtool.m4's AC_LIBTOOL_SYS_DYNAMIC_LINKER. +libname_spec='lib$name' +case "$host_os" in + aix3*) + ;; + aix4* | aix5*) + ;; + amigaos*) + ;; + beos*) + ;; + bsdi4*) + ;; + cygwin* | mingw* | pw32*) + shrext=.dll + ;; + darwin* | rhapsody*) + shrext=.dylib + ;; + dgux*) + ;; + freebsd1*) + ;; + freebsd*) + ;; + gnu*) + ;; + hpux9* | hpux10* | hpux11*) + case "$host_cpu" in + ia64*) + shrext=.so + ;; + hppa*64*) + shrext=.sl + ;; + *) + shrext=.sl + ;; + esac + ;; + irix5* | irix6* | nonstopux*) + case "$host_os" in + irix5* | nonstopux*) + libsuff= shlibsuff= + ;; + *) + case $LD in + *-32|*"-32 "|*-melf32bsmip|*"-melf32bsmip ") libsuff= shlibsuff= ;; + *-n32|*"-n32 "|*-melf32bmipn32|*"-melf32bmipn32 ") libsuff=32 shlibsuff=N32 ;; + *-64|*"-64 "|*-melf64bmip|*"-melf64bmip ") libsuff=64 shlibsuff=64 ;; + *) libsuff= shlibsuff= ;; + esac + ;; + esac + ;; + linux*oldld* | linux*aout* | linux*coff*) + ;; + linux*) + ;; + netbsd*) + ;; + newsos6) + ;; + nto-qnx) + ;; + openbsd*) + ;; + os2*) + libname_spec='$name' + shrext=.dll + ;; + osf3* | osf4* | osf5*) + ;; + sco3.2v5*) + ;; + solaris*) + ;; + sunos4*) + ;; + sysv4 | sysv4.2uw2* | sysv4.3* | sysv5*) + ;; + sysv4*MP*) + ;; + uts4*) + ;; +esac + +sed_quote_subst='s/\(["`$\\]\)/\\\1/g' +escaped_wl=`echo "X$wl" | sed -e 's/^X//' -e "$sed_quote_subst"` +shlibext=`echo "$shrext" | sed -e 's,^\.,,'` +escaped_hardcode_libdir_flag_spec=`echo "X$hardcode_libdir_flag_spec" | sed -e 's/^X//' -e "$sed_quote_subst"` + +sed -e 's/^\([a-zA-Z0-9_]*\)=/acl_cv_\1=/' <. Submit a context +# diff and a properly formatted ChangeLog entry. +# +# Configuration subroutine to validate and canonicalize a configuration type. +# Supply the specified configuration type as an argument. +# If it is invalid, we print an error message on stderr and exit with code 1. +# Otherwise, we print the canonical config type on stdout and succeed. + +# This file is supposed to be the same for all GNU packages +# and recognize all the CPU types, system types and aliases +# that are meaningful with *any* GNU software. +# Each package is responsible for reporting which valid configurations +# it does not support. The user should be able to distinguish +# a failure to support a valid configuration from a meaningless +# configuration. + +# The goal of this file is to map all the various variations of a given +# machine specification into a single specification in the form: +# CPU_TYPE-MANUFACTURER-OPERATING_SYSTEM +# or in some cases, the newer four-part form: +# CPU_TYPE-MANUFACTURER-KERNEL-OPERATING_SYSTEM +# It is wrong to echo any other type of specification. + +me=`echo "$0" | sed -e 's,.*/,,'` + +usage="\ +Usage: $0 [OPTION] CPU-MFR-OPSYS + $0 [OPTION] ALIAS + +Canonicalize a configuration name. + +Operation modes: + -h, --help print this help, then exit + -t, --time-stamp print date of last modification, then exit + -v, --version print version number, then exit + +Report bugs and patches to ." + +version="\ +GNU config.sub ($timestamp) + +Copyright (C) 1992, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001 +Free Software Foundation, Inc. + +This is free software; see the source for copying conditions. There is NO +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE." + +help=" +Try \`$me --help' for more information." + +# Parse command line +while test $# -gt 0 ; do + case $1 in + --time-stamp | --time* | -t ) + echo "$timestamp" ; exit 0 ;; + --version | -v ) + echo "$version" ; exit 0 ;; + --help | --h* | -h ) + echo "$usage"; exit 0 ;; + -- ) # Stop option processing + shift; break ;; + - ) # Use stdin as input. + break ;; + -* ) + echo "$me: invalid option $1$help" + exit 1 ;; + + *local*) + # First pass through any local machine types. + echo $1 + exit 0;; + + * ) + break ;; + esac +done + +case $# in + 0) echo "$me: missing argument$help" >&2 + exit 1;; + 1) ;; + *) echo "$me: too many arguments$help" >&2 + exit 1;; +esac + +# Separate what the user gave into CPU-COMPANY and OS or KERNEL-OS (if any). +# Here we must recognize all the valid KERNEL-OS combinations. +maybe_os=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\2/'` +case $maybe_os in + nto-qnx* | linux-gnu* | linux-dietlibc | linux-uclibc* | uclinux-uclibc* | uclinux-gnu* | \ + kfreebsd*-gnu* | knetbsd*-gnu* | netbsd*-gnu* | storm-chaos* | os2-emx* | rtmk-nova*) + os=-$maybe_os + basic_machine=`echo $1 | sed 's/^\(.*\)-\([^-]*-[^-]*\)$/\1/'` + ;; + *) + basic_machine=`echo $1 | sed 's/-[^-]*$//'` + if [ $basic_machine != $1 ] + then os=`echo $1 | sed 's/.*-/-/'` + else os=; fi + ;; +esac + +### Let's recognize common machines as not being operating systems so +### that things like config.sub decstation-3100 work. We also +### recognize some manufacturers as not being operating systems, so we +### can provide default operating systems below. +case $os in + -sun*os*) + # Prevent following clause from handling this invalid input. + ;; + -dec* | -mips* | -sequent* | -encore* | -pc532* | -sgi* | -sony* | \ + -att* | -7300* | -3300* | -delta* | -motorola* | -sun[234]* | \ + -unicom* | -ibm* | -next | -hp | -isi* | -apollo | -altos* | \ + -convergent* | -ncr* | -news | -32* | -3600* | -3100* | -hitachi* |\ + -c[123]* | -convex* | -sun | -crds | -omron* | -dg | -ultra | -tti* | \ + -harris | -dolphin | -highlevel | -gould | -cbm | -ns | -masscomp | \ + -apple | -axis) + os= + basic_machine=$1 + ;; + -sim | -cisco | -oki | -wec | -winbond) + os= + basic_machine=$1 + ;; + -scout) + ;; + -wrs) + os=-vxworks + basic_machine=$1 + ;; + -chorusos*) + os=-chorusos + basic_machine=$1 + ;; + -chorusrdb) + os=-chorusrdb + basic_machine=$1 + ;; + -hiux*) + os=-hiuxwe2 + ;; + -sco5) + os=-sco3.2v5 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco4) + os=-sco3.2v4 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2.[4-9]*) + os=`echo $os | sed -e 's/sco3.2./sco3.2v/'` + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco3.2v[4-9]*) + # Don't forget version if it is 3.2v4 or newer. + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -sco*) + os=-sco3.2v2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -udk*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -isc) + os=-isc2.2 + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -clix*) + basic_machine=clipper-intergraph + ;; + -isc*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-pc/'` + ;; + -lynx*) + os=-lynxos + ;; + -ptx*) + basic_machine=`echo $1 | sed -e 's/86-.*/86-sequent/'` + ;; + -windowsnt*) + os=`echo $os | sed -e 's/windowsnt/winnt/'` + ;; + -psos*) + os=-psos + ;; + -mint | -mint[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; +esac + +# Decode aliases for certain CPU-COMPANY combinations. +case $basic_machine in + # Recognize the basic CPU types without company name. + # Some are omitted here because they have special meanings below. + 1750a | 580 \ + | a29k \ + | alpha | alphaev[4-8] | alphaev56 | alphaev6[78] | alphapca5[67] \ + | alpha64 | alpha64ev[4-8] | alpha64ev56 | alpha64ev6[78] | alpha64pca5[67] \ + | am33_2.0 \ + | arc | arm | arm[bl]e | arme[lb] | armv[2345] | armv[345][lb] | avr \ + | c4x | clipper \ + | d10v | d30v | dlx | dsp16xx \ + | fr30 | frv \ + | h8300 | h8500 | hppa | hppa1.[01] | hppa2.0 | hppa2.0[nw] | hppa64 \ + | i370 | i860 | i960 | ia64 \ + | ip2k | iq2000 \ + | m32r | m32rle | m68000 | m68k | m88k | mcore \ + | mips | mipsbe | mipseb | mipsel | mipsle \ + | mips16 \ + | mips64 | mips64el \ + | mips64vr | mips64vrel \ + | mips64orion | mips64orionel \ + | mips64vr4100 | mips64vr4100el \ + | mips64vr4300 | mips64vr4300el \ + | mips64vr5000 | mips64vr5000el \ + | mipsisa32 | mipsisa32el \ + | mipsisa32r2 | mipsisa32r2el \ + | mipsisa64 | mipsisa64el \ + | mipsisa64r2 | mipsisa64r2el \ + | mipsisa64sb1 | mipsisa64sb1el \ + | mipsisa64sr71k | mipsisa64sr71kel \ + | mipstx39 | mipstx39el \ + | mn10200 | mn10300 \ + | msp430 \ + | ns16k | ns32k \ + | openrisc | or32 \ + | pdp10 | pdp11 | pj | pjl \ + | powerpc | powerpc64 | powerpc64le | powerpcle | ppcbe \ + | pyramid \ + | sh | sh[1234] | sh[23]e | sh[34]eb | shbe | shle | sh[1234]le | sh3ele \ + | sh64 | sh64le \ + | sparc | sparc64 | sparc86x | sparclet | sparclite | sparcv8 | sparcv9 | sparcv9b \ + | strongarm \ + | tahoe | thumb | tic4x | tic80 | tron \ + | v850 | v850e \ + | we32k \ + | x86 | xscale | xstormy16 | xtensa \ + | z8k) + basic_machine=$basic_machine-unknown + ;; + m6811 | m68hc11 | m6812 | m68hc12) + # Motorola 68HC11/12. + basic_machine=$basic_machine-unknown + os=-none + ;; + m88110 | m680[12346]0 | m683?2 | m68360 | m5200 | v70 | w65 | z8k) + ;; + + # We use `pc' rather than `unknown' + # because (1) that's what they normally are, and + # (2) the word "unknown" tends to confuse beginning users. + i*86 | x86_64) + basic_machine=$basic_machine-pc + ;; + # Object if more than one company name word. + *-*-*) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; + # Recognize the basic CPU types with company name. + 580-* \ + | a29k-* \ + | alpha-* | alphaev[4-8]-* | alphaev56-* | alphaev6[78]-* \ + | alpha64-* | alpha64ev[4-8]-* | alpha64ev56-* | alpha64ev6[78]-* \ + | alphapca5[67]-* | alpha64pca5[67]-* | arc-* \ + | arm-* | armbe-* | armle-* | armeb-* | armv*-* \ + | avr-* \ + | bs2000-* \ + | c[123]* | c30-* | [cjt]90-* | c4x-* | c54x-* | c55x-* | c6x-* \ + | clipper-* | cydra-* \ + | d10v-* | d30v-* | dlx-* \ + | elxsi-* \ + | f30[01]-* | f700-* | fr30-* | frv-* | fx80-* \ + | h8300-* | h8500-* \ + | hppa-* | hppa1.[01]-* | hppa2.0-* | hppa2.0[nw]-* | hppa64-* \ + | i*86-* | i860-* | i960-* | ia64-* \ + | ip2k-* | iq2000-* \ + | m32r-* | m32rle-* \ + | m68000-* | m680[012346]0-* | m68360-* | m683?2-* | m68k-* \ + | m88110-* | m88k-* | mcore-* \ + | mips-* | mipsbe-* | mipseb-* | mipsel-* | mipsle-* \ + | mips16-* \ + | mips64-* | mips64el-* \ + | mips64vr-* | mips64vrel-* \ + | mips64orion-* | mips64orionel-* \ + | mips64vr4100-* | mips64vr4100el-* \ + | mips64vr4300-* | mips64vr4300el-* \ + | mips64vr5000-* | mips64vr5000el-* \ + | mipsisa32-* | mipsisa32el-* \ + | mipsisa32r2-* | mipsisa32r2el-* \ + | mipsisa64-* | mipsisa64el-* \ + | mipsisa64r2-* | mipsisa64r2el-* \ + | mipsisa64sb1-* | mipsisa64sb1el-* \ + | mipsisa64sr71k-* | mipsisa64sr71kel-* \ + | mipstx39-* | mipstx39el-* \ + | msp430-* \ + | none-* | np1-* | nv1-* | ns16k-* | ns32k-* \ + | orion-* \ + | pdp10-* | pdp11-* | pj-* | pjl-* | pn-* | power-* \ + | powerpc-* | powerpc64-* | powerpc64le-* | powerpcle-* | ppcbe-* \ + | pyramid-* \ + | romp-* | rs6000-* \ + | sh-* | sh[1234]-* | sh[23]e-* | sh[34]eb-* | shbe-* \ + | shle-* | sh[1234]le-* | sh3ele-* | sh64-* | sh64le-* \ + | sparc-* | sparc64-* | sparc86x-* | sparclet-* | sparclite-* \ + | sparcv8-* | sparcv9-* | sparcv9b-* | strongarm-* | sv1-* | sx?-* \ + | tahoe-* | thumb-* \ + | tic30-* | tic4x-* | tic54x-* | tic55x-* | tic6x-* | tic80-* \ + | tron-* \ + | v850-* | v850e-* | vax-* \ + | we32k-* \ + | x86-* | x86_64-* | xps100-* | xscale-* | xstormy16-* \ + | xtensa-* \ + | ymp-* \ + | z8k-*) + ;; + # Recognize the various machine names and aliases which stand + # for a CPU type and a company and sometimes even an OS. + 386bsd) + basic_machine=i386-unknown + os=-bsd + ;; + 3b1 | 7300 | 7300-att | att-7300 | pc7300 | safari | unixpc) + basic_machine=m68000-att + ;; + 3b*) + basic_machine=we32k-att + ;; + a29khif) + basic_machine=a29k-amd + os=-udi + ;; + abacus) + basic_machine=abacus-unknown + ;; + adobe68k) + basic_machine=m68010-adobe + os=-scout + ;; + alliant | fx80) + basic_machine=fx80-alliant + ;; + altos | altos3068) + basic_machine=m68k-altos + ;; + am29k) + basic_machine=a29k-none + os=-bsd + ;; + amd64) + basic_machine=x86_64-pc + ;; + amd64-*) + basic_machine=x86_64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + amdahl) + basic_machine=580-amdahl + os=-sysv + ;; + amiga | amiga-*) + basic_machine=m68k-unknown + ;; + amigaos | amigados) + basic_machine=m68k-unknown + os=-amigaos + ;; + amigaunix | amix) + basic_machine=m68k-unknown + os=-sysv4 + ;; + apollo68) + basic_machine=m68k-apollo + os=-sysv + ;; + apollo68bsd) + basic_machine=m68k-apollo + os=-bsd + ;; + aux) + basic_machine=m68k-apple + os=-aux + ;; + balance) + basic_machine=ns32k-sequent + os=-dynix + ;; + c90) + basic_machine=c90-cray + os=-unicos + ;; + convex-c1) + basic_machine=c1-convex + os=-bsd + ;; + convex-c2) + basic_machine=c2-convex + os=-bsd + ;; + convex-c32) + basic_machine=c32-convex + os=-bsd + ;; + convex-c34) + basic_machine=c34-convex + os=-bsd + ;; + convex-c38) + basic_machine=c38-convex + os=-bsd + ;; + cray | j90) + basic_machine=j90-cray + os=-unicos + ;; + cr16c) + basic_machine=cr16c-unknown + os=-elf + ;; + crds | unos) + basic_machine=m68k-crds + ;; + cris | cris-* | etrax*) + basic_machine=cris-axis + ;; + crx) + basic_machine=crx-unknown + os=-elf + ;; + da30 | da30-*) + basic_machine=m68k-da30 + ;; + decstation | decstation-3100 | pmax | pmax-* | pmin | dec3100 | decstatn) + basic_machine=mips-dec + ;; + decsystem10* | dec10*) + basic_machine=pdp10-dec + os=-tops10 + ;; + decsystem20* | dec20*) + basic_machine=pdp10-dec + os=-tops20 + ;; + delta | 3300 | motorola-3300 | motorola-delta \ + | 3300-motorola | delta-motorola) + basic_machine=m68k-motorola + ;; + delta88) + basic_machine=m88k-motorola + os=-sysv3 + ;; + dpx20 | dpx20-*) + basic_machine=rs6000-bull + os=-bosx + ;; + dpx2* | dpx2*-bull) + basic_machine=m68k-bull + os=-sysv3 + ;; + ebmon29k) + basic_machine=a29k-amd + os=-ebmon + ;; + elxsi) + basic_machine=elxsi-elxsi + os=-bsd + ;; + encore | umax | mmax) + basic_machine=ns32k-encore + ;; + es1800 | OSE68k | ose68k | ose | OSE) + basic_machine=m68k-ericsson + os=-ose + ;; + fx2800) + basic_machine=i860-alliant + ;; + genix) + basic_machine=ns32k-ns + ;; + gmicro) + basic_machine=tron-gmicro + os=-sysv + ;; + go32) + basic_machine=i386-pc + os=-go32 + ;; + h3050r* | hiux*) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + h8300hms) + basic_machine=h8300-hitachi + os=-hms + ;; + h8300xray) + basic_machine=h8300-hitachi + os=-xray + ;; + h8500hms) + basic_machine=h8500-hitachi + os=-hms + ;; + harris) + basic_machine=m88k-harris + os=-sysv3 + ;; + hp300-*) + basic_machine=m68k-hp + ;; + hp300bsd) + basic_machine=m68k-hp + os=-bsd + ;; + hp300hpux) + basic_machine=m68k-hp + os=-hpux + ;; + hp3k9[0-9][0-9] | hp9[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k2[0-9][0-9] | hp9k31[0-9]) + basic_machine=m68000-hp + ;; + hp9k3[2-9][0-9]) + basic_machine=m68k-hp + ;; + hp9k6[0-9][0-9] | hp6[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hp9k7[0-79][0-9] | hp7[0-79][0-9]) + basic_machine=hppa1.1-hp + ;; + hp9k78[0-9] | hp78[0-9]) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[67]1 | hp8[67]1 | hp9k80[24] | hp80[24] | hp9k8[78]9 | hp8[78]9 | hp9k893 | hp893) + # FIXME: really hppa2.0-hp + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][13679] | hp8[0-9][13679]) + basic_machine=hppa1.1-hp + ;; + hp9k8[0-9][0-9] | hp8[0-9][0-9]) + basic_machine=hppa1.0-hp + ;; + hppa-next) + os=-nextstep3 + ;; + hppaosf) + basic_machine=hppa1.1-hp + os=-osf + ;; + hppro) + basic_machine=hppa1.1-hp + os=-proelf + ;; + i370-ibm* | ibm*) + basic_machine=i370-ibm + ;; +# I'm not sure what "Sysv32" means. Should this be sysv3.2? + i*86v32) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv32 + ;; + i*86v4*) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv4 + ;; + i*86v) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-sysv + ;; + i*86sol2) + basic_machine=`echo $1 | sed -e 's/86.*/86-pc/'` + os=-solaris2 + ;; + i386mach) + basic_machine=i386-mach + os=-mach + ;; + i386-vsta | vsta) + basic_machine=i386-unknown + os=-vsta + ;; + iris | iris4d) + basic_machine=mips-sgi + case $os in + -irix*) + ;; + *) + os=-irix4 + ;; + esac + ;; + isi68 | isi) + basic_machine=m68k-isi + os=-sysv + ;; + m88k-omron*) + basic_machine=m88k-omron + ;; + magnum | m3230) + basic_machine=mips-mips + os=-sysv + ;; + merlin) + basic_machine=ns32k-utek + os=-sysv + ;; + mingw32) + basic_machine=i386-pc + os=-mingw32 + ;; + miniframe) + basic_machine=m68000-convergent + ;; + *mint | -mint[0-9]* | *MiNT | *MiNT[0-9]*) + basic_machine=m68k-atari + os=-mint + ;; + mips3*-*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'` + ;; + mips3*) + basic_machine=`echo $basic_machine | sed -e 's/mips3/mips64/'`-unknown + ;; + mmix*) + basic_machine=mmix-knuth + os=-mmixware + ;; + monitor) + basic_machine=m68k-rom68k + os=-coff + ;; + morphos) + basic_machine=powerpc-unknown + os=-morphos + ;; + msdos) + basic_machine=i386-pc + os=-msdos + ;; + mvs) + basic_machine=i370-ibm + os=-mvs + ;; + ncr3000) + basic_machine=i486-ncr + os=-sysv4 + ;; + netbsd386) + basic_machine=i386-unknown + os=-netbsd + ;; + netwinder) + basic_machine=armv4l-rebel + os=-linux + ;; + news | news700 | news800 | news900) + basic_machine=m68k-sony + os=-newsos + ;; + news1000) + basic_machine=m68030-sony + os=-newsos + ;; + news-3600 | risc-news) + basic_machine=mips-sony + os=-newsos + ;; + necv70) + basic_machine=v70-nec + os=-sysv + ;; + next | m*-next ) + basic_machine=m68k-next + case $os in + -nextstep* ) + ;; + -ns2*) + os=-nextstep2 + ;; + *) + os=-nextstep3 + ;; + esac + ;; + nh3000) + basic_machine=m68k-harris + os=-cxux + ;; + nh[45]000) + basic_machine=m88k-harris + os=-cxux + ;; + nindy960) + basic_machine=i960-intel + os=-nindy + ;; + mon960) + basic_machine=i960-intel + os=-mon960 + ;; + nonstopux) + basic_machine=mips-compaq + os=-nonstopux + ;; + np1) + basic_machine=np1-gould + ;; + nv1) + basic_machine=nv1-cray + os=-unicosmp + ;; + nsr-tandem) + basic_machine=nsr-tandem + ;; + op50n-* | op60c-*) + basic_machine=hppa1.1-oki + os=-proelf + ;; + or32 | or32-*) + basic_machine=or32-unknown + os=-coff + ;; + os400) + basic_machine=powerpc-ibm + os=-os400 + ;; + OSE68000 | ose68000) + basic_machine=m68000-ericsson + os=-ose + ;; + os68k) + basic_machine=m68k-none + os=-os68k + ;; + pa-hitachi) + basic_machine=hppa1.1-hitachi + os=-hiuxwe2 + ;; + paragon) + basic_machine=i860-intel + os=-osf + ;; + pbd) + basic_machine=sparc-tti + ;; + pbb) + basic_machine=m68k-tti + ;; + pc532 | pc532-*) + basic_machine=ns32k-pc532 + ;; + pentium | p5 | k5 | k6 | nexgen | viac3) + basic_machine=i586-pc + ;; + pentiumpro | p6 | 6x86 | athlon | athlon_*) + basic_machine=i686-pc + ;; + pentiumii | pentium2 | pentiumiii | pentium3) + basic_machine=i686-pc + ;; + pentium4) + basic_machine=i786-pc + ;; + pentium-* | p5-* | k5-* | k6-* | nexgen-* | viac3-*) + basic_machine=i586-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumpro-* | p6-* | 6x86-* | athlon-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentiumii-* | pentium2-* | pentiumiii-* | pentium3-*) + basic_machine=i686-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pentium4-*) + basic_machine=i786-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + pn) + basic_machine=pn-gould + ;; + power) basic_machine=power-ibm + ;; + ppc) basic_machine=powerpc-unknown + ;; + ppc-*) basic_machine=powerpc-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppcle | powerpclittle | ppc-le | powerpc-little) + basic_machine=powerpcle-unknown + ;; + ppcle-* | powerpclittle-*) + basic_machine=powerpcle-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64) basic_machine=powerpc64-unknown + ;; + ppc64-*) basic_machine=powerpc64-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ppc64le | powerpc64little | ppc64-le | powerpc64-little) + basic_machine=powerpc64le-unknown + ;; + ppc64le-* | powerpc64little-*) + basic_machine=powerpc64le-`echo $basic_machine | sed 's/^[^-]*-//'` + ;; + ps2) + basic_machine=i386-ibm + ;; + pw32) + basic_machine=i586-unknown + os=-pw32 + ;; + rom68k) + basic_machine=m68k-rom68k + os=-coff + ;; + rm[46]00) + basic_machine=mips-siemens + ;; + rtpc | rtpc-*) + basic_machine=romp-ibm + ;; + s390 | s390-*) + basic_machine=s390-ibm + ;; + s390x | s390x-*) + basic_machine=s390x-ibm + ;; + sa29200) + basic_machine=a29k-amd + os=-udi + ;; + sb1) + basic_machine=mipsisa64sb1-unknown + ;; + sb1el) + basic_machine=mipsisa64sb1el-unknown + ;; + sei) + basic_machine=mips-sei + os=-seiux + ;; + sequent) + basic_machine=i386-sequent + ;; + sh) + basic_machine=sh-hitachi + os=-hms + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparclite-wrs | simso-wrs) + basic_machine=sparclite-wrs + os=-vxworks + ;; + sps7) + basic_machine=m68k-bull + os=-sysv2 + ;; + spur) + basic_machine=spur-unknown + ;; + st2000) + basic_machine=m68k-tandem + ;; + stratus) + basic_machine=i860-stratus + os=-sysv4 + ;; + sun2) + basic_machine=m68000-sun + ;; + sun2os3) + basic_machine=m68000-sun + os=-sunos3 + ;; + sun2os4) + basic_machine=m68000-sun + os=-sunos4 + ;; + sun3os3) + basic_machine=m68k-sun + os=-sunos3 + ;; + sun3os4) + basic_machine=m68k-sun + os=-sunos4 + ;; + sun4os3) + basic_machine=sparc-sun + os=-sunos3 + ;; + sun4os4) + basic_machine=sparc-sun + os=-sunos4 + ;; + sun4sol2) + basic_machine=sparc-sun + os=-solaris2 + ;; + sun3 | sun3-*) + basic_machine=m68k-sun + ;; + sun4) + basic_machine=sparc-sun + ;; + sun386 | sun386i | roadrunner) + basic_machine=i386-sun + ;; + sv1) + basic_machine=sv1-cray + os=-unicos + ;; + symmetry) + basic_machine=i386-sequent + os=-dynix + ;; + t3e) + basic_machine=alphaev5-cray + os=-unicos + ;; + t90) + basic_machine=t90-cray + os=-unicos + ;; + tic54x | c54x*) + basic_machine=tic54x-unknown + os=-coff + ;; + tic55x | c55x*) + basic_machine=tic55x-unknown + os=-coff + ;; + tic6x | c6x*) + basic_machine=tic6x-unknown + os=-coff + ;; + tx39) + basic_machine=mipstx39-unknown + ;; + tx39el) + basic_machine=mipstx39el-unknown + ;; + toad1) + basic_machine=pdp10-xkl + os=-tops20 + ;; + tower | tower-32) + basic_machine=m68k-ncr + ;; + tpf) + basic_machine=s390x-ibm + os=-tpf + ;; + udi29k) + basic_machine=a29k-amd + os=-udi + ;; + ultra3) + basic_machine=a29k-nyu + os=-sym1 + ;; + v810 | necv810) + basic_machine=v810-nec + os=-none + ;; + vaxv) + basic_machine=vax-dec + os=-sysv + ;; + vms) + basic_machine=vax-dec + os=-vms + ;; + vpp*|vx|vx-*) + basic_machine=f301-fujitsu + ;; + vxworks960) + basic_machine=i960-wrs + os=-vxworks + ;; + vxworks68) + basic_machine=m68k-wrs + os=-vxworks + ;; + vxworks29k) + basic_machine=a29k-wrs + os=-vxworks + ;; + w65*) + basic_machine=w65-wdc + os=-none + ;; + w89k-*) + basic_machine=hppa1.1-winbond + os=-proelf + ;; + xps | xps100) + basic_machine=xps100-honeywell + ;; + ymp) + basic_machine=ymp-cray + os=-unicos + ;; + z8k-*-coff) + basic_machine=z8k-unknown + os=-sim + ;; + none) + basic_machine=none-none + os=-none + ;; + +# Here we handle the default manufacturer of certain CPU types. It is in +# some cases the only manufacturer, in others, it is the most popular. + w89k) + basic_machine=hppa1.1-winbond + ;; + op50n) + basic_machine=hppa1.1-oki + ;; + op60c) + basic_machine=hppa1.1-oki + ;; + romp) + basic_machine=romp-ibm + ;; + rs6000) + basic_machine=rs6000-ibm + ;; + vax) + basic_machine=vax-dec + ;; + pdp10) + # there are many clones, so DEC is not a safe bet + basic_machine=pdp10-unknown + ;; + pdp11) + basic_machine=pdp11-dec + ;; + we32k) + basic_machine=we32k-att + ;; + sh3 | sh4 | sh[34]eb | sh[1234]le | sh[23]ele) + basic_machine=sh-unknown + ;; + sh64) + basic_machine=sh64-unknown + ;; + sparc | sparcv8 | sparcv9 | sparcv9b) + basic_machine=sparc-sun + ;; + cydra) + basic_machine=cydra-cydrome + ;; + orion) + basic_machine=orion-highlevel + ;; + orion105) + basic_machine=clipper-highlevel + ;; + mac | mpw | mac-mpw) + basic_machine=m68k-apple + ;; + pmac | pmac-mpw) + basic_machine=powerpc-apple + ;; + *-unknown) + # Make sure to match an already-canonicalized machine name. + ;; + *) + echo Invalid configuration \`$1\': machine \`$basic_machine\' not recognized 1>&2 + exit 1 + ;; +esac + +# Here we canonicalize certain aliases for manufacturers. +case $basic_machine in + *-digital*) + basic_machine=`echo $basic_machine | sed 's/digital.*/dec/'` + ;; + *-commodore*) + basic_machine=`echo $basic_machine | sed 's/commodore.*/cbm/'` + ;; + *) + ;; +esac + +# Decode manufacturer-specific aliases for certain operating systems. + +if [ x"$os" != x"" ] +then +case $os in + # First match some system type aliases + # that might get confused with valid system types. + # -solaris* is a basic system type, with this one exception. + -solaris1 | -solaris1.*) + os=`echo $os | sed -e 's|solaris1|sunos4|'` + ;; + -solaris) + os=-solaris2 + ;; + -svr4*) + os=-sysv4 + ;; + -unixware*) + os=-sysv4.2uw + ;; + -gnu/linux*) + os=`echo $os | sed -e 's|gnu/linux|linux-gnu|'` + ;; + # First accept the basic system types. + # The portable systems comes first. + # Each alternative MUST END IN A *, to match a version number. + # -sysv* is not here because it comes later, after sysvr4. + -gnu* | -bsd* | -mach* | -minix* | -genix* | -ultrix* | -irix* \ + | -*vms* | -sco* | -esix* | -isc* | -aix* | -sunos | -sunos[34]*\ + | -hpux* | -unos* | -osf* | -luna* | -dgux* | -solaris* | -sym* \ + | -amigaos* | -amigados* | -msdos* | -newsos* | -unicos* | -aof* \ + | -aos* \ + | -nindy* | -vxsim* | -vxworks* | -ebmon* | -hms* | -mvs* \ + | -clix* | -riscos* | -uniplus* | -iris* | -rtu* | -xenix* \ + | -hiux* | -386bsd* | -knetbsd* | -mirbsd* | -netbsd* | -openbsd* \ + | -ekkobsd* | -kfreebsd* | -freebsd* | -riscix* | -lynxos* \ + | -bosx* | -nextstep* | -cxux* | -aout* | -elf* | -oabi* \ + | -ptx* | -coff* | -ecoff* | -winnt* | -domain* | -vsta* \ + | -udi* | -eabi* | -lites* | -ieee* | -go32* | -aux* \ + | -chorusos* | -chorusrdb* \ + | -cygwin* | -pe* | -psos* | -moss* | -proelf* | -rtems* \ + | -mingw32* | -linux-gnu* | -linux-uclibc* | -uxpv* | -beos* | -mpeix* | -udk* \ + | -interix* | -uwin* | -mks* | -rhapsody* | -darwin* | -opened* \ + | -openstep* | -oskit* | -conix* | -pw32* | -nonstopux* \ + | -storm-chaos* | -tops10* | -tenex* | -tops20* | -its* \ + | -os2* | -vos* | -palmos* | -uclinux* | -nucleus* \ + | -morphos* | -superux* | -rtmk* | -rtmk-nova* | -windiss* \ + | -powermax* | -dnix* | -nx6 | -nx7 | -sei* | -dragonfly*) + # Remember, each alternative MUST END IN *, to match a version number. + ;; + -qnx*) + case $basic_machine in + x86-* | i*86-*) + ;; + *) + os=-nto$os + ;; + esac + ;; + -nto-qnx*) + ;; + -nto*) + os=`echo $os | sed -e 's|nto|nto-qnx|'` + ;; + -sim | -es1800* | -hms* | -xray | -os68k* | -none* | -v88r* \ + | -windows* | -osx | -abug | -netware* | -os9* | -beos* \ + | -macos* | -mpw* | -magic* | -mmixware* | -mon960* | -lnews*) + ;; + -mac*) + os=`echo $os | sed -e 's|mac|macos|'` + ;; + -linux-dietlibc) + os=-linux-dietlibc + ;; + -linux*) + os=`echo $os | sed -e 's|linux|linux-gnu|'` + ;; + -sunos5*) + os=`echo $os | sed -e 's|sunos5|solaris2|'` + ;; + -sunos6*) + os=`echo $os | sed -e 's|sunos6|solaris3|'` + ;; + -opened*) + os=-openedition + ;; + -os400*) + os=-os400 + ;; + -wince*) + os=-wince + ;; + -osfrose*) + os=-osfrose + ;; + -osf*) + os=-osf + ;; + -utek*) + os=-bsd + ;; + -dynix*) + os=-bsd + ;; + -acis*) + os=-aos + ;; + -atheos*) + os=-atheos + ;; + -syllable*) + os=-syllable + ;; + -386bsd) + os=-bsd + ;; + -ctix* | -uts*) + os=-sysv + ;; + -nova*) + os=-rtmk-nova + ;; + -ns2 ) + os=-nextstep2 + ;; + -nsk*) + os=-nsk + ;; + # Preserve the version number of sinix5. + -sinix5.*) + os=`echo $os | sed -e 's|sinix|sysv|'` + ;; + -sinix*) + os=-sysv4 + ;; + -tpf*) + os=-tpf + ;; + -triton*) + os=-sysv3 + ;; + -oss*) + os=-sysv3 + ;; + -svr4) + os=-sysv4 + ;; + -svr3) + os=-sysv3 + ;; + -sysvr4) + os=-sysv4 + ;; + # This must come after -sysvr4. + -sysv*) + ;; + -ose*) + os=-ose + ;; + -es1800*) + os=-ose + ;; + -xenix) + os=-xenix + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + os=-mint + ;; + -aros*) + os=-aros + ;; + -kaos*) + os=-kaos + ;; + -none) + ;; + *) + # Get rid of the `-' at the beginning of $os. + os=`echo $os | sed 's/[^-]*-//'` + echo Invalid configuration \`$1\': system \`$os\' not recognized 1>&2 + exit 1 + ;; +esac +else + +# Here we handle the default operating systems that come with various machines. +# The value should be what the vendor currently ships out the door with their +# machine or put another way, the most popular os provided with the machine. + +# Note that if you're going to try to match "-MANUFACTURER" here (say, +# "-sun"), then you have to tell the case statement up towards the top +# that MANUFACTURER isn't an operating system. Otherwise, code above +# will signal an error saying that MANUFACTURER isn't an operating +# system, and we'll never get to this point. + +case $basic_machine in + *-acorn) + os=-riscix1.2 + ;; + arm*-rebel) + os=-linux + ;; + arm*-semi) + os=-aout + ;; + c4x-* | tic4x-*) + os=-coff + ;; + # This must come before the *-dec entry. + pdp10-*) + os=-tops20 + ;; + pdp11-*) + os=-none + ;; + *-dec | vax-*) + os=-ultrix4.2 + ;; + m68*-apollo) + os=-domain + ;; + i386-sun) + os=-sunos4.0.2 + ;; + m68000-sun) + os=-sunos3 + # This also exists in the configure program, but was not the + # default. + # os=-sunos4 + ;; + m68*-cisco) + os=-aout + ;; + mips*-cisco) + os=-elf + ;; + mips*-*) + os=-elf + ;; + or32-*) + os=-coff + ;; + *-tti) # must be before sparc entry or we get the wrong os. + os=-sysv3 + ;; + sparc-* | *-sun) + os=-sunos4.1.1 + ;; + *-be) + os=-beos + ;; + *-ibm) + os=-aix + ;; + *-wec) + os=-proelf + ;; + *-winbond) + os=-proelf + ;; + *-oki) + os=-proelf + ;; + *-hp) + os=-hpux + ;; + *-hitachi) + os=-hiux + ;; + i860-* | *-att | *-ncr | *-altos | *-motorola | *-convergent) + os=-sysv + ;; + *-cbm) + os=-amigaos + ;; + *-dg) + os=-dgux + ;; + *-dolphin) + os=-sysv3 + ;; + m68k-ccur) + os=-rtu + ;; + m88k-omron*) + os=-luna + ;; + *-next ) + os=-nextstep + ;; + *-sequent) + os=-ptx + ;; + *-crds) + os=-unos + ;; + *-ns) + os=-genix + ;; + i370-*) + os=-mvs + ;; + *-next) + os=-nextstep3 + ;; + *-gould) + os=-sysv + ;; + *-highlevel) + os=-bsd + ;; + *-encore) + os=-bsd + ;; + *-sgi) + os=-irix + ;; + *-siemens) + os=-sysv4 + ;; + *-masscomp) + os=-rtu + ;; + f30[01]-fujitsu | f700-fujitsu) + os=-uxpv + ;; + *-rom68k) + os=-coff + ;; + *-*bug) + os=-coff + ;; + *-apple) + os=-macos + ;; + *-atari*) + os=-mint + ;; + *) + os=-none + ;; +esac +fi + +# Here we handle the case where we know the os, and the CPU type, but not the +# manufacturer. We pick the logical manufacturer. +vendor=unknown +case $basic_machine in + *-unknown) + case $os in + -riscix*) + vendor=acorn + ;; + -sunos*) + vendor=sun + ;; + -aix*) + vendor=ibm + ;; + -beos*) + vendor=be + ;; + -hpux*) + vendor=hp + ;; + -mpeix*) + vendor=hp + ;; + -hiux*) + vendor=hitachi + ;; + -unos*) + vendor=crds + ;; + -dgux*) + vendor=dg + ;; + -luna*) + vendor=omron + ;; + -genix*) + vendor=ns + ;; + -mvs* | -opened*) + vendor=ibm + ;; + -os400*) + vendor=ibm + ;; + -ptx*) + vendor=sequent + ;; + -tpf*) + vendor=ibm + ;; + -vxsim* | -vxworks* | -windiss*) + vendor=wrs + ;; + -aux*) + vendor=apple + ;; + -hms*) + vendor=hitachi + ;; + -mpw* | -macos*) + vendor=apple + ;; + -*mint | -mint[0-9]* | -*MiNT | -MiNT[0-9]*) + vendor=atari + ;; + -vos*) + vendor=stratus + ;; + esac + basic_machine=`echo $basic_machine | sed "s/unknown/$vendor/"` + ;; +esac + +echo $basic_machine$os +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "timestamp='" +# time-stamp-format: "%:y-%02m-%02d" +# time-stamp-end: "'" +# End: diff --git a/src/apps/bin/bison/config/depcomp b/src/apps/bin/bison/config/depcomp new file mode 100644 index 0000000000..25bdb18892 --- /dev/null +++ b/src/apps/bin/bison/config/depcomp @@ -0,0 +1,526 @@ +#! /bin/sh +# depcomp - compile a program generating dependencies as side-effects + +scriptversion=2004-04-25.13 + +# Copyright (C) 1999, 2000, 2003, 2004 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# Originally written by Alexandre Oliva . + +case $1 in + '') + echo "$0: No command. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: depcomp [--help] [--version] PROGRAM [ARGS] + +Run PROGRAMS ARGS to compile a file, generating dependencies +as side-effects. + +Environment variables: + depmode Dependency tracking mode. + source Source file read by `PROGRAMS ARGS'. + object Object file output by `PROGRAMS ARGS'. + depfile Dependency file to output. + tmpdepfile Temporary file to use when outputing dependencies. + libtool Whether libtool is used (yes/no). + +Report bugs to . +EOF + exit 0 + ;; + -v | --v*) + echo "depcomp $scriptversion" + exit 0 + ;; +esac + +if test -z "$depmode" || test -z "$source" || test -z "$object"; then + echo "depcomp: Variables source, object and depmode must be set" 1>&2 + exit 1 +fi +# `libtool' can also be set to `yes' or `no'. + +if test -z "$depfile"; then + base=`echo "$object" | sed -e 's,^.*/,,' -e 's,\.\([^.]*\)$,.P\1,'` + dir=`echo "$object" | sed 's,/.*$,/,'` + if test "$dir" = "$object"; then + dir= + fi + # FIXME: should be _deps on DOS. + depfile="$dir.deps/$base" +fi + +tmpdepfile=${tmpdepfile-`echo "$depfile" | sed 's/\.\([^.]*\)$/.T\1/'`} + +rm -f "$tmpdepfile" + +# Some modes work just like other modes, but use different flags. We +# parameterize here, but still list the modes in the big case below, +# to make depend.m4 easier to write. Note that we *cannot* use a case +# here, because this file can only contain one case statement. +if test "$depmode" = hp; then + # HP compiler uses -M and no extra arg. + gccflag=-M + depmode=gcc +fi + +if test "$depmode" = dashXmstdout; then + # This is just like dashmstdout with a different argument. + dashmflag=-xM + depmode=dashmstdout +fi + +case "$depmode" in +gcc3) +## gcc 3 implements dependency tracking that does exactly what +## we want. Yay! Note: for some reason libtool 1.4 doesn't like +## it if -MD -MP comes after the -MF stuff. Hmm. + "$@" -MT "$object" -MD -MP -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + mv "$tmpdepfile" "$depfile" + ;; + +gcc) +## There are various ways to get dependency output from gcc. Here's +## why we pick this rather obscure method: +## - Don't want to use -MD because we'd like the dependencies to end +## up in a subdir. Having to rename by hand is ugly. +## (We might end up doing this anyway to support other compilers.) +## - The DEPENDENCIES_OUTPUT environment variable makes gcc act like +## -MM, not -M (despite what the docs say). +## - Using -M directly means running the compiler twice (even worse +## than renaming). + if test -z "$gccflag"; then + gccflag=-MD, + fi + "$@" -Wp,"$gccflag$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + echo "$object : \\" > "$depfile" + alpha=ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz +## The second -e expression handles DOS-style file names with drive letters. + sed -e 's/^[^:]*: / /' \ + -e 's/^['$alpha']:\/[^:]*: / /' < "$tmpdepfile" >> "$depfile" +## This next piece of magic avoids the `deleted header file' problem. +## The problem is that when a header file which appears in a .P file +## is deleted, the dependency causes make to die (because there is +## typically no way to rebuild the header). We avoid this by adding +## dummy dependencies for each header file. Too bad gcc doesn't do +## this for us directly. + tr ' ' ' +' < "$tmpdepfile" | +## Some versions of gcc put a space before the `:'. On the theory +## that the space means something, we add a space to the output as +## well. +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +hp) + # This case exists only to let depend.m4 do its work. It works by + # looking at the text of this script. This case will never be run, + # since it is checked for above. + exit 1 + ;; + +sgi) + if test "$libtool" = yes; then + "$@" "-Wp,-MDupdate,$tmpdepfile" + else + "$@" -MDupdate "$tmpdepfile" + fi + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + + if test -f "$tmpdepfile"; then # yes, the sourcefile depend on other files + echo "$object : \\" > "$depfile" + + # Clip off the initial element (the dependent). Don't try to be + # clever and replace this with sed code, as IRIX sed won't handle + # lines with more than a fixed number of characters (4096 in + # IRIX 6.2 sed, 8192 in IRIX 6.5). We also remove comment lines; + # the IRIX cc adds comments like `#:fec' to the end of the + # dependency line. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' | \ + tr ' +' ' ' >> $depfile + echo >> $depfile + + # The second pass generates a dummy entry for each header file. + tr ' ' ' +' < "$tmpdepfile" \ + | sed -e 's/^.*\.o://' -e 's/#.*$//' -e '/^$/ d' -e 's/$/:/' \ + >> $depfile + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +aix) + # The C for AIX Compiler uses -M and outputs the dependencies + # in a .u file. In older versions, this file always lives in the + # current directory. Also, the AIX compiler puts `$object:' at the + # start of each line; $object doesn't have directory information. + # Version 6 uses the directory in both cases. + stripped=`echo "$object" | sed 's/\(.*\)\..*$/\1/'` + tmpdepfile="$stripped.u" + if test "$libtool" = yes; then + "$@" -Wc,-M + else + "$@" -M + fi + stat=$? + + if test -f "$tmpdepfile"; then : + else + stripped=`echo "$stripped" | sed 's,^.*/,,'` + tmpdepfile="$stripped.u" + fi + + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + + if test -f "$tmpdepfile"; then + outname="$stripped.o" + # Each line is of the form `foo.o: dependent.h'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed -e "s,^$outname:,$object :," < "$tmpdepfile" > "$depfile" + sed -e "s,^$outname: \(.*\)$,\1:," < "$tmpdepfile" >> "$depfile" + else + # The sourcefile does not contain any dependencies, so just + # store a dummy comment line, to avoid errors with the Makefile + # "include basename.Plo" scheme. + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +icc) + # Intel's C compiler understands `-MD -MF file'. However on + # icc -MD -MF foo.d -c -o sub/foo.o sub/foo.c + # ICC 7.0 will fill foo.d with something like + # foo.o: sub/foo.c + # foo.o: sub/foo.h + # which is wrong. We want: + # sub/foo.o: sub/foo.c + # sub/foo.o: sub/foo.h + # sub/foo.c: + # sub/foo.h: + # ICC 7.1 will output + # foo.o: sub/foo.c sub/foo.h + # and will wrap long lines using \ : + # foo.o: sub/foo.c ... \ + # sub/foo.h ... \ + # ... + + "$@" -MD -MF "$tmpdepfile" + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile" + exit $stat + fi + rm -f "$depfile" + # Each line is of the form `foo.o: dependent.h', + # or `foo.o: dep1.h dep2.h \', or ` dep3.h dep4.h \'. + # Do two passes, one to just change these to + # `$object: dependent.h' and one to simply `dependent.h:'. + sed "s,^[^:]*:,$object :," < "$tmpdepfile" > "$depfile" + # Some versions of the HPUX 10.20 sed can't process this invocation + # correctly. Breaking it into two sed invocations is a workaround. + sed 's,^[^:]*: \(.*\)$,\1,;s/^\\$//;/^$/d;/:$/d' < "$tmpdepfile" | + sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +tru64) + # The Tru64 compiler uses -MD to generate dependencies as a side + # effect. `cc -MD -o foo.o ...' puts the dependencies into `foo.o.d'. + # At least on Alpha/Redhat 6.1, Compaq CCC V6.2-504 seems to put + # dependencies in `foo.d' instead, so we check for that too. + # Subdirectories are respected. + dir=`echo "$object" | sed -e 's|/[^/]*$|/|'` + test "x$dir" = "x$object" && dir= + base=`echo "$object" | sed -e 's|^.*/||' -e 's/\.o$//' -e 's/\.lo$//'` + + if test "$libtool" = yes; then + # Dependencies are output in .lo.d with libtool 1.4. + # They are output in .o.d with libtool 1.5. + tmpdepfile1="$dir.libs/$base.lo.d" + tmpdepfile2="$dir.libs/$base.o.d" + tmpdepfile3="$dir.libs/$base.d" + "$@" -Wc,-MD + else + tmpdepfile1="$dir$base.o.d" + tmpdepfile2="$dir$base.d" + tmpdepfile3="$dir$base.d" + "$@" -MD + fi + + stat=$? + if test $stat -eq 0; then : + else + rm -f "$tmpdepfile1" "$tmpdepfile2" "$tmpdepfile3" + exit $stat + fi + + if test -f "$tmpdepfile1"; then + tmpdepfile="$tmpdepfile1" + elif test -f "$tmpdepfile2"; then + tmpdepfile="$tmpdepfile2" + else + tmpdepfile="$tmpdepfile3" + fi + if test -f "$tmpdepfile"; then + sed -e "s,^.*\.[a-z]*:,$object:," < "$tmpdepfile" > "$depfile" + # That's a tab and a space in the []. + sed -e 's,^.*\.[a-z]*:[ ]*,,' -e 's,$,:,' < "$tmpdepfile" >> "$depfile" + else + echo "#dummy" > "$depfile" + fi + rm -f "$tmpdepfile" + ;; + +#nosideeffect) + # This comment above is used by automake to tell side-effect + # dependency tracking mechanisms from slower ones. + +dashmstdout) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + test -z "$dashmflag" && dashmflag=-M + # Require at least two characters before searching for `:' + # in the target name. This is to cope with DOS-style filenames: + # a dependency such as `c:/foo/bar' could be seen as target `c' otherwise. + "$@" $dashmflag | + sed 's:^[ ]*[^: ][^:][^:]*\:[ ]*:'"$object"'\: :' > "$tmpdepfile" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + tr ' ' ' +' < "$tmpdepfile" | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +dashXmstdout) + # This case only exists to satisfy depend.m4. It is never actually + # run, as this mode is specially recognized in the preamble. + exit 1 + ;; + +makedepend) + "$@" || exit $? + # Remove any Libtool call + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + # X makedepend + shift + cleared=no + for arg in "$@"; do + case $cleared in + no) + set ""; shift + cleared=yes ;; + esac + case "$arg" in + -D*|-I*) + set fnord "$@" "$arg"; shift ;; + # Strip any option that makedepend may not understand. Remove + # the object too, otherwise makedepend will parse it as a source file. + -*|$object) + ;; + *) + set fnord "$@" "$arg"; shift ;; + esac + done + obj_suffix="`echo $object | sed 's/^.*\././'`" + touch "$tmpdepfile" + ${MAKEDEPEND-makedepend} -o"$obj_suffix" -f"$tmpdepfile" "$@" + rm -f "$depfile" + cat < "$tmpdepfile" > "$depfile" + sed '1,2d' "$tmpdepfile" | tr ' ' ' +' | \ +## Some versions of the HPUX 10.20 sed can't process this invocation +## correctly. Breaking it into two sed invocations is a workaround. + sed -e 's/^\\$//' -e '/^$/d' -e '/:$/d' | sed -e 's/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" "$tmpdepfile".bak + ;; + +cpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout. + "$@" || exit $? + + # Remove the call to Libtool. + if test "$libtool" = yes; then + while test $1 != '--mode=compile'; do + shift + done + shift + fi + + # Remove `-o $object'. + IFS=" " + for arg + do + case $arg in + -o) + shift + ;; + $object) + shift + ;; + *) + set fnord "$@" "$arg" + shift # fnord + shift # $arg + ;; + esac + done + + "$@" -E | + sed -n '/^# [0-9][0-9]* "\([^"]*\)".*/ s:: \1 \\:p' | + sed '$ s: \\$::' > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + cat < "$tmpdepfile" >> "$depfile" + sed < "$tmpdepfile" '/^$/d;s/^ //;s/ \\$//;s/$/ :/' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +msvisualcpp) + # Important note: in order to support this mode, a compiler *must* + # always write the preprocessed file to stdout, regardless of -o, + # because we must use -o when running libtool. + "$@" || exit $? + IFS=" " + for arg + do + case "$arg" in + "-Gm"|"/Gm"|"-Gi"|"/Gi"|"-ZI"|"/ZI") + set fnord "$@" + shift + shift + ;; + *) + set fnord "$@" "$arg" + shift + shift + ;; + esac + done + "$@" -E | + sed -n '/^#line [0-9][0-9]* "\([^"]*\)"/ s::echo "`cygpath -u \\"\1\\"`":p' | sort | uniq > "$tmpdepfile" + rm -f "$depfile" + echo "$object : \\" > "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s:: \1 \\:p' >> "$depfile" + echo " " >> "$depfile" + . "$tmpdepfile" | sed 's% %\\ %g' | sed -n '/^\(.*\)$/ s::\1\::p' >> "$depfile" + rm -f "$tmpdepfile" + ;; + +none) + exec "$@" + ;; + +*) + echo "Unknown depmode $depmode" 1>&2 + exit 1 + ;; +esac + +exit 0 + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/src/apps/bin/bison/config/install-sh b/src/apps/bin/bison/config/install-sh new file mode 100644 index 0000000000..e4160c991d --- /dev/null +++ b/src/apps/bin/bison/config/install-sh @@ -0,0 +1,325 @@ +#!/bin/sh +# install - install a program, script, or datafile + +scriptversion=2004-04-01.17 + +# This originates from X11R5 (mit/util/scripts/install.sh), which was +# later released in X11R6 (xc/config/util/install.sh) with the +# following copyright and license. +# +# Copyright (C) 1994 X Consortium +# +# Permission is hereby granted, free of charge, to any person obtaining a copy +# of this software and associated documentation files (the "Software"), to +# deal in the Software without restriction, including without limitation the +# rights to use, copy, modify, merge, publish, distribute, sublicense, and/or +# sell copies of the Software, and to permit persons to whom the Software is +# furnished to do so, subject to the following conditions: +# +# The above copyright notice and this permission notice shall be included in +# all copies or substantial portions of the Software. +# +# THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +# IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +# FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +# X CONSORTIUM BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN +# AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNEC- +# TION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +# +# Except as contained in this notice, the name of the X Consortium shall not +# be used in advertising or otherwise to promote the sale, use or other deal- +# ings in this Software without prior written authorization from the X Consor- +# tium. +# +# +# FSF changes to this file are in the public domain. +# +# Calling this script install-sh is preferred over install.sh, to prevent +# `make' implicit rules from creating a file called install from it +# when there is no Makefile. +# +# This script is compatible with the BSD install script, but was written +# from scratch. It can only install one file at a time, a restriction +# shared with many OS's install programs. + +# set DOITPROG to echo to test this script + +# Don't use :- since 4.3BSD and earlier shells don't like it. +doit="${DOITPROG-}" + +# put in absolute paths if you don't have them in your path; or use env. vars. + +mvprog="${MVPROG-mv}" +cpprog="${CPPROG-cp}" +chmodprog="${CHMODPROG-chmod}" +chownprog="${CHOWNPROG-chown}" +chgrpprog="${CHGRPPROG-chgrp}" +stripprog="${STRIPPROG-strip}" +rmprog="${RMPROG-rm}" +mkdirprog="${MKDIRPROG-mkdir}" + +transformbasename= +transform_arg= +instcmd="$mvprog" +chmodcmd="$chmodprog 0755" +chowncmd= +chgrpcmd= +stripcmd= +rmcmd="$rmprog -f" +mvcmd="$mvprog" +src= +dst= +dir_arg= + +usage="Usage: $0 [OPTION]... SRCFILE DSTFILE + or: $0 [OPTION]... SRCFILES... DIRECTORY + or: $0 -d DIRECTORIES... + +In the first form, install SRCFILE to DSTFILE, removing SRCFILE by default. +In the second, create the directory path DIR. + +Options: +-b=TRANSFORMBASENAME +-c copy source (using $cpprog) instead of moving (using $mvprog). +-d create directories instead of installing files. +-g GROUP $chgrp installed files to GROUP. +-m MODE $chmod installed files to MODE. +-o USER $chown installed files to USER. +-s strip installed files (using $stripprog). +-t=TRANSFORM +--help display this help and exit. +--version display version info and exit. + +Environment variables override the default commands: + CHGRPPROG CHMODPROG CHOWNPROG CPPROG MKDIRPROG MVPROG RMPROG STRIPPROG +" + +while test -n "$1"; do + case $1 in + -b=*) transformbasename=`echo $1 | sed 's/-b=//'` + shift + continue;; + + -c) instcmd=$cpprog + shift + continue;; + + -d) dir_arg=true + shift + continue;; + + -g) chgrpcmd="$chgrpprog $2" + shift + shift + continue;; + + --help) echo "$usage"; exit 0;; + + -m) chmodcmd="$chmodprog $2" + shift + shift + continue;; + + -o) chowncmd="$chownprog $2" + shift + shift + continue;; + + -s) stripcmd=$stripprog + shift + continue;; + + -t=*) transformarg=`echo $1 | sed 's/-t=//'` + shift + continue;; + + --version) echo "$0 $scriptversion"; exit 0;; + + *) # When -d is used, all remaining arguments are directories to create. + test -n "$dir_arg" && break + # Otherwise, the last argument is the destination. Remove it from $@. + for arg + do + if test -n "$dstarg"; then + # $@ is not empty: it contains at least $arg. + set fnord "$@" "$dstarg" + shift # fnord + fi + shift # arg + dstarg=$arg + done + break;; + esac +done + +if test -z "$1"; then + if test -z "$dir_arg"; then + echo "$0: no input file specified." >&2 + exit 1 + fi + # It's OK to call `install-sh -d' without argument. + # This can happen when creating conditional directories. + exit 0 +fi + +for src +do + # Protect names starting with `-'. + case $src in + -*) src=./$src ;; + esac + + if test -n "$dir_arg"; then + dst=$src + src= + + if test -d "$dst"; then + instcmd=: + chmodcmd= + else + instcmd=$mkdirprog + fi + else + # Waiting for this to be detected by the "$instcmd $src $dsttmp" command + # might cause directories to be created, which would be especially bad + # if $src (and thus $dsttmp) contains '*'. + if test ! -f "$src" && test ! -d "$src"; then + echo "$0: $src does not exist." >&2 + exit 1 + fi + + if test -z "$dstarg"; then + echo "$0: no destination specified." >&2 + exit 1 + fi + + dst=$dstarg + # Protect names starting with `-'. + case $dst in + -*) dst=./$dst ;; + esac + + # If destination is a directory, append the input filename; won't work + # if double slashes aren't ignored. + if test -d "$dst"; then + dst=$dst/`basename "$src"` + fi + fi + + # This sed command emulates the dirname command. + dstdir=`echo "$dst" | sed -e 's,[^/]*$,,;s,/$,,;s,^$,.,'` + + # Make sure that the destination directory exists. + + # Skip lots of stat calls in the usual case. + if test ! -d "$dstdir"; then + defaultIFS=' + ' + IFS="${IFS-$defaultIFS}" + + oIFS=$IFS + # Some sh's can't handle IFS=/ for some reason. + IFS='%' + set - `echo "$dstdir" | sed -e 's@/@%@g' -e 's@^%@/@'` + IFS=$oIFS + + pathcomp= + + while test $# -ne 0 ; do + pathcomp=$pathcomp$1 + shift + if test ! -d "$pathcomp"; then + $mkdirprog "$pathcomp" || lasterr=$? + # mkdir can fail with a `File exist' error in case several + # install-sh are creating the directory concurrently. This + # is OK. + test ! -d "$pathcomp" && { (exit ${lasterr-1}); exit; } + fi + pathcomp=$pathcomp/ + done + fi + + if test -n "$dir_arg"; then + $doit $instcmd "$dst" \ + && { test -z "$chowncmd" || $doit $chowncmd "$dst"; } \ + && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dst"; } \ + && { test -z "$stripcmd" || $doit $stripcmd "$dst"; } \ + && { test -z "$chmodcmd" || $doit $chmodcmd "$dst"; } + + else + # If we're going to rename the final executable, determine the name now. + if test -z "$transformarg"; then + dstfile=`basename "$dst"` + else + dstfile=`basename "$dst" $transformbasename \ + | sed $transformarg`$transformbasename + fi + + # don't allow the sed command to completely eliminate the filename. + test -z "$dstfile" && dstfile=`basename "$dst"` + + # Make a couple of temp file names in the proper directory. + dsttmp=$dstdir/_inst.$$_ + rmtmp=$dstdir/_rm.$$_ + + # Trap to clean up those temp files at exit. + trap 'status=$?; rm -f "$dsttmp" "$rmtmp" && exit $status' 0 + trap '(exit $?); exit' 1 2 13 15 + + # Move or copy the file name to the temp name + $doit $instcmd "$src" "$dsttmp" && + + # and set any options; do chmod last to preserve setuid bits. + # + # If any of these fail, we abort the whole thing. If we want to + # ignore errors from any of these, just make sure not to ignore + # errors from the above "$doit $instcmd $src $dsttmp" command. + # + { test -z "$chowncmd" || $doit $chowncmd "$dsttmp"; } \ + && { test -z "$chgrpcmd" || $doit $chgrpcmd "$dsttmp"; } \ + && { test -z "$stripcmd" || $doit $stripcmd "$dsttmp"; } \ + && { test -z "$chmodcmd" || $doit $chmodcmd "$dsttmp"; } && + + # Now rename the file to the real destination. + { $doit $mvcmd -f "$dsttmp" "$dstdir/$dstfile" 2>/dev/null \ + || { + # The rename failed, perhaps because mv can't rename something else + # to itself, or perhaps because mv is so ancient that it does not + # support -f. + + # Now remove or move aside any old file at destination location. + # We try this two ways since rm can't unlink itself on some + # systems and the destination file might be busy for other + # reasons. In this case, the final cleanup might fail but the new + # file should still install successfully. + { + if test -f "$dstdir/$dstfile"; then + $doit $rmcmd -f "$dstdir/$dstfile" 2>/dev/null \ + || $doit $mvcmd -f "$dstdir/$dstfile" "$rmtmp" 2>/dev/null \ + || { + echo "$0: cannot unlink or rename $dstdir/$dstfile" >&2 + (exit 1); exit + } + else + : + fi + } && + + # Now rename the file to the real destination. + $doit $mvcmd "$dsttmp" "$dstdir/$dstfile" + } + } + fi || { (exit 1); exit; } +done + +# The final little trick to "correctly" pass the exit status to the exit trap. +{ + (exit 0); exit +} + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/src/apps/bin/bison/config/mdate-sh b/src/apps/bin/bison/config/mdate-sh new file mode 100644 index 0000000000..05e828b081 --- /dev/null +++ b/src/apps/bin/bison/config/mdate-sh @@ -0,0 +1,170 @@ +#!/bin/sh +# Get modification time of a file or directory and pretty-print it. + +scriptversion=2003-11-09.00 + +# Copyright (C) 1995, 1996, 1997, 2003 Free Software Foundation, Inc. +# written by Ulrich Drepper , June 1995 +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software Foundation, +# Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +case $1 in + '') + echo "$0: No file. Try \`$0 --help' for more information." 1>&2 + exit 1; + ;; + -h | --h*) + cat <<\EOF +Usage: mdate-sh [--help] [--version] FILE + +Pretty-print the modification time of FILE. + +Report bugs to . +EOF + exit 0 + ;; + -v | --v*) + echo "mdate-sh $scriptversion" + exit 0 + ;; +esac + +# Prevent date giving response in another language. +LANG=C +export LANG +LC_ALL=C +export LC_ALL +LC_TIME=C +export LC_TIME + +save_arg1="$1" + +# Find out how to get the extended ls output of a file or directory. +if ls -L /dev/null 1>/dev/null 2>&1; then + ls_command='ls -L -l -d' +else + ls_command='ls -l -d' +fi + +# A `ls -l' line looks as follows on OS/2. +# drwxrwx--- 0 Aug 11 2001 foo +# This differs from Unix, which adds ownership information. +# drwxrwx--- 2 root root 4096 Aug 11 2001 foo +# +# To find the date, we split the line on spaces and iterate on words +# until we find a month. This cannot work with files whose owner is a +# user named `Jan', or `Feb', etc. However, it's unlikely that `/' +# will be owned by a user whose name is a month. So we first look at +# the extended ls output of the root directory to decide how many +# words should be skipped to get the date. + +# On HPUX /bin/sh, "set" interprets "-rw-r--r--" as options, so the "x" below. +set - x`$ls_command /` + +# Find which argument is the month. +month= +command= +until test $month +do + shift + # Add another shift to the command. + command="$command shift;" + case $1 in + Jan) month=January; nummonth=1;; + Feb) month=February; nummonth=2;; + Mar) month=March; nummonth=3;; + Apr) month=April; nummonth=4;; + May) month=May; nummonth=5;; + Jun) month=June; nummonth=6;; + Jul) month=July; nummonth=7;; + Aug) month=August; nummonth=8;; + Sep) month=September; nummonth=9;; + Oct) month=October; nummonth=10;; + Nov) month=November; nummonth=11;; + Dec) month=December; nummonth=12;; + esac +done + +# Get the extended ls output of the file or directory. +set - x`eval "$ls_command \"\$save_arg1\""` + +# Remove all preceding arguments +eval $command + +# Get the month. Next argument is day, followed by the year or time. +case $1 in + Jan) month=January; nummonth=1;; + Feb) month=February; nummonth=2;; + Mar) month=March; nummonth=3;; + Apr) month=April; nummonth=4;; + May) month=May; nummonth=5;; + Jun) month=June; nummonth=6;; + Jul) month=July; nummonth=7;; + Aug) month=August; nummonth=8;; + Sep) month=September; nummonth=9;; + Oct) month=October; nummonth=10;; + Nov) month=November; nummonth=11;; + Dec) month=December; nummonth=12;; +esac + +day=$2 + +# Here we have to deal with the problem that the ls output gives either +# the time of day or the year. +case $3 in + *:*) set `date`; eval year=\$$# + case $2 in + Jan) nummonthtod=1;; + Feb) nummonthtod=2;; + Mar) nummonthtod=3;; + Apr) nummonthtod=4;; + May) nummonthtod=5;; + Jun) nummonthtod=6;; + Jul) nummonthtod=7;; + Aug) nummonthtod=8;; + Sep) nummonthtod=9;; + Oct) nummonthtod=10;; + Nov) nummonthtod=11;; + Dec) nummonthtod=12;; + esac + # For the first six month of the year the time notation can also + # be used for files modified in the last year. + if (expr $nummonth \> $nummonthtod) > /dev/null; + then + year=`expr $year - 1` + fi;; + *) year=$3;; +esac + +# The result. +echo $day $month $year + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/src/apps/bin/bison/config/missing b/src/apps/bin/bison/config/missing new file mode 100644 index 0000000000..e7ef83a1c2 --- /dev/null +++ b/src/apps/bin/bison/config/missing @@ -0,0 +1,360 @@ +#! /bin/sh +# Common stub for a few missing GNU programs while installing. + +scriptversion=2003-09-02.23 + +# Copyright (C) 1996, 1997, 1999, 2000, 2002, 2003 +# Free Software Foundation, Inc. +# Originally by Fran,cois Pinard , 1996. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +if test $# -eq 0; then + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 +fi + +run=: + +# In the cases where this matters, `missing' is being run in the +# srcdir already. +if test -f configure.ac; then + configure_ac=configure.ac +else + configure_ac=configure.in +fi + +msg="missing on your system" + +case "$1" in +--run) + # Try to run requested program, and just exit if it succeeds. + run= + shift + "$@" && exit 0 + # Exit code 63 means version mismatch. This often happens + # when the user try to use an ancient version of a tool on + # a file that requires a minimum version. In this case we + # we should proceed has if the program had been absent, or + # if --run hadn't been passed. + if test $? = 63; then + run=: + msg="probably too old" + fi + ;; +esac + +# If it does not exist, or fails to run (possibly an outdated version), +# try to emulate it. +case "$1" in + + -h|--h|--he|--hel|--help) + echo "\ +$0 [OPTION]... PROGRAM [ARGUMENT]... + +Handle \`PROGRAM [ARGUMENT]...' for when PROGRAM is missing, or return an +error status if there is no known handling for PROGRAM. + +Options: + -h, --help display this help and exit + -v, --version output version information and exit + --run try to run the given command, and emulate it if it fails + +Supported PROGRAM values: + aclocal touch file \`aclocal.m4' + autoconf touch file \`configure' + autoheader touch file \`config.h.in' + automake touch all \`Makefile.in' files + bison create \`y.tab.[ch]', if possible, from existing .[ch] + flex create \`lex.yy.c', if possible, from existing .c + help2man touch the output file + lex create \`lex.yy.c', if possible, from existing .c + makeinfo touch the output file + tar try tar, gnutar, gtar, then tar without non-portable flags + yacc create \`y.tab.[ch]', if possible, from existing .[ch] + +Send bug reports to ." + ;; + + -v|--v|--ve|--ver|--vers|--versi|--versio|--version) + echo "missing $scriptversion (GNU Automake)" + ;; + + -*) + echo 1>&2 "$0: Unknown \`$1' option" + echo 1>&2 "Try \`$0 --help' for more information" + exit 1 + ;; + + aclocal*) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acinclude.m4' or \`${configure_ac}'. You might want + to install the \`Automake' and \`Perl' packages. Grab them from + any GNU archive site." + touch aclocal.m4 + ;; + + autoconf) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`${configure_ac}'. You might want to install the + \`Autoconf' and \`GNU m4' packages. Grab them from any GNU + archive site." + touch configure + ;; + + autoheader) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`acconfig.h' or \`${configure_ac}'. You might want + to install the \`Autoconf' and \`GNU m4' packages. Grab them + from any GNU archive site." + files=`sed -n 's/^[ ]*A[CM]_CONFIG_HEADER(\([^)]*\)).*/\1/p' ${configure_ac}` + test -z "$files" && files="config.h" + touch_files= + for f in $files; do + case "$f" in + *:*) touch_files="$touch_files "`echo "$f" | + sed -e 's/^[^:]*://' -e 's/:.*//'`;; + *) touch_files="$touch_files $f.in";; + esac + done + touch $touch_files + ;; + + automake*) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified \`Makefile.am', \`acinclude.m4' or \`${configure_ac}'. + You might want to install the \`Automake' and \`Perl' packages. + Grab them from any GNU archive site." + find . -type f -name Makefile.am -print | + sed 's/\.am$/.in/' | + while read f; do touch "$f"; done + ;; + + autom4te) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is needed, but is $msg. + You might have modified some files without having the + proper tools for further handling them. + You can get \`$1' as part of \`Autoconf' from any GNU + archive site." + + file=`echo "$*" | sed -n 's/.*--output[ =]*\([^ ]*\).*/\1/p'` + test -z "$file" && file=`echo "$*" | sed -n 's/.*-o[ ]*\([^ ]*\).*/\1/p'` + if test -f "$file"; then + touch $file + else + test -z "$file" || exec >$file + echo "#! /bin/sh" + echo "# Created by GNU Automake missing as a replacement of" + echo "# $ $@" + echo "exit 0" + chmod +x $file + exit 1 + fi + ;; + + bison|yacc) + echo 1>&2 "\ +WARNING: \`$1' $msg. You should only need it if + you modified a \`.y' file. You may need the \`Bison' package + in order for those modifications to take effect. You can get + \`Bison' from any GNU archive site." + rm -f y.tab.c y.tab.h + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.y) + SRCFILE=`echo "$LASTARG" | sed 's/y$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.c + fi + SRCFILE=`echo "$LASTARG" | sed 's/y$/h/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" y.tab.h + fi + ;; + esac + fi + if [ ! -f y.tab.h ]; then + echo >y.tab.h + fi + if [ ! -f y.tab.c ]; then + echo 'main() { return 0; }' >y.tab.c + fi + ;; + + lex|flex) + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.l' file. You may need the \`Flex' package + in order for those modifications to take effect. You can get + \`Flex' from any GNU archive site." + rm -f lex.yy.c + if [ $# -ne 1 ]; then + eval LASTARG="\${$#}" + case "$LASTARG" in + *.l) + SRCFILE=`echo "$LASTARG" | sed 's/l$/c/'` + if [ -f "$SRCFILE" ]; then + cp "$SRCFILE" lex.yy.c + fi + ;; + esac + fi + if [ ! -f lex.yy.c ]; then + echo 'main() { return 0; }' >lex.yy.c + fi + ;; + + help2man) + if test -z "$run" && ($1 --version) > /dev/null 2>&1; then + # We have it, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a dependency of a manual page. You may need the + \`Help2man' package in order for those modifications to take + effect. You can get \`Help2man' from any GNU archive site." + + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed -n 's/.*--output=\([^ ]*\).*/\1/p'` + fi + if [ -f "$file" ]; then + touch $file + else + test -z "$file" || exec >$file + echo ".ab help2man is required to generate this page" + exit 1 + fi + ;; + + makeinfo) + if test -z "$run" && (makeinfo --version) > /dev/null 2>&1; then + # We have makeinfo, but it failed. + exit 1 + fi + + echo 1>&2 "\ +WARNING: \`$1' is $msg. You should only need it if + you modified a \`.texi' or \`.texinfo' file, or any other file + indirectly affecting the aspect of the manual. The spurious + call might also be the consequence of using a buggy \`make' (AIX, + DU, IRIX). You might want to install the \`Texinfo' package or + the \`GNU make' package. Grab either from any GNU archive site." + file=`echo "$*" | sed -n 's/.*-o \([^ ]*\).*/\1/p'` + if test -z "$file"; then + file=`echo "$*" | sed 's/.* \([^ ]*\) *$/\1/'` + file=`sed -n '/^@setfilename/ { s/.* \([^ ]*\) *$/\1/; p; q; }' $file` + fi + touch $file + ;; + + tar) + shift + if test -n "$run"; then + echo 1>&2 "ERROR: \`tar' requires --run" + exit 1 + fi + + # We have already tried tar in the generic part. + # Look for gnutar/gtar before invocation to avoid ugly error + # messages. + if (gnutar --version > /dev/null 2>&1); then + gnutar "$@" && exit 0 + fi + if (gtar --version > /dev/null 2>&1); then + gtar "$@" && exit 0 + fi + firstarg="$1" + if shift; then + case "$firstarg" in + *o*) + firstarg=`echo "$firstarg" | sed s/o//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + case "$firstarg" in + *h*) + firstarg=`echo "$firstarg" | sed s/h//` + tar "$firstarg" "$@" && exit 0 + ;; + esac + fi + + echo 1>&2 "\ +WARNING: I can't seem to be able to run \`tar' with the given arguments. + You may want to install GNU tar or Free paxutils, or check the + command line arguments." + exit 1 + ;; + + *) + echo 1>&2 "\ +WARNING: \`$1' is needed, and is $msg. + You might have modified some files without having the + proper tools for further handling them. Check the \`README' file, + it often tells you about the needed prerequisites for installing + this package. You may also peek at any GNU archive site, in case + some other package would contain this missing \`$1' program." + exit 1 + ;; +esac + +exit 0 + +# Local variables: +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/src/apps/bin/bison/config/mkinstalldirs b/src/apps/bin/bison/config/mkinstalldirs new file mode 100644 index 0000000000..6fbe5e1176 --- /dev/null +++ b/src/apps/bin/bison/config/mkinstalldirs @@ -0,0 +1,150 @@ +#! /bin/sh +# mkinstalldirs --- make directory hierarchy + +scriptversion=2004-02-15.20 + +# Original author: Noah Friedman +# Created: 1993-05-16 +# Public domain. +# +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +errstatus=0 +dirmode="" + +usage="\ +Usage: mkinstalldirs [-h] [--help] [--version] [-m MODE] DIR ... + +Create each directory DIR (with mode MODE, if specified), including all +leading file name components. + +Report bugs to ." + +# process command line arguments +while test $# -gt 0 ; do + case $1 in + -h | --help | --h*) # -h for help + echo "$usage" + exit 0 + ;; + -m) # -m PERM arg + shift + test $# -eq 0 && { echo "$usage" 1>&2; exit 1; } + dirmode=$1 + shift + ;; + --version) + echo "$0 $scriptversion" + exit 0 + ;; + --) # stop option processing + shift + break + ;; + -*) # unknown option + echo "$usage" 1>&2 + exit 1 + ;; + *) # first non-opt arg + break + ;; + esac +done + +for file +do + if test -d "$file"; then + shift + else + break + fi +done + +case $# in + 0) exit 0 ;; +esac + +# Solaris 8's mkdir -p isn't thread-safe. If you mkdir -p a/b and +# mkdir -p a/c at the same time, both will detect that a is missing, +# one will create a, then the other will try to create a and die with +# a "File exists" error. This is a problem when calling mkinstalldirs +# from a parallel make. We use --version in the probe to restrict +# ourselves to GNU mkdir, which is thread-safe. +case $dirmode in + '') + if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + echo "mkdir -p -- $*" + exec mkdir -p -- "$@" + else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + test -d ./-p && rmdir ./-p + test -d ./--version && rmdir ./--version + fi + ;; + *) + if mkdir -m "$dirmode" -p --version . >/dev/null 2>&1 && + test ! -d ./--version; then + echo "mkdir -m $dirmode -p -- $*" + exec mkdir -m "$dirmode" -p -- "$@" + else + # Clean up after NextStep and OpenStep mkdir. + for d in ./-m ./-p ./--version "./$dirmode"; + do + test -d $d && rmdir $d + done + fi + ;; +esac + +for file +do + set fnord `echo ":$file" | sed -ne 's/^:\//#/;s/^://;s/\// /g;s/^#/\//;p'` + shift + + pathcomp= + for d + do + pathcomp="$pathcomp$d" + case $pathcomp in + -*) pathcomp=./$pathcomp ;; + esac + + if test ! -d "$pathcomp"; then + echo "mkdir $pathcomp" + + mkdir "$pathcomp" || lasterr=$? + + if test ! -d "$pathcomp"; then + errstatus=$lasterr + else + if test ! -z "$dirmode"; then + echo "chmod $dirmode $pathcomp" + lasterr="" + chmod "$dirmode" "$pathcomp" || lasterr=$? + + if test ! -z "$lasterr"; then + errstatus=$lasterr + fi + fi + fi + fi + + pathcomp="$pathcomp/" + done +done + +exit $errstatus + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/src/apps/bin/bison/config/move-if-change b/src/apps/bin/bison/config/move-if-change new file mode 100644 index 0000000000..66d8b8adc7 --- /dev/null +++ b/src/apps/bin/bison/config/move-if-change @@ -0,0 +1,17 @@ +#!/bin/sh +# Like mv $1 $2, but if the files are the same, just delete $1. +# Status is 0 if $2 is changed, 1 otherwise. +if +test -r $2 +then +if +cmp -s $1 $2 +then +echo $2 is unchanged +rm -f $1 +else +mv -f $1 $2 +fi +else +mv -f $1 $2 +fi diff --git a/src/apps/bin/bison/config/prev-version.txt b/src/apps/bin/bison/config/prev-version.txt new file mode 100644 index 0000000000..07cde98405 --- /dev/null +++ b/src/apps/bin/bison/config/prev-version.txt @@ -0,0 +1 @@ +1.75 diff --git a/src/apps/bin/bison/config/texinfo.tex b/src/apps/bin/bison/config/texinfo.tex new file mode 100644 index 0000000000..6c8536c4d4 --- /dev/null +++ b/src/apps/bin/bison/config/texinfo.tex @@ -0,0 +1,7006 @@ +% texinfo.tex -- TeX macros to handle Texinfo files. +% +% Load plain if necessary, i.e., if running under initex. +\expandafter\ifx\csname fmtname\endcsname\relax\input plain\fi +% +\def\texinfoversion{2004-05-16.08} +% +% Copyright (C) 1985, 1986, 1988, 1990, 1991, 1992, 1993, 1994, 1995, +% 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software +% Foundation, Inc. +% +% This texinfo.tex file is free software; you can redistribute it and/or +% modify it under the terms of the GNU General Public License as +% published by the Free Software Foundation; either version 2, or (at +% your option) any later version. +% +% This texinfo.tex file is distributed in the hope that it will be +% useful, but WITHOUT ANY WARRANTY; without even the implied warranty +% of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU +% General Public License for more details. +% +% You should have received a copy of the GNU General Public License +% along with this texinfo.tex file; see the file COPYING. If not, write +% to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +% Boston, MA 02111-1307, USA. +% +% As a special exception, when this file is read by TeX when processing +% a Texinfo source document, you may use the result without +% restriction. (This has been our intent since Texinfo was invented.) +% +% Please try the latest version of texinfo.tex before submitting bug +% reports; you can get the latest version from: +% http://www.gnu.org/software/texinfo/ (the Texinfo home page), or +% ftp://tug.org/tex/texinfo.tex +% (and all CTAN mirrors, see http://www.ctan.org). +% The texinfo.tex in any given distribution could well be out +% of date, so if that's what you're using, please check. +% +% Send bug reports to bug-texinfo@gnu.org. Please include including a +% complete document in each bug report with which we can reproduce the +% problem. Patches are, of course, greatly appreciated. +% +% To process a Texinfo manual with TeX, it's most reliable to use the +% texi2dvi shell script that comes with the distribution. For a simple +% manual foo.texi, however, you can get away with this: +% tex foo.texi +% texindex foo.?? +% tex foo.texi +% tex foo.texi +% dvips foo.dvi -o # or whatever; this makes foo.ps. +% The extra TeX runs get the cross-reference information correct. +% Sometimes one run after texindex suffices, and sometimes you need more +% than two; texi2dvi does it as many times as necessary. +% +% It is possible to adapt texinfo.tex for other languages, to some +% extent. You can get the existing language-specific files from the +% full Texinfo distribution. +% +% The GNU Texinfo home page is http://www.gnu.org/software/texinfo. + + +\message{Loading texinfo [version \texinfoversion]:} + +% If in a .fmt file, print the version number +% and turn on active characters that we couldn't do earlier because +% they might have appeared in the input file name. +\everyjob{\message{[Texinfo version \texinfoversion]}% + \catcode`+=\active \catcode`\_=\active} + +\message{Basics,} +\chardef\other=12 + +% We never want plain's \outer definition of \+ in Texinfo. +% For @tex, we can use \tabalign. +\let\+ = \relax + +% Save some plain tex macros whose names we will redefine. +\let\ptexb=\b +\let\ptexbullet=\bullet +\let\ptexc=\c +\let\ptexcomma=\, +\let\ptexdot=\. +\let\ptexdots=\dots +\let\ptexend=\end +\let\ptexequiv=\equiv +\let\ptexexclam=\! +\let\ptexfootnote=\footnote +\let\ptexgtr=> +\let\ptexhat=^ +\let\ptexi=\i +\let\ptexindent=\indent +\let\ptexnoindent=\noindent +\let\ptexinsert=\insert +\let\ptexlbrace=\{ +\let\ptexless=< +\let\ptexplus=+ +\let\ptexrbrace=\} +\let\ptexslash=\/ +\let\ptexstar=\* +\let\ptext=\t + +% If this character appears in an error message or help string, it +% starts a new line in the output. +\newlinechar = `^^J + +% Use TeX 3.0's \inputlineno to get the line number, for better error +% messages, but if we're using an old version of TeX, don't do anything. +% +\ifx\inputlineno\thisisundefined + \let\linenumber = \empty % Pre-3.0. +\else + \def\linenumber{l.\the\inputlineno:\space} +\fi + +% Set up fixed words for English if not already set. +\ifx\putwordAppendix\undefined \gdef\putwordAppendix{Appendix}\fi +\ifx\putwordChapter\undefined \gdef\putwordChapter{Chapter}\fi +\ifx\putwordfile\undefined \gdef\putwordfile{file}\fi +\ifx\putwordin\undefined \gdef\putwordin{in}\fi +\ifx\putwordIndexIsEmpty\undefined \gdef\putwordIndexIsEmpty{(Index is empty)}\fi +\ifx\putwordIndexNonexistent\undefined \gdef\putwordIndexNonexistent{(Index is nonexistent)}\fi +\ifx\putwordInfo\undefined \gdef\putwordInfo{Info}\fi +\ifx\putwordInstanceVariableof\undefined \gdef\putwordInstanceVariableof{Instance Variable of}\fi +\ifx\putwordMethodon\undefined \gdef\putwordMethodon{Method on}\fi +\ifx\putwordNoTitle\undefined \gdef\putwordNoTitle{No Title}\fi +\ifx\putwordof\undefined \gdef\putwordof{of}\fi +\ifx\putwordon\undefined \gdef\putwordon{on}\fi +\ifx\putwordpage\undefined \gdef\putwordpage{page}\fi +\ifx\putwordsection\undefined \gdef\putwordsection{section}\fi +\ifx\putwordSection\undefined \gdef\putwordSection{Section}\fi +\ifx\putwordsee\undefined \gdef\putwordsee{see}\fi +\ifx\putwordSee\undefined \gdef\putwordSee{See}\fi +\ifx\putwordShortTOC\undefined \gdef\putwordShortTOC{Short Contents}\fi +\ifx\putwordTOC\undefined \gdef\putwordTOC{Table of Contents}\fi +% +\ifx\putwordMJan\undefined \gdef\putwordMJan{January}\fi +\ifx\putwordMFeb\undefined \gdef\putwordMFeb{February}\fi +\ifx\putwordMMar\undefined \gdef\putwordMMar{March}\fi +\ifx\putwordMApr\undefined \gdef\putwordMApr{April}\fi +\ifx\putwordMMay\undefined \gdef\putwordMMay{May}\fi +\ifx\putwordMJun\undefined \gdef\putwordMJun{June}\fi +\ifx\putwordMJul\undefined \gdef\putwordMJul{July}\fi +\ifx\putwordMAug\undefined \gdef\putwordMAug{August}\fi +\ifx\putwordMSep\undefined \gdef\putwordMSep{September}\fi +\ifx\putwordMOct\undefined \gdef\putwordMOct{October}\fi +\ifx\putwordMNov\undefined \gdef\putwordMNov{November}\fi +\ifx\putwordMDec\undefined \gdef\putwordMDec{December}\fi +% +\ifx\putwordDefmac\undefined \gdef\putwordDefmac{Macro}\fi +\ifx\putwordDefspec\undefined \gdef\putwordDefspec{Special Form}\fi +\ifx\putwordDefvar\undefined \gdef\putwordDefvar{Variable}\fi +\ifx\putwordDefopt\undefined \gdef\putwordDefopt{User Option}\fi +\ifx\putwordDeffunc\undefined \gdef\putwordDeffunc{Function}\fi + +% In some macros, we cannot use the `\? notation---the left quote is +% in some cases the escape char. +\chardef\colonChar = `\: +\chardef\commaChar = `\, +\chardef\dotChar = `\. +\chardef\exclamChar= `\! +\chardef\questChar = `\? +\chardef\semiChar = `\; +\chardef\underChar = `\_ + +\chardef\spaceChar = `\ % +\chardef\spacecat = 10 +\def\spaceisspace{\catcode\spaceChar=\spacecat} + +% Ignore a token. +% +\def\gobble#1{} + +% The following is used inside several \edef's. +\def\makecsname#1{\expandafter\noexpand\csname#1\endcsname} + +% Hyphenation fixes. +\hyphenation{ + Flor-i-da Ghost-script Ghost-view Mac-OS Post-Script + ap-pen-dix bit-map bit-maps + data-base data-bases eshell fall-ing half-way long-est man-u-script + man-u-scripts mini-buf-fer mini-buf-fers over-view par-a-digm + par-a-digms rath-er rec-tan-gu-lar ro-bot-ics se-vere-ly set-up spa-ces + spell-ing spell-ings + stand-alone strong-est time-stamp time-stamps which-ever white-space + wide-spread wrap-around +} + +% Margin to add to right of even pages, to left of odd pages. +\newdimen\bindingoffset +\newdimen\normaloffset +\newdimen\pagewidth \newdimen\pageheight + +% For a final copy, take out the rectangles +% that mark overfull boxes (in case you have decided +% that the text looks ok even though it passes the margin). +% +\def\finalout{\overfullrule=0pt} + +% @| inserts a changebar to the left of the current line. It should +% surround any changed text. This approach does *not* work if the +% change spans more than two lines of output. To handle that, we would +% have adopt a much more difficult approach (putting marks into the main +% vertical list for the beginning and end of each change). +% +\def\|{% + % \vadjust can only be used in horizontal mode. + \leavevmode + % + % Append this vertical mode material after the current line in the output. + \vadjust{% + % We want to insert a rule with the height and depth of the current + % leading; that is exactly what \strutbox is supposed to record. + \vskip-\baselineskip + % + % \vadjust-items are inserted at the left edge of the type. So + % the \llap here moves out into the left-hand margin. + \llap{% + % + % For a thicker or thinner bar, change the `1pt'. + \vrule height\baselineskip width1pt + % + % This is the space between the bar and the text. + \hskip 12pt + }% + }% +} + +% Sometimes it is convenient to have everything in the transcript file +% and nothing on the terminal. We don't just call \tracingall here, +% since that produces some useless output on the terminal. We also make +% some effort to order the tracing commands to reduce output in the log +% file; cf. trace.sty in LaTeX. +% +\def\gloggingall{\begingroup \globaldefs = 1 \loggingall \endgroup}% +\def\loggingall{% + \tracingstats2 + \tracingpages1 + \tracinglostchars2 % 2 gives us more in etex + \tracingparagraphs1 + \tracingoutput1 + \tracingmacros2 + \tracingrestores1 + \showboxbreadth\maxdimen \showboxdepth\maxdimen + \ifx\eTeXversion\undefined\else % etex gives us more logging + \tracingscantokens1 + \tracingifs1 + \tracinggroups1 + \tracingnesting2 + \tracingassigns1 + \fi + \tracingcommands3 % 3 gives us more in etex + \errorcontextlines16 +}% + +% add check for \lastpenalty to plain's definitions. If the last thing +% we did was a \nobreak, we don't want to insert more space. +% +\def\smallbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\smallskipamount + \removelastskip\penalty-50\smallskip\fi\fi} +\def\medbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\medskipamount + \removelastskip\penalty-100\medskip\fi\fi} +\def\bigbreak{\ifnum\lastpenalty<10000\par\ifdim\lastskip<\bigskipamount + \removelastskip\penalty-200\bigskip\fi\fi} + +% For @cropmarks command. +% Do @cropmarks to get crop marks. +% +\newif\ifcropmarks +\let\cropmarks = \cropmarkstrue +% +% Dimensions to add cropmarks at corners. +% Added by P. A. MacKay, 12 Nov. 1986 +% +\newdimen\outerhsize \newdimen\outervsize % set by the paper size routines +\newdimen\cornerlong \cornerlong=1pc +\newdimen\cornerthick \cornerthick=.3pt +\newdimen\topandbottommargin \topandbottommargin=.75in + +% Main output routine. +\chardef\PAGE = 255 +\output = {\onepageout{\pagecontents\PAGE}} + +\newbox\headlinebox +\newbox\footlinebox + +% \onepageout takes a vbox as an argument. Note that \pagecontents +% does insertions, but you have to call it yourself. +\def\onepageout#1{% + \ifcropmarks \hoffset=0pt \else \hoffset=\normaloffset \fi + % + \ifodd\pageno \advance\hoffset by \bindingoffset + \else \advance\hoffset by -\bindingoffset\fi + % + % Do this outside of the \shipout so @code etc. will be expanded in + % the headline as they should be, not taken literally (outputting ''code). + \setbox\headlinebox = \vbox{\let\hsize=\pagewidth \makeheadline}% + \setbox\footlinebox = \vbox{\let\hsize=\pagewidth \makefootline}% + % + {% + % Have to do this stuff outside the \shipout because we want it to + % take effect in \write's, yet the group defined by the \vbox ends + % before the \shipout runs. + % + \escapechar = `\\ % use backslash in output files. + \indexdummies % don't expand commands in the output. + \normalturnoffactive % \ in index entries must not stay \, e.g., if + % the page break happens to be in the middle of an example. + \shipout\vbox{% + % Do this early so pdf references go to the beginning of the page. + \ifpdfmakepagedest \pdfdest name{\the\pageno} xyz\fi + % + \ifcropmarks \vbox to \outervsize\bgroup + \hsize = \outerhsize + \vskip-\topandbottommargin + \vtop to0pt{% + \line{\ewtop\hfil\ewtop}% + \nointerlineskip + \line{% + \vbox{\moveleft\cornerthick\nstop}% + \hfill + \vbox{\moveright\cornerthick\nstop}% + }% + \vss}% + \vskip\topandbottommargin + \line\bgroup + \hfil % center the page within the outer (page) hsize. + \ifodd\pageno\hskip\bindingoffset\fi + \vbox\bgroup + \fi + % + \unvbox\headlinebox + \pagebody{#1}% + \ifdim\ht\footlinebox > 0pt + % Only leave this space if the footline is nonempty. + % (We lessened \vsize for it in \oddfootingxxx.) + % The \baselineskip=24pt in plain's \makefootline has no effect. + \vskip 2\baselineskip + \unvbox\footlinebox + \fi + % + \ifcropmarks + \egroup % end of \vbox\bgroup + \hfil\egroup % end of (centering) \line\bgroup + \vskip\topandbottommargin plus1fill minus1fill + \boxmaxdepth = \cornerthick + \vbox to0pt{\vss + \line{% + \vbox{\moveleft\cornerthick\nsbot}% + \hfill + \vbox{\moveright\cornerthick\nsbot}% + }% + \nointerlineskip + \line{\ewbot\hfil\ewbot}% + }% + \egroup % \vbox from first cropmarks clause + \fi + }% end of \shipout\vbox + }% end of group with \normalturnoffactive + \advancepageno + \ifnum\outputpenalty>-20000 \else\dosupereject\fi +} + +\newinsert\margin \dimen\margin=\maxdimen + +\def\pagebody#1{\vbox to\pageheight{\boxmaxdepth=\maxdepth #1}} +{\catcode`\@ =11 +\gdef\pagecontents#1{\ifvoid\topins\else\unvbox\topins\fi +% marginal hacks, juha@viisa.uucp (Juha Takala) +\ifvoid\margin\else % marginal info is present + \rlap{\kern\hsize\vbox to\z@{\kern1pt\box\margin \vss}}\fi +\dimen@=\dp#1 \unvbox#1 +\ifvoid\footins\else\vskip\skip\footins\footnoterule \unvbox\footins\fi +\ifr@ggedbottom \kern-\dimen@ \vfil \fi} +} + +% Here are the rules for the cropmarks. Note that they are +% offset so that the space between them is truly \outerhsize or \outervsize +% (P. A. MacKay, 12 November, 1986) +% +\def\ewtop{\vrule height\cornerthick depth0pt width\cornerlong} +\def\nstop{\vbox + {\hrule height\cornerthick depth\cornerlong width\cornerthick}} +\def\ewbot{\vrule height0pt depth\cornerthick width\cornerlong} +\def\nsbot{\vbox + {\hrule height\cornerlong depth\cornerthick width\cornerthick}} + +% Parse an argument, then pass it to #1. The argument is the rest of +% the input line (except we remove a trailing comment). #1 should be a +% macro which expects an ordinary undelimited TeX argument. +% +\def\parsearg{\parseargusing{}} +\def\parseargusing#1#2{% + \def\next{#2}% + \begingroup + \obeylines + \spaceisspace + #1% + \parseargline\empty% Insert the \empty token, see \finishparsearg below. +} + +{\obeylines % + \gdef\parseargline#1^^M{% + \endgroup % End of the group started in \parsearg. + \argremovecomment #1\comment\ArgTerm% + }% +} + +% First remove any @comment, then any @c comment. +\def\argremovecomment#1\comment#2\ArgTerm{\argremovec #1\c\ArgTerm} +\def\argremovec#1\c#2\ArgTerm{\argcheckspaces#1\^^M\ArgTerm} + +% Each occurence of `\^^M' or `\^^M' is replaced by a single space. +% +% \argremovec might leave us with trailing space, e.g., +% @end itemize @c foo +% This space token undergoes the same procedure and is eventually removed +% by \finishparsearg. +% +\def\argcheckspaces#1\^^M{\argcheckspacesX#1\^^M \^^M} +\def\argcheckspacesX#1 \^^M{\argcheckspacesY#1\^^M} +\def\argcheckspacesY#1\^^M#2\^^M#3\ArgTerm{% + \def\temp{#3}% + \ifx\temp\empty + % We cannot use \next here, as it holds the macro to run; + % thus we reuse \temp. + \let\temp\finishparsearg + \else + \let\temp\argcheckspaces + \fi + % Put the space token in: + \temp#1 #3\ArgTerm +} + +% If a _delimited_ argument is enclosed in braces, they get stripped; so +% to get _exactly_ the rest of the line, we had to prevent such situation. +% We prepended an \empty token at the very beginning and we expand it now, +% just before passing the control to \next. +% (Similarily, we have to think about #3 of \argcheckspacesY above: it is +% either the null string, or it ends with \^^M---thus there is no danger +% that a pair of braces would be stripped. +% +% But first, we have to remove the trailing space token. +% +\def\finishparsearg#1 \ArgTerm{\expandafter\next\expandafter{#1}} + +% \parseargdef\foo{...} +% is roughly equivalent to +% \def\foo{\parsearg\Xfoo} +% \def\Xfoo#1{...} +% +% Actually, I use \csname\string\foo\endcsname, ie. \\foo, as it is my +% favourite TeX trick. --kasal, 16nov03 + +\def\parseargdef#1{% + \expandafter \doparseargdef \csname\string#1\endcsname #1% +} +\def\doparseargdef#1#2{% + \def#2{\parsearg#1}% + \def#1##1% +} + +% Several utility definitions with active space: +{ + \obeyspaces + \gdef\obeyedspace{ } + + % Make each space character in the input produce a normal interword + % space in the output. Don't allow a line break at this space, as this + % is used only in environments like @example, where each line of input + % should produce a line of output anyway. + % + \gdef\sepspaces{\obeyspaces\let =\tie} + + % If an index command is used in an @example environment, any spaces + % therein should become regular spaces in the raw index file, not the + % expansion of \tie (\leavevmode \penalty \@M \ ). + \gdef\unsepspaces{\let =\space} +} + + +\def\flushcr{\ifx\par\lisppar \def\next##1{}\else \let\next=\relax \fi \next} + +% Define the framework for environments in texinfo.tex. It's used like this: +% +% \envdef\foo{...} +% \def\Efoo{...} +% +% It's the responsibility of \envdef to insert \begingroup before the +% actual body; @end closes the group after calling \Efoo. \envdef also +% defines \thisenv, so the current environment is known; @end checks +% whether the environment name matches. The \checkenv macro can also be +% used to check whether the current environment is the one expected. +% +% Non-false conditionals (@iftex, @ifset) don't fit into this, so they +% are not treated as enviroments; they don't open a group. (The +% implementation of @end takes care not to call \endgroup in this +% special case.) + + +% At runtime, environments start with this: +\def\startenvironment#1{\begingroup\def\thisenv{#1}} +% initialize +\let\thisenv\empty + +% ... but they get defined via ``\envdef\foo{...}'': +\long\def\envdef#1#2{\def#1{\startenvironment#1#2}} +\def\envparseargdef#1#2{\parseargdef#1{\startenvironment#1#2}} + +% Check whether we're in the right environment: +\def\checkenv#1{% + \def\temp{#1}% + \ifx\thisenv\temp + \else + \badenverr + \fi +} + +% Evironment mismatch, #1 expected: +\def\badenverr{% + \errhelp = \EMsimple + \errmessage{This command can appear only \inenvironment\temp, + not \inenvironment\thisenv}% +} +\def\inenvironment#1{% + \ifx#1\empty + out of any environment% + \else + in environment \expandafter\string#1% + \fi +} + +% @end foo executes the definition of \Efoo. +% But first, it executes a specialized version of \checkenv +% +\parseargdef\end{% + \if 1\csname iscond.#1\endcsname + \else + % The general wording of \badenverr may not be ideal, but... --kasal, 06nov03 + \expandafter\checkenv\csname#1\endcsname + \csname E#1\endcsname + \endgroup + \fi +} + +\newhelp\EMsimple{Press RETURN to continue.} + + +%% Simple single-character @ commands + +% @@ prints an @ +% Kludge this until the fonts are right (grr). +\def\@{{\tt\char64}} + +% This is turned off because it was never documented +% and you can use @w{...} around a quote to suppress ligatures. +%% Define @` and @' to be the same as ` and ' +%% but suppressing ligatures. +%\def\`{{`}} +%\def\'{{'}} + +% Used to generate quoted braces. +\def\mylbrace {{\tt\char123}} +\def\myrbrace {{\tt\char125}} +\let\{=\mylbrace +\let\}=\myrbrace +\begingroup + % Definitions to produce \{ and \} commands for indices, + % and @{ and @} for the aux file. + \catcode`\{ = \other \catcode`\} = \other + \catcode`\[ = 1 \catcode`\] = 2 + \catcode`\! = 0 \catcode`\\ = \other + !gdef!lbracecmd[\{]% + !gdef!rbracecmd[\}]% + !gdef!lbraceatcmd[@{]% + !gdef!rbraceatcmd[@}]% +!endgroup + +% @comma{} to avoid , parsing problems. +\let\comma = , + +% Accents: @, @dotaccent @ringaccent @ubaraccent @udotaccent +% Others are defined by plain TeX: @` @' @" @^ @~ @= @u @v @H. +\let\, = \c +\let\dotaccent = \. +\def\ringaccent#1{{\accent23 #1}} +\let\tieaccent = \t +\let\ubaraccent = \b +\let\udotaccent = \d + +% Other special characters: @questiondown @exclamdown @ordf @ordm +% Plain TeX defines: @AA @AE @O @OE @L (plus lowercase versions) @ss. +\def\questiondown{?`} +\def\exclamdown{!`} +\def\ordf{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{a}}} +\def\ordm{\leavevmode\raise1ex\hbox{\selectfonts\lllsize \underbar{o}}} + +% Dotless i and dotless j, used for accents. +\def\imacro{i} +\def\jmacro{j} +\def\dotless#1{% + \def\temp{#1}% + \ifx\temp\imacro \ptexi + \else\ifx\temp\jmacro \j + \else \errmessage{@dotless can be used only with i or j}% + \fi\fi +} + +% The \TeX{} logo, as in plain, but resetting the spacing so that a +% period following counts as ending a sentence. (Idea found in latex.) +% +\edef\TeX{\TeX \spacefactor=3000 } + +% @LaTeX{} logo. Not quite the same results as the definition in +% latex.ltx, since we use a different font for the raised A; it's most +% convenient for us to use an explicitly smaller font, rather than using +% the \scriptstyle font (since we don't reset \scriptstyle and +% \scriptscriptstyle). +% +\def\LaTeX{% + L\kern-.36em + {\setbox0=\hbox{T}% + \vbox to \ht0{\hbox{\selectfonts\lllsize A}\vss}}% + \kern-.15em + \TeX +} + +% Be sure we're in horizontal mode when doing a tie, since we make space +% equivalent to this in @example-like environments. Otherwise, a space +% at the beginning of a line will start with \penalty -- and +% since \penalty is valid in vertical mode, we'd end up putting the +% penalty on the vertical list instead of in the new paragraph. +{\catcode`@ = 11 + % Avoid using \@M directly, because that causes trouble + % if the definition is written into an index file. + \global\let\tiepenalty = \@M + \gdef\tie{\leavevmode\penalty\tiepenalty\ } +} + +% @: forces normal size whitespace following. +\def\:{\spacefactor=1000 } + +% @* forces a line break. +\def\*{\hfil\break\hbox{}\ignorespaces} + +% @/ allows a line break. +\let\/=\allowbreak + +% @. is an end-of-sentence period. +\def\.{.\spacefactor=3000 } + +% @! is an end-of-sentence bang. +\def\!{!\spacefactor=3000 } + +% @? is an end-of-sentence query. +\def\?{?\spacefactor=3000 } + +% @w prevents a word break. Without the \leavevmode, @w at the +% beginning of a paragraph, when TeX is still in vertical mode, would +% produce a whole line of output instead of starting the paragraph. +\def\w#1{\leavevmode\hbox{#1}} + +% @group ... @end group forces ... to be all on one page, by enclosing +% it in a TeX vbox. We use \vtop instead of \vbox to construct the box +% to keep its height that of a normal line. According to the rules for +% \topskip (p.114 of the TeXbook), the glue inserted is +% max (\topskip - \ht (first item), 0). If that height is large, +% therefore, no glue is inserted, and the space between the headline and +% the text is small, which looks bad. +% +% Another complication is that the group might be very large. This can +% cause the glue on the previous page to be unduly stretched, because it +% does not have much material. In this case, it's better to add an +% explicit \vfill so that the extra space is at the bottom. The +% threshold for doing this is if the group is more than \vfilllimit +% percent of a page (\vfilllimit can be changed inside of @tex). +% +\newbox\groupbox +\def\vfilllimit{0.7} +% +\envdef\group{% + \ifnum\catcode`\^^M=\active \else + \errhelp = \groupinvalidhelp + \errmessage{@group invalid in context where filling is enabled}% + \fi + \startsavinginserts + % + \setbox\groupbox = \vtop\bgroup + % Do @comment since we are called inside an environment such as + % @example, where each end-of-line in the input causes an + % end-of-line in the output. We don't want the end-of-line after + % the `@group' to put extra space in the output. Since @group + % should appear on a line by itself (according to the Texinfo + % manual), we don't worry about eating any user text. + \comment +} +% +% The \vtop produces a box with normal height and large depth; thus, TeX puts +% \baselineskip glue before it, and (when the next line of text is done) +% \lineskip glue after it. Thus, space below is not quite equal to space +% above. But it's pretty close. +\def\Egroup{% + % To get correct interline space between the last line of the group + % and the first line afterwards, we have to propagate \prevdepth. + \endgraf % Not \par, as it may have been set to \lisppar. + \global\dimen1 = \prevdepth + \egroup % End the \vtop. + % \dimen0 is the vertical size of the group's box. + \dimen0 = \ht\groupbox \advance\dimen0 by \dp\groupbox + % \dimen2 is how much space is left on the page (more or less). + \dimen2 = \pageheight \advance\dimen2 by -\pagetotal + % if the group doesn't fit on the current page, and it's a big big + % group, force a page break. + \ifdim \dimen0 > \dimen2 + \ifdim \pagetotal < \vfilllimit\pageheight + \page + \fi + \fi + \box\groupbox + \prevdepth = \dimen1 + \checkinserts +} +% +% TeX puts in an \escapechar (i.e., `@') at the beginning of the help +% message, so this ends up printing `@group can only ...'. +% +\newhelp\groupinvalidhelp{% +group can only be used in environments such as @example,^^J% +where each line of input produces a line of output.} + +% @need space-in-mils +% forces a page break if there is not space-in-mils remaining. + +\newdimen\mil \mil=0.001in + +% Old definition--didn't work. +%\parseargdef\need{\par % +%% This method tries to make TeX break the page naturally +%% if the depth of the box does not fit. +%{\baselineskip=0pt% +%\vtop to #1\mil{\vfil}\kern -#1\mil\nobreak +%\prevdepth=-1000pt +%}} + +\parseargdef\need{% + % Ensure vertical mode, so we don't make a big box in the middle of a + % paragraph. + \par + % + % If the @need value is less than one line space, it's useless. + \dimen0 = #1\mil + \dimen2 = \ht\strutbox + \advance\dimen2 by \dp\strutbox + \ifdim\dimen0 > \dimen2 + % + % Do a \strut just to make the height of this box be normal, so the + % normal leading is inserted relative to the preceding line. + % And a page break here is fine. + \vtop to #1\mil{\strut\vfil}% + % + % TeX does not even consider page breaks if a penalty added to the + % main vertical list is 10000 or more. But in order to see if the + % empty box we just added fits on the page, we must make it consider + % page breaks. On the other hand, we don't want to actually break the + % page after the empty box. So we use a penalty of 9999. + % + % There is an extremely small chance that TeX will actually break the + % page at this \penalty, if there are no other feasible breakpoints in + % sight. (If the user is using lots of big @group commands, which + % almost-but-not-quite fill up a page, TeX will have a hard time doing + % good page breaking, for example.) However, I could not construct an + % example where a page broke at this \penalty; if it happens in a real + % document, then we can reconsider our strategy. + \penalty9999 + % + % Back up by the size of the box, whether we did a page break or not. + \kern -#1\mil + % + % Do not allow a page break right after this kern. + \nobreak + \fi +} + +% @br forces paragraph break (and is undocumented). + +\let\br = \par + +% @page forces the start of a new page. +% +\def\page{\par\vfill\supereject} + +% @exdent text.... +% outputs text on separate line in roman font, starting at standard page margin + +% This records the amount of indent in the innermost environment. +% That's how much \exdent should take out. +\newskip\exdentamount + +% This defn is used inside fill environments such as @defun. +\parseargdef\exdent{\hfil\break\hbox{\kern -\exdentamount{\rm#1}}\hfil\break} + +% This defn is used inside nofill environments such as @example. +\parseargdef\nofillexdent{{\advance \leftskip by -\exdentamount + \leftline{\hskip\leftskip{\rm#1}}}} + +% @inmargin{WHICH}{TEXT} puts TEXT in the WHICH margin next to the current +% paragraph. For more general purposes, use the \margin insertion +% class. WHICH is `l' or `r'. +% +\newskip\inmarginspacing \inmarginspacing=1cm +\def\strutdepth{\dp\strutbox} +% +\def\doinmargin#1#2{\strut\vadjust{% + \nobreak + \kern-\strutdepth + \vtop to \strutdepth{% + \baselineskip=\strutdepth + \vss + % if you have multiple lines of stuff to put here, you'll need to + % make the vbox yourself of the appropriate size. + \ifx#1l% + \llap{\ignorespaces #2\hskip\inmarginspacing}% + \else + \rlap{\hskip\hsize \hskip\inmarginspacing \ignorespaces #2}% + \fi + \null + }% +}} +\def\inleftmargin{\doinmargin l} +\def\inrightmargin{\doinmargin r} +% +% @inmargin{TEXT [, RIGHT-TEXT]} +% (if RIGHT-TEXT is given, use TEXT for left page, RIGHT-TEXT for right; +% else use TEXT for both). +% +\def\inmargin#1{\parseinmargin #1,,\finish} +\def\parseinmargin#1,#2,#3\finish{% not perfect, but better than nothing. + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \def\lefttext{#1}% have both texts + \def\righttext{#2}% + \else + \def\lefttext{#1}% have only one text + \def\righttext{#1}% + \fi + % + \ifodd\pageno + \def\temp{\inrightmargin\righttext}% odd page -> outside is right margin + \else + \def\temp{\inleftmargin\lefttext}% + \fi + \temp +} + +% @include file insert text of that file as input. +% +\def\include{\parseargusing\filenamecatcodes\includezzz} +\def\includezzz#1{% + \pushthisfilestack + \def\thisfile{#1}% + {% + \makevalueexpandable + \def\temp{\input #1 }% + \expandafter + }\temp + \popthisfilestack +} +\def\filenamecatcodes{% + \catcode`\\=\other + \catcode`~=\other + \catcode`^=\other + \catcode`_=\other + \catcode`|=\other + \catcode`<=\other + \catcode`>=\other + \catcode`+=\other + \catcode`-=\other +} + +\def\pushthisfilestack{% + \expandafter\pushthisfilestackX\popthisfilestack\StackTerm +} +\def\pushthisfilestackX{% + \expandafter\pushthisfilestackY\thisfile\StackTerm +} +\def\pushthisfilestackY #1\StackTerm #2\StackTerm {% + \gdef\popthisfilestack{\gdef\thisfile{#1}\gdef\popthisfilestack{#2}}% +} + +\def\popthisfilestack{\errthisfilestackempty} +\def\errthisfilestackempty{\errmessage{Internal error: + the stack of filenames is empty.}} + +\def\thisfile{} + +% @center line +% outputs that line, centered. +% +\parseargdef\center{% + \ifhmode + \let\next\centerH + \else + \let\next\centerV + \fi + \next{\hfil \ignorespaces#1\unskip \hfil}% +} +\def\centerH#1{% + {% + \hfil\break + \advance\hsize by -\leftskip + \advance\hsize by -\rightskip + \line{#1}% + \break + }% +} +\def\centerV#1{\line{\kern\leftskip #1\kern\rightskip}} + +% @sp n outputs n lines of vertical space + +\parseargdef\sp{\vskip #1\baselineskip} + +% @comment ...line which is ignored... +% @c is the same as @comment +% @ignore ... @end ignore is another way to write a comment + +\def\comment{\begingroup \catcode`\^^M=\other% +\catcode`\@=\other \catcode`\{=\other \catcode`\}=\other% +\commentxxx} +{\catcode`\^^M=\other \gdef\commentxxx#1^^M{\endgroup}} + +\let\c=\comment + +% @paragraphindent NCHARS +% We'll use ems for NCHARS, close enough. +% NCHARS can also be the word `asis' or `none'. +% We cannot feasibly implement @paragraphindent asis, though. +% +\def\asisword{asis} % no translation, these are keywords +\def\noneword{none} +% +\parseargdef\paragraphindent{% + \def\temp{#1}% + \ifx\temp\asisword + \else + \ifx\temp\noneword + \defaultparindent = 0pt + \else + \defaultparindent = #1em + \fi + \fi + \parindent = \defaultparindent +} + +% @exampleindent NCHARS +% We'll use ems for NCHARS like @paragraphindent. +% It seems @exampleindent asis isn't necessary, but +% I preserve it to make it similar to @paragraphindent. +\parseargdef\exampleindent{% + \def\temp{#1}% + \ifx\temp\asisword + \else + \ifx\temp\noneword + \lispnarrowing = 0pt + \else + \lispnarrowing = #1em + \fi + \fi +} + +% @firstparagraphindent WORD +% If WORD is `none', then suppress indentation of the first paragraph +% after a section heading. If WORD is `insert', then do indent at such +% paragraphs. +% +% The paragraph indentation is suppressed or not by calling +% \suppressfirstparagraphindent, which the sectioning commands do. +% We switch the definition of this back and forth according to WORD. +% By default, we suppress indentation. +% +\def\suppressfirstparagraphindent{\dosuppressfirstparagraphindent} +\def\insertword{insert} +% +\parseargdef\firstparagraphindent{% + \def\temp{#1}% + \ifx\temp\noneword + \let\suppressfirstparagraphindent = \dosuppressfirstparagraphindent + \else\ifx\temp\insertword + \let\suppressfirstparagraphindent = \relax + \else + \errhelp = \EMsimple + \errmessage{Unknown @firstparagraphindent option `\temp'}% + \fi\fi +} + +% Here is how we actually suppress indentation. Redefine \everypar to +% \kern backwards by \parindent, and then reset itself to empty. +% +% We also make \indent itself not actually do anything until the next +% paragraph. +% +\gdef\dosuppressfirstparagraphindent{% + \gdef\indent{% + \restorefirstparagraphindent + \indent + }% + \gdef\noindent{% + \restorefirstparagraphindent + \noindent + }% + \global\everypar = {% + \kern -\parindent + \restorefirstparagraphindent + }% +} + +\gdef\restorefirstparagraphindent{% + \global \let \indent = \ptexindent + \global \let \noindent = \ptexnoindent + \global \everypar = {}% +} + + +% @asis just yields its argument. Used with @table, for example. +% +\def\asis#1{#1} + +% @math outputs its argument in math mode. +% +% One complication: _ usually means subscripts, but it could also mean +% an actual _ character, as in @math{@var{some_variable} + 1}. So make +% _ active, and distinguish by seeing if the current family is \slfam, +% which is what @var uses. +{ + \catcode\underChar = \active + \gdef\mathunderscore{% + \catcode\underChar=\active + \def_{\ifnum\fam=\slfam \_\else\sb\fi}% + } +} +% Another complication: we want \\ (and @\) to output a \ character. +% FYI, plain.tex uses \\ as a temporary control sequence (why?), but +% this is not advertised and we don't care. Texinfo does not +% otherwise define @\. +% +% The \mathchar is class=0=ordinary, family=7=ttfam, position=5C=\. +\def\mathbackslash{\ifnum\fam=\ttfam \mathchar"075C \else\backslash \fi} +% +\def\math{% + \tex + \mathunderscore + \let\\ = \mathbackslash + \mathactive + $\finishmath +} +\def\finishmath#1{#1$\endgroup} % Close the group opened by \tex. + +% Some active characters (such as <) are spaced differently in math. +% We have to reset their definitions in case the @math was an argument +% to a command which sets the catcodes (such as @item or @section). +% +{ + \catcode`^ = \active + \catcode`< = \active + \catcode`> = \active + \catcode`+ = \active + \gdef\mathactive{% + \let^ = \ptexhat + \let< = \ptexless + \let> = \ptexgtr + \let+ = \ptexplus + } +} + +% @bullet and @minus need the same treatment as @math, just above. +\def\bullet{$\ptexbullet$} +\def\minus{$-$} + +% @dots{} outputs an ellipsis using the current font. +% We do .5em per period so that it has the same spacing in a typewriter +% font as three actual period characters. +% +\def\dots{% + \leavevmode + \hbox to 1.5em{% + \hskip 0pt plus 0.25fil + .\hfil.\hfil.% + \hskip 0pt plus 0.5fil + }% +} + +% @enddots{} is an end-of-sentence ellipsis. +% +\def\enddots{% + \dots + \spacefactor=3000 +} + +% @comma{} is so commas can be inserted into text without messing up +% Texinfo's parsing. +% +\let\comma = , + +% @refill is a no-op. +\let\refill=\relax + +% If working on a large document in chapters, it is convenient to +% be able to disable indexing, cross-referencing, and contents, for test runs. +% This is done with @novalidate (before @setfilename). +% +\newif\iflinks \linkstrue % by default we want the aux files. +\let\novalidate = \linksfalse + +% @setfilename is done at the beginning of every texinfo file. +% So open here the files we need to have open while reading the input. +% This makes it possible to make a .fmt file for texinfo. +\def\setfilename{% + \fixbackslash % Turn off hack to swallow `\input texinfo'. + \iflinks + \tryauxfile + % Open the new aux file. TeX will close it automatically at exit. + \immediate\openout\auxfile=\jobname.aux + \fi % \openindices needs to do some work in any case. + \openindices + \let\setfilename=\comment % Ignore extra @setfilename cmds. + % + % If texinfo.cnf is present on the system, read it. + % Useful for site-wide @afourpaper, etc. + \openin 1 texinfo.cnf + \ifeof 1 \else \input texinfo.cnf \fi + \closein 1 + % + \comment % Ignore the actual filename. +} + +% Called from \setfilename. +% +\def\openindices{% + \newindex{cp}% + \newcodeindex{fn}% + \newcodeindex{vr}% + \newcodeindex{tp}% + \newcodeindex{ky}% + \newcodeindex{pg}% +} + +% @bye. +\outer\def\bye{\pagealignmacro\tracingstats=1\ptexend} + + +\message{pdf,} +% adobe `portable' document format +\newcount\tempnum +\newcount\lnkcount +\newtoks\filename +\newcount\filenamelength +\newcount\pgn +\newtoks\toksA +\newtoks\toksB +\newtoks\toksC +\newtoks\toksD +\newbox\boxA +\newcount\countA +\newif\ifpdf +\newif\ifpdfmakepagedest + +% when pdftex is run in dvi mode, \pdfoutput is defined (so \pdfoutput=1 +% can be set). So we test for \relax and 0 as well as \undefined, +% borrowed from ifpdf.sty. +\ifx\pdfoutput\undefined +\else + \ifx\pdfoutput\relax + \else + \ifcase\pdfoutput + \else + \pdftrue + \fi + \fi +\fi +% +\ifpdf + \input pdfcolor + \pdfcatalog{/PageMode /UseOutlines}% + \def\dopdfimage#1#2#3{% + \def\imagewidth{#2}% + \def\imageheight{#3}% + % without \immediate, pdftex seg faults when the same image is + % included twice. (Version 3.14159-pre-1.0-unofficial-20010704.) + \ifnum\pdftexversion < 14 + \immediate\pdfimage + \else + \immediate\pdfximage + \fi + \ifx\empty\imagewidth\else width \imagewidth \fi + \ifx\empty\imageheight\else height \imageheight \fi + \ifnum\pdftexversion<13 + #1.pdf% + \else + {#1.pdf}% + \fi + \ifnum\pdftexversion < 14 \else + \pdfrefximage \pdflastximage + \fi} + \def\pdfmkdest#1{{% + % We have to set dummies so commands such as @code in a section title + % aren't expanded. + \atdummies + \normalturnoffactive + \pdfdest name{#1} xyz% + }} + \def\pdfmkpgn#1{#1} + \let\linkcolor = \Blue % was Cyan, but that seems light? + \def\endlink{\Black\pdfendlink} + % Adding outlines to PDF; macros for calculating structure of outlines + % come from Petr Olsak + \def\expnumber#1{\expandafter\ifx\csname#1\endcsname\relax 0% + \else \csname#1\endcsname \fi} + \def\advancenumber#1{\tempnum=\expnumber{#1}\relax + \advance\tempnum by 1 + \expandafter\xdef\csname#1\endcsname{\the\tempnum}} + % + % #1 is the section text. #2 is the pdf expression for the number + % of subentries (or empty, for subsubsections). #3 is the node + % text, which might be empty if this toc entry had no + % corresponding node. #4 is the page number. + % + \def\dopdfoutline#1#2#3#4{% + % Generate a link to the node text if that exists; else, use the + % page number. We could generate a destination for the section + % text in the case where a section has no node, but it doesn't + % seem worthwhile, since most documents are normally structured. + \def\pdfoutlinedest{#3}% + \ifx\pdfoutlinedest\empty \def\pdfoutlinedest{#4}\fi + % + \pdfoutline goto name{\pdfmkpgn{\pdfoutlinedest}}#2{#1}% + } + % + \def\pdfmakeoutlines{% + \begingroup + % Thanh's hack / proper braces in bookmarks + \edef\mylbrace{\iftrue \string{\else}\fi}\let\{=\mylbrace + \edef\myrbrace{\iffalse{\else\string}\fi}\let\}=\myrbrace + % + % Read toc silently, to get counts of subentries for \pdfoutline. + \def\numchapentry##1##2##3##4{% + \def\thischapnum{##2}% + \let\thissecnum\empty + \let\thissubsecnum\empty + }% + \def\numsecentry##1##2##3##4{% + \advancenumber{chap\thischapnum}% + \def\thissecnum{##2}% + \let\thissubsecnum\empty + }% + \def\numsubsecentry##1##2##3##4{% + \advancenumber{sec\thissecnum}% + \def\thissubsecnum{##2}% + }% + \def\numsubsubsecentry##1##2##3##4{% + \advancenumber{subsec\thissubsecnum}% + }% + \let\thischapnum\empty + \let\thissecnum\empty + \let\thissubsecnum\empty + % + % use \def rather than \let here because we redefine \chapentry et + % al. a second time, below. + \def\appentry{\numchapentry}% + \def\appsecentry{\numsecentry}% + \def\appsubsecentry{\numsubsecentry}% + \def\appsubsubsecentry{\numsubsubsecentry}% + \def\unnchapentry{\numchapentry}% + \def\unnsecentry{\numsecentry}% + \def\unnsubsecentry{\numsubsecentry}% + \def\unnsubsubsecentry{\numsubsubsecentry}% + \input \jobname.toc + % + % Read toc second time, this time actually producing the outlines. + % The `-' means take the \expnumber as the absolute number of + % subentries, which we calculated on our first read of the .toc above. + % + % We use the node names as the destinations. + \def\numchapentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{chap##2}}{##3}{##4}}% + \def\numsecentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{sec##2}}{##3}{##4}}% + \def\numsubsecentry##1##2##3##4{% + \dopdfoutline{##1}{count-\expnumber{subsec##2}}{##3}{##4}}% + \def\numsubsubsecentry##1##2##3##4{% count is always zero + \dopdfoutline{##1}{}{##3}{##4}}% + % + % PDF outlines are displayed using system fonts, instead of + % document fonts. Therefore we cannot use special characters, + % since the encoding is unknown. For example, the eogonek from + % Latin 2 (0xea) gets translated to a | character. Info from + % Staszek Wawrykiewicz, 19 Jan 2004 04:09:24 +0100. + % + % xx to do this right, we have to translate 8-bit characters to + % their "best" equivalent, based on the @documentencoding. Right + % now, I guess we'll just let the pdf reader have its way. + \indexnofonts + \turnoffactive + \input \jobname.toc + \endgroup + } + % + \def\makelinks #1,{% + \def\params{#1}\def\E{END}% + \ifx\params\E + \let\nextmakelinks=\relax + \else + \let\nextmakelinks=\makelinks + \ifnum\lnkcount>0,\fi + \picknum{#1}% + \startlink attr{/Border [0 0 0]} + goto name{\pdfmkpgn{\the\pgn}}% + \linkcolor #1% + \advance\lnkcount by 1% + \endlink + \fi + \nextmakelinks + } + \def\picknum#1{\expandafter\pn#1} + \def\pn#1{% + \def\p{#1}% + \ifx\p\lbrace + \let\nextpn=\ppn + \else + \let\nextpn=\ppnn + \def\first{#1} + \fi + \nextpn + } + \def\ppn#1{\pgn=#1\gobble} + \def\ppnn{\pgn=\first} + \def\pdfmklnk#1{\lnkcount=0\makelinks #1,END,} + \def\skipspaces#1{\def\PP{#1}\def\D{|}% + \ifx\PP\D\let\nextsp\relax + \else\let\nextsp\skipspaces + \ifx\p\space\else\addtokens{\filename}{\PP}% + \advance\filenamelength by 1 + \fi + \fi + \nextsp} + \def\getfilename#1{\filenamelength=0\expandafter\skipspaces#1|\relax} + \ifnum\pdftexversion < 14 + \let \startlink \pdfannotlink + \else + \let \startlink \pdfstartlink + \fi + \def\pdfurl#1{% + \begingroup + \normalturnoffactive\def\@{@}% + \makevalueexpandable + \leavevmode\Red + \startlink attr{/Border [0 0 0]}% + user{/Subtype /Link /A << /S /URI /URI (#1) >>}% + \endgroup} + \def\pdfgettoks#1.{\setbox\boxA=\hbox{\toksA={#1.}\toksB={}\maketoks}} + \def\addtokens#1#2{\edef\addtoks{\noexpand#1={\the#1#2}}\addtoks} + \def\adn#1{\addtokens{\toksC}{#1}\global\countA=1\let\next=\maketoks} + \def\poptoks#1#2|ENDTOKS|{\let\first=#1\toksD={#1}\toksA={#2}} + \def\maketoks{% + \expandafter\poptoks\the\toksA|ENDTOKS|\relax + \ifx\first0\adn0 + \else\ifx\first1\adn1 \else\ifx\first2\adn2 \else\ifx\first3\adn3 + \else\ifx\first4\adn4 \else\ifx\first5\adn5 \else\ifx\first6\adn6 + \else\ifx\first7\adn7 \else\ifx\first8\adn8 \else\ifx\first9\adn9 + \else + \ifnum0=\countA\else\makelink\fi + \ifx\first.\let\next=\done\else + \let\next=\maketoks + \addtokens{\toksB}{\the\toksD} + \ifx\first,\addtokens{\toksB}{\space}\fi + \fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \next} + \def\makelink{\addtokens{\toksB}% + {\noexpand\pdflink{\the\toksC}}\toksC={}\global\countA=0} + \def\pdflink#1{% + \startlink attr{/Border [0 0 0]} goto name{\pdfmkpgn{#1}} + \linkcolor #1\endlink} + \def\done{\edef\st{\global\noexpand\toksA={\the\toksB}}\st} +\else + \let\pdfmkdest = \gobble + \let\pdfurl = \gobble + \let\endlink = \relax + \let\linkcolor = \relax + \let\pdfmakeoutlines = \relax +\fi % \ifx\pdfoutput + + +\message{fonts,} + +% Change the current font style to #1, remembering it in \curfontstyle. +% For now, we do not accumulate font styles: @b{@i{foo}} prints foo in +% italics, not bold italics. +% +\def\setfontstyle#1{% + \def\curfontstyle{#1}% not as a control sequence, because we are \edef'd. + \csname ten#1\endcsname % change the current font +} + +% Select #1 fonts with the current style. +% +\def\selectfonts#1{\csname #1fonts\endcsname \csname\curfontstyle\endcsname} + +\def\rm{\fam=0 \setfontstyle{rm}} +\def\it{\fam=\itfam \setfontstyle{it}} +\def\sl{\fam=\slfam \setfontstyle{sl}} +\def\bf{\fam=\bffam \setfontstyle{bf}} +\def\tt{\fam=\ttfam \setfontstyle{tt}} + +% Texinfo sort of supports the sans serif font style, which plain TeX does not. +% So we set up a \sf. +\newfam\sffam +\def\sf{\fam=\sffam \setfontstyle{sf}} +\let\li = \sf % Sometimes we call it \li, not \sf. + +% We don't need math for this font style. +\def\ttsl{\setfontstyle{ttsl}} + +% Default leading. +\newdimen\textleading \textleading = 13.2pt + +% Set the baselineskip to #1, and the lineskip and strut size +% correspondingly. There is no deep meaning behind these magic numbers +% used as factors; they just match (closely enough) what Knuth defined. +% +\def\lineskipfactor{.08333} +\def\strutheightpercent{.70833} +\def\strutdepthpercent {.29167} +% +\def\setleading#1{% + \normalbaselineskip = #1\relax + \normallineskip = \lineskipfactor\normalbaselineskip + \normalbaselines + \setbox\strutbox =\hbox{% + \vrule width0pt height\strutheightpercent\baselineskip + depth \strutdepthpercent \baselineskip + }% +} + +% Set the font macro #1 to the font named #2, adding on the +% specified font prefix (normally `cm'). +% #3 is the font's design size, #4 is a scale factor +\def\setfont#1#2#3#4{\font#1=\fontprefix#2#3 scaled #4} + +% Use cm as the default font prefix. +% To specify the font prefix, you must define \fontprefix +% before you read in texinfo.tex. +\ifx\fontprefix\undefined +\def\fontprefix{cm} +\fi +% Support font families that don't use the same naming scheme as CM. +\def\rmshape{r} +\def\rmbshape{bx} %where the normal face is bold +\def\bfshape{b} +\def\bxshape{bx} +\def\ttshape{tt} +\def\ttbshape{tt} +\def\ttslshape{sltt} +\def\itshape{ti} +\def\itbshape{bxti} +\def\slshape{sl} +\def\slbshape{bxsl} +\def\sfshape{ss} +\def\sfbshape{ss} +\def\scshape{csc} +\def\scbshape{csc} + +% Text fonts (11.2pt, magstep1). +\newcount\mainmagstep +\ifx\bigger\relax + % not really supported. + \mainmagstep=\magstep1 + \setfont\textrm\rmshape{12}{1000} + \setfont\texttt\ttshape{12}{1000} +\else + \mainmagstep=\magstephalf + \setfont\textrm\rmshape{10}{\mainmagstep} + \setfont\texttt\ttshape{10}{\mainmagstep} +\fi +\setfont\textbf\bfshape{10}{\mainmagstep} +\setfont\textit\itshape{10}{\mainmagstep} +\setfont\textsl\slshape{10}{\mainmagstep} +\setfont\textsf\sfshape{10}{\mainmagstep} +\setfont\textsc\scshape{10}{\mainmagstep} +\setfont\textttsl\ttslshape{10}{\mainmagstep} +\font\texti=cmmi10 scaled \mainmagstep +\font\textsy=cmsy10 scaled \mainmagstep + +% A few fonts for @defun names and args. +\setfont\defbf\bfshape{10}{\magstep1} +\setfont\deftt\ttshape{10}{\magstep1} +\setfont\defttsl\ttslshape{10}{\magstep1} +\def\df{\let\tentt=\deftt \let\tenbf = \defbf \let\tenttsl=\defttsl \bf} + +% Fonts for indices, footnotes, small examples (9pt). +\setfont\smallrm\rmshape{9}{1000} +\setfont\smalltt\ttshape{9}{1000} +\setfont\smallbf\bfshape{10}{900} +\setfont\smallit\itshape{9}{1000} +\setfont\smallsl\slshape{9}{1000} +\setfont\smallsf\sfshape{9}{1000} +\setfont\smallsc\scshape{10}{900} +\setfont\smallttsl\ttslshape{10}{900} +\font\smalli=cmmi9 +\font\smallsy=cmsy9 + +% Fonts for small examples (8pt). +\setfont\smallerrm\rmshape{8}{1000} +\setfont\smallertt\ttshape{8}{1000} +\setfont\smallerbf\bfshape{10}{800} +\setfont\smallerit\itshape{8}{1000} +\setfont\smallersl\slshape{8}{1000} +\setfont\smallersf\sfshape{8}{1000} +\setfont\smallersc\scshape{10}{800} +\setfont\smallerttsl\ttslshape{10}{800} +\font\smalleri=cmmi8 +\font\smallersy=cmsy8 + +% Fonts for title page (20.4pt): +\setfont\titlerm\rmbshape{12}{\magstep3} +\setfont\titleit\itbshape{10}{\magstep4} +\setfont\titlesl\slbshape{10}{\magstep4} +\setfont\titlett\ttbshape{12}{\magstep3} +\setfont\titlettsl\ttslshape{10}{\magstep4} +\setfont\titlesf\sfbshape{17}{\magstep1} +\let\titlebf=\titlerm +\setfont\titlesc\scbshape{10}{\magstep4} +\font\titlei=cmmi12 scaled \magstep3 +\font\titlesy=cmsy10 scaled \magstep4 +\def\authorrm{\secrm} +\def\authortt{\sectt} + +% Chapter (and unnumbered) fonts (17.28pt). +\setfont\chaprm\rmbshape{12}{\magstep2} +\setfont\chapit\itbshape{10}{\magstep3} +\setfont\chapsl\slbshape{10}{\magstep3} +\setfont\chaptt\ttbshape{12}{\magstep2} +\setfont\chapttsl\ttslshape{10}{\magstep3} +\setfont\chapsf\sfbshape{17}{1000} +\let\chapbf=\chaprm +\setfont\chapsc\scbshape{10}{\magstep3} +\font\chapi=cmmi12 scaled \magstep2 +\font\chapsy=cmsy10 scaled \magstep3 + +% Section fonts (14.4pt). +\setfont\secrm\rmbshape{12}{\magstep1} +\setfont\secit\itbshape{10}{\magstep2} +\setfont\secsl\slbshape{10}{\magstep2} +\setfont\sectt\ttbshape{12}{\magstep1} +\setfont\secttsl\ttslshape{10}{\magstep2} +\setfont\secsf\sfbshape{12}{\magstep1} +\let\secbf\secrm +\setfont\secsc\scbshape{10}{\magstep2} +\font\seci=cmmi12 scaled \magstep1 +\font\secsy=cmsy10 scaled \magstep2 + +% Subsection fonts (13.15pt). +\setfont\ssecrm\rmbshape{12}{\magstephalf} +\setfont\ssecit\itbshape{10}{1315} +\setfont\ssecsl\slbshape{10}{1315} +\setfont\ssectt\ttbshape{12}{\magstephalf} +\setfont\ssecttsl\ttslshape{10}{1315} +\setfont\ssecsf\sfbshape{12}{\magstephalf} +\let\ssecbf\ssecrm +\setfont\ssecsc\scbshape{10}{1315} +\font\sseci=cmmi12 scaled \magstephalf +\font\ssecsy=cmsy10 scaled 1315 + +% Reduced fonts for @acro in text (10pt). +\setfont\reducedrm\rmshape{10}{1000} +\setfont\reducedtt\ttshape{10}{1000} +\setfont\reducedbf\bfshape{10}{1000} +\setfont\reducedit\itshape{10}{1000} +\setfont\reducedsl\slshape{10}{1000} +\setfont\reducedsf\sfshape{10}{1000} +\setfont\reducedsc\scshape{10}{1000} +\setfont\reducedttsl\ttslshape{10}{1000} +\font\reducedi=cmmi10 +\font\reducedsy=cmsy10 + +% In order for the font changes to affect most math symbols and letters, +% we have to define the \textfont of the standard families. Since +% texinfo doesn't allow for producing subscripts and superscripts except +% in the main text, we don't bother to reset \scriptfont and +% \scriptscriptfont (which would also require loading a lot more fonts). +% +\def\resetmathfonts{% + \textfont0=\tenrm \textfont1=\teni \textfont2=\tensy + \textfont\itfam=\tenit \textfont\slfam=\tensl \textfont\bffam=\tenbf + \textfont\ttfam=\tentt \textfont\sffam=\tensf +} + +% The font-changing commands redefine the meanings of \tenSTYLE, instead +% of just \STYLE. We do this because \STYLE needs to also set the +% current \fam for math mode. Our \STYLE (e.g., \rm) commands hardwire +% \tenSTYLE to set the current font. +% +% Each font-changing command also sets the names \lsize (one size lower) +% and \lllsize (three sizes lower). These relative commands are used in +% the LaTeX logo and acronyms. +% +% This all needs generalizing, badly. +% +\def\textfonts{% + \let\tenrm=\textrm \let\tenit=\textit \let\tensl=\textsl + \let\tenbf=\textbf \let\tentt=\texttt \let\smallcaps=\textsc + \let\tensf=\textsf \let\teni=\texti \let\tensy=\textsy + \let\tenttsl=\textttsl + \def\lsize{reduced}\def\lllsize{smaller}% + \resetmathfonts \setleading{\textleading}} +\def\titlefonts{% + \let\tenrm=\titlerm \let\tenit=\titleit \let\tensl=\titlesl + \let\tenbf=\titlebf \let\tentt=\titlett \let\smallcaps=\titlesc + \let\tensf=\titlesf \let\teni=\titlei \let\tensy=\titlesy + \let\tenttsl=\titlettsl + \def\lsize{chap}\def\lllsize{subsec}% + \resetmathfonts \setleading{25pt}} +\def\titlefont#1{{\titlefonts\rm #1}} +\def\chapfonts{% + \let\tenrm=\chaprm \let\tenit=\chapit \let\tensl=\chapsl + \let\tenbf=\chapbf \let\tentt=\chaptt \let\smallcaps=\chapsc + \let\tensf=\chapsf \let\teni=\chapi \let\tensy=\chapsy \let\tenttsl=\chapttsl + \def\lsize{sec}\def\lllsize{text}% + \resetmathfonts \setleading{19pt}} +\def\secfonts{% + \let\tenrm=\secrm \let\tenit=\secit \let\tensl=\secsl + \let\tenbf=\secbf \let\tentt=\sectt \let\smallcaps=\secsc + \let\tensf=\secsf \let\teni=\seci \let\tensy=\secsy + \let\tenttsl=\secttsl + \def\lsize{subsec}\def\lllsize{reduced}% + \resetmathfonts \setleading{16pt}} +\def\subsecfonts{% + \let\tenrm=\ssecrm \let\tenit=\ssecit \let\tensl=\ssecsl + \let\tenbf=\ssecbf \let\tentt=\ssectt \let\smallcaps=\ssecsc + \let\tensf=\ssecsf \let\teni=\sseci \let\tensy=\ssecsy + \let\tenttsl=\ssecttsl + \def\lsize{text}\def\lllsize{small}% + \resetmathfonts \setleading{15pt}} +\let\subsubsecfonts = \subsecfonts +\def\reducedfonts{% + \let\tenrm=\reducedrm \let\tenit=\reducedit \let\tensl=\reducedsl + \let\tenbf=\reducedbf \let\tentt=\reducedtt \let\reducedcaps=\reducedsc + \let\tensf=\reducedsf \let\teni=\reducedi \let\tensy=\reducedsy + \let\tenttsl=\reducedttsl + \def\lsize{small}\def\lllsize{smaller}% + \resetmathfonts \setleading{10.5pt}} +\def\smallfonts{% + \let\tenrm=\smallrm \let\tenit=\smallit \let\tensl=\smallsl + \let\tenbf=\smallbf \let\tentt=\smalltt \let\smallcaps=\smallsc + \let\tensf=\smallsf \let\teni=\smalli \let\tensy=\smallsy + \let\tenttsl=\smallttsl + \def\lsize{smaller}\def\lllsize{smaller}% + \resetmathfonts \setleading{10.5pt}} +\def\smallerfonts{% + \let\tenrm=\smallerrm \let\tenit=\smallerit \let\tensl=\smallersl + \let\tenbf=\smallerbf \let\tentt=\smallertt \let\smallcaps=\smallersc + \let\tensf=\smallersf \let\teni=\smalleri \let\tensy=\smallersy + \let\tenttsl=\smallerttsl + \def\lsize{smaller}\def\lllsize{smaller}% + \resetmathfonts \setleading{9.5pt}} + +% Set the fonts to use with the @small... environments. +\let\smallexamplefonts = \smallfonts + +% About \smallexamplefonts. If we use \smallfonts (9pt), @smallexample +% can fit this many characters: +% 8.5x11=86 smallbook=72 a4=90 a5=69 +% If we use \scriptfonts (8pt), then we can fit this many characters: +% 8.5x11=90+ smallbook=80 a4=90+ a5=77 +% For me, subjectively, the few extra characters that fit aren't worth +% the additional smallness of 8pt. So I'm making the default 9pt. +% +% By the way, for comparison, here's what fits with @example (10pt): +% 8.5x11=71 smallbook=60 a4=75 a5=58 +% +% I wish the USA used A4 paper. +% --karl, 24jan03. + + +% Set up the default fonts, so we can use them for creating boxes. +% +\textfonts \rm + +% Define these so they can be easily changed for other fonts. +\def\angleleft{$\langle$} +\def\angleright{$\rangle$} + +% Count depth in font-changes, for error checks +\newcount\fontdepth \fontdepth=0 + +% Fonts for short table of contents. +\setfont\shortcontrm\rmshape{12}{1000} +\setfont\shortcontbf\bfshape{10}{\magstep1} % no cmb12 +\setfont\shortcontsl\slshape{12}{1000} +\setfont\shortconttt\ttshape{12}{1000} + +%% Add scribe-like font environments, plus @l for inline lisp (usually sans +%% serif) and @ii for TeX italic + +% \smartitalic{ARG} outputs arg in italics, followed by an italic correction +% unless the following character is such as not to need one. +\def\smartitalicx{\ifx\next,\else\ifx\next-\else\ifx\next.\else + \ptexslash\fi\fi\fi} +\def\smartslanted#1{{\ifusingtt\ttsl\sl #1}\futurelet\next\smartitalicx} +\def\smartitalic#1{{\ifusingtt\ttsl\it #1}\futurelet\next\smartitalicx} + +% like \smartslanted except unconditionally uses \ttsl. +% @var is set to this for defun arguments. +\def\ttslanted#1{{\ttsl #1}\futurelet\next\smartitalicx} + +% like \smartslanted except unconditionally use \sl. We never want +% ttsl for book titles, do we? +\def\cite#1{{\sl #1}\futurelet\next\smartitalicx} + +\let\i=\smartitalic +\let\var=\smartslanted +\let\dfn=\smartslanted +\let\emph=\smartitalic + +\def\b#1{{\bf #1}} +\let\strong=\b + +% We can't just use \exhyphenpenalty, because that only has effect at +% the end of a paragraph. Restore normal hyphenation at the end of the +% group within which \nohyphenation is presumably called. +% +\def\nohyphenation{\hyphenchar\font = -1 \aftergroup\restorehyphenation} +\def\restorehyphenation{\hyphenchar\font = `- } + +% Set sfcode to normal for the chars that usually have another value. +% Can't use plain's \frenchspacing because it uses the `\x notation, and +% sometimes \x has an active definition that messes things up. +% +\catcode`@=11 + \def\frenchspacing{% + \sfcode\dotChar =\@m \sfcode\questChar=\@m \sfcode\exclamChar=\@m + \sfcode\colonChar=\@m \sfcode\semiChar =\@m \sfcode\commaChar =\@m + } +\catcode`@=\other + +\def\t#1{% + {\tt \rawbackslash \frenchspacing #1}% + \null +} +\def\samp#1{`\tclose{#1}'\null} +\setfont\keyrm\rmshape{8}{1000} +\font\keysy=cmsy9 +\def\key#1{{\keyrm\textfont2=\keysy \leavevmode\hbox{% + \raise0.4pt\hbox{\angleleft}\kern-.08em\vtop{% + \vbox{\hrule\kern-0.4pt + \hbox{\raise0.4pt\hbox{\vphantom{\angleleft}}#1}}% + \kern-0.4pt\hrule}% + \kern-.06em\raise0.4pt\hbox{\angleright}}}} +% The old definition, with no lozenge: +%\def\key #1{{\ttsl \nohyphenation \uppercase{#1}}\null} +\def\ctrl #1{{\tt \rawbackslash \hat}#1} + +% @file, @option are the same as @samp. +\let\file=\samp +\let\option=\samp + +% @code is a modification of @t, +% which makes spaces the same size as normal in the surrounding text. +\def\tclose#1{% + {% + % Change normal interword space to be same as for the current font. + \spaceskip = \fontdimen2\font + % + % Switch to typewriter. + \tt + % + % But `\ ' produces the large typewriter interword space. + \def\ {{\spaceskip = 0pt{} }}% + % + % Turn off hyphenation. + \nohyphenation + % + \rawbackslash + \frenchspacing + #1% + }% + \null +} + +% We *must* turn on hyphenation at `-' and `_' in @code. +% Otherwise, it is too hard to avoid overfull hboxes +% in the Emacs manual, the Library manual, etc. + +% Unfortunately, TeX uses one parameter (\hyphenchar) to control +% both hyphenation at - and hyphenation within words. +% We must therefore turn them both off (\tclose does that) +% and arrange explicitly to hyphenate at a dash. +% -- rms. +{ + \catcode`\-=\active + \catcode`\_=\active + % + \global\def\code{\begingroup + \catcode`\-=\active \let-\codedash + \catcode`\_=\active \let_\codeunder + \codex + } +} + +\def\realdash{-} +\def\codedash{-\discretionary{}{}{}} +\def\codeunder{% + % this is all so @math{@code{var_name}+1} can work. In math mode, _ + % is "active" (mathcode"8000) and \normalunderscore (or \char95, etc.) + % will therefore expand the active definition of _, which is us + % (inside @code that is), therefore an endless loop. + \ifusingtt{\ifmmode + \mathchar"075F % class 0=ordinary, family 7=ttfam, pos 0x5F=_. + \else\normalunderscore \fi + \discretionary{}{}{}}% + {\_}% +} +\def\codex #1{\tclose{#1}\endgroup} + +% @kbd is like @code, except that if the argument is just one @key command, +% then @kbd has no effect. + +% @kbdinputstyle -- arg is `distinct' (@kbd uses slanted tty font always), +% `example' (@kbd uses ttsl only inside of @example and friends), +% or `code' (@kbd uses normal tty font always). +\parseargdef\kbdinputstyle{% + \def\arg{#1}% + \ifx\arg\worddistinct + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\ttsl}% + \else\ifx\arg\wordexample + \gdef\kbdexamplefont{\ttsl}\gdef\kbdfont{\tt}% + \else\ifx\arg\wordcode + \gdef\kbdexamplefont{\tt}\gdef\kbdfont{\tt}% + \else + \errhelp = \EMsimple + \errmessage{Unknown @kbdinputstyle option `\arg'}% + \fi\fi\fi +} +\def\worddistinct{distinct} +\def\wordexample{example} +\def\wordcode{code} + +% Default is `distinct.' +\kbdinputstyle distinct + +\def\xkey{\key} +\def\kbdfoo#1#2#3\par{\def\one{#1}\def\three{#3}\def\threex{??}% +\ifx\one\xkey\ifx\threex\three \key{#2}% +\else{\tclose{\kbdfont\look}}\fi +\else{\tclose{\kbdfont\look}}\fi} + +% For @indicateurl, @env, @command quotes seem unnecessary, so use \code. +\let\indicateurl=\code +\let\env=\code +\let\command=\code + +% @uref (abbreviation for `urlref') takes an optional (comma-separated) +% second argument specifying the text to display and an optional third +% arg as text to display instead of (rather than in addition to) the url +% itself. First (mandatory) arg is the url. Perhaps eventually put in +% a hypertex \special here. +% +\def\uref#1{\douref #1,,,\finish} +\def\douref#1,#2,#3,#4\finish{\begingroup + \unsepspaces + \pdfurl{#1}% + \setbox0 = \hbox{\ignorespaces #3}% + \ifdim\wd0 > 0pt + \unhbox0 % third arg given, show only that + \else + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0 > 0pt + \ifpdf + \unhbox0 % PDF: 2nd arg given, show only it + \else + \unhbox0\ (\code{#1})% DVI: 2nd arg given, show both it and url + \fi + \else + \code{#1}% only url given, so show it + \fi + \fi + \endlink +\endgroup} + +% @url synonym for @uref, since that's how everyone uses it. +% +\let\url=\uref + +% rms does not like angle brackets --karl, 17may97. +% So now @email is just like @uref, unless we are pdf. +% +%\def\email#1{\angleleft{\tt #1}\angleright} +\ifpdf + \def\email#1{\doemail#1,,\finish} + \def\doemail#1,#2,#3\finish{\begingroup + \unsepspaces + \pdfurl{mailto:#1}% + \setbox0 = \hbox{\ignorespaces #2}% + \ifdim\wd0>0pt\unhbox0\else\code{#1}\fi + \endlink + \endgroup} +\else + \let\email=\uref +\fi + +% Check if we are currently using a typewriter font. Since all the +% Computer Modern typewriter fonts have zero interword stretch (and +% shrink), and it is reasonable to expect all typewriter fonts to have +% this property, we can check that font parameter. +% +\def\ifmonospace{\ifdim\fontdimen3\font=0pt } + +% Typeset a dimension, e.g., `in' or `pt'. The only reason for the +% argument is to make the input look right: @dmn{pt} instead of @dmn{}pt. +% +\def\dmn#1{\thinspace #1} + +\def\kbd#1{\def\look{#1}\expandafter\kbdfoo\look??\par} + +% @l was never documented to mean ``switch to the Lisp font'', +% and it is not used as such in any manual I can find. We need it for +% Polish suppressed-l. --karl, 22sep96. +%\def\l#1{{\li #1}\null} + +% Explicit font changes: @r, @sc, undocumented @ii. +\def\r#1{{\rm #1}} % roman font +\def\sc#1{{\smallcaps#1}} % smallcaps font +\def\ii#1{{\it #1}} % italic font + +\def\acronym#1{\doacronym #1,,\finish} +\def\doacronym#1,#2,#3\finish{% + {\selectfonts\lsize #1}% + \def\temp{#2}% + \ifx\temp\empty \else + \space ({\unsepspaces \ignorespaces \temp \unskip})% + \fi +} + +% @pounds{} is a sterling sign, which is in the CM italic font. +% +\def\pounds{{\it\$}} + +% @registeredsymbol - R in a circle. The font for the R should really +% be smaller yet, but lllsize is the best we can do for now. +% Adapted from the plain.tex definition of \copyright. +% +\def\registeredsymbol{% + $^{{\ooalign{\hfil\raise.07ex\hbox{\selectfonts\lllsize R}% + \hfil\crcr\Orb}}% + }$% +} + +% Laurent Siebenmann reports \Orb undefined with: +% Textures 1.7.7 (preloaded format=plain 93.10.14) (68K) 16 APR 2004 02:38 +% so we'll define it if necessary. +% +\ifx\Orb\undefined +\def\Orb{\mathhexbox20D} +\fi + + +\message{page headings,} + +\newskip\titlepagetopglue \titlepagetopglue = 1.5in +\newskip\titlepagebottomglue \titlepagebottomglue = 2pc + +% First the title page. Must do @settitle before @titlepage. +\newif\ifseenauthor +\newif\iffinishedtitlepage + +% Do an implicit @contents or @shortcontents after @end titlepage if the +% user says @setcontentsaftertitlepage or @setshortcontentsaftertitlepage. +% +\newif\ifsetcontentsaftertitlepage + \let\setcontentsaftertitlepage = \setcontentsaftertitlepagetrue +\newif\ifsetshortcontentsaftertitlepage + \let\setshortcontentsaftertitlepage = \setshortcontentsaftertitlepagetrue + +\parseargdef\shorttitlepage{\begingroup\hbox{}\vskip 1.5in \chaprm \centerline{#1}% + \endgroup\page\hbox{}\page} + +\envdef\titlepage{% + % Open one extra group, as we want to close it in the middle of \Etitlepage. + \begingroup + \parindent=0pt \textfonts + % Leave some space at the very top of the page. + \vglue\titlepagetopglue + % No rule at page bottom unless we print one at the top with @title. + \finishedtitlepagetrue + % + % Most title ``pages'' are actually two pages long, with space + % at the top of the second. We don't want the ragged left on the second. + \let\oldpage = \page + \def\page{% + \iffinishedtitlepage\else + \finishtitlepage + \fi + \let\page = \oldpage + \page + \null + }% +} + +\def\Etitlepage{% + \iffinishedtitlepage\else + \finishtitlepage + \fi + % It is important to do the page break before ending the group, + % because the headline and footline are only empty inside the group. + % If we use the new definition of \page, we always get a blank page + % after the title page, which we certainly don't want. + \oldpage + \endgroup + % + % Need this before the \...aftertitlepage checks so that if they are + % in effect the toc pages will come out with page numbers. + \HEADINGSon + % + % If they want short, they certainly want long too. + \ifsetshortcontentsaftertitlepage + \shortcontents + \contents + \global\let\shortcontents = \relax + \global\let\contents = \relax + \fi + % + \ifsetcontentsaftertitlepage + \contents + \global\let\contents = \relax + \global\let\shortcontents = \relax + \fi +} + +\def\finishtitlepage{% + \vskip4pt \hrule height 2pt width \hsize + \vskip\titlepagebottomglue + \finishedtitlepagetrue +} + +%%% Macros to be used within @titlepage: + +\let\subtitlerm=\tenrm +\def\subtitlefont{\subtitlerm \normalbaselineskip = 13pt \normalbaselines} + +\def\authorfont{\authorrm \normalbaselineskip = 16pt \normalbaselines + \let\tt=\authortt} + +\parseargdef\title{% + \checkenv\titlepage + \leftline{\titlefonts\rm #1} + % print a rule at the page bottom also. + \finishedtitlepagefalse + \vskip4pt \hrule height 4pt width \hsize \vskip4pt +} + +\parseargdef\subtitle{% + \checkenv\titlepage + {\subtitlefont \rightline{#1}}% +} + +% @author should come last, but may come many times. +% It can also be used inside @quotation. +% +\parseargdef\author{% + \def\temp{\quotation}% + \ifx\thisenv\temp + \def\quotationauthor{#1}% printed in \Equotation. + \else + \checkenv\titlepage + \ifseenauthor\else \vskip 0pt plus 1filll \seenauthortrue \fi + {\authorfont \leftline{#1}}% + \fi +} + + +%%% Set up page headings and footings. + +\let\thispage=\folio + +\newtoks\evenheadline % headline on even pages +\newtoks\oddheadline % headline on odd pages +\newtoks\evenfootline % footline on even pages +\newtoks\oddfootline % footline on odd pages + +% Now make TeX use those variables +\headline={{\textfonts\rm \ifodd\pageno \the\oddheadline + \else \the\evenheadline \fi}} +\footline={{\textfonts\rm \ifodd\pageno \the\oddfootline + \else \the\evenfootline \fi}\HEADINGShook} +\let\HEADINGShook=\relax + +% Commands to set those variables. +% For example, this is what @headings on does +% @evenheading @thistitle|@thispage|@thischapter +% @oddheading @thischapter|@thispage|@thistitle +% @evenfooting @thisfile|| +% @oddfooting ||@thisfile + + +\def\evenheading{\parsearg\evenheadingxxx} +\def\evenheadingxxx #1{\evenheadingyyy #1\|\|\|\|\finish} +\def\evenheadingyyy #1\|#2\|#3\|#4\finish{% +\global\evenheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\def\oddheading{\parsearg\oddheadingxxx} +\def\oddheadingxxx #1{\oddheadingyyy #1\|\|\|\|\finish} +\def\oddheadingyyy #1\|#2\|#3\|#4\finish{% +\global\oddheadline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\parseargdef\everyheading{\oddheadingxxx{#1}\evenheadingxxx{#1}}% + +\def\evenfooting{\parsearg\evenfootingxxx} +\def\evenfootingxxx #1{\evenfootingyyy #1\|\|\|\|\finish} +\def\evenfootingyyy #1\|#2\|#3\|#4\finish{% +\global\evenfootline={\rlap{\centerline{#2}}\line{#1\hfil#3}}} + +\def\oddfooting{\parsearg\oddfootingxxx} +\def\oddfootingxxx #1{\oddfootingyyy #1\|\|\|\|\finish} +\def\oddfootingyyy #1\|#2\|#3\|#4\finish{% + \global\oddfootline = {\rlap{\centerline{#2}}\line{#1\hfil#3}}% + % + % Leave some space for the footline. Hopefully ok to assume + % @evenfooting will not be used by itself. + \global\advance\pageheight by -\baselineskip + \global\advance\vsize by -\baselineskip +} + +\parseargdef\everyfooting{\oddfootingxxx{#1}\evenfootingxxx{#1}} + + +% @headings double turns headings on for double-sided printing. +% @headings single turns headings on for single-sided printing. +% @headings off turns them off. +% @headings on same as @headings double, retained for compatibility. +% @headings after turns on double-sided headings after this page. +% @headings doubleafter turns on double-sided headings after this page. +% @headings singleafter turns on single-sided headings after this page. +% By default, they are off at the start of a document, +% and turned `on' after @end titlepage. + +\def\headings #1 {\csname HEADINGS#1\endcsname} + +\def\HEADINGSoff{% +\global\evenheadline={\hfil} \global\evenfootline={\hfil} +\global\oddheadline={\hfil} \global\oddfootline={\hfil}} +\HEADINGSoff +% When we turn headings on, set the page number to 1. +% For double-sided printing, put current file name in lower left corner, +% chapter name on inside top of right hand pages, document +% title on inside top of left hand pages, and page numbers on outside top +% edge of all pages. +\def\HEADINGSdouble{% +\global\pageno=1 +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\folio\hfil\thistitle}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage +} +\let\contentsalignmacro = \chappager + +% For single-sided printing, chapter title goes across top left of page, +% page number on top right. +\def\HEADINGSsingle{% +\global\pageno=1 +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chappager +} +\def\HEADINGSon{\HEADINGSdouble} + +\def\HEADINGSafter{\let\HEADINGShook=\HEADINGSdoublex} +\let\HEADINGSdoubleafter=\HEADINGSafter +\def\HEADINGSdoublex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\folio\hfil\thistitle}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chapoddpage +} + +\def\HEADINGSsingleafter{\let\HEADINGShook=\HEADINGSsinglex} +\def\HEADINGSsinglex{% +\global\evenfootline={\hfil} +\global\oddfootline={\hfil} +\global\evenheadline={\line{\thischapter\hfil\folio}} +\global\oddheadline={\line{\thischapter\hfil\folio}} +\global\let\contentsalignmacro = \chappager +} + +% Subroutines used in generating headings +% This produces Day Month Year style of output. +% Only define if not already defined, in case a txi-??.tex file has set +% up a different format (e.g., txi-cs.tex does this). +\ifx\today\undefined +\def\today{% + \number\day\space + \ifcase\month + \or\putwordMJan\or\putwordMFeb\or\putwordMMar\or\putwordMApr + \or\putwordMMay\or\putwordMJun\or\putwordMJul\or\putwordMAug + \or\putwordMSep\or\putwordMOct\or\putwordMNov\or\putwordMDec + \fi + \space\number\year} +\fi + +% @settitle line... specifies the title of the document, for headings. +% It generates no output of its own. +\def\thistitle{\putwordNoTitle} +\def\settitle{\parsearg{\gdef\thistitle}} + + +\message{tables,} +% Tables -- @table, @ftable, @vtable, @item(x). + +% default indentation of table text +\newdimen\tableindent \tableindent=.8in +% default indentation of @itemize and @enumerate text +\newdimen\itemindent \itemindent=.3in +% margin between end of table item and start of table text. +\newdimen\itemmargin \itemmargin=.1in + +% used internally for \itemindent minus \itemmargin +\newdimen\itemmax + +% Note @table, @ftable, and @vtable define @item, @itemx, etc., with +% these defs. +% They also define \itemindex +% to index the item name in whatever manner is desired (perhaps none). + +\newif\ifitemxneedsnegativevskip + +\def\itemxpar{\par\ifitemxneedsnegativevskip\nobreak\vskip-\parskip\nobreak\fi} + +\def\internalBitem{\smallbreak \parsearg\itemzzz} +\def\internalBitemx{\itemxpar \parsearg\itemzzz} + +\def\itemzzz #1{\begingroup % + \advance\hsize by -\rightskip + \advance\hsize by -\tableindent + \setbox0=\hbox{\itemindicate{#1}}% + \itemindex{#1}% + \nobreak % This prevents a break before @itemx. + % + % If the item text does not fit in the space we have, put it on a line + % by itself, and do not allow a page break either before or after that + % line. We do not start a paragraph here because then if the next + % command is, e.g., @kindex, the whatsit would get put into the + % horizontal list on a line by itself, resulting in extra blank space. + \ifdim \wd0>\itemmax + % + % Make this a paragraph so we get the \parskip glue and wrapping, + % but leave it ragged-right. + \begingroup + \advance\leftskip by-\tableindent + \advance\hsize by\tableindent + \advance\rightskip by0pt plus1fil + \leavevmode\unhbox0\par + \endgroup + % + % We're going to be starting a paragraph, but we don't want the + % \parskip glue -- logically it's part of the @item we just started. + \nobreak \vskip-\parskip + % + % Stop a page break at the \parskip glue coming up. (Unfortunately + % we can't prevent a possible page break at the following + % \baselineskip glue.) However, if what follows is an environment + % such as @example, there will be no \parskip glue; then + % the negative vskip we just would cause the example and the item to + % crash together. So we use this bizarre value of 10001 as a signal + % to \aboveenvbreak to insert \parskip glue after all. + % (Possibly there are other commands that could be followed by + % @example which need the same treatment, but not section titles; or + % maybe section titles are the only special case and they should be + % penalty 10001...) + \penalty 10001 + \endgroup + \itemxneedsnegativevskipfalse + \else + % The item text fits into the space. Start a paragraph, so that the + % following text (if any) will end up on the same line. + \noindent + % Do this with kerns and \unhbox so that if there is a footnote in + % the item text, it can migrate to the main vertical list and + % eventually be printed. + \nobreak\kern-\tableindent + \dimen0 = \itemmax \advance\dimen0 by \itemmargin \advance\dimen0 by -\wd0 + \unhbox0 + \nobreak\kern\dimen0 + \endgroup + \itemxneedsnegativevskiptrue + \fi +} + +\def\item{\errmessage{@item while not in a list environment}} +\def\itemx{\errmessage{@itemx while not in a list environment}} + +% @table, @ftable, @vtable. +\envdef\table{% + \let\itemindex\gobble + \tablex +} +\envdef\ftable{% + \def\itemindex ##1{\doind {fn}{\code{##1}}}% + \tablex +} +\envdef\vtable{% + \def\itemindex ##1{\doind {vr}{\code{##1}}}% + \tablex +} +\def\tablex#1{% + \def\itemindicate{#1}% + \parsearg\tabley +} +\def\tabley#1{% + {% + \makevalueexpandable + \edef\temp{\noexpand\tablez #1\space\space\space}% + \expandafter + }\temp \endtablez +} +\def\tablez #1 #2 #3 #4\endtablez{% + \aboveenvbreak + \ifnum 0#1>0 \advance \leftskip by #1\mil \fi + \ifnum 0#2>0 \tableindent=#2\mil \fi + \ifnum 0#3>0 \advance \rightskip by #3\mil \fi + \itemmax=\tableindent + \advance \itemmax by -\itemmargin + \advance \leftskip by \tableindent + \exdentamount=\tableindent + \parindent = 0pt + \parskip = \smallskipamount + \ifdim \parskip=0pt \parskip=2pt \fi + \let\item = \internalBitem + \let\itemx = \internalBitemx +} +\def\Etable{\endgraf\afterenvbreak} +\let\Eftable\Etable +\let\Evtable\Etable +\let\Eitemize\Etable +\let\Eenumerate\Etable + +% This is the counter used by @enumerate, which is really @itemize + +\newcount \itemno + +\envdef\itemize{\parsearg\doitemize} + +\def\doitemize#1{% + \aboveenvbreak + \itemmax=\itemindent + \advance\itemmax by -\itemmargin + \advance\leftskip by \itemindent + \exdentamount=\itemindent + \parindent=0pt + \parskip=\smallskipamount + \ifdim\parskip=0pt \parskip=2pt \fi + \def\itemcontents{#1}% + % @itemize with no arg is equivalent to @itemize @bullet. + \ifx\itemcontents\empty\def\itemcontents{\bullet}\fi + \let\item=\itemizeitem +} + +% Definition of @item while inside @itemize and @enumerate. +% +\def\itemizeitem{% + \advance\itemno by 1 % for enumerations + {\let\par=\endgraf \smallbreak}% reasonable place to break + {% + % If the document has an @itemize directly after a section title, a + % \nobreak will be last on the list, and \sectionheading will have + % done a \vskip-\parskip. In that case, we don't want to zero + % parskip, or the item text will crash with the heading. On the + % other hand, when there is normal text preceding the item (as there + % usually is), we do want to zero parskip, or there would be too much + % space. In that case, we won't have a \nobreak before. At least + % that's the theory. + \ifnum\lastpenalty<10000 \parskip=0in \fi + \noindent + \hbox to 0pt{\hss \itemcontents \kern\itemmargin}% + \vadjust{\penalty 1200}}% not good to break after first line of item. + \flushcr +} + +% \splitoff TOKENS\endmark defines \first to be the first token in +% TOKENS, and \rest to be the remainder. +% +\def\splitoff#1#2\endmark{\def\first{#1}\def\rest{#2}}% + +% Allow an optional argument of an uppercase letter, lowercase letter, +% or number, to specify the first label in the enumerated list. No +% argument is the same as `1'. +% +\envparseargdef\enumerate{\enumeratey #1 \endenumeratey} +\def\enumeratey #1 #2\endenumeratey{% + % If we were given no argument, pretend we were given `1'. + \def\thearg{#1}% + \ifx\thearg\empty \def\thearg{1}\fi + % + % Detect if the argument is a single token. If so, it might be a + % letter. Otherwise, the only valid thing it can be is a number. + % (We will always have one token, because of the test we just made. + % This is a good thing, since \splitoff doesn't work given nothing at + % all -- the first parameter is undelimited.) + \expandafter\splitoff\thearg\endmark + \ifx\rest\empty + % Only one token in the argument. It could still be anything. + % A ``lowercase letter'' is one whose \lccode is nonzero. + % An ``uppercase letter'' is one whose \lccode is both nonzero, and + % not equal to itself. + % Otherwise, we assume it's a number. + % + % We need the \relax at the end of the \ifnum lines to stop TeX from + % continuing to look for a . + % + \ifnum\lccode\expandafter`\thearg=0\relax + \numericenumerate % a number (we hope) + \else + % It's a letter. + \ifnum\lccode\expandafter`\thearg=\expandafter`\thearg\relax + \lowercaseenumerate % lowercase letter + \else + \uppercaseenumerate % uppercase letter + \fi + \fi + \else + % Multiple tokens in the argument. We hope it's a number. + \numericenumerate + \fi +} + +% An @enumerate whose labels are integers. The starting integer is +% given in \thearg. +% +\def\numericenumerate{% + \itemno = \thearg + \startenumeration{\the\itemno}% +} + +% The starting (lowercase) letter is in \thearg. +\def\lowercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more lowercase letters in @enumerate; get a bigger + alphabet}% + \fi + \char\lccode\itemno + }% +} + +% The starting (uppercase) letter is in \thearg. +\def\uppercaseenumerate{% + \itemno = \expandafter`\thearg + \startenumeration{% + % Be sure we're not beyond the end of the alphabet. + \ifnum\itemno=0 + \errmessage{No more uppercase letters in @enumerate; get a bigger + alphabet} + \fi + \char\uccode\itemno + }% +} + +% Call \doitemize, adding a period to the first argument and supplying the +% common last two arguments. Also subtract one from the initial value in +% \itemno, since @item increments \itemno. +% +\def\startenumeration#1{% + \advance\itemno by -1 + \doitemize{#1.}\flushcr +} + +% @alphaenumerate and @capsenumerate are abbreviations for giving an arg +% to @enumerate. +% +\def\alphaenumerate{\enumerate{a}} +\def\capsenumerate{\enumerate{A}} +\def\Ealphaenumerate{\Eenumerate} +\def\Ecapsenumerate{\Eenumerate} + + +% @multitable macros +% Amy Hendrickson, 8/18/94, 3/6/96 +% +% @multitable ... @end multitable will make as many columns as desired. +% Contents of each column will wrap at width given in preamble. Width +% can be specified either with sample text given in a template line, +% or in percent of \hsize, the current width of text on page. + +% Table can continue over pages but will only break between lines. + +% To make preamble: +% +% Either define widths of columns in terms of percent of \hsize: +% @multitable @columnfractions .25 .3 .45 +% @item ... +% +% Numbers following @columnfractions are the percent of the total +% current hsize to be used for each column. You may use as many +% columns as desired. + + +% Or use a template: +% @multitable {Column 1 template} {Column 2 template} {Column 3 template} +% @item ... +% using the widest term desired in each column. + +% Each new table line starts with @item, each subsequent new column +% starts with @tab. Empty columns may be produced by supplying @tab's +% with nothing between them for as many times as empty columns are needed, +% ie, @tab@tab@tab will produce two empty columns. + +% @item, @tab do not need to be on their own lines, but it will not hurt +% if they are. + +% Sample multitable: + +% @multitable {Column 1 template} {Column 2 template} {Column 3 template} +% @item first col stuff @tab second col stuff @tab third col +% @item +% first col stuff +% @tab +% second col stuff +% @tab +% third col +% @item first col stuff @tab second col stuff +% @tab Many paragraphs of text may be used in any column. +% +% They will wrap at the width determined by the template. +% @item@tab@tab This will be in third column. +% @end multitable + +% Default dimensions may be reset by user. +% @multitableparskip is vertical space between paragraphs in table. +% @multitableparindent is paragraph indent in table. +% @multitablecolmargin is horizontal space to be left between columns. +% @multitablelinespace is space to leave between table items, baseline +% to baseline. +% 0pt means it depends on current normal line spacing. +% +\newskip\multitableparskip +\newskip\multitableparindent +\newdimen\multitablecolspace +\newskip\multitablelinespace +\multitableparskip=0pt +\multitableparindent=6pt +\multitablecolspace=12pt +\multitablelinespace=0pt + +% Macros used to set up halign preamble: +% +\let\endsetuptable\relax +\def\xendsetuptable{\endsetuptable} +\let\columnfractions\relax +\def\xcolumnfractions{\columnfractions} +\newif\ifsetpercent + +% #1 is the @columnfraction, usually a decimal number like .5, but might +% be just 1. We just use it, whatever it is. +% +\def\pickupwholefraction#1 {% + \global\advance\colcount by 1 + \expandafter\xdef\csname col\the\colcount\endcsname{#1\hsize}% + \setuptable +} + +\newcount\colcount +\def\setuptable#1{% + \def\firstarg{#1}% + \ifx\firstarg\xendsetuptable + \let\go = \relax + \else + \ifx\firstarg\xcolumnfractions + \global\setpercenttrue + \else + \ifsetpercent + \let\go\pickupwholefraction + \else + \global\advance\colcount by 1 + \setbox0=\hbox{#1\unskip\space}% Add a normal word space as a + % separator; typically that is always in the input, anyway. + \expandafter\xdef\csname col\the\colcount\endcsname{\the\wd0}% + \fi + \fi + \ifx\go\pickupwholefraction + % Put the argument back for the \pickupwholefraction call, so + % we'll always have a period there to be parsed. + \def\go{\pickupwholefraction#1}% + \else + \let\go = \setuptable + \fi% + \fi + \go +} + +% multitable-only commands. +% +% @headitem starts a heading row, which we typeset in bold. +% Assignments have to be global since we are inside the implicit group +% of an alignment entry. Note that \everycr resets \everytab. +\def\headitem{\checkenv\multitable \crcr \global\everytab={\bf}\the\everytab}% +% +% A \tab used to include \hskip1sp. But then the space in a template +% line is not enough. That is bad. So let's go back to just `&' until +% we encounter the problem it was intended to solve again. +% --karl, nathan@acm.org, 20apr99. +\def\tab{\checkenv\multitable &\the\everytab}% + +% @multitable ... @end multitable definitions: +% +\newtoks\everytab % insert after every tab. +% +\envdef\multitable{% + \vskip\parskip + \startsavinginserts + % + % @item within a multitable starts a normal row. + \let\item\crcr + % + \tolerance=9500 + \hbadness=9500 + \setmultitablespacing + \parskip=\multitableparskip + \parindent=\multitableparindent + \overfullrule=0pt + \global\colcount=0 + % + \everycr = {% + \noalign{% + \global\everytab={}% + \global\colcount=0 % Reset the column counter. + % Check for saved footnotes, etc. + \checkinserts + % Keeps underfull box messages off when table breaks over pages. + %\filbreak + % Maybe so, but it also creates really weird page breaks when the + % table breaks over pages. Wouldn't \vfil be better? Wait until the + % problem manifests itself, so it can be fixed for real --karl. + }% + }% + % + \parsearg\domultitable +} +\def\domultitable#1{% + % To parse everything between @multitable and @item: + \setuptable#1 \endsetuptable + % + % This preamble sets up a generic column definition, which will + % be used as many times as user calls for columns. + % \vtop will set a single line and will also let text wrap and + % continue for many paragraphs if desired. + \halign\bgroup &% + \global\advance\colcount by 1 + \multistrut + \vtop{% + % Use the current \colcount to find the correct column width: + \hsize=\expandafter\csname col\the\colcount\endcsname + % + % In order to keep entries from bumping into each other + % we will add a \leftskip of \multitablecolspace to all columns after + % the first one. + % + % If a template has been used, we will add \multitablecolspace + % to the width of each template entry. + % + % If the user has set preamble in terms of percent of \hsize we will + % use that dimension as the width of the column, and the \leftskip + % will keep entries from bumping into each other. Table will start at + % left margin and final column will justify at right margin. + % + % Make sure we don't inherit \rightskip from the outer environment. + \rightskip=0pt + \ifnum\colcount=1 + % The first column will be indented with the surrounding text. + \advance\hsize by\leftskip + \else + \ifsetpercent \else + % If user has not set preamble in terms of percent of \hsize + % we will advance \hsize by \multitablecolspace. + \advance\hsize by \multitablecolspace + \fi + % In either case we will make \leftskip=\multitablecolspace: + \leftskip=\multitablecolspace + \fi + % Ignoring space at the beginning and end avoids an occasional spurious + % blank line, when TeX decides to break the line at the space before the + % box from the multistrut, so the strut ends up on a line by itself. + % For example: + % @multitable @columnfractions .11 .89 + % @item @code{#} + % @tab Legal holiday which is valid in major parts of the whole country. + % Is automatically provided with highlighting sequences respectively + % marking characters. + \noindent\ignorespaces##\unskip\multistrut + }\cr +} +\def\Emultitable{% + \crcr + \egroup % end the \halign + \global\setpercentfalse +} + +\def\setmultitablespacing{% test to see if user has set \multitablelinespace. +% If so, do nothing. If not, give it an appropriate dimension based on +% current baselineskip. +\ifdim\multitablelinespace=0pt +\setbox0=\vbox{X}\global\multitablelinespace=\the\baselineskip +\global\advance\multitablelinespace by-\ht0 +%% strut to put in table in case some entry doesn't have descenders, +%% to keep lines equally spaced +\let\multistrut = \strut +\else +%% FIXME: what is \box0 supposed to be? +\gdef\multistrut{\vrule height\multitablelinespace depth\dp0 +width0pt\relax} \fi +%% Test to see if parskip is larger than space between lines of +%% table. If not, do nothing. +%% If so, set to same dimension as multitablelinespace. +\ifdim\multitableparskip>\multitablelinespace +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller + %% than skip between lines in the table. +\fi% +\ifdim\multitableparskip=0pt +\global\multitableparskip=\multitablelinespace +\global\advance\multitableparskip-7pt %% to keep parskip somewhat smaller + %% than skip between lines in the table. +\fi} + + +\message{conditionals,} + +% @iftex, @ifnotdocbook, @ifnothtml, @ifnotinfo, @ifnotplaintext, +% @ifnotxml always succeed. They currently do nothing; we don't +% attempt to check whether the conditionals are properly nested. But we +% have to remember that they are conditionals, so that @end doesn't +% attempt to close an environment group. +% +\def\makecond#1{% + \expandafter\let\csname #1\endcsname = \relax + \expandafter\let\csname iscond.#1\endcsname = 1 +} +\makecond{iftex} +\makecond{ifnotdocbook} +\makecond{ifnothtml} +\makecond{ifnotinfo} +\makecond{ifnotplaintext} +\makecond{ifnotxml} + +% Ignore @ignore, @ifhtml, @ifinfo, and the like. +% +\def\direntry{\doignore{direntry}} +\def\documentdescription{\doignore{documentdescription}} +\def\docbook{\doignore{docbook}} +\def\html{\doignore{html}} +\def\ifdocbook{\doignore{ifdocbook}} +\def\ifhtml{\doignore{ifhtml}} +\def\ifinfo{\doignore{ifinfo}} +\def\ifnottex{\doignore{ifnottex}} +\def\ifplaintext{\doignore{ifplaintext}} +\def\ifxml{\doignore{ifxml}} +\def\ignore{\doignore{ignore}} +\def\menu{\doignore{menu}} +\def\xml{\doignore{xml}} + +% Ignore text until a line `@end #1', keeping track of nested conditionals. +% +% A count to remember the depth of nesting. +\newcount\doignorecount + +\def\doignore#1{\begingroup + % Scan in ``verbatim'' mode: + \catcode`\@ = \other + \catcode`\{ = \other + \catcode`\} = \other + % + % Make sure that spaces turn into tokens that match what \doignoretext wants. + \spaceisspace + % + % Count number of #1's that we've seen. + \doignorecount = 0 + % + % Swallow text until we reach the matching `@end #1'. + \dodoignore {#1}% +} + +{ \catcode`_=11 % We want to use \_STOP_ which cannot appear in texinfo source. + \obeylines % + % + \gdef\dodoignore#1{% + % #1 contains the string `ifinfo'. + % + % Define a command to find the next `@end #1', which must be on a line + % by itself. + \long\def\doignoretext##1^^M@end #1{\doignoretextyyy##1^^M@#1\_STOP_}% + % And this command to find another #1 command, at the beginning of a + % line. (Otherwise, we would consider a line `@c @ifset', for + % example, to count as an @ifset for nesting.) + \long\def\doignoretextyyy##1^^M@#1##2\_STOP_{\doignoreyyy{##2}\_STOP_}% + % + % And now expand that command. + \obeylines % + \doignoretext ^^M% + }% +} + +\def\doignoreyyy#1{% + \def\temp{#1}% + \ifx\temp\empty % Nothing found. + \let\next\doignoretextzzz + \else % Found a nested condition, ... + \advance\doignorecount by 1 + \let\next\doignoretextyyy % ..., look for another. + % If we're here, #1 ends with ^^M\ifinfo (for example). + \fi + \next #1% the token \_STOP_ is present just after this macro. +} + +% We have to swallow the remaining "\_STOP_". +% +\def\doignoretextzzz#1{% + \ifnum\doignorecount = 0 % We have just found the outermost @end. + \let\next\enddoignore + \else % Still inside a nested condition. + \advance\doignorecount by -1 + \let\next\doignoretext % Look for the next @end. + \fi + \next +} + +% Finish off ignored text. +\def\enddoignore{\endgroup\ignorespaces} + + +% @set VAR sets the variable VAR to an empty value. +% @set VAR REST-OF-LINE sets VAR to the value REST-OF-LINE. +% +% Since we want to separate VAR from REST-OF-LINE (which might be +% empty), we can't just use \parsearg; we have to insert a space of our +% own to delimit the rest of the line, and then take it out again if we +% didn't need it. +% We rely on the fact that \parsearg sets \catcode`\ =10. +% +\parseargdef\set{\setyyy#1 \endsetyyy} +\def\setyyy#1 #2\endsetyyy{% + {% + \makevalueexpandable + \def\temp{#2}% + \edef\next{\gdef\makecsname{SET#1}}% + \ifx\temp\empty + \next{}% + \else + \setzzz#2\endsetzzz + \fi + }% +} +% Remove the trailing space \setxxx inserted. +\def\setzzz#1 \endsetzzz{\next{#1}} + +% @clear VAR clears (i.e., unsets) the variable VAR. +% +\parseargdef\clear{% + {% + \makevalueexpandable + \global\expandafter\let\csname SET#1\endcsname=\relax + }% +} + +% @value{foo} gets the text saved in variable foo. +\def\value{\begingroup\makevalueexpandable\valuexxx} +\def\valuexxx#1{\expandablevalue{#1}\endgroup} +{ + \catcode`\- = \active \catcode`\_ = \active + % + \gdef\makevalueexpandable{% + \let\value = \expandablevalue + % We don't want these characters active, ... + \catcode`\-=\other \catcode`\_=\other + % ..., but we might end up with active ones in the argument if + % we're called from @code, as @code{@value{foo-bar_}}, though. + % So \let them to their normal equivalents. + \let-\realdash \let_\normalunderscore + } +} + +% We have this subroutine so that we can handle at least some @value's +% properly in indexes (we call \makevalueexpandable in \indexdummies). +% The command has to be fully expandable (if the variable is set), since +% the result winds up in the index file. This means that if the +% variable's value contains other Texinfo commands, it's almost certain +% it will fail (although perhaps we could fix that with sufficient work +% to do a one-level expansion on the result, instead of complete). +% +\def\expandablevalue#1{% + \expandafter\ifx\csname SET#1\endcsname\relax + {[No value for ``#1'']}% + \message{Variable `#1', used in @value, is not set.}% + \else + \csname SET#1\endcsname + \fi +} + +% @ifset VAR ... @end ifset reads the `...' iff VAR has been defined +% with @set. +% +% To get special treatment of `@end ifset,' call \makeond and the redefine. +% +\makecond{ifset} +\def\ifset{\parsearg{\doifset{\let\next=\ifsetfail}}} +\def\doifset#1#2{% + {% + \makevalueexpandable + \let\next=\empty + \expandafter\ifx\csname SET#2\endcsname\relax + #1% If not set, redefine \next. + \fi + \expandafter + }\next +} +\def\ifsetfail{\doignore{ifset}} + +% @ifclear VAR ... @end ifclear reads the `...' iff VAR has never been +% defined with @set, or has been undefined with @clear. +% +% The `\else' inside the `\doifset' parameter is a trick to reuse the +% above code: if the variable is not set, do nothing, if it is set, +% then redefine \next to \ifclearfail. +% +\makecond{ifclear} +\def\ifclear{\parsearg{\doifset{\else \let\next=\ifclearfail}}} +\def\ifclearfail{\doignore{ifclear}} + +% @dircategory CATEGORY -- specify a category of the dir file +% which this file should belong to. Ignore this in TeX. +\let\dircategory=\comment + +% @defininfoenclose. +\let\definfoenclose=\comment + + +\message{indexing,} +% Index generation facilities + +% Define \newwrite to be identical to plain tex's \newwrite +% except not \outer, so it can be used within \newindex. +{\catcode`\@=11 +\gdef\newwrite{\alloc@7\write\chardef\sixt@@n}} + +% \newindex {foo} defines an index named foo. +% It automatically defines \fooindex such that +% \fooindex ...rest of line... puts an entry in the index foo. +% It also defines \fooindfile to be the number of the output channel for +% the file that accumulates this index. The file's extension is foo. +% The name of an index should be no more than 2 characters long +% for the sake of vms. +% +\def\newindex#1{% + \iflinks + \expandafter\newwrite \csname#1indfile\endcsname + \openout \csname#1indfile\endcsname \jobname.#1 % Open the file + \fi + \expandafter\xdef\csname#1index\endcsname{% % Define @#1index + \noexpand\doindex{#1}} +} + +% @defindex foo == \newindex{foo} +% +\def\defindex{\parsearg\newindex} + +% Define @defcodeindex, like @defindex except put all entries in @code. +% +\def\defcodeindex{\parsearg\newcodeindex} +% +\def\newcodeindex#1{% + \iflinks + \expandafter\newwrite \csname#1indfile\endcsname + \openout \csname#1indfile\endcsname \jobname.#1 + \fi + \expandafter\xdef\csname#1index\endcsname{% + \noexpand\docodeindex{#1}}% +} + + +% @synindex foo bar makes index foo feed into index bar. +% Do this instead of @defindex foo if you don't want it as a separate index. +% +% @syncodeindex foo bar similar, but put all entries made for index foo +% inside @code. +% +\def\synindex#1 #2 {\dosynindex\doindex{#1}{#2}} +\def\syncodeindex#1 #2 {\dosynindex\docodeindex{#1}{#2}} + +% #1 is \doindex or \docodeindex, #2 the index getting redefined (foo), +% #3 the target index (bar). +\def\dosynindex#1#2#3{% + % Only do \closeout if we haven't already done it, else we'll end up + % closing the target index. + \expandafter \ifx\csname donesynindex#2\endcsname \undefined + % The \closeout helps reduce unnecessary open files; the limit on the + % Acorn RISC OS is a mere 16 files. + \expandafter\closeout\csname#2indfile\endcsname + \expandafter\let\csname\donesynindex#2\endcsname = 1 + \fi + % redefine \fooindfile: + \expandafter\let\expandafter\temp\expandafter=\csname#3indfile\endcsname + \expandafter\let\csname#2indfile\endcsname=\temp + % redefine \fooindex: + \expandafter\xdef\csname#2index\endcsname{\noexpand#1{#3}}% +} + +% Define \doindex, the driver for all \fooindex macros. +% Argument #1 is generated by the calling \fooindex macro, +% and it is "foo", the name of the index. + +% \doindex just uses \parsearg; it calls \doind for the actual work. +% This is because \doind is more useful to call from other macros. + +% There is also \dosubind {index}{topic}{subtopic} +% which makes an entry in a two-level index such as the operation index. + +\def\doindex#1{\edef\indexname{#1}\parsearg\singleindexer} +\def\singleindexer #1{\doind{\indexname}{#1}} + +% like the previous two, but they put @code around the argument. +\def\docodeindex#1{\edef\indexname{#1}\parsearg\singlecodeindexer} +\def\singlecodeindexer #1{\doind{\indexname}{\code{#1}}} + +% Take care of Texinfo commands that can appear in an index entry. +% Since there are some commands we want to expand, and others we don't, +% we have to laboriously prevent expansion for those that we don't. +% +\def\indexdummies{% + \def\@{@}% change to @@ when we switch to @ as escape char in index files. + \def\ {\realbackslash\space }% + % Need these in case \tex is in effect and \{ is a \delimiter again. + % But can't use \lbracecmd and \rbracecmd because texindex assumes + % braces and backslashes are used only as delimiters. + \let\{ = \mylbrace + \let\} = \myrbrace + % + % \definedummyword defines \#1 as \realbackslash #1\space, thus + % effectively preventing its expansion. This is used only for control + % words, not control letters, because the \space would be incorrect + % for control characters, but is needed to separate the control word + % from whatever follows. + % + % For control letters, we have \definedummyletter, which omits the + % space. + % + % These can be used both for control words that take an argument and + % those that do not. If it is followed by {arg} in the input, then + % that will dutifully get written to the index (or wherever). + % + \def\definedummyword##1{% + \expandafter\def\csname ##1\endcsname{\realbackslash ##1\space}% + }% + \def\definedummyletter##1{% + \expandafter\def\csname ##1\endcsname{\realbackslash ##1}% + }% + \let\definedummyaccent\definedummyletter + % + % Do the redefinitions. + \commondummies +} + +% For the aux file, @ is the escape character. So we want to redefine +% everything using @ instead of \realbackslash. When everything uses +% @, this will be simpler. +% +\def\atdummies{% + \def\@{@@}% + \def\ {@ }% + \let\{ = \lbraceatcmd + \let\} = \rbraceatcmd + % + % (See comments in \indexdummies.) + \def\definedummyword##1{% + \expandafter\def\csname ##1\endcsname{@##1\space}% + }% + \def\definedummyletter##1{% + \expandafter\def\csname ##1\endcsname{@##1}% + }% + \let\definedummyaccent\definedummyletter + % + % Do the redefinitions. + \commondummies +} + +% Called from \indexdummies and \atdummies. \definedummyword and +% \definedummyletter must be defined first. +% +\def\commondummies{% + % + \normalturnoffactive + % + \commondummiesnofonts + % + \definedummyletter{_}% + % + % Non-English letters. + \definedummyword{AA}% + \definedummyword{AE}% + \definedummyword{L}% + \definedummyword{OE}% + \definedummyword{O}% + \definedummyword{aa}% + \definedummyword{ae}% + \definedummyword{l}% + \definedummyword{oe}% + \definedummyword{o}% + \definedummyword{ss}% + \definedummyword{exclamdown}% + \definedummyword{questiondown}% + \definedummyword{ordf}% + \definedummyword{ordm}% + % + % Although these internal commands shouldn't show up, sometimes they do. + \definedummyword{bf}% + \definedummyword{gtr}% + \definedummyword{hat}% + \definedummyword{less}% + \definedummyword{sf}% + \definedummyword{sl}% + \definedummyword{tclose}% + \definedummyword{tt}% + % + \definedummyword{LaTeX}% + \definedummyword{TeX}% + % + % Assorted special characters. + \definedummyword{bullet}% + \definedummyword{copyright}% + \definedummyword{registeredsymbol}% + \definedummyword{dots}% + \definedummyword{enddots}% + \definedummyword{equiv}% + \definedummyword{error}% + \definedummyword{expansion}% + \definedummyword{minus}% + \definedummyword{pounds}% + \definedummyword{point}% + \definedummyword{print}% + \definedummyword{result}% + % + % Handle some cases of @value -- where it does not contain any + % (non-fully-expandable) commands. + \makevalueexpandable + % + % Normal spaces, not active ones. + \unsepspaces + % + % No macro expansion. + \turnoffmacros +} + +% \commondummiesnofonts: common to \commondummies and \indexnofonts. +% +% Better have this without active chars. +{ + \catcode`\~=\other + \gdef\commondummiesnofonts{% + % Control letters and accents. + \definedummyletter{!}% + \definedummyaccent{"}% + \definedummyaccent{'}% + \definedummyletter{*}% + \definedummyaccent{,}% + \definedummyletter{.}% + \definedummyletter{/}% + \definedummyletter{:}% + \definedummyaccent{=}% + \definedummyletter{?}% + \definedummyaccent{^}% + \definedummyaccent{`}% + \definedummyaccent{~}% + \definedummyword{u}% + \definedummyword{v}% + \definedummyword{H}% + \definedummyword{dotaccent}% + \definedummyword{ringaccent}% + \definedummyword{tieaccent}% + \definedummyword{ubaraccent}% + \definedummyword{udotaccent}% + \definedummyword{dotless}% + % + % Texinfo font commands. + \definedummyword{b}% + \definedummyword{i}% + \definedummyword{r}% + \definedummyword{sc}% + \definedummyword{t}% + % + % Commands that take arguments. + \definedummyword{acronym}% + \definedummyword{cite}% + \definedummyword{code}% + \definedummyword{command}% + \definedummyword{dfn}% + \definedummyword{emph}% + \definedummyword{env}% + \definedummyword{file}% + \definedummyword{kbd}% + \definedummyword{key}% + \definedummyword{math}% + \definedummyword{option}% + \definedummyword{samp}% + \definedummyword{strong}% + \definedummyword{tie}% + \definedummyword{uref}% + \definedummyword{url}% + \definedummyword{var}% + \definedummyword{verb}% + \definedummyword{w}% + } +} + +% \indexnofonts is used when outputting the strings to sort the index +% by, and when constructing control sequence names. It eliminates all +% control sequences and just writes whatever the best ASCII sort string +% would be for a given command (usually its argument). +% +\def\indexnofonts{% + % Accent commands should become @asis. + \def\definedummyaccent##1{% + \expandafter\let\csname ##1\endcsname\asis + }% + % We can just ignore other control letters. + \def\definedummyletter##1{% + \expandafter\def\csname ##1\endcsname{}% + }% + % Hopefully, all control words can become @asis. + \let\definedummyword\definedummyaccent + % + \commondummiesnofonts + % + % Don't no-op \tt, since it isn't a user-level command + % and is used in the definitions of the active chars like <, >, |, etc. + % Likewise with the other plain tex font commands. + %\let\tt=\asis + % + \def\ { }% + \def\@{@}% + % how to handle braces? + \def\_{\normalunderscore}% + % + % Non-English letters. + \def\AA{AA}% + \def\AE{AE}% + \def\L{L}% + \def\OE{OE}% + \def\O{O}% + \def\aa{aa}% + \def\ae{ae}% + \def\l{l}% + \def\oe{oe}% + \def\o{o}% + \def\ss{ss}% + \def\exclamdown{!}% + \def\questiondown{?}% + \def\ordf{a}% + \def\ordm{o}% + % + \def\LaTeX{LaTeX}% + \def\TeX{TeX}% + % + % Assorted special characters. + % (The following {} will end up in the sort string, but that's ok.) + \def\bullet{bullet}% + \def\copyright{copyright}% + \def\registeredsymbol{R}% + \def\dots{...}% + \def\enddots{...}% + \def\equiv{==}% + \def\error{error}% + \def\expansion{==>}% + \def\minus{-}% + \def\pounds{pounds}% + \def\point{.}% + \def\print{-|}% + \def\result{=>}% + % + % Don't write macro names. + \emptyusermacros +} + +\let\indexbackslash=0 %overridden during \printindex. +\let\SETmarginindex=\relax % put index entries in margin (undocumented)? + +% Most index entries go through here, but \dosubind is the general case. +% #1 is the index name, #2 is the entry text. +\def\doind#1#2{\dosubind{#1}{#2}{}} + +% Workhorse for all \fooindexes. +% #1 is name of index, #2 is stuff to put there, #3 is subentry -- +% empty if called from \doind, as we usually are (the main exception +% is with most defuns, which call us directly). +% +\def\dosubind#1#2#3{% + \iflinks + {% + % Store the main index entry text (including the third arg). + \toks0 = {#2}% + % If third arg is present, precede it with a space. + \def\thirdarg{#3}% + \ifx\thirdarg\empty \else + \toks0 = \expandafter{\the\toks0 \space #3}% + \fi + % + \edef\writeto{\csname#1indfile\endcsname}% + % + \ifvmode + \dosubindsanitize + \else + \dosubindwrite + \fi + }% + \fi +} + +% Write the entry in \toks0 to the index file: +% +\def\dosubindwrite{% + % Put the index entry in the margin if desired. + \ifx\SETmarginindex\relax\else + \insert\margin{\hbox{\vrule height8pt depth3pt width0pt \the\toks0}}% + \fi + % + % Remember, we are within a group. + \indexdummies % Must do this here, since \bf, etc expand at this stage + \escapechar=`\\ + \def\backslashcurfont{\indexbackslash}% \indexbackslash isn't defined now + % so it will be output as is; and it will print as backslash. + % + % Process the index entry with all font commands turned off, to + % get the string to sort by. + {\indexnofonts + \edef\temp{\the\toks0}% need full expansion + \xdef\indexsorttmp{\temp}% + }% + % + % Set up the complete index entry, with both the sort key and + % the original text, including any font commands. We write + % three arguments to \entry to the .?? file (four in the + % subentry case), texindex reduces to two when writing the .??s + % sorted result. + \edef\temp{% + \write\writeto{% + \string\entry{\indexsorttmp}{\noexpand\folio}{\the\toks0}}% + }% + \temp +} + +% Take care of unwanted page breaks: +% +% If a skip is the last thing on the list now, preserve it +% by backing up by \lastskip, doing the \write, then inserting +% the skip again. Otherwise, the whatsit generated by the +% \write will make \lastskip zero. The result is that sequences +% like this: +% @end defun +% @tindex whatever +% @defun ... +% will have extra space inserted, because the \medbreak in the +% start of the @defun won't see the skip inserted by the @end of +% the previous defun. +% +% But don't do any of this if we're not in vertical mode. We +% don't want to do a \vskip and prematurely end a paragraph. +% +% Avoid page breaks due to these extra skips, too. +% +% But wait, there is a catch there: +% We'll have to check whether \lastskip is zero skip. \ifdim is not +% sufficient for this purpose, as it ignores stretch and shrink parts +% of the skip. The only way seems to be to check the textual +% representation of the skip. +% +% The following is almost like \def\zeroskipmacro{0.0pt} except that +% the ``p'' and ``t'' characters have catcode \other, not 11 (letter). +% +\edef\zeroskipmacro{\expandafter\the\csname z@skip\endcsname} +% +% ..., ready, GO: +% +\def\dosubindsanitize{% + % \lastskip and \lastpenalty cannot both be nonzero simultaneously. + \skip0 = \lastskip + \edef\lastskipmacro{\the\lastskip}% + \count255 = \lastpenalty + % + % If \lastskip is nonzero, that means the last item was a + % skip. And since a skip is discardable, that means this + % -\skip0 glue we're inserting is preceded by a + % non-discardable item, therefore it is not a potential + % breakpoint, therefore no \nobreak needed. + \ifx\lastskipmacro\zeroskipmacro + \else + \vskip-\skip0 + \fi + % + \dosubindwrite + % + \ifx\lastskipmacro\zeroskipmacro + % if \lastskip was zero, perhaps the last item was a + % penalty, and perhaps it was >=10000, e.g., a \nobreak. + % In that case, we want to re-insert the penalty; since we + % just inserted a non-discardable item, any following glue + % (such as a \parskip) would be a breakpoint. For example: + % @deffn deffn-whatever + % @vindex index-whatever + % Description. + % would allow a break between the index-whatever whatsit + % and the "Description." paragraph. + \ifnum\count255>9999 \nobreak \fi + \else + % On the other hand, if we had a nonzero \lastskip, + % this make-up glue would be preceded by a non-discardable item + % (the whatsit from the \write), so we must insert a \nobreak. + \nobreak\vskip\skip0 + \fi +} + +% The index entry written in the file actually looks like +% \entry {sortstring}{page}{topic} +% or +% \entry {sortstring}{page}{topic}{subtopic} +% The texindex program reads in these files and writes files +% containing these kinds of lines: +% \initial {c} +% before the first topic whose initial is c +% \entry {topic}{pagelist} +% for a topic that is used without subtopics +% \primary {topic} +% for the beginning of a topic that is used with subtopics +% \secondary {subtopic}{pagelist} +% for each subtopic. + +% Define the user-accessible indexing commands +% @findex, @vindex, @kindex, @cindex. + +\def\findex {\fnindex} +\def\kindex {\kyindex} +\def\cindex {\cpindex} +\def\vindex {\vrindex} +\def\tindex {\tpindex} +\def\pindex {\pgindex} + +\def\cindexsub {\begingroup\obeylines\cindexsub} +{\obeylines % +\gdef\cindexsub "#1" #2^^M{\endgroup % +\dosubind{cp}{#2}{#1}}} + +% Define the macros used in formatting output of the sorted index material. + +% @printindex causes a particular index (the ??s file) to get printed. +% It does not print any chapter heading (usually an @unnumbered). +% +\parseargdef\printindex{\begingroup + \dobreak \chapheadingskip{10000}% + % + \smallfonts \rm + \tolerance = 9500 + \everypar = {}% don't want the \kern\-parindent from indentation suppression. + % + % See if the index file exists and is nonempty. + % Change catcode of @ here so that if the index file contains + % \initial {@} + % as its first line, TeX doesn't complain about mismatched braces + % (because it thinks @} is a control sequence). + \catcode`\@ = 11 + \openin 1 \jobname.#1s + \ifeof 1 + % \enddoublecolumns gets confused if there is no text in the index, + % and it loses the chapter title and the aux file entries for the + % index. The easiest way to prevent this problem is to make sure + % there is some text. + \putwordIndexNonexistent + \else + % + % If the index file exists but is empty, then \openin leaves \ifeof + % false. We have to make TeX try to read something from the file, so + % it can discover if there is anything in it. + \read 1 to \temp + \ifeof 1 + \putwordIndexIsEmpty + \else + % Index files are almost Texinfo source, but we use \ as the escape + % character. It would be better to use @, but that's too big a change + % to make right now. + \def\indexbackslash{\backslashcurfont}% + \catcode`\\ = 0 + \escapechar = `\\ + \begindoublecolumns + \input \jobname.#1s + \enddoublecolumns + \fi + \fi + \closein 1 +\endgroup} + +% These macros are used by the sorted index file itself. +% Change them to control the appearance of the index. + +\def\initial#1{{% + % Some minor font changes for the special characters. + \let\tentt=\sectt \let\tt=\sectt \let\sf=\sectt + % + % Remove any glue we may have, we'll be inserting our own. + \removelastskip + % + % We like breaks before the index initials, so insert a bonus. + \penalty -300 + % + % Typeset the initial. Making this add up to a whole number of + % baselineskips increases the chance of the dots lining up from column + % to column. It still won't often be perfect, because of the stretch + % we need before each entry, but it's better. + % + % No shrink because it confuses \balancecolumns. + \vskip 1.67\baselineskip plus .5\baselineskip + \leftline{\secbf #1}% + \vskip .33\baselineskip plus .1\baselineskip + % + % Do our best not to break after the initial. + \nobreak +}} + +% \entry typesets a paragraph consisting of the text (#1), dot leaders, and +% then page number (#2) flushed to the right margin. It is used for index +% and table of contents entries. The paragraph is indented by \leftskip. +% +% A straightforward implementation would start like this: +% \def\entry#1#2{... +% But this frozes the catcodes in the argument, and can cause problems to +% @code, which sets - active. This problem was fixed by a kludge--- +% ``-'' was active throughout whole index, but this isn't really right. +% +% The right solution is to prevent \entry from swallowing the whole text. +% --kasal, 21nov03 +\def\entry{% + \begingroup + % + % Start a new paragraph if necessary, so our assignments below can't + % affect previous text. + \par + % + % Do not fill out the last line with white space. + \parfillskip = 0in + % + % No extra space above this paragraph. + \parskip = 0in + % + % Do not prefer a separate line ending with a hyphen to fewer lines. + \finalhyphendemerits = 0 + % + % \hangindent is only relevant when the entry text and page number + % don't both fit on one line. In that case, bob suggests starting the + % dots pretty far over on the line. Unfortunately, a large + % indentation looks wrong when the entry text itself is broken across + % lines. So we use a small indentation and put up with long leaders. + % + % \hangafter is reset to 1 (which is the value we want) at the start + % of each paragraph, so we need not do anything with that. + \hangindent = 2em + % + % When the entry text needs to be broken, just fill out the first line + % with blank space. + \rightskip = 0pt plus1fil + % + % A bit of stretch before each entry for the benefit of balancing + % columns. + \vskip 0pt plus1pt + % + % Swallow the left brace of the text (first parameter): + \afterassignment\doentry + \let\temp = +} +\def\doentry{% + \bgroup % Instead of the swallowed brace. + \noindent + \aftergroup\finishentry + % And now comes the text of the entry. +} +\def\finishentry#1{% + % #1 is the page number. + % + % The following is kludged to not output a line of dots in the index if + % there are no page numbers. The next person who breaks this will be + % cursed by a Unix daemon. + \def\tempa{{\rm }}% + \def\tempb{#1}% + \edef\tempc{\tempa}% + \edef\tempd{\tempb}% + \ifx\tempc\tempd + \ % + \else + % + % If we must, put the page number on a line of its own, and fill out + % this line with blank space. (The \hfil is overwhelmed with the + % fill leaders glue in \indexdotfill if the page number does fit.) + \hfil\penalty50 + \null\nobreak\indexdotfill % Have leaders before the page number. + % + % The `\ ' here is removed by the implicit \unskip that TeX does as + % part of (the primitive) \par. Without it, a spurious underfull + % \hbox ensues. + \ifpdf + \pdfgettoks#1.% + \ \the\toksA + \else + \ #1% + \fi + \fi + \par + \endgroup +} + +% Like \dotfill except takes at least 1 em. +\def\indexdotfill{\cleaders + \hbox{$\mathsurround=0pt \mkern1.5mu ${\it .}$ \mkern1.5mu$}\hskip 1em plus 1fill} + +\def\primary #1{\line{#1\hfil}} + +\newskip\secondaryindent \secondaryindent=0.5cm +\def\secondary#1#2{{% + \parfillskip=0in + \parskip=0in + \hangindent=1in + \hangafter=1 + \noindent\hskip\secondaryindent\hbox{#1}\indexdotfill + \ifpdf + \pdfgettoks#2.\ \the\toksA % The page number ends the paragraph. + \else + #2 + \fi + \par +}} + +% Define two-column mode, which we use to typeset indexes. +% Adapted from the TeXbook, page 416, which is to say, +% the manmac.tex format used to print the TeXbook itself. +\catcode`\@=11 + +\newbox\partialpage +\newdimen\doublecolumnhsize + +\def\begindoublecolumns{\begingroup % ended by \enddoublecolumns + % Grab any single-column material above us. + \output = {% + % + % Here is a possibility not foreseen in manmac: if we accumulate a + % whole lot of material, we might end up calling this \output + % routine twice in a row (see the doublecol-lose test, which is + % essentially a couple of indexes with @setchapternewpage off). In + % that case we just ship out what is in \partialpage with the normal + % output routine. Generally, \partialpage will be empty when this + % runs and this will be a no-op. See the indexspread.tex test case. + \ifvoid\partialpage \else + \onepageout{\pagecontents\partialpage}% + \fi + % + \global\setbox\partialpage = \vbox{% + % Unvbox the main output page. + \unvbox\PAGE + \kern-\topskip \kern\baselineskip + }% + }% + \eject % run that output routine to set \partialpage + % + % Use the double-column output routine for subsequent pages. + \output = {\doublecolumnout}% + % + % Change the page size parameters. We could do this once outside this + % routine, in each of @smallbook, @afourpaper, and the default 8.5x11 + % format, but then we repeat the same computation. Repeating a couple + % of assignments once per index is clearly meaningless for the + % execution time, so we may as well do it in one place. + % + % First we halve the line length, less a little for the gutter between + % the columns. We compute the gutter based on the line length, so it + % changes automatically with the paper format. The magic constant + % below is chosen so that the gutter has the same value (well, +-<1pt) + % as it did when we hard-coded it. + % + % We put the result in a separate register, \doublecolumhsize, so we + % can restore it in \pagesofar, after \hsize itself has (potentially) + % been clobbered. + % + \doublecolumnhsize = \hsize + \advance\doublecolumnhsize by -.04154\hsize + \divide\doublecolumnhsize by 2 + \hsize = \doublecolumnhsize + % + % Double the \vsize as well. (We don't need a separate register here, + % since nobody clobbers \vsize.) + \vsize = 2\vsize +} + +% The double-column output routine for all double-column pages except +% the last. +% +\def\doublecolumnout{% + \splittopskip=\topskip \splitmaxdepth=\maxdepth + % Get the available space for the double columns -- the normal + % (undoubled) page height minus any material left over from the + % previous page. + \dimen@ = \vsize + \divide\dimen@ by 2 + \advance\dimen@ by -\ht\partialpage + % + % box0 will be the left-hand column, box2 the right. + \setbox0=\vsplit255 to\dimen@ \setbox2=\vsplit255 to\dimen@ + \onepageout\pagesofar + \unvbox255 + \penalty\outputpenalty +} +% +% Re-output the contents of the output page -- any previous material, +% followed by the two boxes we just split, in box0 and box2. +\def\pagesofar{% + \unvbox\partialpage + % + \hsize = \doublecolumnhsize + \wd0=\hsize \wd2=\hsize + \hbox to\pagewidth{\box0\hfil\box2}% +} +% +% All done with double columns. +\def\enddoublecolumns{% + \output = {% + % Split the last of the double-column material. Leave it on the + % current page, no automatic page break. + \balancecolumns + % + % If we end up splitting too much material for the current page, + % though, there will be another page break right after this \output + % invocation ends. Having called \balancecolumns once, we do not + % want to call it again. Therefore, reset \output to its normal + % definition right away. (We hope \balancecolumns will never be + % called on to balance too much material, but if it is, this makes + % the output somewhat more palatable.) + \global\output = {\onepageout{\pagecontents\PAGE}}% + }% + \eject + \endgroup % started in \begindoublecolumns + % + % \pagegoal was set to the doubled \vsize above, since we restarted + % the current page. We're now back to normal single-column + % typesetting, so reset \pagegoal to the normal \vsize (after the + % \endgroup where \vsize got restored). + \pagegoal = \vsize +} +% +% Called at the end of the double column material. +\def\balancecolumns{% + \setbox0 = \vbox{\unvbox255}% like \box255 but more efficient, see p.120. + \dimen@ = \ht0 + \advance\dimen@ by \topskip + \advance\dimen@ by-\baselineskip + \divide\dimen@ by 2 % target to split to + %debug\message{final 2-column material height=\the\ht0, target=\the\dimen@.}% + \splittopskip = \topskip + % Loop until we get a decent breakpoint. + {% + \vbadness = 10000 + \loop + \global\setbox3 = \copy0 + \global\setbox1 = \vsplit3 to \dimen@ + \ifdim\ht3>\dimen@ + \global\advance\dimen@ by 1pt + \repeat + }% + %debug\message{split to \the\dimen@, column heights: \the\ht1, \the\ht3.}% + \setbox0=\vbox to\dimen@{\unvbox1}% + \setbox2=\vbox to\dimen@{\unvbox3}% + % + \pagesofar +} +\catcode`\@ = \other + + +\message{sectioning,} +% Chapters, sections, etc. + +% \unnumberedno is an oxymoron, of course. But we count the unnumbered +% sections so that we can refer to them unambiguously in the pdf +% outlines by their "section number". We avoid collisions with chapter +% numbers by starting them at 10000. (If a document ever has 10000 +% chapters, we're in trouble anyway, I'm sure.) +\newcount\unnumberedno \unnumberedno = 10000 +\newcount\chapno +\newcount\secno \secno=0 +\newcount\subsecno \subsecno=0 +\newcount\subsubsecno \subsubsecno=0 + +% This counter is funny since it counts through charcodes of letters A, B, ... +\newcount\appendixno \appendixno = `\@ +% +% \def\appendixletter{\char\the\appendixno} +% We do the following ugly conditional instead of the above simple +% construct for the sake of pdftex, which needs the actual +% letter in the expansion, not just typeset. +% +\def\appendixletter{% + \ifnum\appendixno=`A A% + \else\ifnum\appendixno=`B B% + \else\ifnum\appendixno=`C C% + \else\ifnum\appendixno=`D D% + \else\ifnum\appendixno=`E E% + \else\ifnum\appendixno=`F F% + \else\ifnum\appendixno=`G G% + \else\ifnum\appendixno=`H H% + \else\ifnum\appendixno=`I I% + \else\ifnum\appendixno=`J J% + \else\ifnum\appendixno=`K K% + \else\ifnum\appendixno=`L L% + \else\ifnum\appendixno=`M M% + \else\ifnum\appendixno=`N N% + \else\ifnum\appendixno=`O O% + \else\ifnum\appendixno=`P P% + \else\ifnum\appendixno=`Q Q% + \else\ifnum\appendixno=`R R% + \else\ifnum\appendixno=`S S% + \else\ifnum\appendixno=`T T% + \else\ifnum\appendixno=`U U% + \else\ifnum\appendixno=`V V% + \else\ifnum\appendixno=`W W% + \else\ifnum\appendixno=`X X% + \else\ifnum\appendixno=`Y Y% + \else\ifnum\appendixno=`Z Z% + % The \the is necessary, despite appearances, because \appendixletter is + % expanded while writing the .toc file. \char\appendixno is not + % expandable, thus it is written literally, thus all appendixes come out + % with the same letter (or @) in the toc without it. + \else\char\the\appendixno + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi + \fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi\fi} + +% Each @chapter defines this as the name of the chapter. +% page headings and footings can use it. @section does likewise. +% However, they are not reliable, because we don't use marks. +\def\thischapter{} +\def\thissection{} + +\newcount\absseclevel % used to calculate proper heading level +\newcount\secbase\secbase=0 % @raisesections/@lowersections modify this count + +% @raisesections: treat @section as chapter, @subsection as section, etc. +\def\raisesections{\global\advance\secbase by -1} +\let\up=\raisesections % original BFox name + +% @lowersections: treat @chapter as section, @section as subsection, etc. +\def\lowersections{\global\advance\secbase by 1} +\let\down=\lowersections % original BFox name + +% we only have subsub. +\chardef\maxseclevel = 3 +% +% A numbered section within an unnumbered changes to unnumbered too. +% To achive this, remember the "biggest" unnum. sec. we are currently in: +\chardef\unmlevel = \maxseclevel +% +% Trace whether the current chapter is an appendix or not: +% \chapheadtype is "N" or "A", unnumbered chapters are ignored. +\def\chapheadtype{N} + +% Choose a heading macro +% #1 is heading type +% #2 is heading level +% #3 is text for heading +\def\genhead#1#2#3{% + % Compute the abs. sec. level: + \absseclevel=#2 + \advance\absseclevel by \secbase + % Make sure \absseclevel doesn't fall outside the range: + \ifnum \absseclevel < 0 + \absseclevel = 0 + \else + \ifnum \absseclevel > 3 + \absseclevel = 3 + \fi + \fi + % The heading type: + \def\headtype{#1}% + \if \headtype U% + \ifnum \absseclevel < \unmlevel + \chardef\unmlevel = \absseclevel + \fi + \else + % Check for appendix sections: + \ifnum \absseclevel = 0 + \edef\chapheadtype{\headtype}% + \else + \if \headtype A\if \chapheadtype N% + \errmessage{@appendix... within a non-appendix chapter}% + \fi\fi + \fi + % Check for numbered within unnumbered: + \ifnum \absseclevel > \unmlevel + \def\headtype{U}% + \else + \chardef\unmlevel = 3 + \fi + \fi + % Now print the heading: + \if \headtype U% + \ifcase\absseclevel + \unnumberedzzz{#3}% + \or \unnumberedseczzz{#3}% + \or \unnumberedsubseczzz{#3}% + \or \unnumberedsubsubseczzz{#3}% + \fi + \else + \if \headtype A% + \ifcase\absseclevel + \appendixzzz{#3}% + \or \appendixsectionzzz{#3}% + \or \appendixsubseczzz{#3}% + \or \appendixsubsubseczzz{#3}% + \fi + \else + \ifcase\absseclevel + \chapterzzz{#3}% + \or \seczzz{#3}% + \or \numberedsubseczzz{#3}% + \or \numberedsubsubseczzz{#3}% + \fi + \fi + \fi + \suppressfirstparagraphindent +} + +% an interface: +\def\numhead{\genhead N} +\def\apphead{\genhead A} +\def\unnmhead{\genhead U} + +% @chapter, @appendix, @unnumbered. Increment top-level counter, reset +% all lower-level sectioning counters to zero. +% +% Also set \chaplevelprefix, which we prepend to @float sequence numbers +% (e.g., figures), q.v. By default (before any chapter), that is empty. +\let\chaplevelprefix = \empty +% +\outer\parseargdef\chapter{\numhead0{#1}} % normally numhead0 calls chapterzzz +\def\chapterzzz#1{% + % section resetting is \global in case the chapter is in a group, such + % as an @include file. + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\chapno by 1 + % + % Used for \float. + \gdef\chaplevelprefix{\the\chapno.}% + \resetallfloatnos + % + \message{\putwordChapter\space \the\chapno}% + % + % Write the actual heading. + \chapmacro{#1}{Ynumbered}{\the\chapno}% + % + % So @section and the like are numbered underneath this chapter. + \global\let\section = \numberedsec + \global\let\subsection = \numberedsubsec + \global\let\subsubsection = \numberedsubsubsec +} + +\outer\parseargdef\appendix{\apphead0{#1}} % normally apphead0 calls appendixzzz +\def\appendixzzz#1{% + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\appendixno by 1 + \gdef\chaplevelprefix{\appendixletter.}% + \resetallfloatnos + % + \def\appendixnum{\putwordAppendix\space \appendixletter}% + \message{\appendixnum}% + % + \chapmacro{#1}{Yappendix}{\appendixletter}% + % + \global\let\section = \appendixsec + \global\let\subsection = \appendixsubsec + \global\let\subsubsection = \appendixsubsubsec +} + +\outer\parseargdef\unnumbered{\unnmhead0{#1}} % normally unnmhead0 calls unnumberedzzz +\def\unnumberedzzz#1{% + \global\secno=0 \global\subsecno=0 \global\subsubsecno=0 + \global\advance\unnumberedno by 1 + % + % Since an unnumbered has no number, no prefix for figures. + \global\let\chaplevelprefix = \empty + \resetallfloatnos + % + % This used to be simply \message{#1}, but TeX fully expands the + % argument to \message. Therefore, if #1 contained @-commands, TeX + % expanded them. For example, in `@unnumbered The @cite{Book}', TeX + % expanded @cite (which turns out to cause errors because \cite is meant + % to be executed, not expanded). + % + % Anyway, we don't want the fully-expanded definition of @cite to appear + % as a result of the \message, we just want `@cite' itself. We use + % \the to achieve this: TeX expands \the only once, + % simply yielding the contents of . (We also do this for + % the toc entries.) + \toks0 = {#1}% + \message{(\the\toks0)}% + % + \chapmacro{#1}{Ynothing}{\the\unnumberedno}% + % + \global\let\section = \unnumberedsec + \global\let\subsection = \unnumberedsubsec + \global\let\subsubsection = \unnumberedsubsubsec +} + +% @centerchap is like @unnumbered, but the heading is centered. +\outer\parseargdef\centerchap{% + % Well, we could do the following in a group, but that would break + % an assumption that \chapmacro is called at the outermost level. + % Thus we are safer this way: --kasal, 24feb04 + \let\centerparametersmaybe = \centerparameters + \unnmhead0{#1}% + \let\centerparametersmaybe = \relax +} + +% @top is like @unnumbered. +\let\top\unnumbered + +% Sections. +\outer\parseargdef\numberedsec{\numhead1{#1}} % normally calls seczzz +\def\seczzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Ynumbered}{\the\chapno.\the\secno}% +} + +\outer\parseargdef\appendixsection{\apphead1{#1}} % normally calls appendixsectionzzz +\def\appendixsectionzzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Yappendix}{\appendixletter.\the\secno}% +} +\let\appendixsec\appendixsection + +\outer\parseargdef\unnumberedsec{\unnmhead1{#1}} % normally calls unnumberedseczzz +\def\unnumberedseczzz#1{% + \global\subsecno=0 \global\subsubsecno=0 \global\advance\secno by 1 + \sectionheading{#1}{sec}{Ynothing}{\the\unnumberedno.\the\secno}% +} + +% Subsections. +\outer\parseargdef\numberedsubsec{\numhead2{#1}} % normally calls numberedsubseczzz +\def\numberedsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Ynumbered}{\the\chapno.\the\secno.\the\subsecno}% +} + +\outer\parseargdef\appendixsubsec{\apphead2{#1}} % normally calls appendixsubseczzz +\def\appendixsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Yappendix}% + {\appendixletter.\the\secno.\the\subsecno}% +} + +\outer\parseargdef\unnumberedsubsec{\unnmhead2{#1}} %normally calls unnumberedsubseczzz +\def\unnumberedsubseczzz#1{% + \global\subsubsecno=0 \global\advance\subsecno by 1 + \sectionheading{#1}{subsec}{Ynothing}% + {\the\unnumberedno.\the\secno.\the\subsecno}% +} + +% Subsubsections. +\outer\parseargdef\numberedsubsubsec{\numhead3{#1}} % normally numberedsubsubseczzz +\def\numberedsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Ynumbered}% + {\the\chapno.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +\outer\parseargdef\appendixsubsubsec{\apphead3{#1}} % normally appendixsubsubseczzz +\def\appendixsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Yappendix}% + {\appendixletter.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +\outer\parseargdef\unnumberedsubsubsec{\unnmhead3{#1}} %normally unnumberedsubsubseczzz +\def\unnumberedsubsubseczzz#1{% + \global\advance\subsubsecno by 1 + \sectionheading{#1}{subsubsec}{Ynothing}% + {\the\unnumberedno.\the\secno.\the\subsecno.\the\subsubsecno}% +} + +% These macros control what the section commands do, according +% to what kind of chapter we are in (ordinary, appendix, or unnumbered). +% Define them by default for a numbered chapter. +\let\section = \numberedsec +\let\subsection = \numberedsubsec +\let\subsubsection = \numberedsubsubsec + +% Define @majorheading, @heading and @subheading + +% NOTE on use of \vbox for chapter headings, section headings, and such: +% 1) We use \vbox rather than the earlier \line to permit +% overlong headings to fold. +% 2) \hyphenpenalty is set to 10000 because hyphenation in a +% heading is obnoxious; this forbids it. +% 3) Likewise, headings look best if no \parindent is used, and +% if justification is not attempted. Hence \raggedright. + + +\def\majorheading{% + {\advance\chapheadingskip by 10pt \chapbreak }% + \parsearg\chapheadingzzz +} + +\def\chapheading{\chapbreak \parsearg\chapheadingzzz} +\def\chapheadingzzz#1{% + {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}% + \bigskip \par\penalty 200\relax + \suppressfirstparagraphindent +} + +% @heading, @subheading, @subsubheading. +\parseargdef\heading{\sectionheading{#1}{sec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} +\parseargdef\subheading{\sectionheading{#1}{subsec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} +\parseargdef\subsubheading{\sectionheading{#1}{subsubsec}{Yomitfromtoc}{} + \suppressfirstparagraphindent} + +% These macros generate a chapter, section, etc. heading only +% (including whitespace, linebreaking, etc. around it), +% given all the information in convenient, parsed form. + +%%% Args are the skip and penalty (usually negative) +\def\dobreak#1#2{\par\ifdim\lastskip<#1\removelastskip\penalty#2\vskip#1\fi} + +%%% Define plain chapter starts, and page on/off switching for it +% Parameter controlling skip before chapter headings (if needed) + +\newskip\chapheadingskip + +\def\chapbreak{\dobreak \chapheadingskip {-4000}} +\def\chappager{\par\vfill\supereject} +\def\chapoddpage{\chappager \ifodd\pageno \else \hbox to 0pt{} \chappager\fi} + +\def\setchapternewpage #1 {\csname CHAPPAG#1\endcsname} + +\def\CHAPPAGoff{% +\global\let\contentsalignmacro = \chappager +\global\let\pchapsepmacro=\chapbreak +\global\let\pagealignmacro=\chappager} + +\def\CHAPPAGon{% +\global\let\contentsalignmacro = \chappager +\global\let\pchapsepmacro=\chappager +\global\let\pagealignmacro=\chappager +\global\def\HEADINGSon{\HEADINGSsingle}} + +\def\CHAPPAGodd{% +\global\let\contentsalignmacro = \chapoddpage +\global\let\pchapsepmacro=\chapoddpage +\global\let\pagealignmacro=\chapoddpage +\global\def\HEADINGSon{\HEADINGSdouble}} + +\CHAPPAGon + +% Chapter opening. +% +% #1 is the text, #2 is the section type (Ynumbered, Ynothing, +% Yappendix, Yomitfromtoc), #3 the chapter number. +% +% To test against our argument. +\def\Ynothingkeyword{Ynothing} +\def\Yomitfromtockeyword{Yomitfromtoc} +\def\Yappendixkeyword{Yappendix} +% +\def\chapmacro#1#2#3{% + \pchapsepmacro + {% + \chapfonts \rm + % + % Have to define \thissection before calling \donoderef, because the + % xref code eventually uses it. On the other hand, it has to be called + % after \pchapsepmacro, or the headline will change too soon. + \gdef\thissection{#1}% + \gdef\thischaptername{#1}% + % + % Only insert the separating space if we have a chapter/appendix + % number, and don't print the unnumbered ``number''. + \def\temptype{#2}% + \ifx\temptype\Ynothingkeyword + \setbox0 = \hbox{}% + \def\toctype{unnchap}% + \def\thischapter{#1}% + \else\ifx\temptype\Yomitfromtockeyword + \setbox0 = \hbox{}% contents like unnumbered, but no toc entry + \def\toctype{omit}% + \xdef\thischapter{}% + \else\ifx\temptype\Yappendixkeyword + \setbox0 = \hbox{\putwordAppendix{} #3\enspace}% + \def\toctype{app}% + % We don't substitute the actual chapter name into \thischapter + % because we don't want its macros evaluated now. And we don't + % use \thissection because that changes with each section. + % + \xdef\thischapter{\putwordAppendix{} \appendixletter: + \noexpand\thischaptername}% + \else + \setbox0 = \hbox{#3\enspace}% + \def\toctype{numchap}% + \xdef\thischapter{\putwordChapter{} \the\chapno: + \noexpand\thischaptername}% + \fi\fi\fi + % + % Write the toc entry for this chapter. Must come before the + % \donoderef, because we include the current node name in the toc + % entry, and \donoderef resets it to empty. + \writetocentry{\toctype}{#1}{#3}% + % + % For pdftex, we have to write out the node definition (aka, make + % the pdfdest) after any page break, but before the actual text has + % been typeset. If the destination for the pdf outline is after the + % text, then jumping from the outline may wind up with the text not + % being visible, for instance under high magnification. + \donoderef{#2}% + % + % Typeset the actual heading. + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright + \hangindent=\wd0 \centerparametersmaybe + \unhbox0 #1\par}% + }% + \nobreak\bigskip % no page break after a chapter title + \nobreak +} + +% @centerchap -- centered and unnumbered. +\let\centerparametersmaybe = \relax +\def\centerparameters{% + \advance\rightskip by 3\rightskip + \leftskip = \rightskip + \parfillskip = 0pt +} + + +% I don't think this chapter style is supported any more, so I'm not +% updating it with the new noderef stuff. We'll see. --karl, 11aug03. +% +\def\setchapterstyle #1 {\csname CHAPF#1\endcsname} +% +\def\unnchfopen #1{% +\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt\raggedright + \rm #1\hfill}}\bigskip \par\nobreak +} +\def\chfopen #1#2{\chapoddpage {\chapfonts +\vbox to 3in{\vfil \hbox to\hsize{\hfil #2} \hbox to\hsize{\hfil #1} \vfil}}% +\par\penalty 5000 % +} +\def\centerchfopen #1{% +\chapoddpage {\chapfonts \vbox{\hyphenpenalty=10000\tolerance=5000 + \parindent=0pt + \hfill {\rm #1}\hfill}}\bigskip \par\nobreak +} +\def\CHAPFopen{% + \global\let\chapmacro=\chfopen + \global\let\centerchapmacro=\centerchfopen} + + +% Section titles. These macros combine the section number parts and +% call the generic \sectionheading to do the printing. +% +\newskip\secheadingskip +\def\secheadingbreak{\dobreak \secheadingskip{-1000}} + +% Subsection titles. +\newskip\subsecheadingskip +\def\subsecheadingbreak{\dobreak \subsecheadingskip{-500}} + +% Subsubsection titles. +\def\subsubsecheadingskip{\subsecheadingskip} +\def\subsubsecheadingbreak{\subsecheadingbreak} + + +% Print any size, any type, section title. +% +% #1 is the text, #2 is the section level (sec/subsec/subsubsec), #3 is +% the section type for xrefs (Ynumbered, Ynothing, Yappendix), #4 is the +% section number. +% +\def\sectionheading#1#2#3#4{% + {% + % Switch to the right set of fonts. + \csname #2fonts\endcsname \rm + % + % Insert space above the heading. + \csname #2headingbreak\endcsname + % + % Only insert the space after the number if we have a section number. + \def\sectionlevel{#2}% + \def\temptype{#3}% + % + \ifx\temptype\Ynothingkeyword + \setbox0 = \hbox{}% + \def\toctype{unn}% + \gdef\thissection{#1}% + \else\ifx\temptype\Yomitfromtockeyword + % for @headings -- no section number, don't include in toc, + % and don't redefine \thissection. + \setbox0 = \hbox{}% + \def\toctype{omit}% + \let\sectionlevel=\empty + \else\ifx\temptype\Yappendixkeyword + \setbox0 = \hbox{#4\enspace}% + \def\toctype{app}% + \gdef\thissection{#1}% + \else + \setbox0 = \hbox{#4\enspace}% + \def\toctype{num}% + \gdef\thissection{#1}% + \fi\fi\fi + % + % Write the toc entry (before \donoderef). See comments in \chfplain. + \writetocentry{\toctype\sectionlevel}{#1}{#4}% + % + % Write the node reference (= pdf destination for pdftex). + % Again, see comments in \chfplain. + \donoderef{#3}% + % + % Output the actual section heading. + \vbox{\hyphenpenalty=10000 \tolerance=5000 \parindent=0pt \raggedright + \hangindent=\wd0 % zero if no section number + \unhbox0 #1}% + }% + % Add extra space after the heading -- half of whatever came above it. + % Don't allow stretch, though. + \kern .5 \csname #2headingskip\endcsname + % + % Do not let the kern be a potential breakpoint, as it would be if it + % was followed by glue. + \nobreak + % + % We'll almost certainly start a paragraph next, so don't let that + % glue accumulate. (Not a breakpoint because it's preceded by a + % discardable item.) + \vskip-\parskip + % + % This \nobreak is purely so the last item on the list is a \penalty + % of 10000. This is so other code, for instance \parsebodycommon, can + % check for and avoid allowing breakpoints. Otherwise, it would + % insert a valid breakpoint between: + % @section sec-whatever + % @deffn def-whatever + \nobreak +} + + +\message{toc,} +% Table of contents. +\newwrite\tocfile + +% Write an entry to the toc file, opening it if necessary. +% Called from @chapter, etc. +% +% Example usage: \writetocentry{sec}{Section Name}{\the\chapno.\the\secno} +% We append the current node name (if any) and page number as additional +% arguments for the \{chap,sec,...}entry macros which will eventually +% read this. The node name is used in the pdf outlines as the +% destination to jump to. +% +% We open the .toc file for writing here instead of at @setfilename (or +% any other fixed time) so that @contents can be anywhere in the document. +% But if #1 is `omit', then we don't do anything. This is used for the +% table of contents chapter openings themselves. +% +\newif\iftocfileopened +\def\omitkeyword{omit}% +% +\def\writetocentry#1#2#3{% + \edef\writetoctype{#1}% + \ifx\writetoctype\omitkeyword \else + \iftocfileopened\else + \immediate\openout\tocfile = \jobname.toc + \global\tocfileopenedtrue + \fi + % + \iflinks + \toks0 = {#2}% + \toks2 = \expandafter{\lastnode}% + \edef\temp{\write\tocfile{\realbackslash #1entry{\the\toks0}{#3}% + {\the\toks2}{\noexpand\folio}}}% + \temp + \fi + \fi + % + % Tell \shipout to create a pdf destination on each page, if we're + % writing pdf. These are used in the table of contents. We can't + % just write one on every page because the title pages are numbered + % 1 and 2 (the page numbers aren't printed), and so are the first + % two pages of the document. Thus, we'd have two destinations named + % `1', and two named `2'. + \ifpdf \global\pdfmakepagedesttrue \fi +} + +\newskip\contentsrightmargin \contentsrightmargin=1in +\newcount\savepageno +\newcount\lastnegativepageno \lastnegativepageno = -1 + +% Prepare to read what we've written to \tocfile. +% +\def\startcontents#1{% + % If @setchapternewpage on, and @headings double, the contents should + % start on an odd page, unlike chapters. Thus, we maintain + % \contentsalignmacro in parallel with \pagealignmacro. + % From: Torbjorn Granlund + \contentsalignmacro + \immediate\closeout\tocfile + % + % Don't need to put `Contents' or `Short Contents' in the headline. + % It is abundantly clear what they are. + \def\thischapter{}% + \chapmacro{#1}{Yomitfromtoc}{}% + % + \savepageno = \pageno + \begingroup % Set up to handle contents files properly. + \catcode`\\=0 \catcode`\{=1 \catcode`\}=2 \catcode`\@=11 + % We can't do this, because then an actual ^ in a section + % title fails, e.g., @chapter ^ -- exponentiation. --karl, 9jul97. + %\catcode`\^=7 % to see ^^e4 as \"a etc. juha@piuha.ydi.vtt.fi + \raggedbottom % Worry more about breakpoints than the bottom. + \advance\hsize by -\contentsrightmargin % Don't use the full line length. + % + % Roman numerals for page numbers. + \ifnum \pageno>0 \global\pageno = \lastnegativepageno \fi +} + + +% Normal (long) toc. +\def\contents{% + \startcontents{\putwordTOC}% + \openin 1 \jobname.toc + \ifeof 1 \else + \input \jobname.toc + \fi + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \ifeof 1 \else + \pdfmakeoutlines + \fi + \closein 1 + \endgroup + \lastnegativepageno = \pageno + \global\pageno = \savepageno +} + +% And just the chapters. +\def\summarycontents{% + \startcontents{\putwordShortTOC}% + % + \let\numchapentry = \shortchapentry + \let\appentry = \shortchapentry + \let\unnchapentry = \shortunnchapentry + % We want a true roman here for the page numbers. + \secfonts + \let\rm=\shortcontrm \let\bf=\shortcontbf + \let\sl=\shortcontsl \let\tt=\shortconttt + \rm + \hyphenpenalty = 10000 + \advance\baselineskip by 1pt % Open it up a little. + \def\numsecentry##1##2##3##4{} + \let\appsecentry = \numsecentry + \let\unnsecentry = \numsecentry + \let\numsubsecentry = \numsecentry + \let\appsubsecentry = \numsecentry + \let\unnsubsecentry = \numsecentry + \let\numsubsubsecentry = \numsecentry + \let\appsubsubsecentry = \numsecentry + \let\unnsubsubsecentry = \numsecentry + \openin 1 \jobname.toc + \ifeof 1 \else + \input \jobname.toc + \fi + \closein 1 + \vfill \eject + \contentsalignmacro % in case @setchapternewpage odd is in effect + \endgroup + \lastnegativepageno = \pageno + \global\pageno = \savepageno +} +\let\shortcontents = \summarycontents + +% Typeset the label for a chapter or appendix for the short contents. +% The arg is, e.g., `A' for an appendix, or `3' for a chapter. +% +\def\shortchaplabel#1{% + % This space should be enough, since a single number is .5em, and the + % widest letter (M) is 1em, at least in the Computer Modern fonts. + % But use \hss just in case. + % (This space doesn't include the extra space that gets added after + % the label; that gets put in by \shortchapentry above.) + % + % We'd like to right-justify chapter numbers, but that looks strange + % with appendix letters. And right-justifying numbers and + % left-justifying letters looks strange when there is less than 10 + % chapters. Have to read the whole toc once to know how many chapters + % there are before deciding ... + \hbox to 1em{#1\hss}% +} + +% These macros generate individual entries in the table of contents. +% The first argument is the chapter or section name. +% The last argument is the page number. +% The arguments in between are the chapter number, section number, ... + +% Chapters, in the main contents. +\def\numchapentry#1#2#3#4{\dochapentry{#2\labelspace#1}{#4}} +% +% Chapters, in the short toc. +% See comments in \dochapentry re vbox and related settings. +\def\shortchapentry#1#2#3#4{% + \tocentry{\shortchaplabel{#2}\labelspace #1}{\doshortpageno\bgroup#4\egroup}% +} + +% Appendices, in the main contents. +% Need the word Appendix, and a fixed-size box. +% +\def\appendixbox#1{% + % We use M since it's probably the widest letter. + \setbox0 = \hbox{\putwordAppendix{} M}% + \hbox to \wd0{\putwordAppendix{} #1\hss}} +% +\def\appentry#1#2#3#4{\dochapentry{\appendixbox{#2}\labelspace#1}{#4}} + +% Unnumbered chapters. +\def\unnchapentry#1#2#3#4{\dochapentry{#1}{#4}} +\def\shortunnchapentry#1#2#3#4{\tocentry{#1}{\doshortpageno\bgroup#4\egroup}} + +% Sections. +\def\numsecentry#1#2#3#4{\dosecentry{#2\labelspace#1}{#4}} +\let\appsecentry=\numsecentry +\def\unnsecentry#1#2#3#4{\dosecentry{#1}{#4}} + +% Subsections. +\def\numsubsecentry#1#2#3#4{\dosubsecentry{#2\labelspace#1}{#4}} +\let\appsubsecentry=\numsubsecentry +\def\unnsubsecentry#1#2#3#4{\dosubsecentry{#1}{#4}} + +% And subsubsections. +\def\numsubsubsecentry#1#2#3#4{\dosubsubsecentry{#2\labelspace#1}{#4}} +\let\appsubsubsecentry=\numsubsubsecentry +\def\unnsubsubsecentry#1#2#3#4{\dosubsubsecentry{#1}{#4}} + +% This parameter controls the indentation of the various levels. +% Same as \defaultparindent. +\newdimen\tocindent \tocindent = 15pt + +% Now for the actual typesetting. In all these, #1 is the text and #2 is the +% page number. +% +% If the toc has to be broken over pages, we want it to be at chapters +% if at all possible; hence the \penalty. +\def\dochapentry#1#2{% + \penalty-300 \vskip1\baselineskip plus.33\baselineskip minus.25\baselineskip + \begingroup + \chapentryfonts + \tocentry{#1}{\dopageno\bgroup#2\egroup}% + \endgroup + \nobreak\vskip .25\baselineskip plus.1\baselineskip +} + +\def\dosecentry#1#2{\begingroup + \secentryfonts \leftskip=\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +\def\dosubsecentry#1#2{\begingroup + \subsecentryfonts \leftskip=2\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +\def\dosubsubsecentry#1#2{\begingroup + \subsubsecentryfonts \leftskip=3\tocindent + \tocentry{#1}{\dopageno\bgroup#2\egroup}% +\endgroup} + +% We use the same \entry macro as for the index entries. +\let\tocentry = \entry + +% Space between chapter (or whatever) number and the title. +\def\labelspace{\hskip1em \relax} + +\def\dopageno#1{{\rm #1}} +\def\doshortpageno#1{{\rm #1}} + +\def\chapentryfonts{\secfonts \rm} +\def\secentryfonts{\textfonts} +\def\subsecentryfonts{\textfonts} +\def\subsubsecentryfonts{\textfonts} + + +\message{environments,} +% @foo ... @end foo. + +% @point{}, @result{}, @expansion{}, @print{}, @equiv{}. +% +% Since these characters are used in examples, it should be an even number of +% \tt widths. Each \tt character is 1en, so two makes it 1em. +% +\def\point{$\star$} +\def\result{\leavevmode\raise.15ex\hbox to 1em{\hfil$\Rightarrow$\hfil}} +\def\expansion{\leavevmode\raise.1ex\hbox to 1em{\hfil$\mapsto$\hfil}} +\def\print{\leavevmode\lower.1ex\hbox to 1em{\hfil$\dashv$\hfil}} +\def\equiv{\leavevmode\lower.1ex\hbox to 1em{\hfil$\ptexequiv$\hfil}} + +% The @error{} command. +% Adapted from the TeXbook's \boxit. +% +\newbox\errorbox +% +{\tentt \global\dimen0 = 3em}% Width of the box. +\dimen2 = .55pt % Thickness of rules +% The text. (`r' is open on the right, `e' somewhat less so on the left.) +\setbox0 = \hbox{\kern-.75pt \tensf error\kern-1.5pt} +% +\setbox\errorbox=\hbox to \dimen0{\hfil + \hsize = \dimen0 \advance\hsize by -5.8pt % Space to left+right. + \advance\hsize by -2\dimen2 % Rules. + \vbox{% + \hrule height\dimen2 + \hbox{\vrule width\dimen2 \kern3pt % Space to left of text. + \vtop{\kern2.4pt \box0 \kern2.4pt}% Space above/below. + \kern3pt\vrule width\dimen2}% Space to right. + \hrule height\dimen2} + \hfil} +% +\def\error{\leavevmode\lower.7ex\copy\errorbox} + +% @tex ... @end tex escapes into raw Tex temporarily. +% One exception: @ is still an escape character, so that @end tex works. +% But \@ or @@ will get a plain tex @ character. + +\envdef\tex{% + \catcode `\\=0 \catcode `\{=1 \catcode `\}=2 + \catcode `\$=3 \catcode `\&=4 \catcode `\#=6 + \catcode `\^=7 \catcode `\_=8 \catcode `\~=\active \let~=\tie + \catcode `\%=14 + \catcode `\+=\other + \catcode `\"=\other + \catcode `\|=\other + \catcode `\<=\other + \catcode `\>=\other + \escapechar=`\\ + % + \let\b=\ptexb + \let\bullet=\ptexbullet + \let\c=\ptexc + \let\,=\ptexcomma + \let\.=\ptexdot + \let\dots=\ptexdots + \let\equiv=\ptexequiv + \let\!=\ptexexclam + \let\i=\ptexi + \let\indent=\ptexindent + \let\noindent=\ptexnoindent + \let\{=\ptexlbrace + \let\+=\tabalign + \let\}=\ptexrbrace + \let\/=\ptexslash + \let\*=\ptexstar + \let\t=\ptext + % + \def\endldots{\mathinner{\ldots\ldots\ldots\ldots}}% + \def\enddots{\relax\ifmmode\endldots\else$\mathsurround=0pt \endldots\,$\fi}% + \def\@{@}% +} +% There is no need to define \Etex. + +% Define @lisp ... @end lisp. +% @lisp environment forms a group so it can rebind things, +% including the definition of @end lisp (which normally is erroneous). + +% Amount to narrow the margins by for @lisp. +\newskip\lispnarrowing \lispnarrowing=0.4in + +% This is the definition that ^^M gets inside @lisp, @example, and other +% such environments. \null is better than a space, since it doesn't +% have any width. +\def\lisppar{\null\endgraf} + +% This space is always present above and below environments. +\newskip\envskipamount \envskipamount = 0pt + +% Make spacing and below environment symmetrical. We use \parskip here +% to help in doing that, since in @example-like environments \parskip +% is reset to zero; thus the \afterenvbreak inserts no space -- but the +% start of the next paragraph will insert \parskip. +% +\def\aboveenvbreak{{% + % =10000 instead of <10000 because of a special case in \itemzzz, q.v. + \ifnum \lastpenalty=10000 \else + \advance\envskipamount by \parskip + \endgraf + \ifdim\lastskip<\envskipamount + \removelastskip + % it's not a good place to break if the last penalty was \nobreak + % or better ... + \ifnum\lastpenalty<10000 \penalty-50 \fi + \vskip\envskipamount + \fi + \fi +}} + +\let\afterenvbreak = \aboveenvbreak + +% \nonarrowing is a flag. If "set", @lisp etc don't narrow margins. +\let\nonarrowing=\relax + +% @cartouche ... @end cartouche: draw rectangle w/rounded corners around +% environment contents. +\font\circle=lcircle10 +\newdimen\circthick +\newdimen\cartouter\newdimen\cartinner +\newskip\normbskip\newskip\normpskip\newskip\normlskip +\circthick=\fontdimen8\circle +% +\def\ctl{{\circle\char'013\hskip -6pt}}% 6pt from pl file: 1/2charwidth +\def\ctr{{\hskip 6pt\circle\char'010}} +\def\cbl{{\circle\char'012\hskip -6pt}} +\def\cbr{{\hskip 6pt\circle\char'011}} +\def\carttop{\hbox to \cartouter{\hskip\lskip + \ctl\leaders\hrule height\circthick\hfil\ctr + \hskip\rskip}} +\def\cartbot{\hbox to \cartouter{\hskip\lskip + \cbl\leaders\hrule height\circthick\hfil\cbr + \hskip\rskip}} +% +\newskip\lskip\newskip\rskip + +\envdef\cartouche{% + \ifhmode\par\fi % can't be in the midst of a paragraph. + \startsavinginserts + \lskip=\leftskip \rskip=\rightskip + \leftskip=0pt\rightskip=0pt % we want these *outside*. + \cartinner=\hsize \advance\cartinner by-\lskip + \advance\cartinner by-\rskip + \cartouter=\hsize + \advance\cartouter by 18.4pt % allow for 3pt kerns on either + % side, and for 6pt waste from + % each corner char, and rule thickness + \normbskip=\baselineskip \normpskip=\parskip \normlskip=\lineskip + % Flag to tell @lisp, etc., not to narrow margin. + \let\nonarrowing=\comment + \vbox\bgroup + \baselineskip=0pt\parskip=0pt\lineskip=0pt + \carttop + \hbox\bgroup + \hskip\lskip + \vrule\kern3pt + \vbox\bgroup + \kern3pt + \hsize=\cartinner + \baselineskip=\normbskip + \lineskip=\normlskip + \parskip=\normpskip + \vskip -\parskip + \comment % For explanation, see the end of \def\group. +} +\def\Ecartouche{% + \ifhmode\par\fi + \kern3pt + \egroup + \kern3pt\vrule + \hskip\rskip + \egroup + \cartbot + \egroup + \checkinserts +} + + +% This macro is called at the beginning of all the @example variants, +% inside a group. +\def\nonfillstart{% + \aboveenvbreak + \hfuzz = 12pt % Don't be fussy + \sepspaces % Make spaces be word-separators rather than space tokens. + \let\par = \lisppar % don't ignore blank lines + \obeylines % each line of input is a line of output + \parskip = 0pt + \parindent = 0pt + \emergencystretch = 0pt % don't try to avoid overfull boxes + % @cartouche defines \nonarrowing to inhibit narrowing + % at next level down. + \ifx\nonarrowing\relax + \advance \leftskip by \lispnarrowing + \exdentamount=\lispnarrowing + \fi + \let\exdent=\nofillexdent +} + +% If you want all examples etc. small: @set dispenvsize small. +% If you want even small examples the full size: @set dispenvsize nosmall. +% This affects the following displayed environments: +% @example, @display, @format, @lisp +% +\def\smallword{small} +\def\nosmallword{nosmall} +\let\SETdispenvsize\relax +\def\setnormaldispenv{% + \ifx\SETdispenvsize\smallword + \smallexamplefonts \rm + \fi +} +\def\setsmalldispenv{% + \ifx\SETdispenvsize\nosmallword + \else + \smallexamplefonts \rm + \fi +} + +% We often define two environments, @foo and @smallfoo. +% Let's do it by one command: +\def\makedispenv #1#2{ + \expandafter\envdef\csname#1\endcsname {\setnormaldispenv #2} + \expandafter\envdef\csname small#1\endcsname {\setsmalldispenv #2} + \expandafter\let\csname E#1\endcsname \afterenvbreak + \expandafter\let\csname Esmall#1\endcsname \afterenvbreak +} + +% Define two synonyms: +\def\maketwodispenvs #1#2#3{ + \makedispenv{#1}{#3} + \makedispenv{#2}{#3} +} + +% @lisp: indented, narrowed, typewriter font; @example: same as @lisp. +% +% @smallexample and @smalllisp: use smaller fonts. +% Originally contributed by Pavel@xerox. +% +\maketwodispenvs {lisp}{example}{% + \nonfillstart + \tt + \let\kbdfont = \kbdexamplefont % Allow @kbd to do something special. + \gobble % eat return +} + +% @display/@smalldisplay: same as @lisp except keep current font. +% +\makedispenv {display}{% + \nonfillstart + \gobble +} + +% @format/@smallformat: same as @display except don't narrow margins. +% +\makedispenv{format}{% + \let\nonarrowing = t% + \nonfillstart + \gobble +} + +% @flushleft: same as @format, but doesn't obey \SETdispenvsize. +\envdef\flushleft{% + \let\nonarrowing = t% + \nonfillstart + \gobble +} +\let\Eflushleft = \afterenvbreak + +% @flushright. +% +\envdef\flushright{% + \let\nonarrowing = t% + \nonfillstart + \advance\leftskip by 0pt plus 1fill + \gobble +} +\let\Eflushright = \afterenvbreak + + +% @quotation does normal linebreaking (hence we can't use \nonfillstart) +% and narrows the margins. We keep \parskip nonzero in general, since +% we're doing normal filling. So, when using \aboveenvbreak and +% \afterenvbreak, temporarily make \parskip 0. +% +\envdef\quotation{% + {\parskip=0pt \aboveenvbreak}% because \aboveenvbreak inserts \parskip + \parindent=0pt + % + % @cartouche defines \nonarrowing to inhibit narrowing at next level down. + \ifx\nonarrowing\relax + \advance\leftskip by \lispnarrowing + \advance\rightskip by \lispnarrowing + \exdentamount = \lispnarrowing + \let\nonarrowing = \relax + \fi + \parsearg\quotationlabel +} + +% We have retained a nonzero parskip for the environment, since we're +% doing normal filling. +% +\def\Equotation{% + \par + \ifx\quotationauthor\undefined\else + % indent a bit. + \leftline{\kern 2\leftskip \sl ---\quotationauthor}% + \fi + {\parskip=0pt \afterenvbreak}% +} + +% If we're given an argument, typeset it in bold with a colon after. +\def\quotationlabel#1{% + \def\temp{#1}% + \ifx\temp\empty \else + {\bf #1: }% + \fi +} + + +% LaTeX-like @verbatim...@end verbatim and @verb{...} +% If we want to allow any as delimiter, +% we need the curly braces so that makeinfo sees the @verb command, eg: +% `@verbx...x' would look like the '@verbx' command. --janneke@gnu.org +% +% [Knuth]: Donald Ervin Knuth, 1996. The TeXbook. +% +% [Knuth] p.344; only we need to do the other characters Texinfo sets +% active too. Otherwise, they get lost as the first character on a +% verbatim line. +\def\dospecials{% + \do\ \do\\\do\{\do\}\do\$\do\&% + \do\#\do\^\do\^^K\do\_\do\^^A\do\%\do\~% + \do\<\do\>\do\|\do\@\do+\do\"% +} +% +% [Knuth] p. 380 +\def\uncatcodespecials{% + \def\do##1{\catcode`##1=\other}\dospecials} +% +% [Knuth] pp. 380,381,391 +% Disable Spanish ligatures ?` and !` of \tt font +\begingroup + \catcode`\`=\active\gdef`{\relax\lq} +\endgroup +% +% Setup for the @verb command. +% +% Eight spaces for a tab +\begingroup + \catcode`\^^I=\active + \gdef\tabeightspaces{\catcode`\^^I=\active\def^^I{\ \ \ \ \ \ \ \ }} +\endgroup +% +\def\setupverb{% + \tt % easiest (and conventionally used) font for verbatim + \def\par{\leavevmode\endgraf}% + \catcode`\`=\active + \tabeightspaces + % Respect line breaks, + % print special symbols as themselves, and + % make each space count + % must do in this order: + \obeylines \uncatcodespecials \sepspaces +} + +% Setup for the @verbatim environment +% +% Real tab expansion +\newdimen\tabw \setbox0=\hbox{\tt\space} \tabw=8\wd0 % tab amount +% +\def\starttabbox{\setbox0=\hbox\bgroup} +\begingroup + \catcode`\^^I=\active + \gdef\tabexpand{% + \catcode`\^^I=\active + \def^^I{\leavevmode\egroup + \dimen0=\wd0 % the width so far, or since the previous tab + \divide\dimen0 by\tabw + \multiply\dimen0 by\tabw % compute previous multiple of \tabw + \advance\dimen0 by\tabw % advance to next multiple of \tabw + \wd0=\dimen0 \box0 \starttabbox + }% + } +\endgroup +\def\setupverbatim{% + \nonfillstart + \advance\leftskip by -\defbodyindent + % Easiest (and conventionally used) font for verbatim + \tt + \def\par{\leavevmode\egroup\box0\endgraf}% + \catcode`\`=\active + \tabexpand + % Respect line breaks, + % print special symbols as themselves, and + % make each space count + % must do in this order: + \obeylines \uncatcodespecials \sepspaces + \everypar{\starttabbox}% +} + +% Do the @verb magic: verbatim text is quoted by unique +% delimiter characters. Before first delimiter expect a +% right brace, after last delimiter expect closing brace: +% +% \def\doverb'{'#1'}'{#1} +% +% [Knuth] p. 382; only eat outer {} +\begingroup + \catcode`[=1\catcode`]=2\catcode`\{=\other\catcode`\}=\other + \gdef\doverb{#1[\def\next##1#1}[##1\endgroup]\next] +\endgroup +% +\def\verb{\begingroup\setupverb\doverb} +% +% +% Do the @verbatim magic: define the macro \doverbatim so that +% the (first) argument ends when '@end verbatim' is reached, ie: +% +% \def\doverbatim#1@end verbatim{#1} +% +% For Texinfo it's a lot easier than for LaTeX, +% because texinfo's \verbatim doesn't stop at '\end{verbatim}': +% we need not redefine '\', '{' and '}'. +% +% Inspired by LaTeX's verbatim command set [latex.ltx] +% +\begingroup + \catcode`\ =\active + \obeylines % + % ignore everything up to the first ^^M, that's the newline at the end + % of the @verbatim input line itself. Otherwise we get an extra blank + % line in the output. + \xdef\doverbatim#1^^M#2@end verbatim{#2\noexpand\end\gobble verbatim}% + % We really want {...\end verbatim} in the body of the macro, but + % without the active space; thus we have to use \xdef and \gobble. +\endgroup +% +\envdef\verbatim{% + \setupverbatim\doverbatim +} +\let\Everbatim = \afterenvbreak + + +% @verbatiminclude FILE - insert text of file in verbatim environment. +% +\def\verbatiminclude{\parseargusing\filenamecatcodes\doverbatiminclude} +% +\def\doverbatiminclude#1{% + {% + \makevalueexpandable + \setupverbatim + \input #1 + \afterenvbreak + }% +} + +% @copying ... @end copying. +% Save the text away for @insertcopying later. Many commands won't be +% allowed in this context, but that's ok. +% +% We save the uninterpreted tokens, rather than creating a box. +% Saving the text in a box would be much easier, but then all the +% typesetting commands (@smallbook, font changes, etc.) have to be done +% beforehand -- and a) we want @copying to be done first in the source +% file; b) letting users define the frontmatter in as flexible order as +% possible is very desirable. +% +\def\copying{\begingroup + % Define a command to swallow text until we reach `@end copying'. + % \ is the escape char in this texinfo.tex file, so it is the + % delimiter for the command; @ will be the escape char when we read + % it, but that doesn't matter. + \long\def\docopying##1\end copying{\gdef\copyingtext{##1}\enddocopying}% + % + % We must preserve ^^M's in the input file; see \insertcopying below. + \catcode`\^^M = \active + \docopying +} + +% What we do to finish off the copying text. +% +\def\enddocopying{\endgroup\ignorespaces} + +% @insertcopying. Here we must play games with ^^M's. On the one hand, +% we need them to delimit commands such as `@end quotation', so they +% must be active. On the other hand, we certainly don't want every +% end-of-line to be a \par, as would happen with the normal active +% definition of ^^M. On the third hand, two ^^M's in a row should still +% generate a \par. +% +% Our approach is to make ^^M insert a space and a penalty1 normally; +% then it can also check if \lastpenalty=1. If it does, then manually +% do \par. +% +% This messes up the normal definitions of @c[omment], so we redefine +% it. Similarly for @ignore. (These commands are used in the gcc +% manual for man page generation.) +% +% Seems pretty fragile, most line-oriented commands will presumably +% fail, but for the limited use of getting the copying text (which +% should be quite simple) inserted, we can hope it's ok. +% +{\catcode`\^^M=\active % +\gdef\insertcopying{\begingroup % + \parindent = 0pt % looks wrong on title page + \def^^M{% + \ifnum \lastpenalty=1 % + \par % + \else % + \space \penalty 1 % + \fi % + }% + % + % Fix @c[omment] for catcode 13 ^^M's. + \def\c##1^^M{\ignorespaces}% + \let\comment = \c % + % + % Don't bother jumping through all the hoops that \doignore does, it + % would be very hard since the catcodes are already set. + \long\def\ignore##1\end ignore{\ignorespaces}% + % + \copyingtext % +\endgroup}% +} + +\message{defuns,} +% @defun etc. + +\newskip\defbodyindent \defbodyindent=.4in +\newskip\defargsindent \defargsindent=50pt +\newskip\deflastargmargin \deflastargmargin=18pt + +% Start the processing of @deffn: +\def\startdefun{% + \ifnum\lastpenalty<10000 + \medbreak + \else + % If there are two @def commands in a row, we'll have a \nobreak, + % which is there to keep the function description together with its + % header. But if there's nothing but headers, we need to allow a + % break somewhere. Check for penalty 10002 (inserted by + % \defargscommonending) instead of 10000, since the sectioning + % commands insert a \penalty10000, and we don't want to allow a break + % between a section heading and a defun. + \ifnum\lastpenalty=10002 \penalty2000 \fi + % + % Similarly, after a section heading, do not allow a break. + % But do insert the glue. + \medskip % preceded by discardable penalty, so not a breakpoint + \fi + % + \parindent=0in + \advance\leftskip by \defbodyindent + \exdentamount=\defbodyindent +} + +\def\dodefunx#1{% + % First, check whether we are in the right environment: + \checkenv#1% + % + % As above, allow line break if we have multiple x headers in a row. + % It's not a great place, though. + \ifnum\lastpenalty=10002 \penalty3000 \fi + % + % And now, it's time to reuse the body of the original defun: + \expandafter\gobbledefun#1% +} +\def\gobbledefun#1\startdefun{} + +% \printdefunline \deffnheader{text} +% +\def\printdefunline#1#2{% + \begingroup + % call \deffnheader: + #1#2 \endheader + % common ending: + \interlinepenalty = 10000 + \advance\rightskip by 0pt plus 1fil + \endgraf + \nobreak\vskip -\parskip + \penalty 10002 % signal to \startdefun and \dodefunx + % Some of the @defun-type tags do not enable magic parentheses, + % rendering the following check redundant. But we don't optimize. + \checkparencounts + \endgroup +} + +\def\Edefun{\endgraf\medbreak} + +% \makedefun{deffn} creates \deffn, \deffnx and \Edeffn; +% the only thing remainnig is to define \deffnheader. +% +\def\makedefun#1{% + \expandafter\let\csname E#1\endcsname = \Edefun + \edef\temp{\noexpand\domakedefun + \makecsname{#1}\makecsname{#1x}\makecsname{#1header}}% + \temp +} + +% \domakedefun \deffn \deffnx \deffnheader +% +% Define \deffn and \deffnx, without parameters. +% \deffnheader has to be defined explicitly. +% +\def\domakedefun#1#2#3{% + \envdef#1{% + \startdefun + \parseargusing\activeparens{\printdefunline#3}% + }% + \def#2{\dodefunx#1}% + \def#3% +} + +%%% Untyped functions: + +% @deffn category name args +\makedefun{deffn}{\deffngeneral{}} + +% @deffn category class name args +\makedefun{defop}#1 {\defopon{#1\ \putwordon}} + +% \defopon {category on}class name args +\def\defopon#1#2 {\deffngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } + +% \deffngeneral {subind}category name args +% +\def\deffngeneral#1#2 #3 #4\endheader{% + % Remember that \dosubind{fn}{foo}{} is equivalent to \doind{fn}{foo}. + \dosubind{fn}{\code{#3}}{#1}% + \defname{#2}{}{#3}\magicamp\defunargs{#4\unskip}% +} + +%%% Typed functions: + +% @deftypefn category type name args +\makedefun{deftypefn}{\deftypefngeneral{}} + +% @deftypeop category class type name args +\makedefun{deftypeop}#1 {\deftypeopon{#1\ \putwordon}} + +% \deftypeopon {category on}class type name args +\def\deftypeopon#1#2 {\deftypefngeneral{\putwordon\ \code{#2}}{#1\ \code{#2}} } + +% \deftypefngeneral {subind}category type name args +% +\def\deftypefngeneral#1#2 #3 #4 #5\endheader{% + \dosubind{fn}{\code{#4}}{#1}% + \defname{#2}{#3}{#4}\defunargs{#5\unskip}% +} + +%%% Typed variables: + +% @deftypevr category type var args +\makedefun{deftypevr}{\deftypecvgeneral{}} + +% @deftypecv category class type var args +\makedefun{deftypecv}#1 {\deftypecvof{#1\ \putwordof}} + +% \deftypecvof {category of}class type var args +\def\deftypecvof#1#2 {\deftypecvgeneral{\putwordof\ \code{#2}}{#1\ \code{#2}} } + +% \deftypecvgeneral {subind}category type var args +% +\def\deftypecvgeneral#1#2 #3 #4 #5\endheader{% + \dosubind{vr}{\code{#4}}{#1}% + \defname{#2}{#3}{#4}\defunargs{#5\unskip}% +} + +%%% Untyped variables: + +% @defvr category var args +\makedefun{defvr}#1 {\deftypevrheader{#1} {} } + +% @defcv category class var args +\makedefun{defcv}#1 {\defcvof{#1\ \putwordof}} + +% \defcvof {category of}class var args +\def\defcvof#1#2 {\deftypecvof{#1}#2 {} } + +%%% Type: +% @deftp category name args +\makedefun{deftp}#1 #2 #3\endheader{% + \doind{tp}{\code{#2}}% + \defname{#1}{}{#2}\defunargs{#3\unskip}% +} + +% Remaining @defun-like shortcuts: +\makedefun{defun}{\deffnheader{\putwordDeffunc} } +\makedefun{defmac}{\deffnheader{\putwordDefmac} } +\makedefun{defspec}{\deffnheader{\putwordDefspec} } +\makedefun{deftypefun}{\deftypefnheader{\putwordDeffunc} } +\makedefun{defvar}{\defvrheader{\putwordDefvar} } +\makedefun{defopt}{\defvrheader{\putwordDefopt} } +\makedefun{deftypevar}{\deftypevrheader{\putwordDefvar} } +\makedefun{defmethod}{\defopon\putwordMethodon} +\makedefun{deftypemethod}{\deftypeopon\putwordMethodon} +\makedefun{defivar}{\defcvof\putwordInstanceVariableof} +\makedefun{deftypeivar}{\deftypecvof\putwordInstanceVariableof} + +% \defname, which formats the name of the @def (not the args). +% #1 is the category, such as "Function". +% #2 is the return type, if any. +% #3 is the function name. +% +% We are followed by (but not passed) the arguments, if any. +% +\def\defname#1#2#3{% + % Get the values of \leftskip and \rightskip as they were outside the @def... + \advance\leftskip by -\defbodyindent + % + % How we'll format the type name. Putting it in brackets helps + % distinguish it from the body text that may end up on the next line + % just below it. + \def\temp{#1}% + \setbox0=\hbox{\kern\deflastargmargin \ifx\temp\empty\else [\rm\temp]\fi} + % + % Figure out line sizes for the paragraph shape. + % The first line needs space for \box0; but if \rightskip is nonzero, + % we need only space for the part of \box0 which exceeds it: + \dimen0=\hsize \advance\dimen0 by -\wd0 \advance\dimen0 by \rightskip + % The continuations: + \dimen2=\hsize \advance\dimen2 by -\defargsindent + % (plain.tex says that \dimen1 should be used only as global.) + \parshape 2 0in \dimen0 \defargsindent \dimen2 + % + % Put the type name to the right margin. + \noindent + \hbox to 0pt{% + \hfil\box0 \kern-\hsize + % \hsize has to be shortened this way: + \kern\leftskip + % Intentionally do not respect \rightskip, since we need the space. + }% + % + % Allow all lines to be underfull without complaint: + \tolerance=10000 \hbadness=10000 + \exdentamount=\defbodyindent + {% + % defun fonts. We use typewriter by default (used to be bold) because: + % . we're printing identifiers, they should be in tt in principle. + % . in languages with many accents, such as Czech or French, it's + % common to leave accents off identifiers. The result looks ok in + % tt, but exceedingly strange in rm. + % . we don't want -- and --- to be treated as ligatures. + % . this still does not fix the ?` and !` ligatures, but so far no + % one has made identifiers using them :). + \df \tt + \def\temp{#2}% return value type + \ifx\temp\empty\else \tclose{\temp} \fi + #3% output function name + }% + {\rm\enskip}% hskip 0.5 em of \tenrm + % + \boldbrax + % arguments will be output next, if any. +} + +% Print arguments in slanted roman (not ttsl), inconsistently with using +% tt for the name. This is because literal text is sometimes needed in +% the argument list (groff manual), and ttsl and tt are not very +% distinguishable. Prevent hyphenation at `-' chars. +% +\def\defunargs#1{% + % use sl by default (not ttsl), + % tt for the names. + \df \sl \hyphenchar\font=0 + % + % On the other hand, if an argument has two dashes (for instance), we + % want a way to get ttsl. Let's try @var for that. + \let\var=\ttslanted + #1% + \sl\hyphenchar\font=45 +} + +% We want ()&[] to print specially on the defun line. +% +\def\activeparens{% + \catcode`\(=\active \catcode`\)=\active + \catcode`\[=\active \catcode`\]=\active + \catcode`\&=\active +} + +% Make control sequences which act like normal parenthesis chars. +\let\lparen = ( \let\rparen = ) + +% Be sure that we always have a definition for `(', etc. For example, +% if the fn name has parens in it, \boldbrax will not be in effect yet, +% so TeX would otherwise complain about undefined control sequence. +{ + \activeparens + \global\let(=\lparen \global\let)=\rparen + \global\let[=\lbrack \global\let]=\rbrack + \global\let& = \& + + \gdef\boldbrax{\let(=\opnr\let)=\clnr\let[=\lbrb\let]=\rbrb} + \gdef\magicamp{\let&=\amprm} +} + +\newcount\parencount + +% If we encounter &foo, then turn on ()-hacking afterwards +\newif\ifampseen +\def\amprm#1 {\ampseentrue{\bf\ }} + +\def\parenfont{% + \ifampseen + % At the first level, print parens in roman, + % otherwise use the default font. + \ifnum \parencount=1 \rm \fi + \else + % The \sf parens (in \boldbrax) actually are a little bolder than + % the contained text. This is especially needed for [ and ] . + \sf + \fi +} +\def\infirstlevel#1{% + \ifampseen + \ifnum\parencount=1 + #1% + \fi + \fi +} +\def\bfafterword#1 {#1 \bf} + +\def\opnr{% + \global\advance\parencount by 1 + {\parenfont(}% + \infirstlevel \bfafterword +} +\def\clnr{% + {\parenfont)}% + \infirstlevel \sl + \global\advance\parencount by -1 +} + +\newcount\brackcount +\def\lbrb{% + \global\advance\brackcount by 1 + {\bf[}% +} +\def\rbrb{% + {\bf]}% + \global\advance\brackcount by -1 +} + +\def\checkparencounts{% + \ifnum\parencount=0 \else \badparencount \fi + \ifnum\brackcount=0 \else \badbrackcount \fi +} +\def\badparencount{% + \errmessage{Unbalanced parentheses in @def}% + \global\parencount=0 +} +\def\badbrackcount{% + \errmessage{Unbalanced square braces in @def}% + \global\brackcount=0 +} + + +\message{macros,} +% @macro. + +% To do this right we need a feature of e-TeX, \scantokens, +% which we arrange to emulate with a temporary file in ordinary TeX. +\ifx\eTeXversion\undefined + \newwrite\macscribble + \def\scantokens#1{% + \toks0={#1\endinput}% + \immediate\openout\macscribble=\jobname.tmp + \immediate\write\macscribble{\the\toks0}% + \immediate\closeout\macscribble + \input \jobname.tmp + } +\fi + +\def\scanmacro#1{% + \begingroup + \newlinechar`\^^M + \let\xeatspaces\eatspaces + % Undo catcode changes of \startcontents and \doprintindex + \catcode`\@=0 \catcode`\\=\other \escapechar=`\@ + % ... and \example + \spaceisspace + % + % Append \endinput to make sure that TeX does not see the ending newline. + % + % I've verified that it is necessary both for e-TeX and for ordinary TeX + % --kasal, 29nov03 + \scantokens{#1\endinput}% + \endgroup +} + +\newcount\paramno % Count of parameters +\newtoks\macname % Macro name +\newif\ifrecursive % Is it recursive? +\def\macrolist{} % List of all defined macros in the form + % \do\macro1\do\macro2... + +% Utility routines. +% This does \let #1 = #2, except with \csnames. +\def\cslet#1#2{% +\expandafter\expandafter +\expandafter\let +\expandafter\expandafter +\csname#1\endcsname +\csname#2\endcsname} + +% Trim leading and trailing spaces off a string. +% Concepts from aro-bend problem 15 (see CTAN). +{\catcode`\@=11 +\gdef\eatspaces #1{\expandafter\trim@\expandafter{#1 }} +\gdef\trim@ #1{\trim@@ @#1 @ #1 @ @@} +\gdef\trim@@ #1@ #2@ #3@@{\trim@@@\empty #2 @} +\def\unbrace#1{#1} +\unbrace{\gdef\trim@@@ #1 } #2@{#1} +} + +% Trim a single trailing ^^M off a string. +{\catcode`\^^M=\other \catcode`\Q=3% +\gdef\eatcr #1{\eatcra #1Q^^MQ}% +\gdef\eatcra#1^^MQ{\eatcrb#1Q}% +\gdef\eatcrb#1Q#2Q{#1}% +} + +% Macro bodies are absorbed as an argument in a context where +% all characters are catcode 10, 11 or 12, except \ which is active +% (as in normal texinfo). It is necessary to change the definition of \. + +% It's necessary to have hard CRs when the macro is executed. This is +% done by making ^^M (\endlinechar) catcode 12 when reading the macro +% body, and then making it the \newlinechar in \scanmacro. + +\def\macrobodyctxt{% + \catcode`\~=\other + \catcode`\^=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\+=\other + \catcode`\{=\other + \catcode`\}=\other + \catcode`\@=\other + \catcode`\^^M=\other + \usembodybackslash} + +\def\macroargctxt{% + \catcode`\~=\other + \catcode`\^=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\+=\other + \catcode`\@=\other + \catcode`\\=\other} + +% \mbodybackslash is the definition of \ in @macro bodies. +% It maps \foo\ => \csname macarg.foo\endcsname => #N +% where N is the macro parameter number. +% We define \csname macarg.\endcsname to be \realbackslash, so +% \\ in macro replacement text gets you a backslash. + +{\catcode`@=0 @catcode`@\=@active + @gdef@usembodybackslash{@let\=@mbodybackslash} + @gdef@mbodybackslash#1\{@csname macarg.#1@endcsname} +} +\expandafter\def\csname macarg.\endcsname{\realbackslash} + +\def\macro{\recursivefalse\parsearg\macroxxx} +\def\rmacro{\recursivetrue\parsearg\macroxxx} + +\def\macroxxx#1{% + \getargs{#1}% now \macname is the macname and \argl the arglist + \ifx\argl\empty % no arguments + \paramno=0% + \else + \expandafter\parsemargdef \argl;% + \fi + \if1\csname ismacro.\the\macname\endcsname + \message{Warning: redefining \the\macname}% + \else + \expandafter\ifx\csname \the\macname\endcsname \relax + \else \errmessage{Macro name \the\macname\space already defined}\fi + \global\cslet{macsave.\the\macname}{\the\macname}% + \global\expandafter\let\csname ismacro.\the\macname\endcsname=1% + % Add the macroname to \macrolist + \toks0 = \expandafter{\macrolist\do}% + \xdef\macrolist{\the\toks0 + \expandafter\noexpand\csname\the\macname\endcsname}% + \fi + \begingroup \macrobodyctxt + \ifrecursive \expandafter\parsermacbody + \else \expandafter\parsemacbody + \fi} + +\parseargdef\unmacro{% + \if1\csname ismacro.#1\endcsname + \global\cslet{#1}{macsave.#1}% + \global\expandafter\let \csname ismacro.#1\endcsname=0% + % Remove the macro name from \macrolist: + \begingroup + \expandafter\let\csname#1\endcsname \relax + \let\do\unmacrodo + \xdef\macrolist{\macrolist}% + \endgroup + \else + \errmessage{Macro #1 not defined}% + \fi +} + +% Called by \do from \dounmacro on each macro. The idea is to omit any +% macro definitions that have been changed to \relax. +% +\def\unmacrodo#1{% + \ifx#1\relax + % remove this + \else + \noexpand\do \noexpand #1% + \fi +} + +% This makes use of the obscure feature that if the last token of a +% is #, then the preceding argument is delimited by +% an opening brace, and that opening brace is not consumed. +\def\getargs#1{\getargsxxx#1{}} +\def\getargsxxx#1#{\getmacname #1 \relax\getmacargs} +\def\getmacname #1 #2\relax{\macname={#1}} +\def\getmacargs#1{\def\argl{#1}} + +% Parse the optional {params} list. Set up \paramno and \paramlist +% so \defmacro knows what to do. Define \macarg.blah for each blah +% in the params list, to be ##N where N is the position in that list. +% That gets used by \mbodybackslash (above). + +% We need to get `macro parameter char #' into several definitions. +% The technique used is stolen from LaTeX: let \hash be something +% unexpandable, insert that wherever you need a #, and then redefine +% it to # just before using the token list produced. +% +% The same technique is used to protect \eatspaces till just before +% the macro is used. + +\def\parsemargdef#1;{\paramno=0\def\paramlist{}% + \let\hash\relax\let\xeatspaces\relax\parsemargdefxxx#1,;,} +\def\parsemargdefxxx#1,{% + \if#1;\let\next=\relax + \else \let\next=\parsemargdefxxx + \advance\paramno by 1% + \expandafter\edef\csname macarg.\eatspaces{#1}\endcsname + {\xeatspaces{\hash\the\paramno}}% + \edef\paramlist{\paramlist\hash\the\paramno,}% + \fi\next} + +% These two commands read recursive and nonrecursive macro bodies. +% (They're different since rec and nonrec macros end differently.) + +\long\def\parsemacbody#1@end macro% +{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% +\long\def\parsermacbody#1@end rmacro% +{\xdef\temp{\eatcr{#1}}\endgroup\defmacro}% + +% This defines the macro itself. There are six cases: recursive and +% nonrecursive macros of zero, one, and many arguments. +% Much magic with \expandafter here. +% \xdef is used so that macro definitions will survive the file +% they're defined in; @include reads the file inside a group. +\def\defmacro{% + \let\hash=##% convert placeholders to macro parameter chars + \ifrecursive + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\scanmacro{\temp}}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname xxx\endcsname}% + \expandafter\xdef\csname\the\macname xxx\endcsname##1{% + \egroup\noexpand\scanmacro{\temp}}% + \else % many + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{\egroup\noexpand\scanmacro{\temp}}% + \fi + \else + \ifcase\paramno + % 0 + \expandafter\xdef\csname\the\macname\endcsname{% + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \or % 1 + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \noexpand\braceorline + \expandafter\noexpand\csname\the\macname xxx\endcsname}% + \expandafter\xdef\csname\the\macname xxx\endcsname##1{% + \egroup + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \else % many + \expandafter\xdef\csname\the\macname\endcsname{% + \bgroup\noexpand\macroargctxt + \expandafter\noexpand\csname\the\macname xx\endcsname}% + \expandafter\xdef\csname\the\macname xx\endcsname##1{% + \expandafter\noexpand\csname\the\macname xxx\endcsname ##1,}% + \expandafter\expandafter + \expandafter\xdef + \expandafter\expandafter + \csname\the\macname xxx\endcsname + \paramlist{% + \egroup + \noexpand\norecurse{\the\macname}% + \noexpand\scanmacro{\temp}\egroup}% + \fi + \fi} + +\def\norecurse#1{\bgroup\cslet{#1}{macsave.#1}} + +% \braceorline decides whether the next nonwhitespace character is a +% {. If so it reads up to the closing }, if not, it reads the whole +% line. Whatever was read is then fed to the next control sequence +% as an argument (by \parsebrace or \parsearg) +\def\braceorline#1{\let\next=#1\futurelet\nchar\braceorlinexxx} +\def\braceorlinexxx{% + \ifx\nchar\bgroup\else + \expandafter\parsearg + \fi \next} + +% We want to disable all macros during \shipout so that they are not +% expanded by \write. +\def\turnoffmacros{\begingroup \def\do##1{\let\noexpand##1=\relax}% + \edef\next{\macrolist}\expandafter\endgroup\next} + +% For \indexnofonts, we need to get rid of all macros, leaving only the +% arguments (if present). Of course this is not nearly correct, but it +% is the best we can do for now. makeinfo does not expand macros in the +% argument to @deffn, which ends up writing an index entry, and texindex +% isn't prepared for an index sort entry that starts with \. +% +% Since macro invocations are followed by braces, we can just redefine them +% to take a single TeX argument. The case of a macro invocation that +% goes to end-of-line is not handled. +% +\def\emptyusermacros{\begingroup + \def\do##1{\let\noexpand##1=\noexpand\asis}% + \edef\next{\macrolist}\expandafter\endgroup\next} + + +% @alias. +% We need some trickery to remove the optional spaces around the equal +% sign. Just make them active and then expand them all to nothing. +\def\alias{\parseargusing\obeyspaces\aliasxxx} +\def\aliasxxx #1{\aliasyyy#1\relax} +\def\aliasyyy #1=#2\relax{% + {% + \expandafter\let\obeyedspace=\empty + \xdef\next{\global\let\makecsname{#1}=\makecsname{#2}}% + }% + \next +} + + +\message{cross references,} + +\newwrite\auxfile + +\newif\ifhavexrefs % True if xref values are known. +\newif\ifwarnedxrefs % True if we warned once that they aren't known. + +% @inforef is relatively simple. +\def\inforef #1{\inforefzzz #1,,,,**} +\def\inforefzzz #1,#2,#3,#4**{\putwordSee{} \putwordInfo{} \putwordfile{} \file{\ignorespaces #3{}}, + node \samp{\ignorespaces#1{}}} + +% @node's only job in TeX is to define \lastnode, which is used in +% cross-references. The @node line might or might not have commas, and +% might or might not have spaces before the first comma, like: +% @node foo , bar , ... +% We don't want such trailing spaces in the node name. +% +\parseargdef\node{\checkenv{}\donode #1 ,\finishnodeparse} +% +% also remove a trailing comma, in case of something like this: +% @node Help-Cross, , , Cross-refs +\def\donode#1 ,#2\finishnodeparse{\dodonode #1,\finishnodeparse} +\def\dodonode#1,#2\finishnodeparse{\gdef\lastnode{#1}} + +\let\nwnode=\node +\let\lastnode=\empty + +% Write a cross-reference definition for the current node. #1 is the +% type (Ynumbered, Yappendix, Ynothing). +% +\def\donoderef#1{% + \ifx\lastnode\empty\else + \setref{\lastnode}{#1}% + \global\let\lastnode=\empty + \fi +} + +% @anchor{NAME} -- define xref target at arbitrary point. +% +\newcount\savesfregister +% +\def\savesf{\relax \ifhmode \savesfregister=\spacefactor \fi} +\def\restoresf{\relax \ifhmode \spacefactor=\savesfregister \fi} +\def\anchor#1{\savesf \setref{#1}{Ynothing}\restoresf \ignorespaces} + +% \setref{NAME}{SNT} defines a cross-reference point NAME (a node or an +% anchor), which consists of three parts: +% 1) NAME-title - the current sectioning name taken from \thissection, +% or the anchor name. +% 2) NAME-snt - section number and type, passed as the SNT arg, or +% empty for anchors. +% 3) NAME-pg - the page number. +% +% This is called from \donoderef, \anchor, and \dofloat. In the case of +% floats, there is an additional part, which is not written here: +% 4) NAME-lof - the text as it should appear in a @listoffloats. +% +\def\setref#1#2{% + \pdfmkdest{#1}% + \iflinks + {% + \atdummies % preserve commands, but don't expand them + \turnoffactive + \otherbackslash + \edef\writexrdef##1##2{% + \write\auxfile{@xrdef{#1-% #1 of \setref, expanded by the \edef + ##1}{##2}}% these are parameters of \writexrdef + }% + \toks0 = \expandafter{\thissection}% + \immediate \writexrdef{title}{\the\toks0 }% + \immediate \writexrdef{snt}{\csname #2\endcsname}% \Ynumbered etc. + \writexrdef{pg}{\folio}% will be written later, during \shipout + }% + \fi +} + +% @xref, @pxref, and @ref generate cross-references. For \xrefX, #1 is +% the node name, #2 the name of the Info cross-reference, #3 the printed +% node name, #4 the name of the Info file, #5 the name of the printed +% manual. All but the node name can be omitted. +% +\def\pxref#1{\putwordsee{} \xrefX[#1,,,,,,,]} +\def\xref#1{\putwordSee{} \xrefX[#1,,,,,,,]} +\def\ref#1{\xrefX[#1,,,,,,,]} +\def\xrefX[#1,#2,#3,#4,#5,#6]{\begingroup + \unsepspaces + \def\printedmanual{\ignorespaces #5}% + \def\printedrefname{\ignorespaces #3}% + \setbox1=\hbox{\printedmanual\unskip}% + \setbox0=\hbox{\printedrefname\unskip}% + \ifdim \wd0 = 0pt + % No printed node name was explicitly given. + \expandafter\ifx\csname SETxref-automatic-section-title\endcsname\relax + % Use the node name inside the square brackets. + \def\printedrefname{\ignorespaces #1}% + \else + % Use the actual chapter/section title appear inside + % the square brackets. Use the real section title if we have it. + \ifdim \wd1 > 0pt + % It is in another manual, so we don't have it. + \def\printedrefname{\ignorespaces #1}% + \else + \ifhavexrefs + % We know the real title if we have the xref values. + \def\printedrefname{\refx{#1-title}{}}% + \else + % Otherwise just copy the Info node name. + \def\printedrefname{\ignorespaces #1}% + \fi% + \fi + \fi + \fi + % + % Make link in pdf output. + \ifpdf + \leavevmode + \getfilename{#4}% + {\turnoffactive \otherbackslash + \ifnum\filenamelength>0 + \startlink attr{/Border [0 0 0]}% + goto file{\the\filename.pdf} name{#1}% + \else + \startlink attr{/Border [0 0 0]}% + goto name{\pdfmkpgn{#1}}% + \fi + }% + \linkcolor + \fi + % + % Float references are printed completely differently: "Figure 1.2" + % instead of "[somenode], p.3". We distinguish them by the + % LABEL-title being set to a magic string. + {% + % Have to otherify everything special to allow the \csname to + % include an _ in the xref name, etc. + \indexnofonts + \turnoffactive + \otherbackslash + \expandafter\global\expandafter\let\expandafter\Xthisreftitle + \csname XR#1-title\endcsname + }% + \iffloat\Xthisreftitle + % If the user specified the print name (third arg) to the ref, + % print it instead of our usual "Figure 1.2". + \ifdim\wd0 = 0pt + \refx{#1-snt}% + \else + \printedrefname + \fi + % + % if the user also gave the printed manual name (fifth arg), append + % "in MANUALNAME". + \ifdim \wd1 > 0pt + \space \putwordin{} \cite{\printedmanual}% + \fi + \else + % node/anchor (non-float) references. + % + % If we use \unhbox0 and \unhbox1 to print the node names, TeX does not + % insert empty discretionaries after hyphens, which means that it will + % not find a line break at a hyphen in a node names. Since some manuals + % are best written with fairly long node names, containing hyphens, this + % is a loss. Therefore, we give the text of the node name again, so it + % is as if TeX is seeing it for the first time. + \ifdim \wd1 > 0pt + \putwordsection{} ``\printedrefname'' \putwordin{} \cite{\printedmanual}% + \else + % _ (for example) has to be the character _ for the purposes of the + % control sequence corresponding to the node, but it has to expand + % into the usual \leavevmode...\vrule stuff for purposes of + % printing. So we \turnoffactive for the \refx-snt, back on for the + % printing, back off for the \refx-pg. + {\turnoffactive \otherbackslash + % Only output a following space if the -snt ref is nonempty; for + % @unnumbered and @anchor, it won't be. + \setbox2 = \hbox{\ignorespaces \refx{#1-snt}{}}% + \ifdim \wd2 > 0pt \refx{#1-snt}\space\fi + }% + % output the `[mynode]' via a macro so it can be overridden. + \xrefprintnodename\printedrefname + % + % But we always want a comma and a space: + ,\space + % + % output the `page 3'. + \turnoffactive \otherbackslash \putwordpage\tie\refx{#1-pg}{}% + \fi + \fi + \endlink +\endgroup} + +% This macro is called from \xrefX for the `[nodename]' part of xref +% output. It's a separate macro only so it can be changed more easily, +% since square brackets don't work well in some documents. Particularly +% one that Bob is working on :). +% +\def\xrefprintnodename#1{[#1]} + +% Things referred to by \setref. +% +\def\Ynothing{} +\def\Yomitfromtoc{} +\def\Ynumbered{% + \ifnum\secno=0 + \putwordChapter@tie \the\chapno + \else \ifnum\subsecno=0 + \putwordSection@tie \the\chapno.\the\secno + \else \ifnum\subsubsecno=0 + \putwordSection@tie \the\chapno.\the\secno.\the\subsecno + \else + \putwordSection@tie \the\chapno.\the\secno.\the\subsecno.\the\subsubsecno + \fi\fi\fi +} +\def\Yappendix{% + \ifnum\secno=0 + \putwordAppendix@tie @char\the\appendixno{}% + \else \ifnum\subsecno=0 + \putwordSection@tie @char\the\appendixno.\the\secno + \else \ifnum\subsubsecno=0 + \putwordSection@tie @char\the\appendixno.\the\secno.\the\subsecno + \else + \putwordSection@tie + @char\the\appendixno.\the\secno.\the\subsecno.\the\subsubsecno + \fi\fi\fi +} + +% Define \refx{NAME}{SUFFIX} to reference a cross-reference string named NAME. +% If its value is nonempty, SUFFIX is output afterward. +% +\def\refx#1#2{% + {% + \indexnofonts + \otherbackslash + \expandafter\global\expandafter\let\expandafter\thisrefX + \csname XR#1\endcsname + }% + \ifx\thisrefX\relax + % If not defined, say something at least. + \angleleft un\-de\-fined\angleright + \iflinks + \ifhavexrefs + \message{\linenumber Undefined cross reference `#1'.}% + \else + \ifwarnedxrefs\else + \global\warnedxrefstrue + \message{Cross reference values unknown; you must run TeX again.}% + \fi + \fi + \fi + \else + % It's defined, so just use it. + \thisrefX + \fi + #2% Output the suffix in any case. +} + +% This is the macro invoked by entries in the aux file. Usually it's +% just a \def (we prepend XR to the control sequence name to avoid +% collisions). But if this is a float type, we have more work to do. +% +\def\xrdef#1#2{% + \expandafter\gdef\csname XR#1\endcsname{#2}% remember this xref value. + % + % Was that xref control sequence that we just defined for a float? + \expandafter\iffloat\csname XR#1\endcsname + % it was a float, and we have the (safe) float type in \iffloattype. + \expandafter\let\expandafter\floatlist + \csname floatlist\iffloattype\endcsname + % + % Is this the first time we've seen this float type? + \expandafter\ifx\floatlist\relax + \toks0 = {\do}% yes, so just \do + \else + % had it before, so preserve previous elements in list. + \toks0 = \expandafter{\floatlist\do}% + \fi + % + % Remember this xref in the control sequence \floatlistFLOATTYPE, + % for later use in \listoffloats. + \expandafter\xdef\csname floatlist\iffloattype\endcsname{\the\toks0{#1}}% + \fi +} + +% Read the last existing aux file, if any. No error if none exists. +% +\def\tryauxfile{% + \openin 1 \jobname.aux + \ifeof 1 \else + \readauxfile + \global\havexrefstrue + \fi + \closein 1 +} + +\def\readauxfile{\begingroup + \catcode`\^^@=\other + \catcode`\^^A=\other + \catcode`\^^B=\other + \catcode`\^^C=\other + \catcode`\^^D=\other + \catcode`\^^E=\other + \catcode`\^^F=\other + \catcode`\^^G=\other + \catcode`\^^H=\other + \catcode`\^^K=\other + \catcode`\^^L=\other + \catcode`\^^N=\other + \catcode`\^^P=\other + \catcode`\^^Q=\other + \catcode`\^^R=\other + \catcode`\^^S=\other + \catcode`\^^T=\other + \catcode`\^^U=\other + \catcode`\^^V=\other + \catcode`\^^W=\other + \catcode`\^^X=\other + \catcode`\^^Z=\other + \catcode`\^^[=\other + \catcode`\^^\=\other + \catcode`\^^]=\other + \catcode`\^^^=\other + \catcode`\^^_=\other + % It was suggested to set the catcode of ^ to 7, which would allow ^^e4 etc. + % in xref tags, i.e., node names. But since ^^e4 notation isn't + % supported in the main text, it doesn't seem desirable. Furthermore, + % that is not enough: for node names that actually contain a ^ + % character, we would end up writing a line like this: 'xrdef {'hat + % b-title}{'hat b} and \xrdef does a \csname...\endcsname on the first + % argument, and \hat is not an expandable control sequence. It could + % all be worked out, but why? Either we support ^^ or we don't. + % + % The other change necessary for this was to define \auxhat: + % \def\auxhat{\def^{'hat }}% extra space so ok if followed by letter + % and then to call \auxhat in \setq. + % + \catcode`\^=\other + % + % Special characters. Should be turned off anyway, but... + \catcode`\~=\other + \catcode`\[=\other + \catcode`\]=\other + \catcode`\"=\other + \catcode`\_=\other + \catcode`\|=\other + \catcode`\<=\other + \catcode`\>=\other + \catcode`\$=\other + \catcode`\#=\other + \catcode`\&=\other + \catcode`\%=\other + \catcode`+=\other % avoid \+ for paranoia even though we've turned it off + % + % This is to support \ in node names and titles, since the \ + % characters end up in a \csname. It's easier than + % leaving it active and making its active definition an actual \ + % character. What I don't understand is why it works in the *value* + % of the xrdef. Seems like it should be a catcode12 \, and that + % should not typeset properly. But it works, so I'm moving on for + % now. --karl, 15jan04. + \catcode`\\=\other + % + % Make the characters 128-255 be printing characters. + {% + \count 1=128 + \def\loop{% + \catcode\count 1=\other + \advance\count 1 by 1 + \ifnum \count 1<256 \loop \fi + }% + }% + % + % @ is our escape character in .aux files, and we need braces. + \catcode`\{=1 + \catcode`\}=2 + \catcode`\@=0 + % + \input \jobname.aux +\endgroup} + + +\message{insertions,} +% including footnotes. + +\newcount \footnoteno + +% The trailing space in the following definition for supereject is +% vital for proper filling; pages come out unaligned when you do a +% pagealignmacro call if that space before the closing brace is +% removed. (Generally, numeric constants should always be followed by a +% space to prevent strange expansion errors.) +\def\supereject{\par\penalty -20000\footnoteno =0 } + +% @footnotestyle is meaningful for info output only. +\let\footnotestyle=\comment + +{\catcode `\@=11 +% +% Auto-number footnotes. Otherwise like plain. +\gdef\footnote{% + \let\indent=\ptexindent + \let\noindent=\ptexnoindent + \global\advance\footnoteno by \@ne + \edef\thisfootno{$^{\the\footnoteno}$}% + % + % In case the footnote comes at the end of a sentence, preserve the + % extra spacing after we do the footnote number. + \let\@sf\empty + \ifhmode\edef\@sf{\spacefactor\the\spacefactor}\ptexslash\fi + % + % Remove inadvertent blank space before typesetting the footnote number. + \unskip + \thisfootno\@sf + \dofootnote +}% + +% Don't bother with the trickery in plain.tex to not require the +% footnote text as a parameter. Our footnotes don't need to be so general. +% +% Oh yes, they do; otherwise, @ifset (and anything else that uses +% \parseargline) fails inside footnotes because the tokens are fixed when +% the footnote is read. --karl, 16nov96. +% +\gdef\dofootnote{% + \insert\footins\bgroup + % We want to typeset this text as a normal paragraph, even if the + % footnote reference occurs in (for example) a display environment. + % So reset some parameters. + \hsize=\pagewidth + \interlinepenalty\interfootnotelinepenalty + \splittopskip\ht\strutbox % top baseline for broken footnotes + \splitmaxdepth\dp\strutbox + \floatingpenalty\@MM + \leftskip\z@skip + \rightskip\z@skip + \spaceskip\z@skip + \xspaceskip\z@skip + \parindent\defaultparindent + % + \smallfonts \rm + % + % Because we use hanging indentation in footnotes, a @noindent appears + % to exdent this text, so make it be a no-op. makeinfo does not use + % hanging indentation so @noindent can still be needed within footnote + % text after an @example or the like (not that this is good style). + \let\noindent = \relax + % + % Hang the footnote text off the number. Use \everypar in case the + % footnote extends for more than one paragraph. + \everypar = {\hang}% + \textindent{\thisfootno}% + % + % Don't crash into the line above the footnote text. Since this + % expands into a box, it must come within the paragraph, lest it + % provide a place where TeX can split the footnote. + \footstrut + \futurelet\next\fo@t +} +}%end \catcode `\@=11 + +% In case a @footnote appears in a vbox, save the footnote text and create +% the real \insert just after the vbox finished. Otherwise, the insertion +% would be lost. +% Similarily, if a @footnote appears inside an alignment, save the footnote +% text to a box and make the \insert when a row of the table is finished. +% And the same can be done for other insert classes. --kasal, 16nov03. + +% Replace the \insert primitive by a cheating macro. +% Deeper inside, just make sure that the saved insertions are not spilled +% out prematurely. +% +\def\startsavinginserts{% + \ifx \insert\ptexinsert + \let\insert\saveinsert + \else + \let\checkinserts\relax + \fi +} + +% This \insert replacement works for both \insert\footins{foo} and +% \insert\footins\bgroup foo\egroup, but it doesn't work for \insert27{foo}. +% +\def\saveinsert#1{% + \edef\next{\noexpand\savetobox \makeSAVEname#1}% + \afterassignment\next + % swallow the left brace + \let\temp = +} +\def\makeSAVEname#1{\makecsname{SAVE\expandafter\gobble\string#1}} +\def\savetobox#1{\global\setbox#1 = \vbox\bgroup \unvbox#1} + +\def\checksaveins#1{\ifvoid#1\else \placesaveins#1\fi} + +\def\placesaveins#1{% + \ptexinsert \csname\expandafter\gobblesave\string#1\endcsname + {\box#1}% +} + +% eat @SAVE -- beware, all of them have catcode \other: +{ + \def\dospecials{\do S\do A\do V\do E} \uncatcodespecials % ;-) + \gdef\gobblesave @SAVE{} +} + +% initialization: +\def\newsaveins #1{% + \edef\next{\noexpand\newsaveinsX \makeSAVEname#1}% + \next +} +\def\newsaveinsX #1{% + \csname newbox\endcsname #1% + \expandafter\def\expandafter\checkinserts\expandafter{\checkinserts + \checksaveins #1}% +} + +% initialize: +\let\checkinserts\empty +\newsaveins\footins +\newsaveins\margin + + +% @image. We use the macros from epsf.tex to support this. +% If epsf.tex is not installed and @image is used, we complain. +% +% Check for and read epsf.tex up front. If we read it only at @image +% time, we might be inside a group, and then its definitions would get +% undone and the next image would fail. +\openin 1 = epsf.tex +\ifeof 1 \else + % Do not bother showing banner with epsf.tex v2.7k (available in + % doc/epsf.tex and on ctan). + \def\epsfannounce{\toks0 = }% + \input epsf.tex +\fi +\closein 1 +% +% We will only complain once about lack of epsf.tex. +\newif\ifwarnednoepsf +\newhelp\noepsfhelp{epsf.tex must be installed for images to + work. It is also included in the Texinfo distribution, or you can get + it from ftp://tug.org/tex/epsf.tex.} +% +\def\image#1{% + \ifx\epsfbox\undefined + \ifwarnednoepsf \else + \errhelp = \noepsfhelp + \errmessage{epsf.tex not found, images will be ignored}% + \global\warnednoepsftrue + \fi + \else + \imagexxx #1,,,,,\finish + \fi +} +% +% Arguments to @image: +% #1 is (mandatory) image filename; we tack on .eps extension. +% #2 is (optional) width, #3 is (optional) height. +% #4 is (ignored optional) html alt text. +% #5 is (ignored optional) extension. +% #6 is just the usual extra ignored arg for parsing this stuff. +\newif\ifimagevmode +\def\imagexxx#1,#2,#3,#4,#5,#6\finish{\begingroup + \catcode`\^^M = 5 % in case we're inside an example + \normalturnoffactive % allow _ et al. in names + % If the image is by itself, center it. + \ifvmode + \imagevmodetrue + \nobreak\bigskip + % Usually we'll have text after the image which will insert + % \parskip glue, so insert it here too to equalize the space + % above and below. + \nobreak\vskip\parskip + \nobreak + \line\bgroup\hss + \fi + % + % Output the image. + \ifpdf + \dopdfimage{#1}{#2}{#3}% + \else + % \epsfbox itself resets \epsf?size at each figure. + \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \epsfxsize=#2\relax \fi + \setbox0 = \hbox{\ignorespaces #3}\ifdim\wd0 > 0pt \epsfysize=#3\relax \fi + \epsfbox{#1.eps}% + \fi + % + \ifimagevmode \hss \egroup \bigbreak \fi % space after the image +\endgroup} + + +% @float FLOATTYPE,LOC ... @end float for displayed figures, tables, etc. +% We don't actually implement floating yet, we just plop the float "here". +% But it seemed the best name for the future. +% +\envparseargdef\float{\dofloat #1,,,\finish} + +% #1 is the optional FLOATTYPE, the text label for this float, typically +% "Figure", "Table", "Example", etc. Can't contain commas. If omitted, +% this float will not be numbered and cannot be referred to. +% +% #2 is the optional xref label. Also must be present for the float to +% be referable. +% +% #3 is the optional positioning argument; for now, it is ignored. It +% will somehow specify the positions allowed to float to (here, top, bottom). +% +% We keep a separate counter for each FLOATTYPE, which we reset at each +% chapter-level command. +\let\resetallfloatnos=\empty +% +\def\dofloat#1,#2,#3,#4\finish{% + \let\thiscaption=\empty + \let\thisshortcaption=\empty + % + % don't lose footnotes inside @float. + \startsavinginserts + % + % We can't be used inside a paragraph. + \par + % + \vtop\bgroup + \def\floattype{#1}% + \def\floatlabel{#2}% + \def\floatloc{#3}% we do nothing with this yet. + % + \ifx\floattype\empty + \let\safefloattype=\empty + \else + {% + % the floattype might have accents or other special characters, + % but we need to use it in a control sequence name. + \indexnofonts + \turnoffactive + \xdef\safefloattype{\floattype}% + }% + \fi + % + % If label is given but no type, we handle that as the empty type. + \ifx\floatlabel\empty \else + % We want each FLOATTYPE to be numbered separately (Figure 1, + % Table 1, Figure 2, ...). (And if no label, no number.) + % + \expandafter\getfloatno\csname\safefloattype floatno\endcsname + \global\advance\floatno by 1 + % + {% + % This magic value for \thissection is output by \setref as the + % XREFLABEL-title value. \xrefX uses it to distinguish float + % labels (which have a completely different output format) from + % node and anchor labels. And \xrdef uses it to construct the + % lists of floats. + % + \edef\thissection{\floatmagic=\safefloattype}% + \setref{\floatlabel}{Yfloat}% + }% + \fi + % + % start with \parskip glue, I guess. + \vskip\parskip + % + % Don't suppress indentation if a float happens to start a section. + \restorefirstparagraphindent +} + +% we have these possibilities: +% @float Foo,lbl & @caption{Cap}: Foo 1.1: Cap +% @float Foo,lbl & no caption: Foo 1.1 +% @float Foo & @caption{Cap}: Foo: Cap +% @float Foo & no caption: Foo +% @float ,lbl & Caption{Cap}: 1.1: Cap +% @float ,lbl & no caption: 1.1 +% @float & @caption{Cap}: Cap +% @float & no caption: +% +\def\Efloat{% + \let\floatident = \empty + % + % In all cases, if we have a float type, it comes first. + \ifx\floattype\empty \else \def\floatident{\floattype}\fi + % + % If we have an xref label, the number comes next. + \ifx\floatlabel\empty \else + \ifx\floattype\empty \else % if also had float type, need tie first. + \appendtomacro\floatident{\tie}% + \fi + % the number. + \appendtomacro\floatident{\chaplevelprefix\the\floatno}% + \fi + % + % Start the printed caption with what we've constructed in + % \floatident, but keep it separate; we need \floatident again. + \let\captionline = \floatident + % + \ifx\thiscaption\empty \else + \ifx\floatident\empty \else + \appendtomacro\captionline{: }% had ident, so need a colon between + \fi + % + % caption text. + \appendtomacro\captionline\thiscaption + \fi + % + % If we have anything to print, print it, with space before. + % Eventually this needs to become an \insert. + \ifx\captionline\empty \else + \vskip.5\parskip + \captionline + \fi + % + % If have an xref label, write the list of floats info. Do this + % after the caption, to avoid chance of it being a breakpoint. + \ifx\floatlabel\empty \else + % Write the text that goes in the lof to the aux file as + % \floatlabel-lof. Besides \floatident, we include the short + % caption if specified, else the full caption if specified, else nothing. + {% + \atdummies \turnoffactive \otherbackslash + \immediate\write\auxfile{@xrdef{\floatlabel-lof}{% + \floatident + \ifx\thisshortcaption\empty + \ifx\thiscaption\empty \else : \thiscaption \fi + \else + : \thisshortcaption + \fi + }}% + }% + \fi + % + % Space below caption, if we printed anything. + \ifx\printedsomething\empty \else \vskip\parskip \fi + \egroup % end of \vtop + \checkinserts +} + +% Append the tokens #2 to the definition of macro #1, not expanding either. +% +\newtoks\appendtomacroAtoks +\newtoks\appendtomacroBtoks +\def\appendtomacro#1#2{% + \appendtomacroAtoks = \expandafter{#1}% + \appendtomacroBtoks = {#2}% + \edef#1{\the\appendtomacroAtoks \the\appendtomacroBtoks}% +} + +% @caption, @shortcaption are easy. +% +\long\def\caption#1{\checkenv\float \def\thiscaption{#1}} +\def\shortcaption#1{\checkenv\float \def\thisshortcaption{#1}} + +% The parameter is the control sequence identifying the counter we are +% going to use. Create it if it doesn't exist and assign it to \floatno. +\def\getfloatno#1{% + \ifx#1\relax + % Haven't seen this figure type before. + \csname newcount\endcsname #1% + % + % Remember to reset this floatno at the next chap. + \expandafter\gdef\expandafter\resetallfloatnos + \expandafter{\resetallfloatnos #1=0 }% + \fi + \let\floatno#1% +} + +% \setref calls this to get the XREFLABEL-snt value. We want an @xref +% to the FLOATLABEL to expand to "Figure 3.1". We call \setref when we +% first read the @float command. +% +\def\Yfloat{\floattype@tie \chaplevelprefix\the\floatno}% + +% Magic string used for the XREFLABEL-title value, so \xrefX can +% distinguish floats from other xref types. +\def\floatmagic{!!float!!} + +% #1 is the control sequence we are passed; we expand into a conditional +% which is true if #1 represents a float ref. That is, the magic +% \thissection value which we \setref above. +% +\def\iffloat#1{\expandafter\doiffloat#1==\finish} +% +% #1 is (maybe) the \floatmagic string. If so, #2 will be the +% (safe) float type for this float. We set \iffloattype to #2. +% +\def\doiffloat#1=#2=#3\finish{% + \def\temp{#1}% + \def\iffloattype{#2}% + \ifx\temp\floatmagic +} + +% @listoffloats FLOATTYPE - print a list of floats like a table of contents. +% +\parseargdef\listoffloats{% + \def\floattype{#1}% floattype + {% + % the floattype might have accents or other special characters, + % but we need to use it in a control sequence name. + \indexnofonts + \turnoffactive + \xdef\safefloattype{\floattype}% + }% + % + % \xrdef saves the floats as a \do-list in \floatlistSAFEFLOATTYPE. + \expandafter\ifx\csname floatlist\safefloattype\endcsname \relax + \ifhavexrefs + % if the user said @listoffloats foo but never @float foo. + \message{\linenumber No `\safefloattype' floats to list.}% + \fi + \else + \begingroup + \leftskip=\tocindent % indent these entries like a toc + \let\do=\listoffloatsdo + \csname floatlist\safefloattype\endcsname + \endgroup + \fi +} + +% This is called on each entry in a list of floats. We're passed the +% xref label, in the form LABEL-title, which is how we save it in the +% aux file. We strip off the -title and look up \XRLABEL-lof, which +% has the text we're supposed to typeset here. +% +% Figures without xref labels will not be included in the list (since +% they won't appear in the aux file). +% +\def\listoffloatsdo#1{\listoffloatsdoentry#1\finish} +\def\listoffloatsdoentry#1-title\finish{{% + % Can't fully expand XR#1-lof because it can contain anything. Just + % pass the control sequence. On the other hand, XR#1-pg is just the + % page number, and we want to fully expand that so we can get a link + % in pdf output. + \toksA = \expandafter{\csname XR#1-lof\endcsname}% + % + % use the same \entry macro we use to generate the TOC and index. + \edef\writeentry{\noexpand\entry{\the\toksA}{\csname XR#1-pg\endcsname}}% + \writeentry +}} + +\message{localization,} +% and i18n. + +% @documentlanguage is usually given very early, just after +% @setfilename. If done too late, it may not override everything +% properly. Single argument is the language abbreviation. +% It would be nice if we could set up a hyphenation file here. +% +\parseargdef\documentlanguage{% + \tex % read txi-??.tex file in plain TeX. + % Read the file if it exists. + \openin 1 txi-#1.tex + \ifeof 1 + \errhelp = \nolanghelp + \errmessage{Cannot read language file txi-#1.tex}% + \else + \input txi-#1.tex + \fi + \closein 1 + \endgroup +} +\newhelp\nolanghelp{The given language definition file cannot be found or +is empty. Maybe you need to install it? In the current directory +should work if nowhere else does.} + + +% @documentencoding should change something in TeX eventually, most +% likely, but for now just recognize it. +\let\documentencoding = \comment + + +% Page size parameters. +% +\newdimen\defaultparindent \defaultparindent = 15pt + +\chapheadingskip = 15pt plus 4pt minus 2pt +\secheadingskip = 12pt plus 3pt minus 2pt +\subsecheadingskip = 9pt plus 2pt minus 2pt + +% Prevent underfull vbox error messages. +\vbadness = 10000 + +% Don't be so finicky about underfull hboxes, either. +\hbadness = 2000 + +% Following George Bush, just get rid of widows and orphans. +\widowpenalty=10000 +\clubpenalty=10000 + +% Use TeX 3.0's \emergencystretch to help line breaking, but if we're +% using an old version of TeX, don't do anything. We want the amount of +% stretch added to depend on the line length, hence the dependence on +% \hsize. We call this whenever the paper size is set. +% +\def\setemergencystretch{% + \ifx\emergencystretch\thisisundefined + % Allow us to assign to \emergencystretch anyway. + \def\emergencystretch{\dimen0}% + \else + \emergencystretch = .15\hsize + \fi +} + +% Parameters in order: 1) textheight; 2) textwidth; 3) voffset; +% 4) hoffset; 5) binding offset; 6) topskip; 7) physical page height; 8) +% physical page width. +% +% We also call \setleading{\textleading}, so the caller should define +% \textleading. The caller should also set \parskip. +% +\def\internalpagesizes#1#2#3#4#5#6#7#8{% + \voffset = #3\relax + \topskip = #6\relax + \splittopskip = \topskip + % + \vsize = #1\relax + \advance\vsize by \topskip + \outervsize = \vsize + \advance\outervsize by 2\topandbottommargin + \pageheight = \vsize + % + \hsize = #2\relax + \outerhsize = \hsize + \advance\outerhsize by 0.5in + \pagewidth = \hsize + % + \normaloffset = #4\relax + \bindingoffset = #5\relax + % + \ifpdf + \pdfpageheight #7\relax + \pdfpagewidth #8\relax + \fi + % + \setleading{\textleading} + % + \parindent = \defaultparindent + \setemergencystretch +} + +% @letterpaper (the default). +\def\letterpaper{{\globaldefs = 1 + \parskip = 3pt plus 2pt minus 1pt + \textleading = 13.2pt + % + % If page is nothing but text, make it come out even. + \internalpagesizes{46\baselineskip}{6in}% + {\voffset}{.25in}% + {\bindingoffset}{36pt}% + {11in}{8.5in}% +}} + +% Use @smallbook to reset parameters for 7x9.5 (or so) format. +\def\smallbook{{\globaldefs = 1 + \parskip = 2pt plus 1pt + \textleading = 12pt + % + \internalpagesizes{7.5in}{5in}% + {\voffset}{.25in}% + {\bindingoffset}{16pt}% + {9.25in}{7in}% + % + \lispnarrowing = 0.3in + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = .5cm +}} + +% Use @afourpaper to print on European A4 paper. +\def\afourpaper{{\globaldefs = 1 + \parskip = 3pt plus 2pt minus 1pt + \textleading = 13.2pt + % + % Double-side printing via postscript on Laserjet 4050 + % prints double-sided nicely when \bindingoffset=10mm and \hoffset=-6mm. + % To change the settings for a different printer or situation, adjust + % \normaloffset until the front-side and back-side texts align. Then + % do the same for \bindingoffset. You can set these for testing in + % your texinfo source file like this: + % @tex + % \global\normaloffset = -6mm + % \global\bindingoffset = 10mm + % @end tex + \internalpagesizes{51\baselineskip}{160mm} + {\voffset}{\hoffset}% + {\bindingoffset}{44pt}% + {297mm}{210mm}% + % + \tolerance = 700 + \hfuzz = 1pt + \contentsrightmargin = 0pt + \defbodyindent = 5mm +}} + +% Use @afivepaper to print on European A5 paper. +% From romildo@urano.iceb.ufop.br, 2 July 2000. +% He also recommends making @example and @lisp be small. +\def\afivepaper{{\globaldefs = 1 + \parskip = 2pt plus 1pt minus 0.1pt + \textleading = 12.5pt + % + \internalpagesizes{160mm}{120mm}% + {\voffset}{\hoffset}% + {\bindingoffset}{8pt}% + {210mm}{148mm}% + % + \lispnarrowing = 0.2in + \tolerance = 800 + \hfuzz = 1.2pt + \contentsrightmargin = 0pt + \defbodyindent = 2mm + \tableindent = 12mm +}} + +% A specific text layout, 24x15cm overall, intended for A4 paper. +\def\afourlatex{{\globaldefs = 1 + \afourpaper + \internalpagesizes{237mm}{150mm}% + {\voffset}{4.6mm}% + {\bindingoffset}{7mm}% + {297mm}{210mm}% + % + % Must explicitly reset to 0 because we call \afourpaper. + \globaldefs = 0 +}} + +% Use @afourwide to print on A4 paper in landscape format. +\def\afourwide{{\globaldefs = 1 + \afourpaper + \internalpagesizes{241mm}{165mm}% + {\voffset}{-2.95mm}% + {\bindingoffset}{7mm}% + {297mm}{210mm}% + \globaldefs = 0 +}} + +% @pagesizes TEXTHEIGHT[,TEXTWIDTH] +% Perhaps we should allow setting the margins, \topskip, \parskip, +% and/or leading, also. Or perhaps we should compute them somehow. +% +\parseargdef\pagesizes{\pagesizesyyy #1,,\finish} +\def\pagesizesyyy#1,#2,#3\finish{{% + \setbox0 = \hbox{\ignorespaces #2}\ifdim\wd0 > 0pt \hsize=#2\relax \fi + \globaldefs = 1 + % + \parskip = 3pt plus 2pt minus 1pt + \setleading{\textleading}% + % + \dimen0 = #1 + \advance\dimen0 by \voffset + % + \dimen2 = \hsize + \advance\dimen2 by \normaloffset + % + \internalpagesizes{#1}{\hsize}% + {\voffset}{\normaloffset}% + {\bindingoffset}{44pt}% + {\dimen0}{\dimen2}% +}} + +% Set default to letter. +% +\letterpaper + + +\message{and turning on texinfo input format.} + +% Define macros to output various characters with catcode for normal text. +\catcode`\"=\other +\catcode`\~=\other +\catcode`\^=\other +\catcode`\_=\other +\catcode`\|=\other +\catcode`\<=\other +\catcode`\>=\other +\catcode`\+=\other +\catcode`\$=\other +\def\normaldoublequote{"} +\def\normaltilde{~} +\def\normalcaret{^} +\def\normalunderscore{_} +\def\normalverticalbar{|} +\def\normalless{<} +\def\normalgreater{>} +\def\normalplus{+} +\def\normaldollar{$}%$ font-lock fix + +% This macro is used to make a character print one way in \tt +% (where it can probably be output as-is), and another way in other fonts, +% where something hairier probably needs to be done. +% +% #1 is what to print if we are indeed using \tt; #2 is what to print +% otherwise. Since all the Computer Modern typewriter fonts have zero +% interword stretch (and shrink), and it is reasonable to expect all +% typewriter fonts to have this, we can check that font parameter. +% +\def\ifusingtt#1#2{\ifdim \fontdimen3\font=0pt #1\else #2\fi} + +% Same as above, but check for italic font. Actually this also catches +% non-italic slanted fonts since it is impossible to distinguish them from +% italic fonts. But since this is only used by $ and it uses \sl anyway +% this is not a problem. +\def\ifusingit#1#2{\ifdim \fontdimen1\font>0pt #1\else #2\fi} + +% Turn off all special characters except @ +% (and those which the user can use as if they were ordinary). +% Most of these we simply print from the \tt font, but for some, we can +% use math or other variants that look better in normal text. + +\catcode`\"=\active +\def\activedoublequote{{\tt\char34}} +\let"=\activedoublequote +\catcode`\~=\active +\def~{{\tt\char126}} +\chardef\hat=`\^ +\catcode`\^=\active +\def^{{\tt \hat}} + +\catcode`\_=\active +\def_{\ifusingtt\normalunderscore\_} +% Subroutine for the previous macro. +\def\_{\leavevmode \kern.07em \vbox{\hrule width.3em height.1ex}\kern .07em } + +\catcode`\|=\active +\def|{{\tt\char124}} +\chardef \less=`\< +\catcode`\<=\active +\def<{{\tt \less}} +\chardef \gtr=`\> +\catcode`\>=\active +\def>{{\tt \gtr}} +\catcode`\+=\active +\def+{{\tt \char 43}} +\catcode`\$=\active +\def${\ifusingit{{\sl\$}}\normaldollar}%$ font-lock fix + +% If a .fmt file is being used, characters that might appear in a file +% name cannot be active until we have parsed the command line. +% So turn them off again, and have \everyjob (or @setfilename) turn them on. +% \otherifyactive is called near the end of this file. +\def\otherifyactive{\catcode`+=\other \catcode`\_=\other} + +\catcode`\@=0 + +% \backslashcurfont outputs one backslash character in current font, +% as in \char`\\. +\global\chardef\backslashcurfont=`\\ +\global\let\rawbackslashxx=\backslashcurfont % let existing .??s files work + +% \rawbackslash defines an active \ to do \backslashcurfont. +% \otherbackslash defines an active \ to be a literal `\' character with +% catcode other. +{\catcode`\\=\active + @gdef@rawbackslash{@let\=@backslashcurfont} + @gdef@otherbackslash{@let\=@realbackslash} +} + +% \realbackslash is an actual character `\' with catcode other. +{\catcode`\\=\other @gdef@realbackslash{\}} + +% \normalbackslash outputs one backslash in fixed width font. +\def\normalbackslash{{\tt\backslashcurfont}} + +\catcode`\\=\active + +% Used sometimes to turn off (effectively) the active characters +% even after parsing them. +@def@turnoffactive{% + @let"=@normaldoublequote + @let\=@realbackslash + @let~=@normaltilde + @let^=@normalcaret + @let_=@normalunderscore + @let|=@normalverticalbar + @let<=@normalless + @let>=@normalgreater + @let+=@normalplus + @let$=@normaldollar %$ font-lock fix + @unsepspaces +} + +% Same as @turnoffactive except outputs \ as {\tt\char`\\} instead of +% the literal character `\'. (Thus, \ is not expandable when this is in +% effect.) +% +@def@normalturnoffactive{@turnoffactive @let\=@normalbackslash} + +% Make _ and + \other characters, temporarily. +% This is canceled by @fixbackslash. +@otherifyactive + +% If a .fmt file is being used, we don't want the `\input texinfo' to show up. +% That is what \eatinput is for; after that, the `\' should revert to printing +% a backslash. +% +@gdef@eatinput input texinfo{@fixbackslash} +@global@let\ = @eatinput + +% On the other hand, perhaps the file did not have a `\input texinfo'. Then +% the first `\{ in the file would cause an error. This macro tries to fix +% that, assuming it is called before the first `\' could plausibly occur. +% Also back turn on active characters that might appear in the input +% file name, in case not using a pre-dumped format. +% +@gdef@fixbackslash{% + @ifx\@eatinput @let\ = @normalbackslash @fi + @catcode`+=@active + @catcode`@_=@active +} + +% Say @foo, not \foo, in error messages. +@escapechar = `@@ + +% These look ok in all fonts, so just make them not special. +@catcode`@& = @other +@catcode`@# = @other +@catcode`@% = @other + + +@c Local variables: +@c eval: (add-hook 'write-file-hooks 'time-stamp) +@c page-delimiter: "^\\\\message" +@c time-stamp-start: "def\\\\texinfoversion{" +@c time-stamp-format: "%:y-%02m-%02d.%02H" +@c time-stamp-end: "}" +@c End: + +@c vim:sw=2: + +@ignore + arch-tag: e1b36e32-c96e-4135-a41a-0b2efa2ea115 +@end ignore diff --git a/src/apps/bin/bison/config/ylwrap b/src/apps/bin/bison/config/ylwrap new file mode 100644 index 0000000000..f86e217301 --- /dev/null +++ b/src/apps/bin/bison/config/ylwrap @@ -0,0 +1,222 @@ +#! /bin/sh +# ylwrap - wrapper for lex/yacc invocations. + +scriptversion=2003-11-18.20 + +# Copyright (C) 1996, 1997, 1998, 1999, 2001, 2002, 2003 +# Free Software Foundation, Inc. +# +# Written by Tom Tromey . +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + +# As a special exception to the GNU General Public License, if you +# distribute this file as part of a program that contains a +# configuration script generated by Autoconf, you may include it under +# the same distribution terms that you use for the rest of that program. + +# This file is maintained in Automake, please report +# bugs to or send patches to +# . + +case "$1" in + '') + echo "$0: No files given. Try \`$0 --help' for more information." 1>&2 + exit 1 + ;; + --basedir) + basedir=$2 + shift 2 + ;; + -h|--h*) + cat <<\EOF +Usage: ylwrap [--help|--version] INPUT [OUTPUT DESIRED]... -- PROGRAM [ARGS]... + +Wrapper for lex/yacc invocations, renaming files as desired. + + INPUT is the input file + OUTPUT is one file PROG generates + DESIRED is the file we actually want instead of OUTPUT + PROGRAM is program to run + ARGS are passed to PROG + +Any number of OUTPUT,DESIRED pairs may be used. + +Report bugs to . +EOF + exit 0 + ;; + -v|--v*) + echo "ylwrap $scriptversion" + exit 0 + ;; +esac + + +# The input. +input="$1" +shift +case "$input" in + [\\/]* | ?:[\\/]*) + # Absolute path; do nothing. + ;; + *) + # Relative path. Make it absolute. + input="`pwd`/$input" + ;; +esac + +pairlist= +while test "$#" -ne 0; do + if test "$1" = "--"; then + shift + break + fi + pairlist="$pairlist $1" + shift +done + +# The program to run. +prog="$1" +shift +# Make any relative path in $prog absolute. +case "$prog" in + [\\/]* | ?:[\\/]*) ;; + *[\\/]*) prog="`pwd`/$prog" ;; +esac + +# FIXME: add hostname here for parallel makes that run commands on +# other machines. But that might take us over the 14-char limit. +dirname=ylwrap$$ +trap "cd `pwd`; rm -rf $dirname > /dev/null 2>&1" 1 2 3 15 +mkdir $dirname || exit 1 + +cd $dirname + +case $# in + 0) $prog "$input" ;; + *) $prog "$@" "$input" ;; +esac +status=$? + +if test $status -eq 0; then + set X $pairlist + shift + first=yes + # Since DOS filename conventions don't allow two dots, + # the DOS version of Bison writes out y_tab.c instead of y.tab.c + # and y_tab.h instead of y.tab.h. Test to see if this is the case. + y_tab_nodot="no" + if test -f y_tab.c || test -f y_tab.h; then + y_tab_nodot="yes" + fi + + # The directory holding the input. + input_dir=`echo "$input" | sed -e 's,\([\\/]\)[^\\/]*$,\1,'` + # Quote $INPUT_DIR so we can use it in a regexp. + # FIXME: really we should care about more than `.' and `\'. + input_rx=`echo "$input_dir" | sed 's,\\\\,\\\\\\\\,g;s,\\.,\\\\.,g'` + + while test "$#" -ne 0; do + from="$1" + # Handle y_tab.c and y_tab.h output by DOS + if test $y_tab_nodot = "yes"; then + if test $from = "y.tab.c"; then + from="y_tab.c" + else + if test $from = "y.tab.h"; then + from="y_tab.h" + fi + fi + fi + if test -f "$from"; then + # If $2 is an absolute path name, then just use that, + # otherwise prepend `../'. + case "$2" in + [\\/]* | ?:[\\/]*) target="$2";; + *) target="../$2";; + esac + + # We do not want to overwrite a header file if it hasn't + # changed. This avoid useless recompilations. However the + # parser itself (the first file) should always be updated, + # because it is the destination of the .y.c rule in the + # Makefile. Divert the output of all other files to a temporary + # file so we can compare them to existing versions. + if test $first = no; then + realtarget="$target" + target="tmp-`echo $target | sed s/.*[\\/]//g`" + fi + # Edit out `#line' or `#' directives. + # + # We don't want the resulting debug information to point at + # an absolute srcdir; it is better for it to just mention the + # .y file with no path. + # + # We want to use the real output file name, not yy.lex.c for + # instance. + # + # We want the include guards to be adjusted too. + FROM=`echo "$from" | sed \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\ + -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'` + TARGET=`echo "$2" | sed \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/'\ + -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'` + + sed -e "/^#/!b" -e "s,$input_rx,," -e "s,$from,$2," \ + -e "s,$FROM,$TARGET," "$from" >"$target" || status=$? + + # Check whether header files must be updated. + if test $first = no; then + if test -f "$realtarget" && cmp -s "$realtarget" "$target"; then + echo "$2" is unchanged + rm -f "$target" + else + echo updating "$2" + mv -f "$target" "$realtarget" + fi + fi + else + # A missing file is only an error for the first file. This + # is a blatant hack to let us support using "yacc -d". If -d + # is not specified, we don't want an error when the header + # file is "missing". + if test $first = yes; then + status=1 + fi + fi + shift + shift + first=no + done +else + status=$? +fi + +# Remove the directory. +cd .. +rm -rf $dirname + +exit $status + +# Local Variables: +# mode: shell-script +# sh-indentation: 2 +# eval: (add-hook 'write-file-hooks 'time-stamp) +# time-stamp-start: "scriptversion=" +# time-stamp-format: "%:y-%02m-%02d.%02H" +# time-stamp-end: "$" +# End: diff --git a/src/apps/bin/bison/configure b/src/apps/bin/bison/configure new file mode 100644 index 0000000000..dfa5d7ead7 --- /dev/null +++ b/src/apps/bin/bison/configure @@ -0,0 +1,16198 @@ +#! /bin/sh +# Guess values for system-dependent variables and create Makefiles. +# Generated by GNU Autoconf 2.59 for GNU Bison 1.875d. +# +# Report bugs to . +# +# Copyright (C) 2003 Free Software Foundation, Inc. +# This configure script is free software; the Free Software Foundation +# gives unlimited permission to copy, distribute and modify it. +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + + +# Name of the host. +# hostname on some systems (SVR3.2, Linux) returns a bogus exit status, +# so uname gets run too. +ac_hostname=`(hostname || uname -n) 2>/dev/null | sed 1q` + +exec 6>&1 + +# +# Initializations. +# +ac_default_prefix=/usr/local +ac_config_libobj_dir=. +cross_compiling=no +subdirs= +MFLAGS= +MAKEFLAGS= +SHELL=${CONFIG_SHELL-/bin/sh} + +# Maximum number of lines to put in a shell here document. +# This variable seems obsolete. It should probably be removed, and +# only ac_max_sed_lines should be used. +: ${ac_max_here_lines=38} + +# Identity of this package. +PACKAGE_NAME='GNU Bison' +PACKAGE_TARNAME='bison' +PACKAGE_VERSION='1.875d' +PACKAGE_STRING='GNU Bison 1.875d' +PACKAGE_BUGREPORT='bug-bison@gnu.org' + +# Factoring default headers for most tests. +ac_includes_default="\ +#include +#if HAVE_SYS_TYPES_H +# include +#endif +#if HAVE_SYS_STAT_H +# include +#endif +#if STDC_HEADERS +# include +# include +#else +# if HAVE_STDLIB_H +# include +# endif +#endif +#if HAVE_STRING_H +# if !STDC_HEADERS && HAVE_MEMORY_H +# include +# endif +# include +#endif +#if HAVE_STRINGS_H +# include +#endif +#if HAVE_INTTYPES_H +# include +#else +# if HAVE_STDINT_H +# include +# endif +#endif +#if HAVE_UNISTD_H +# include +#endif" + +gl_header_list= +gl_func_list= +ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO AMTAR install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot CC CFLAGS LDFLAGS CPPFLAGS ac_ct_CC EXEEXT OBJEXT DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_TRUE am__fastdepCC_FALSE CPP EGREP WARNING_CFLAGS WERROR_CFLAGS WARNING_CXXFLAGS YACC_SCRIPT YACC_LIBRARY LEX LEXLIB LEX_OUTPUT_ROOT YACC RANLIB ac_ct_RANLIB M4 STDBOOL_H HAVE__BOOL ALLOCA ALLOCA_H LIBOBJS MKINSTALLDIRS USE_NLS MSGFMT GMSGFMT XGETTEXT MSGMERGE build build_cpu build_vendor build_os host host_cpu host_vendor host_os LIBICONV LTLIBICONV INTLLIBS LIBINTL LTLIBINTL POSUB VALGRIND CXX CXXFLAGS ac_ct_CXX CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE AUTOM4TE GCC O0CFLAGS LTLIBOBJS' +ac_subst_files='' + +# Initialize some variables set by options. +ac_init_help= +ac_init_version=false +# The variables have the same names as the options, with +# dashes changed to underlines. +cache_file=/dev/null +exec_prefix=NONE +no_create= +no_recursion= +prefix=NONE +program_prefix=NONE +program_suffix=NONE +program_transform_name=s,x,x, +silent= +site= +srcdir= +verbose= +x_includes=NONE +x_libraries=NONE + +# Installation directory options. +# These are left unexpanded so users can "make install exec_prefix=/foo" +# and all the variables that are supposed to be based on exec_prefix +# by default will actually change. +# Use braces instead of parens because sh, perl, etc. also accept them. +bindir='${exec_prefix}/bin' +sbindir='${exec_prefix}/sbin' +libexecdir='${exec_prefix}/libexec' +datadir='${prefix}/share' +sysconfdir='${prefix}/etc' +sharedstatedir='${prefix}/com' +localstatedir='${prefix}/var' +libdir='${exec_prefix}/lib' +includedir='${prefix}/include' +oldincludedir='/usr/include' +infodir='${prefix}/info' +mandir='${prefix}/man' + +ac_prev= +for ac_option +do + # If the previous option needs an argument, assign it. + if test -n "$ac_prev"; then + eval "$ac_prev=\$ac_option" + ac_prev= + continue + fi + + ac_optarg=`expr "x$ac_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $ac_option in + + -bindir | --bindir | --bindi | --bind | --bin | --bi) + ac_prev=bindir ;; + -bindir=* | --bindir=* | --bindi=* | --bind=* | --bin=* | --bi=*) + bindir=$ac_optarg ;; + + -build | --build | --buil | --bui | --bu) + ac_prev=build_alias ;; + -build=* | --build=* | --buil=* | --bui=* | --bu=*) + build_alias=$ac_optarg ;; + + -cache-file | --cache-file | --cache-fil | --cache-fi \ + | --cache-f | --cache- | --cache | --cach | --cac | --ca | --c) + ac_prev=cache_file ;; + -cache-file=* | --cache-file=* | --cache-fil=* | --cache-fi=* \ + | --cache-f=* | --cache-=* | --cache=* | --cach=* | --cac=* | --ca=* | --c=*) + cache_file=$ac_optarg ;; + + --config-cache | -C) + cache_file=config.cache ;; + + -datadir | --datadir | --datadi | --datad | --data | --dat | --da) + ac_prev=datadir ;; + -datadir=* | --datadir=* | --datadi=* | --datad=* | --data=* | --dat=* \ + | --da=*) + datadir=$ac_optarg ;; + + -disable-* | --disable-*) + ac_feature=`expr "x$ac_option" : 'x-*disable-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + eval "enable_$ac_feature=no" ;; + + -enable-* | --enable-*) + ac_feature=`expr "x$ac_option" : 'x-*enable-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_feature" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid feature name: $ac_feature" >&2 + { (exit 1); exit 1; }; } + ac_feature=`echo $ac_feature | sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "enable_$ac_feature='$ac_optarg'" ;; + + -exec-prefix | --exec_prefix | --exec-prefix | --exec-prefi \ + | --exec-pref | --exec-pre | --exec-pr | --exec-p | --exec- \ + | --exec | --exe | --ex) + ac_prev=exec_prefix ;; + -exec-prefix=* | --exec_prefix=* | --exec-prefix=* | --exec-prefi=* \ + | --exec-pref=* | --exec-pre=* | --exec-pr=* | --exec-p=* | --exec-=* \ + | --exec=* | --exe=* | --ex=*) + exec_prefix=$ac_optarg ;; + + -gas | --gas | --ga | --g) + # Obsolete; use --with-gas. + with_gas=yes ;; + + -help | --help | --hel | --he | -h) + ac_init_help=long ;; + -help=r* | --help=r* | --hel=r* | --he=r* | -hr*) + ac_init_help=recursive ;; + -help=s* | --help=s* | --hel=s* | --he=s* | -hs*) + ac_init_help=short ;; + + -host | --host | --hos | --ho) + ac_prev=host_alias ;; + -host=* | --host=* | --hos=* | --ho=*) + host_alias=$ac_optarg ;; + + -includedir | --includedir | --includedi | --included | --include \ + | --includ | --inclu | --incl | --inc) + ac_prev=includedir ;; + -includedir=* | --includedir=* | --includedi=* | --included=* | --include=* \ + | --includ=* | --inclu=* | --incl=* | --inc=*) + includedir=$ac_optarg ;; + + -infodir | --infodir | --infodi | --infod | --info | --inf) + ac_prev=infodir ;; + -infodir=* | --infodir=* | --infodi=* | --infod=* | --info=* | --inf=*) + infodir=$ac_optarg ;; + + -libdir | --libdir | --libdi | --libd) + ac_prev=libdir ;; + -libdir=* | --libdir=* | --libdi=* | --libd=*) + libdir=$ac_optarg ;; + + -libexecdir | --libexecdir | --libexecdi | --libexecd | --libexec \ + | --libexe | --libex | --libe) + ac_prev=libexecdir ;; + -libexecdir=* | --libexecdir=* | --libexecdi=* | --libexecd=* | --libexec=* \ + | --libexe=* | --libex=* | --libe=*) + libexecdir=$ac_optarg ;; + + -localstatedir | --localstatedir | --localstatedi | --localstated \ + | --localstate | --localstat | --localsta | --localst \ + | --locals | --local | --loca | --loc | --lo) + ac_prev=localstatedir ;; + -localstatedir=* | --localstatedir=* | --localstatedi=* | --localstated=* \ + | --localstate=* | --localstat=* | --localsta=* | --localst=* \ + | --locals=* | --local=* | --loca=* | --loc=* | --lo=*) + localstatedir=$ac_optarg ;; + + -mandir | --mandir | --mandi | --mand | --man | --ma | --m) + ac_prev=mandir ;; + -mandir=* | --mandir=* | --mandi=* | --mand=* | --man=* | --ma=* | --m=*) + mandir=$ac_optarg ;; + + -nfp | --nfp | --nf) + # Obsolete; use --without-fp. + with_fp=no ;; + + -no-create | --no-create | --no-creat | --no-crea | --no-cre \ + | --no-cr | --no-c | -n) + no_create=yes ;; + + -no-recursion | --no-recursion | --no-recursio | --no-recursi \ + | --no-recurs | --no-recur | --no-recu | --no-rec | --no-re | --no-r) + no_recursion=yes ;; + + -oldincludedir | --oldincludedir | --oldincludedi | --oldincluded \ + | --oldinclude | --oldinclud | --oldinclu | --oldincl | --oldinc \ + | --oldin | --oldi | --old | --ol | --o) + ac_prev=oldincludedir ;; + -oldincludedir=* | --oldincludedir=* | --oldincludedi=* | --oldincluded=* \ + | --oldinclude=* | --oldinclud=* | --oldinclu=* | --oldincl=* | --oldinc=* \ + | --oldin=* | --oldi=* | --old=* | --ol=* | --o=*) + oldincludedir=$ac_optarg ;; + + -prefix | --prefix | --prefi | --pref | --pre | --pr | --p) + ac_prev=prefix ;; + -prefix=* | --prefix=* | --prefi=* | --pref=* | --pre=* | --pr=* | --p=*) + prefix=$ac_optarg ;; + + -program-prefix | --program-prefix | --program-prefi | --program-pref \ + | --program-pre | --program-pr | --program-p) + ac_prev=program_prefix ;; + -program-prefix=* | --program-prefix=* | --program-prefi=* \ + | --program-pref=* | --program-pre=* | --program-pr=* | --program-p=*) + program_prefix=$ac_optarg ;; + + -program-suffix | --program-suffix | --program-suffi | --program-suff \ + | --program-suf | --program-su | --program-s) + ac_prev=program_suffix ;; + -program-suffix=* | --program-suffix=* | --program-suffi=* \ + | --program-suff=* | --program-suf=* | --program-su=* | --program-s=*) + program_suffix=$ac_optarg ;; + + -program-transform-name | --program-transform-name \ + | --program-transform-nam | --program-transform-na \ + | --program-transform-n | --program-transform- \ + | --program-transform | --program-transfor \ + | --program-transfo | --program-transf \ + | --program-trans | --program-tran \ + | --progr-tra | --program-tr | --program-t) + ac_prev=program_transform_name ;; + -program-transform-name=* | --program-transform-name=* \ + | --program-transform-nam=* | --program-transform-na=* \ + | --program-transform-n=* | --program-transform-=* \ + | --program-transform=* | --program-transfor=* \ + | --program-transfo=* | --program-transf=* \ + | --program-trans=* | --program-tran=* \ + | --progr-tra=* | --program-tr=* | --program-t=*) + program_transform_name=$ac_optarg ;; + + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + silent=yes ;; + + -sbindir | --sbindir | --sbindi | --sbind | --sbin | --sbi | --sb) + ac_prev=sbindir ;; + -sbindir=* | --sbindir=* | --sbindi=* | --sbind=* | --sbin=* \ + | --sbi=* | --sb=*) + sbindir=$ac_optarg ;; + + -sharedstatedir | --sharedstatedir | --sharedstatedi \ + | --sharedstated | --sharedstate | --sharedstat | --sharedsta \ + | --sharedst | --shareds | --shared | --share | --shar \ + | --sha | --sh) + ac_prev=sharedstatedir ;; + -sharedstatedir=* | --sharedstatedir=* | --sharedstatedi=* \ + | --sharedstated=* | --sharedstate=* | --sharedstat=* | --sharedsta=* \ + | --sharedst=* | --shareds=* | --shared=* | --share=* | --shar=* \ + | --sha=* | --sh=*) + sharedstatedir=$ac_optarg ;; + + -site | --site | --sit) + ac_prev=site ;; + -site=* | --site=* | --sit=*) + site=$ac_optarg ;; + + -srcdir | --srcdir | --srcdi | --srcd | --src | --sr) + ac_prev=srcdir ;; + -srcdir=* | --srcdir=* | --srcdi=* | --srcd=* | --src=* | --sr=*) + srcdir=$ac_optarg ;; + + -sysconfdir | --sysconfdir | --sysconfdi | --sysconfd | --sysconf \ + | --syscon | --sysco | --sysc | --sys | --sy) + ac_prev=sysconfdir ;; + -sysconfdir=* | --sysconfdir=* | --sysconfdi=* | --sysconfd=* | --sysconf=* \ + | --syscon=* | --sysco=* | --sysc=* | --sys=* | --sy=*) + sysconfdir=$ac_optarg ;; + + -target | --target | --targe | --targ | --tar | --ta | --t) + ac_prev=target_alias ;; + -target=* | --target=* | --targe=* | --targ=* | --tar=* | --ta=* | --t=*) + target_alias=$ac_optarg ;; + + -v | -verbose | --verbose | --verbos | --verbo | --verb) + verbose=yes ;; + + -version | --version | --versio | --versi | --vers | -V) + ac_init_version=: ;; + + -with-* | --with-*) + ac_package=`expr "x$ac_option" : 'x-*with-\([^=]*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package| sed 's/-/_/g'` + case $ac_option in + *=*) ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"`;; + *) ac_optarg=yes ;; + esac + eval "with_$ac_package='$ac_optarg'" ;; + + -without-* | --without-*) + ac_package=`expr "x$ac_option" : 'x-*without-\(.*\)'` + # Reject names that are not valid shell variable names. + expr "x$ac_package" : ".*[^-_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid package name: $ac_package" >&2 + { (exit 1); exit 1; }; } + ac_package=`echo $ac_package | sed 's/-/_/g'` + eval "with_$ac_package=no" ;; + + --x) + # Obsolete; use --with-x. + with_x=yes ;; + + -x-includes | --x-includes | --x-include | --x-includ | --x-inclu \ + | --x-incl | --x-inc | --x-in | --x-i) + ac_prev=x_includes ;; + -x-includes=* | --x-includes=* | --x-include=* | --x-includ=* | --x-inclu=* \ + | --x-incl=* | --x-inc=* | --x-in=* | --x-i=*) + x_includes=$ac_optarg ;; + + -x-libraries | --x-libraries | --x-librarie | --x-librari \ + | --x-librar | --x-libra | --x-libr | --x-lib | --x-li | --x-l) + ac_prev=x_libraries ;; + -x-libraries=* | --x-libraries=* | --x-librarie=* | --x-librari=* \ + | --x-librar=* | --x-libra=* | --x-libr=* | --x-lib=* | --x-li=* | --x-l=*) + x_libraries=$ac_optarg ;; + + -*) { echo "$as_me: error: unrecognized option: $ac_option +Try \`$0 --help' for more information." >&2 + { (exit 1); exit 1; }; } + ;; + + *=*) + ac_envvar=`expr "x$ac_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$ac_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $ac_envvar" >&2 + { (exit 1); exit 1; }; } + ac_optarg=`echo "$ac_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$ac_envvar='$ac_optarg'" + export $ac_envvar ;; + + *) + # FIXME: should be removed in autoconf 3.0. + echo "$as_me: WARNING: you should use --build, --host, --target" >&2 + expr "x$ac_option" : ".*[^-._$as_cr_alnum]" >/dev/null && + echo "$as_me: WARNING: invalid host type: $ac_option" >&2 + : ${build_alias=$ac_option} ${host_alias=$ac_option} ${target_alias=$ac_option} + ;; + + esac +done + +if test -n "$ac_prev"; then + ac_option=--`echo $ac_prev | sed 's/_/-/g'` + { echo "$as_me: error: missing argument to $ac_option" >&2 + { (exit 1); exit 1; }; } +fi + +# Be sure to have absolute paths. +for ac_var in exec_prefix prefix +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* | NONE | '' ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# Be sure to have absolute paths. +for ac_var in bindir sbindir libexecdir datadir sysconfdir sharedstatedir \ + localstatedir libdir includedir oldincludedir infodir mandir +do + eval ac_val=$`echo $ac_var` + case $ac_val in + [\\/$]* | ?:[\\/]* ) ;; + *) { echo "$as_me: error: expected an absolute directory name for --$ac_var: $ac_val" >&2 + { (exit 1); exit 1; }; };; + esac +done + +# There might be people who depend on the old broken behavior: `$host' +# used to hold the argument of --host etc. +# FIXME: To remove some day. +build=$build_alias +host=$host_alias +target=$target_alias + +# FIXME: To remove some day. +if test "x$host_alias" != x; then + if test "x$build_alias" = x; then + cross_compiling=maybe + echo "$as_me: WARNING: If you wanted to set the --build type, don't use --host. + If a cross compiler is detected then cross compile mode will be used." >&2 + elif test "x$build_alias" != "x$host_alias"; then + cross_compiling=yes + fi +fi + +ac_tool_prefix= +test -n "$host_alias" && ac_tool_prefix=$host_alias- + +test "$silent" = yes && exec 6>/dev/null + + +# Find the source files, if location was not specified. +if test -z "$srcdir"; then + ac_srcdir_defaulted=yes + # Try the directory containing this script, then its parent. + ac_confdir=`(dirname "$0") 2>/dev/null || +$as_expr X"$0" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$0" : 'X\(//\)[^/]' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$0" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + srcdir=$ac_confdir + if test ! -r $srcdir/$ac_unique_file; then + srcdir=.. + fi +else + ac_srcdir_defaulted=no +fi +if test ! -r $srcdir/$ac_unique_file; then + if test "$ac_srcdir_defaulted" = yes; then + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $ac_confdir or .." >&2 + { (exit 1); exit 1; }; } + else + { echo "$as_me: error: cannot find sources ($ac_unique_file) in $srcdir" >&2 + { (exit 1); exit 1; }; } + fi +fi +(cd $srcdir && test -r ./$ac_unique_file) 2>/dev/null || + { echo "$as_me: error: sources are in $srcdir, but \`cd $srcdir' does not work" >&2 + { (exit 1); exit 1; }; } +srcdir=`echo "$srcdir" | sed 's%\([^\\/]\)[\\/]*$%\1%'` +ac_env_build_alias_set=${build_alias+set} +ac_env_build_alias_value=$build_alias +ac_cv_env_build_alias_set=${build_alias+set} +ac_cv_env_build_alias_value=$build_alias +ac_env_host_alias_set=${host_alias+set} +ac_env_host_alias_value=$host_alias +ac_cv_env_host_alias_set=${host_alias+set} +ac_cv_env_host_alias_value=$host_alias +ac_env_target_alias_set=${target_alias+set} +ac_env_target_alias_value=$target_alias +ac_cv_env_target_alias_set=${target_alias+set} +ac_cv_env_target_alias_value=$target_alias +ac_env_CC_set=${CC+set} +ac_env_CC_value=$CC +ac_cv_env_CC_set=${CC+set} +ac_cv_env_CC_value=$CC +ac_env_CFLAGS_set=${CFLAGS+set} +ac_env_CFLAGS_value=$CFLAGS +ac_cv_env_CFLAGS_set=${CFLAGS+set} +ac_cv_env_CFLAGS_value=$CFLAGS +ac_env_LDFLAGS_set=${LDFLAGS+set} +ac_env_LDFLAGS_value=$LDFLAGS +ac_cv_env_LDFLAGS_set=${LDFLAGS+set} +ac_cv_env_LDFLAGS_value=$LDFLAGS +ac_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_env_CPPFLAGS_value=$CPPFLAGS +ac_cv_env_CPPFLAGS_set=${CPPFLAGS+set} +ac_cv_env_CPPFLAGS_value=$CPPFLAGS +ac_env_CPP_set=${CPP+set} +ac_env_CPP_value=$CPP +ac_cv_env_CPP_set=${CPP+set} +ac_cv_env_CPP_value=$CPP +ac_env_CXX_set=${CXX+set} +ac_env_CXX_value=$CXX +ac_cv_env_CXX_set=${CXX+set} +ac_cv_env_CXX_value=$CXX +ac_env_CXXFLAGS_set=${CXXFLAGS+set} +ac_env_CXXFLAGS_value=$CXXFLAGS +ac_cv_env_CXXFLAGS_set=${CXXFLAGS+set} +ac_cv_env_CXXFLAGS_value=$CXXFLAGS + +# +# Report the --help message. +# +if test "$ac_init_help" = "long"; then + # Omit some internal or obsolete options to make the list less imposing. + # This message is too long to be a string in the A/UX 3.1 sh. + cat <<_ACEOF +\`configure' configures GNU Bison 1.875d to adapt to many kinds of systems. + +Usage: $0 [OPTION]... [VAR=VALUE]... + +To assign environment variables (e.g., CC, CFLAGS...), specify them as +VAR=VALUE. See below for descriptions of some of the useful variables. + +Defaults for the options are specified in brackets. + +Configuration: + -h, --help display this help and exit + --help=short display options specific to this package + --help=recursive display the short help of all the included packages + -V, --version display version information and exit + -q, --quiet, --silent do not print \`checking...' messages + --cache-file=FILE cache test results in FILE [disabled] + -C, --config-cache alias for \`--cache-file=config.cache' + -n, --no-create do not create output files + --srcdir=DIR find the sources in DIR [configure dir or \`..'] + +_ACEOF + + cat <<_ACEOF +Installation directories: + --prefix=PREFIX install architecture-independent files in PREFIX + [$ac_default_prefix] + --exec-prefix=EPREFIX install architecture-dependent files in EPREFIX + [PREFIX] + +By default, \`make install' will install all the files in +\`$ac_default_prefix/bin', \`$ac_default_prefix/lib' etc. You can specify +an installation prefix other than \`$ac_default_prefix' using \`--prefix', +for instance \`--prefix=\$HOME'. + +For better control, use the options below. + +Fine tuning of the installation directories: + --bindir=DIR user executables [EPREFIX/bin] + --sbindir=DIR system admin executables [EPREFIX/sbin] + --libexecdir=DIR program executables [EPREFIX/libexec] + --datadir=DIR read-only architecture-independent data [PREFIX/share] + --sysconfdir=DIR read-only single-machine data [PREFIX/etc] + --sharedstatedir=DIR modifiable architecture-independent data [PREFIX/com] + --localstatedir=DIR modifiable single-machine data [PREFIX/var] + --libdir=DIR object code libraries [EPREFIX/lib] + --includedir=DIR C header files [PREFIX/include] + --oldincludedir=DIR C header files for non-gcc [/usr/include] + --infodir=DIR info documentation [PREFIX/info] + --mandir=DIR man documentation [PREFIX/man] +_ACEOF + + cat <<\_ACEOF + +Program names: + --program-prefix=PREFIX prepend PREFIX to installed program names + --program-suffix=SUFFIX append SUFFIX to installed program names + --program-transform-name=PROGRAM run sed PROGRAM on installed program names + +System types: + --build=BUILD configure for building on BUILD [guessed] + --host=HOST cross-compile to build programs to run on HOST [BUILD] +_ACEOF +fi + +if test -n "$ac_init_help"; then + case $ac_init_help in + short | recursive ) echo "Configuration of GNU Bison 1.875d:";; + esac + cat <<\_ACEOF + +Optional Features: + --disable-FEATURE do not include FEATURE (same as --enable-FEATURE=no) + --enable-FEATURE[=ARG] include FEATURE [ARG=yes] + --disable-dependency-tracking speeds up one-time build + --enable-dependency-tracking do not reject slow dependency extractors + --enable-gcc-warnings turn on lots of GCC warnings (not recommended) + --disable-yacc do not build a yacc command or an -ly library + --disable-nls do not use Native Language Support + --disable-rpath do not hardcode runtime library paths + +Optional Packages: + --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] + --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-dmalloc use dmalloc, as in + http://www.dmalloc.com/dmalloc.tar.gz + --with-gnu-ld assume the C compiler uses GNU ld default=no + --with-libiconv-prefix[=DIR] search for libiconv in DIR/include and DIR/lib + --without-libiconv-prefix don't search for libiconv in includedir and libdir + --with-libintl-prefix[=DIR] search for libintl in DIR/include and DIR/lib + --without-libintl-prefix don't search for libintl in includedir and libdir + +Some influential environment variables: + CC C compiler command + CFLAGS C compiler flags + LDFLAGS linker flags, e.g. -L if you have libraries in a + nonstandard directory + CPPFLAGS C/C++ preprocessor flags, e.g. -I if you have + headers in a nonstandard directory + CPP C preprocessor + CXX C++ compiler command + CXXFLAGS C++ compiler flags + +Use these variables to override the choices made by `configure' or to help +it to find libraries and programs with nonstandard names/locations. + +Report bugs to . +_ACEOF +fi + +if test "$ac_init_help" = "recursive"; then + # If there are subdirs, report their specific --help. + ac_popdir=`pwd` + for ac_dir in : $ac_subdirs_all; do test "x$ac_dir" = x: && continue + test -d $ac_dir || continue + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + cd $ac_dir + # Check for guested configure; otherwise get Cygnus style configure. + if test -f $ac_srcdir/configure.gnu; then + echo + $SHELL $ac_srcdir/configure.gnu --help=recursive + elif test -f $ac_srcdir/configure; then + echo + $SHELL $ac_srcdir/configure --help=recursive + elif test -f $ac_srcdir/configure.ac || + test -f $ac_srcdir/configure.in; then + echo + $ac_configure --help + else + echo "$as_me: WARNING: no configuration information is in $ac_dir" >&2 + fi + cd $ac_popdir + done +fi + +test -n "$ac_init_help" && exit 0 +if $ac_init_version; then + cat <<\_ACEOF +GNU Bison configure 1.875d +generated by GNU Autoconf 2.59 + +Copyright (C) 2003 Free Software Foundation, Inc. +This configure script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it. +_ACEOF + exit 0 +fi +exec 5>config.log +cat >&5 <<_ACEOF +This file contains any messages produced by compilers while +running configure, to aid debugging if configure makes a mistake. + +It was created by GNU Bison $as_me 1.875d, which was +generated by GNU Autoconf 2.59. Invocation command line was + + $ $0 $@ + +_ACEOF +{ +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + echo "PATH: $as_dir" +done + +} >&5 + +cat >&5 <<_ACEOF + + +## ----------- ## +## Core tests. ## +## ----------- ## + +_ACEOF + + +# Keep a trace of the command line. +# Strip out --no-create and --no-recursion so they do not pile up. +# Strip out --silent because we don't want to record it for future runs. +# Also quote any args containing shell meta-characters. +# Make two passes to allow for proper duplicate-argument suppression. +ac_configure_args= +ac_configure_args0= +ac_configure_args1= +ac_sep= +ac_must_keep_next=false +for ac_pass in 1 2 +do + for ac_arg + do + case $ac_arg in + -no-create | --no-c* | -n | -no-recursion | --no-r*) continue ;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil) + continue ;; + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=`echo "$ac_arg" | sed "s/'/'\\\\\\\\''/g"` ;; + esac + case $ac_pass in + 1) ac_configure_args0="$ac_configure_args0 '$ac_arg'" ;; + 2) + ac_configure_args1="$ac_configure_args1 '$ac_arg'" + if test $ac_must_keep_next = true; then + ac_must_keep_next=false # Got value, back to normal. + else + case $ac_arg in + *=* | --config-cache | -C | -disable-* | --disable-* \ + | -enable-* | --enable-* | -gas | --g* | -nfp | --nf* \ + | -q | -quiet | --q* | -silent | --sil* | -v | -verb* \ + | -with-* | --with-* | -without-* | --without-* | --x) + case "$ac_configure_args0 " in + "$ac_configure_args1"*" '$ac_arg' "* ) continue ;; + esac + ;; + -* ) ac_must_keep_next=true ;; + esac + fi + ac_configure_args="$ac_configure_args$ac_sep'$ac_arg'" + # Get rid of the leading space. + ac_sep=" " + ;; + esac + done +done +$as_unset ac_configure_args0 || test "${ac_configure_args0+set}" != set || { ac_configure_args0=; export ac_configure_args0; } +$as_unset ac_configure_args1 || test "${ac_configure_args1+set}" != set || { ac_configure_args1=; export ac_configure_args1; } + +# When interrupted or exit'd, cleanup temporary files, and complete +# config.log. We remove comments because anyway the quotes in there +# would cause problems or look ugly. +# WARNING: Be sure not to use single quotes in there, as some shells, +# such as our DU 5.0 friend, will then `close' the trap. +trap 'exit_status=$? + # Save into config.log some information that might help in debugging. + { + echo + + cat <<\_ASBOX +## ---------------- ## +## Cache variables. ## +## ---------------- ## +_ASBOX + echo + # The following way of writing the cache mishandles newlines in values, +{ + (set) 2>&1 | + case `(ac_space='"'"' '"'"'; set | grep ac_space) 2>&1` in + *ac_space=\ *) + sed -n \ + "s/'"'"'/'"'"'\\\\'"'"''"'"'/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='"'"'\\2'"'"'/p" + ;; + *) + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} + echo + + cat <<\_ASBOX +## ----------------- ## +## Output variables. ## +## ----------------- ## +_ASBOX + echo + for ac_var in $ac_subst_vars + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + + if test -n "$ac_subst_files"; then + cat <<\_ASBOX +## ------------- ## +## Output files. ## +## ------------- ## +_ASBOX + echo + for ac_var in $ac_subst_files + do + eval ac_val=$`echo $ac_var` + echo "$ac_var='"'"'$ac_val'"'"'" + done | sort + echo + fi + + if test -s confdefs.h; then + cat <<\_ASBOX +## ----------- ## +## confdefs.h. ## +## ----------- ## +_ASBOX + echo + sed "/^$/d" confdefs.h | sort + echo + fi + test "$ac_signal" != 0 && + echo "$as_me: caught signal $ac_signal" + echo "$as_me: exit $exit_status" + } >&5 + rm -f core *.core && + rm -rf conftest* confdefs* conf$$* $ac_clean_files && + exit $exit_status + ' 0 +for ac_signal in 1 2 13 15; do + trap 'ac_signal='$ac_signal'; { (exit 1); exit 1; }' $ac_signal +done +ac_signal=0 + +# confdefs.h avoids OS command line length limits that DEFS can exceed. +rm -rf conftest* confdefs.h +# AIX cpp loses on an empty file, so make sure it contains at least a newline. +echo >confdefs.h + +# Predefined preprocessor variables. + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_NAME "$PACKAGE_NAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_TARNAME "$PACKAGE_TARNAME" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_VERSION "$PACKAGE_VERSION" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_STRING "$PACKAGE_STRING" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE_BUGREPORT "$PACKAGE_BUGREPORT" +_ACEOF + + +# Let the site file select an alternate cache file if it wants to. +# Prefer explicitly selected file to automatically selected ones. +if test -z "$CONFIG_SITE"; then + if test "x$prefix" != xNONE; then + CONFIG_SITE="$prefix/share/config.site $prefix/etc/config.site" + else + CONFIG_SITE="$ac_default_prefix/share/config.site $ac_default_prefix/etc/config.site" + fi +fi +for ac_site_file in $CONFIG_SITE; do + if test -r "$ac_site_file"; then + { echo "$as_me:$LINENO: loading site script $ac_site_file" >&5 +echo "$as_me: loading site script $ac_site_file" >&6;} + sed 's/^/| /' "$ac_site_file" >&5 + . "$ac_site_file" + fi +done + +if test -r "$cache_file"; then + # Some versions of bash will fail to source /dev/null (special + # files actually), so we avoid doing that. + if test -f "$cache_file"; then + { echo "$as_me:$LINENO: loading cache $cache_file" >&5 +echo "$as_me: loading cache $cache_file" >&6;} + case $cache_file in + [\\/]* | ?:[\\/]* ) . $cache_file;; + *) . ./$cache_file;; + esac + fi +else + { echo "$as_me:$LINENO: creating cache $cache_file" >&5 +echo "$as_me: creating cache $cache_file" >&6;} + >$cache_file +fi + +# Check that the precious variables saved in the cache have kept the same +# value. +ac_cache_corrupted=false +for ac_var in `(set) 2>&1 | + sed -n 's/^ac_env_\([a-zA-Z_0-9]*\)_set=.*/\1/p'`; do + eval ac_old_set=\$ac_cv_env_${ac_var}_set + eval ac_new_set=\$ac_env_${ac_var}_set + eval ac_old_val="\$ac_cv_env_${ac_var}_value" + eval ac_new_val="\$ac_env_${ac_var}_value" + case $ac_old_set,$ac_new_set in + set,) + { echo "$as_me:$LINENO: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was set to \`$ac_old_val' in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,set) + { echo "$as_me:$LINENO: error: \`$ac_var' was not set in the previous run" >&5 +echo "$as_me: error: \`$ac_var' was not set in the previous run" >&2;} + ac_cache_corrupted=: ;; + ,);; + *) + if test "x$ac_old_val" != "x$ac_new_val"; then + { echo "$as_me:$LINENO: error: \`$ac_var' has changed since the previous run:" >&5 +echo "$as_me: error: \`$ac_var' has changed since the previous run:" >&2;} + { echo "$as_me:$LINENO: former value: $ac_old_val" >&5 +echo "$as_me: former value: $ac_old_val" >&2;} + { echo "$as_me:$LINENO: current value: $ac_new_val" >&5 +echo "$as_me: current value: $ac_new_val" >&2;} + ac_cache_corrupted=: + fi;; + esac + # Pass precious variables to config.status. + if test "$ac_new_set" = set; then + case $ac_new_val in + *" "*|*" "*|*[\[\]\~\#\$\^\&\*\(\)\{\}\\\|\;\<\>\?\"\']*) + ac_arg=$ac_var=`echo "$ac_new_val" | sed "s/'/'\\\\\\\\''/g"` ;; + *) ac_arg=$ac_var=$ac_new_val ;; + esac + case " $ac_configure_args " in + *" '$ac_arg' "*) ;; # Avoid dups. Use of quotes ensures accuracy. + *) ac_configure_args="$ac_configure_args '$ac_arg'" ;; + esac + fi +done +if $ac_cache_corrupted; then + { echo "$as_me:$LINENO: error: changes in the environment can compromise the build" >&5 +echo "$as_me: error: changes in the environment can compromise the build" >&2;} + { { echo "$as_me:$LINENO: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&5 +echo "$as_me: error: run \`make distclean' and/or \`rm $cache_file' and start over" >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +gl_header_list="$gl_header_list locale.h" +gl_func_list="$gl_func_list setlocale" +gl_header_list="$gl_header_list wchar.h" +gl_header_list="$gl_header_list wctype.h" +gl_func_list="$gl_func_list isascii" +gl_func_list="$gl_func_list iswprint" +gl_func_list="$gl_func_list mbsinit" + + + + + + + + + + + + + + + + + + + + + + + + + +ac_aux_dir= +for ac_dir in config $srcdir/config; do + if test -f $ac_dir/install-sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install-sh -c" + break + elif test -f $ac_dir/install.sh; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/install.sh -c" + break + elif test -f $ac_dir/shtool; then + ac_aux_dir=$ac_dir + ac_install_sh="$ac_aux_dir/shtool install -c" + break + fi +done +if test -z "$ac_aux_dir"; then + { { echo "$as_me:$LINENO: error: cannot find install-sh or install.sh in config $srcdir/config" >&5 +echo "$as_me: error: cannot find install-sh or install.sh in config $srcdir/config" >&2;} + { (exit 1); exit 1; }; } +fi +ac_config_guess="$SHELL $ac_aux_dir/config.guess" +ac_config_sub="$SHELL $ac_aux_dir/config.sub" +ac_configure="$SHELL $ac_aux_dir/configure" # This should be Cygnus configure. + +case m4 in + [\\/]* | ?:[\\/]* ) ac_macro_dir=m4 ;; + *) ac_macro_dir=$srcdir/m4 ;; +esac +if test -d "$ac_macro_dir"; then : +else + { { echo "$as_me:$LINENO: error: cannot find macro directory \`m4'" >&5 +echo "$as_me: error: cannot find macro directory \`m4'" >&2;} + { (exit 1); exit 1; }; } +fi + + +am__api_version="1.8" +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +echo "$as_me:$LINENO: checking for a BSD-compatible install" >&5 +echo $ECHO_N "checking for a BSD-compatible install... $ECHO_C" >&6 +if test -z "$INSTALL"; then +if test "${ac_cv_path_install+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in + ./ | .// | /cC/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:\\/os2\\/install\\/* | ?:\\/OS2\\/INSTALL\\/* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + done + done + ;; +esac +done + + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. We don't cache a + # path for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the path is relative. + INSTALL=$ac_install_sh + fi +fi +echo "$as_me:$LINENO: result: $INSTALL" >&5 +echo "${ECHO_T}$INSTALL" >&6 + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + +echo "$as_me:$LINENO: checking whether build environment is sane" >&5 +echo $ECHO_N "checking whether build environment is sane... $ECHO_C" >&6 +# Just in case +sleep 1 +echo timestamp > conftest.file +# Do `set' in a subshell so we don't clobber the current shell's +# arguments. Must try -L first in case configure is actually a +# symlink; some systems play weird games with the mod time of symlinks +# (eg FreeBSD returns the mod time of the symlink's containing +# directory). +if ( + set X `ls -Lt $srcdir/configure conftest.file 2> /dev/null` + if test "$*" = "X"; then + # -L didn't work. + set X `ls -t $srcdir/configure conftest.file` + fi + rm -f conftest.file + if test "$*" != "X $srcdir/configure conftest.file" \ + && test "$*" != "X conftest.file $srcdir/configure"; then + + # If neither matched, then we have a broken ls. This can happen + # if, for instance, CONFIG_SHELL is bash and it inherits a + # broken ls alias from the environment. This has actually + # happened. Such a system could not be considered "sane". + { { echo "$as_me:$LINENO: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&5 +echo "$as_me: error: ls -t appears to fail. Make sure there is not a broken +alias in your environment" >&2;} + { (exit 1); exit 1; }; } + fi + + test "$2" = conftest.file + ) +then + # Ok. + : +else + { { echo "$as_me:$LINENO: error: newly created file is older than distributed files! +Check your system clock" >&5 +echo "$as_me: error: newly created file is older than distributed files! +Check your system clock" >&2;} + { (exit 1); exit 1; }; } +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +test "$program_prefix" != NONE && + program_transform_name="s,^,$program_prefix,;$program_transform_name" +# Use a double $ so make ignores it. +test "$program_suffix" != NONE && + program_transform_name="s,\$,$program_suffix,;$program_transform_name" +# Double any \ or $. echo might interpret backslashes. +# By default was `s,x,x', remove it if useless. +cat <<\_ACEOF >conftest.sed +s/[\\$]/&&/g;s/;s,x,x,$// +_ACEOF +program_transform_name=`echo $program_transform_name | sed -f conftest.sed` +rm conftest.sed + +# expand $ac_aux_dir to an absolute path +am_aux_dir=`cd $ac_aux_dir && pwd` + +test x"${MISSING+set}" = xset || MISSING="\${SHELL} $am_aux_dir/missing" +# Use eval to expand $SHELL +if eval "$MISSING --run true"; then + am_missing_run="$MISSING --run " +else + am_missing_run= + { echo "$as_me:$LINENO: WARNING: \`missing' script is too old or missing" >&5 +echo "$as_me: WARNING: \`missing' script is too old or missing" >&2;} +fi + +if mkdir -p --version . >/dev/null 2>&1 && test ! -d ./--version; then + # Keeping the `.' argument allows $(mkdir_p) to be used without + # argument. Indeed, we sometimes output rules like + # $(mkdir_p) $(somedir) + # where $(somedir) is conditionally defined. + # (`test -n '$(somedir)' && $(mkdir_p) $(somedir)' is a more + # expensive solution, as it forces Make to start a sub-shell.) + mkdir_p='mkdir -p -- .' +else + # On NextStep and OpenStep, the `mkdir' command does not + # recognize any option. It will interpret all options as + # directories to create, and then abort because `.' already + # exists. + for d in ./-p ./--version; + do + test -d $d && rmdir $d + done + # $(mkinstalldirs) is defined by Automake if mkinstalldirs exists. + if test -f "$ac_aux_dir/mkinstalldirs"; then + mkdir_p='$(mkinstalldirs)' + else + mkdir_p='$(install_sh) -d' + fi +fi + +for ac_prog in gawk mawk nawk awk +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_AWK+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$AWK"; then + ac_cv_prog_AWK="$AWK" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_AWK="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +AWK=$ac_cv_prog_AWK +if test -n "$AWK"; then + echo "$as_me:$LINENO: result: $AWK" >&5 +echo "${ECHO_T}$AWK" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$AWK" && break +done + +echo "$as_me:$LINENO: checking whether ${MAKE-make} sets \$(MAKE)" >&5 +echo $ECHO_N "checking whether ${MAKE-make} sets \$(MAKE)... $ECHO_C" >&6 +set dummy ${MAKE-make}; ac_make=`echo "$2" | sed 'y,:./+-,___p_,'` +if eval "test \"\${ac_cv_prog_make_${ac_make}_set+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.make <<\_ACEOF +all: + @echo 'ac_maketemp="$(MAKE)"' +_ACEOF +# GNU make sometimes prints "make[1]: Entering...", which would confuse us. +eval `${MAKE-make} -f conftest.make 2>/dev/null | grep temp=` +if test -n "$ac_maketemp"; then + eval ac_cv_prog_make_${ac_make}_set=yes +else + eval ac_cv_prog_make_${ac_make}_set=no +fi +rm -f conftest.make +fi +if eval "test \"`echo '$ac_cv_prog_make_'${ac_make}_set`\" = yes"; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + SET_MAKE= +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 + SET_MAKE="MAKE=${MAKE-make}" +fi + +rm -rf .tst 2>/dev/null +mkdir .tst 2>/dev/null +if test -d .tst; then + am__leading_dot=. +else + am__leading_dot=_ +fi +rmdir .tst 2>/dev/null + +# test to see if srcdir already configured +if test "`cd $srcdir && pwd`" != "`pwd`" && + test -f $srcdir/config.status; then + { { echo "$as_me:$LINENO: error: source directory already configured; run \"make distclean\" there first" >&5 +echo "$as_me: error: source directory already configured; run \"make distclean\" there first" >&2;} + { (exit 1); exit 1; }; } +fi + +# test whether we have cygpath +if test -z "$CYGPATH_W"; then + if (cygpath --version) >/dev/null 2>/dev/null; then + CYGPATH_W='cygpath -w' + else + CYGPATH_W=echo + fi +fi + + +# Define the identity of the package. + PACKAGE='bison' + VERSION='1.875d' + + +cat >>confdefs.h <<_ACEOF +#define PACKAGE "$PACKAGE" +_ACEOF + + +cat >>confdefs.h <<_ACEOF +#define VERSION "$VERSION" +_ACEOF + +# Some tools Automake needs. + +ACLOCAL=${ACLOCAL-"${am_missing_run}aclocal-${am__api_version}"} + + +AUTOCONF=${AUTOCONF-"${am_missing_run}autoconf"} + + +AUTOMAKE=${AUTOMAKE-"${am_missing_run}automake-${am__api_version}"} + + +AUTOHEADER=${AUTOHEADER-"${am_missing_run}autoheader"} + + +MAKEINFO=${MAKEINFO-"${am_missing_run}makeinfo"} + + +AMTAR=${AMTAR-"${am_missing_run}tar"} + +install_sh=${install_sh-"$am_aux_dir/install-sh"} + +# Installed binaries are usually stripped using `strip' when the user +# run `make install-strip'. However `strip' might not be the right +# tool to use in cross-compilation environments, therefore Automake +# will honor the `STRIP' environment variable to overrule this program. +if test "$cross_compiling" != no; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}strip", so it can be a program name with args. +set dummy ${ac_tool_prefix}strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$STRIP"; then + ac_cv_prog_STRIP="$STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_STRIP="${ac_tool_prefix}strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +STRIP=$ac_cv_prog_STRIP +if test -n "$STRIP"; then + echo "$as_me:$LINENO: result: $STRIP" >&5 +echo "${ECHO_T}$STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_STRIP"; then + ac_ct_STRIP=$STRIP + # Extract the first word of "strip", so it can be a program name with args. +set dummy strip; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_STRIP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_STRIP"; then + ac_cv_prog_ac_ct_STRIP="$ac_ct_STRIP" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_STRIP="strip" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_STRIP" && ac_cv_prog_ac_ct_STRIP=":" +fi +fi +ac_ct_STRIP=$ac_cv_prog_ac_ct_STRIP +if test -n "$ac_ct_STRIP"; then + echo "$as_me:$LINENO: result: $ac_ct_STRIP" >&5 +echo "${ECHO_T}$ac_ct_STRIP" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + STRIP=$ac_ct_STRIP +else + STRIP="$ac_cv_prog_STRIP" +fi + +fi +INSTALL_STRIP_PROGRAM="\${SHELL} \$(install_sh) -c -s" + +# We need awk for the "check" target. The system "awk" is bad on +# some platforms. + + + + ac_config_headers="$ac_config_headers config.h:config.hin" + + + +cat >>confdefs.h <<\_ACEOF +#define _GNU_SOURCE 1 +_ACEOF + + +DEPDIR="${am__leading_dot}deps" + + ac_config_commands="$ac_config_commands depfiles" + + +am_make=${MAKE-make} +cat > confinc << 'END' +am__doit: + @echo done +.PHONY: am__doit +END +# If we don't find an include directive, just comment out the code. +echo "$as_me:$LINENO: checking for style of include used by $am_make" >&5 +echo $ECHO_N "checking for style of include used by $am_make... $ECHO_C" >&6 +am__include="#" +am__quote= +_am_result=none +# First try GNU make style include. +echo "include confinc" > confmf +# We grep out `Entering directory' and `Leaving directory' +# messages which can occur if `w' ends up in MAKEFLAGS. +# In particular we don't look at `^make:' because GNU make might +# be invoked under some other name (usually "gmake"), in which +# case it prints its new name instead of `make'. +if test "`$am_make -s -f confmf 2> /dev/null | grep -v 'ing directory'`" = "done"; then + am__include=include + am__quote= + _am_result=GNU +fi +# Now try BSD make style include. +if test "$am__include" = "#"; then + echo '.include "confinc"' > confmf + if test "`$am_make -s -f confmf 2> /dev/null`" = "done"; then + am__include=.include + am__quote="\"" + _am_result=BSD + fi +fi + + +echo "$as_me:$LINENO: result: $_am_result" >&5 +echo "${ECHO_T}$_am_result" >&6 +rm -f confinc confmf + +# Check whether --enable-dependency-tracking or --disable-dependency-tracking was given. +if test "${enable_dependency_tracking+set}" = set; then + enableval="$enable_dependency_tracking" + +fi; +if test "x$enable_dependency_tracking" != xno; then + am_depcomp="$ac_aux_dir/depcomp" + AMDEPBACKSLASH='\' +fi + + +if test "x$enable_dependency_tracking" != xno; then + AMDEP_TRUE= + AMDEP_FALSE='#' +else + AMDEP_TRUE='#' + AMDEP_FALSE= +fi + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files a.out a.exe b.out" +# Try to create an executable without -o first, disregard a.out. +# It will help us diagnose broken compilers, and finding out an intuition +# of exeext. +echo "$as_me:$LINENO: checking for C compiler default output file name" >&5 +echo $ECHO_N "checking for C compiler default output file name... $ECHO_C" >&6 +ac_link_default=`echo "$ac_link" | sed 's/ -o *conftest[^ ]*//'` +if { (eval echo "$as_me:$LINENO: \"$ac_link_default\"") >&5 + (eval $ac_link_default) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # Find the output, starting from the most likely. This scheme is +# not robust to junk in `.', hence go to wildcards (a.*) only as a last +# resort. + +# Be careful to initialize this variable, since it used to be cached. +# Otherwise an old cache value of `no' led to `EXEEXT = no' in a Makefile. +ac_cv_exeext= +# b.out is created by i960 compilers. +for ac_file in a_out.exe a.exe conftest.exe a.out conftest a.* conftest.* b.out +do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) + ;; + conftest.$ac_ext ) + # This is the source file. + ;; + [ab].out ) + # We found the default executable, but exeext='' is most + # certainly right. + break;; + *.* ) + ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + # FIXME: I believe we export ac_cv_exeext for Libtool, + # but it would be cool to find out if it's true. Does anybody + # maintain Libtool? --akim. + export ac_cv_exeext + break;; + * ) + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: C compiler cannot create executables +See \`config.log' for more details." >&5 +echo "$as_me: error: C compiler cannot create executables +See \`config.log' for more details." >&2;} + { (exit 77); exit 77; }; } +fi + +ac_exeext=$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_file" >&5 +echo "${ECHO_T}$ac_file" >&6 + +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether the C compiler works" >&5 +echo $ECHO_N "checking whether the C compiler works... $ECHO_C" >&6 +# FIXME: These cross compiler hacks should be removed for Autoconf 3.0 +# If not cross compiling, check that we can run a simple program. +if test "$cross_compiling" != yes; then + if { ac_try='./$ac_file' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + cross_compiling=no + else + if test "$cross_compiling" = maybe; then + cross_compiling=yes + else + { { echo "$as_me:$LINENO: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot run C compiled programs. +If you meant to cross compile, use \`--host'. +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + fi + fi +fi +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +rm -f a.out a.exe conftest$ac_cv_exeext b.out +ac_clean_files=$ac_clean_files_save +# Check the compiler produces executables we can run. If not, either +# the compiler is broken, or we cross compile. +echo "$as_me:$LINENO: checking whether we are cross compiling" >&5 +echo $ECHO_N "checking whether we are cross compiling... $ECHO_C" >&6 +echo "$as_me:$LINENO: result: $cross_compiling" >&5 +echo "${ECHO_T}$cross_compiling" >&6 + +echo "$as_me:$LINENO: checking for suffix of executables" >&5 +echo $ECHO_N "checking for suffix of executables... $ECHO_C" >&6 +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + # If both `conftest.exe' and `conftest' are `present' (well, observable) +# catch `conftest.exe'. For instance with Cygwin, `ls conftest' will +# work properly (i.e., refer to `conftest.exe'), while it won't with +# `rm'. +for ac_file in conftest.exe conftest conftest.*; do + test -f "$ac_file" || continue + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg | *.o | *.obj ) ;; + *.* ) ac_cv_exeext=`expr "$ac_file" : '[^.]*\(\..*\)'` + export ac_cv_exeext + break;; + * ) break;; + esac +done +else + { { echo "$as_me:$LINENO: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of executables: cannot compile and link +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest$ac_cv_exeext +echo "$as_me:$LINENO: result: $ac_cv_exeext" >&5 +echo "${ECHO_T}$ac_cv_exeext" >&6 + +rm -f conftest.$ac_ext +EXEEXT=$ac_cv_exeext +ac_exeext=$EXEEXT +echo "$as_me:$LINENO: checking for suffix of object files" >&5 +echo $ECHO_N "checking for suffix of object files... $ECHO_C" >&6 +if test "${ac_cv_objext+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.o conftest.obj +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; then + for ac_file in `(ls conftest.o conftest.obj; ls conftest.*) 2>/dev/null`; do + case $ac_file in + *.$ac_ext | *.xcoff | *.tds | *.d | *.pdb | *.xSYM | *.bb | *.bbg ) ;; + *) ac_cv_objext=`expr "$ac_file" : '.*\.\(.*\)'` + break;; + esac +done +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +{ { echo "$as_me:$LINENO: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&5 +echo "$as_me: error: cannot compute suffix of object files: cannot compile +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +rm -f conftest.$ac_cv_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_objext" >&5 +echo "${ECHO_T}$ac_cv_objext" >&6 +OBJEXT=$ac_cv_objext +ac_objext=$OBJEXT +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cc_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std1 is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std1. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +#include +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +echo "$as_me:$LINENO: checking how to run the C preprocessor" >&5 +echo $ECHO_N "checking how to run the C preprocessor... $ECHO_C" >&6 +# On Suns, sometimes $CPP names a directory. +if test -n "$CPP" && test -d "$CPP"; then + CPP= +fi +if test -z "$CPP"; then + if test "${ac_cv_prog_CPP+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # Double quotes because CPP needs to be expanded + for CPP in "$CC -E" "$CC -E -traditional-cpp" "/lib/cpp" + do + ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + break +fi + + done + ac_cv_prog_CPP=$CPP + +fi + CPP=$ac_cv_prog_CPP +else + ac_cv_prog_CPP=$CPP +fi +echo "$as_me:$LINENO: result: $CPP" >&5 +echo "${ECHO_T}$CPP" >&6 +ac_preproc_ok=false +for ac_c_preproc_warn_flag in '' yes +do + # Use a header file that comes with gcc, so configuring glibc + # with a fresh cross-compiler works. + # Prefer to if __STDC__ is defined, since + # exists even on freestanding compilers. + # On the NeXT, cc -E runs the code through the compiler's parser, + # not just through cpp. "Syntax error" is here to catch this case. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __STDC__ +# include +#else +# include +#endif + Syntax error +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Broken: fails on valid input. +continue +fi +rm -f conftest.err conftest.$ac_ext + + # OK, works on sane cases. Now check whether non-existent headers + # can be detected and how. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + # Broken: success on invalid input. +continue +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + # Passes both tests. +ac_preproc_ok=: +break +fi +rm -f conftest.err conftest.$ac_ext + +done +# Because of `break', _AC_PREPROC_IFELSE's cleaning code was skipped. +rm -f conftest.err conftest.$ac_ext +if $ac_preproc_ok; then + : +else + { { echo "$as_me:$LINENO: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&5 +echo "$as_me: error: C preprocessor \"$CPP\" fails sanity check +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + + +echo "$as_me:$LINENO: checking for egrep" >&5 +echo $ECHO_N "checking for egrep... $ECHO_C" >&6 +if test "${ac_cv_prog_egrep+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if echo a | (grep -E '(a|b)') >/dev/null 2>&1 + then ac_cv_prog_egrep='grep -E' + else ac_cv_prog_egrep='egrep' + fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_egrep" >&5 +echo "${ECHO_T}$ac_cv_prog_egrep" >&6 + EGREP=$ac_cv_prog_egrep + + + +echo "$as_me:$LINENO: checking for AIX" >&5 +echo $ECHO_N "checking for AIX... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef _AIX + yes +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "yes" >/dev/null 2>&1; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +cat >>confdefs.h <<\_ACEOF +#define _ALL_SOURCE 1 +_ACEOF + +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest* + + +echo "$as_me:$LINENO: checking for ANSI C header files" >&5 +echo $ECHO_N "checking for ANSI C header files... $ECHO_C" >&6 +if test "${ac_cv_header_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdc=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +if test $ac_cv_header_stdc = yes; then + # SunOS 4.x string.h does not declare mem*, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "memchr" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # ISC 2.0.2 stdlib.h does not declare free, contrary to ANSI. + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "free" >/dev/null 2>&1; then + : +else + ac_cv_header_stdc=no +fi +rm -f conftest* + +fi + +if test $ac_cv_header_stdc = yes; then + # /bin/cc in Irix-4.0.5 gets non-ANSI ctype macros unless using -ansi. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#if ((' ' & 0x0FF) == 0x020) +# define ISLOWER(c) ('a' <= (c) && (c) <= 'z') +# define TOUPPER(c) (ISLOWER(c) ? 'A' + ((c) - 'a') : (c)) +#else +# define ISLOWER(c) \ + (('a' <= (c) && (c) <= 'i') \ + || ('j' <= (c) && (c) <= 'r') \ + || ('s' <= (c) && (c) <= 'z')) +# define TOUPPER(c) (ISLOWER(c) ? ((c) | 0x40) : (c)) +#endif + +#define XOR(e, f) (((e) && !(f)) || (!(e) && (f))) +int +main () +{ + int i; + for (i = 0; i < 256; i++) + if (XOR (islower (i), ISLOWER (i)) + || toupper (i) != TOUPPER (i)) + exit(2); + exit (0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_header_stdc=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdc" >&5 +echo "${ECHO_T}$ac_cv_header_stdc" >&6 +if test $ac_cv_header_stdc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STDC_HEADERS 1 +_ACEOF + +fi + +# On IRIX 5.3, sys/types and inttypes.h are conflicting. + + + + + + + + + +for ac_header in sys/types.h sys/stat.h stdlib.h string.h memory.h strings.h \ + inttypes.h stdint.h unistd.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +if test "${ac_cv_header_minix_config_h+set}" = set; then + echo "$as_me:$LINENO: checking for minix/config.h" >&5 +echo $ECHO_N "checking for minix/config.h... $ECHO_C" >&6 +if test "${ac_cv_header_minix_config_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5 +echo "${ECHO_T}$ac_cv_header_minix_config_h" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking minix/config.h usability" >&5 +echo $ECHO_N "checking minix/config.h usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking minix/config.h presence" >&5 +echo $ECHO_N "checking minix/config.h presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: minix/config.h: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: minix/config.h: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: minix/config.h: present but cannot be compiled" >&5 +echo "$as_me: WARNING: minix/config.h: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: minix/config.h: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: minix/config.h: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: minix/config.h: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: minix/config.h: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: minix/config.h: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: minix/config.h: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: minix/config.h: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: minix/config.h: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: minix/config.h: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## -------------------------------- ## +## Report this to bug-bison@gnu.org ## +## -------------------------------- ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for minix/config.h" >&5 +echo $ECHO_N "checking for minix/config.h... $ECHO_C" >&6 +if test "${ac_cv_header_minix_config_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_header_minix_config_h=$ac_header_preproc +fi +echo "$as_me:$LINENO: result: $ac_cv_header_minix_config_h" >&5 +echo "${ECHO_T}$ac_cv_header_minix_config_h" >&6 + +fi +if test $ac_cv_header_minix_config_h = yes; then + MINIX=yes +else + MINIX= +fi + + +if test "$MINIX" = yes; then + +cat >>confdefs.h <<\_ACEOF +#define _POSIX_SOURCE 1 +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define _POSIX_1_SOURCE 2 +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define _MINIX 1 +_ACEOF + +fi + + + + + + + + + + + + cat >>confdefs.h <<\_ACEOF +#define __EXTENSIONS__ 1 +_ACEOF + + + +# Checks for the compiler. +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cc_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std1 is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std1. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +#include +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}gcc", so it can be a program name with args. +set dummy ${ac_tool_prefix}gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "gcc", so it can be a program name with args. +set dummy gcc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="gcc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}cc", so it can be a program name with args. +set dummy ${ac_tool_prefix}cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="${ac_tool_prefix}cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_CC"; then + ac_ct_CC=$CC + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + CC=$ac_ct_CC +else + CC="$ac_cv_prog_CC" +fi + +fi +if test -z "$CC"; then + # Extract the first word of "cc", so it can be a program name with args. +set dummy cc; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else + ac_prog_rejected=no +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + if test "$as_dir/$ac_word$ac_exec_ext" = "/usr/ucb/cc"; then + ac_prog_rejected=yes + continue + fi + ac_cv_prog_CC="cc" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +if test $ac_prog_rejected = yes; then + # We found a bogon in the path, so make sure we never use it. + set dummy $ac_cv_prog_CC + shift + if test $# != 0; then + # We chose a different compiler from the bogus one. + # However, it has the same basename, so the bogon will be chosen + # first if we set CC to just the basename; use the full file name. + shift + ac_cv_prog_CC="$as_dir/$ac_word${1+' '}$@" + fi +fi +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$CC"; then + if test -n "$ac_tool_prefix"; then + for ac_prog in cl + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CC"; then + ac_cv_prog_CC="$CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CC="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CC=$ac_cv_prog_CC +if test -n "$CC"; then + echo "$as_me:$LINENO: result: $CC" >&5 +echo "${ECHO_T}$CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CC" && break + done +fi +if test -z "$CC"; then + ac_ct_CC=$CC + for ac_prog in cl +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CC"; then + ac_cv_prog_ac_ct_CC="$ac_ct_CC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CC=$ac_cv_prog_ac_ct_CC +if test -n "$ac_ct_CC"; then + echo "$as_me:$LINENO: result: $ac_ct_CC" >&5 +echo "${ECHO_T}$ac_ct_CC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CC" && break +done + + CC=$ac_ct_CC +fi + +fi + + +test -z "$CC" && { { echo "$as_me:$LINENO: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&5 +echo "$as_me: error: no acceptable C compiler found in \$PATH +See \`config.log' for more details." >&2;} + { (exit 1); exit 1; }; } + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +echo "$as_me:$LINENO: checking whether we are using the GNU C compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C compiler... $ECHO_C" >&6 +if test "${ac_cv_c_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_c_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_c_compiler_gnu" >&6 +GCC=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CFLAGS=${CFLAGS+set} +ac_save_CFLAGS=$CFLAGS +CFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CC accepts -g" >&5 +echo $ECHO_N "checking whether $CC accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cc_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cc_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_g" >&6 +if test "$ac_test_CFLAGS" = set; then + CFLAGS=$ac_save_CFLAGS +elif test $ac_cv_prog_cc_g = yes; then + if test "$GCC" = yes; then + CFLAGS="-g -O2" + else + CFLAGS="-g" + fi +else + if test "$GCC" = yes; then + CFLAGS="-O2" + else + CFLAGS= + fi +fi +echo "$as_me:$LINENO: checking for $CC option to accept ANSI C" >&5 +echo $ECHO_N "checking for $CC option to accept ANSI C... $ECHO_C" >&6 +if test "${ac_cv_prog_cc_stdc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_cc_stdc=no +ac_save_CC=$CC +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#include +#include +/* Most of the following tests are stolen from RCS 5.7's src/conf.sh. */ +struct buf { int x; }; +FILE * (*rcsopen) (struct buf *, struct stat *, int); +static char *e (p, i) + char **p; + int i; +{ + return p[i]; +} +static char *f (char * (*g) (char **, int), char **p, ...) +{ + char *s; + va_list v; + va_start (v,p); + s = g (p, va_arg (v,int)); + va_end (v); + return s; +} + +/* OSF 4.0 Compaq cc is some sort of almost-ANSI by default. It has + function prototypes and stuff, but not '\xHH' hex character constants. + These don't provoke an error unfortunately, instead are silently treated + as 'x'. The following induces an error, until -std1 is added to get + proper ANSI mode. Curiously '\x00'!='x' always comes out true, for an + array size at least. It's necessary to write '\x00'==0 to get something + that's true only with -std1. */ +int osf4_cc_array ['\x00' == 0 ? 1 : -1]; + +int test (int i, double x); +struct s1 {int (*f) (int a);}; +struct s2 {int (*f) (double a);}; +int pairnames (int, char **, FILE *(*)(struct buf *, struct stat *, int), int, int); +int argc; +char **argv; +int +main () +{ +return f (e, argv, 0) != argv[0] || f (e, argv, 1) != argv[1]; + ; + return 0; +} +_ACEOF +# Don't try gcc -ansi; that turns off useful extensions and +# breaks some systems' header files. +# AIX -qlanglvl=ansi +# Ultrix and OSF/1 -std1 +# HP-UX 10.20 and later -Ae +# HP-UX older versions -Aa -D_HPUX_SOURCE +# SVR4 -Xc -D__EXTENSIONS__ +for ac_arg in "" -qlanglvl=ansi -std1 -Ae "-Aa -D_HPUX_SOURCE" "-Xc -D__EXTENSIONS__" +do + CC="$ac_save_CC $ac_arg" + rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cc_stdc=$ac_arg +break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext +done +rm -f conftest.$ac_ext conftest.$ac_objext +CC=$ac_save_CC + +fi + +case "x$ac_cv_prog_cc_stdc" in + x|xno) + echo "$as_me:$LINENO: result: none needed" >&5 +echo "${ECHO_T}none needed" >&6 ;; + *) + echo "$as_me:$LINENO: result: $ac_cv_prog_cc_stdc" >&5 +echo "${ECHO_T}$ac_cv_prog_cc_stdc" >&6 + CC="$CC $ac_cv_prog_cc_stdc" ;; +esac + +# Some people use a C++ compiler to compile C. Since we use `exit', +# in C++ we need to declare it. In case someone uses the same compiler +# for both compiling C and C++ we need to have the C++ compiler decide +# the declaration of exit, since it's the most demanding environment. +cat >conftest.$ac_ext <<_ACEOF +#ifndef __cplusplus + choke me +#endif +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +#include +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CC" am_compiler_list= + +echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 +if test "${am_cv_CC_dependencies_compiler_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CC_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CC_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CC_dependencies_compiler_type=none +fi + +fi +echo "$as_me:$LINENO: result: $am_cv_CC_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CC_dependencies_compiler_type" >&6 +CCDEPMODE=depmode=$am_cv_CC_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CC_dependencies_compiler_type" = gcc3; then + am__fastdepCC_TRUE= + am__fastdepCC_FALSE='#' +else + am__fastdepCC_TRUE='#' + am__fastdepCC_FALSE= +fi + + + +am_cv_prog_cc_stdc=$ac_cv_prog_cc_stdc + +# Check whether --enable-gcc-warnings or --disable-gcc-warnings was given. +if test "${enable_gcc_warnings+set}" = set; then + enableval="$enable_gcc_warnings" + case "${enableval}" in + yes|no) ;; + *) { { echo "$as_me:$LINENO: error: bad value ${enableval} for gcc-warnings option" >&5 +echo "$as_me: error: bad value ${enableval} for gcc-warnings option" >&2;} + { (exit 1); exit 1; }; } ;; + esac +else + enableval=no +fi; +if test "${enableval}" = yes; then + echo "$as_me:$LINENO: checking whether compiler accepts -Werror" >&5 +echo $ECHO_N "checking whether compiler accepts -Werror... $ECHO_C" >&6 + +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -Werror" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +int x; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + WARNING_CFLAGS="$WARNING_CFLAGS -Werror" +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +CFLAGS="$ac_save_CFLAGS" + WERROR_CFLAGS=$WARNING_CFLAGS + + WARNING_CFLAGS= + echo "$as_me:$LINENO: checking whether compiler accepts -W" >&5 +echo $ECHO_N "checking whether compiler accepts -W... $ECHO_C" >&6 + +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -W" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +int x; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + WARNING_CFLAGS="$WARNING_CFLAGS -W" +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +CFLAGS="$ac_save_CFLAGS" + echo "$as_me:$LINENO: checking whether compiler accepts -Wall" >&5 +echo $ECHO_N "checking whether compiler accepts -Wall... $ECHO_C" >&6 + +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -Wall" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +int x; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + WARNING_CFLAGS="$WARNING_CFLAGS -Wall" +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +CFLAGS="$ac_save_CFLAGS" + echo "$as_me:$LINENO: checking whether compiler accepts -Wcast-align" >&5 +echo $ECHO_N "checking whether compiler accepts -Wcast-align... $ECHO_C" >&6 + +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -Wcast-align" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +int x; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + WARNING_CFLAGS="$WARNING_CFLAGS -Wcast-align" +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +CFLAGS="$ac_save_CFLAGS" + echo "$as_me:$LINENO: checking whether compiler accepts -Wcast-qual" >&5 +echo $ECHO_N "checking whether compiler accepts -Wcast-qual... $ECHO_C" >&6 + +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -Wcast-qual" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +int x; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + WARNING_CFLAGS="$WARNING_CFLAGS -Wcast-qual" +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +CFLAGS="$ac_save_CFLAGS" + echo "$as_me:$LINENO: checking whether compiler accepts -Wformat" >&5 +echo $ECHO_N "checking whether compiler accepts -Wformat... $ECHO_C" >&6 + +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -Wformat" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +int x; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + WARNING_CFLAGS="$WARNING_CFLAGS -Wformat" +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +CFLAGS="$ac_save_CFLAGS" + echo "$as_me:$LINENO: checking whether compiler accepts -Wwrite-strings" >&5 +echo $ECHO_N "checking whether compiler accepts -Wwrite-strings... $ECHO_C" >&6 + +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -Wwrite-strings" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +int x; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + WARNING_CFLAGS="$WARNING_CFLAGS -Wwrite-strings" +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +CFLAGS="$ac_save_CFLAGS" + WARNING_CXXFLAGS=$WARNING_CFLAGS + + # The following warnings are not suitable for C++. + echo "$as_me:$LINENO: checking whether compiler accepts -Wbad-function-cast" >&5 +echo $ECHO_N "checking whether compiler accepts -Wbad-function-cast... $ECHO_C" >&6 + +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -Wbad-function-cast" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +int x; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + WARNING_CFLAGS="$WARNING_CFLAGS -Wbad-function-cast" +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +CFLAGS="$ac_save_CFLAGS" + echo "$as_me:$LINENO: checking whether compiler accepts -Wmissing-declarations" >&5 +echo $ECHO_N "checking whether compiler accepts -Wmissing-declarations... $ECHO_C" >&6 + +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -Wmissing-declarations" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +int x; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + WARNING_CFLAGS="$WARNING_CFLAGS -Wmissing-declarations" +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +CFLAGS="$ac_save_CFLAGS" + echo "$as_me:$LINENO: checking whether compiler accepts -Wmissing-prototypes" >&5 +echo $ECHO_N "checking whether compiler accepts -Wmissing-prototypes... $ECHO_C" >&6 + +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -Wmissing-prototypes" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +int x; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + WARNING_CFLAGS="$WARNING_CFLAGS -Wmissing-prototypes" +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +CFLAGS="$ac_save_CFLAGS" + echo "$as_me:$LINENO: checking whether compiler accepts -Wnested-externs" >&5 +echo $ECHO_N "checking whether compiler accepts -Wnested-externs... $ECHO_C" >&6 + +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -Wnested-externs" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +int x; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + WARNING_CFLAGS="$WARNING_CFLAGS -Wnested-externs" +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +CFLAGS="$ac_save_CFLAGS" + echo "$as_me:$LINENO: checking whether compiler accepts -Wshadow" >&5 +echo $ECHO_N "checking whether compiler accepts -Wshadow... $ECHO_C" >&6 + +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -Wshadow" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +int x; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + WARNING_CFLAGS="$WARNING_CFLAGS -Wshadow" +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +CFLAGS="$ac_save_CFLAGS" + echo "$as_me:$LINENO: checking whether compiler accepts -Wstrict-prototypes" >&5 +echo $ECHO_N "checking whether compiler accepts -Wstrict-prototypes... $ECHO_C" >&6 + +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS -Wstrict-prototypes" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +int x; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + WARNING_CFLAGS="$WARNING_CFLAGS -Wstrict-prototypes" +echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +CFLAGS="$ac_save_CFLAGS" + +cat >>confdefs.h <<\_ACEOF +#define lint 1 +_ACEOF + +fi + +# Check whether --enable-yacc or --disable-yacc was given. +if test "${enable_yacc+set}" = set; then + enableval="$enable_yacc" + +else + enable_yacc=yes +fi; +case $enable_yacc in +yes) + YACC_SCRIPT=yacc + YACC_LIBRARY=liby.a;; +*) + YACC_SCRIPT= + YACC_LIBRARY=;; +esac + + + +# Checks for programs. +for ac_prog in flex lex +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_LEX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$LEX"; then + ac_cv_prog_LEX="$LEX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_LEX="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +LEX=$ac_cv_prog_LEX +if test -n "$LEX"; then + echo "$as_me:$LINENO: result: $LEX" >&5 +echo "${ECHO_T}$LEX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$LEX" && break +done +test -n "$LEX" || LEX=":" + +if test -z "$LEXLIB" +then + echo "$as_me:$LINENO: checking for yywrap in -lfl" >&5 +echo $ECHO_N "checking for yywrap in -lfl... $ECHO_C" >&6 +if test "${ac_cv_lib_fl_yywrap+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lfl $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char yywrap (); +int +main () +{ +yywrap (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_fl_yywrap=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_fl_yywrap=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_fl_yywrap" >&5 +echo "${ECHO_T}$ac_cv_lib_fl_yywrap" >&6 +if test $ac_cv_lib_fl_yywrap = yes; then + LEXLIB="-lfl" +else + echo "$as_me:$LINENO: checking for yywrap in -ll" >&5 +echo $ECHO_N "checking for yywrap in -ll... $ECHO_C" >&6 +if test "${ac_cv_lib_l_yywrap+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-ll $LIBS" +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char yywrap (); +int +main () +{ +yywrap (); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_l_yywrap=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_l_yywrap=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_check_lib_save_LIBS +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_l_yywrap" >&5 +echo "${ECHO_T}$ac_cv_lib_l_yywrap" >&6 +if test $ac_cv_lib_l_yywrap = yes; then + LEXLIB="-ll" +fi + +fi + +fi + +if test "x$LEX" != "x:"; then + echo "$as_me:$LINENO: checking lex output file root" >&5 +echo $ECHO_N "checking lex output file root... $ECHO_C" >&6 +if test "${ac_cv_prog_lex_root+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # The minimal lex program is just a single line: %%. But some broken lexes +# (Solaris, I think it was) want two %% lines, so accommodate them. +cat >conftest.l <<_ACEOF +%% +%% +_ACEOF +{ (eval echo "$as_me:$LINENO: \"$LEX conftest.l\"") >&5 + (eval $LEX conftest.l) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +if test -f lex.yy.c; then + ac_cv_prog_lex_root=lex.yy +elif test -f lexyy.c; then + ac_cv_prog_lex_root=lexyy +else + { { echo "$as_me:$LINENO: error: cannot find output from $LEX; giving up" >&5 +echo "$as_me: error: cannot find output from $LEX; giving up" >&2;} + { (exit 1); exit 1; }; } +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_lex_root" >&5 +echo "${ECHO_T}$ac_cv_prog_lex_root" >&6 +rm -f conftest.l +LEX_OUTPUT_ROOT=$ac_cv_prog_lex_root + +echo "$as_me:$LINENO: checking whether yytext is a pointer" >&5 +echo $ECHO_N "checking whether yytext is a pointer... $ECHO_C" >&6 +if test "${ac_cv_prog_lex_yytext_pointer+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # POSIX says lex can declare yytext either as a pointer or an array; the +# default is implementation-dependent. Figure out which it is, since +# not all implementations provide the %pointer and %array declarations. +ac_cv_prog_lex_yytext_pointer=no +echo 'extern char *yytext;' >>$LEX_OUTPUT_ROOT.c +ac_save_LIBS=$LIBS +LIBS="$LIBS $LEXLIB" +cat >conftest.$ac_ext <<_ACEOF +`cat $LEX_OUTPUT_ROOT.c` +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_lex_yytext_pointer=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +LIBS=$ac_save_LIBS +rm -f "${LEX_OUTPUT_ROOT}.c" + +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_lex_yytext_pointer" >&5 +echo "${ECHO_T}$ac_cv_prog_lex_yytext_pointer" >&6 +if test $ac_cv_prog_lex_yytext_pointer = yes; then + +cat >>confdefs.h <<\_ACEOF +#define YYTEXT_POINTER 1 +_ACEOF + +fi + +fi +for ac_prog in 'bison -y' byacc +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_YACC+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$YACC"; then + ac_cv_prog_YACC="$YACC" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_YACC="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +YACC=$ac_cv_prog_YACC +if test -n "$YACC"; then + echo "$as_me:$LINENO: result: $YACC" >&5 +echo "${ECHO_T}$YACC" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$YACC" && break +done +test -n "$YACC" || YACC="yacc" + +if test -n "$ac_tool_prefix"; then + # Extract the first word of "${ac_tool_prefix}ranlib", so it can be a program name with args. +set dummy ${ac_tool_prefix}ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$RANLIB"; then + ac_cv_prog_RANLIB="$RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_RANLIB="${ac_tool_prefix}ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +RANLIB=$ac_cv_prog_RANLIB +if test -n "$RANLIB"; then + echo "$as_me:$LINENO: result: $RANLIB" >&5 +echo "${ECHO_T}$RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + +fi +if test -z "$ac_cv_prog_RANLIB"; then + ac_ct_RANLIB=$RANLIB + # Extract the first word of "ranlib", so it can be a program name with args. +set dummy ranlib; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_RANLIB+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_RANLIB"; then + ac_cv_prog_ac_ct_RANLIB="$ac_ct_RANLIB" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_RANLIB="ranlib" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_prog_ac_ct_RANLIB" && ac_cv_prog_ac_ct_RANLIB=":" +fi +fi +ac_ct_RANLIB=$ac_cv_prog_ac_ct_RANLIB +if test -n "$ac_ct_RANLIB"; then + echo "$as_me:$LINENO: result: $ac_ct_RANLIB" >&5 +echo "${ECHO_T}$ac_ct_RANLIB" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + RANLIB=$ac_ct_RANLIB +else + RANLIB="$ac_cv_prog_RANLIB" +fi + +for ac_prog in gm4 gnum4 m4 +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_M4+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $M4 in + [\\/]* | ?:[\\/]*) + ac_cv_path_M4="$M4" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_M4="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + ;; +esac +fi +M4=$ac_cv_path_M4 + +if test -n "$M4"; then + echo "$as_me:$LINENO: result: $M4" >&5 +echo "${ECHO_T}$M4" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$M4" && break +done +test -n "$M4" || M4="m4" + +echo "$as_me:$LINENO: checking whether m4 supports frozen files" >&5 +echo $ECHO_N "checking whether m4 supports frozen files... $ECHO_C" >&6 +if test "${ac_cv_prog_gnu_m4+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_prog_gnu_m4=no +if test x"$M4" != x; then + case `$M4 --help < /dev/null 2>&1` in + *reload-state*) ac_cv_prog_gnu_m4=yes ;; + esac +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_gnu_m4" >&5 +echo "${ECHO_T}$ac_cv_prog_gnu_m4" >&6 +if test x"$ac_cv_prog_gnu_m4" != xyes; then + { { echo "$as_me:$LINENO: error: GNU M4 1.4 is required" >&5 +echo "$as_me: error: GNU M4 1.4 is required" >&2;} + { (exit 1); exit 1; }; } +fi + +cat >>confdefs.h <<_ACEOF +#define M4 "$M4" +_ACEOF + + +# Checks for header files. + + + + + +for ac_header in $gl_header_list +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## -------------------------------- ## +## Report this to bug-bison@gnu.org ## +## -------------------------------- ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + + + + + + : + + + + + +echo "$as_me:$LINENO: checking for stdbool.h that conforms to C99" >&5 +echo $ECHO_N "checking for stdbool.h that conforms to C99... $ECHO_C" >&6 +if test "${ac_cv_header_stdbool_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + + #include + #ifndef bool + "error: bool is not defined" + #endif + #ifndef false + "error: false is not defined" + #endif + #if false + "error: false is not 0" + #endif + #ifndef true + "error: false is not defined" + #endif + #if true != 1 + "error: true is not 1" + #endif + #ifndef __bool_true_false_are_defined + "error: __bool_true_false_are_defined is not defined" + #endif + + struct s { _Bool s: 1; _Bool t; } s; + + char a[true == 1 ? 1 : -1]; + char b[false == 0 ? 1 : -1]; + char c[__bool_true_false_are_defined == 1 ? 1 : -1]; + char d[(bool) -0.5 == true ? 1 : -1]; + bool e = &s; + char f[(_Bool) -0.0 == false ? 1 : -1]; + char g[true]; + char h[sizeof (_Bool)]; + char i[sizeof s.t]; + +int +main () +{ + return !a + !b + !c + !d + !e + !f + !g + !h + !i; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_stdbool_h=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_stdbool_h=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_header_stdbool_h" >&5 +echo "${ECHO_T}$ac_cv_header_stdbool_h" >&6 + echo "$as_me:$LINENO: checking for _Bool" >&5 +echo $ECHO_N "checking for _Bool... $ECHO_C" >&6 +if test "${ac_cv_type__Bool+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if ((_Bool *) 0) + return 0; +if (sizeof (_Bool)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type__Bool=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type__Bool=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type__Bool" >&5 +echo "${ECHO_T}$ac_cv_type__Bool" >&6 +if test $ac_cv_type__Bool = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE__BOOL 1 +_ACEOF + + +fi + + if test $ac_cv_header_stdbool_h = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_STDBOOL_H 1 +_ACEOF + + fi + + + + # Define two additional variables used in the Makefile substitution. + + if test "$ac_cv_header_stdbool_h" = yes; then + STDBOOL_H='' + else + STDBOOL_H='stdbool.h' + fi + + + if test "$ac_cv_type__Bool" = yes; then + HAVE__BOOL=1 + else + HAVE__BOOL=0 + fi + + + +# Checks for compiler characteristics. +echo "$as_me:$LINENO: checking for inline" >&5 +echo $ECHO_N "checking for inline... $ECHO_C" >&6 +if test "${ac_cv_c_inline+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_c_inline=no +for ac_kw in inline __inline__ __inline; do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifndef __cplusplus +typedef int foo_t; +static $ac_kw foo_t static_foo () {return 0; } +$ac_kw foo_t foo () {return 0; } +#endif + +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_inline=$ac_kw; break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done + +fi +echo "$as_me:$LINENO: result: $ac_cv_c_inline" >&5 +echo "${ECHO_T}$ac_cv_c_inline" >&6 + + +case $ac_cv_c_inline in + inline | yes) ;; + *) + case $ac_cv_c_inline in + no) ac_val=;; + *) ac_val=$ac_cv_c_inline;; + esac + cat >>confdefs.h <<_ACEOF +#ifndef __cplusplus +#define inline $ac_val +#endif +_ACEOF + ;; +esac + + +# Checks for types. +echo "$as_me:$LINENO: checking for uintptr_t" >&5 +echo $ECHO_N "checking for uintptr_t... $ECHO_C" >&6 +if test "${ac_cv_type_uintptr_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if ((uintptr_t *) 0) + return 0; +if (sizeof (uintptr_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_uintptr_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_uintptr_t=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_uintptr_t" >&5 +echo "${ECHO_T}$ac_cv_type_uintptr_t" >&6 +if test $ac_cv_type_uintptr_t = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_UINTPTR_T 1 +_ACEOF + + +fi + + +# Checks for library functions. + + + + + +for ac_func in $gl_func_list +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + + + + + + : + + + + + +echo "$as_me:$LINENO: checking if malloc debugging is wanted" >&5 +echo $ECHO_N "checking if malloc debugging is wanted... $ECHO_C" >&6 + +# Check whether --with-dmalloc or --without-dmalloc was given. +if test "${with_dmalloc+set}" = set; then + withval="$with_dmalloc" + if test "$withval" = yes; then + echo "$as_me:$LINENO: result: yes" >&5 +echo "${ECHO_T}yes" >&6 + +cat >>confdefs.h <<\_ACEOF +#define WITH_DMALLOC 1 +_ACEOF + + LIBS="$LIBS -ldmalloc" + LDFLAGS="$LDFLAGS -g" +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi; + + + echo "$as_me:$LINENO: checking for pid_t" >&5 +echo $ECHO_N "checking for pid_t... $ECHO_C" >&6 +if test "${ac_cv_type_pid_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +if ((pid_t *) 0) + return 0; +if (sizeof (pid_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_pid_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_pid_t=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_pid_t" >&5 +echo "${ECHO_T}$ac_cv_type_pid_t" >&6 +if test $ac_cv_type_pid_t = yes; then + : +else + +cat >>confdefs.h <<_ACEOF +#define pid_t int +_ACEOF + +fi + + +for ac_header in fcntl.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## -------------------------------- ## +## Report this to bug-bison@gnu.org ## +## -------------------------------- ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + echo "$as_me:$LINENO: checking for sys/wait.h that is POSIX.1 compatible" >&5 +echo $ECHO_N "checking for sys/wait.h that is POSIX.1 compatible... $ECHO_C" >&6 +if test "${ac_cv_header_sys_wait_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +#ifndef WEXITSTATUS +# define WEXITSTATUS(stat_val) ((unsigned)(stat_val) >> 8) +#endif +#ifndef WIFEXITED +# define WIFEXITED(stat_val) (((stat_val) & 255) == 0) +#endif + +int +main () +{ + int s; + wait (&s); + s = WIFEXITED (s) ? WEXITSTATUS (s) : 1; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_header_sys_wait_h=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_header_sys_wait_h=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_header_sys_wait_h" >&5 +echo "${ECHO_T}$ac_cv_header_sys_wait_h" >&6 +if test $ac_cv_header_sys_wait_h = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_SYS_WAIT_H 1 +_ACEOF + +fi + + + +for ac_func in dup2 waitpid +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + +for ac_header in unistd.h vfork.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## -------------------------------- ## +## Report this to bug-bison@gnu.org ## +## -------------------------------- ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + + +for ac_func in fork vfork +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +if test "x$ac_cv_func_fork" = xyes; then + echo "$as_me:$LINENO: checking for working fork" >&5 +echo $ECHO_N "checking for working fork... $ECHO_C" >&6 +if test "${ac_cv_func_fork_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_fork_works=cross +else + cat >conftest.$ac_ext <<_ACEOF +/* By Ruediger Kuhlmann. */ + #include + #if HAVE_UNISTD_H + # include + #endif + /* Some systems only have a dummy stub for fork() */ + int main () + { + if (fork() < 0) + exit (1); + exit (0); + } +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_fork_works=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_fork_works=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_func_fork_works" >&5 +echo "${ECHO_T}$ac_cv_func_fork_works" >&6 + +else + ac_cv_func_fork_works=$ac_cv_func_fork +fi +if test "x$ac_cv_func_fork_works" = xcross; then + case $host in + *-*-amigaos* | *-*-msdosdjgpp*) + # Override, as these systems have only a dummy fork() stub + ac_cv_func_fork_works=no + ;; + *) + ac_cv_func_fork_works=yes + ;; + esac + { echo "$as_me:$LINENO: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&5 +echo "$as_me: WARNING: result $ac_cv_func_fork_works guessed because of cross compilation" >&2;} +fi +ac_cv_func_vfork_works=$ac_cv_func_vfork +if test "x$ac_cv_func_vfork" = xyes; then + echo "$as_me:$LINENO: checking for working vfork" >&5 +echo $ECHO_N "checking for working vfork... $ECHO_C" >&6 +if test "${ac_cv_func_vfork_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_vfork_works=cross +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Thanks to Paul Eggert for this test. */ +#include +#include +#include +#include +#include +#if HAVE_UNISTD_H +# include +#endif +#if HAVE_VFORK_H +# include +#endif +/* On some sparc systems, changes by the child to local and incoming + argument registers are propagated back to the parent. The compiler + is told about this with #include , but some compilers + (e.g. gcc -O) don't grok . Test for this by using a + static variable whose address is put into a register that is + clobbered by the vfork. */ +static void +#ifdef __cplusplus +sparc_address_test (int arg) +# else +sparc_address_test (arg) int arg; +#endif +{ + static pid_t child; + if (!child) { + child = vfork (); + if (child < 0) { + perror ("vfork"); + _exit(2); + } + if (!child) { + arg = getpid(); + write(-1, "", 0); + _exit (arg); + } + } +} + +int +main () +{ + pid_t parent = getpid (); + pid_t child; + + sparc_address_test (0); + + child = vfork (); + + if (child == 0) { + /* Here is another test for sparc vfork register problems. This + test uses lots of local variables, at least as many local + variables as main has allocated so far including compiler + temporaries. 4 locals are enough for gcc 1.40.3 on a Solaris + 4.1.3 sparc, but we use 8 to be safe. A buggy compiler should + reuse the register of parent for one of the local variables, + since it will think that parent can't possibly be used any more + in this routine. Assigning to the local variable will thus + munge parent in the parent process. */ + pid_t + p = getpid(), p1 = getpid(), p2 = getpid(), p3 = getpid(), + p4 = getpid(), p5 = getpid(), p6 = getpid(), p7 = getpid(); + /* Convince the compiler that p..p7 are live; otherwise, it might + use the same hardware register for all 8 local variables. */ + if (p != p1 || p != p2 || p != p3 || p != p4 + || p != p5 || p != p6 || p != p7) + _exit(1); + + /* On some systems (e.g. IRIX 3.3), vfork doesn't separate parent + from child file descriptors. If the child closes a descriptor + before it execs or exits, this munges the parent's descriptor + as well. Test for this by closing stdout in the child. */ + _exit(close(fileno(stdout)) != 0); + } else { + int status; + struct stat st; + + while (wait(&status) != child) + ; + exit( + /* Was there some problem with vforking? */ + child < 0 + + /* Did the child fail? (This shouldn't happen.) */ + || status + + /* Did the vfork/compiler bug occur? */ + || parent != getpid() + + /* Did the file descriptor bug occur? */ + || fstat(fileno(stdout), &st) != 0 + ); + } +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_vfork_works=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_vfork_works=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_func_vfork_works" >&5 +echo "${ECHO_T}$ac_cv_func_vfork_works" >&6 + +fi; +if test "x$ac_cv_func_fork_works" = xcross; then + ac_cv_func_vfork_works=$ac_cv_func_vfork + { echo "$as_me:$LINENO: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&5 +echo "$as_me: WARNING: result $ac_cv_func_vfork_works guessed because of cross compilation" >&2;} +fi + +if test "x$ac_cv_func_vfork_works" = xyes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_WORKING_VFORK 1 +_ACEOF + +else + +cat >>confdefs.h <<\_ACEOF +#define vfork fork +_ACEOF + +fi +if test "x$ac_cv_func_fork_works" = xyes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_WORKING_FORK 1 +_ACEOF + +fi + + + + +for ac_header in sys/time.h sys/times.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## -------------------------------- ## +## Report this to bug-bison@gnu.org ## +## -------------------------------- ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_header in sys/resource.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#if HAVE_SYS_TIME_H +# include +#endif +#ifdef HAVE_SYS_TIMES_H +# include +#endif + + +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_Header=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_Header=no" +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + + +for ac_func in times +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + +echo "$as_me:$LINENO: checking whether getrusage is declared" >&5 +echo $ECHO_N "checking whether getrusage is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_getrusage+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#if HAVE_SYS_TIME_H +# include +#endif +#if HAVE_SYS_TIMES_H +# include +#endif +#if HAVE_SYS_RESOURCE_H +# include +#endif + + +int +main () +{ +#ifndef getrusage + char *p = (char *) getrusage; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_getrusage=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_getrusage=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_getrusage" >&5 +echo "${ECHO_T}$ac_cv_have_decl_getrusage" >&6 +if test $ac_cv_have_decl_getrusage = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETRUSAGE 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETRUSAGE 0 +_ACEOF + + +fi +echo "$as_me:$LINENO: checking whether times is declared" >&5 +echo $ECHO_N "checking whether times is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_times+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#if HAVE_SYS_TIME_H +# include +#endif +#if HAVE_SYS_TIMES_H +# include +#endif +#if HAVE_SYS_RESOURCE_H +# include +#endif + + +int +main () +{ +#ifndef times + char *p = (char *) times; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_times=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_times=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_times" >&5 +echo "${ECHO_T}$ac_cv_have_decl_times" >&6 +if test $ac_cv_have_decl_times = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_TIMES 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_TIMES 0 +_ACEOF + + +fi +echo "$as_me:$LINENO: checking whether clock is declared" >&5 +echo $ECHO_N "checking whether clock is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_clock+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#if HAVE_SYS_TIME_H +# include +#endif +#if HAVE_SYS_TIMES_H +# include +#endif +#if HAVE_SYS_RESOURCE_H +# include +#endif + + +int +main () +{ +#ifndef clock + char *p = (char *) clock; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_clock=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_clock=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_clock" >&5 +echo "${ECHO_T}$ac_cv_have_decl_clock" >&6 +if test $ac_cv_have_decl_clock = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_CLOCK 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_CLOCK 0 +_ACEOF + + +fi +echo "$as_me:$LINENO: checking whether sysconf is declared" >&5 +echo $ECHO_N "checking whether sysconf is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_sysconf+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#if HAVE_SYS_TIME_H +# include +#endif +#if HAVE_SYS_TIMES_H +# include +#endif +#if HAVE_SYS_RESOURCE_H +# include +#endif + + +int +main () +{ +#ifndef sysconf + char *p = (char *) sysconf; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_sysconf=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_sysconf=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_sysconf" >&5 +echo "${ECHO_T}$ac_cv_have_decl_sysconf" >&6 +if test $ac_cv_have_decl_sysconf = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SYSCONF 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_SYSCONF 0 +_ACEOF + + +fi + + + +echo "$as_me:$LINENO: checking for clock_t" >&5 +echo $ECHO_N "checking for clock_t... $ECHO_C" >&6 +if test "${ac_cv_type_clock_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#if HAVE_SYS_TIME_H +# include +#endif +#if HAVE_SYS_TIMES_H +# include +#endif +#if HAVE_SYS_RESOURCE_H +# include +#endif + + +int +main () +{ +if ((clock_t *) 0) + return 0; +if (sizeof (clock_t)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_clock_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_clock_t=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_clock_t" >&5 +echo "${ECHO_T}$ac_cv_type_clock_t" >&6 +if test $ac_cv_type_clock_t = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_CLOCK_T 1 +_ACEOF + + +fi +echo "$as_me:$LINENO: checking for struct tms" >&5 +echo $ECHO_N "checking for struct tms... $ECHO_C" >&6 +if test "${ac_cv_type_struct_tms+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#if HAVE_SYS_TIME_H +# include +#endif +#if HAVE_SYS_TIMES_H +# include +#endif +#if HAVE_SYS_RESOURCE_H +# include +#endif + + +int +main () +{ +if ((struct tms *) 0) + return 0; +if (sizeof (struct tms)) + return 0; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_struct_tms=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_struct_tms=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_struct_tms" >&5 +echo "${ECHO_T}$ac_cv_type_struct_tms" >&6 +if test $ac_cv_type_struct_tms = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_STRUCT_TMS 1 +_ACEOF + + +fi + + + +# gnulib and gettext. +# The Ultrix 4.2 mips builtin alloca declared by alloca.h only works +# for constant arguments. Useless! +echo "$as_me:$LINENO: checking for working alloca.h" >&5 +echo $ECHO_N "checking for working alloca.h... $ECHO_C" >&6 +if test "${ac_cv_working_alloca_h+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +char *p = (char *) alloca (2 * sizeof (int)); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_working_alloca_h=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_working_alloca_h=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_working_alloca_h" >&5 +echo "${ECHO_T}$ac_cv_working_alloca_h" >&6 +if test $ac_cv_working_alloca_h = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_ALLOCA_H 1 +_ACEOF + +fi + +echo "$as_me:$LINENO: checking for alloca" >&5 +echo $ECHO_N "checking for alloca... $ECHO_C" >&6 +if test "${ac_cv_func_alloca_works+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#ifdef __GNUC__ +# define alloca __builtin_alloca +#else +# ifdef _MSC_VER +# include +# define alloca _alloca +# else +# if HAVE_ALLOCA_H +# include +# else +# ifdef _AIX + #pragma alloca +# else +# ifndef alloca /* predefined by HP cc +Olibcalls */ +char *alloca (); +# endif +# endif +# endif +# endif +#endif + +int +main () +{ +char *p = (char *) alloca (1); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_alloca_works=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_alloca_works=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_alloca_works" >&5 +echo "${ECHO_T}$ac_cv_func_alloca_works" >&6 + +if test $ac_cv_func_alloca_works = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_ALLOCA 1 +_ACEOF + +else + # The SVR3 libPW and SVR4 libucb both contain incompatible functions +# that cause trouble. Some versions do not even contain alloca or +# contain a buggy version. If you still want to use their alloca, +# use ar to extract alloca.o from them instead of compiling alloca.c. + +ALLOCA=alloca.$ac_objext + +cat >>confdefs.h <<\_ACEOF +#define C_ALLOCA 1 +_ACEOF + + +echo "$as_me:$LINENO: checking whether \`alloca.c' needs Cray hooks" >&5 +echo $ECHO_N "checking whether \`alloca.c' needs Cray hooks... $ECHO_C" >&6 +if test "${ac_cv_os_cray+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#if defined(CRAY) && ! defined(CRAY2) +webecray +#else +wenotbecray +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "webecray" >/dev/null 2>&1; then + ac_cv_os_cray=yes +else + ac_cv_os_cray=no +fi +rm -f conftest* + +fi +echo "$as_me:$LINENO: result: $ac_cv_os_cray" >&5 +echo "${ECHO_T}$ac_cv_os_cray" >&6 +if test $ac_cv_os_cray = yes; then + for ac_func in _getb67 GETB67 getb67; do + as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + +cat >>confdefs.h <<_ACEOF +#define CRAY_STACKSEG_END $ac_func +_ACEOF + + break +fi + + done +fi + +echo "$as_me:$LINENO: checking stack direction for C alloca" >&5 +echo $ECHO_N "checking stack direction for C alloca... $ECHO_C" >&6 +if test "${ac_cv_c_stack_direction+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_c_stack_direction=0 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +int +find_stack_direction () +{ + static char *addr = 0; + auto char dummy; + if (addr == 0) + { + addr = &dummy; + return find_stack_direction (); + } + else + return (&dummy > addr) ? 1 : -1; +} + +int +main () +{ + exit (find_stack_direction () < 0); +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_c_stack_direction=1 +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_c_stack_direction=-1 +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_c_stack_direction" >&5 +echo "${ECHO_T}$ac_cv_c_stack_direction" >&6 + +cat >>confdefs.h <<_ACEOF +#define STACK_DIRECTION $ac_cv_c_stack_direction +_ACEOF + + +fi + + + echo "$as_me:$LINENO: checking whether system is Windows or MSDOS" >&5 +echo $ECHO_N "checking whether system is Windows or MSDOS... $ECHO_C" >&6 +if test "${ac_cv_win_or_dos+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#if !defined _WIN32 && !defined __WIN32__ && !defined __MSDOS__ && !defined __CYGWIN__ +neither MSDOS nor Windows +#endif + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_win_or_dos=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_win_or_dos=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + +fi +echo "$as_me:$LINENO: result: $ac_cv_win_or_dos" >&5 +echo "${ECHO_T}$ac_cv_win_or_dos" >&6 + + if test x"$ac_cv_win_or_dos" = xyes; then + ac_fs_accepts_drive_letter_prefix=1 + ac_fs_backslash_is_file_name_separator=1 + else + ac_fs_accepts_drive_letter_prefix=0 + ac_fs_backslash_is_file_name_separator=0 + fi + + + + + +cat >>confdefs.h <<_ACEOF +#define FILESYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX $ac_fs_accepts_drive_letter_prefix +_ACEOF + + + + + + +cat >>confdefs.h <<_ACEOF +#define FILESYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR $ac_fs_backslash_is_file_name_separator +_ACEOF + + +echo "$as_me:$LINENO: checking whether strerror_r is declared" >&5 +echo $ECHO_N "checking whether strerror_r is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_strerror_r+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef strerror_r + char *p = (char *) strerror_r; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_strerror_r=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_strerror_r=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_strerror_r" >&5 +echo "${ECHO_T}$ac_cv_have_decl_strerror_r" >&6 +if test $ac_cv_have_decl_strerror_r = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRERROR_R 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRERROR_R 0 +_ACEOF + + +fi + + + +for ac_func in strerror_r +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + +echo "$as_me:$LINENO: checking whether strerror_r returns char *" >&5 +echo $ECHO_N "checking whether strerror_r returns char *... $ECHO_C" >&6 +if test "${ac_cv_func_strerror_r_char_p+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + ac_cv_func_strerror_r_char_p=no + if test $ac_cv_have_decl_strerror_r = yes; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + + char buf[100]; + char x = *strerror_r (0, buf, sizeof buf); + char *p = strerror_r (0, buf, sizeof buf); + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_strerror_r_char_p=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + else + # strerror_r is not declared. Choose between + # systems that have relatively inaccessible declarations for the + # function. BeOS and DEC UNIX 4.0 fall in this category, but the + # former has a strerror_r that returns char*, while the latter + # has a strerror_r that returns `int'. + # This test should segfault on the DEC system. + if test "$cross_compiling" = yes; then + : +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default + extern char *strerror_r (); +int +main () +{ +char buf[100]; + char x = *strerror_r (0, buf, sizeof buf); + exit (!isalpha (x)); + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_strerror_r_char_p=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi + fi + +fi +echo "$as_me:$LINENO: result: $ac_cv_func_strerror_r_char_p" >&5 +echo "${ECHO_T}$ac_cv_func_strerror_r_char_p" >&6 +if test $ac_cv_func_strerror_r_char_p = yes; then + +cat >>confdefs.h <<\_ACEOF +#define STRERROR_R_CHAR_P 1 +_ACEOF + +fi + + + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + case "$ac_aux_dir" in + /*) MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" ;; + *) MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" ;; + esac + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + + + + echo "$as_me:$LINENO: checking whether NLS is requested" >&5 +echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6 + # Check whether --enable-nls or --disable-nls was given. +if test "${enable_nls+set}" = set; then + enableval="$enable_nls" + USE_NLS=$enableval +else + USE_NLS=yes +fi; + echo "$as_me:$LINENO: result: $USE_NLS" >&5 +echo "${ECHO_T}$USE_NLS" >&6 + + + + + + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "msgfmt", so it can be a program name with args. +set dummy msgfmt; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_MSGFMT+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case "$MSGFMT" in + [\\/]* | ?:[\\/]*) + ac_cv_path_MSGFMT="$MSGFMT" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + if $ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + ac_cv_path_MSGFMT="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" + test -z "$ac_cv_path_MSGFMT" && ac_cv_path_MSGFMT=":" + ;; +esac +fi +MSGFMT="$ac_cv_path_MSGFMT" +if test "$MSGFMT" != ":"; then + echo "$as_me:$LINENO: result: $MSGFMT" >&5 +echo "${ECHO_T}$MSGFMT" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + # Extract the first word of "gmsgfmt", so it can be a program name with args. +set dummy gmsgfmt; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_GMSGFMT+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case $GMSGFMT in + [\\/]* | ?:[\\/]*) + ac_cv_path_GMSGFMT="$GMSGFMT" # Let the user override the test with a path. + ;; + *) + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_path_GMSGFMT="$as_dir/$ac_word$ac_exec_ext" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + + test -z "$ac_cv_path_GMSGFMT" && ac_cv_path_GMSGFMT="$MSGFMT" + ;; +esac +fi +GMSGFMT=$ac_cv_path_GMSGFMT + +if test -n "$GMSGFMT"; then + echo "$as_me:$LINENO: result: $GMSGFMT" >&5 +echo "${ECHO_T}$GMSGFMT" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "xgettext", so it can be a program name with args. +set dummy xgettext; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_XGETTEXT+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case "$XGETTEXT" in + [\\/]* | ?:[\\/]*) + ac_cv_path_XGETTEXT="$XGETTEXT" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + ac_cv_path_XGETTEXT="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" + test -z "$ac_cv_path_XGETTEXT" && ac_cv_path_XGETTEXT=":" + ;; +esac +fi +XGETTEXT="$ac_cv_path_XGETTEXT" +if test "$XGETTEXT" != ":"; then + echo "$as_me:$LINENO: result: $XGETTEXT" >&5 +echo "${ECHO_T}$XGETTEXT" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + rm -f messages.po + + +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "msgmerge", so it can be a program name with args. +set dummy msgmerge; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_path_MSGMERGE+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + case "$MSGMERGE" in + [\\/]* | ?:[\\/]*) + ac_cv_path_MSGMERGE="$MSGMERGE" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in $PATH; do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + if $ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1; then + ac_cv_path_MSGMERGE="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" + test -z "$ac_cv_path_MSGMERGE" && ac_cv_path_MSGMERGE=":" + ;; +esac +fi +MSGMERGE="$ac_cv_path_MSGMERGE" +if test "$MSGMERGE" != ":"; then + echo "$as_me:$LINENO: result: $MSGMERGE" >&5 +echo "${ECHO_T}$MSGMERGE" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + + if test "$GMSGFMT" != ":"; then + if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && + (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` + echo "$as_me:$LINENO: result: found $GMSGFMT program is not GNU msgfmt; ignore it" >&5 +echo "${ECHO_T}found $GMSGFMT program is not GNU msgfmt; ignore it" >&6 + GMSGFMT=":" + fi + fi + + if test "$XGETTEXT" != ":"; then + if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 && + (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + echo "$as_me:$LINENO: result: found xgettext program is not GNU xgettext; ignore it" >&5 +echo "${ECHO_T}found xgettext program is not GNU xgettext; ignore it" >&6 + XGETTEXT=":" + fi + rm -f messages.po + fi + + ac_config_commands="$ac_config_commands default-1" + + + + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" + +# Make sure we can run config.sub. +$ac_config_sub sun4 >/dev/null 2>&1 || + { { echo "$as_me:$LINENO: error: cannot run $ac_config_sub" >&5 +echo "$as_me: error: cannot run $ac_config_sub" >&2;} + { (exit 1); exit 1; }; } + +echo "$as_me:$LINENO: checking build system type" >&5 +echo $ECHO_N "checking build system type... $ECHO_C" >&6 +if test "${ac_cv_build+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_build_alias=$build_alias +test -z "$ac_cv_build_alias" && + ac_cv_build_alias=`$ac_config_guess` +test -z "$ac_cv_build_alias" && + { { echo "$as_me:$LINENO: error: cannot guess build type; you must specify one" >&5 +echo "$as_me: error: cannot guess build type; you must specify one" >&2;} + { (exit 1); exit 1; }; } +ac_cv_build=`$ac_config_sub $ac_cv_build_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_build_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_build_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_build" >&5 +echo "${ECHO_T}$ac_cv_build" >&6 +build=$ac_cv_build +build_cpu=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +build_vendor=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +build_os=`echo $ac_cv_build | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + +echo "$as_me:$LINENO: checking host system type" >&5 +echo $ECHO_N "checking host system type... $ECHO_C" >&6 +if test "${ac_cv_host+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + ac_cv_host_alias=$host_alias +test -z "$ac_cv_host_alias" && + ac_cv_host_alias=$ac_cv_build_alias +ac_cv_host=`$ac_config_sub $ac_cv_host_alias` || + { { echo "$as_me:$LINENO: error: $ac_config_sub $ac_cv_host_alias failed" >&5 +echo "$as_me: error: $ac_config_sub $ac_cv_host_alias failed" >&2;} + { (exit 1); exit 1; }; } + +fi +echo "$as_me:$LINENO: result: $ac_cv_host" >&5 +echo "${ECHO_T}$ac_cv_host" >&6 +host=$ac_cv_host +host_cpu=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\1/'` +host_vendor=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\2/'` +host_os=`echo $ac_cv_host | sed 's/^\([^-]*\)-\([^-]*\)-\(.*\)$/\3/'` + + + +# Check whether --with-gnu-ld or --without-gnu-ld was given. +if test "${with_gnu_ld+set}" = set; then + withval="$with_gnu_ld" + test "$withval" = no || with_gnu_ld=yes +else + with_gnu_ld=no +fi; +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + echo "$as_me:$LINENO: checking for ld used by GCC" >&5 +echo $ECHO_N "checking for ld used by GCC... $ECHO_C" >&6 + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [\\/]* | [A-Za-z]:[\\/]*) + re_direlt='/[^/][^/]*/\.\./' + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + echo "$as_me:$LINENO: checking for GNU ld" >&5 +echo $ECHO_N "checking for GNU ld... $ECHO_C" >&6 +else + echo "$as_me:$LINENO: checking for non-GNU ld" >&5 +echo $ECHO_N "checking for non-GNU ld... $ECHO_C" >&6 +fi +if test "${acl_cv_path_LD+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi +fi + +LD="$acl_cv_path_LD" +if test -n "$LD"; then + echo "$as_me:$LINENO: result: $LD" >&5 +echo "${ECHO_T}$LD" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi +test -z "$LD" && { { echo "$as_me:$LINENO: error: no acceptable ld found in \$PATH" >&5 +echo "$as_me: error: no acceptable ld found in \$PATH" >&2;} + { (exit 1); exit 1; }; } +echo "$as_me:$LINENO: checking if the linker ($LD) is GNU ld" >&5 +echo $ECHO_N "checking if the linker ($LD) is GNU ld... $ECHO_C" >&6 +if test "${acl_cv_prog_gnu_ld+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + # I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 &5 +echo "${ECHO_T}$acl_cv_prog_gnu_ld" >&6 +with_gnu_ld=$acl_cv_prog_gnu_ld + + + + echo "$as_me:$LINENO: checking for shared library run path origin" >&5 +echo $ECHO_N "checking for shared library run path origin... $ECHO_C" >&6 +if test "${acl_cv_rpath+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + +fi +echo "$as_me:$LINENO: result: $acl_cv_rpath" >&5 +echo "${ECHO_T}$acl_cv_rpath" >&6 + wl="$acl_cv_wl" + libext="$acl_cv_libext" + shlibext="$acl_cv_shlibext" + hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + hardcode_direct="$acl_cv_hardcode_direct" + hardcode_minus_L="$acl_cv_hardcode_minus_L" + # Check whether --enable-rpath or --disable-rpath was given. +if test "${enable_rpath+set}" = set; then + enableval="$enable_rpath" + : +else + enable_rpath=yes +fi; + + + + + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libiconv-prefix or --without-libiconv-prefix was given. +if test "${with_libiconv_prefix+set}" = set; then + withval="$with_libiconv_prefix" + + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi + +fi; + LIBICONV= + LTLIBICONV= + INCICONV= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='iconv ' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBICONV="${LIBICONV}${LIBICONV:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$hardcode_direct" = yes; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_so" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }$found_a" + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCICONV="${INCICONV}${INCICONV:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBICONV="${LIBICONV}${LIBICONV:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBICONV; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBICONV="${LIBICONV}${LIBICONV:+ }$dep" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }$dep" + ;; + esac + done + fi + else + LIBICONV="${LIBICONV}${LIBICONV:+ }-l$name" + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBICONV="${LIBICONV}${LIBICONV:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBICONV="${LTLIBICONV}${LTLIBICONV:+ }-R$found_dir" + done + fi + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + echo "$as_me:$LINENO: checking whether clearerr_unlocked is declared" >&5 +echo $ECHO_N "checking whether clearerr_unlocked is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_clearerr_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef clearerr_unlocked + char *p = (char *) clearerr_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_clearerr_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_clearerr_unlocked=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_clearerr_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_clearerr_unlocked" >&6 +if test $ac_cv_have_decl_clearerr_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_CLEARERR_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_CLEARERR_UNLOCKED 0 +_ACEOF + + +fi + + + + + echo "$as_me:$LINENO: checking whether feof_unlocked is declared" >&5 +echo $ECHO_N "checking whether feof_unlocked is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_feof_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef feof_unlocked + char *p = (char *) feof_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_feof_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_feof_unlocked=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_feof_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_feof_unlocked" >&6 +if test $ac_cv_have_decl_feof_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FEOF_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FEOF_UNLOCKED 0 +_ACEOF + + +fi + + + + + echo "$as_me:$LINENO: checking whether ferror_unlocked is declared" >&5 +echo $ECHO_N "checking whether ferror_unlocked is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_ferror_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef ferror_unlocked + char *p = (char *) ferror_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_ferror_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_ferror_unlocked=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_ferror_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_ferror_unlocked" >&6 +if test $ac_cv_have_decl_ferror_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FERROR_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FERROR_UNLOCKED 0 +_ACEOF + + +fi + + + + + echo "$as_me:$LINENO: checking whether fflush_unlocked is declared" >&5 +echo $ECHO_N "checking whether fflush_unlocked is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_fflush_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef fflush_unlocked + char *p = (char *) fflush_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_fflush_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_fflush_unlocked=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_fflush_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_fflush_unlocked" >&6 +if test $ac_cv_have_decl_fflush_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FFLUSH_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FFLUSH_UNLOCKED 0 +_ACEOF + + +fi + + + + + echo "$as_me:$LINENO: checking whether fgets_unlocked is declared" >&5 +echo $ECHO_N "checking whether fgets_unlocked is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_fgets_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef fgets_unlocked + char *p = (char *) fgets_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_fgets_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_fgets_unlocked=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_fgets_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_fgets_unlocked" >&6 +if test $ac_cv_have_decl_fgets_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FGETS_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FGETS_UNLOCKED 0 +_ACEOF + + +fi + + + + + echo "$as_me:$LINENO: checking whether fputc_unlocked is declared" >&5 +echo $ECHO_N "checking whether fputc_unlocked is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_fputc_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef fputc_unlocked + char *p = (char *) fputc_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_fputc_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_fputc_unlocked=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_fputc_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_fputc_unlocked" >&6 +if test $ac_cv_have_decl_fputc_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FPUTC_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FPUTC_UNLOCKED 0 +_ACEOF + + +fi + + + + + echo "$as_me:$LINENO: checking whether fputs_unlocked is declared" >&5 +echo $ECHO_N "checking whether fputs_unlocked is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_fputs_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef fputs_unlocked + char *p = (char *) fputs_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_fputs_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_fputs_unlocked=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_fputs_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_fputs_unlocked" >&6 +if test $ac_cv_have_decl_fputs_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FPUTS_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FPUTS_UNLOCKED 0 +_ACEOF + + +fi + + + + + echo "$as_me:$LINENO: checking whether fread_unlocked is declared" >&5 +echo $ECHO_N "checking whether fread_unlocked is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_fread_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef fread_unlocked + char *p = (char *) fread_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_fread_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_fread_unlocked=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_fread_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_fread_unlocked" >&6 +if test $ac_cv_have_decl_fread_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FREAD_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FREAD_UNLOCKED 0 +_ACEOF + + +fi + + + + + echo "$as_me:$LINENO: checking whether fwrite_unlocked is declared" >&5 +echo $ECHO_N "checking whether fwrite_unlocked is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_fwrite_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef fwrite_unlocked + char *p = (char *) fwrite_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_fwrite_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_fwrite_unlocked=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_fwrite_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_fwrite_unlocked" >&6 +if test $ac_cv_have_decl_fwrite_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FWRITE_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_FWRITE_UNLOCKED 0 +_ACEOF + + +fi + + + + + echo "$as_me:$LINENO: checking whether getc_unlocked is declared" >&5 +echo $ECHO_N "checking whether getc_unlocked is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_getc_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef getc_unlocked + char *p = (char *) getc_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_getc_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_getc_unlocked=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_getc_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_getc_unlocked" >&6 +if test $ac_cv_have_decl_getc_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETC_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETC_UNLOCKED 0 +_ACEOF + + +fi + + + + + echo "$as_me:$LINENO: checking whether getchar_unlocked is declared" >&5 +echo $ECHO_N "checking whether getchar_unlocked is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_getchar_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef getchar_unlocked + char *p = (char *) getchar_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_getchar_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_getchar_unlocked=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_getchar_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_getchar_unlocked" >&6 +if test $ac_cv_have_decl_getchar_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETCHAR_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_GETCHAR_UNLOCKED 0 +_ACEOF + + +fi + + + + + echo "$as_me:$LINENO: checking whether putc_unlocked is declared" >&5 +echo $ECHO_N "checking whether putc_unlocked is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_putc_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef putc_unlocked + char *p = (char *) putc_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_putc_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_putc_unlocked=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_putc_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_putc_unlocked" >&6 +if test $ac_cv_have_decl_putc_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_PUTC_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_PUTC_UNLOCKED 0 +_ACEOF + + +fi + + + + + echo "$as_me:$LINENO: checking whether putchar_unlocked is declared" >&5 +echo $ECHO_N "checking whether putchar_unlocked is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_putchar_unlocked+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef putchar_unlocked + char *p = (char *) putchar_unlocked; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_putchar_unlocked=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_putchar_unlocked=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_putchar_unlocked" >&5 +echo "${ECHO_T}$ac_cv_have_decl_putchar_unlocked" >&6 +if test $ac_cv_have_decl_putchar_unlocked = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_PUTCHAR_UNLOCKED 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_PUTCHAR_UNLOCKED 0 +_ACEOF + + +fi + + + + + + + + + + if test $ac_cv_func_alloca_works = no; then + : + fi + + # Define an additional variable used in the Makefile substitution. + if test $ac_cv_working_alloca_h = yes; then + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#if defined __GNUC__ || defined _AIX || defined _MSC_VER + Need own alloca +#endif + +_ACEOF +if (eval "$ac_cpp conftest.$ac_ext") 2>&5 | + $EGREP "Need own alloca" >/dev/null 2>&1; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_ALLOCA 1 +_ACEOF + + ALLOCA_H=alloca.h +else + ALLOCA_H= +fi +rm -f conftest* + + else + ALLOCA_H=alloca.h + fi + + + +cat >>confdefs.h <<\_ACEOF +#define HAVE_ALLOCA_H 1 +_ACEOF + + + + + + + + + + + echo "$as_me:$LINENO: checking for error_at_line" >&5 +echo $ECHO_N "checking for error_at_line... $ECHO_C" >&6 +if test "${ac_cv_lib_error_at_line+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +error_at_line (0, 0, "", 0, ""); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_lib_error_at_line=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_lib_error_at_line=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_lib_error_at_line" >&5 +echo "${ECHO_T}$ac_cv_lib_error_at_line" >&6 +if test $ac_cv_lib_error_at_line = no; then + case $LIBOBJS in + "error.$ac_objext" | \ + *" error.$ac_objext" | \ + "error.$ac_objext "* | \ + *" error.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS error.$ac_objext" ;; +esac + +fi + + + + : + + + + + + : + + + + + : + + + + + + + + + + + + + + + + + + + echo "$as_me:$LINENO: checking whether NLS is requested" >&5 +echo $ECHO_N "checking whether NLS is requested... $ECHO_C" >&6 + # Check whether --enable-nls or --disable-nls was given. +if test "${enable_nls+set}" = set; then + enableval="$enable_nls" + USE_NLS=$enableval +else + USE_NLS=yes +fi; + echo "$as_me:$LINENO: result: $USE_NLS" >&5 +echo "${ECHO_T}$USE_NLS" >&6 + + + + + LIBINTL= + LTLIBINTL= + POSUB= + + if test "$USE_NLS" = "yes"; then + gt_use_preinstalled_gnugettext=no + + + + + + + echo "$as_me:$LINENO: checking for GNU gettext in libc" >&5 +echo $ECHO_N "checking for GNU gettext in libc... $ECHO_C" >&6 +if test "${gt_cv_func_gnugettext1_libc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings; +int +main () +{ +bindtextdomain ("", ""); +return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_domain_bindings + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + gt_cv_func_gnugettext1_libc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +gt_cv_func_gnugettext1_libc=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $gt_cv_func_gnugettext1_libc" >&5 +echo "${ECHO_T}$gt_cv_func_gnugettext1_libc" >&6 + + if test "$gt_cv_func_gnugettext1_libc" != "yes"; then + + + + + + am_save_CPPFLAGS="$CPPFLAGS" + + for element in $INCICONV; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + + echo "$as_me:$LINENO: checking for iconv" >&5 +echo $ECHO_N "checking for iconv... $ECHO_C" >&6 +if test "${am_cv_func_iconv+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + am_cv_func_iconv=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +#include +int +main () +{ +iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + am_cv_lib_iconv=yes + am_cv_func_iconv=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + LIBS="$am_save_LIBS" + fi + +fi +echo "$as_me:$LINENO: result: $am_cv_func_iconv" >&5 +echo "${ECHO_T}$am_cv_func_iconv" >&6 + if test "$am_cv_func_iconv" = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_ICONV 1 +_ACEOF + + fi + if test "$am_cv_lib_iconv" = yes; then + echo "$as_me:$LINENO: checking how to link with libiconv" >&5 +echo $ECHO_N "checking how to link with libiconv... $ECHO_C" >&6 + echo "$as_me:$LINENO: result: $LIBICONV" >&5 +echo "${ECHO_T}$LIBICONV" >&6 + else + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + + + + + + + use_additional=yes + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + +# Check whether --with-libintl-prefix or --without-libintl-prefix was given. +if test "${with_libintl_prefix+set}" = set; then + withval="$with_libintl_prefix" + + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi + +fi; + LIBINTL= + LTLIBINTL= + INCINTL= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='intl ' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIBINTL="${LIBINTL}${LIBINTL:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$value" + else + : + fi + else + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + if test "$hardcode_direct" = yes; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + haveit= + for x in $LDFLAGS $LIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_so" + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }$found_a" + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$found_dir -l$name" + fi + fi + additional_includedir= + case "$found_dir" in + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INCINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + INCINTL="${INCINTL}${INCINTL:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + if test -n "$found_la"; then + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LIBINTL="${LIBINTL}${LIBINTL:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIBINTL; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + LIBINTL="${LIBINTL}${LIBINTL:+ }$dep" + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }$dep" + ;; + esac + done + fi + else + LIBINTL="${LIBINTL}${LIBINTL:+ }-l$name" + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" + else + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIBINTL="${LIBINTL}${LIBINTL:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + for found_dir in $ltrpathdirs; do + LTLIBINTL="${LTLIBINTL}${LTLIBINTL:+ }-R$found_dir" + done + fi + + echo "$as_me:$LINENO: checking for GNU gettext in libintl" >&5 +echo $ECHO_N "checking for GNU gettext in libintl... $ECHO_C" >&6 +if test "${gt_cv_func_gnugettext1_libintl+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + gt_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCINTL" + gt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBINTL" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (); +int +main () +{ +bindtextdomain ("", ""); +return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_expand_alias (0) + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + gt_cv_func_gnugettext1_libintl=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +gt_cv_func_gnugettext1_libintl=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + if test "$gt_cv_func_gnugettext1_libintl" != yes && test -n "$LIBICONV"; then + LIBS="$LIBS $LIBICONV" + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias (); +int +main () +{ +bindtextdomain ("", ""); +return (int) gettext ("") + _nl_msg_cat_cntr + *_nl_expand_alias (0) + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + LIBINTL="$LIBINTL $LIBICONV" + LTLIBINTL="$LTLIBINTL $LTLIBICONV" + gt_cv_func_gnugettext1_libintl=yes + +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + fi + CPPFLAGS="$gt_save_CPPFLAGS" + LIBS="$gt_save_LIBS" +fi +echo "$as_me:$LINENO: result: $gt_cv_func_gnugettext1_libintl" >&5 +echo "${ECHO_T}$gt_cv_func_gnugettext1_libintl" >&6 + fi + + if test "$gt_cv_func_gnugettext1_libc" = "yes" \ + || { test "$gt_cv_func_gnugettext1_libintl" = "yes" \ + && test "$PACKAGE" != gettext-runtime \ + && test "$PACKAGE" != gettext-tools; }; then + gt_use_preinstalled_gnugettext=yes + else + LIBINTL= + LTLIBINTL= + INCINTL= + fi + + + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + +cat >>confdefs.h <<\_ACEOF +#define ENABLE_NLS 1 +_ACEOF + + else + USE_NLS=no + fi + fi + + echo "$as_me:$LINENO: checking whether to use NLS" >&5 +echo $ECHO_N "checking whether to use NLS... $ECHO_C" >&6 + echo "$as_me:$LINENO: result: $USE_NLS" >&5 +echo "${ECHO_T}$USE_NLS" >&6 + if test "$USE_NLS" = "yes"; then + echo "$as_me:$LINENO: checking where the gettext function comes from" >&5 +echo $ECHO_N "checking where the gettext function comes from... $ECHO_C" >&6 + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if test "$gt_cv_func_gnugettext1_libintl" = "yes"; then + gt_source="external libintl" + else + gt_source="libc" + fi + else + gt_source="included intl directory" + fi + echo "$as_me:$LINENO: result: $gt_source" >&5 +echo "${ECHO_T}$gt_source" >&6 + fi + + if test "$USE_NLS" = "yes"; then + + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if test "$gt_cv_func_gnugettext1_libintl" = "yes"; then + echo "$as_me:$LINENO: checking how to link with libintl" >&5 +echo $ECHO_N "checking how to link with libintl... $ECHO_C" >&6 + echo "$as_me:$LINENO: result: $LIBINTL" >&5 +echo "${ECHO_T}$LIBINTL" >&6 + + for element in $INCINTL; do + haveit= + for x in $CPPFLAGS; do + + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + eval x=\"$x\" + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" + + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }$element" + fi + done + + fi + + +cat >>confdefs.h <<\_ACEOF +#define HAVE_GETTEXT 1 +_ACEOF + + +cat >>confdefs.h <<\_ACEOF +#define HAVE_DCGETTEXT 1 +_ACEOF + + fi + + POSUB=po + fi + + + + INTLLIBS="$LIBINTL" + + + + + + + + + + : + + + + + + + : + + + + + + + + + + + + +for ac_header in stdlib.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## -------------------------------- ## +## Report this to bug-bison@gnu.org ## +## -------------------------------- ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +echo "$as_me:$LINENO: checking for GNU libc compatible malloc" >&5 +echo $ECHO_N "checking for GNU libc compatible malloc... $ECHO_C" >&6 +if test "${ac_cv_func_malloc_0_nonnull+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_malloc_0_nonnull=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#if STDC_HEADERS || HAVE_STDLIB_H +# include +#else +char *malloc (); +#endif + +int +main () +{ +exit (malloc (0) ? 0 : 1); + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_malloc_0_nonnull=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_malloc_0_nonnull=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_func_malloc_0_nonnull" >&5 +echo "${ECHO_T}$ac_cv_func_malloc_0_nonnull" >&6 +if test $ac_cv_func_malloc_0_nonnull = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_MALLOC 1 +_ACEOF + +else + cat >>confdefs.h <<\_ACEOF +#define HAVE_MALLOC 0 +_ACEOF + + case $LIBOBJS in + "malloc.$ac_objext" | \ + *" malloc.$ac_objext" | \ + "malloc.$ac_objext "* | \ + *" malloc.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS malloc.$ac_objext" ;; +esac + + +cat >>confdefs.h <<\_ACEOF +#define malloc rpl_malloc +_ACEOF + +fi + + + + + + + : + + + + + + + + + + : + + + + + + + + + + + + + +for ac_func in iswcntrl wcwidth +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +fi +done + + + echo "$as_me:$LINENO: checking whether mbrtowc and mbstate_t are properly declared" >&5 +echo $ECHO_N "checking whether mbrtowc and mbstate_t are properly declared... $ECHO_C" >&6 +if test "${gl_cv_func_mbrtowc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +mbstate_t state; return ! (sizeof state && mbrtowc); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + gl_cv_func_mbrtowc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +gl_cv_func_mbrtowc=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $gl_cv_func_mbrtowc" >&5 +echo "${ECHO_T}$gl_cv_func_mbrtowc" >&6 + if test $gl_cv_func_mbrtowc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_MBRTOWC 1 +_ACEOF + + fi + + + echo "$as_me:$LINENO: checking whether wcwidth is declared" >&5 +echo $ECHO_N "checking whether wcwidth is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_wcwidth+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +/* AIX 3.2.5 declares wcwidth in . */ +#if HAVE_STRING_H +# include +#endif +#if HAVE_WCHAR_H +# include +#endif + +int +main () +{ + +#ifndef wcwidth + char *p = (char *) wcwidth; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_wcwidth=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_wcwidth=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_wcwidth" >&5 +echo "${ECHO_T}$ac_cv_have_decl_wcwidth" >&6 + if test $ac_cv_have_decl_wcwidth = yes; then + ac_val=1 + else + ac_val=0 + fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_WCWIDTH $ac_val +_ACEOF + + + echo "$as_me:$LINENO: checking whether mbswidth is declared in " >&5 +echo $ECHO_N "checking whether mbswidth is declared in ... $ECHO_C" >&6 +if test "${ac_cv_have_decl_mbswidth+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +#if HAVE_WCHAR_H +# include +#endif + +int +main () +{ + + char *p = (char *) mbswidth; + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_mbswidth=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_mbswidth=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_mbswidth" >&5 +echo "${ECHO_T}$ac_cv_have_decl_mbswidth" >&6 + if test $ac_cv_have_decl_mbswidth = yes; then + ac_val=1 + else + ac_val=0 + fi + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_MBSWIDTH_IN_WCHAR_H $ac_val +_ACEOF + + + echo "$as_me:$LINENO: checking for mbstate_t" >&5 +echo $ECHO_N "checking for mbstate_t... $ECHO_C" >&6 +if test "${ac_cv_type_mbstate_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +# include +int +main () +{ +mbstate_t x; return sizeof x; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_mbstate_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_mbstate_t=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_mbstate_t" >&5 +echo "${ECHO_T}$ac_cv_type_mbstate_t" >&6 + if test $ac_cv_type_mbstate_t = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_MBSTATE_T 1 +_ACEOF + + else + +cat >>confdefs.h <<\_ACEOF +#define mbstate_t int +_ACEOF + + fi + + + + echo "$as_me:$LINENO: checking for obstacks" >&5 +echo $ECHO_N "checking for obstacks... $ECHO_C" >&6 +if test "${ac_cv_func_obstack+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include "obstack.h" +int +main () +{ +struct obstack *mem; obstack_free(mem,(char *) 0) + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_obstack=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_func_obstack=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_func_obstack" >&5 +echo "${ECHO_T}$ac_cv_func_obstack" >&6 +if test $ac_cv_func_obstack = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_OBSTACK 1 +_ACEOF + +else + case $LIBOBJS in + "obstack.$ac_objext" | \ + *" obstack.$ac_objext" | \ + "obstack.$ac_objext "* | \ + *" obstack.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS obstack.$ac_objext" ;; +esac + +fi + + if test $ac_cv_func_obstack = no; then + : + fi + + + + + + + + : + + + + + + + + + + : + + + + + + + + + echo "$as_me:$LINENO: checking for mbstate_t" >&5 +echo $ECHO_N "checking for mbstate_t... $ECHO_C" >&6 +if test "${ac_cv_type_mbstate_t+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +# include +int +main () +{ +mbstate_t x; return sizeof x; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_type_mbstate_t=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_type_mbstate_t=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_type_mbstate_t" >&5 +echo "${ECHO_T}$ac_cv_type_mbstate_t" >&6 + if test $ac_cv_type_mbstate_t = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_MBSTATE_T 1 +_ACEOF + + else + +cat >>confdefs.h <<\_ACEOF +#define mbstate_t int +_ACEOF + + fi + + echo "$as_me:$LINENO: checking whether mbrtowc and mbstate_t are properly declared" >&5 +echo $ECHO_N "checking whether mbrtowc and mbstate_t are properly declared... $ECHO_C" >&6 +if test "${gl_cv_func_mbrtowc+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include +int +main () +{ +mbstate_t state; return ! (sizeof state && mbrtowc); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + gl_cv_func_mbrtowc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +gl_cv_func_mbrtowc=no +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $gl_cv_func_mbrtowc" >&5 +echo "${ECHO_T}$gl_cv_func_mbrtowc" >&6 + if test $gl_cv_func_mbrtowc = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_MBRTOWC 1 +_ACEOF + + fi + + + + +for ac_header in stdlib.h +do +as_ac_Header=`echo "ac_cv_header_$ac_header" | $as_tr_sh` +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 +else + # Is the header compilable? +echo "$as_me:$LINENO: checking $ac_header usability" >&5 +echo $ECHO_N "checking $ac_header usability... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +#include <$ac_header> +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_header_compiler=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_header_compiler=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_compiler" >&5 +echo "${ECHO_T}$ac_header_compiler" >&6 + +# Is the header present? +echo "$as_me:$LINENO: checking $ac_header presence" >&5 +echo $ECHO_N "checking $ac_header presence... $ECHO_C" >&6 +cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#include <$ac_header> +_ACEOF +if { (eval echo "$as_me:$LINENO: \"$ac_cpp conftest.$ac_ext\"") >&5 + (eval $ac_cpp conftest.$ac_ext) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } >/dev/null; then + if test -s conftest.err; then + ac_cpp_err=$ac_c_preproc_warn_flag + ac_cpp_err=$ac_cpp_err$ac_c_werror_flag + else + ac_cpp_err= + fi +else + ac_cpp_err=yes +fi +if test -z "$ac_cpp_err"; then + ac_header_preproc=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + + ac_header_preproc=no +fi +rm -f conftest.err conftest.$ac_ext +echo "$as_me:$LINENO: result: $ac_header_preproc" >&5 +echo "${ECHO_T}$ac_header_preproc" >&6 + +# So? What about this header? +case $ac_header_compiler:$ac_header_preproc:$ac_c_preproc_warn_flag in + yes:no: ) + { echo "$as_me:$LINENO: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&5 +echo "$as_me: WARNING: $ac_header: accepted by the compiler, rejected by the preprocessor!" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the compiler's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the compiler's result" >&2;} + ac_header_preproc=yes + ;; + no:yes:* ) + { echo "$as_me:$LINENO: WARNING: $ac_header: present but cannot be compiled" >&5 +echo "$as_me: WARNING: $ac_header: present but cannot be compiled" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: check for missing prerequisite headers?" >&5 +echo "$as_me: WARNING: $ac_header: check for missing prerequisite headers?" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: see the Autoconf documentation" >&5 +echo "$as_me: WARNING: $ac_header: see the Autoconf documentation" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&5 +echo "$as_me: WARNING: $ac_header: section \"Present But Cannot Be Compiled\"" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: proceeding with the preprocessor's result" >&5 +echo "$as_me: WARNING: $ac_header: proceeding with the preprocessor's result" >&2;} + { echo "$as_me:$LINENO: WARNING: $ac_header: in the future, the compiler will take precedence" >&5 +echo "$as_me: WARNING: $ac_header: in the future, the compiler will take precedence" >&2;} + ( + cat <<\_ASBOX +## -------------------------------- ## +## Report this to bug-bison@gnu.org ## +## -------------------------------- ## +_ASBOX + ) | + sed "s/^/$as_me: WARNING: /" >&2 + ;; +esac +echo "$as_me:$LINENO: checking for $ac_header" >&5 +echo $ECHO_N "checking for $ac_header... $ECHO_C" >&6 +if eval "test \"\${$as_ac_Header+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + eval "$as_ac_Header=\$ac_header_preproc" +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_Header'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_Header'}'`" >&6 + +fi +if test `eval echo '${'$as_ac_Header'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_header" | $as_tr_cpp` 1 +_ACEOF + +fi + +done + +echo "$as_me:$LINENO: checking for GNU libc compatible realloc" >&5 +echo $ECHO_N "checking for GNU libc compatible realloc... $ECHO_C" >&6 +if test "${ac_cv_func_realloc_0_nonnull+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_realloc_0_nonnull=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +#if STDC_HEADERS || HAVE_STDLIB_H +# include +#else +char *realloc (); +#endif + +int +main () +{ +exit (realloc (0, 0) ? 0 : 1); + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_realloc_0_nonnull=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_realloc_0_nonnull=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_func_realloc_0_nonnull" >&5 +echo "${ECHO_T}$ac_cv_func_realloc_0_nonnull" >&6 +if test $ac_cv_func_realloc_0_nonnull = yes; then + +cat >>confdefs.h <<\_ACEOF +#define HAVE_REALLOC 1 +_ACEOF + +else + cat >>confdefs.h <<\_ACEOF +#define HAVE_REALLOC 0 +_ACEOF + + case $LIBOBJS in + "realloc.$ac_objext" | \ + *" realloc.$ac_objext" | \ + "realloc.$ac_objext "* | \ + *" realloc.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS realloc.$ac_objext" ;; +esac + + +cat >>confdefs.h <<\_ACEOF +#define realloc rpl_realloc +_ACEOF + +fi + + + + + + + + # Define two additional variables used in the Makefile substitution. + + if test "$ac_cv_header_stdbool_h" = yes; then + STDBOOL_H='' + else + STDBOOL_H='stdbool.h' + fi + + + if test "$ac_cv_type__Bool" = yes; then + HAVE__BOOL=1 + else + HAVE__BOOL=0 + fi + + + + + + + +for ac_func in stpcpy +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +else + case $LIBOBJS in + "$ac_func.$ac_objext" | \ + *" $ac_func.$ac_objext" | \ + "$ac_func.$ac_objext "* | \ + *" $ac_func.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" ;; +esac + +fi +done + + + if test $ac_cv_func_stpcpy = no; then + + : + + fi + + + + + + +for ac_func in strndup +do +as_ac_var=`echo "ac_cv_func_$ac_func" | $as_tr_sh` +echo "$as_me:$LINENO: checking for $ac_func" >&5 +echo $ECHO_N "checking for $ac_func... $ECHO_C" >&6 +if eval "test \"\${$as_ac_var+set}\" = set"; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +/* Define $ac_func to an innocuous variant, in case declares $ac_func. + For example, HP-UX 11i declares gettimeofday. */ +#define $ac_func innocuous_$ac_func + +/* System header to define __stub macros and hopefully few prototypes, + which can conflict with char $ac_func (); below. + Prefer to if __STDC__ is defined, since + exists even on freestanding compilers. */ + +#ifdef __STDC__ +# include +#else +# include +#endif + +#undef $ac_func + +/* Override any gcc2 internal prototype to avoid an error. */ +#ifdef __cplusplus +extern "C" +{ +#endif +/* We use char because int might match the return type of a gcc2 + builtin and then its argument prototype would still apply. */ +char $ac_func (); +/* The GNU C library defines this for functions which it implements + to always fail with ENOSYS. Some functions are actually named + something starting with __ and the normal name is an alias. */ +#if defined (__stub_$ac_func) || defined (__stub___$ac_func) +choke me +#else +char (*f) () = $ac_func; +#endif +#ifdef __cplusplus +} +#endif + +int +main () +{ +return f != $ac_func; + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + eval "$as_ac_var=yes" +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +eval "$as_ac_var=no" +fi +rm -f conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: `eval echo '${'$as_ac_var'}'`" >&5 +echo "${ECHO_T}`eval echo '${'$as_ac_var'}'`" >&6 +if test `eval echo '${'$as_ac_var'}'` = yes; then + cat >>confdefs.h <<_ACEOF +#define `echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF + +else + case $LIBOBJS in + "$ac_func.$ac_objext" | \ + *" $ac_func.$ac_objext" | \ + "$ac_func.$ac_objext "* | \ + *" $ac_func.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS $ac_func.$ac_objext" ;; +esac + +fi +done + + + if test $ac_cv_func_strndup = no; then + + echo "$as_me:$LINENO: checking whether strnlen is declared" >&5 +echo $ECHO_N "checking whether strnlen is declared... $ECHO_C" >&6 +if test "${ac_cv_have_decl_strnlen+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ +#ifndef strnlen + char *p = (char *) strnlen; +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_c_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_have_decl_strnlen=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_have_decl_strnlen=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_have_decl_strnlen" >&5 +echo "${ECHO_T}$ac_cv_have_decl_strnlen" >&6 +if test $ac_cv_have_decl_strnlen = yes; then + +cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRNLEN 1 +_ACEOF + + +else + cat >>confdefs.h <<_ACEOF +#define HAVE_DECL_STRNLEN 0 +_ACEOF + + +fi + + + + fi + + + + + + echo "$as_me:$LINENO: checking for working strnlen" >&5 +echo $ECHO_N "checking for working strnlen... $ECHO_C" >&6 +if test "${ac_cv_func_strnlen_working+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test "$cross_compiling" = yes; then + ac_cv_func_strnlen_working=no +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_includes_default +int +main () +{ + +#define S "foobar" +#define S_LEN (sizeof S - 1) + + /* At least one implementation is buggy: that of AIX 4.3 would + give strnlen (S, 1) == 3. */ + + int i; + for (i = 0; i < S_LEN + 1; ++i) + { + int expected = i <= S_LEN ? i : S_LEN; + if (strnlen (S, i) != expected) + exit (1); + } + exit (0); + + ; + return 0; +} +_ACEOF +rm -f conftest$ac_exeext +if { (eval echo "$as_me:$LINENO: \"$ac_link\"") >&5 + (eval $ac_link) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && { ac_try='./conftest$ac_exeext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_func_strnlen_working=yes +else + echo "$as_me: program exited with status $ac_status" >&5 +echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +( exit $ac_status ) +ac_cv_func_strnlen_working=no +fi +rm -f core *.core gmon.out bb.out conftest$ac_exeext conftest.$ac_objext conftest.$ac_ext +fi +fi +echo "$as_me:$LINENO: result: $ac_cv_func_strnlen_working" >&5 +echo "${ECHO_T}$ac_cv_func_strnlen_working" >&6 +test $ac_cv_func_strnlen_working = no && case $LIBOBJS in + "strnlen.$ac_objext" | \ + *" strnlen.$ac_objext" | \ + "strnlen.$ac_objext "* | \ + *" strnlen.$ac_objext "* ) ;; + *) LIBOBJS="$LIBOBJS strnlen.$ac_objext" ;; +esac + + + if test $ac_cv_func_strnlen_working = no; then + # This is necessary because automake-1.6.1 doens't understand + # that the above use of AC_FUNC_STRNLEN means we may have to use + # lib/strnlen.c. + #AC_LIBOBJ(strnlen) + +cat >>confdefs.h <<\_ACEOF +#define strnlen rpl_strnlen +_ACEOF + + : + fi + + + + + + + : + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + : + + + + + + : + + + : + + + + + + : + + + + + + +# Initialize the test suite. + ac_config_commands="$ac_config_commands tests/atconfig" + + + ac_config_files="$ac_config_files tests/Makefile tests/atlocal" + + ac_config_files="$ac_config_files tests/bison" + +for ac_prog in valgrind +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_VALGRIND+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$VALGRIND"; then + ac_cv_prog_VALGRIND="$VALGRIND" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_VALGRIND="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +VALGRIND=$ac_cv_prog_VALGRIND +if test -n "$VALGRIND"; then + echo "$as_me:$LINENO: result: $VALGRIND" >&5 +echo "${ECHO_T}$VALGRIND" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$VALGRIND" && break +done + +ac_ext=cc +ac_cpp='$CXXCPP $CPPFLAGS' +ac_compile='$CXX -c $CXXFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CXX -o conftest$ac_exeext $CXXFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_cxx_compiler_gnu +if test -n "$ac_tool_prefix"; then + for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC + do + # Extract the first word of "$ac_tool_prefix$ac_prog", so it can be a program name with args. +set dummy $ac_tool_prefix$ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$CXX"; then + ac_cv_prog_CXX="$CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_CXX="$ac_tool_prefix$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +CXX=$ac_cv_prog_CXX +if test -n "$CXX"; then + echo "$as_me:$LINENO: result: $CXX" >&5 +echo "${ECHO_T}$CXX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$CXX" && break + done +fi +if test -z "$CXX"; then + ac_ct_CXX=$CXX + for ac_prog in $CCC g++ c++ gpp aCC CC cxx cc++ cl FCC KCC RCC xlC_r xlC +do + # Extract the first word of "$ac_prog", so it can be a program name with args. +set dummy $ac_prog; ac_word=$2 +echo "$as_me:$LINENO: checking for $ac_word" >&5 +echo $ECHO_N "checking for $ac_word... $ECHO_C" >&6 +if test "${ac_cv_prog_ac_ct_CXX+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -n "$ac_ct_CXX"; then + ac_cv_prog_ac_ct_CXX="$ac_ct_CXX" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $as_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_ac_ct_CXX="$ac_prog" + echo "$as_me:$LINENO: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done +done + +fi +fi +ac_ct_CXX=$ac_cv_prog_ac_ct_CXX +if test -n "$ac_ct_CXX"; then + echo "$as_me:$LINENO: result: $ac_ct_CXX" >&5 +echo "${ECHO_T}$ac_ct_CXX" >&6 +else + echo "$as_me:$LINENO: result: no" >&5 +echo "${ECHO_T}no" >&6 +fi + + test -n "$ac_ct_CXX" && break +done +test -n "$ac_ct_CXX" || ac_ct_CXX="g++" + + CXX=$ac_ct_CXX +fi + + +# Provide some information about the compiler. +echo "$as_me:$LINENO:" \ + "checking for C++ compiler version" >&5 +ac_compiler=`set X $ac_compile; echo $2` +{ (eval echo "$as_me:$LINENO: \"$ac_compiler --version &5\"") >&5 + (eval $ac_compiler --version &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -v &5\"") >&5 + (eval $ac_compiler -v &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } +{ (eval echo "$as_me:$LINENO: \"$ac_compiler -V &5\"") >&5 + (eval $ac_compiler -V &5) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } + +echo "$as_me:$LINENO: checking whether we are using the GNU C++ compiler" >&5 +echo $ECHO_N "checking whether we are using the GNU C++ compiler... $ECHO_C" >&6 +if test "${ac_cv_cxx_compiler_gnu+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ +#ifndef __GNUC__ + choke me +#endif + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_compiler_gnu=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_compiler_gnu=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +ac_cv_cxx_compiler_gnu=$ac_compiler_gnu + +fi +echo "$as_me:$LINENO: result: $ac_cv_cxx_compiler_gnu" >&5 +echo "${ECHO_T}$ac_cv_cxx_compiler_gnu" >&6 +GXX=`test $ac_compiler_gnu = yes && echo yes` +ac_test_CXXFLAGS=${CXXFLAGS+set} +ac_save_CXXFLAGS=$CXXFLAGS +CXXFLAGS="-g" +echo "$as_me:$LINENO: checking whether $CXX accepts -g" >&5 +echo $ECHO_N "checking whether $CXX accepts -g... $ECHO_C" >&6 +if test "${ac_cv_prog_cxx_g+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ + +int +main () +{ + + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + ac_cv_prog_cxx_g=yes +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +ac_cv_prog_cxx_g=no +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +fi +echo "$as_me:$LINENO: result: $ac_cv_prog_cxx_g" >&5 +echo "${ECHO_T}$ac_cv_prog_cxx_g" >&6 +if test "$ac_test_CXXFLAGS" = set; then + CXXFLAGS=$ac_save_CXXFLAGS +elif test $ac_cv_prog_cxx_g = yes; then + if test "$GXX" = yes; then + CXXFLAGS="-g -O2" + else + CXXFLAGS="-g" + fi +else + if test "$GXX" = yes; then + CXXFLAGS="-O2" + else + CXXFLAGS= + fi +fi +for ac_declaration in \ + '' \ + 'extern "C" void std::exit (int) throw (); using std::exit;' \ + 'extern "C" void std::exit (int); using std::exit;' \ + 'extern "C" void exit (int) throw ();' \ + 'extern "C" void exit (int);' \ + 'void exit (int);' +do + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +#include +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + : +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +continue +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext + cat >conftest.$ac_ext <<_ACEOF +/* confdefs.h. */ +_ACEOF +cat confdefs.h >>conftest.$ac_ext +cat >>conftest.$ac_ext <<_ACEOF +/* end confdefs.h. */ +$ac_declaration +int +main () +{ +exit (42); + ; + return 0; +} +_ACEOF +rm -f conftest.$ac_objext +if { (eval echo "$as_me:$LINENO: \"$ac_compile\"") >&5 + (eval $ac_compile) 2>conftest.er1 + ac_status=$? + grep -v '^ *+' conftest.er1 >conftest.err + rm -f conftest.er1 + cat conftest.err >&5 + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); } && + { ac_try='test -z "$ac_cxx_werror_flag" + || test ! -s conftest.err' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; } && + { ac_try='test -s conftest.$ac_objext' + { (eval echo "$as_me:$LINENO: \"$ac_try\"") >&5 + (eval $ac_try) 2>&5 + ac_status=$? + echo "$as_me:$LINENO: \$? = $ac_status" >&5 + (exit $ac_status); }; }; then + break +else + echo "$as_me: failed program was:" >&5 +sed 's/^/| /' conftest.$ac_ext >&5 + +fi +rm -f conftest.err conftest.$ac_objext conftest.$ac_ext +done +rm -f conftest* +if test -n "$ac_declaration"; then + echo '#ifdef __cplusplus' >>confdefs.h + echo $ac_declaration >>confdefs.h + echo '#endif' >>confdefs.h +fi + +ac_ext=c +ac_cpp='$CPP $CPPFLAGS' +ac_compile='$CC -c $CFLAGS $CPPFLAGS conftest.$ac_ext >&5' +ac_link='$CC -o conftest$ac_exeext $CFLAGS $CPPFLAGS $LDFLAGS conftest.$ac_ext $LIBS >&5' +ac_compiler_gnu=$ac_cv_c_compiler_gnu + +depcc="$CXX" am_compiler_list= + +echo "$as_me:$LINENO: checking dependency style of $depcc" >&5 +echo $ECHO_N "checking dependency style of $depcc... $ECHO_C" >&6 +if test "${am_cv_CXX_dependencies_compiler_type+set}" = set; then + echo $ECHO_N "(cached) $ECHO_C" >&6 +else + if test -z "$AMDEP_TRUE" && test -f "$am_depcomp"; then + # We make a subdir and do the tests there. Otherwise we can end up + # making bogus files that we don't know about and never remove. For + # instance it was reported that on HP-UX the gcc test will end up + # making a dummy file named `D' -- because `-MD' means `put the output + # in D'. + mkdir conftest.dir + # Copy depcomp to subdir because otherwise we won't find it if we're + # using a relative directory. + cp "$am_depcomp" conftest.dir + cd conftest.dir + # We will build objects and dependencies in a subdirectory because + # it helps to detect inapplicable dependency modes. For instance + # both Tru64's cc and ICC support -MD to output dependencies as a + # side effect of compilation, but ICC will put the dependencies in + # the current directory while Tru64 will put them in the object + # directory. + mkdir sub + + am_cv_CXX_dependencies_compiler_type=none + if test "$am_compiler_list" = ""; then + am_compiler_list=`sed -n 's/^#*\([a-zA-Z0-9]*\))$/\1/p' < ./depcomp` + fi + for depmode in $am_compiler_list; do + # Setup a source with many dependencies, because some compilers + # like to wrap large dependency lists on column 80 (with \), and + # we should not choose a depcomp mode which is confused by this. + # + # We need to recreate these files for each test, as the compiler may + # overwrite some of them when testing with obscure command lines. + # This happens at least with the AIX C compiler. + : > sub/conftest.c + for i in 1 2 3 4 5 6; do + echo '#include "conftst'$i'.h"' >> sub/conftest.c + # Using `: > sub/conftst$i.h' creates only sub/conftst1.h with + # Solaris 8's {/usr,}/bin/sh. + touch sub/conftst$i.h + done + echo "${am__include} ${am__quote}sub/conftest.Po${am__quote}" > confmf + + case $depmode in + nosideeffect) + # after this tag, mechanisms are not by side-effect, so they'll + # only be used when explicitly requested + if test "x$enable_dependency_tracking" = xyes; then + continue + else + break + fi + ;; + none) break ;; + esac + # We check with `-c' and `-o' for the sake of the "dashmstdout" + # mode. It turns out that the SunPro C++ compiler does not properly + # handle `-M -o', and we need to detect this. + if depmode=$depmode \ + source=sub/conftest.c object=sub/conftest.${OBJEXT-o} \ + depfile=sub/conftest.Po tmpdepfile=sub/conftest.TPo \ + $SHELL ./depcomp $depcc -c -o sub/conftest.${OBJEXT-o} sub/conftest.c \ + >/dev/null 2>conftest.err && + grep sub/conftst6.h sub/conftest.Po > /dev/null 2>&1 && + grep sub/conftest.${OBJEXT-o} sub/conftest.Po > /dev/null 2>&1 && + ${MAKE-make} -s -f confmf > /dev/null 2>&1; then + # icc doesn't choke on unknown options, it will just issue warnings + # or remarks (even with -Werror). So we grep stderr for any message + # that says an option was ignored or not supported. + # When given -MP, icc 7.0 and 7.1 complain thusly: + # icc: Command line warning: ignoring option '-M'; no argument required + # The diagnosis changed in icc 8.0: + # icc: Command line remark: option '-MP' not supported + if (grep 'ignoring option' conftest.err || + grep 'not supported' conftest.err) >/dev/null 2>&1; then :; else + am_cv_CXX_dependencies_compiler_type=$depmode + break + fi + fi + done + + cd .. + rm -rf conftest.dir +else + am_cv_CXX_dependencies_compiler_type=none +fi + +fi +echo "$as_me:$LINENO: result: $am_cv_CXX_dependencies_compiler_type" >&5 +echo "${ECHO_T}$am_cv_CXX_dependencies_compiler_type" >&6 +CXXDEPMODE=depmode=$am_cv_CXX_dependencies_compiler_type + + + +if + test "x$enable_dependency_tracking" != xno \ + && test "$am_cv_CXX_dependencies_compiler_type" = gcc3; then + am__fastdepCXX_TRUE= + am__fastdepCXX_FALSE='#' +else + am__fastdepCXX_TRUE='#' + am__fastdepCXX_FALSE= +fi + + + +AUTOM4TE=${AUTOM4TE-"${am_missing_run}autom4te"} + +# Needed by tests/atlocal.in. + +O0CFLAGS=`echo $CFLAGS | sed 's/-O0-9 *//'` + + + ac_config_files="$ac_config_files Makefile config/Makefile po/Makefile.in data/Makefile lib/Makefile src/Makefile doc/Makefile" + +cat >confcache <<\_ACEOF +# This file is a shell script that caches the results of configure +# tests run on this system so they can be shared between configure +# scripts and configure runs, see configure's option --config-cache. +# It is not useful on other systems. If it contains results you don't +# want to keep, you may remove or edit it. +# +# config.status only pays attention to the cache file if you give it +# the --recheck option to rerun configure. +# +# `ac_cv_env_foo' variables (set or unset) will be overridden when +# loading this file, other *unset* `ac_cv_foo' will be assigned the +# following values. + +_ACEOF + +# The following way of writing the cache mishandles newlines in values, +# but we know of no workaround that is simple, portable, and efficient. +# So, don't put newlines in cache variables' values. +# Ultrix sh set writes to stderr and can't be redirected directly, +# and sets the high bit in the cache file unless we assign to the vars. +{ + (set) 2>&1 | + case `(ac_space=' '; set | grep ac_space) 2>&1` in + *ac_space=\ *) + # `set' does not quote correctly, so add quotes (double-quote + # substitution turns \\\\ into \\, and sed turns \\ into \). + sed -n \ + "s/'/'\\\\''/g; + s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1='\\2'/p" + ;; + *) + # `set' quotes correctly as required by POSIX, so do not add quotes. + sed -n \ + "s/^\\([_$as_cr_alnum]*_cv_[_$as_cr_alnum]*\\)=\\(.*\\)/\\1=\\2/p" + ;; + esac; +} | + sed ' + t clear + : clear + s/^\([^=]*\)=\(.*[{}].*\)$/test "${\1+set}" = set || &/ + t end + /^ac_cv_env/!s/^\([^=]*\)=\(.*\)$/\1=${\1=\2}/ + : end' >>confcache +if diff $cache_file confcache >/dev/null 2>&1; then :; else + if test -w $cache_file; then + test "x$cache_file" != "x/dev/null" && echo "updating cache $cache_file" + cat confcache >$cache_file + else + echo "not updating unwritable cache $cache_file" + fi +fi +rm -f confcache + +test "x$prefix" = xNONE && prefix=$ac_default_prefix +# Let make expand exec_prefix. +test "x$exec_prefix" = xNONE && exec_prefix='${prefix}' + +# VPATH may cause trouble with some makes, so we remove $(srcdir), +# ${srcdir} and @srcdir@ from VPATH if srcdir is ".", strip leading and +# trailing colons and then remove the whole line if VPATH becomes empty +# (actually we leave an empty line to preserve line numbers). +if test "x$srcdir" = x.; then + ac_vpsub='/^[ ]*VPATH[ ]*=/{ +s/:*\$(srcdir):*/:/; +s/:*\${srcdir}:*/:/; +s/:*@srcdir@:*/:/; +s/^\([^=]*=[ ]*\):*/\1/; +s/:*$//; +s/^[^=]*=[ ]*$//; +}' +fi + +DEFS=-DHAVE_CONFIG_H + +ac_libobjs= +ac_ltlibobjs= +for ac_i in : $LIBOBJS; do test "x$ac_i" = x: && continue + # 1. Remove the extension, and $U if already installed. + ac_i=`echo "$ac_i" | + sed 's/\$U\././;s/\.o$//;s/\.obj$//'` + # 2. Add them. + ac_libobjs="$ac_libobjs $ac_i\$U.$ac_objext" + ac_ltlibobjs="$ac_ltlibobjs $ac_i"'$U.lo' +done +LIBOBJS=$ac_libobjs + +LTLIBOBJS=$ac_ltlibobjs + + +if test -z "${AMDEP_TRUE}" && test -z "${AMDEP_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"AMDEP\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCC_TRUE}" && test -z "${am__fastdepCC_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"am__fastdepCC\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi +if test -z "${am__fastdepCXX_TRUE}" && test -z "${am__fastdepCXX_FALSE}"; then + { { echo "$as_me:$LINENO: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&5 +echo "$as_me: error: conditional \"am__fastdepCXX\" was never defined. +Usually this means the macro was only invoked conditionally." >&2;} + { (exit 1); exit 1; }; } +fi + +: ${CONFIG_STATUS=./config.status} +ac_clean_files_save=$ac_clean_files +ac_clean_files="$ac_clean_files $CONFIG_STATUS" +{ echo "$as_me:$LINENO: creating $CONFIG_STATUS" >&5 +echo "$as_me: creating $CONFIG_STATUS" >&6;} +cat >$CONFIG_STATUS <<_ACEOF +#! $SHELL +# Generated by $as_me. +# Run this file to recreate the current configuration. +# Compiler output produced by configure, useful for debugging +# configure, is in config.log if it exists. + +debug=false +ac_cs_recheck=false +ac_cs_silent=false +SHELL=\${CONFIG_SHELL-$SHELL} +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { { echo "$as_me:$LINENO: error: cannot find myself; rerun with an absolute path" >&5 +echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2;} + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { { echo "$as_me:$LINENO: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&5 +echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2;} + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + +exec 6>&1 + +# Open the log real soon, to keep \$[0] and so on meaningful, and to +# report actual input values of CONFIG_FILES etc. instead of their +# values after options handling. Logging --version etc. is OK. +exec 5>>config.log +{ + echo + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## Running $as_me. ## +_ASBOX +} >&5 +cat >&5 <<_CSEOF + +This file was extended by GNU Bison $as_me 1.875d, which was +generated by GNU Autoconf 2.59. Invocation command line was + + CONFIG_FILES = $CONFIG_FILES + CONFIG_HEADERS = $CONFIG_HEADERS + CONFIG_LINKS = $CONFIG_LINKS + CONFIG_COMMANDS = $CONFIG_COMMANDS + $ $0 $@ + +_CSEOF +echo "on `(hostname || uname -n) 2>/dev/null | sed 1q`" >&5 +echo >&5 +_ACEOF + +# Files that config.status was made for. +if test -n "$ac_config_files"; then + echo "config_files=\"$ac_config_files\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_headers"; then + echo "config_headers=\"$ac_config_headers\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_links"; then + echo "config_links=\"$ac_config_links\"" >>$CONFIG_STATUS +fi + +if test -n "$ac_config_commands"; then + echo "config_commands=\"$ac_config_commands\"" >>$CONFIG_STATUS +fi + +cat >>$CONFIG_STATUS <<\_ACEOF + +ac_cs_usage="\ +\`$as_me' instantiates files from templates according to the +current configuration. + +Usage: $0 [OPTIONS] [FILE]... + + -h, --help print this help, then exit + -V, --version print version number, then exit + -q, --quiet do not print progress messages + -d, --debug don't remove temporary files + --recheck update $as_me by reconfiguring in the same conditions + --file=FILE[:TEMPLATE] + instantiate the configuration file FILE + --header=FILE[:TEMPLATE] + instantiate the configuration header FILE + +Configuration files: +$config_files + +Configuration headers: +$config_headers + +Configuration commands: +$config_commands + +Report bugs to ." +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +ac_cs_version="\\ +GNU Bison config.status 1.875d +configured by $0, generated by GNU Autoconf 2.59, + with options \\"`echo "$ac_configure_args" | sed 's/[\\""\`\$]/\\\\&/g'`\\" + +Copyright (C) 2003 Free Software Foundation, Inc. +This config.status script is free software; the Free Software Foundation +gives unlimited permission to copy, distribute and modify it." +srcdir=$srcdir +INSTALL="$INSTALL" +_ACEOF + +cat >>$CONFIG_STATUS <<\_ACEOF +# If no file are specified by the user, then we need to provide default +# value. By we need to know if files were specified by the user. +ac_need_defaults=: +while test $# != 0 +do + case $1 in + --*=*) + ac_option=`expr "x$1" : 'x\([^=]*\)='` + ac_optarg=`expr "x$1" : 'x[^=]*=\(.*\)'` + ac_shift=: + ;; + -*) + ac_option=$1 + ac_optarg=$2 + ac_shift=shift + ;; + *) # This is not an option, so the user has probably given explicit + # arguments. + ac_option=$1 + ac_need_defaults=false;; + esac + + case $ac_option in + # Handling of the options. +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + -recheck | --recheck | --rechec | --reche | --rech | --rec | --re | --r) + ac_cs_recheck=: ;; + --version | --vers* | -V ) + echo "$ac_cs_version"; exit 0 ;; + --he | --h) + # Conflict between --help and --header + { { echo "$as_me:$LINENO: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: ambiguous option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; };; + --help | --hel | -h ) + echo "$ac_cs_usage"; exit 0 ;; + --debug | --d* | -d ) + debug=: ;; + --file | --fil | --fi | --f ) + $ac_shift + CONFIG_FILES="$CONFIG_FILES $ac_optarg" + ac_need_defaults=false;; + --header | --heade | --head | --hea ) + $ac_shift + CONFIG_HEADERS="$CONFIG_HEADERS $ac_optarg" + ac_need_defaults=false;; + -q | -quiet | --quiet | --quie | --qui | --qu | --q \ + | -silent | --silent | --silen | --sile | --sil | --si | --s) + ac_cs_silent=: ;; + + # This is an error. + -*) { { echo "$as_me:$LINENO: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&5 +echo "$as_me: error: unrecognized option: $1 +Try \`$0 --help' for more information." >&2;} + { (exit 1); exit 1; }; } ;; + + *) ac_config_targets="$ac_config_targets $1" ;; + + esac + shift +done + +ac_configure_extra_args= + +if $ac_cs_silent; then + exec 6>/dev/null + ac_configure_extra_args="$ac_configure_extra_args --silent" +fi + +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF +if \$ac_cs_recheck; then + echo "running $SHELL $0 " $ac_configure_args \$ac_configure_extra_args " --no-create --no-recursion" >&6 + exec $SHELL $0 $ac_configure_args \$ac_configure_extra_args --no-create --no-recursion +fi + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF +# +# INIT-COMMANDS section. +# + +AMDEP_TRUE="$AMDEP_TRUE" ac_aux_dir="$ac_aux_dir" +# Capture the value of obsolete ALL_LINGUAS because we need it to compute + # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it + # from automake. + eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="${LINGUAS-%UNSET%}" + + +_ACEOF + + + +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_config_target in $ac_config_targets +do + case "$ac_config_target" in + # Handling of arguments. + "tests/Makefile" ) CONFIG_FILES="$CONFIG_FILES tests/Makefile" ;; + "tests/atlocal" ) CONFIG_FILES="$CONFIG_FILES tests/atlocal" ;; + "tests/bison" ) CONFIG_FILES="$CONFIG_FILES tests/bison" ;; + "Makefile" ) CONFIG_FILES="$CONFIG_FILES Makefile" ;; + "config/Makefile" ) CONFIG_FILES="$CONFIG_FILES config/Makefile" ;; + "po/Makefile.in" ) CONFIG_FILES="$CONFIG_FILES po/Makefile.in" ;; + "data/Makefile" ) CONFIG_FILES="$CONFIG_FILES data/Makefile" ;; + "lib/Makefile" ) CONFIG_FILES="$CONFIG_FILES lib/Makefile" ;; + "src/Makefile" ) CONFIG_FILES="$CONFIG_FILES src/Makefile" ;; + "doc/Makefile" ) CONFIG_FILES="$CONFIG_FILES doc/Makefile" ;; + "depfiles" ) CONFIG_COMMANDS="$CONFIG_COMMANDS depfiles" ;; + "default-1" ) CONFIG_COMMANDS="$CONFIG_COMMANDS default-1" ;; + "tests/atconfig" ) CONFIG_COMMANDS="$CONFIG_COMMANDS tests/atconfig" ;; + "config.h" ) CONFIG_HEADERS="$CONFIG_HEADERS config.h:config.hin" ;; + *) { { echo "$as_me:$LINENO: error: invalid argument: $ac_config_target" >&5 +echo "$as_me: error: invalid argument: $ac_config_target" >&2;} + { (exit 1); exit 1; }; };; + esac +done + +# If the user did not use the arguments to specify the items to instantiate, +# then the envvar interface is used. Set only those that are not. +# We use the long form for the default assignment because of an extremely +# bizarre bug on SunOS 4.1.3. +if $ac_need_defaults; then + test "${CONFIG_FILES+set}" = set || CONFIG_FILES=$config_files + test "${CONFIG_HEADERS+set}" = set || CONFIG_HEADERS=$config_headers + test "${CONFIG_COMMANDS+set}" = set || CONFIG_COMMANDS=$config_commands +fi + +# Have a temporary directory for convenience. Make it in the build tree +# simply because there is no reason to put it here, and in addition, +# creating and moving files from /tmp can sometimes cause problems. +# Create a temporary directory, and hook for its removal unless debugging. +$debug || +{ + trap 'exit_status=$?; rm -rf $tmp && exit $exit_status' 0 + trap '{ (exit 1); exit 1; }' 1 2 13 15 +} + +# Create a (secure) tmp directory for tmp files. + +{ + tmp=`(umask 077 && mktemp -d -q "./confstatXXXXXX") 2>/dev/null` && + test -n "$tmp" && test -d "$tmp" +} || +{ + tmp=./confstat$$-$RANDOM + (umask 077 && mkdir $tmp) +} || +{ + echo "$me: cannot create a temporary directory in ." >&2 + { (exit 1); exit 1; } +} + +_ACEOF + +cat >>$CONFIG_STATUS <<_ACEOF + +# +# CONFIG_FILES section. +# + +# No need to generate the scripts if there are no CONFIG_FILES. +# This happens for instance when ./config.status config.h +if test -n "\$CONFIG_FILES"; then + # Protect against being on the right side of a sed subst in config.status. + sed 's/,@/@@/; s/@,/@@/; s/,;t t\$/@;t t/; /@;t t\$/s/[\\\\&,]/\\\\&/g; + s/@@/,@/; s/@@/@,/; s/@;t t\$/,;t t/' >\$tmp/subs.sed <<\\CEOF +s,@SHELL@,$SHELL,;t t +s,@PATH_SEPARATOR@,$PATH_SEPARATOR,;t t +s,@PACKAGE_NAME@,$PACKAGE_NAME,;t t +s,@PACKAGE_TARNAME@,$PACKAGE_TARNAME,;t t +s,@PACKAGE_VERSION@,$PACKAGE_VERSION,;t t +s,@PACKAGE_STRING@,$PACKAGE_STRING,;t t +s,@PACKAGE_BUGREPORT@,$PACKAGE_BUGREPORT,;t t +s,@exec_prefix@,$exec_prefix,;t t +s,@prefix@,$prefix,;t t +s,@program_transform_name@,$program_transform_name,;t t +s,@bindir@,$bindir,;t t +s,@sbindir@,$sbindir,;t t +s,@libexecdir@,$libexecdir,;t t +s,@datadir@,$datadir,;t t +s,@sysconfdir@,$sysconfdir,;t t +s,@sharedstatedir@,$sharedstatedir,;t t +s,@localstatedir@,$localstatedir,;t t +s,@libdir@,$libdir,;t t +s,@includedir@,$includedir,;t t +s,@oldincludedir@,$oldincludedir,;t t +s,@infodir@,$infodir,;t t +s,@mandir@,$mandir,;t t +s,@build_alias@,$build_alias,;t t +s,@host_alias@,$host_alias,;t t +s,@target_alias@,$target_alias,;t t +s,@DEFS@,$DEFS,;t t +s,@ECHO_C@,$ECHO_C,;t t +s,@ECHO_N@,$ECHO_N,;t t +s,@ECHO_T@,$ECHO_T,;t t +s,@LIBS@,$LIBS,;t t +s,@INSTALL_PROGRAM@,$INSTALL_PROGRAM,;t t +s,@INSTALL_SCRIPT@,$INSTALL_SCRIPT,;t t +s,@INSTALL_DATA@,$INSTALL_DATA,;t t +s,@CYGPATH_W@,$CYGPATH_W,;t t +s,@PACKAGE@,$PACKAGE,;t t +s,@VERSION@,$VERSION,;t t +s,@ACLOCAL@,$ACLOCAL,;t t +s,@AUTOCONF@,$AUTOCONF,;t t +s,@AUTOMAKE@,$AUTOMAKE,;t t +s,@AUTOHEADER@,$AUTOHEADER,;t t +s,@MAKEINFO@,$MAKEINFO,;t t +s,@AMTAR@,$AMTAR,;t t +s,@install_sh@,$install_sh,;t t +s,@STRIP@,$STRIP,;t t +s,@ac_ct_STRIP@,$ac_ct_STRIP,;t t +s,@INSTALL_STRIP_PROGRAM@,$INSTALL_STRIP_PROGRAM,;t t +s,@mkdir_p@,$mkdir_p,;t t +s,@AWK@,$AWK,;t t +s,@SET_MAKE@,$SET_MAKE,;t t +s,@am__leading_dot@,$am__leading_dot,;t t +s,@CC@,$CC,;t t +s,@CFLAGS@,$CFLAGS,;t t +s,@LDFLAGS@,$LDFLAGS,;t t +s,@CPPFLAGS@,$CPPFLAGS,;t t +s,@ac_ct_CC@,$ac_ct_CC,;t t +s,@EXEEXT@,$EXEEXT,;t t +s,@OBJEXT@,$OBJEXT,;t t +s,@DEPDIR@,$DEPDIR,;t t +s,@am__include@,$am__include,;t t +s,@am__quote@,$am__quote,;t t +s,@AMDEP_TRUE@,$AMDEP_TRUE,;t t +s,@AMDEP_FALSE@,$AMDEP_FALSE,;t t +s,@AMDEPBACKSLASH@,$AMDEPBACKSLASH,;t t +s,@CCDEPMODE@,$CCDEPMODE,;t t +s,@am__fastdepCC_TRUE@,$am__fastdepCC_TRUE,;t t +s,@am__fastdepCC_FALSE@,$am__fastdepCC_FALSE,;t t +s,@CPP@,$CPP,;t t +s,@EGREP@,$EGREP,;t t +s,@WARNING_CFLAGS@,$WARNING_CFLAGS,;t t +s,@WERROR_CFLAGS@,$WERROR_CFLAGS,;t t +s,@WARNING_CXXFLAGS@,$WARNING_CXXFLAGS,;t t +s,@YACC_SCRIPT@,$YACC_SCRIPT,;t t +s,@YACC_LIBRARY@,$YACC_LIBRARY,;t t +s,@LEX@,$LEX,;t t +s,@LEXLIB@,$LEXLIB,;t t +s,@LEX_OUTPUT_ROOT@,$LEX_OUTPUT_ROOT,;t t +s,@YACC@,$YACC,;t t +s,@RANLIB@,$RANLIB,;t t +s,@ac_ct_RANLIB@,$ac_ct_RANLIB,;t t +s,@M4@,$M4,;t t +s,@STDBOOL_H@,$STDBOOL_H,;t t +s,@HAVE__BOOL@,$HAVE__BOOL,;t t +s,@ALLOCA@,$ALLOCA,;t t +s,@ALLOCA_H@,$ALLOCA_H,;t t +s,@LIBOBJS@,$LIBOBJS,;t t +s,@MKINSTALLDIRS@,$MKINSTALLDIRS,;t t +s,@USE_NLS@,$USE_NLS,;t t +s,@MSGFMT@,$MSGFMT,;t t +s,@GMSGFMT@,$GMSGFMT,;t t +s,@XGETTEXT@,$XGETTEXT,;t t +s,@MSGMERGE@,$MSGMERGE,;t t +s,@build@,$build,;t t +s,@build_cpu@,$build_cpu,;t t +s,@build_vendor@,$build_vendor,;t t +s,@build_os@,$build_os,;t t +s,@host@,$host,;t t +s,@host_cpu@,$host_cpu,;t t +s,@host_vendor@,$host_vendor,;t t +s,@host_os@,$host_os,;t t +s,@LIBICONV@,$LIBICONV,;t t +s,@LTLIBICONV@,$LTLIBICONV,;t t +s,@INTLLIBS@,$INTLLIBS,;t t +s,@LIBINTL@,$LIBINTL,;t t +s,@LTLIBINTL@,$LTLIBINTL,;t t +s,@POSUB@,$POSUB,;t t +s,@VALGRIND@,$VALGRIND,;t t +s,@CXX@,$CXX,;t t +s,@CXXFLAGS@,$CXXFLAGS,;t t +s,@ac_ct_CXX@,$ac_ct_CXX,;t t +s,@CXXDEPMODE@,$CXXDEPMODE,;t t +s,@am__fastdepCXX_TRUE@,$am__fastdepCXX_TRUE,;t t +s,@am__fastdepCXX_FALSE@,$am__fastdepCXX_FALSE,;t t +s,@AUTOM4TE@,$AUTOM4TE,;t t +s,@GCC@,$GCC,;t t +s,@O0CFLAGS@,$O0CFLAGS,;t t +s,@LTLIBOBJS@,$LTLIBOBJS,;t t +CEOF + +_ACEOF + + cat >>$CONFIG_STATUS <<\_ACEOF + # Split the substitutions into bite-sized pieces for seds with + # small command number limits, like on Digital OSF/1 and HP-UX. + ac_max_sed_lines=48 + ac_sed_frag=1 # Number of current file. + ac_beg=1 # First line for current file. + ac_end=$ac_max_sed_lines # Line after last line for current file. + ac_more_lines=: + ac_sed_cmds= + while $ac_more_lines; do + if test $ac_beg -gt 1; then + sed "1,${ac_beg}d; ${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + else + sed "${ac_end}q" $tmp/subs.sed >$tmp/subs.frag + fi + if test ! -s $tmp/subs.frag; then + ac_more_lines=false + else + # The purpose of the label and of the branching condition is to + # speed up the sed processing (if there are no `@' at all, there + # is no need to browse any of the substitutions). + # These are the two extra sed commands mentioned above. + (echo ':t + /@[a-zA-Z_][a-zA-Z_0-9]*@/!b' && cat $tmp/subs.frag) >$tmp/subs-$ac_sed_frag.sed + if test -z "$ac_sed_cmds"; then + ac_sed_cmds="sed -f $tmp/subs-$ac_sed_frag.sed" + else + ac_sed_cmds="$ac_sed_cmds | sed -f $tmp/subs-$ac_sed_frag.sed" + fi + ac_sed_frag=`expr $ac_sed_frag + 1` + ac_beg=$ac_end + ac_end=`expr $ac_end + $ac_max_sed_lines` + fi + done + if test -z "$ac_sed_cmds"; then + ac_sed_cmds=cat + fi +fi # test -n "$CONFIG_FILES" + +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +for ac_file in : $CONFIG_FILES; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + # Compute @srcdir@, @top_srcdir@, and @INSTALL@ for subdirectories. + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + + case $INSTALL in + [\\/$]* | ?:[\\/]* ) ac_INSTALL=$INSTALL ;; + *) ac_INSTALL=$ac_top_builddir$INSTALL ;; + esac + + if test x"$ac_file" != x-; then + { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + rm -f "$ac_file" + fi + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + configure_input= + else + configure_input="$ac_file. " + fi + configure_input=$configure_input"Generated from `echo $ac_file_in | + sed 's,.*/,,'` by configure." + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + echo "$f";; + *) # Relative + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } +_ACEOF +cat >>$CONFIG_STATUS <<_ACEOF + sed "$ac_vpsub +$extrasub +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF +:t +/@[a-zA-Z_][a-zA-Z_0-9]*@/!b +s,@configure_input@,$configure_input,;t t +s,@srcdir@,$ac_srcdir,;t t +s,@abs_srcdir@,$ac_abs_srcdir,;t t +s,@top_srcdir@,$ac_top_srcdir,;t t +s,@abs_top_srcdir@,$ac_abs_top_srcdir,;t t +s,@builddir@,$ac_builddir,;t t +s,@abs_builddir@,$ac_abs_builddir,;t t +s,@top_builddir@,$ac_top_builddir,;t t +s,@abs_top_builddir@,$ac_abs_top_builddir,;t t +s,@INSTALL@,$ac_INSTALL,;t t +" $ac_file_inputs | (eval "$ac_sed_cmds") >$tmp/out + rm -f $tmp/stdin + if test x"$ac_file" != x-; then + mv $tmp/out $ac_file + else + cat $tmp/out + rm -f $tmp/out + fi + + # Run the commands associated with the file. + case $ac_file in + tests/bison ) chmod +x tests/bison ;; + esac +done +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + +# +# CONFIG_HEADER section. +# + +# These sed commands are passed to sed as "A NAME B NAME C VALUE D", where +# NAME is the cpp macro being defined and VALUE is the value it is being given. +# +# ac_d sets the value in "#define NAME VALUE" lines. +ac_dA='s,^\([ ]*\)#\([ ]*define[ ][ ]*\)' +ac_dB='[ ].*$,\1#\2' +ac_dC=' ' +ac_dD=',;t' +# ac_u turns "#undef NAME" without trailing blanks into "#define NAME VALUE". +ac_uA='s,^\([ ]*\)#\([ ]*\)undef\([ ][ ]*\)' +ac_uB='$,\1#\2define\3' +ac_uC=' ' +ac_uD=',;t' + +for ac_file in : $CONFIG_HEADERS; do test "x$ac_file" = x: && continue + # Support "outfile[:infile[:infile...]]", defaulting infile="outfile.in". + case $ac_file in + - | *:- | *:-:* ) # input from stdin + cat >$tmp/stdin + ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + *:* ) ac_file_in=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_file=`echo "$ac_file" | sed 's,:.*,,'` ;; + * ) ac_file_in=$ac_file.in ;; + esac + + test x"$ac_file" != x- && { echo "$as_me:$LINENO: creating $ac_file" >&5 +echo "$as_me: creating $ac_file" >&6;} + + # First look for the input files in the build tree, otherwise in the + # src tree. + ac_file_inputs=`IFS=: + for f in $ac_file_in; do + case $f in + -) echo $tmp/stdin ;; + [\\/$]*) + # Absolute (can't be DOS-style, as IFS=:) + test -f "$f" || { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + # Do quote $f, to prevent DOS paths from being IFS'd. + echo "$f";; + *) # Relative + if test -f "$f"; then + # Build tree + echo "$f" + elif test -f "$srcdir/$f"; then + # Source tree + echo "$srcdir/$f" + else + # /dev/null tree + { { echo "$as_me:$LINENO: error: cannot find input file: $f" >&5 +echo "$as_me: error: cannot find input file: $f" >&2;} + { (exit 1); exit 1; }; } + fi;; + esac + done` || { (exit 1); exit 1; } + # Remove the trailing spaces. + sed 's/[ ]*$//' $ac_file_inputs >$tmp/in + +_ACEOF + +# Transform confdefs.h into two sed scripts, `conftest.defines' and +# `conftest.undefs', that substitutes the proper values into +# config.h.in to produce config.h. The first handles `#define' +# templates, and the second `#undef' templates. +# And first: Protect against being on the right side of a sed subst in +# config.status. Protect against being in an unquoted here document +# in config.status. +rm -f conftest.defines conftest.undefs +# Using a here document instead of a string reduces the quoting nightmare. +# Putting comments in sed scripts is not portable. +# +# `end' is used to avoid that the second main sed command (meant for +# 0-ary CPP macros) applies to n-ary macro definitions. +# See the Autoconf documentation for `clear'. +cat >confdef2sed.sed <<\_ACEOF +s/[\\&,]/\\&/g +s,[\\$`],\\&,g +t clear +: clear +s,^[ ]*#[ ]*define[ ][ ]*\([^ (][^ (]*\)\(([^)]*)\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1\2${ac_dC}\3${ac_dD},gp +t end +s,^[ ]*#[ ]*define[ ][ ]*\([^ ][^ ]*\)[ ]*\(.*\)$,${ac_dA}\1${ac_dB}\1${ac_dC}\2${ac_dD},gp +: end +_ACEOF +# If some macros were called several times there might be several times +# the same #defines, which is useless. Nevertheless, we may not want to +# sort them, since we want the *last* AC-DEFINE to be honored. +uniq confdefs.h | sed -n -f confdef2sed.sed >conftest.defines +sed 's/ac_d/ac_u/g' conftest.defines >conftest.undefs +rm -f confdef2sed.sed + +# This sed command replaces #undef with comments. This is necessary, for +# example, in the case of _POSIX_SOURCE, which is predefined and required +# on some systems where configure will not decide to define it. +cat >>conftest.undefs <<\_ACEOF +s,^[ ]*#[ ]*undef[ ][ ]*[a-zA-Z_][a-zA-Z_0-9]*,/* & */, +_ACEOF + +# Break up conftest.defines because some shells have a limit on the size +# of here documents, and old seds have small limits too (100 cmds). +echo ' # Handle all the #define templates only if necessary.' >>$CONFIG_STATUS +echo ' if grep "^[ ]*#[ ]*define" $tmp/in >/dev/null; then' >>$CONFIG_STATUS +echo ' # If there are no defines, we may have an empty if/fi' >>$CONFIG_STATUS +echo ' :' >>$CONFIG_STATUS +rm -f conftest.tail +while grep . conftest.defines >/dev/null +do + # Write a limited-size here document to $tmp/defines.sed. + echo ' cat >$tmp/defines.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#define' lines. + echo '/^[ ]*#[ ]*define/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.defines >>$CONFIG_STATUS + echo 'CEOF + sed -f $tmp/defines.sed $tmp/in >$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in +' >>$CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.defines >conftest.tail + rm -f conftest.defines + mv conftest.tail conftest.defines +done +rm -f conftest.defines +echo ' fi # grep' >>$CONFIG_STATUS +echo >>$CONFIG_STATUS + +# Break up conftest.undefs because some shells have a limit on the size +# of here documents, and old seds have small limits too (100 cmds). +echo ' # Handle all the #undef templates' >>$CONFIG_STATUS +rm -f conftest.tail +while grep . conftest.undefs >/dev/null +do + # Write a limited-size here document to $tmp/undefs.sed. + echo ' cat >$tmp/undefs.sed <>$CONFIG_STATUS + # Speed up: don't consider the non `#undef' + echo '/^[ ]*#[ ]*undef/!b' >>$CONFIG_STATUS + # Work around the forget-to-reset-the-flag bug. + echo 't clr' >>$CONFIG_STATUS + echo ': clr' >>$CONFIG_STATUS + sed ${ac_max_here_lines}q conftest.undefs >>$CONFIG_STATUS + echo 'CEOF + sed -f $tmp/undefs.sed $tmp/in >$tmp/out + rm -f $tmp/in + mv $tmp/out $tmp/in +' >>$CONFIG_STATUS + sed 1,${ac_max_here_lines}d conftest.undefs >conftest.tail + rm -f conftest.undefs + mv conftest.tail conftest.undefs +done +rm -f conftest.undefs + +cat >>$CONFIG_STATUS <<\_ACEOF + # Let's still pretend it is `configure' which instantiates (i.e., don't + # use $as_me), people would be surprised to read: + # /* config.h. Generated by config.status. */ + if test x"$ac_file" = x-; then + echo "/* Generated by configure. */" >$tmp/config.h + else + echo "/* $ac_file. Generated by configure. */" >$tmp/config.h + fi + cat $tmp/in >>$tmp/config.h + rm -f $tmp/in + if test x"$ac_file" != x-; then + if diff $ac_file $tmp/config.h >/dev/null 2>&1; then + { echo "$as_me:$LINENO: $ac_file is unchanged" >&5 +echo "$as_me: $ac_file is unchanged" >&6;} + else + ac_dir=`(dirname "$ac_file") 2>/dev/null || +$as_expr X"$ac_file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_file" : 'X\(//\)[^/]' \| \ + X"$ac_file" : 'X\(//\)$' \| \ + X"$ac_file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + rm -f $ac_file + mv $tmp/config.h $ac_file + fi + else + cat $tmp/config.h + rm -f $tmp/config.h + fi +# Compute $ac_file's index in $config_headers. +_am_stamp_count=1 +for _am_header in $config_headers :; do + case $_am_header in + $ac_file | $ac_file:* ) + break ;; + * ) + _am_stamp_count=`expr $_am_stamp_count + 1` ;; + esac +done +echo "timestamp for $ac_file" >`(dirname $ac_file) 2>/dev/null || +$as_expr X$ac_file : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X$ac_file : 'X\(//\)[^/]' \| \ + X$ac_file : 'X\(//\)$' \| \ + X$ac_file : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X$ac_file | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'`/stamp-h$_am_stamp_count +done +_ACEOF +cat >>$CONFIG_STATUS <<\_ACEOF + +# +# CONFIG_COMMANDS section. +# +for ac_file in : $CONFIG_COMMANDS; do test "x$ac_file" = x: && continue + ac_dest=`echo "$ac_file" | sed 's,:.*,,'` + ac_source=`echo "$ac_file" | sed 's,[^:]*:,,'` + ac_dir=`(dirname "$ac_dest") 2>/dev/null || +$as_expr X"$ac_dest" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$ac_dest" : 'X\(//\)[^/]' \| \ + X"$ac_dest" : 'X\(//\)$' \| \ + X"$ac_dest" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$ac_dest" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p "$ac_dir" + else + as_dir="$ac_dir" + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory \"$ac_dir\"" >&5 +echo "$as_me: error: cannot create directory \"$ac_dir\"" >&2;} + { (exit 1); exit 1; }; }; } + + ac_builddir=. + +if test "$ac_dir" != .; then + ac_dir_suffix=/`echo "$ac_dir" | sed 's,^\.[\\/],,'` + # A "../" for each directory in $ac_dir_suffix. + ac_top_builddir=`echo "$ac_dir_suffix" | sed 's,/[^\\/]*,../,g'` +else + ac_dir_suffix= ac_top_builddir= +fi + +case $srcdir in + .) # No --srcdir option. We are building in place. + ac_srcdir=. + if test -z "$ac_top_builddir"; then + ac_top_srcdir=. + else + ac_top_srcdir=`echo $ac_top_builddir | sed 's,/$,,'` + fi ;; + [\\/]* | ?:[\\/]* ) # Absolute path. + ac_srcdir=$srcdir$ac_dir_suffix; + ac_top_srcdir=$srcdir ;; + *) # Relative path. + ac_srcdir=$ac_top_builddir$srcdir$ac_dir_suffix + ac_top_srcdir=$ac_top_builddir$srcdir ;; +esac + +# Do not use `cd foo && pwd` to compute absolute paths, because +# the directories may not exist. +case `pwd` in +.) ac_abs_builddir="$ac_dir";; +*) + case "$ac_dir" in + .) ac_abs_builddir=`pwd`;; + [\\/]* | ?:[\\/]* ) ac_abs_builddir="$ac_dir";; + *) ac_abs_builddir=`pwd`/"$ac_dir";; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_builddir=${ac_top_builddir}.;; +*) + case ${ac_top_builddir}. in + .) ac_abs_top_builddir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_builddir=${ac_top_builddir}.;; + *) ac_abs_top_builddir=$ac_abs_builddir/${ac_top_builddir}.;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_srcdir=$ac_srcdir;; +*) + case $ac_srcdir in + .) ac_abs_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_srcdir=$ac_srcdir;; + *) ac_abs_srcdir=$ac_abs_builddir/$ac_srcdir;; + esac;; +esac +case $ac_abs_builddir in +.) ac_abs_top_srcdir=$ac_top_srcdir;; +*) + case $ac_top_srcdir in + .) ac_abs_top_srcdir=$ac_abs_builddir;; + [\\/]* | ?:[\\/]* ) ac_abs_top_srcdir=$ac_top_srcdir;; + *) ac_abs_top_srcdir=$ac_abs_builddir/$ac_top_srcdir;; + esac;; +esac + + + { echo "$as_me:$LINENO: executing $ac_dest commands" >&5 +echo "$as_me: executing $ac_dest commands" >&6;} + case $ac_dest in + depfiles ) test x"$AMDEP_TRUE" != x"" || for mf in $CONFIG_FILES; do + # Strip MF so we end up with the name of the file. + mf=`echo "$mf" | sed -e 's/:.*$//'` + # Check whether this is an Automake generated Makefile or not. + # We used to match only the files named `Makefile.in', but + # some people rename them; so instead we look at the file content. + # Grep'ing the first line is not enough: some people post-process + # each Makefile.in and add a new line on top of each file to say so. + # So let's grep whole file. + if grep '^#.*generated by automake' $mf > /dev/null 2>&1; then + dirpart=`(dirname "$mf") 2>/dev/null || +$as_expr X"$mf" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$mf" : 'X\(//\)[^/]' \| \ + X"$mf" : 'X\(//\)$' \| \ + X"$mf" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$mf" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + else + continue + fi + grep '^DEP_FILES *= *[^ #]' < "$mf" > /dev/null || continue + # Extract the definition of DEP_FILES from the Makefile without + # running `make'. + DEPDIR=`sed -n 's/^DEPDIR = //p' < "$mf"` + test -z "$DEPDIR" && continue + # When using ansi2knr, U may be empty or an underscore; expand it + U=`sed -n 's/^U = //p' < "$mf"` + test -d "$dirpart/$DEPDIR" || mkdir "$dirpart/$DEPDIR" + # We invoke sed twice because it is the simplest approach to + # changing $(DEPDIR) to its actual value in the expansion. + for file in `sed -n ' + /^DEP_FILES = .*\\\\$/ { + s/^DEP_FILES = // + :loop + s/\\\\$// + p + n + /\\\\$/ b loop + p + } + /^DEP_FILES = / s/^DEP_FILES = //p' < "$mf" | \ + sed -e 's/\$(DEPDIR)/'"$DEPDIR"'/g' -e 's/\$U/'"$U"'/g'`; do + # Make sure the directory exists. + test -f "$dirpart/$file" && continue + fdir=`(dirname "$file") 2>/dev/null || +$as_expr X"$file" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$file" : 'X\(//\)[^/]' \| \ + X"$file" : 'X\(//\)$' \| \ + X"$file" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$file" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + { if $as_mkdir_p; then + mkdir -p $dirpart/$fdir + else + as_dir=$dirpart/$fdir + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirpart/$fdir" >&5 +echo "$as_me: error: cannot create directory $dirpart/$fdir" >&2;} + { (exit 1); exit 1; }; }; } + + # echo "creating $dirpart/$file" + echo '# dummy' > "$dirpart/$file" + done +done + ;; + default-1 ) + for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" + POMAKEFILEDEPS="POTFILES.in" + # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend + # on $ac_dir but don't depend on user-specified configuration + # parameters. + if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then + # The LINGUAS file contains the set of available languages. + if test -n "$OBSOLETE_ALL_LINGUAS"; then + test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" + fi + ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"` + # Hide the ALL_LINGUAS assigment from automake. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" + else + # The set of available languages was given in configure.in. + eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' + fi + # Compute POFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) + # Compute UPDATEPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) + # Compute DUMMYPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) + # Compute GMOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + UPDATEPOFILES= + DUMMYPOFILES= + GMOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + done + # CATALOGS depends on both $ac_dir and the user's LINGUAS + # environment variable. + INST_LINGUAS= + if test -n "$ALL_LINGUAS"; then + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "$LINGUAS"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + INST_LINGUAS="$INST_LINGUAS $presentlang" + fi + done + fi + CATALOGS= + if test -n "$INST_LINGUAS"; then + for lang in $INST_LINGUAS; do + CATALOGS="$CATALOGS $lang.gmo" + done + fi + test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" + sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" + for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do + if test -f "$f"; then + case "$f" in + *.orig | *.bak | *~) ;; + *) cat "$f" >> "$ac_dir/Makefile" ;; + esac + fi + done + fi + ;; + esac + done ;; + tests/atconfig ) cat >tests/atconfig <>$CONFIG_STATUS <<\_ACEOF + +{ (exit 0); exit 0; } +_ACEOF +chmod +x $CONFIG_STATUS +ac_clean_files=$ac_clean_files_save + + +# configure is writing to config.log, and then calls config.status. +# config.status does its own redirection, appending to config.log. +# Unfortunately, on DOS this fails, as config.log is still kept open +# by configure, so config.status won't be able to write to it; its +# output is simply discarded. So we exec the FD to /dev/null, +# effectively closing config.log, so it can be properly (re)opened and +# appended to by config.status. When coming back to configure, we +# need to make the FD available again. +if test "$no_create" != yes; then + ac_cs_success=: + ac_config_status_args= + test "$silent" = yes && + ac_config_status_args="$ac_config_status_args --quiet" + exec 5>/dev/null + $SHELL $CONFIG_STATUS $ac_config_status_args || ac_cs_success=false + exec 5>>config.log + # Use ||, not &&, to avoid exiting from the if with $? = 1, which + # would make configure fail if this is the last instruction. + $ac_cs_success || { (exit 1); exit 1; } +fi + diff --git a/src/apps/bin/bison/configure.ac b/src/apps/bin/bison/configure.ac new file mode 100644 index 0000000000..03ec0ec77d --- /dev/null +++ b/src/apps/bin/bison/configure.ac @@ -0,0 +1,125 @@ +# Configure template for GNU Bison. -*-Autoconf-*- +# +# Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +# 02111-1307 USA + +# We need a recent Autoconf to run a recent Autotest. +AC_PREREQ(2.57) + +AC_INIT([GNU Bison], [1.875d], [bug-bison@gnu.org]) +AC_CONFIG_AUX_DIR([config]) +AC_CONFIG_MACRO_DIR([m4]) + +AM_INIT_AUTOMAKE([1.7 check-news readme-alpha dist-bzip2]) +AC_CONFIG_HEADERS([config.h:config.hin]) + +gl_USE_SYSTEM_EXTENSIONS + +# Checks for the compiler. +AC_PROG_CC +AM_PROG_CC_STDC +AC_ARG_ENABLE(gcc-warnings, +[ --enable-gcc-warnings turn on lots of GCC warnings (not recommended)], +[case "${enableval}" in + yes|no) ;; + *) AC_MSG_ERROR([bad value ${enableval} for gcc-warnings option]) ;; + esac], + [enableval=no]) +if test "${enableval}" = yes; then + BISON_WARNING(-Werror) + AC_SUBST([WERROR_CFLAGS], [$WARNING_CFLAGS]) + WARNING_CFLAGS= + BISON_WARNING(-W) + BISON_WARNING(-Wall) + BISON_WARNING(-Wcast-align) + BISON_WARNING(-Wcast-qual) + BISON_WARNING(-Wformat) + BISON_WARNING(-Wwrite-strings) + AC_SUBST([WARNING_CXXFLAGS], [$WARNING_CFLAGS]) + # The following warnings are not suitable for C++. + BISON_WARNING(-Wbad-function-cast) + BISON_WARNING(-Wmissing-declarations) + BISON_WARNING(-Wmissing-prototypes) + BISON_WARNING(-Wnested-externs) + BISON_WARNING(-Wshadow) + BISON_WARNING(-Wstrict-prototypes) + AC_DEFINE([lint], 1, [Define to 1 if the compiler is checking for lint.]) +fi + +AC_ARG_ENABLE([yacc], + [AC_HELP_STRING([--disable-yacc], + [do not build a yacc command or an -ly library])], + , [enable_yacc=yes]) +case $enable_yacc in +yes) + YACC_SCRIPT=yacc + YACC_LIBRARY=liby.a;; +*) + YACC_SCRIPT= + YACC_LIBRARY=;; +esac +AC_SUBST([YACC_SCRIPT]) +AC_SUBST([YACC_LIBRARY]) + +# Checks for programs. +AC_PROG_LEX +AC_PROG_YACC +AC_PROG_RANLIB +BISON_PROG_GNU_M4 +if test x"$ac_cv_prog_gnu_m4" != xyes; then + AC_MSG_ERROR([GNU M4 1.4 is required]) +fi +AC_DEFINE_UNQUOTED([M4], ["$M4"], [Define to the GNU M4 executable name.]) + +# Checks for header files. +AC_CHECK_HEADERS_ONCE([locale.h]) +AM_STDBOOL_H + +# Checks for compiler characteristics. +AC_C_INLINE + +# Checks for types. +AC_CHECK_TYPES([uintptr_t]) + +# Checks for library functions. +AC_CHECK_FUNCS_ONCE([setlocale]) +AM_WITH_DMALLOC +BISON_PREREQ_SUBPIPE +BISON_PREREQ_TIMEVAR + +# gnulib and gettext. +GNULIB_AUTOCONF_SNIPPET +AM_GNU_GETTEXT_VERSION([0.14.1]) + +# Initialize the test suite. +AC_CONFIG_TESTDIR(tests) +AC_CONFIG_FILES([tests/Makefile tests/atlocal]) +AC_CONFIG_FILES([tests/bison], [chmod +x tests/bison]) +AC_CHECK_PROGS([VALGRIND], [valgrind]) +AC_PROG_CXX +AM_MISSING_PROG([AUTOM4TE], [autom4te]) +# Needed by tests/atlocal.in. +AC_SUBST([GCC]) +O0CFLAGS=`echo $CFLAGS | sed 's/-O[0-9] *//'` +AC_SUBST([O0CFLAGS]) + +AC_CONFIG_FILES([Makefile + config/Makefile + po/Makefile.in + data/Makefile + lib/Makefile src/Makefile doc/Makefile]) +AC_OUTPUT diff --git a/src/apps/bin/bison/data/Makefile.am b/src/apps/bin/bison/data/Makefile.am new file mode 100644 index 0000000000..945e45905b --- /dev/null +++ b/src/apps/bin/bison/data/Makefile.am @@ -0,0 +1,21 @@ +## Copyright (C) 2002 Free Software Foundation, Inc. + +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. + +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +## 02111-1307 USA + +dist_pkgdata_DATA = README c.m4 yacc.c lalr1.cc glr.c + +m4sugardir = $(pkgdatadir)/m4sugar +dist_m4sugar_DATA = m4sugar/m4sugar.m4 diff --git a/src/apps/bin/bison/data/Makefile.in b/src/apps/bin/bison/data/Makefile.in new file mode 100644 index 0000000000..8d2b54619b --- /dev/null +++ b/src/apps/bin/bison/data/Makefile.in @@ -0,0 +1,385 @@ +# Makefile.in generated by automake 1.8.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = data +DIST_COMMON = README $(dist_m4sugar_DATA) $(dist_pkgdata_DATA) \ + $(srcdir)/Makefile.am $(srcdir)/Makefile.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/alloca.m4 \ + $(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dmalloc.m4 \ + $(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/error.m4 \ + $(top_srcdir)/m4/exitfail.m4 $(top_srcdir)/m4/extensions.m4 \ + $(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gnulib.m4 $(top_srcdir)/m4/hard-locale.m4 \ + $(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/m4.m4 \ + $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbstate_t.m4 \ + $(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/obstack.m4 $(top_srcdir)/m4/onceonly.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \ + $(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stpcpy.m4 \ + $(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \ + $(top_srcdir)/m4/subpipe.m4 $(top_srcdir)/m4/timevar.m4 \ + $(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/warning.m4 \ + $(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xstrndup.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +am__installdirs = "$(DESTDIR)$(m4sugardir)" "$(DESTDIR)$(pkgdatadir)" +dist_m4sugarDATA_INSTALL = $(INSTALL_DATA) +dist_pkgdataDATA_INSTALL = $(INSTALL_DATA) +DATA = $(dist_m4sugar_DATA) $(dist_pkgdata_DATA) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALLOCA_H = @ALLOCA_H@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOM4TE = @AUTOM4TE@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GCC = @GCC@ +GMSGFMT = @GMSGFMT@ +HAVE__BOOL = @HAVE__BOOL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +O0CFLAGS = @O0CFLAGS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STDBOOL_H = @STDBOOL_H@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VALGRIND = @VALGRIND@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WERROR_CFLAGS = @WERROR_CFLAGS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +YACC_LIBRARY = @YACC_LIBRARY@ +YACC_SCRIPT = @YACC_SCRIPT@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +dist_pkgdata_DATA = README c.m4 yacc.c lalr1.cc glr.c +m4sugardir = $(pkgdatadir)/m4sugar +dist_m4sugar_DATA = m4sugar/m4sugar.m4 +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu data/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu data/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +uninstall-info-am: +install-dist_m4sugarDATA: $(dist_m4sugar_DATA) + @$(NORMAL_INSTALL) + test -z "$(m4sugardir)" || $(mkdir_p) "$(DESTDIR)$(m4sugardir)" + @list='$(dist_m4sugar_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " $(dist_m4sugarDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(m4sugardir)/$$f'"; \ + $(dist_m4sugarDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(m4sugardir)/$$f"; \ + done + +uninstall-dist_m4sugarDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_m4sugar_DATA)'; for p in $$list; do \ + f="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " rm -f '$(DESTDIR)$(m4sugardir)/$$f'"; \ + rm -f "$(DESTDIR)$(m4sugardir)/$$f"; \ + done +install-dist_pkgdataDATA: $(dist_pkgdata_DATA) + @$(NORMAL_INSTALL) + test -z "$(pkgdatadir)" || $(mkdir_p) "$(DESTDIR)$(pkgdatadir)" + @list='$(dist_pkgdata_DATA)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + f="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " $(dist_pkgdataDATA_INSTALL) '$$d$$p' '$(DESTDIR)$(pkgdatadir)/$$f'"; \ + $(dist_pkgdataDATA_INSTALL) "$$d$$p" "$(DESTDIR)$(pkgdatadir)/$$f"; \ + done + +uninstall-dist_pkgdataDATA: + @$(NORMAL_UNINSTALL) + @list='$(dist_pkgdata_DATA)'; for p in $$list; do \ + f="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " rm -f '$(DESTDIR)$(pkgdatadir)/$$f'"; \ + rm -f "$(DESTDIR)$(pkgdatadir)/$$f"; \ + done +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + $(mkdir_p) $(distdir)/m4sugar + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: check-am +all-am: Makefile $(DATA) +installdirs: + for dir in "$(DESTDIR)$(m4sugardir)" "$(DESTDIR)$(pkgdatadir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: install-dist_m4sugarDATA install-dist_pkgdataDATA + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-dist_m4sugarDATA uninstall-dist_pkgdataDATA \ + uninstall-info-am + +.PHONY: all all-am check check-am clean clean-generic distclean \ + distclean-generic distdir dvi dvi-am html html-am info info-am \ + install install-am install-data install-data-am \ + install-dist_m4sugarDATA install-dist_pkgdataDATA install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \ + uninstall-dist_m4sugarDATA uninstall-dist_pkgdataDATA \ + uninstall-info-am + +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/apps/bin/bison/data/README b/src/apps/bin/bison/data/README new file mode 100644 index 0000000000..af5e905a35 --- /dev/null +++ b/src/apps/bin/bison/data/README @@ -0,0 +1,45 @@ +-*- outline -*- + +This directory contains Bison skeletons: the general shapes of the +different parser kinds, that are specialized for specific grammars by +the bison program. + +Currently, there are only three supported skeletons: + +- yacc.c + It used to be named bison.simple: it corresponds to C Yacc + compatible LALR(1) parsers. + +- lalr1.cc + Produces a C++ parser class. It is still very experimental, and not + yet supported. Please, subscribe to bison-patches@gnu.org. + +- glr.c + A Generalized LR C parser based on Bison's LALR(1) tables. + +These skeletons are the only ones supported by the Bison team. +Because the interface between skeletons and the bison program is not +finished, *we are not bound to it*. In particular, Bison is not +mature enough for us to consider that ``foreign skeletons'' are +supported. + +----- + +Copyright (C) 2002 Free Software Foundation, Inc. + +This file is part of GNU Bison. + +GNU Bison is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2, or (at your option) +any later version. + +GNU Bison is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with Bison; see the file COPYING. If not, write to +the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +Boston, MA 02111-1307, USA. diff --git a/src/apps/bin/bison/data/c.m4 b/src/apps/bin/bison/data/c.m4 new file mode 100644 index 0000000000..a72f059a51 --- /dev/null +++ b/src/apps/bin/bison/data/c.m4 @@ -0,0 +1,412 @@ +m4_divert(-1) -*- Autoconf -*- + +# C M4 Macros for Bison. +# Copyright (C) 2002, 2004 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +# 02111-1307 USA + + +## ---------------- ## +## Identification. ## +## ---------------- ## + +# b4_copyright(TITLE, YEARS) +# -------------------------- +m4_define([b4_copyright], +[/* A Bison parser, made by GNU Bison b4_version. */ + +/* $1, + Copyright (C) $2 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */]) + + +# b4_identification +# ----------------- +m4_define([b4_identification], +[/* Identify Bison output. */ +[#]define YYBISON 1 + +/* Skeleton name. */ +[#]define YYSKELETON_NAME b4_skeleton + +/* Pure parsers. */ +[#]define YYPURE b4_pure + +/* Using locations. */ +[#]define YYLSP_NEEDED b4_locations_flag +]) + + + +## ---------------- ## +## Default values. ## +## ---------------- ## + +m4_define_default([b4_epilogue], []) + + + +## ------------------------ ## +## Pure/impure interfaces. ## +## ------------------------ ## + + +# b4_user_args +# ------------ +m4_define([b4_user_args], +[m4_ifset([b4_parse_param], [, b4_c_args(b4_parse_param)])]) + + +# b4_parse_param +# -------------- +# If defined, b4_parse_param arrives double quoted, but below we prefer +# it to be single quoted. +m4_define_default([b4_parse_param]) +m4_define([b4_parse_param], +b4_parse_param)) + + + +## ------------ ## +## Data Types. ## +## ------------ ## + + +# b4_ints_in(INT1, INT2, LOW, HIGH) +# --------------------------------- +# Return 1 iff both INT1 and INT2 are in [LOW, HIGH], 0 otherwise. +m4_define([b4_ints_in], +[m4_eval([$3 <= $1 && $1 <= $4 && $3 <= $2 && $2 <= $4])]) + + +# b4_int_type(MIN, MAX) +# --------------------- +# Return the smallest int type able to handle numbers ranging from +# MIN to MAX (included). +m4_define([b4_int_type], +[m4_if(b4_ints_in($@, [0], [255]), [1], [unsigned char], + b4_ints_in($@, [-128], [127]), [1], [signed char], + + b4_ints_in($@, [0], [65535]), [1], [unsigned short int], + b4_ints_in($@, [-32768], [32767]), [1], [short int], + + m4_eval([0 <= $1]), [1], [unsigned int], + + [int])]) + + +# b4_int_type_for(NAME) +# --------------------- +# Return the smallest int type able to handle numbers ranging from +# `NAME_min' to `NAME_max' (included). +m4_define([b4_int_type_for], +[b4_int_type($1_min, $1_max)]) + + +## ------------------ ## +## Decoding options. ## +## ------------------ ## + + +# b4_location_if(IF-TRUE, IF-FALSE) +# --------------------------------- +# Expand IF-TRUE, if locations are used, IF-FALSE otherwise. +m4_define([b4_location_if], +[m4_if(b4_locations_flag, [1], + [$1], + [$2])]) + + +# b4_pure_if(IF-TRUE, IF-FALSE) +# ----------------------------- +# Expand IF-TRUE, if %pure-parser, IF-FALSE otherwise. +m4_define([b4_pure_if], +[m4_if(b4_pure, [1], + [$1], + [$2])]) + + + +## ------------------------- ## +## Assigning token numbers. ## +## ------------------------- ## + +# b4_token_define(TOKEN-NAME, TOKEN-NUMBER) +# ----------------------------------------- +# Output the definition of this token as #define. +m4_define([b4_token_define], +[#define $1 $2 +]) + + +# b4_token_enum(TOKEN-NAME, TOKEN-NUMBER) +# --------------------------------------- +# Output the definition of this token as an enum. +m4_define([b4_token_enum], +[$1 = $2]) + + +# b4_token_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER) +# ------------------------------------------------------- +# Output the definition of the tokens (if there are) as enums and #define. +m4_define([b4_token_defines], +[m4_if([$@], [[]], [], +[/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { +m4_map_sep([ b4_token_enum], [, +], + [$@]) + }; +#endif +m4_map([b4_token_define], [$@]) +]) +]) + + + +## --------------------------------------------- ## +## Defining C functions in both K&R and ANSI-C. ## +## --------------------------------------------- ## + + +# b4_c_function_def(NAME, RETURN-VALUE, [DECL1, NAME1], ...) +# ---------------------------------------------------------- +# Declare the function NAME. +m4_define([b4_c_function_def], +[#if defined (__STDC__) || defined (__cplusplus) +b4_c_ansi_function_def($@) +#else +$2 +$1 (b4_c_knr_formal_names(m4_shiftn(2, $@))) +b4_c_knr_formal_decls(m4_shiftn(2, $@)) +#endif[]dnl +]) + + +# b4_c_ansi_function_def(NAME, RETURN-VALUE, [DECL1, NAME1], ...) +# --------------------------------------------------------------- +# Declare the function NAME in ANSI. +m4_define([b4_c_ansi_function_def], +[$2 +$1 (b4_c_ansi_formals(m4_shiftn(2, $@)))[]dnl +]) + + +# b4_c_ansi_formals([DECL1, NAME1], ...) +# -------------------------------------- +# Output the arguments ANSI-C definition. +m4_define([b4_c_ansi_formals], +[m4_case([$@], + [], [void], + [[]], [void], + [m4_map_sep([b4_c_ansi_formal], [, ], [$@])])]) + +m4_define([b4_c_ansi_formal], +[$1]) + + +# b4_c_knr_formal_names([DECL1, NAME1], ...) +# ------------------------------------------ +# Output the argument names. +m4_define([b4_c_knr_formal_names], +[m4_map_sep([b4_c_knr_formal_name], [, ], [$@])]) + +m4_define([b4_c_knr_formal_name], +[$2]) + + +# b4_c_knr_formal_decls([DECL1, NAME1], ...) +# ------------------------------------------ +# Output the K&R argument declarations. +m4_define([b4_c_knr_formal_decls], +[m4_map_sep([b4_c_knr_formal_decl], + [ +], + [$@])]) + +m4_define([b4_c_knr_formal_decl], +[ $1;]) + + + +## ------------------------------------------------------------ ## +## Declaring (prototyping) C functions in both K&R and ANSI-C. ## +## ------------------------------------------------------------ ## + + +# b4_c_function_decl(NAME, RETURN-VALUE, [DECL1, NAME1], ...) +# ----------------------------------------------------------- +# Declare the function NAME. +m4_define([b4_c_function_decl], +[#if defined (__STDC__) || defined (__cplusplus) +b4_c_ansi_function_decl($@) +#else +$2 $1 (); +#endif[]dnl +]) + + +# b4_c_ansi_function_decl(NAME, RETURN-VALUE, [DECL1, NAME1], ...) +# ---------------------------------------------------------------- +# Declare the function NAME. +m4_define([b4_c_ansi_function_decl], +[$2 $1 (b4_c_ansi_formals(m4_shiftn(2, $@)));[]dnl +]) + + + + +## --------------------- ## +## Calling C functions. ## +## --------------------- ## + + +# b4_c_function_call(NAME, RETURN-VALUE, [DECL1, NAME1], ...) +# ----------------------------------------------------------- +# Call the function NAME with arguments NAME1, NAME2 etc. +m4_define([b4_c_function_call], +[$1 (b4_c_args(m4_shiftn(2, $@)))[]dnl +]) + + +# b4_c_args([DECL1, NAME1], ...) +# ------------------------------ +# Output the arguments NAME1, NAME2... +m4_define([b4_c_args], +[m4_map_sep([b4_c_arg], [, ], [$@])]) + +m4_define([b4_c_arg], +[$2]) + + +## ----------- ## +## Synclines. ## +## ----------- ## + + +# b4_syncline(LINE, FILE) +# ----------------------- +m4_define([b4_syncline], +[m4_if(b4_synclines_flag, 1, + [[#]line $1 $2])]) + + +# b4_symbol_actions(FILENAME, LINENO, +# SYMBOL-TAG, SYMBOL-NUM, +# SYMBOL-ACTION, SYMBOL-TYPENAME) +# ------------------------------------------------- +m4_define([b4_symbol_actions], +[m4_pushdef([b4_dollar_dollar], [yyvaluep->$6])dnl +m4_pushdef([b4_at_dollar], [(*yylocationp)])dnl + case $4: /* $3 */ +b4_syncline([$2], [$1]) + $5; +b4_syncline([@oline@], [@ofile@]) + break; +m4_popdef([b4_at_dollar])dnl +m4_popdef([b4_dollar_dollar])dnl +]) + + +# b4_yydestruct_generate(FUNCTION-DECLARATOR) +# ------------------------------------------- +# Generate the "yydestruct" function, which declaration is issued using +# FUNCTION-DECLARATOR, which may be "b4_c_ansi_function_def" for ISO C +# or "b4_c_function_def" for K&R. +m4_define([b4_yydestruct_generate], +[[/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +]$1([yydestruct], + [static void], + [[int yytype], [yytype]], + [[YYSTYPE *yyvaluep], [yyvaluep]]b4_location_if([, + [[YYLTYPE *yylocationp], [yylocationp]]]))[ +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; +]b4_location_if([ (void) yylocationp; +])[ + switch (yytype) + { +]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[ + default: + break; + } +}]dnl +]) + + +# b4_yysymprint_generate(FUNCTION-DECLARATOR) +# ------------------------------------------- +# Generate the "yysymprint" function, which declaration is issued using +# FUNCTION-DECLARATOR, which may be "b4_c_ansi_function_def" for ISO C +# or "b4_c_function_def" for K&R. +m4_define([b4_yysymprint_generate], +[[/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +]$1([yysymprint], + [static void], + [[FILE *yyoutput], [yyoutput]], + [[int yytype], [yytype]], + [[YYSTYPE *yyvaluep], [yyvaluep]]b4_location_if([, + [[YYLTYPE *yylocationp], [yylocationp]]])) +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; +b4_location_if([ (void) yylocationp; +])dnl + + if (yytype < YYNTOKENS) + { + YYFPRINTF (yyoutput, "token %s (", yytname[[yytype]]); +# ifdef YYPRINT + YYPRINT (yyoutput, yytoknum[[yytype]], *yyvaluep); +# endif + } + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[[yytype]]); + + switch (yytype) + { +m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl + default: + break; + } + YYFPRINTF (yyoutput, ")"); +} +]) diff --git a/src/apps/bin/bison/data/glr.c b/src/apps/bin/bison/data/glr.c new file mode 100644 index 0000000000..a77a985703 --- /dev/null +++ b/src/apps/bin/bison/data/glr.c @@ -0,0 +1,2043 @@ +m4_divert(-1) -*- C -*- + +# GLR skeleton for Bison +# Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +# 02111-1307 USA + + +## ---------------- ## +## Default values. ## +## ---------------- ## + +# Stack parameters. +m4_define_default([b4_stack_depth_max], [10000]) +m4_define_default([b4_stack_depth_init], [200]) + + + +## ------------------------ ## +## Pure/impure interfaces. ## +## ------------------------ ## + + +# b4_lex_param +# ------------ +# Accumule in b4_lex_param all the yylex arguments. +# Yes, this is quite ugly... +m4_define([b4_lex_param], +m4_dquote(b4_pure_if([[[[YYSTYPE *]], [[yylvalp]]][]dnl +b4_location_if([, [[YYLTYPE *], [yyllocp]]])])dnl +m4_ifdef([b4_lex_param], [, ]b4_lex_param))) + + +# b4_user_formals +# --------------- +m4_define([b4_user_formals], +[m4_ifset([b4_parse_param], [, b4_c_ansi_formals(b4_parse_param)])]) + + +# b4_yyerror_args +# --------------- +# Arguments passed to yyerror: user args plus yylloc. +m4_define([b4_yyerror_args], +[b4_pure_if([b4_location_if([yylocp, ])])dnl +m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])]) + + +# b4_lyyerror_args +# ---------------- +# Same as above, but on the lookahead, hence yyllocp instead of yylocp. +m4_define([b4_lyyerror_args], +[b4_pure_if([b4_location_if([yyllocp, ])])dnl +m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])]) + + +# b4_pure_args +# ------------ +# Arguments needed by yyerror: user args plus yylloc. +m4_define([b4_pure_args], +[b4_pure_if([b4_location_if([, yylocp])])[]b4_user_args]) + + +# b4_pure_formals +# --------------- +# Arguments passed to yyerror: user formals plus yyllocp. +m4_define([b4_pure_formals], +[b4_pure_if([b4_location_if([, YYLTYPE *yylocp])])[]b4_user_formals]) + + +# b4_lpure_args +# ------------- +# Same as above, but on the lookahead, hence yyllocp instead of yylocp. +m4_define([b4_lpure_args], +[b4_pure_if([b4_location_if([, yyllocp])])[]b4_user_args]) + + +# b4_lpure_formals +# ---------------- +# Same as above, but on the lookahead, hence yyllocp instead of yylocp. +m4_define([b4_lpure_formals], +[b4_pure_if([b4_location_if([YYLTYPE *yyllocp])])[]b4_user_formals]) + + +## ----------------- ## +## Semantic Values. ## +## ----------------- ## + + +# b4_lhs_value([TYPE]) +# -------------------- +# Expansion of $$. +m4_define([b4_lhs_value], +[(*yyvalp)[]m4_ifval([$1], [.$1])]) + + +# b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) +# -------------------------------------- +# Expansion of $NUM, where the current rule has RULE-LENGTH +# symbols on RHS. +m4_define([b4_rhs_value], +[((yyGLRStackItem const *)yyvsp)@{YYFILL (m4_eval([$2 - $1]))@}.yystate.yysemantics.yysval[]m4_ifval([$3], [.$3])]) + + + +## ----------- ## +## Locations. ## +## ----------- ## + +# b4_lhs_location() +# ----------------- +# Expansion of @$. +m4_define([b4_lhs_location], +[(*yylocp)]) + + +# b4_rhs_location(RULE-LENGTH, NUM) +# --------------------------------- +# Expansion of @NUM, where the current rule has RULE-LENGTH symbols +# on RHS. +m4_define([b4_rhs_location], +[((yyGLRStackItem const *)yyvsp)@{YYFILL (m4_eval([$2 - $1]))@}.yystate.yyloc]) + +# We do want M4 expansion after # for CPP macros. +m4_changecom() +m4_divert(0)dnl +@output @output_parser_name@ +b4_copyright([Skeleton parser for GLR parsing with Bison], [2002, 2003, 2004]) +[ +/* This is the parser code for GLR (Generalized LR) parser. */ + +#include +#include +#include +#include +#include + +]b4_identification +m4_if(b4_prefix[], [yy], [], +[/* If NAME_PREFIX is specified substitute the variables and functions + names. */ +#define yyparse b4_prefix[]parse +#define yylex b4_prefix[]lex +#define yyerror b4_prefix[]error +#define yylval b4_prefix[]lval +#define yychar b4_prefix[]char +#define yydebug b4_prefix[]debug +#define yynerrs b4_prefix[]nerrs +b4_location_if([#define yylloc b4_prefix[]lloc])]) + +b4_token_defines(b4_tokens) + +/* Copy the first part of user declarations. */ +b4_pre_prologue[ + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG ]b4_debug[ +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE ]b4_error_verbose[ +#endif + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +]m4_ifdef([b4_stype], +[b4_syncline([b4_stype_line], [b4_filename]) +typedef union m4_bregexp(b4_stype, [^{], [YYSTYPE ])b4_stype YYSTYPE; +/* Line __line__ of glr.c. */ +b4_syncline([@oline@], [@ofile@])], +[typedef int YYSTYPE;])[ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + +#if ! defined (YYLTYPE) && ! defined (YYLTYPE_IS_DECLARED) +typedef struct YYLTYPE +{ +]b4_location_if([ + int first_line; + int first_column; + int last_line; + int last_column; +],[ + char yydummy; +])[ +} YYLTYPE; +# define YYLTYPE_IS_DECLARED 1 +# define YYLTYPE_IS_TRIVIAL 1 +#endif + +/* Default (constant) values used for initialization for null + right-hand sides. Unlike the standard yacc.c template, + here we set the default values of $$ and $@@ to zeroed-out + values. Since the default value of these quantities is undefined, + this behavior is technically correct. */ +static YYSTYPE yyval_default; +static YYLTYPE yyloc_default; + +/* Copy the second part of user declarations. */ +]b4_post_prologue[ + +]/* Line __line__ of glr.c. */ +b4_syncline([@oline@], [@ofile@]) +[ +#ifndef YYFREE +# define YYFREE free +#endif +#ifndef YYMALLOC +# define YYMALLOC malloc +#endif +#ifndef YYREALLOC +# define YYREALLOC realloc +#endif + +#ifdef __cplusplus + typedef bool yybool; +#else + typedef unsigned char yybool; +#endif +#define yytrue 1 +#define yyfalse 0 + +/*-----------------. +| GCC extensions. | +`-----------------*/ + +#ifndef __attribute__ +/* This feature is available in gcc versions 2.5 and later. */ +# if !defined (__GNUC__) || __GNUC__ < 2 || \ +(__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ +# define __attribute__(Spec) /* empty */ +# endif +#endif + +#ifndef YYASSERT +# define YYASSERT(condition) ((void) ((condition) || (abort (), 0))) +#endif + +#ifndef ATTRIBUTE_UNUSED +# define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL ]b4_final_state_number[ +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST ]b4_last[ + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS ]b4_tokens_number[ +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS ]b4_nterms_number[ +/* YYNRULES -- Number of rules. */ +#define YYNRULES ]b4_rules_number[ +/* YYNRULES -- Number of states. */ +#define YYNSTATES ]b4_states_number[ +/* YYMAXRHS -- Maximum number of symbols on right-hand side of rule. */ +#define YYMAXRHS ]b4_r2_max[ +/* YYMAXLEFT -- Maximum number of symbols to the left of a handle + accessed by $0, $-1, etc., in any rule. */ +#define YYMAXLEFT ]b4_max_left_semantic_context[ + +/* YYTRANSLATE(X) -- Bison symbol number corresponding to X. */ +#define YYUNDEFTOK ]b4_undef_token_number[ +#define YYMAXUTOK ]b4_user_token_number_max[ + +#define YYTRANSLATE(YYX) \ + ((YYX <= 0) ? YYEOF : \ + (unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const ]b4_int_type_for([b4_translate])[ yytranslate[] = +{ + ]b4_translate[ +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const ]b4_int_type_for([b4_prhs])[ yyprhs[] = +{ + ]b4_prhs[ +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const ]b4_int_type_for([b4_rhs])[ yyrhs[] = +{ + ]b4_rhs[ +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const ]b4_int_type_for([b4_rline])[ yyrline[] = +{ + ]b4_rline[ +}; +#endif + +#if (YYDEBUG) || YYERROR_VERBOSE +/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + ]b4_tname[ +}; +#endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const ]b4_int_type_for([b4_r1])[ yyr1[] = +{ + ]b4_r1[ +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const ]b4_int_type_for([b4_r2])[ yyr2[] = +{ + ]b4_r2[ +}; + +/* YYDPREC[RULE-NUM] -- Dynamic precedence of rule #RULE-NUM (0 if none). */ +static const ]b4_int_type_for([b4_dprec])[ yydprec[] = +{ + ]b4_dprec[ +}; + +/* YYMERGER[RULE-NUM] -- Index of merging function for rule #RULE-NUM. */ +static const ]b4_int_type_for([b4_merger])[ yymerger[] = +{ + ]b4_merger[ +}; + +/* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE + doesn't specify something else to do. Zero means the default is an + error. */ +static const ]b4_int_type_for([b4_defact])[ yydefact[] = +{ + ]b4_defact[ +}; + +/* YYPDEFGOTO[NTERM-NUM]. */ +static const ]b4_int_type_for([b4_defgoto])[ yydefgoto[] = +{ + ]b4_defgoto[ +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF ]b4_pact_ninf[ +static const ]b4_int_type_for([b4_pact])[ yypact[] = +{ + ]b4_pact[ +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const ]b4_int_type_for([b4_pgoto])[ yypgoto[] = +{ + ]b4_pgoto[ +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF ]b4_table_ninf[ +static const ]b4_int_type_for([b4_table])[ yytable[] = +{ + ]b4_table[ +}; + +/* YYCONFLP[YYPACT[STATE-NUM]] -- Pointer into YYCONFL of start of + list of conflicting reductions corresponding to action entry for + state STATE-NUM in yytable. 0 means no conflicts. The list in + yyconfl is terminated by a rule number of 0. */ +static const ]b4_int_type_for([b4_conflict_list_heads])[ yyconflp[] = +{ + ]b4_conflict_list_heads[ +}; + +/* YYCONFL[I] -- lists of conflicting rule numbers, each terminated by + 0, pointed into by YYCONFLP. */ +]dnl Do not use b4_int_type_for here, since there are places where +dnl pointers onto yyconfl are taken, which type is "short int *". +dnl We probably ought to introduce a type for confl. +[static const short int yyconfl[] = +{ + ]b4_conflicting_rules[ +}; + +static const ]b4_int_type_for([b4_check])[ yycheck[] = +{ + ]b4_check[ +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const ]b4_int_type_for([b4_stos])[ yystos[] = +{ + ]b4_stos[ +}; + + +/* Prevent warning if -Wmissing-prototypes. */ +]b4_c_ansi_function_decl([yyparse], [int], b4_parse_param)[ + +/* Error token number */ +#define YYTERROR 1 + +/* YYLLOC_DEFAULT -- Compute the default location (before the actions + are run). */ + +]b4_location_if([[ +#define YYRHSLOC(yyRhs,YYK) ((yyRhs)[YYK].yystate.yyloc) + +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN) \ + ((yyCurrent).first_line = YYRHSLOC(yyRhs, 1).first_line, \ + (yyCurrent).first_column = YYRHSLOC(yyRhs, 1).first_column, \ + (yyCurrent).last_line = YYRHSLOC(yyRhs, YYN).last_line, \ + (yyCurrent).last_column = YYRHSLOC(yyRhs, YYN).last_column) +#endif +]],[ +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN) ((void) 0) +#endif +])[ + + +/* YYLEX -- calling `yylex' with the right arguments. */ +#define YYLEX ]b4_c_function_call([yylex], [int], b4_lex_param)[ + +]b4_pure_if( +[ +#undef yynerrs +#define yynerrs (yystack->yyerrcnt) +#undef yychar +#define yychar (yystack->yyrawchar)], +[YYSTYPE yylval; + +YYLTYPE yylloc; + +int yynerrs; +int yychar;])[ + +static const int YYEOF = 0; +static const int YYEMPTY = -2; + +typedef enum { yyok, yyaccept, yyabort, yyerr } YYRESULTTAG; + +#define YYCHK(YYE) \ + do { YYRESULTTAG yyflag = YYE; if (yyflag != yyok) return yyflag; } \ + while (0) + +#if YYDEBUG + +#if ! defined (YYFPRINTF) +# define YYFPRINTF fprintf +#endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +]b4_yysymprint_generate([b4_c_ansi_function_def])[ + +# define YYDSYMPRINT(Args) \ +do { \ + if (yydebug) \ + yysymprint Args; \ +} while (0) + +# define YYDSYMPRINTF(Title, Token, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yysymprint (stderr, \ + Token, Value]b4_location_if([, Location])[); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; + +#else /* !YYDEBUG */ + + /* Avoid empty `if' bodies. */ +# define YYDPRINTF(Args) +# define YYDSYMPRINT(Args) +# define YYDSYMPRINTF(Title, Token, Value, Location) + +#endif /* !YYDEBUG */ + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH ]b4_stack_depth_init[ +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + SIZE_MAX < YYMAXDEPTH * sizeof (GLRStackItem) + evaluated with infinite-precision integer arithmetic. */ + +#if YYMAXDEPTH == 0 +# undef YYMAXDEPTH +#endif + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH ]b4_stack_depth_max[ +#endif + +/* Minimum number of free items on the stack allowed after an + allocation. This is to allow allocation and initialization + to be completed by functions that call expandGLRStack before the + stack is expanded, thus insuring that all necessary pointers get + properly redirected to new data. */ +#define YYHEADROOM 2 + +#if (! defined (YYSTACKEXPANDABLE) \ + && (! defined (__cplusplus) \ + || (]b4_location_if([[defined (YYLTYPE_IS_TRIVIAL) && YYLTYPE_IS_TRIVIAL \ + && ]])[defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL))) +#define YYSTACKEXPANDABLE 1 +#else +#define YYSTACKEXPANDABLE 0 +#endif + +/** State numbers, as in LALR(1) machine */ +typedef int yyStateNum; + +/** Rule numbers, as in LALR(1) machine */ +typedef int yyRuleNum; + +/** Grammar symbol */ +typedef short int yySymbol; + +/** Item references, as in LALR(1) machine */ +typedef short int yyItemNum; + +typedef struct yyGLRState yyGLRState; +typedef struct yySemanticOption yySemanticOption; +typedef union yyGLRStackItem yyGLRStackItem; +typedef struct yyGLRStack yyGLRStack; +typedef struct yyGLRStateSet yyGLRStateSet; + +struct yyGLRState { + yybool yyisState; + yybool yyresolved; + yyStateNum yylrState; + yyGLRState* yypred; + size_t yyposn; + union { + yySemanticOption* yyfirstVal; + YYSTYPE yysval; + } yysemantics; + YYLTYPE yyloc; +}; + +struct yyGLRStateSet { + yyGLRState** yystates; + size_t yysize, yycapacity; +}; + +struct yySemanticOption { + yybool yyisState; + yyRuleNum yyrule; + yyGLRState* yystate; + yySemanticOption* yynext; +}; + +union yyGLRStackItem { + yyGLRState yystate; + yySemanticOption yyoption; +}; + +struct yyGLRStack { + int yyerrflag; + int yyerrState; +]b4_pure_if( +[ + int yyerrcnt; + int yyrawchar; +])[ + yySymbol* yytokenp; + jmp_buf yyexception_buffer; + yyGLRStackItem* yyitems; + yyGLRStackItem* yynextFree; + int yyspaceLeft; + yyGLRState* yysplitPoint; + yyGLRState* yylastDeleted; + yyGLRStateSet yytops; +}; + +static void yyinitGLRStack (yyGLRStack* yystack, size_t yysize); +static void yyexpandGLRStack (yyGLRStack* yystack]b4_pure_formals[); +static void yyfreeGLRStack (yyGLRStack* yystack); + +static void +yyFail (yyGLRStack* yystack]b4_pure_formals[, const char* yyformat, ...) +{ + yystack->yyerrflag = 1; + if (yyformat != NULL) + { + char yymsg[256]; + va_list yyap; + va_start (yyap, yyformat); + vsprintf (yymsg, yyformat, yyap); + yyerror (]b4_yyerror_args[yymsg); + } + longjmp (yystack->yyexception_buffer, 1); +} + +#if YYDEBUG || YYERROR_VERBOSE +/** A printable representation of TOKEN. Valid until next call to + * tokenName. */ +static inline const char* +yytokenName (yySymbol yytoken) +{ + if (yytoken == YYEMPTY) + return ""; + + return yytname[yytoken]; +} +#endif + +/** Fill in YYVSP[YYLOW1 .. YYLOW0-1] from the chain of states starting + * at YYVSP[YYLOW0].yystate.yypred. Leaves YYVSP[YYLOW1].yystate.yypred + * containing the pointer to the next state in the chain. Assumes + * YYLOW1 < YYLOW0. */ +static void yyfillin (yyGLRStackItem *, int, int) ATTRIBUTE_UNUSED; +static void +yyfillin (yyGLRStackItem *yyvsp, int yylow0, int yylow1) +{ + yyGLRState* s; + int i; + s = yyvsp[yylow0].yystate.yypred; + for (i = yylow0-1; i >= yylow1; i -= 1) + { + YYASSERT (s->yyresolved); + yyvsp[i].yystate.yyresolved = yytrue; + yyvsp[i].yystate.yysemantics.yysval = s->yysemantics.yysval; + yyvsp[i].yystate.yyloc = s->yyloc; + s = yyvsp[i].yystate.yypred = s->yypred; + } +} + +/* Do nothing if YYNORMAL or if *YYLOW <= YYLOW1. Otherwise, fill in + YYVSP[YYLOW1 .. *YYLOW-1] as in yyfillin and set *YYLOW = YYLOW1. + For convenience, always return YYLOW1. */ +static inline int yyfill (yyGLRStackItem *, int *, int, yybool) + ATTRIBUTE_UNUSED; +static inline int +yyfill (yyGLRStackItem *yyvsp, int *yylow, int yylow1, yybool yynormal) +{ + if (!yynormal && yylow1 < *yylow) + { + yyfillin (yyvsp, *yylow, yylow1); + *yylow = yylow1; + } + return yylow1; +} + +/** Perform user action for rule number YYN, with RHS length YYRHSLEN, + * and top stack item YYVSP. YYLVALP points to place to put semantic + * value ($$), and yylocp points to place for location information + * (@@$). Returns yyok for normal return, yyaccept for YYACCEPT, + * yyerr for YYERROR, yyabort for YYABORT. */ +static YYRESULTTAG +yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp, + YYSTYPE* yyvalp, YYLTYPE* yylocp, yyGLRStack* yystack + ]b4_user_formals[) +{ + yybool yynormal ATTRIBUTE_UNUSED = (yystack->yysplitPoint == NULL); + int yylow; + +# undef yyerrok +# define yyerrok (yystack->yyerrState = 0) +# undef YYACCEPT +# define YYACCEPT return yyaccept +# undef YYABORT +# define YYABORT return yyabort +# undef YYERROR +# define YYERROR return yyerrok, yyerr +# undef YYRECOVERING +# define YYRECOVERING (yystack->yyerrState != 0) +# undef yyclearin +# define yyclearin (yychar = *(yystack->yytokenp) = YYEMPTY) +# undef YYFILL +# define YYFILL(N) yyfill (yyvsp, &yylow, N, yynormal) +# undef YYBACKUP +# define YYBACKUP(Token, Value) \ + return yyerror (]b4_yyerror_args["syntax error: cannot back up"), \ + yyerrok, yyerr + + yylow = 1; + if (yyrhslen == 0) + { + *yyvalp = yyval_default; + *yylocp = yyloc_default; + } + else + { + *yyvalp = yyvsp[YYFILL (1-yyrhslen)].yystate.yysemantics.yysval; + YYLLOC_DEFAULT (*yylocp, yyvsp - yyrhslen, yyrhslen); + } + +] + switch (yyn) + { + b4_actions + } + + return yyok; +# undef yyerrok +# undef YYABORT +# undef YYACCEPT +# undef YYERROR +# undef YYBACKUP +# undef yyclearin +# undef YYRECOVERING +/* Line __line__ of glr.c. */ +b4_syncline([@oline@], [@ofile@]) +} + + +static void +yyuserMerge (int yyn, YYSTYPE* yy0, YYSTYPE* yy1) +{ + /* `Use' the arguments. */ + (void) yy0; + (void) yy1; + + switch (yyn) + { + b4_mergers + } +} +[ + /* Bison grammar-table manipulation. */ + +]b4_yydestruct_generate([b4_c_ansi_function_def])[ + +/** Number of symbols composing the right hand side of rule #RULE. */ +static inline int +yyrhsLength (yyRuleNum yyrule) +{ + return yyr2[yyrule]; +} + +/** Left-hand-side symbol for rule #RULE. */ +static inline yySymbol +yylhsNonterm (yyRuleNum yyrule) +{ + return yyr1[yyrule]; +} + +#define yyis_pact_ninf(yystate) \ + ]m4_if(m4_eval(b4_pact_ninf < b4_pact_min), 1, + 0, + ((yystate) == YYPACT_NINF))[ + +/** True iff LR state STATE has only a default reduction (regardless + * of token). */ +static inline yybool +yyisDefaultedState (yyStateNum yystate) +{ + return yyis_pact_ninf (yypact[yystate]); +} + +/** The default reduction for STATE, assuming it has one. */ +static inline yyRuleNum +yydefaultAction (yyStateNum yystate) +{ + return yydefact[yystate]; +} + +#define yyis_table_ninf(yytable_value) \ + ]m4_if(m4_eval(b4_table_ninf < b4_table_min), 1, + 0, + ((yytable_value) == YYTABLE_NINF))[ + +/** Set *YYACTION to the action to take in YYSTATE on seeing YYTOKEN. + * Result R means + * R < 0: Reduce on rule -R. + * R = 0: Error. + * R > 0: Shift to state R. + * Set *CONFLICTS to a pointer into yyconfl to 0-terminated list of + * conflicting reductions. + */ +static inline void +yygetLRActions (yyStateNum yystate, int yytoken, + int* yyaction, const short int** yyconflicts) +{ + int yyindex = yypact[yystate] + yytoken; + if (yyindex < 0 || YYLAST < yyindex || yycheck[yyindex] != yytoken) + { + *yyaction = -yydefact[yystate]; + *yyconflicts = yyconfl; + } + else if (! yyis_table_ninf (yytable[yyindex])) + { + *yyaction = yytable[yyindex]; + *yyconflicts = yyconfl + yyconflp[yyindex]; + } + else + { + *yyaction = 0; + *yyconflicts = yyconfl + yyconflp[yyindex]; + } +} + +static inline yyStateNum +yyLRgotoState (yyStateNum yystate, yySymbol yylhs) +{ + int yyr; + yyr = yypgoto[yylhs - YYNTOKENS] + yystate; + if (0 <= yyr && yyr <= YYLAST && yycheck[yyr] == yystate) + return yytable[yyr]; + else + return yydefgoto[yylhs - YYNTOKENS]; +} + +static inline yybool +yyisShiftAction (int yyaction) +{ + return 0 < yyaction; +} + +static inline yybool +yyisErrorAction (int yyaction) +{ + return yyaction == 0; +} + + /* GLRStates */ + +static void +yyaddDeferredAction (yyGLRStack* yystack, yyGLRState* yystate, + yyGLRState* rhs, yyRuleNum yyrule]b4_pure_formals[) +{ + yySemanticOption* yynewItem; + yynewItem = &yystack->yynextFree->yyoption; + yystack->yyspaceLeft -= 1; + yystack->yynextFree += 1; + yynewItem->yyisState = yyfalse; + yynewItem->yystate = rhs; + yynewItem->yyrule = yyrule; + yynewItem->yynext = yystate->yysemantics.yyfirstVal; + yystate->yysemantics.yyfirstVal = yynewItem; + if (yystack->yyspaceLeft < YYHEADROOM) + yyexpandGLRStack (yystack]b4_pure_args[); +} + + /* GLRStacks */ + +/** Initialize SET to a singleton set containing an empty stack. */ +static void +yyinitStateSet (yyGLRStateSet* yyset) +{ + yyset->yysize = 1; + yyset->yycapacity = 16; + yyset->yystates = (yyGLRState**) YYMALLOC (16 * sizeof yyset->yystates[0]); + yyset->yystates[0] = NULL; +} + +static void yyfreeStateSet (yyGLRStateSet* yyset) +{ + YYFREE (yyset->yystates); +} + +/** Initialize STACK to a single empty stack, with total maximum + * capacity for all stacks of SIZE. */ +static void +yyinitGLRStack (yyGLRStack* yystack, size_t yysize) +{ + yystack->yyerrflag = 0; + yystack->yyerrState = 0; + yynerrs = 0; + yystack->yyspaceLeft = yysize; + yystack->yynextFree = yystack->yyitems = + (yyGLRStackItem*) YYMALLOC (yysize * sizeof yystack->yynextFree[0]); + yystack->yysplitPoint = NULL; + yystack->yylastDeleted = NULL; + yyinitStateSet (&yystack->yytops); +} + +#define YYRELOC(YYFROMITEMS,YYTOITEMS,YYX,YYTYPE) \ + &((YYTOITEMS) - ((YYFROMITEMS) - (yyGLRStackItem*) (YYX)))->YYTYPE + +/** If STACK is expandable, extend it. WARNING: Pointers into the + stack from outside should be considered invalid after this call. + We always expand when there are 1 or fewer items left AFTER an + allocation, so that we can avoid having external pointers exist + across an allocation. */ +static void +yyexpandGLRStack (yyGLRStack* yystack]b4_pure_formals[) +{ +#if YYSTACKEXPANDABLE + yyGLRStack yynewStack; + yyGLRStackItem* yyp0, *yyp1; + size_t yysize, yynewSize; + size_t yyn; + yysize = yystack->yynextFree - yystack->yyitems; + if (YYMAXDEPTH <= yysize) + yyFail (yystack][]b4_pure_args[, "parser stack overflow"); + yynewSize = 2*yysize; + if (YYMAXDEPTH < yynewSize) + yynewSize = YYMAXDEPTH; + yyinitGLRStack (&yynewStack, yynewSize); + for (yyp0 = yystack->yyitems, yyp1 = yynewStack.yyitems, yyn = yysize; + 0 < yyn; + yyn -= 1, yyp0 += 1, yyp1 += 1) + { + *yyp1 = *yyp0; + if (*(yybool *) yyp0) + { + yyGLRState* yys0 = &yyp0->yystate; + yyGLRState* yys1 = &yyp1->yystate; + if (yys0->yypred != NULL) + yys1->yypred = + YYRELOC (yyp0, yyp1, yys0->yypred, yystate); + if (! yys0->yyresolved && yys0->yysemantics.yyfirstVal != NULL) + yys1->yysemantics.yyfirstVal = + YYRELOC(yyp0, yyp1, yys0->yysemantics.yyfirstVal, yyoption); + } + else + { + yySemanticOption* yyv0 = &yyp0->yyoption; + yySemanticOption* yyv1 = &yyp1->yyoption; + if (yyv0->yystate != NULL) + yyv1->yystate = YYRELOC (yyp0, yyp1, yyv0->yystate, yystate); + if (yyv0->yynext != NULL) + yyv1->yynext = YYRELOC (yyp0, yyp1, yyv0->yynext, yyoption); + } + } + if (yystack->yysplitPoint != NULL) + yystack->yysplitPoint = YYRELOC (yystack->yyitems, yynewStack.yyitems, + yystack->yysplitPoint, yystate); + + for (yyn = 0; yyn < yystack->yytops.yysize; yyn += 1) + if (yystack->yytops.yystates[yyn] != NULL) + yystack->yytops.yystates[yyn] = + YYRELOC (yystack->yyitems, yynewStack.yyitems, + yystack->yytops.yystates[yyn], yystate); + YYFREE (yystack->yyitems); + yystack->yyitems = yynewStack.yyitems; + yystack->yynextFree = yynewStack.yynextFree + yysize; + yystack->yyspaceLeft = yynewStack.yyspaceLeft - yysize; + +#else + + yyFail (yystack][]b4_pure_args[, "parser stack overflow"); +#endif +} + +static void +yyfreeGLRStack (yyGLRStack* yystack) +{ + YYFREE (yystack->yyitems); + yyfreeStateSet (&yystack->yytops); +} + +/** Assuming that S is a GLRState somewhere on STACK, update the + * splitpoint of STACK, if needed, so that it is at least as deep as + * S. */ +static inline void +yyupdateSplit (yyGLRStack* yystack, yyGLRState* yys) +{ + if (yystack->yysplitPoint != NULL && yystack->yysplitPoint > yys) + yystack->yysplitPoint = yys; +} + +/** Invalidate stack #K in STACK. */ +static inline void +yymarkStackDeleted (yyGLRStack* yystack, int yyk) +{ + if (yystack->yytops.yystates[yyk] != NULL) + yystack->yylastDeleted = yystack->yytops.yystates[yyk]; + yystack->yytops.yystates[yyk] = NULL; +} + +/** Undelete the last stack that was marked as deleted. Can only be + done once after a deletion, and only when all other stacks have + been deleted. */ +static void +yyundeleteLastStack (yyGLRStack* yystack) +{ + if (yystack->yylastDeleted == NULL || yystack->yytops.yysize != 0) + return; + yystack->yytops.yystates[0] = yystack->yylastDeleted; + yystack->yytops.yysize = 1; + YYDPRINTF ((stderr, "Restoring last deleted stack as stack #0.\n")); + yystack->yylastDeleted = NULL; +} + +static inline void +yyremoveDeletes (yyGLRStack* yystack) +{ + size_t yyi, yyj; + yyi = yyj = 0; + while (yyj < yystack->yytops.yysize) + { + if (yystack->yytops.yystates[yyi] == NULL) + { + if (yyi == yyj) + { + YYDPRINTF ((stderr, "Removing dead stacks.\n")); + } + yystack->yytops.yysize -= 1; + } + else + { + yystack->yytops.yystates[yyj] = yystack->yytops.yystates[yyi]; + if (yyj != yyi) + { + YYDPRINTF ((stderr, "Rename stack %lu -> %lu.\n", + (unsigned long int) yyi, (unsigned long int) yyj)); + } + yyj += 1; + } + yyi += 1; + } +} + +/** Shift to a new state on stack #K of STACK, corresponding to LR state + * LRSTATE, at input position POSN, with (resolved) semantic value SVAL. */ +static inline void +yyglrShift (yyGLRStack* yystack, int yyk, yyStateNum yylrState, size_t yyposn, + YYSTYPE yysval, YYLTYPE* yylocp]b4_user_formals[) +{ + yyGLRStackItem* yynewItem; + + yynewItem = yystack->yynextFree; + yystack->yynextFree += 1; + yystack->yyspaceLeft -= 1; + yynewItem->yystate.yyisState = yytrue; + yynewItem->yystate.yylrState = yylrState; + yynewItem->yystate.yyposn = yyposn; + yynewItem->yystate.yyresolved = yytrue; + yynewItem->yystate.yypred = yystack->yytops.yystates[yyk]; + yystack->yytops.yystates[yyk] = &yynewItem->yystate; + yynewItem->yystate.yysemantics.yysval = yysval; + yynewItem->yystate.yyloc = *yylocp; + if (yystack->yyspaceLeft < YYHEADROOM) + yyexpandGLRStack (yystack]b4_pure_args[); +} + +/** Shift stack #K of YYSTACK, to a new state corresponding to LR + * state YYLRSTATE, at input position YYPOSN, with the (unresolved) + * semantic value of YYRHS under the action for YYRULE. */ +static inline void +yyglrShiftDefer (yyGLRStack* yystack, int yyk, yyStateNum yylrState, + size_t yyposn, yyGLRState* rhs, yyRuleNum yyrule]b4_pure_formals[) +{ + yyGLRStackItem* yynewItem; + + yynewItem = yystack->yynextFree; + yynewItem->yystate.yyisState = yytrue; + yynewItem->yystate.yylrState = yylrState; + yynewItem->yystate.yyposn = yyposn; + yynewItem->yystate.yyresolved = yyfalse; + yynewItem->yystate.yypred = yystack->yytops.yystates[yyk]; + yynewItem->yystate.yysemantics.yyfirstVal = NULL; + yystack->yytops.yystates[yyk] = &yynewItem->yystate; + yystack->yynextFree += 1; + yystack->yyspaceLeft -= 1; + yyaddDeferredAction (yystack, &yynewItem->yystate, rhs, yyrule]b4_pure_args[); +} + +/** Pop the symbols consumed by reduction #RULE from the top of stack + * #K of STACK, and perform the appropriate semantic action on their + * semantic values. Assumes that all ambiguities in semantic values + * have been previously resolved. Set *VALP to the resulting value, + * and *LOCP to the computed location (if any). Return value is as + * for userAction. */ +static inline YYRESULTTAG +yydoAction (yyGLRStack* yystack, int yyk, yyRuleNum yyrule, + YYSTYPE* yyvalp, YYLTYPE* yylocp]b4_user_formals[) +{ + int yynrhs = yyrhsLength (yyrule); + + if (yystack->yysplitPoint == NULL) + { + /* Standard special case: single stack. */ + yyGLRStackItem* rhs = (yyGLRStackItem*) yystack->yytops.yystates[yyk]; + YYASSERT (yyk == 0); + yystack->yynextFree -= yynrhs; + yystack->yyspaceLeft += yynrhs; + yystack->yytops.yystates[0] = & yystack->yynextFree[-1].yystate; + return yyuserAction (yyrule, yynrhs, rhs, + yyvalp, yylocp, yystack]b4_user_args[); + } + else + { + int yyi; + yyGLRState* yys; + yyGLRStackItem yyrhsVals[YYMAXRHS + YYMAXLEFT + 1]; + yys = yyrhsVals[YYMAXRHS + YYMAXLEFT].yystate.yypred + = yystack->yytops.yystates[yyk]; + for (yyi = 0; yyi < yynrhs; yyi += 1) + { + yys = yys->yypred; + YYASSERT (yys); + } + yyupdateSplit (yystack, yys); + yystack->yytops.yystates[yyk] = yys; + return yyuserAction (yyrule, yynrhs, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1, + yyvalp, yylocp, yystack]b4_user_args[); + } +} + +#if !YYDEBUG +# define YY_REDUCE_PRINT(K, Rule) +#else +# define YY_REDUCE_PRINT(K, Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (K, Rule); \ +} while (0) + +/*----------------------------------------------------------. +| Report that the RULE is going to be reduced on stack #K. | +`----------------------------------------------------------*/ + +static inline void +yy_reduce_print (size_t yyk, yyRuleNum yyrule) +{ + int yyi; + YYFPRINTF (stderr, "Reducing stack %lu by rule %d (line %lu), ", + (unsigned long int) yyk, yyrule - 1, + (unsigned long int) yyrline[yyrule]); + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) + YYFPRINTF (stderr, "%s ", yytokenName (yyrhs[yyi])); + YYFPRINTF (stderr, "-> %s\n", yytokenName (yyr1[yyrule])); +} +#endif + +/** Pop items off stack #K of STACK according to grammar rule RULE, + * and push back on the resulting nonterminal symbol. Perform the + * semantic action associated with RULE and store its value with the + * newly pushed state, if FORCEEVAL or if STACK is currently + * unambiguous. Otherwise, store the deferred semantic action with + * the new state. If the new state would have an identical input + * position, LR state, and predecessor to an existing state on the stack, + * it is identified with that existing state, eliminating stack #K from + * the STACK. In this case, the (necessarily deferred) semantic value is + * added to the options for the existing state's semantic value. + */ +static inline YYRESULTTAG +yyglrReduce (yyGLRStack* yystack, size_t yyk, yyRuleNum yyrule, + yybool yyforceEval]b4_pure_formals[) +{ + size_t yyposn = yystack->yytops.yystates[yyk]->yyposn; + + if (yyforceEval || yystack->yysplitPoint == NULL) + { + YYSTYPE yysval; + YYLTYPE yyloc; + + YY_REDUCE_PRINT (yyk, yyrule); + YYCHK (yydoAction (yystack, yyk, yyrule, &yysval, &yyloc]b4_user_args[)); + yyglrShift (yystack, yyk, + yyLRgotoState (yystack->yytops.yystates[yyk]->yylrState, + yylhsNonterm (yyrule)), + yyposn, yysval, &yyloc]b4_user_args[); + } + else + { + size_t yyi; + int yyn; + yyGLRState* yys, *yys0 = yystack->yytops.yystates[yyk]; + yyStateNum yynewLRState; + + for (yys = yystack->yytops.yystates[yyk], yyn = yyrhsLength (yyrule); + 0 < yyn; yyn -= 1) + { + yys = yys->yypred; + YYASSERT (yys); + } + yyupdateSplit (yystack, yys); + yynewLRState = yyLRgotoState (yys->yylrState, yylhsNonterm (yyrule)); + YYDPRINTF ((stderr, + "Reduced stack %lu by rule #%d; action deferred. Now in state %d.\n", + (unsigned long int) yyk, yyrule - 1, yynewLRState)); + for (yyi = 0; yyi < yystack->yytops.yysize; yyi += 1) + if (yyi != yyk && yystack->yytops.yystates[yyi] != NULL) + { + yyGLRState* yyp, *yysplit = yystack->yysplitPoint; + yyp = yystack->yytops.yystates[yyi]; + while (yyp != yys && yyp != yysplit && yyp->yyposn >= yyposn) + { + if (yyp->yylrState == yynewLRState && yyp->yypred == yys) + { + yyaddDeferredAction (yystack, yyp, yys0, yyrule]b4_pure_args[); + yymarkStackDeleted (yystack, yyk); + YYDPRINTF ((stderr, "Merging stack %lu into stack %lu.\n", + (unsigned long int) yyk, + (unsigned long int) yyi)); + return yyok; + } + yyp = yyp->yypred; + } + } + yystack->yytops.yystates[yyk] = yys; + yyglrShiftDefer (yystack, yyk, yynewLRState, yyposn, yys0, yyrule]b4_pure_args[); + } + return yyok; +} + +static int +yysplitStack (yyGLRStack* yystack, int yyk) +{ + if (yystack->yysplitPoint == NULL) + { + YYASSERT (yyk == 0); + yystack->yysplitPoint = yystack->yytops.yystates[yyk]; + } + if (yystack->yytops.yysize >= yystack->yytops.yycapacity) + { + yystack->yytops.yycapacity *= 2; + yystack->yytops.yystates = + (yyGLRState**) YYREALLOC (yystack->yytops.yystates, + (yystack->yytops.yycapacity + * sizeof yystack->yytops.yystates[0])); + } + yystack->yytops.yystates[yystack->yytops.yysize] + = yystack->yytops.yystates[yyk]; + yystack->yytops.yysize += 1; + return yystack->yytops.yysize-1; +} + +/** True iff Y0 and Y1 represent identical options at the top level. + * That is, they represent the same rule applied to RHS symbols + * that produce the same terminal symbols. */ +static yybool +yyidenticalOptions (yySemanticOption* yyy0, yySemanticOption* yyy1) +{ + if (yyy0->yyrule == yyy1->yyrule) + { + yyGLRState *yys0, *yys1; + int yyn; + for (yys0 = yyy0->yystate, yys1 = yyy1->yystate, + yyn = yyrhsLength (yyy0->yyrule); + yyn > 0; + yys0 = yys0->yypred, yys1 = yys1->yypred, yyn -= 1) + if (yys0->yyposn != yys1->yyposn) + return yyfalse; + return yytrue; + } + else + return yyfalse; +} + +/** Assuming identicalOptions (Y0,Y1), (destructively) merge the + * alternative semantic values for the RHS-symbols of Y1 into the + * corresponding semantic value sets of the symbols of Y0. */ +static void +yymergeOptionSets (yySemanticOption* yyy0, yySemanticOption* yyy1) +{ + yyGLRState *yys0, *yys1; + int yyn; + for (yys0 = yyy0->yystate, yys1 = yyy1->yystate, + yyn = yyrhsLength (yyy0->yyrule); + yyn > 0; + yys0 = yys0->yypred, yys1 = yys1->yypred, yyn -= 1) + if (yys0 == yys1) + break; + else if (! yys0->yyresolved && ! yys1->yyresolved) + { + yySemanticOption* yyz; + for (yyz = yys0->yysemantics.yyfirstVal; yyz->yynext != NULL; + yyz = yyz->yynext) + continue; + yyz->yynext = yys1->yysemantics.yyfirstVal; + } +} + +/** Y0 and Y1 represent two possible actions to take in a given + * parsing state; return 0 if no combination is possible, + * 1 if user-mergeable, 2 if Y0 is preferred, 3 if Y1 is preferred. */ +static int +yypreference (yySemanticOption* y0, yySemanticOption* y1) +{ + yyRuleNum r0 = y0->yyrule, r1 = y1->yyrule; + int p0 = yydprec[r0], p1 = yydprec[r1]; + + if (p0 == p1) + { + if (yymerger[r0] == 0 || yymerger[r0] != yymerger[r1]) + return 0; + else + return 1; + } + if (p0 == 0 || p1 == 0) + return 0; + if (p0 < p1) + return 3; + if (p1 < p0) + return 2; + return 0; +} + +static YYRESULTTAG yyresolveValue (yySemanticOption* yyoptionList, + yyGLRStack* yystack, YYSTYPE* yyvalp, + YYLTYPE* yylocp]b4_user_formals[); + +static YYRESULTTAG +yyresolveStates (yyGLRState* yys, int yyn, yyGLRStack* yystack]b4_user_formals[) +{ + YYRESULTTAG yyflag; + if (0 < yyn) + { + YYASSERT (yys->yypred); + yyflag = yyresolveStates (yys->yypred, yyn-1, yystack]b4_user_args[); + if (yyflag != yyok) + return yyflag; + if (! yys->yyresolved) + { + yyflag = yyresolveValue (yys->yysemantics.yyfirstVal, yystack, + &yys->yysemantics.yysval, &yys->yyloc + ]b4_user_args[); + if (yyflag != yyok) + return yyflag; + yys->yyresolved = yytrue; + } + } + return yyok; +} + +static YYRESULTTAG +yyresolveAction (yySemanticOption* yyopt, yyGLRStack* yystack, + YYSTYPE* yyvalp, YYLTYPE* yylocp]b4_user_formals[) +{ + yyGLRStackItem yyrhsVals[YYMAXRHS + YYMAXLEFT + 1]; + int yynrhs; + + yynrhs = yyrhsLength (yyopt->yyrule); + YYCHK (yyresolveStates (yyopt->yystate, yynrhs, yystack]b4_user_args[)); + yyrhsVals[YYMAXRHS + YYMAXLEFT].yystate.yypred = yyopt->yystate; + return yyuserAction (yyopt->yyrule, yynrhs, + yyrhsVals + YYMAXRHS + YYMAXLEFT - 1, + yyvalp, yylocp, yystack]b4_user_args[); +} + +#if YYDEBUG +static void +yyreportTree (yySemanticOption* yyx, int yyindent) +{ + int yynrhs = yyrhsLength (yyx->yyrule); + int yyi; + yyGLRState* yys; + yyGLRState* yystates[YYMAXRHS]; + yyGLRState yyleftmost_state; + + for (yyi = yynrhs, yys = yyx->yystate; 0 < yyi; yyi -= 1, yys = yys->yypred) + yystates[yyi] = yys; + if (yys == NULL) + { + yyleftmost_state.yyposn = 0; + yystates[0] = &yyleftmost_state; + } + else + yystates[0] = yys; + + if (yyx->yystate->yyposn < yys->yyposn + 1) + YYFPRINTF (stderr, "%*s%s -> \n", + yyindent, "", yytokenName (yylhsNonterm (yyx->yyrule)), + yyx->yyrule); + else + YYFPRINTF (stderr, "%*s%s -> \n", + yyindent, "", yytokenName (yylhsNonterm (yyx->yyrule)), + yyx->yyrule, (unsigned long int) (yys->yyposn + 1), + (unsigned long int) yyx->yystate->yyposn); + for (yyi = 1; yyi <= yynrhs; yyi += 1) + { + if (yystates[yyi]->yyresolved) + { + if (yystates[yyi-1]->yyposn+1 > yystates[yyi]->yyposn) + YYFPRINTF (stderr, "%*s%s \n", yyindent+2, "", + yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1])); + else + YYFPRINTF (stderr, "%*s%s \n", yyindent+2, "", + yytokenName (yyrhs[yyprhs[yyx->yyrule]+yyi-1]), + (unsigned long int) (yystates[yyi - 1]->yyposn + 1), + (unsigned long int) yystates[yyi]->yyposn); + } + else + yyreportTree (yystates[yyi]->yysemantics.yyfirstVal, yyindent+2); + } +} +#endif + +static void +yyreportAmbiguity (yySemanticOption* yyx0, yySemanticOption* yyx1, + yyGLRStack* yystack]b4_pure_formals[) +{ + /* `Unused' warnings. */ + (void) yyx0; + (void) yyx1; + +#if YYDEBUG + YYFPRINTF (stderr, "Ambiguity detected.\n"); + YYFPRINTF (stderr, "Option 1,\n"); + yyreportTree (yyx0, 2); + YYFPRINTF (stderr, "\nOption 2,\n"); + yyreportTree (yyx1, 2); + YYFPRINTF (stderr, "\n"); +#endif + yyFail (yystack][]b4_pure_args[, "ambiguity detected"); +} + + +/** Resolve the ambiguity represented by OPTIONLIST, perform the indicated + * actions, and return the result. */ +static YYRESULTTAG +yyresolveValue (yySemanticOption* yyoptionList, yyGLRStack* yystack, + YYSTYPE* yyvalp, YYLTYPE* yylocp]b4_user_formals[) +{ + yySemanticOption* yybest; + yySemanticOption* yyp; + int yymerge; + + yybest = yyoptionList; + yymerge = 0; + for (yyp = yyoptionList->yynext; yyp != NULL; yyp = yyp->yynext) + { + if (yyidenticalOptions (yybest, yyp)) + yymergeOptionSets (yybest, yyp); + else + switch (yypreference (yybest, yyp)) + { + case 0: + yyreportAmbiguity (yybest, yyp, yystack]b4_pure_args[); + break; + case 1: + yymerge = 1; + break; + case 2: + break; + case 3: + yybest = yyp; + yymerge = 0; + break; + } + } + + if (yymerge) + { + int yyprec = yydprec[yybest->yyrule]; + YYCHK (yyresolveAction (yybest, yystack, yyvalp, yylocp]b4_user_args[)); + for (yyp = yybest->yynext; yyp != NULL; yyp = yyp->yynext) + { + if (yyprec == yydprec[yyp->yyrule]) + { + YYSTYPE yyval1; + YYLTYPE yydummy; + YYCHK (yyresolveAction (yyp, yystack, &yyval1, &yydummy]b4_user_args[)); + yyuserMerge (yymerger[yyp->yyrule], yyvalp, &yyval1); + } + } + return yyok; + } + else + return yyresolveAction (yybest, yystack, yyvalp, yylocp]b4_user_args[); +} + +static YYRESULTTAG +yyresolveStack (yyGLRStack* yystack]b4_user_formals[) +{ + if (yystack->yysplitPoint != NULL) + { + yyGLRState* yys; + int yyn; + + for (yyn = 0, yys = yystack->yytops.yystates[0]; + yys != yystack->yysplitPoint; + yys = yys->yypred, yyn += 1) + continue; + YYCHK (yyresolveStates (yystack->yytops.yystates[0], yyn, yystack + ]b4_user_args[)); + } + return yyok; +} + +static void +yycompressStack (yyGLRStack* yystack) +{ + yyGLRState* yyp, *yyq, *yyr; + + if (yystack->yytops.yysize != 1 || yystack->yysplitPoint == NULL) + return; + + for (yyp = yystack->yytops.yystates[0], yyq = yyp->yypred, yyr = NULL; + yyp != yystack->yysplitPoint; + yyr = yyp, yyp = yyq, yyq = yyp->yypred) + yyp->yypred = yyr; + + yystack->yyspaceLeft += yystack->yynextFree - yystack->yyitems; + yystack->yynextFree = ((yyGLRStackItem*) yystack->yysplitPoint) + 1; + yystack->yyspaceLeft -= yystack->yynextFree - yystack->yyitems; + yystack->yysplitPoint = NULL; + yystack->yylastDeleted = NULL; + + while (yyr != NULL) + { + yystack->yynextFree->yystate = *yyr; + yyr = yyr->yypred; + yystack->yynextFree->yystate.yypred = & yystack->yynextFree[-1].yystate; + yystack->yytops.yystates[0] = &yystack->yynextFree->yystate; + yystack->yynextFree += 1; + yystack->yyspaceLeft -= 1; + } +} + +static YYRESULTTAG +yyprocessOneStack (yyGLRStack* yystack, int yyk, + size_t yyposn, YYSTYPE* yylvalp, YYLTYPE* yyllocp + ]b4_user_formals[) +{ + int yyaction; + const short int* yyconflicts; + yyRuleNum yyrule; + yySymbol* const yytokenp = yystack->yytokenp; + + while (yystack->yytops.yystates[yyk] != NULL) + { + yyStateNum yystate = yystack->yytops.yystates[yyk]->yylrState; + YYDPRINTF ((stderr, "Stack %d Entering state %d\n", yyk, yystate)); + + YYASSERT (yystate != YYFINAL); + + if (yyisDefaultedState (yystate)) + { + yyrule = yydefaultAction (yystate); + if (yyrule == 0) + { + YYDPRINTF ((stderr, "Stack %d dies.\n", yyk)); + yymarkStackDeleted (yystack, yyk); + return yyok; + } + YYCHK (yyglrReduce (yystack, yyk, yyrule, yyfalse]b4_lpure_args[)); + } + else + { + if (*yytokenp == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + *yytokenp = YYTRANSLATE (yychar); + YYDSYMPRINTF ("Next token is", *yytokenp, yylvalp, yyllocp); + } + yygetLRActions (yystate, *yytokenp, &yyaction, &yyconflicts); + + while (*yyconflicts != 0) + { + int yynewStack = yysplitStack (yystack, yyk); + YYDPRINTF ((stderr, "Splitting off stack %d from %d.\n", + yynewStack, yyk)); + YYCHK (yyglrReduce (yystack, yynewStack, + *yyconflicts, yyfalse]b4_lpure_args[)); + YYCHK (yyprocessOneStack (yystack, yynewStack, yyposn, + yylvalp, yyllocp]b4_user_args[)); + yyconflicts += 1; + } + + if (yyisShiftAction (yyaction)) + { + YYDPRINTF ((stderr, "Shifting token %s on stack %d, ", + yytokenName (*yytokenp), yyk)); + yyglrShift (yystack, yyk, yyaction, yyposn+1, + *yylvalp, yyllocp]b4_user_args[); + YYDPRINTF ((stderr, "which is now in state #%d\n", + yystack->yytops.yystates[yyk]->yylrState)); + break; + } + else if (yyisErrorAction (yyaction)) + { + YYDPRINTF ((stderr, "Stack %d dies.\n", yyk)); + yymarkStackDeleted (yystack, yyk); + break; + } + else + YYCHK (yyglrReduce (yystack, yyk, -yyaction, yyfalse]b4_lpure_args[)); + } + } + return yyok; +} + +static void +yyreportSyntaxError (yyGLRStack* yystack, + YYSTYPE* yylvalp, YYLTYPE* yyllocp]b4_user_formals[) +{ + /* `Unused' warnings. */ + (void) yylvalp; + (void) yyllocp; + + if (yystack->yyerrState == 0) + { +#if YYERROR_VERBOSE + yySymbol* const yytokenp = yystack->yytokenp; + int yyn; + yyn = yypact[yystack->yytops.yystates[0]->yylrState]; + if (YYPACT_NINF < yyn && yyn < YYLAST) + { + size_t yysize = 0; + const char* yyprefix; + char* yymsg; + int yyx; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 0; + + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + yysize += strlen (yyprefix) + strlen (yytokenName (yyx)); + yycount += 1; + if (yycount == 5) + { + yysize = 0; + break; + } + yyprefix = " or "; + } + yysize += (sizeof ("syntax error, unexpected ") + + strlen (yytokenName (*yytokenp))); + yymsg = (char*) YYMALLOC (yysize); + if (yymsg != 0) + { + char* yyp = yymsg; + sprintf (yyp, "syntax error%s%s", + (*yytokenp == YYEMPTY ? "" : ", unexpected "), + yytokenName (*yytokenp)); + yyp += strlen (yyp); + if (yycount < 5) + { + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + sprintf (yyp, "%s%s", yyprefix, yytokenName (yyx)); + yyp += strlen (yyp); + yyprefix = " or "; + } + } + yyerror (]b4_lyyerror_args[yymsg); + YYFREE (yymsg); + } + else + yyerror (]b4_lyyerror_args["syntax error; also virtual memory exhausted"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror (]b4_lyyerror_args["syntax error"); + yynerrs += 1; + } +} + +/* Recover from a syntax error on YYSTACK, assuming that YYTOKENP, + YYLVALP, and YYLLOCP point to the syntactic category, semantic + value, and location of the lookahead. */ +static void +yyrecoverSyntaxError (yyGLRStack* yystack, + YYSTYPE* yylvalp, YYLTYPE* yyllocp]b4_user_formals[) +{ + yySymbol* const yytokenp = yystack->yytokenp; + size_t yyk; + int yyj; + + if (yystack->yyerrState == 3) + /* We just shifted the error token and (perhaps) took some + reductions. Skip tokens until we can proceed. */ + while (yytrue) + { + if (*yytokenp == YYEOF) + { + /* Now pop stack until empty and fail. */ + while (yystack->yytops.yystates[0] != NULL) + { + yyGLRState *yys = yystack->yytops.yystates[0]; + YYDSYMPRINTF ("Error: popping", + yystos[yys->yylrState], + &yys->yysemantics.yysval, &yys->yyloc); + yydestruct (yystos[yys->yylrState], + &yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[); + yystack->yytops.yystates[0] = yys->yypred; + yystack->yynextFree -= 1; + yystack->yyspaceLeft += 1; + } + yyFail (yystack][]b4_lpure_args[, NULL); + } + if (*yytokenp != YYEMPTY) + { + YYDSYMPRINTF ("Error: discarding", *yytokenp, yylvalp, yyllocp); + yydestruct (*yytokenp, yylvalp]b4_location_if([, yyllocp])[); + } + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + *yytokenp = YYTRANSLATE (yychar); + YYDSYMPRINTF ("Next token is", *yytokenp, yylvalp, yyllocp); + yyj = yypact[yystack->yytops.yystates[0]->yylrState]; + if (yyis_pact_ninf (yyj)) + return; + yyj += *yytokenp; + if (yyj < 0 || YYLAST < yyj || yycheck[yyj] != *yytokenp) + { + if (yydefact[yystack->yytops.yystates[0]->yylrState] != 0) + return; + } + else if (yytable[yyj] != 0 && ! yyis_table_ninf (yytable[yyj])) + return; + } + + /* Reduce to one stack. */ + for (yyk = 0; yyk < yystack->yytops.yysize; yyk += 1) + if (yystack->yytops.yystates[yyk] != NULL) + break; + if (yyk >= yystack->yytops.yysize) + yyFail (yystack][]b4_lpure_args[, NULL); + for (yyk += 1; yyk < yystack->yytops.yysize; yyk += 1) + yymarkStackDeleted (yystack, yyk); + yyremoveDeletes (yystack); + yycompressStack (yystack); + + /* Now pop stack until we find a state that shifts the error token. */ + yystack->yyerrState = 3; + while (yystack->yytops.yystates[0] != NULL) + { + yyGLRState *yys = yystack->yytops.yystates[0]; + yyj = yypact[yys->yylrState]; + if (! yyis_pact_ninf (yyj)) + { + yyj += YYTERROR; + if (0 <= yyj && yyj <= YYLAST && yycheck[yyj] == YYTERROR + && yyisShiftAction (yytable[yyj])) + { + YYDPRINTF ((stderr, "Shifting error token, ")); + yyglrShift (yystack, 0, yytable[yyj], + yys->yyposn, *yylvalp, yyllocp]b4_user_args[); + break; + } + } + YYDSYMPRINTF ("Error: popping", + yystos[yys->yylrState], + &yys->yysemantics.yysval, &yys->yyloc); + yydestruct (yystos[yys->yylrState], + &yys->yysemantics.yysval]b4_location_if([, &yys->yyloc])[); + yystack->yytops.yystates[0] = yys->yypred; + yystack->yynextFree -= 1; + yystack->yyspaceLeft += 1; + } + if (yystack->yytops.yystates[0] == NULL) + yyFail (yystack][]b4_lpure_args[, NULL); +} + +#define YYCHK1(YYE) \ + do { \ + switch (YYE) { \ + default: \ + break; \ + case yyabort: \ + yystack.yyerrflag = 1; \ + goto yyDone; \ + case yyaccept: \ + yystack.yyerrflag = 0; \ + goto yyDone; \ + case yyerr: \ + goto yyuser_error; \ + } \ + } while (0) + + +/*----------. +| yyparse. | +`----------*/ + +]b4_c_ansi_function_def([yyparse], [int], b4_parse_param)[ +{ + yySymbol yytoken; + yyGLRStack yystack; + size_t yyposn; +]b4_pure_if( +[ + YYSTYPE yylval; + YYLTYPE yylloc; + #undef yychar + #define yychar (yystack.yyrawchar) +])[ + + YYSTYPE* const yylvalp = &yylval; + YYLTYPE* const yyllocp = &yylloc; + + yyinitGLRStack (&yystack, YYINITDEPTH); + yystack.yytokenp = &yytoken; + + YYDPRINTF ((stderr, "Starting parse\n")); + + if (setjmp (yystack.yyexception_buffer) != 0) + goto yyDone; + + yyglrShift (&yystack, 0, 0, 0, yyval_default, &yyloc_default]b4_user_args[); + yytoken = YYEMPTY; + yyposn = 0; + + while (yytrue) + { + /* For efficiency, we have two loops, the first of which is + specialized to deterministic operation (single stack, no + potential ambiguity). */ + /* Standard mode */ + while (yytrue) + { + yyRuleNum yyrule; + int yyaction; + const short int* yyconflicts; + + yyStateNum yystate = yystack.yytops.yystates[0]->yylrState; + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + if (yystate == YYFINAL) + goto yyDone; + if (yyisDefaultedState (yystate)) + { + yyrule = yydefaultAction (yystate); + if (yyrule == 0) + { + yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[); + goto yyuser_error; + } + YYCHK1 (yyglrReduce (&yystack, 0, yyrule, yytrue]b4_lpure_args[)); + } + else + { + if (yytoken == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + yytoken = YYTRANSLATE (yychar); + YYDSYMPRINTF ("Next token is", yytoken, yylvalp, yyllocp); + } + yygetLRActions (yystate, yytoken, &yyaction, &yyconflicts); + if (*yyconflicts != 0) + break; + if (yyisShiftAction (yyaction)) + { + YYDPRINTF ((stderr, "Shifting token %s, ", + yytokenName (yytoken))); + if (yytoken != YYEOF) + yytoken = YYEMPTY; + yyposn += 1; + yyglrShift (&yystack, 0, yyaction, yyposn, + yylval, yyllocp]b4_user_args[); + if (0 < yystack.yyerrState) + yystack.yyerrState -= 1; + } + else if (yyisErrorAction (yyaction)) + { + yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[); + goto yyuser_error; + } + else + YYCHK1 (yyglrReduce (&yystack, 0, -yyaction, yytrue]b4_lpure_args[)); + } + } + + while (yytrue) + { + int yys; + int yyn = yystack.yytops.yysize; + for (yys = 0; yys < yyn; yys += 1) + YYCHK1 (yyprocessOneStack (&yystack, yys, yyposn, + yylvalp, yyllocp]b4_user_args[)); + yytoken = YYEMPTY; + yyposn += 1; + yyremoveDeletes (&yystack); + if (yystack.yytops.yysize == 0) + { + yyundeleteLastStack (&yystack); + if (yystack.yytops.yysize == 0) + yyFail (&yystack][]b4_lpure_args[, "syntax error"); + YYCHK1 (yyresolveStack (&yystack]b4_user_args[)); + YYDPRINTF ((stderr, "Returning to deterministic operation.\n")); + yyreportSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[); + goto yyuser_error; + } + else if (yystack.yytops.yysize == 1) + { + YYCHK1 (yyresolveStack (&yystack]b4_user_args[)); + YYDPRINTF ((stderr, "Returning to deterministic operation.\n")); + yycompressStack (&yystack); + break; + } + } + continue; + yyuser_error: + yyrecoverSyntaxError (&yystack, yylvalp, yyllocp]b4_user_args[); + yyposn = yystack.yytops.yystates[0]->yyposn; + } + yyDone: + ; + + yyfreeGLRStack (&yystack); + return yystack.yyerrflag; +} + +/* DEBUGGING ONLY */ +static void yypstack (yyGLRStack* yystack, int yyk) ATTRIBUTE_UNUSED; +static void yypdumpstack (yyGLRStack* yystack) ATTRIBUTE_UNUSED; + +static void +yy_yypstack (yyGLRState* yys) +{ + if (yys->yypred) + { + yy_yypstack (yys->yypred); + fprintf (stderr, " -> "); + } + fprintf (stderr, "%d@@%lu", yys->yylrState, (unsigned long int) yys->yyposn); +} + +static void +yypstates (yyGLRState* yyst) +{ + if (yyst == NULL) + fprintf (stderr, ""); + else + yy_yypstack (yyst); + fprintf (stderr, "\n"); +} + +static void +yypstack (yyGLRStack* yystack, int yyk) +{ + yypstates (yystack->yytops.yystates[yyk]); +} + +#define YYINDEX(YYX) \ + ((YYX) == NULL ? -1 : (yyGLRStackItem*) (YYX) - yystack->yyitems) + + +static void +yypdumpstack (yyGLRStack* yystack) +{ + yyGLRStackItem* yyp; + size_t yyi; + for (yyp = yystack->yyitems; yyp < yystack->yynextFree; yyp += 1) + { + fprintf (stderr, "%3lu. ", (unsigned long int) (yyp - yystack->yyitems)); + if (*(yybool *) yyp) + { + fprintf (stderr, "Res: %d, LR State: %d, posn: %lu, pred: %ld", + yyp->yystate.yyresolved, yyp->yystate.yylrState, + (unsigned long int) yyp->yystate.yyposn, + (long int) YYINDEX (yyp->yystate.yypred)); + if (! yyp->yystate.yyresolved) + fprintf (stderr, ", firstVal: %ld", + (long int) YYINDEX (yyp->yystate.yysemantics.yyfirstVal)); + } + else + { + fprintf (stderr, "Option. rule: %d, state: %ld, next: %ld", + yyp->yyoption.yyrule, + (long int) YYINDEX (yyp->yyoption.yystate), + (long int) YYINDEX (yyp->yyoption.yynext)); + } + fprintf (stderr, "\n"); + } + fprintf (stderr, "Tops:"); + for (yyi = 0; yyi < yystack->yytops.yysize; yyi += 1) + fprintf (stderr, "%lu: %ld; ", (unsigned long int) yyi, + (long int) YYINDEX (yystack->yytops.yystates[yyi])); + fprintf (stderr, "\n"); +} +] + +b4_epilogue +m4_if(b4_defines_flag, 0, [], +[@output @output_header_name@ +b4_copyright([Skeleton parser for GLR parsing with Bison], [2002, 2003, 2004]) + +b4_token_defines(b4_tokens) + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +m4_ifdef([b4_stype], +[b4_syncline([b4_stype_line], [b4_filename]) +typedef union m4_bregexp(b4_stype, [^{], [YYSTYPE ])b4_stype YYSTYPE; +/* Line __line__ of glr.c. */ +b4_syncline([@oline@], [@ofile@])], +[typedef int YYSTYPE;]) +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + +b4_pure_if([], +[extern YYSTYPE b4_prefix[]lval;]) + +#if ! defined (YYLTYPE) && ! defined (YYLTYPE_IS_DECLARED) +typedef struct YYLTYPE +{ +b4_location_if([ + int first_line; + int first_column; + int last_line; + int last_column; +],[ + char yydummy; +]) +} YYLTYPE; +# define YYLTYPE_IS_DECLARED 1 +# define YYLTYPE_IS_TRIVIAL 1 +#endif + +b4_location_if([m4_if(b4_pure, [0], +[extern YYLTYPE b4_prefix[]lloc;]) +]) +]) diff --git a/src/apps/bin/bison/data/lalr1.cc b/src/apps/bin/bison/data/lalr1.cc new file mode 100644 index 0000000000..9ac1677d80 --- /dev/null +++ b/src/apps/bin/bison/data/lalr1.cc @@ -0,0 +1,1225 @@ +m4_divert(-1) +# C++ skeleton for Bison +# Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +# 02111-1307 USA + +## ---------------- ## +## Default values. ## +## ---------------- ## + +# Default Parser class name. +m4_define_default([b4_parser_class_name], [Parser]) + + + +## ----------------- ## +## Semantic Values. ## +## ----------------- ## + + +# b4_lhs_value([TYPE]) +# -------------------- +# Expansion of $$. +m4_define([b4_lhs_value], +[yyval[]m4_ifval([$1], [.$1])]) + + +# b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) +# -------------------------------------- +# Expansion of $NUM, where the current rule has RULE-LENGTH +# symbols on RHS. +m4_define([b4_rhs_value], +[semantic_stack_@{m4_eval([$1 - $2])@}m4_ifval([$3], [.$3])]) + +m4_define_default([b4_location_type], [Location]) + +# b4_lhs_location() +# ----------------- +# Expansion of @$. +m4_define([b4_lhs_location], +[yyloc]) + + +# b4_rhs_location(RULE-LENGTH, NUM) +# --------------------------------- +# Expansion of @NUM, where the current rule has RULE-LENGTH symbols +# on RHS. +m4_define([b4_rhs_location], +[location_stack_@{m4_eval([$1 - $2])@}]) + + +m4_define([b4_inherit], + [m4_ifdef([b4_root], + [: public b4_root +], + [])]) + +m4_define([b4_param], + [m4_ifdef([b4_root], + [, + const Param& param], + [])]) + +m4_define([b4_constructor], + [m4_ifdef([b4_root], + [b4_root (param), + ], + [])]) + + +# b4_parse_param_decl +# ------------------- +# Constructor's extra arguments. +m4_define([b4_parse_param_decl], + [m4_ifset([b4_parse_param], [, b4_c_ansi_formals(b4_parse_param)])]) + +# b4_parse_param_cons +# ------------------- +# constructor's extra initialisations. +m4_define([b4_parse_param_cons], + [m4_ifset([b4_parse_param], + [, + b4_cc_constructor_calls(b4_parse_param)])]) +m4_define([b4_cc_constructor_calls], + [m4_map_sep([b4_cc_constructor_call], [, + ], [$@])]) +m4_define([b4_cc_constructor_call], + [$2($2)]) + +# b4_parse_param_vars +# ------------------- +# Extra instance variables. +m4_define([b4_parse_param_vars], + [m4_ifset([b4_parse_param], + [ + /* User arguments. */ +b4_cc_var_decls(b4_parse_param)])]) +m4_define([b4_cc_var_decls], + [m4_map_sep([b4_cc_var_decl], [ +], [$@])]) +m4_define([b4_cc_var_decl], + [ $1;]) + +# b4_cxx_destruct_def(IGNORED-ARGUMENTS) +# -------------------------------------- +# Declare the destruct_ method. +m4_define([b4_cxx_destruct_def], +[void +yy::b4_parser_class_name::destruct_ (int yytype, SemanticType *yyvaluep, LocationType *yylocationp)[]dnl +]) + +# We do want M4 expansion after # for CPP macros. +m4_changecom() +m4_divert(0)dnl +m4_if(b4_defines_flag, 0, [], +[@output @output_header_name@ +b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison], + [2002, 2003, 2004])[ +/* FIXME: This is wrong, we want computed header guards. + I don't know why the macros are missing now. :( */ +#ifndef PARSER_HEADER_H +# define PARSER_HEADER_H + +#include "stack.hh" +#include "location.hh" + +#include +#include + +/* Using locations. */ +#define YYLSP_NEEDED ]b4_locations_flag[ + +]b4_token_defines(b4_tokens)[ + +/* Copy the first part of user declarations. */ +]b4_pre_prologue[ + +]/* Line __line__ of lalr1.cc. */ +b4_syncline([@oline@], [@ofile@])[ + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG ]b4_debug[ +#endif + +/* Enabling verbose error message. */ +#ifndef YYERROR_VERBOSE +# define YYERROR_VERBOSE ]b4_error_verbose[ +#endif + +#ifndef YYSTYPE +]m4_ifdef([b4_stype], +[b4_syncline([b4_stype_line], [b4_filename]) +typedef union b4_stype yystype; +/* Line __line__ of lalr1.cc. */ +b4_syncline([@oline@], [@ofile@])], +[typedef int yystype;])[ +# define YYSTYPE yystype +#endif + +/* Copy the second part of user declarations. */ +]b4_post_prologue[ + +]/* Line __line__ of lalr1.cc. */ +b4_syncline([@oline@], [@ofile@])[ +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + ((Current).end = Rhs[N].end) +#endif + +namespace yy +{ + class ]b4_parser_class_name[; + + template < typename P > + struct Traits + { + }; + + template < > + struct Traits< ]b4_parser_class_name[ > + { + typedef ]b4_int_type_for([b4_translate])[ TokenNumberType; + typedef ]b4_int_type_for([b4_rhs])[ RhsNumberType; + typedef int StateType; + typedef yystype SemanticType; + typedef ]b4_location_type[ LocationType; + }; +} + +namespace yy +{ + class ]b4_parser_class_name b4_inherit[ + { + public: + + typedef Traits< ]b4_parser_class_name[ >::TokenNumberType TokenNumberType; + typedef Traits< ]b4_parser_class_name[ >::RhsNumberType RhsNumberType; + typedef Traits< ]b4_parser_class_name[ >::StateType StateType; + typedef Traits< ]b4_parser_class_name[ >::SemanticType SemanticType; + typedef Traits< ]b4_parser_class_name[ >::LocationType LocationType; + + typedef Stack< StateType > StateStack; + typedef Stack< SemanticType > SemanticStack; + typedef Stack< LocationType > LocationStack; + +#if YYLSP_NEEDED + ]b4_parser_class_name[ (bool debug, + LocationType initlocation][]b4_param[]b4_parse_param_decl[) : + ]b4_constructor[][debug_ (debug), + cdebug_ (std::cerr), + initlocation_ (initlocation)]b4_parse_param_cons[ +#else + ]b4_parser_class_name[ (bool debug][]b4_param[]b4_parse_param_decl[) : + ]b4_constructor[][debug_ (debug), + cdebug_ (std::cerr)]b4_parse_param_cons[ +#endif + { + } + + virtual ~]b4_parser_class_name[ () + { + } + + virtual int parse (); + + private: + + virtual void lex_ (); + virtual void error_ (); + virtual void print_ (); + virtual void report_syntax_error_ (); + + /* Stacks. */ + StateStack state_stack_; + SemanticStack semantic_stack_; + LocationStack location_stack_; + + /* Tables. */ + static const ]b4_int_type_for([b4_pact])[ pact_[]; + static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ pact_ninf_; + static const ]b4_int_type_for([b4_defact])[ defact_[]; + static const ]b4_int_type_for([b4_pgoto])[ pgoto_[]; + static const ]b4_int_type_for([b4_defgoto])[ defgoto_[]; + static const ]b4_int_type_for([b4_table])[ table_[]; + static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ table_ninf_; + static const ]b4_int_type_for([b4_check])[ check_[]; + static const ]b4_int_type_for([b4_stos])[ stos_[]; + static const ]b4_int_type_for([b4_r1])[ r1_[]; + static const ]b4_int_type_for([b4_r2])[ r2_[]; + +#if YYDEBUG || YYERROR_VERBOSE + static const char* const name_[]; +#endif + + /* More tables, for debugging. */ +#if YYDEBUG + static const RhsNumberType rhs_[]; + static const ]b4_int_type_for([b4_prhs])[ prhs_[]; + static const ]b4_int_type_for([b4_rline])[ rline_[]; + static const ]b4_int_type_for([b4_toknum])[ token_number_[]; + virtual void reduce_print_ (int yyrule); + virtual void stack_print_ (); +#endif + + /* Even more tables. */ + static inline TokenNumberType translate_ (int token); + static inline void destruct_ (int yytype, SemanticType *yyvaluep, + LocationType *yylocationp); + + /* Constants. */ + static const int eof_; + /* LAST_ -- Last index in TABLE_. */ + static const int last_; + static const int nnts_; + static const int empty_; + static const int final_; + static const int terror_; + static const int errcode_; + static const int ntokens_; + static const unsigned int user_token_number_max_; + static const TokenNumberType undef_token_; + + /* State. */ + int n_; + int len_; + int state_; + + /* Error handling. */ + int nerrs_; + int errstatus_; + + /* Debugging. */ + int debug_; + std::ostream &cdebug_; + + /* Lookahead and lookahead in internal form. */ + int looka_; + int ilooka_; + + /* Message. */ + std::string message; + + /* Semantic value and location of lookahead token. */ + SemanticType value; + LocationType location; + /* Beginning of the last erroneous token popped off. */ + Position error_start_; + + /* @@$ and $$. */ + SemanticType yyval; + LocationType yyloc; + + /* Initial location. */ + LocationType initlocation_; +]b4_parse_param_vars[ + }; +} + +#endif /* ! defined PARSER_HEADER_H */] +])dnl +@output @output_parser_name@ +b4_copyright([C++ Skeleton parser for LALR(1) parsing with Bison], + [2002, 2003, 2004]) + +m4_if(b4_defines_flag, 0, [], [#include @output_header_name@])[ + +/* Enable debugging if requested. */ +#if YYDEBUG +# define YYCDEBUG if (debug_) cdebug_ +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (debug_) \ + reduce_print_ (Rule); \ +} while (0) +# define YY_STACK_PRINT() \ +do { \ + if (debug_) \ + stack_print_ (); \ +} while (0) +#else /* !YYDEBUG */ +# define YYCDEBUG if (0) cdebug_ +# define YY_REDUCE_PRINT(Rule) +# define YY_STACK_PRINT() +#endif /* !YYDEBUG */ + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + +]b4_yydestruct_generate([b4_cxx_destruct_def])[ + +int +yy::]b4_parser_class_name[::parse () +{ + nerrs_ = 0; + errstatus_ = 0; + + /* Initialize the stacks. The initial state will be pushed in + yynewstate, since the latter expects the semantical and the + location values to have been already stored, initialize these + stacks with a primary value. */ + state_stack_ = StateStack (0); + semantic_stack_ = SemanticStack (1); + location_stack_ = LocationStack (1); + + /* Start. */ + state_ = 0; + looka_ = empty_; +#if YYLSP_NEEDED + location = initlocation_; +#endif + YYCDEBUG << "Starting parse" << std::endl; + + /* New state. */ + yynewstate: + state_stack_.push (state_); + YYCDEBUG << "Entering state " << state_ << std::endl; + goto yybackup; + + /* Backup. */ + yybackup: + + /* Try to take a decision without lookahead. */ + n_ = pact_[state_]; + if (n_ == pact_ninf_) + goto yydefault; + + /* Read a lookahead token. */ + if (looka_ == empty_) + { + YYCDEBUG << "Reading a token: "; + lex_ (); + } + + /* Convert token to internal form. */ + if (looka_ <= 0) + { + looka_ = eof_; + ilooka_ = 0; + YYCDEBUG << "Now at end of input." << std::endl; + } + else + { + ilooka_ = translate_ (looka_); +#if YYDEBUG + if (debug_) + { + YYCDEBUG << "Next token is " << looka_ + << " (" << name_[ilooka_]; + print_ (); + YYCDEBUG << ')' << std::endl; + } +#endif + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + n_ += ilooka_; + if (n_ < 0 || last_ < n_ || check_[n_] != ilooka_) + goto yydefault; + + /* Reduce or error. */ + n_ = table_[n_]; + if (n_ < 0) + { + if (n_ == table_ninf_) + goto yyerrlab; + else + { + n_ = -n_; + goto yyreduce; + } + } + else if (n_ == 0) + goto yyerrlab; + + /* Accept? */ + if (n_ == final_) + goto yyacceptlab; + + /* Shift the lookahead token. */ +#if YYDEBUG + YYCDEBUG << "Shifting token " << looka_ + << " (" << name_[ilooka_] << "), "; +#endif + + /* Discard the token being shifted unless it is eof. */ + if (looka_ != eof_) + looka_ = empty_; + + semantic_stack_.push (value); + location_stack_.push (location); + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (errstatus_) + --errstatus_; + + state_ = n_; + goto yynewstate; + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ + yydefault: + n_ = defact_[state_]; + if (n_ == 0) + goto yyerrlab; + goto yyreduce; + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ + yyreduce: + len_ = r2_[n_]; + /* If LEN_ is nonzero, implement the default value of the action: + `$$ = $1'. Otherwise, use the top of the stack. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. */ + if (len_) + { + yyval = semantic_stack_[len_ - 1]; + yyloc = location_stack_[len_ - 1]; + } + else + { + yyval = semantic_stack_[0]; + yyloc = location_stack_[0]; + } + + if (len_) + { + Slice< LocationType, LocationStack > slice (location_stack_, len_); + YYLLOC_DEFAULT (yyloc, slice, len_); + } + YY_REDUCE_PRINT (n_); + switch (n_) + { + ]b4_actions[ + } + +]/* Line __line__ of lalr1.cc. */ +b4_syncline([@oline@], [@ofile@])[ + + state_stack_.pop (len_); + semantic_stack_.pop (len_); + location_stack_.pop (len_); + + YY_STACK_PRINT (); + + semantic_stack_.push (yyval); + location_stack_.push (yyloc); + + /* Shift the result of the reduction. */ + n_ = r1_[n_]; + state_ = pgoto_[n_ - ntokens_] + state_stack_[0]; + if (0 <= state_ && state_ <= last_ && check_[state_] == state_stack_[0]) + state_ = table_[state_]; + else + state_ = defgoto_[n_ - ntokens_]; + goto yynewstate; + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ + yyerrlab: + /* If not already recovering from an error, report this error. */ + report_syntax_error_ (); + + error_start_ = location.begin; + if (errstatus_ == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + /* Return failure if at end of input. */ + if (looka_ <= eof_) + { + /* If at end of input, pop the error token, + then the rest of the stack, then return failure. */ + if (looka_ == eof_) + for (;;) + { + error_start_ = location_stack_[0].begin; + state_stack_.pop (); + semantic_stack_.pop (); + location_stack_.pop (); + if (state_stack_.height () == 1) + YYABORT; +// YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + destruct_ (stos_[state_stack_[0]], + &semantic_stack_[0], + &location_stack_[0]); + } + } + else + { +#if YYDEBUG + YYCDEBUG << "Discarding token " << looka_ + << " (" << name_[ilooka_] << ")." << std::endl; +#endif + destruct_ (ilooka_, &value, &location); + looka_ = empty_; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + +#ifdef __GNUC__ + /* Pacify GCC when the user code never invokes YYERROR and the label + yyerrorlab therefore never appears in user code. */ + if (0) + goto yyerrorlab; +#endif + + state_stack_.pop (len_); + semantic_stack_.pop (len_); + error_start_ = location_stack_[len_ - 1].begin; + location_stack_.pop (len_); + state_ = state_stack_[0]; + goto yyerrlab1; + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + errstatus_ = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + n_ = pact_[state_]; + if (n_ != pact_ninf_) + { + n_ += terror_; + if (0 <= n_ && n_ <= last_ && check_[n_] == terror_) + { + n_ = table_[n_]; + if (0 < n_) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (state_stack_.height () == 1) + YYABORT; + +#if YYDEBUG + if (debug_) + { + if (stos_[state_] < ntokens_) + { + YYCDEBUG << "Error: popping token " + << token_number_[stos_[state_]] + << " (" << name_[stos_[state_]]; +# ifdef YYPRINT + YYPRINT (stderr, token_number_[stos_[state_]], + semantic_stack_.top ()); +# endif + YYCDEBUG << ')' << std::endl; + } + else + { + YYCDEBUG << "Error: popping nonterminal (" + << name_[stos_[state_]] << ')' << std::endl; + } + } +#endif + destruct_ (stos_[state_], &semantic_stack_[0], &location_stack_[0]); + error_start_ = location_stack_[0].begin; + + state_stack_.pop (); + semantic_stack_.pop (); + location_stack_.pop (); + state_ = state_stack_[0]; + YY_STACK_PRINT (); + } + + if (n_ == final_) + goto yyacceptlab; + + YYCDEBUG << "Shifting error token, "; + + { + Location errloc; + errloc.begin = error_start_; + errloc.end = location.end; + semantic_stack_.push (value); + location_stack_.push (errloc); + } + + state_ = n_; + goto yynewstate; + + /* Accept. */ + yyacceptlab: + return 0; + + /* Abort. */ + yyabortlab: + return 1; +} + +void +yy::]b4_parser_class_name[::lex_ () +{ +#if YYLSP_NEEDED + looka_ = yylex (&value, &location); +#else + looka_ = yylex (&value); +#endif +} + +/** Generate an error message, and invoke yyerror. */ +void +yy::]b4_parser_class_name[::report_syntax_error_ () +{ + /* If not already recovering from an error, report this error. */ + if (!errstatus_) + { + ++nerrs_; + +#if YYERROR_VERBOSE + n_ = pact_[state_]; + if (pact_ninf_ < n_ && n_ < last_) + { + message = "syntax error, unexpected "; + message += name_[ilooka_]; + { + int count = 0; + for (int x = (n_ < 0 ? -n_ : 0); x < ntokens_ + nnts_; ++x) + if (check_[x + n_] == x && x != terror_) + ++count; + if (count < 5) + { + count = 0; + for (int x = (n_ < 0 ? -n_ : 0); x < ntokens_ + nnts_; ++x) + if (check_[x + n_] == x && x != terror_) + { + message += (!count++) ? ", expecting " : " or "; + message += name_[x]; + } + } + } + } + else +#endif + message = "syntax error"; + error_ (); + } +} + + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +const ]b4_int_type(b4_pact_ninf, b4_pact_ninf) yy::b4_parser_class_name::pact_ninf_ = b4_pact_ninf[; +const ]b4_int_type_for([b4_pact])[ +yy::]b4_parser_class_name[::pact_[] = +{ + ]b4_pact[ +}; + +/* YYDEFACT[S] -- default rule to reduce with in state S when YYTABLE + doesn't specify something else to do. Zero means the default is an + error. */ +const ]b4_int_type_for([b4_defact])[ +yy::]b4_parser_class_name[::defact_[] = +{ + ]b4_defact[ +}; + +/* YYPGOTO[NTERM-NUM]. */ +const ]b4_int_type_for([b4_pgoto])[ +yy::]b4_parser_class_name[::pgoto_[] = +{ + ]b4_pgoto[ +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +const ]b4_int_type_for([b4_defgoto])[ +yy::]b4_parser_class_name[::defgoto_[] = +{ + ]b4_defgoto[ +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. */ +const ]b4_int_type(b4_table_ninf, b4_table_ninf) yy::b4_parser_class_name::table_ninf_ = b4_table_ninf[; +const ]b4_int_type_for([b4_table])[ +yy::]b4_parser_class_name[::table_[] = +{ + ]b4_table[ +}; + +/* YYCHECK. */ +const ]b4_int_type_for([b4_check])[ +yy::]b4_parser_class_name[::check_[] = +{ + ]b4_check[ +}; + +/* STOS_[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +const ]b4_int_type_for([b4_stos])[ +yy::]b4_parser_class_name[::stos_[] = +{ + ]b4_stos[ +}; + +#if YYDEBUG +/* TOKEN_NUMBER_[YYLEX-NUM] -- Internal token number corresponding + to YYLEX-NUM. */ +const ]b4_int_type_for([b4_toknum])[ +yy::]b4_parser_class_name[::token_number_[] = +{ + ]b4_toknum[ +}; +#endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +const ]b4_int_type_for([b4_r1])[ +yy::]b4_parser_class_name[::r1_[] = +{ + ]b4_r1[ +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +const ]b4_int_type_for([b4_r2])[ +yy::]b4_parser_class_name[::r2_[] = +{ + ]b4_r2[ +}; + +#if YYDEBUG || YYERROR_VERBOSE +/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +const char* +const yy::]b4_parser_class_name[::name_[] = +{ + ]b4_tname[ +}; +#endif + +#if YYDEBUG +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +const yy::]b4_parser_class_name[::RhsNumberType +yy::]b4_parser_class_name[::rhs_[] = +{ + ]b4_rhs[ +}; + +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +const ]b4_int_type_for([b4_prhs])[ +yy::]b4_parser_class_name[::prhs_[] = +{ + ]b4_prhs[ +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +const ]b4_int_type_for([b4_rline])[ +yy::]b4_parser_class_name[::rline_[] = +{ + ]b4_rline[ +}; + +/** Print the state stack from its BOTTOM up to its TOP (included). */ + +void +yy::]b4_parser_class_name[::stack_print_ () +{ + cdebug_ << "state stack now"; + for (StateStack::ConstIterator i = state_stack_.begin (); + i != state_stack_.end (); ++i) + cdebug_ << ' ' << *i; + cdebug_ << std::endl; +} + +/** Report that the YYRULE is going to be reduced. */ + +void +yy::]b4_parser_class_name[::reduce_print_ (int yyrule) +{ + unsigned int yylno = rline_[yyrule]; + /* Print the symbols being reduced, and their result. */ + cdebug_ << "Reducing via rule " << n_ - 1 << " (line " << yylno << "), "; + for (]b4_int_type_for([b4_prhs])[ i = prhs_[n_]; + 0 <= rhs_[i]; ++i) + cdebug_ << name_[rhs_[i]] << ' '; + cdebug_ << "-> " << name_[r1_[n_]] << std::endl; +} +#endif // YYDEBUG + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +yy::]b4_parser_class_name[::TokenNumberType +yy::]b4_parser_class_name[::translate_ (int token) +{ + static + const TokenNumberType + translate_table[] = + { + ]b4_translate[ + }; + if ((unsigned int) token <= user_token_number_max_) + return translate_table[token]; + else + return undef_token_; +} + +const int yy::]b4_parser_class_name[::eof_ = 0; +const int yy::]b4_parser_class_name[::last_ = ]b4_last[; +const int yy::]b4_parser_class_name[::nnts_ = ]b4_nterms_number[; +const int yy::]b4_parser_class_name[::empty_ = -2; +const int yy::]b4_parser_class_name[::final_ = ]b4_final_state_number[; +const int yy::]b4_parser_class_name[::terror_ = 1; +const int yy::]b4_parser_class_name[::errcode_ = 256; +const int yy::]b4_parser_class_name[::ntokens_ = ]b4_tokens_number[; + +const unsigned int yy::]b4_parser_class_name[::user_token_number_max_ = ]b4_user_token_number_max[; +const yy::]b4_parser_class_name[::TokenNumberType yy::]b4_parser_class_name[::undef_token_ = ]b4_undef_token_number[; + +]b4_epilogue +dnl +@output stack.hh +b4_copyright([Stack handling for Bison C++ parsers], [2002, 2003, 2004])[ + +#ifndef BISON_STACK_HH +# define BISON_STACK_HH + +#include + +namespace yy +{ + template < class T, class S = std::deque< T > > + class Stack + { + public: + + typedef typename S::iterator Iterator; + typedef typename S::const_iterator ConstIterator; + + Stack () : seq_ () + { + } + + Stack (unsigned int n) : seq_ (n) + { + } + + inline + T& + operator [] (unsigned int i) + { + return seq_[i]; + } + + inline + const T& + operator [] (unsigned int i) const + { + return seq_[i]; + } + + inline + void + push (const T& t) + { + seq_.push_front (t); + } + + inline + void + pop (unsigned int n = 1) + { + for (; n; --n) + seq_.pop_front (); + } + + inline + unsigned int + height () const + { + return seq_.size (); + } + + inline ConstIterator begin () const { return seq_.begin (); } + inline ConstIterator end () const { return seq_.end (); } + + private: + + S seq_; + }; + + template < class T, class S = Stack< T > > + class Slice + { + public: + + Slice (const S& stack, + unsigned int range) : stack_ (stack), + range_ (range) + { + } + + inline + const T& + operator [] (unsigned int i) const + { + return stack_[range_ - i]; + } + + private: + + const S& stack_; + unsigned int range_; + }; +} + +#endif // not BISON_STACK_HH] +dnl +@output position.hh +b4_copyright([Position class for Bison C++ parsers], [2002, 2003, 2004])[ + +/** + ** \file position.hh + ** Define the Location class. + */ + +#ifndef BISON_POSITION_HH +# define BISON_POSITION_HH + +# include +# include + +namespace yy +{ + /** \brief Abstract a Position. */ + class Position + { + public: + /** \brief Initial column number. */ + static const unsigned int initial_column = 0; + /** \brief Initial line number. */ + static const unsigned int initial_line = 1; + + /** \name Ctor & dtor. + ** \{ */ + public: + /** \brief Construct a Position. */ + Position () : + filename (), + line (initial_line), + column (initial_column) + { + } + /** \} */ + + + /** \name Line and Column related manipulators + ** \{ */ + public: + /** \brief (line related) Advance to the COUNT next lines. */ + inline void lines (int count = 1) + { + column = initial_column; + line += count; + } + + /** \brief (column related) Advance to the COUNT next columns. */ + inline void columns (int count = 1) + { + int leftmost = initial_column; + int current = column; + if (leftmost <= current + count) + column += count; + else + column = initial_column; + } + /** \} */ + + public: + /** \brief File name to which this position refers. */ + std::string filename; + /** \brief Current line number. */ + unsigned int line; + /** \brief Current column number. */ + unsigned int column; + }; + + /** \brief Add and assign a Position. */ + inline const Position& + operator+= (Position& res, const int width) + { + res.columns (width); + return res; + } + + /** \brief Add two Position objects. */ + inline const Position + operator+ (const Position& begin, const int width) + { + Position res = begin; + return res += width; + } + + /** \brief Add and assign a Position. */ + inline const Position& + operator-= (Position& res, const int width) + { + return res += -width; + } + + /** \brief Add two Position objects. */ + inline const Position + operator- (const Position& begin, const int width) + { + return begin + -width; + } + + /** \brief Intercept output stream redirection. + ** \param ostr the destination output stream + ** \param pos a reference to the Position to redirect + */ + inline std::ostream& + operator<< (std::ostream& ostr, const Position& pos) + { + if (!pos.filename.empty ()) + ostr << pos.filename << ':'; + return ostr << pos.line << '.' << pos.column; + } + +} +#endif // not BISON_POSITION_HH] +@output location.hh +b4_copyright([Location class for Bison C++ parsers], [2002, 2003, 2004])[ + +/** + ** \file location.hh + ** Define the Location class. + */ + +#ifndef BISON_LOCATION_HH +# define BISON_LOCATION_HH + +# include +# include +# include "position.hh" + +namespace yy +{ + + /** \brief Abstract a Location. */ + class Location + { + /** \name Ctor & dtor. + ** \{ */ + public: + /** \brief Construct a Location. */ + Location (void) : + begin (), + end () + { + } + /** \} */ + + + /** \name Line and Column related manipulators + ** \{ */ + public: + /** \brief Reset initial location to final location. */ + inline void step (void) + { + begin = end; + } + + /** \brief Extend the current location to the COUNT next columns. */ + inline void columns (unsigned int count = 1) + { + end += count; + } + + /** \brief Extend the current location to the COUNT next lines. */ + inline void lines (unsigned int count = 1) + { + end.lines (count); + } + /** \} */ + + + public: + /** \brief Beginning of the located region. */ + Position begin; + /** \brief End of the located region. */ + Position end; + }; + + /** \brief Join two Location objects to create a Location. */ + inline const Location operator+ (const Location& begin, const Location& end) + { + Location res = begin; + res.end = end.end; + return res; + } + + /** \brief Add two Location objects */ + inline const Location operator+ (const Location& begin, unsigned int width) + { + Location res = begin; + res.columns (width); + return res; + } + + /** \brief Add and assign a Location */ + inline Location &operator+= (Location& res, unsigned int width) + { + res.columns (width); + return res; + } + + /** \brief Intercept output stream redirection. + ** \param ostr the destination output stream + ** \param loc a reference to the Location to redirect + ** + ** Avoid duplicate information. + */ + inline std::ostream& operator<< (std::ostream& ostr, const Location& loc) + { + Position last = loc.end - 1; + ostr << loc.begin; + if (loc.begin.filename != last.filename) + ostr << '-' << last; + else if (loc.begin.line != last.line) + ostr << '-' << last.line << '.' << last.column; + else if (loc.begin.column != last.column) + ostr << '-' << last.column; + return ostr; + } + +} + +#endif // not BISON_LOCATION_HH] diff --git a/src/apps/bin/bison/data/m4sugar/m4sugar.m4 b/src/apps/bin/bison/data/m4sugar/m4sugar.m4 new file mode 100644 index 0000000000..83c2ac6d55 --- /dev/null +++ b/src/apps/bin/bison/data/m4sugar/m4sugar.m4 @@ -0,0 +1,1803 @@ +divert(-1)# -*- Autoconf -*- +# This file is part of Autoconf. +# Base M4 layer. +# Requires GNU M4. +# Copyright (C) 1999, 2000, 2001, 2002, 2003 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. +# +# As a special exception, the Free Software Foundation gives unlimited +# permission to copy, distribute and modify the configure scripts that +# are the output of Autoconf. You need not follow the terms of the GNU +# General Public License when using or distributing such scripts, even +# though portions of the text of Autoconf appear in them. The GNU +# General Public License (GPL) does govern all other use of the material +# that constitutes the Autoconf program. +# +# Certain portions of the Autoconf source text are designed to be copied +# (in certain cases, depending on the input) into the output of +# Autoconf. We call these the "data" portions. The rest of the Autoconf +# source text consists of comments plus executable code that decides which +# of the data portions to output in any given case. We call these +# comments and executable code the "non-data" portions. Autoconf never +# copies any of the non-data portions into its output. +# +# This special exception to the GPL applies to versions of Autoconf +# released by the Free Software Foundation. When you make and +# distribute a modified version of Autoconf, you may extend this special +# exception to the GPL to apply to your modified version as well, *unless* +# your modified version has the potential to copy into its output some +# of the text that was the non-data portion of the version that you started +# with. (In other words, unless your change moves or copies text from +# the non-data portions to the data portions.) If your modification has +# such potential, you must delete any notice of this special exception +# to the GPL from your modified version. +# +# Written by Akim Demaille. +# + +# Set the quotes, whatever the current quoting system. +changequote() +changequote([, ]) + +# Some old m4's don't support m4exit. But they provide +# equivalent functionality by core dumping because of the +# long macros we define. +ifdef([__gnu__], , +[errprint(M4sugar requires GNU M4. Install it before installing M4sugar or +set the M4 environment variable to its path name.) +m4exit(2)]) + + +## ------------------------------- ## +## 1. Simulate --prefix-builtins. ## +## ------------------------------- ## + +# m4_define +# m4_defn +# m4_undefine +define([m4_define], defn([define])) +define([m4_defn], defn([defn])) +define([m4_undefine], defn([undefine])) + +m4_undefine([define]) +m4_undefine([defn]) +m4_undefine([undefine]) + + +# m4_copy(SRC, DST) +# ----------------- +# Define DST as the definition of SRC. +# What's the difference between: +# 1. m4_copy([from], [to]) +# 2. m4_define([from], [to($@)]) +# Well, obviously 1 is more expansive in space. Maybe 2 is more expansive +# in time, but because of the space cost of 1, it's not that obvious. +# Nevertheless, one huge difference is the handling of `$0'. If `from' +# uses `$0', then with 1, `to''s `$0' is `to', while it is `from' in 2. +# The user will certainly prefer see `from'. +m4_define([m4_copy], +[m4_define([$2], m4_defn([$1]))]) + + +# m4_rename(SRC, DST) +# ------------------- +# Rename the macro SRC as DST. +m4_define([m4_rename], +[m4_copy([$1], [$2])m4_undefine([$1])]) + + +# m4_rename_m4(MACRO-NAME) +# ------------------------ +# Rename MACRO-NAME as m4_MACRO-NAME. +m4_define([m4_rename_m4], +[m4_rename([$1], [m4_$1])]) + + +# m4_copy_unm4(m4_MACRO-NAME) +# --------------------------- +# Copy m4_MACRO-NAME as MACRO-NAME. +m4_define([m4_copy_unm4], +[m4_copy([$1], m4_bpatsubst([$1], [^m4_\(.*\)], [[\1]]))]) + + +# Some m4 internals have names colliding with tokens we might use. +# Rename them a` la `m4 --prefix-builtins'. +m4_rename_m4([builtin]) +m4_rename_m4([changecom]) +m4_rename_m4([changequote]) +m4_rename_m4([debugfile]) +m4_rename_m4([debugmode]) +m4_rename_m4([decr]) +m4_undefine([divert]) +m4_rename_m4([divnum]) +m4_rename_m4([dumpdef]) +m4_rename_m4([errprint]) +m4_rename_m4([esyscmd]) +m4_rename_m4([eval]) +m4_rename_m4([format]) +m4_rename_m4([ifdef]) +m4_rename([ifelse], [m4_if]) +m4_rename_m4([include]) +m4_rename_m4([incr]) +m4_rename_m4([index]) +m4_rename_m4([indir]) +m4_rename_m4([len]) +m4_rename([m4exit], [m4_exit]) +m4_rename([m4wrap], [m4_wrap]) +m4_rename_m4([maketemp]) +m4_rename([patsubst], [m4_bpatsubst]) +m4_undefine([popdef]) +m4_rename_m4([pushdef]) +m4_rename([regexp], [m4_bregexp]) +m4_rename_m4([shift]) +m4_rename_m4([sinclude]) +m4_rename_m4([substr]) +m4_rename_m4([symbols]) +m4_rename_m4([syscmd]) +m4_rename_m4([sysval]) +m4_rename_m4([traceoff]) +m4_rename_m4([traceon]) +m4_rename_m4([translit]) +m4_undefine([undivert]) + + +## ------------------- ## +## 2. Error messages. ## +## ------------------- ## + + +# m4_location +# ----------- +m4_define([m4_location], +[__file__:__line__]) + + +# m4_errprintn(MSG) +# ----------------- +# Same as `errprint', but with the missing end of line. +m4_define([m4_errprintn], +[m4_errprint([$1 +])]) + + +# m4_warning(MSG) +# --------------- +# Warn the user. +m4_define([m4_warning], +[m4_errprintn(m4_location[: warning: $1])]) + + +# m4_fatal(MSG, [EXIT-STATUS]) +# ---------------------------- +# Fatal the user. :) +m4_define([m4_fatal], +[m4_errprintn(m4_location[: error: $1])dnl +m4_expansion_stack_dump()dnl +m4_exit(m4_if([$2],, 1, [$2]))]) + + +# m4_assert(EXPRESSION, [EXIT-STATUS = 1]) +# ---------------------------------------- +# This macro ensures that EXPRESSION evaluates to true, and exits if +# EXPRESSION evaluates to false. +m4_define([m4_assert], +[m4_if(m4_eval([$1]), 0, + [m4_fatal([assert failed: $1], [$2])])]) + + +## ------------- ## +## 3. Warnings. ## +## ------------- ## + + +# m4_warning_ifelse(CATEGORY, IF-TRUE, IF-FALSE) +# ---------------------------------------------- +# If the CATEGORY of warnings is enabled, expand IF_TRUE otherwise +# IF-FALSE. +# +# The variable `m4_warnings' contains a comma separated list of +# warnings which order is the converse from the one specified by +# the user, i.e., if she specified `-W error,none,obsolete', +# `m4_warnings' is `obsolete,none,error'. We read it from left to +# right, and: +# - if none or noCATEGORY is met, run IF-FALSE +# - if all or CATEGORY is met, run IF-TRUE +# - if there is nothing left, run IF-FALSE. +m4_define([m4_warning_ifelse], +[_m4_warning_ifelse([$1], [$2], [$3], m4_warnings)]) + + +# _m4_warning_ifelse(CATEGORY, IF-TRUE, IF-FALSE, WARNING1, ...) +# -------------------------------------------------------------- +# Implementation of the loop described above. +m4_define([_m4_warning_ifelse], +[m4_case([$4], + [$1], [$2], + [all], [$2], + [], [$3], + [none], [$3], + [no-$1], [$3], + [$0([$1], [$2], [$3], m4_shiftn(4, $@))])]) + + +# _m4_warning_error_ifelse(IF-TRUE, IF-FALSE) +# ------------------------------------------- +# The same as m4_warning_ifelse, but scan for `error' only. +m4_define([_m4_warning_error_ifelse], +[__m4_warning_error_ifelse([$1], [$2], m4_warnings)]) + + +# __m4_warning_error_ifelse(IF-TRUE, IF-FALSE) +# -------------------------------------------- +# The same as _m4_warning_ifelse, but scan for `error' only. +m4_define([__m4_warning_error_ifelse], +[m4_case([$3], + [error], [$1], + [], [$2], + [no-error], [$2], + [$0([$1], [$2], m4_shiftn(3, $@))])]) + + + +# _m4_warn(MESSAGE) +# ----------------- +# Report MESSAGE as a warning, unless the user requested -W error, +# in which case report a fatal error. +m4_define([_m4_warn], +[_m4_warning_error_ifelse([m4_fatal([$1])], + [m4_warning([$1])])]) + + +# m4_warn(CATEGORY, MESSAGE) +# -------------------------- +# Report a MESSAGE to the autoconf user if the CATEGORY of warnings +# is requested (in fact, not disabled). +m4_define([m4_warn], +[m4_warning_ifelse([$1], [_m4_warn([$2])])]) + + + + +## ------------------- ## +## 4. File inclusion. ## +## ------------------- ## + + +# We also want to neutralize include (and sinclude for symmetry), +# but we want to extend them slightly: warn when a file is included +# several times. This is in general a dangerous operation because +# quite nobody quotes the first argument of m4_define. +# +# For instance in the following case: +# m4_define(foo, [bar]) +# then a second reading will turn into +# m4_define(bar, [bar]) +# which is certainly not what was meant. + +# m4_include_unique(FILE) +# ----------------------- +# Declare that the FILE was loading; and warn if it has already +# been included. +m4_define([m4_include_unique], +[m4_ifdef([m4_include($1)], + [m4_warn([syntax], [file `$1' included several times])])dnl +m4_define([m4_include($1)])]) + + +# m4_include(FILE) +# ---------------- +# As the builtin include, but warns against multiple inclusions. +m4_define([m4_include], +[m4_include_unique([$1])dnl +m4_builtin([include], [$1])]) + + +# m4_sinclude(FILE) +# ----------------- +# As the builtin sinclude, but warns against multiple inclusions. +m4_define([m4_sinclude], +[m4_include_unique([$1])dnl +m4_builtin([sinclude], [$1])]) + + + +## ------------------------------------ ## +## 5. Additional branching constructs. ## +## ------------------------------------ ## + +# Both `m4_ifval' and `m4_ifset' tests against the empty string. The +# difference is that `m4_ifset' is specialized on macros. +# +# In case of arguments of macros, eg $[1], it makes little difference. +# In the case of a macro `FOO', you don't want to check `m4_ifval(FOO, +# TRUE)', because if `FOO' expands with commas, there is a shifting of +# the arguments. So you want to run `m4_ifval([FOO])', but then you just +# compare the *string* `FOO' against `', which, of course fails. +# +# So you want a variation of `m4_ifset' that expects a macro name as $[1]. +# If this macro is both defined and defined to a non empty value, then +# it runs TRUE etc. + + +# m4_ifval(COND, [IF-TRUE], [IF-FALSE]) +# ------------------------------------- +# If COND is not the empty string, expand IF-TRUE, otherwise IF-FALSE. +# Comparable to m4_ifdef. +m4_define([m4_ifval], +[m4_if([$1], [], [$3], [$2])]) + + +# m4_n(TEXT) +# ---------- +# If TEXT is not empty, return TEXT and a new line, otherwise nothing. +m4_define([m4_n], +[m4_if([$1], + [], [], + [$1 +])]) + + +# m4_ifvaln(COND, [IF-TRUE], [IF-FALSE]) +# -------------------------------------- +# Same as `m4_ifval', but add an extra newline to IF-TRUE or IF-FALSE +# unless that argument is empty. +m4_define([m4_ifvaln], +[m4_if([$1], + [], [m4_n([$3])], + [m4_n([$2])])]) + + +# m4_ifset(MACRO, [IF-TRUE], [IF-FALSE]) +# -------------------------------------- +# If MACRO has no definition, or of its definition is the empty string, +# expand IF-FALSE, otherwise IF-TRUE. +m4_define([m4_ifset], +[m4_ifdef([$1], + [m4_if(m4_defn([$1]), [], [$3], [$2])], + [$3])]) + + +# m4_ifndef(NAME, [IF-NOT-DEFINED], [IF-DEFINED]) +# ----------------------------------------------- +m4_define([m4_ifndef], +[m4_ifdef([$1], [$3], [$2])]) + + +# m4_case(SWITCH, VAL1, IF-VAL1, VAL2, IF-VAL2, ..., DEFAULT) +# ----------------------------------------------------------- +# m4 equivalent of +# switch (SWITCH) +# { +# case VAL1: +# IF-VAL1; +# break; +# case VAL2: +# IF-VAL2; +# break; +# ... +# default: +# DEFAULT; +# break; +# }. +# All the values are optional, and the macro is robust to active +# symbols properly quoted. +m4_define([m4_case], +[m4_if([$#], 0, [], + [$#], 1, [], + [$#], 2, [$2], + [$1], [$2], [$3], + [$0([$1], m4_shiftn(3, $@))])]) + + +# m4_bmatch(SWITCH, RE1, VAL1, RE2, VAL2, ..., DEFAULT) +# ----------------------------------------------------- +# m4 equivalent of +# +# if (SWITCH =~ RE1) +# VAL1; +# elif (SWITCH =~ RE2) +# VAL2; +# elif ... +# ... +# else +# DEFAULT +# +# All the values are optional, and the macro is robust to active symbols +# properly quoted. +m4_define([m4_bmatch], +[m4_if([$#], 0, [], + [$#], 1, [], + [$#], 2, [$2], + [m4_if(m4_bregexp([$1], [$2]), -1, [$0([$1], m4_shiftn(3, $@))], + [$3])])]) + + +# m4_map(MACRO, LIST) +# ------------------- +# Invoke MACRO($1), MACRO($2) etc. where $1, $2... are the elements +# of LIST (which can be lists themselves, for multiple arguments MACROs). +m4_define([m4_fst], [$1]) +m4_define([m4_map], +[m4_if([$2], [], [], + [$2], [[]], [], + [$1(m4_fst($2))[]dnl +m4_map([$1], m4_cdr($2))])]) + + +# m4_map_sep(MACRO, SEPARATOR, LIST) +# ---------------------------------- +# Invoke MACRO($1), SEPARATOR, MACRO($2), ..., MACRO($N) where $1, $2... $N +# are the elements of LIST (which can be lists themselves, for multiple +# arguments MACROs). +m4_define([m4_map_sep], +[m4_if([$3], [[]], [], + [$1(m4_fst($3))[]dnl +m4_if(m4_cdr($3), + [[]], [], + [$2])[]dnl +m4_map_sep([$1], [$2], m4_cdr($3))])]) + + +## ---------------------------------------- ## +## 6. Enhanced version of some primitives. ## +## ---------------------------------------- ## + +# m4_patsubsts(STRING, RE1, SUBST1, RE2, SUBST2, ...) +# --------------------------------------------------- +# m4 equivalent of +# +# $_ = STRING; +# s/RE1/SUBST1/g; +# s/RE2/SUBST2/g; +# ... +# +# All the values are optional, and the macro is robust to active symbols +# properly quoted. +# +# I would have liked to name this macro `m4_patsubst', unfortunately, +# due to quotation problems, I need to double quote $1 below, therefore +# the anchors are broken :( I can't let users be trapped by that. +m4_define([m4_bpatsubsts], +[m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])], + [$#], 1, [m4_fatal([$0: too few arguments: $#: $1])], + [$#], 2, [m4_builtin([patsubst], $@)], + [$0(m4_builtin([patsubst], [[$1]], [$2], [$3]), + m4_shiftn(3, $@))])]) + + + +# m4_do(STRING, ...) +# ------------------ +# This macro invokes all its arguments (in sequence, of course). It is +# useful for making your macros more structured and readable by dropping +# unnecessary dnl's and have the macros indented properly. +m4_define([m4_do], +[m4_if($#, 0, [], + $#, 1, [$1], + [$1[]m4_do(m4_shift($@))])]) + + +# m4_define_default(MACRO, VALUE) +# ------------------------------- +# If MACRO is undefined, set it to VALUE. +m4_define([m4_define_default], +[m4_ifndef([$1], [m4_define($@)])]) + + +# m4_default(EXP1, EXP2) +# ---------------------- +# Returns EXP1 if non empty, otherwise EXP2. +m4_define([m4_default], +[m4_ifval([$1], [$1], [$2])]) + + +# m4_defn(NAME) +# ------------- +# Unlike to the original, don't tolerate popping something which is +# undefined. +m4_define([m4_defn], +[m4_ifndef([$1], + [m4_fatal([$0: undefined macro: $1])])dnl +m4_builtin([defn], $@)]) + + +# _m4_dumpdefs_up(NAME) +# --------------------- +m4_define([_m4_dumpdefs_up], +[m4_ifdef([$1], + [m4_pushdef([_m4_dumpdefs], m4_defn([$1]))dnl +m4_dumpdef([$1])dnl +m4_popdef([$1])dnl +_m4_dumpdefs_up([$1])])]) + + +# _m4_dumpdefs_down(NAME) +# ----------------------- +m4_define([_m4_dumpdefs_down], +[m4_ifdef([_m4_dumpdefs], + [m4_pushdef([$1], m4_defn([_m4_dumpdefs]))dnl +m4_popdef([_m4_dumpdefs])dnl +_m4_dumpdefs_down([$1])])]) + + +# m4_dumpdefs(NAME) +# ----------------- +# Similar to `m4_dumpdef(NAME)', but if NAME was m4_pushdef'ed, display its +# value stack (most recent displayed first). +m4_define([m4_dumpdefs], +[_m4_dumpdefs_up([$1])dnl +_m4_dumpdefs_down([$1])]) + + +# m4_popdef(NAME) +# --------------- +# Unlike to the original, don't tolerate popping something which is +# undefined. +m4_define([m4_popdef], +[m4_ifndef([$1], + [m4_fatal([$0: undefined macro: $1])])dnl +m4_builtin([popdef], $@)]) + + +# m4_quote(ARGS) +# -------------- +# Return ARGS as a single arguments. +# +# It is important to realize the difference between `m4_quote(exp)' and +# `[exp]': in the first case you obtain the quoted *result* of the +# expansion of EXP, while in the latter you just obtain the string +# `exp'. +m4_define([m4_quote], [[$*]]) +m4_define([m4_dquote], [[$@]]) + + +# m4_noquote(STRING) +# ------------------ +# Return the result of ignoring all quotes in STRING and invoking the +# macros it contains. Amongst other things useful for enabling macro +# invocations inside strings with [] blocks (for instance regexps and +# help-strings). +m4_define([m4_noquote], +[m4_changequote(-=<{,}>=-)$1-=<{}>=-m4_changequote([,])]) + + +# m4_shiftn(N, ...) +# ----------------- +# Returns ... shifted N times. Useful for recursive "varargs" constructs. +m4_define([m4_shiftn], +[m4_assert(($1 >= 0) && ($# > $1))dnl +_m4_shiftn($@)]) + +m4_define([_m4_shiftn], +[m4_if([$1], 0, + [m4_shift($@)], + [_m4_shiftn(m4_eval([$1]-1), m4_shift(m4_shift($@)))])]) + + +# m4_undefine(NAME) +# ----------------- +# Unlike to the original, don't tolerate undefining something which is +# undefined. +m4_define([m4_undefine], +[m4_ifndef([$1], + [m4_fatal([$0: undefined macro: $1])])dnl +m4_builtin([undefine], $@)]) + + +## -------------------------- ## +## 7. Implementing m4 loops. ## +## -------------------------- ## + + +# m4_for(VARIABLE, FIRST, LAST, [STEP = +/-1], EXPRESSION) +# -------------------------------------------------------- +# Expand EXPRESSION defining VARIABLE to FROM, FROM + 1, ..., TO. +# Both limits are included, and bounds are checked for consistency. +m4_define([m4_for], +[m4_case(m4_sign(m4_eval($3 - $2)), + 1, [m4_assert(m4_sign(m4_default($4, 1)) == 1)], + -1, [m4_assert(m4_sign(m4_default($4, -1)) == -1)])dnl +m4_pushdef([$1], [$2])dnl +m4_if(m4_eval([$3 > $2]), 1, + [_m4_for([$1], [$3], m4_default([$4], 1), [$5])], + [_m4_for([$1], [$3], m4_default([$4], -1), [$5])])dnl +m4_popdef([$1])]) + + +# _m4_for(VARIABLE, FIRST, LAST, STEP, EXPRESSION) +# ------------------------------------------------ +# Core of the loop, no consistency checks. +m4_define([_m4_for], +[$4[]dnl +m4_if($1, [$2], [], + [m4_define([$1], m4_eval($1+[$3]))_m4_for([$1], [$2], [$3], [$4])])]) + + +# Implementing `foreach' loops in m4 is much more tricky than it may +# seem. Actually, the example of a `foreach' loop in the m4 +# documentation is wrong: it does not quote the arguments properly, +# which leads to undesirable expansions. +# +# The example in the documentation is: +# +# | # foreach(VAR, (LIST), STMT) +# | m4_define([foreach], +# | [m4_pushdef([$1])_foreach([$1], [$2], [$3])m4_popdef([$1])]) +# | m4_define([_arg1], [$1]) +# | m4_define([_foreach], +# | [m4_if([$2], [()], , +# | [m4_define([$1], _arg1$2)$3[]_foreach([$1], +# | (shift$2), +# | [$3])])]) +# +# But then if you run +# +# | m4_define(a, 1) +# | m4_define(b, 2) +# | m4_define(c, 3) +# | foreach([f], [([a], [(b], [c)])], [echo f +# | ]) +# +# it gives +# +# => echo 1 +# => echo (2,3) +# +# which is not what is expected. +# +# Of course the problem is that many quotes are missing. So you add +# plenty of quotes at random places, until you reach the expected +# result. Alternatively, if you are a quoting wizard, you directly +# reach the following implementation (but if you really did, then +# apply to the maintenance of m4sugar!). +# +# | # foreach(VAR, (LIST), STMT) +# | m4_define([foreach], [m4_pushdef([$1])_foreach($@)m4_popdef([$1])]) +# | m4_define([_arg1], [[$1]]) +# | m4_define([_foreach], +# | [m4_if($2, [()], , +# | [m4_define([$1], [_arg1$2])$3[]_foreach([$1], +# | [(shift$2)], +# | [$3])])]) +# +# which this time answers +# +# => echo a +# => echo (b +# => echo c) +# +# Bingo! +# +# Well, not quite. +# +# With a better look, you realize that the parens are more a pain than +# a help: since anyway you need to quote properly the list, you end up +# with always using an outermost pair of parens and an outermost pair +# of quotes. Rejecting the parens both eases the implementation, and +# simplifies the use: +# +# | # foreach(VAR, (LIST), STMT) +# | m4_define([foreach], [m4_pushdef([$1])_foreach($@)m4_popdef([$1])]) +# | m4_define([_arg1], [$1]) +# | m4_define([_foreach], +# | [m4_if($2, [], , +# | [m4_define([$1], [_arg1($2)])$3[]_foreach([$1], +# | [shift($2)], +# | [$3])])]) +# +# +# Now, just replace the `$2' with `m4_quote($2)' in the outer `m4_if' +# to improve robustness, and you come up with a quite satisfactory +# implementation. + + +# m4_foreach(VARIABLE, LIST, EXPRESSION) +# -------------------------------------- +# +# Expand EXPRESSION assigning each value of the LIST to VARIABLE. +# LIST should have the form `item_1, item_2, ..., item_n', i.e. the +# whole list must *quoted*. Quote members too if you don't want them +# to be expanded. +# +# This macro is robust to active symbols: +# | m4_define(active, [ACT, IVE]) +# | m4_foreach(Var, [active, active], [-Var-]) +# => -ACT--IVE--ACT--IVE- +# +# | m4_foreach(Var, [[active], [active]], [-Var-]) +# => -ACT, IVE--ACT, IVE- +# +# | m4_foreach(Var, [[[active]], [[active]]], [-Var-]) +# => -active--active- +m4_define([m4_foreach], +[m4_pushdef([$1])_m4_foreach($@)m4_popdef([$1])]) + +# Low level macros used to define m4_foreach. +m4_define([m4_car], [[$1]]) +m4_define([m4_cdr], [m4_dquote(m4_shift($@))]) +m4_define([_m4_foreach], +[m4_if([$2], [[]], [], + [m4_define([$1], m4_car($2))$3[]_m4_foreach([$1], + m4_cdr($2), + [$3])])]) + + + +## --------------------------- ## +## 8. More diversion support. ## +## --------------------------- ## + + +# _m4_divert(DIVERSION-NAME or NUMBER) +# ------------------------------------ +# If DIVERSION-NAME is the name of a diversion, return its number, +# otherwise if is a NUMBER return it. +m4_define([_m4_divert], +[m4_ifdef([_m4_divert($1)], + [m4_indir([_m4_divert($1)])], + [$1])]) + +# KILL is only used to suppress output. +m4_define([_m4_divert(KILL)], -1) + + +# m4_divert(DIVERSION-NAME) +# ------------------------- +# Change the diversion stream to DIVERSION-NAME. +m4_define([m4_divert], +[m4_define([m4_divert_stack], + m4_location[: $0: $1]m4_ifdef([m4_divert_stack], [ +m4_defn([m4_divert_stack])]))dnl +m4_builtin([divert], _m4_divert([$1]))dnl +]) + + +# m4_divert_push(DIVERSION-NAME) +# ------------------------------ +# Change the diversion stream to DIVERSION-NAME, while stacking old values. +m4_define([m4_divert_push], +[m4_pushdef([m4_divert_stack], + m4_location[: $0: $1]m4_ifdef([m4_divert_stack], [ +m4_defn([m4_divert_stack])]))dnl +m4_pushdef([_m4_divert_diversion], [$1])dnl +m4_builtin([divert], _m4_divert(_m4_divert_diversion))dnl +]) + + +# m4_divert_pop([DIVERSION-NAME]) +# ------------------------------- +# Change the diversion stream to its previous value, unstacking it. +# If specified, verify we left DIVERSION-NAME. +m4_define([m4_divert_pop], +[m4_ifval([$1], + [m4_if(_m4_divert([$1]), m4_divnum, [], + [m4_fatal([$0($1): diversion mismatch: ] +m4_defn([m4_divert_stack]))])])dnl +m4_popdef([_m4_divert_diversion])dnl +dnl m4_ifndef([_m4_divert_diversion], +dnl [m4_fatal([too many m4_divert_pop])])dnl +m4_builtin([divert], + m4_ifdef([_m4_divert_diversion], + [_m4_divert(_m4_divert_diversion)], -1))dnl +m4_popdef([m4_divert_stack])dnl +]) + + +# m4_divert_text(DIVERSION-NAME, CONTENT) +# --------------------------------------- +# Output CONTENT into DIVERSION-NAME (which may be a number actually). +# An end of line is appended for free to CONTENT. +m4_define([m4_divert_text], +[m4_divert_push([$1])dnl +$2 +m4_divert_pop([$1])dnl +]) + + +# m4_divert_once(DIVERSION-NAME, CONTENT) +# --------------------------------------- +# Output once CONTENT into DIVERSION-NAME (which may be a number +# actually). An end of line is appended for free to CONTENT. +m4_define([m4_divert_once], +[m4_expand_once([m4_divert_text([$1], [$2])])]) + + +# m4_undivert(DIVERSION-NAME) +# --------------------------- +# Undivert DIVERSION-NAME. +m4_define([m4_undivert], +[m4_builtin([undivert], _m4_divert([$1]))]) + + +## -------------------------------------------- ## +## 8. Defining macros with bells and whistles. ## +## -------------------------------------------- ## + +# `m4_defun' is basically `m4_define' but it equips the macro with the +# needed machinery for `m4_require'. A macro must be m4_defun'd if +# either it is m4_require'd, or it m4_require's. +# +# Two things deserve attention and are detailed below: +# 1. Implementation of m4_require +# 2. Keeping track of the expansion stack +# +# 1. Implementation of m4_require +# =============================== +# +# Of course m4_defun AC_PROVIDE's the macro, so that a macro which has +# been expanded is not expanded again when m4_require'd, but the +# difficult part is the proper expansion of macros when they are +# m4_require'd. +# +# The implementation is based on two ideas, (i) using diversions to +# prepare the expansion of the macro and its dependencies (by Franc,ois +# Pinard), and (ii) expand the most recently m4_require'd macros _after_ +# the previous macros (by Axel Thimm). +# +# +# The first idea: why using diversions? +# ------------------------------------- +# +# When a macro requires another, the other macro is expanded in new +# diversion, GROW. When the outer macro is fully expanded, we first +# undivert the most nested diversions (GROW - 1...), and finally +# undivert GROW. To understand why we need several diversions, +# consider the following example: +# +# | m4_defun([TEST1], [Test...REQUIRE([TEST2])1]) +# | m4_defun([TEST2], [Test...REQUIRE([TEST3])2]) +# | m4_defun([TEST3], [Test...3]) +# +# Because m4_require is not required to be first in the outer macros, we +# must keep the expansions of the various level of m4_require separated. +# Right before executing the epilogue of TEST1, we have: +# +# GROW - 2: Test...3 +# GROW - 1: Test...2 +# GROW: Test...1 +# BODY: +# +# Finally the epilogue of TEST1 undiverts GROW - 2, GROW - 1, and +# GROW into the regular flow, BODY. +# +# GROW - 2: +# GROW - 1: +# GROW: +# BODY: Test...3; Test...2; Test...1 +# +# (The semicolons are here for clarification, but of course are not +# emitted.) This is what Autoconf 2.0 (I think) to 2.13 (I'm sure) +# implement. +# +# +# The second idea: first required first out +# ----------------------------------------- +# +# The natural implementation of the idea above is buggy and produces +# very surprising results in some situations. Let's consider the +# following example to explain the bug: +# +# | m4_defun([TEST1], [REQUIRE([TEST2a])REQUIRE([TEST2b])]) +# | m4_defun([TEST2a], []) +# | m4_defun([TEST2b], [REQUIRE([TEST3])]) +# | m4_defun([TEST3], [REQUIRE([TEST2a])]) +# | +# | AC_INIT +# | TEST1 +# +# The dependencies between the macros are: +# +# 3 --- 2b +# / \ is m4_require'd by +# / \ left -------------------- right +# 2a ------------ 1 +# +# If you strictly apply the rules given in the previous section you get: +# +# GROW - 2: TEST3 +# GROW - 1: TEST2a; TEST2b +# GROW: TEST1 +# BODY: +# +# (TEST2a, although required by TEST3 is not expanded in GROW - 3 +# because is has already been expanded before in GROW - 1, so it has +# been AC_PROVIDE'd, so it is not expanded again) so when you undivert +# the stack of diversions, you get: +# +# GROW - 2: +# GROW - 1: +# GROW: +# BODY: TEST3; TEST2a; TEST2b; TEST1 +# +# i.e., TEST2a is expanded after TEST3 although the latter required the +# former. +# +# Starting from 2.50, uses an implementation provided by Axel Thimm. +# The idea is simple: the order in which macros are emitted must be the +# same as the one in which macro are expanded. (The bug above can +# indeed be described as: a macro has been AC_PROVIDE'd, but it is +# emitted after: the lack of correlation between emission and expansion +# order is guilty). +# +# How to do that? You keeping the stack of diversions to elaborate the +# macros, but each time a macro is fully expanded, emit it immediately. +# +# In the example above, when TEST2a is expanded, but it's epilogue is +# not run yet, you have: +# +# GROW - 2: +# GROW - 1: TEST2a +# GROW: Elaboration of TEST1 +# BODY: +# +# The epilogue of TEST2a emits it immediately: +# +# GROW - 2: +# GROW - 1: +# GROW: Elaboration of TEST1 +# BODY: TEST2a +# +# TEST2b then requires TEST3, so right before the epilogue of TEST3, you +# have: +# +# GROW - 2: TEST3 +# GROW - 1: Elaboration of TEST2b +# GROW: Elaboration of TEST1 +# BODY: TEST2a +# +# The epilogue of TEST3 emits it: +# +# GROW - 2: +# GROW - 1: Elaboration of TEST2b +# GROW: Elaboration of TEST1 +# BODY: TEST2a; TEST3 +# +# TEST2b is now completely expanded, and emitted: +# +# GROW - 2: +# GROW - 1: +# GROW: Elaboration of TEST1 +# BODY: TEST2a; TEST3; TEST2b +# +# and finally, TEST1 is finished and emitted: +# +# GROW - 2: +# GROW - 1: +# GROW: +# BODY: TEST2a; TEST3; TEST2b: TEST1 +# +# The idea, is simple, but the implementation is a bit evolved. If you +# are like me, you will want to see the actual functioning of this +# implementation to be convinced. The next section gives the full +# details. +# +# +# The Axel Thimm implementation at work +# ------------------------------------- +# +# We consider the macros above, and this configure.ac: +# +# AC_INIT +# TEST1 +# +# You should keep the definitions of _m4_defun_pro, _m4_defun_epi, and +# m4_require at hand to follow the steps. +# +# This implements tries not to assume that of the current diversion is +# BODY, so as soon as a macro (m4_defun'd) is expanded, we first +# record the current diversion under the name _m4_divert_dump (denoted +# DUMP below for short). This introduces an important difference with +# the previous versions of Autoconf: you cannot use m4_require if you +# were not inside an m4_defun'd macro, and especially, you cannot +# m4_require directly from the top level. +# +# We have not tried to simulate the old behavior (better yet, we +# diagnose it), because it is too dangerous: a macro m4_require'd from +# the top level is expanded before the body of `configure', i.e., before +# any other test was run. I let you imagine the result of requiring +# AC_STDC_HEADERS for instance, before AC_PROG_CC was actually run.... +# +# After AC_INIT was run, the current diversion is BODY. +# * AC_INIT was run +# DUMP: undefined +# diversion stack: BODY |- +# +# * TEST1 is expanded +# The prologue of TEST1 sets AC_DIVERSION_DUMP, which is the diversion +# where the current elaboration will be dumped, to the current +# diversion. It also m4_divert_push to GROW, where the full +# expansion of TEST1 and its dependencies will be elaborated. +# DUMP: BODY +# BODY: empty +# diversions: GROW, BODY |- +# +# * TEST1 requires TEST2a: prologue +# m4_require m4_divert_pushes another temporary diversion GROW - 1 (in +# fact, the diversion whose number is one less than the current +# diversion), and expands TEST2a in there. +# DUMP: BODY +# BODY: empty +# diversions: GROW-1, GROW, BODY |- +# +# * TEST2a is expanded. +# Its prologue pushes the current diversion again. +# DUMP: BODY +# BODY: empty +# diversions: GROW - 1, GROW - 1, GROW, BODY |- +# It is expanded in GROW - 1, and GROW - 1 is popped by the epilogue +# of TEST2a. +# DUMP: BODY +# BODY: nothing +# GROW - 1: TEST2a +# diversions: GROW - 1, GROW, BODY |- +# +# * TEST1 requires TEST2a: epilogue +# The content of the current diversion is appended to DUMP (and removed +# from the current diversion). A diversion is popped. +# DUMP: BODY +# BODY: TEST2a +# diversions: GROW, BODY |- +# +# * TEST1 requires TEST2b: prologue +# m4_require pushes GROW - 1 and expands TEST2b. +# DUMP: BODY +# BODY: TEST2a +# diversions: GROW - 1, GROW, BODY |- +# +# * TEST2b is expanded. +# Its prologue pushes the current diversion again. +# DUMP: BODY +# BODY: TEST2a +# diversions: GROW - 1, GROW - 1, GROW, BODY |- +# The body is expanded here. +# +# * TEST2b requires TEST3: prologue +# m4_require pushes GROW - 2 and expands TEST3. +# DUMP: BODY +# BODY: TEST2a +# diversions: GROW - 2, GROW - 1, GROW - 1, GROW, BODY |- +# +# * TEST3 is expanded. +# Its prologue pushes the current diversion again. +# DUMP: BODY +# BODY: TEST2a +# diversions: GROW-2, GROW-2, GROW-1, GROW-1, GROW, BODY |- +# TEST3 requires TEST2a, but TEST2a has already been AC_PROVIDE'd, so +# nothing happens. It's body is expanded here, and its epilogue pops a +# diversion. +# DUMP: BODY +# BODY: TEST2a +# GROW - 2: TEST3 +# diversions: GROW - 2, GROW - 1, GROW - 1, GROW, BODY |- +# +# * TEST2b requires TEST3: epilogue +# The current diversion is appended to DUMP, and a diversion is popped. +# DUMP: BODY +# BODY: TEST2a; TEST3 +# diversions: GROW - 1, GROW - 1, GROW, BODY |- +# The content of TEST2b is expanded here. +# DUMP: BODY +# BODY: TEST2a; TEST3 +# GROW - 1: TEST2b, +# diversions: GROW - 1, GROW - 1, GROW, BODY |- +# The epilogue of TEST2b pops a diversion. +# DUMP: BODY +# BODY: TEST2a; TEST3 +# GROW - 1: TEST2b, +# diversions: GROW - 1, GROW, BODY |- +# +# * TEST1 requires TEST2b: epilogue +# The current diversion is appended to DUMP, and a diversion is popped. +# DUMP: BODY +# BODY: TEST2a; TEST3; TEST2b +# diversions: GROW, BODY |- +# +# * TEST1 is expanded: epilogue +# TEST1's own content is in GROW, and it's epilogue pops a diversion. +# DUMP: BODY +# BODY: TEST2a; TEST3; TEST2b +# GROW: TEST1 +# diversions: BODY |- +# Here, the epilogue of TEST1 notices the elaboration is done because +# DUMP and the current diversion are the same, it then undiverts +# GROW by hand, and undefines DUMP. +# DUMP: undefined +# BODY: TEST2a; TEST3; TEST2b; TEST1 +# diversions: BODY |- +# +# +# 2. Keeping track of the expansion stack +# ======================================= +# +# When M4 expansion goes wrong it is often extremely hard to find the +# path amongst macros that drove to the failure. What is needed is +# the stack of macro `calls'. One could imagine that GNU M4 would +# maintain a stack of macro expansions, unfortunately it doesn't, so +# we do it by hand. This is of course extremely costly, but the help +# this stack provides is worth it. Nevertheless to limit the +# performance penalty this is implemented only for m4_defun'd macros, +# not for define'd macros. +# +# The scheme is simplistic: each time we enter an m4_defun'd macros, +# we prepend its name in m4_expansion_stack, and when we exit the +# macro, we remove it (thanks to pushdef/popdef). +# +# In addition, we want to use the expansion stack to detect circular +# m4_require dependencies. This means we need to browse the stack to +# check whether a macro being expanded is m4_require'd. For ease of +# implementation, and certainly for the benefit of performances, we +# don't browse the m4_expansion_stack, rather each time we expand a +# macro FOO we define _m4_expanding(FOO). Then m4_require(BAR) simply +# needs to check whether _m4_expanding(BAR) is defined to diagnose a +# circular dependency. +# +# To improve the diagnostic, in addition to keeping track of the stack +# of macro calls, m4_expansion_stack also records the m4_require +# stack. Note that therefore an m4_defun'd macro being required will +# appear twice in the stack: the first time because it is required, +# the second because it is expanded. We can avoid this, but it has +# two small drawbacks: (i) the implementation is slightly more +# complex, and (ii) it hides the difference between define'd macros +# (which don't appear in m4_expansion_stack) and m4_defun'd macros +# (which do). The more debugging information, the better. + + +# m4_expansion_stack_push(TEXT) +# ----------------------------- +m4_define([m4_expansion_stack_push], +[m4_pushdef([m4_expansion_stack], + [$1]m4_ifdef([m4_expansion_stack], [ +m4_defn([m4_expansion_stack])]))]) + + +# m4_expansion_stack_pop +# ---------------------- +# Dump the expansion stack. +m4_define([m4_expansion_stack_pop], +[m4_popdef([m4_expansion_stack])]) + + +# m4_expansion_stack_dump +# ----------------------- +# Dump the expansion stack. +m4_define([m4_expansion_stack_dump], +[m4_ifdef([m4_expansion_stack], + [m4_errprintn(m4_defn([m4_expansion_stack]))])dnl +m4_errprintn(m4_location[: the top level])]) + + +# _m4_divert(GROW) +# ---------------- +# This diversion is used by the m4_defun/m4_require machinery. It is +# important to keep room before GROW because for each nested +# AC_REQUIRE we use an additional diversion (i.e., two m4_require's +# will use GROW - 2. More than 3 levels has never seemed to be +# needed.) +# +# ... +# - GROW - 2 +# m4_require'd code, 2 level deep +# - GROW - 1 +# m4_require'd code, 1 level deep +# - GROW +# m4_defun'd macros are elaborated here. + +m4_define([_m4_divert(GROW)], 10000) + + +# _m4_defun_pro(MACRO-NAME) +# ------------------------- +# The prologue for Autoconf macros. +m4_define([_m4_defun_pro], +[m4_expansion_stack_push(m4_defn([m4_location($1)])[: $1 is expanded from...])dnl +m4_pushdef([_m4_expanding($1)])dnl +m4_ifdef([_m4_divert_dump], + [m4_divert_push(m4_defn([_m4_divert_diversion]))], + [m4_copy([_m4_divert_diversion], [_m4_divert_dump])dnl +m4_divert_push([GROW])])dnl +]) + + +# _m4_defun_epi(MACRO-NAME) +# ------------------------- +# The Epilogue for Autoconf macros. MACRO-NAME only helps tracing +# the PRO/EPI pairs. +m4_define([_m4_defun_epi], +[m4_divert_pop()dnl +m4_if(_m4_divert_dump, _m4_divert_diversion, + [m4_undivert([GROW])dnl +m4_undefine([_m4_divert_dump])])dnl +m4_expansion_stack_pop()dnl +m4_popdef([_m4_expanding($1)])dnl +m4_provide([$1])dnl +]) + + +# m4_defun(NAME, EXPANSION) +# ------------------------- +# Define a macro which automatically provides itself. Add machinery +# so the macro automatically switches expansion to the diversion +# stack if it is not already using it. In this case, once finished, +# it will bring back all the code accumulated in the diversion stack. +# This, combined with m4_require, achieves the topological ordering of +# macros. We don't use this macro to define some frequently called +# macros that are not involved in ordering constraints, to save m4 +# processing. +m4_define([m4_defun], +[m4_define([m4_location($1)], m4_location)dnl +m4_define([$1], + [_m4_defun_pro([$1])$2[]_m4_defun_epi([$1])])]) + + +# m4_defun_once(NAME, EXPANSION) +# ------------------------------ +# As m4_defun, but issues the EXPANSION only once, and warns if used +# several times. +m4_define([m4_defun_once], +[m4_define([m4_location($1)], m4_location)dnl +m4_define([$1], + [m4_provide_if([$1], + [m4_warn([syntax], [$1 invoked multiple times])], + [_m4_defun_pro([$1])$2[]_m4_defun_epi([$1])])])]) + + +# m4_pattern_forbid(ERE, [WHY]) +# ----------------------------- +# Declare that no token matching the extended regular expression ERE +# should be seen in the output but if... +m4_define([m4_pattern_forbid], []) + + +# m4_pattern_allow(ERE) +# --------------------- +# ... but if that token matches the extended regular expression ERE. +# Both used via traces. +m4_define([m4_pattern_allow], []) + + +## ----------------------------- ## +## Dependencies between macros. ## +## ----------------------------- ## + + +# m4_before(THIS-MACRO-NAME, CALLED-MACRO-NAME) +# --------------------------------------------- +m4_define([m4_before], +[m4_provide_if([$2], + [m4_warn([syntax], [$2 was called before $1])])]) + + +# m4_require(NAME-TO-CHECK, [BODY-TO-EXPAND = NAME-TO-CHECK]) +# ----------------------------------------------------------- +# If NAME-TO-CHECK has never been expanded (actually, if it is not +# m4_provide'd), expand BODY-TO-EXPAND *before* the current macro +# expansion. Once expanded, emit it in _m4_divert_dump. Keep track +# of the m4_require chain in m4_expansion_stack. +# +# The normal cases are: +# +# - NAME-TO-CHECK == BODY-TO-EXPAND +# Which you can use for regular macros with or without arguments, e.g., +# m4_require([AC_PROG_CC], [AC_PROG_CC]) +# m4_require([AC_CHECK_HEADERS(limits.h)], [AC_CHECK_HEADERS(limits.h)]) +# which is just the same as +# m4_require([AC_PROG_CC]) +# m4_require([AC_CHECK_HEADERS(limits.h)]) +# +# - BODY-TO-EXPAND == m4_indir([NAME-TO-CHECK]) +# In the case of macros with irregular names. For instance: +# m4_require([AC_LANG_COMPILER(C)], [indir([AC_LANG_COMPILER(C)])]) +# which means `if the macro named `AC_LANG_COMPILER(C)' (the parens are +# part of the name, it is not an argument) has not been run, then +# call it.' +# Had you used +# m4_require([AC_LANG_COMPILER(C)], [AC_LANG_COMPILER(C)]) +# then m4_require would have tried to expand `AC_LANG_COMPILER(C)', i.e., +# call the macro `AC_LANG_COMPILER' with `C' as argument. +# +# You could argue that `AC_LANG_COMPILER', when it receives an argument +# such as `C' should dispatch the call to `AC_LANG_COMPILER(C)'. But this +# `extension' prevents `AC_LANG_COMPILER' from having actual arguments that +# it passes to `AC_LANG_COMPILER(C)'. +m4_define([m4_require], +[m4_expansion_stack_push(m4_location[: $1 is required by...])dnl +m4_ifdef([_m4_expanding($1)], + [m4_fatal([$0: circular dependency of $1])])dnl +m4_ifndef([_m4_divert_dump], + [m4_fatal([$0: cannot be used outside of an m4_defun'd macro])])dnl +m4_provide_if([$1], + [], + [m4_divert_push(m4_eval(m4_divnum - 1))dnl +m4_default([$2], [$1]) +m4_divert(m4_defn([_m4_divert_dump]))dnl +m4_undivert(m4_defn([_m4_divert_diversion]))dnl +m4_divert_pop(m4_defn([_m4_divert_dump]))])dnl +m4_provide_if([$1], + [], + [m4_warn([syntax], + [$1 is m4_require'd but is not m4_defun'd])])dnl +m4_expansion_stack_pop()dnl +]) + + +# m4_expand_once(TEXT, [WITNESS = TEXT]) +# -------------------------------------- +# If TEXT has never been expanded, expand it *here*. Use WITNESS as +# as a memory that TEXT has already been expanded. +m4_define([m4_expand_once], +[m4_provide_if(m4_ifval([$2], [[$2]], [[$1]]), + [], + [m4_provide(m4_ifval([$2], [[$2]], [[$1]]))[]$1])]) + + +# m4_provide(MACRO-NAME) +# ---------------------- +m4_define([m4_provide], +[m4_define([m4_provide($1)])]) + + +# m4_provide_if(MACRO-NAME, IF-PROVIDED, IF-NOT-PROVIDED) +# ------------------------------------------------------- +# If MACRO-NAME is provided do IF-PROVIDED, else IF-NOT-PROVIDED. +# The purpose of this macro is to provide the user with a means to +# check macros which are provided without letting her know how the +# information is coded. +m4_define([m4_provide_if], +[m4_ifdef([m4_provide($1)], + [$2], [$3])]) + + +## -------------------- ## +## 9. Text processing. ## +## -------------------- ## + + +# m4_cr_letters +# m4_cr_LETTERS +# m4_cr_Letters +# ------------- +m4_define([m4_cr_letters], [abcdefghijklmnopqrstuvwxyz]) +m4_define([m4_cr_LETTERS], [ABCDEFGHIJKLMNOPQRSTUVWXYZ]) +m4_define([m4_cr_Letters], +m4_defn([m4_cr_letters])dnl +m4_defn([m4_cr_LETTERS])dnl +) + + +# m4_cr_digits +# ------------ +m4_define([m4_cr_digits], [0123456789]) + + +# m4_cr_symbols1 & m4_cr_symbols2 +# ------------------------------- +m4_define([m4_cr_symbols1], +m4_defn([m4_cr_Letters])dnl +_) + +m4_define([m4_cr_symbols2], +m4_defn([m4_cr_symbols1])dnl +m4_defn([m4_cr_digits])dnl +) + + +# m4_re_escape(STRING) +# -------------------- +# Escape BRE active characters in STRING. +m4_define([m4_re_escape], +[m4_bpatsubst([$1], + [[][+*.]], [\\\&])]) + + +# m4_re_string +# ------------ +# Regexp for `[a-zA-Z_0-9]*' +m4_define([m4_re_string], +m4_defn([m4_cr_symbols2])dnl +[*]dnl +) + + +# m4_re_word +# ---------- +# Regexp for `[a-zA-Z_][a-zA-Z_0-9]*' +m4_define([m4_re_word], +m4_defn([m4_cr_symbols1])dnl +m4_defn([m4_re_string])dnl +) + + +# m4_tolower(STRING) +# m4_toupper(STRING) +# ------------------ +# These macros lowercase and uppercase strings. +m4_define([m4_tolower], +[m4_translit([$1], m4_defn([m4_cr_LETTERS]), m4_defn([m4_cr_letters]))]) +m4_define([m4_toupper], +[m4_translit([$1], m4_defn([m4_cr_letters]), m4_defn([m4_cr_LETTERS]))]) + + +# m4_split(STRING, [REGEXP]) +# -------------------------- +# +# Split STRING into an m4 list of quoted elements. The elements are +# quoted with [ and ]. Beginning spaces and end spaces *are kept*. +# Use m4_strip to remove them. +# +# REGEXP specifies where to split. Default is [\t ]+. +# +# Pay attention to the m4_changequotes. Inner m4_changequotes exist for +# obvious reasons (we want to insert square brackets). Outer +# m4_changequotes are needed because otherwise the m4 parser, when it +# sees the closing bracket we add to the result, believes it is the +# end of the body of the macro we define. +# +# Also, notice that $1 is quoted twice, since we want the result to +# be quoted. Then you should understand that the argument of +# patsubst is ``STRING'' (i.e., with additional `` and ''). +# +# This macro is safe on active symbols, i.e.: +# m4_define(active, ACTIVE) +# m4_split([active active ])end +# => [active], [active], []end + +m4_changequote(<<, >>) +m4_define(<>, +<>) +m4_changequote([, ]) + + + +# m4_flatten(STRING) +# ------------------ +# If STRING contains end of lines, replace them with spaces. If there +# are backslashed end of lines, remove them. This macro is safe with +# active symbols. +# m4_define(active, ACTIVE) +# m4_flatten([active +# act\ +# ive])end +# => active activeend +m4_define([m4_flatten], +[m4_translit(m4_bpatsubst([[[$1]]], [\\ +]), [ +], [ ])]) + + +# m4_strip(STRING) +# ---------------- +# Expands into STRING with tabs and spaces singled out into a single +# space, and removing leading and trailing spaces. +# +# This macro is robust to active symbols. +# m4_define(active, ACTIVE) +# m4_strip([ active active ])end +# => active activeend +# +# This macro is fun! Because we want to preserve active symbols, STRING +# must be quoted for each evaluation, which explains there are 4 levels +# of brackets around $1 (don't forget that the result must be quoted +# too, hence one more quoting than applications). +# +# Then notice the 2 last patterns: they are in charge of removing the +# leading/trailing spaces. Why not just `[^ ]'? Because they are +# applied to doubly quoted strings, i.e. more or less [[STRING]]. So +# if there is a leading space in STRING, then it is the *third* +# character, since there are two leading `['; equally for the last pattern. +m4_define([m4_strip], +[m4_bpatsubsts([[$1]], + [[ ]+], [ ], + [^\(..\) ], [\1], + [ \(..\)$], [\1])]) + + +# m4_normalize(STRING) +# -------------------- +# Apply m4_flatten and m4_strip to STRING. +# +# The argument is quoted, so that the macro is robust to active symbols: +# +# m4_define(active, ACTIVE) +# m4_normalize([ act\ +# ive +# active ])end +# => active activeend + +m4_define([m4_normalize], +[m4_strip(m4_flatten([$1]))]) + + + +# m4_join(SEP, ARG1, ARG2...) +# --------------------------- +# Produce ARG1SEPARG2...SEPARGn. +m4_defun([m4_join], +[m4_case([$#], + [1], [], + [2], [[$2]], + [[$2][$1]$0([$1], m4_shiftn(2, $@))])]) + + + +# m4_append(MACRO-NAME, STRING, [SEPARATOR]) +# ------------------------------------------ +# Redefine MACRO-NAME to hold its former content plus `SEPARATOR`'STRING' +# at the end. It is valid to use this macro with MACRO-NAME undefined, +# in which case no SEPARATOR is added. Be aware that the criterion is +# `not being defined', and not `not being empty'. +# +# This macro is robust to active symbols. It can be used to grow +# strings. +# +# | m4_define(active, ACTIVE) +# | m4_append([sentence], [This is an]) +# | m4_append([sentence], [ active ]) +# | m4_append([sentence], [symbol.]) +# | sentence +# | m4_undefine([active])dnl +# | sentence +# => This is an ACTIVE symbol. +# => This is an active symbol. +# +# It can be used to define hooks. +# +# | m4_define(active, ACTIVE) +# | m4_append([hooks], [m4_define([act1], [act2])]) +# | m4_append([hooks], [m4_define([act2], [active])]) +# | m4_undefine([active]) +# | act1 +# | hooks +# | act1 +# => act1 +# => +# => active +m4_define([m4_append], +[m4_define([$1], + m4_ifdef([$1], [m4_defn([$1])$3])[$2])]) + + +# m4_append_uniq(MACRO-NAME, STRING, [SEPARATOR]) +# ----------------------------------------------- +# As `m4_append', but append only if not yet present. +m4_define([m4_append_uniq], +[m4_ifdef([$1], + [m4_bmatch([$3]m4_defn([$1])[$3], m4_re_escape([$3$2$3]), [], + [m4_append($@)])], + [m4_append($@)])]) + + +# m4_text_wrap(STRING, [PREFIX], [FIRST-PREFIX], [WIDTH]) +# ------------------------------------------------------- +# Expands into STRING wrapped to hold in WIDTH columns (default = 79). +# If prefix is set, each line is prefixed with it. If FIRST-PREFIX is +# specified, then the first line is prefixed with it. As a special +# case, if the length of the first prefix is greater than that of +# PREFIX, then FIRST-PREFIX will be left alone on the first line. +# +# Typical outputs are: +# +# m4_text_wrap([Short string */], [ ], [/* ], 20) +# => /* Short string */ +# +# m4_text_wrap([Much longer string */], [ ], [/* ], 20) +# => /* Much longer +# => string */ +# +# m4_text_wrap([Short doc.], [ ], [ --short ], 30) +# => --short Short doc. +# +# m4_text_wrap([Short doc.], [ ], [ --too-wide ], 30) +# => --too-wide +# => Short doc. +# +# m4_text_wrap([Super long documentation.], [ ], [ --too-wide ], 30) +# => --too-wide +# => Super long +# => documentation. +# +# FIXME: there is no checking of a longer PREFIX than WIDTH, but do +# we really want to bother with people trying each single corner +# of a software? +# +# This macro does not leave a trailing space behind the last word, +# what complicates it a bit. The algorithm is stupid simple: all the +# words are preceded by m4_Separator which is defined to empty for the +# first word, and then ` ' (single space) for all the others. +m4_define([m4_text_wrap], +[m4_pushdef([m4_Prefix], m4_default([$2], []))dnl +m4_pushdef([m4_Prefix1], m4_default([$3], [m4_Prefix]))dnl +m4_pushdef([m4_Width], m4_default([$4], 79))dnl +m4_pushdef([m4_Cursor], m4_len(m4_Prefix1))dnl +m4_pushdef([m4_Separator], [])dnl +m4_Prefix1[]dnl +m4_if(m4_eval(m4_Cursor > m4_len(m4_Prefix)), + 1, [m4_define([m4_Cursor], m4_len(m4_Prefix)) +m4_Prefix])[]dnl +m4_foreach([m4_Word], m4_quote(m4_split(m4_normalize([$1]))), +[m4_define([m4_Cursor], m4_eval(m4_Cursor + m4_len(m4_defn([m4_Word])) + 1))dnl +dnl New line if too long, else insert a space unless it is the first +dnl of the words. +m4_if(m4_eval(m4_Cursor > m4_Width), + 1, [m4_define([m4_Cursor], + m4_eval(m4_len(m4_Prefix) + m4_len(m4_defn([m4_Word])) + 1))] +m4_Prefix, + [m4_Separator])[]dnl +m4_defn([m4_Word])[]dnl +m4_define([m4_Separator], [ ])])dnl +m4_popdef([m4_Separator])dnl +m4_popdef([m4_Cursor])dnl +m4_popdef([m4_Width])dnl +m4_popdef([m4_Prefix1])dnl +m4_popdef([m4_Prefix])dnl +]) + + +# m4_text_box(MESSAGE, [FRAME-CHARACTER = `-']) +# --------------------------------------------- +m4_define([m4_text_box], +[@%:@@%:@ m4_bpatsubst([$1], [.], m4_if([$2], [], [[-]], [[$2]])) @%:@@%:@ +@%:@@%:@ $1 @%:@@%:@ +@%:@@%:@ m4_bpatsubst([$1], [.], m4_if([$2], [], [[-]], [[$2]])) @%:@@%:@[]dnl +]) + + + +## ----------------------- ## +## 10. Number processing. ## +## ----------------------- ## + +# m4_sign(A) +# ---------- +# +# The sign of the integer A. +m4_define([m4_sign], +[m4_bmatch([$1], + [^-], -1, + [^0+], 0, + 1)]) + +# m4_cmp(A, B) +# ------------ +# +# Compare two integers. +# A < B -> -1 +# A = B -> 0 +# A > B -> 1 +m4_define([m4_cmp], +[m4_sign(m4_eval([$1 - $2]))]) + + +# m4_list_cmp(A, B) +# ----------------- +# +# Compare the two lists of integers A and B. For instance: +# m4_list_cmp((1, 0), (1)) -> 0 +# m4_list_cmp((1, 0), (1, 0)) -> 0 +# m4_list_cmp((1, 2), (1, 0)) -> 1 +# m4_list_cmp((1, 2, 3), (1, 2)) -> 1 +# m4_list_cmp((1, 2, -3), (1, 2)) -> -1 +# m4_list_cmp((1, 0), (1, 2)) -> -1 +# m4_list_cmp((1), (1, 2)) -> -1 +m4_define([m4_list_cmp], +[m4_if([$1$2], [()()], 0, + [$1], [()], [$0((0), [$2])], + [$2], [()], [$0([$1], (0))], + [m4_case(m4_cmp(m4_car$1, m4_car$2), + -1, -1, + 1, 1, + 0, [$0((m4_shift$1), (m4_shift$2))])])]) + + + +## ------------------------ ## +## 11. Version processing. ## +## ------------------------ ## + + +# m4_version_unletter(VERSION) +# ---------------------------- +# Normalize beta version numbers with letters to numbers only for comparison. +# +# Nl -> (N+1).-1.(l#) +# +#i.e., 2.14a -> 2.15.-1.1, 2.14b -> 2.15.-1.2, etc. +# This macro is absolutely not robust to active macro, it expects +# reasonable version numbers and is valid up to `z', no double letters. +m4_define([m4_version_unletter], +[m4_translit(m4_bpatsubsts([$1], + [\([0-9]+\)\([abcdefghi]\)], + [m4_eval(\1 + 1).-1.\2], + [\([0-9]+\)\([jklmnopqrs]\)], + [m4_eval(\1 + 1).-1.1\2], + [\([0-9]+\)\([tuvwxyz]\)], + [m4_eval(\1 + 1).-1.2\2]), + [abcdefghijklmnopqrstuvwxyz], + [12345678901234567890123456])]) + + +# m4_version_compare(VERSION-1, VERSION-2) +# ---------------------------------------- +# Compare the two version numbers and expand into +# -1 if VERSION-1 < VERSION-2 +# 0 if = +# 1 if > +m4_define([m4_version_compare], +[m4_list_cmp((m4_split(m4_version_unletter([$1]), [\.])), + (m4_split(m4_version_unletter([$2]), [\.])))]) + + +# m4_version_prereq(VERSION, [IF-OK], [IF-NOT = FAIL]) +# ---------------------------------------------------- +# Check this Autoconf version against VERSION. +m4_define([m4_version_prereq], +[m4_if(m4_version_compare(m4_defn([m4_PACKAGE_VERSION]), [$1]), -1, + [m4_default([$3], + [m4_fatal([Autoconf version $1 or higher is required])])], + [$2])[]dnl +]) + + + +## ------------------- ## +## 12. File handling. ## +## ------------------- ## + + +# It is a real pity that M4 comes with no macros to bind a diversion +# to a file. So we have to deal without, which makes us a lot more +# fragile that we should. + + +# m4_file_append(FILE-NAME, CONTENT) +# ---------------------------------- +m4_define([m4_file_append], +[m4_syscmd([cat >>$1 <<_m4eof +$2 +_m4eof +]) +m4_if(m4_sysval, [0], [], + [m4_fatal([$0: cannot write: $1])])]) + + + +## ------------------------ ## +## 13. Setting M4sugar up. ## +## ------------------------ ## + + +# m4_init +# ------- +m4_define([m4_init], +[# All the M4sugar macros start with `m4_', except `dnl' kept as is +# for sake of simplicity. +m4_pattern_forbid([^_?m4_]) +m4_pattern_forbid([^dnl$]) + +# Check the divert push/pop perfect balance. +m4_wrap([m4_ifdef([_m4_divert_diversion], + [m4_fatal([$0: unbalanced m4_divert_push:] +m4_defn([m4_divert_stack]))])[]]) + +m4_divert_push([KILL]) +m4_wrap([m4_divert_pop([KILL])[]]) +]) diff --git a/src/apps/bin/bison/data/yacc.c b/src/apps/bin/bison/data/yacc.c new file mode 100644 index 0000000000..0957600efc --- /dev/null +++ b/src/apps/bin/bison/data/yacc.c @@ -0,0 +1,1285 @@ +m4_divert(-1) -*- C -*- + +# Yacc compatible skeleton for Bison +# Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 +# Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +# 02111-1307 USA + + + +## ---------------- ## +## Default values. ## +## ---------------- ## + +# Stack parameters. +m4_define_default([b4_stack_depth_max], [10000]) +m4_define_default([b4_stack_depth_init], [200]) + + +## ------------------------ ## +## Pure/impure interfaces. ## +## ------------------------ ## + + +# b4_pure_if(IF-TRUE, IF-FALSE) +# ----------------------------- +# Expand IF-TRUE, if %pure-parser and %parse-param, IF-FALSE otherwise. +m4_define([b4_Pure_if], +[b4_pure_if([m4_ifset([b4_parse_param], + [$1], [$2])], + [$2])]) + + +# b4_yyerror_args +# --------------- +# Arguments passed to yyerror: user args plus yylloc. +m4_define([b4_yyerror_args], +[b4_Pure_if([b4_location_if([&yylloc, ])])dnl +m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])]) + + +# b4_lex_param +# ------------ +# Accumulate in b4_lex_param all the yylex arguments. +# b4_lex_param arrives quoted twice, but we want to keep only one level. +m4_define([b4_lex_param], +m4_dquote(b4_pure_if([[[[YYSTYPE *]], [[&yylval]]][]dnl +b4_location_if([, [[YYLTYPE *], [&yylloc]]])m4_ifdef([b4_lex_param], [, ])])dnl +m4_ifdef([b4_lex_param], b4_lex_param))) + + + +## ------------ ## +## Data Types. ## +## ------------ ## + +# b4_int_type(MIN, MAX) +# --------------------- +# Return the smallest int type able to handle numbers ranging from +# MIN to MAX (included). We overwrite the version from c.m4 which relies +# on "signed char" which is not portable to old K&R compilers. +m4_define([b4_int_type], +[m4_if(b4_ints_in($@, [0], [255]), [1], [unsigned char], + b4_ints_in($@, [-128], [127]), [1], [yysigned_char], + + b4_ints_in($@, [0], [65535]), [1], [unsigned short int], + b4_ints_in($@, [-32768], [32767]), [1], [short int], + + m4_eval([0 <= $1]), [1], [unsigned int], + + [int])]) + + +## ----------------- ## +## Semantic Values. ## +## ----------------- ## + + +# b4_lhs_value([TYPE]) +# -------------------- +# Expansion of $$. +m4_define([b4_lhs_value], +[yyval[]m4_ifval([$1], [.$1])]) + + +# b4_rhs_value(RULE-LENGTH, NUM, [TYPE]) +# -------------------------------------- +# Expansion of $NUM, where the current rule has RULE-LENGTH +# symbols on RHS. +m4_define([b4_rhs_value], +[yyvsp@{m4_eval([$2 - $1])@}m4_ifval([$3], [.$3])]) + + + +## ----------- ## +## Locations. ## +## ----------- ## + +# b4_lhs_location() +# ----------------- +# Expansion of @$. +m4_define([b4_lhs_location], +[yyloc]) + + +# b4_rhs_location(RULE-LENGTH, NUM) +# --------------------------------- +# Expansion of @NUM, where the current rule has RULE-LENGTH symbols +# on RHS. +m4_define([b4_rhs_location], +[yylsp@{m4_eval([$2 - $1])@}]) + + + +## --------------------------------------------------------- ## +## Defining symbol actions, e.g., printers and destructors. ## +## --------------------------------------------------------- ## + +# We do want M4 expansion after # for CPP macros. +m4_changecom() +m4_divert(0)dnl +@output @output_parser_name@ +b4_copyright([Skeleton parser for Yacc-like parsing with Bison], + [1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004])[ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Written by Richard Stallman by simplifying the original so called + ``semantic'' parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +]b4_identification +m4_if(b4_prefix[], [yy], [], +[/* If NAME_PREFIX is specified substitute the variables and functions + names. */ +#define yyparse b4_prefix[]parse +#define yylex b4_prefix[]lex +#define yyerror b4_prefix[]error +#define yylval b4_prefix[]lval +#define yychar b4_prefix[]char +#define yydebug b4_prefix[]debug +#define yynerrs b4_prefix[]nerrs +b4_location_if([#define yylloc b4_prefix[]lloc])])[ + +]b4_token_defines(b4_tokens)[ + +/* Copy the first part of user declarations. */ +]b4_pre_prologue[ + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG ]b4_debug[ +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE ]b4_error_verbose[ +#endif + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +]m4_ifdef([b4_stype], +[b4_syncline([b4_stype_line], [b4_filename]) +typedef union m4_bregexp(b4_stype, [^{], [YYSTYPE ])b4_stype YYSTYPE; +/* Line __line__ of yacc.c. */ +b4_syncline([@oline@], [@ofile@])], +[typedef int YYSTYPE;])[ +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + +]b4_location_if([#if ! defined (YYLTYPE) && ! defined (YYLTYPE_IS_DECLARED) +typedef struct YYLTYPE +{ + int first_line; + int first_column; + int last_line; + int last_column; +} YYLTYPE; +# define yyltype YYLTYPE /* obsolescent; will be withdrawn */ +# define YYLTYPE_IS_DECLARED 1 +# define YYLTYPE_IS_TRIVIAL 1 +#endif +])[ + +/* Copy the second part of user declarations. */ +]b4_post_prologue + +/* Line __line__ of yacc.c. */ +b4_syncline([@oline@], [@ofile@])[ + +#if ! defined (yyoverflow) || YYERROR_VERBOSE + +# ifndef YYFREE +# define YYFREE free +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# endif + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# define YYSTACK_ALLOC alloca +# endif +# else +# if defined (alloca) || defined (_ALLOCA_H) +# define YYSTACK_ALLOC alloca +# else +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# else +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# endif +#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ + + +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (]b4_location_if([[defined (YYLTYPE_IS_TRIVIAL) && YYLTYPE_IS_TRIVIAL \ + && ]])[defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short int yyss; + YYSTYPE yyvs; + ]b4_location_if([ YYLTYPE yyls; +])dnl +[}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +]b4_location_if( +[# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short int) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \ + + 2 * YYSTACK_GAP_MAXIMUM)], +[# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short int) + sizeof (YYSTYPE)) \ + + YYSTACK_GAP_MAXIMUM)])[ + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined (__GNUC__) && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + register YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) + +#endif + +#if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; +#else + typedef short int yysigned_char; +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL ]b4_final_state_number[ +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST ]b4_last[ + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS ]b4_tokens_number[ +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS ]b4_nterms_number[ +/* YYNRULES -- Number of rules. */ +#define YYNRULES ]b4_rules_number[ +/* YYNRULES -- Number of states. */ +#define YYNSTATES ]b4_states_number[ + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK ]b4_undef_token_number[ +#define YYMAXUTOK ]b4_user_token_number_max[ + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const ]b4_int_type_for([b4_translate])[ yytranslate[] = +{ + ]b4_translate[ +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const ]b4_int_type_for([b4_prhs])[ yyprhs[] = +{ + ]b4_prhs[ +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const ]b4_int_type_for([b4_rhs])[ yyrhs[] = +{ + ]b4_rhs[ +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const ]b4_int_type_for([b4_rline])[ yyrline[] = +{ + ]b4_rline[ +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE +/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + ]b4_tname[ +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const ]b4_int_type_for([b4_toknum])[ yytoknum[] = +{ + ]b4_toknum[ +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const ]b4_int_type_for([b4_r1])[ yyr1[] = +{ + ]b4_r1[ +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const ]b4_int_type_for([b4_r2])[ yyr2[] = +{ + ]b4_r2[ +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const ]b4_int_type_for([b4_defact])[ yydefact[] = +{ + ]b4_defact[ +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const ]b4_int_type_for([b4_defgoto])[ yydefgoto[] = +{ + ]b4_defgoto[ +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF ]b4_pact_ninf[ +static const ]b4_int_type_for([b4_pact])[ yypact[] = +{ + ]b4_pact[ +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const ]b4_int_type_for([b4_pgoto])[ yypgoto[] = +{ + ]b4_pgoto[ +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF ]b4_table_ninf[ +static const ]b4_int_type_for([b4_table])[ yytable[] = +{ + ]b4_table[ +}; + +static const ]b4_int_type_for([b4_check])[ yycheck[] = +{ + ]b4_check[ +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const ]b4_int_type_for([b4_stos])[ yystos[] = +{ + ]b4_stos[ +}; + +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ +#endif +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int +#endif + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror (]b4_yyerror_args["syntax error: cannot back up");\ + YYERROR; \ + } \ +while (0) + +#define YYTERROR 1 +#define YYERRCODE 256 + +/* YYLLOC_DEFAULT -- Compute the default location (before the actions + are run). */ + +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + ((Current).first_line = (Rhs)[1].first_line, \ + (Current).first_column = (Rhs)[1].first_column, \ + (Current).last_line = (Rhs)[N].last_line, \ + (Current).last_column = (Rhs)[N].last_column) +#endif + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (]b4_pure_if([&yylval[]b4_location_if([, &yylloc]), ])[YYLEX_PARAM) +#else +# define YYLEX ]b4_c_function_call([yylex], [int], b4_lex_param)[ +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +# define YYDSYMPRINT(Args) \ +do { \ + if (yydebug) \ + yysymprint Args; \ +} while (0) + +# define YYDSYMPRINTF(Title, Token, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yysymprint (stderr, \ + Token, Value]b4_location_if([, Location])[); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +]b4_c_function_def([yy_stack_print], [static void], + [[short int *bottom], [bottom]], + [[short int *top], [top]])[ +{ + YYFPRINTF (stderr, "Stack now"); + for (/* Nothing. */; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +]b4_c_function_def([yy_reduce_print], [static void], + [[int yyrule], [yyrule]])[ +{ + int yyi; + unsigned int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", + yyrule - 1, yylno); + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) + YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); + YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (Rule); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YYDSYMPRINT(Args) +# define YYDSYMPRINTF(Title, Token, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH ]b4_stack_depth_init[ +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#if defined (YYMAXDEPTH) && YYMAXDEPTH == 0 +# undef YYMAXDEPTH +#endif + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH ]b4_stack_depth_max[ +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined (__GLIBC__) && defined (_STRING_H) +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif +{ + register const char *yys = yystr; + + while (*yys++ != '\0') + continue; + + return yys - yystr - 1; +} +# endif +# endif + +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +# endif +{ + register char *yyd = yydest; + register const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +#endif /* !YYERROR_VERBOSE */ + + + +#if YYDEBUG +]b4_yysymprint_generate([b4_c_function_def])[ +#endif /* ! YYDEBUG */ +]b4_yydestruct_generate([b4_c_function_def]) + + +/* Prevent warnings from -Wmissing-prototypes. */ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM); +# else +int yyparse (); +# endif +#else /* ! YYPARSE_PARAM */ +b4_c_function_decl([yyparse], [int], b4_parse_param) +#endif /* ! YYPARSE_PARAM */ + + +m4_divert_push([KILL])# ======================== M4 code. +# b4_declare_parser_variables +# --------------------------- +# Declare the variables that are global, or local to YYPARSE if +# pure-parser. +m4_define([b4_declare_parser_variables], +[/* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs;b4_location_if([ +/* Location data for the lookahead symbol. */ +YYLTYPE yylloc;]) +]) +m4_divert_pop([KILL])dnl# ====================== End of M4 code. + +b4_pure_if([], + [b4_declare_parser_variables]) + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM) +# else +int yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +# endif +#else /* ! YYPARSE_PARAM */ +b4_c_function_def([yyparse], [int], b4_parse_param) +#endif +{[ + ]b4_pure_if([b4_declare_parser_variables])[ + register int yystate; + register int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Lookahead token as an internal (translated) token number. */ + int yytoken = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short int yyssa[YYINITDEPTH]; + short int *yyss = yyssa; + register short int *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + register YYSTYPE *yyvsp; + +]b4_location_if( +[[ /* The location stack. */ + YYLTYPE yylsa[YYINITDEPTH]; + YYLTYPE *yyls = yylsa; + YYLTYPE *yylsp; + YYLTYPE *yylerrsp;]])[ + +#define YYPOPSTACK (yyvsp--, yyssp--]b4_location_if([, yylsp--])[) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; +]b4_location_if([ YYLTYPE yyloc;])[ + + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ + int yylen; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; +]b4_location_if([ yylsp = yyls;])[ +]m4_ifdef([b4_initial_action], [ +m4_pushdef([b4_at_dollar], [(*yylsp)])dnl +m4_pushdef([b4_dollar_dollar], [(*yyvsp)])dnl + /* User initialization code. */ + b4_initial_action +m4_popdef([b4_dollar_dollar])dnl +m4_popdef([b4_at_dollar])dnl +/* Line __line__ of yacc.c. */ +b4_syncline([@oline@], [@ofile@])])dnl + +[ goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short int *yyss1 = yyss; +]b4_location_if([ YYLTYPE *yyls1 = yyls;])[ + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow ("parser stack overflow", + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), +]b4_location_if([ &yyls1, yysize * sizeof (*yylsp),])[ + &yystacksize); +]b4_location_if([ yyls = yyls1;])[ + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyoverflowlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyoverflowlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + short int *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyoverflowlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); +]b4_location_if([ YYSTACK_RELOCATE (yyls);])[ +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; +]b4_location_if([ yylsp = yyls + yysize - 1;])[ + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; +]b4_location_if([ *++yylsp = yylloc;])[ + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + yystate = yyn; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + +]b4_location_if( +[ /* Default location. */ + YYLLOC_DEFAULT (yyloc, yylsp - yylen, yylen);])[ + YY_REDUCE_PRINT (yyn); + switch (yyn) + ]{ + b4_actions + } + +/* Line __line__ of yacc.c. */ +b4_syncline([@oline@], [@ofile@]) + +[ yyvsp -= yylen; + yyssp -= yylen; +]b4_location_if([ yylsp -= yylen;])[ + + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; +]b4_location_if([ *++yylsp = yyloc;])[ + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (YYPACT_NINF < yyn && yyn < YYLAST) + { + YYSIZE_T yysize = 0; + int yytype = YYTRANSLATE (yychar); + const char* yyprefix; + char *yymsg; + int yyx; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 0; + + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]); + yycount += 1; + if (yycount == 5) + { + yysize = 0; + break; + } + } + yysize += (sizeof ("syntax error, unexpected ") + + yystrlen (yytname[yytype])); + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg != 0) + { + char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); + yyp = yystpcpy (yyp, yytname[yytype]); + + if (yycount < 5) + { + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + yyp = yystpcpy (yyp, yyprefix); + yyp = yystpcpy (yyp, yytname[yyx]); + yyprefix = " or "; + } + } + yyerror (]b4_yyerror_args[yymsg); + YYSTACK_FREE (yymsg); + } + else + yyerror (]b4_yyerror_args["syntax error; also virtual memory exhausted"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror (]b4_yyerror_args["syntax error"); + } + +]b4_location_if([ yylerrsp = yylsp;])[ + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* If at end of input, pop the error token, + then the rest of the stack, then return failure. */ + if (yychar == YYEOF) + for (;;) + { + YYPOPSTACK; + if (yyssp == yyss) + YYABORT; + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[*yyssp], yyvsp]b4_location_if([, yylsp])[); + } + } + else + { + YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); + yydestruct (yytoken, &yylval]b4_location_if([, &yylloc])[); + yychar = YYEMPTY; +]b4_location_if([ *++yylerrsp = yylloc;])[ + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + +#ifdef __GNUC__ + /* Pacify GCC when the user code never invokes YYERROR and the label + yyerrorlab therefore never appears in user code. */ + if (0) + goto yyerrorlab; +#endif + + yyvsp -= yylen; + yyssp -= yylen; + yystate = *yyssp; + ]b4_location_if([yylerrsp = yylsp; + *++yylerrsp = yyloc; + yylsp -= yylen; + ])[goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[yystate], yyvsp]b4_location_if([, yylsp])[); + YYPOPSTACK; + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + if (yyn == YYFINAL) + YYACCEPT; + + YYDPRINTF ((stderr, "Shifting error token, ")); + + *++yyvsp = yylval; +]b4_location_if([ YYLLOC_DEFAULT (yyloc, yylsp, yylerrsp - yylsp); + *++yylsp = yyloc;])[ + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*----------------------------------------------. +| yyoverflowlab -- parser overflow comes here. | +`----------------------------------------------*/ +yyoverflowlab: + yyerror (]b4_yyerror_args["parser stack overflow"); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif + return yyresult; +]} + + +b4_epilogue +m4_if(b4_defines_flag, 0, [], +[@output @output_header_name@ +b4_copyright([Skeleton parser for Yacc-like parsing with Bison], + [1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004]) + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +b4_token_defines(b4_tokens) + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +m4_ifdef([b4_stype], +[b4_syncline([b4_stype_line], [b4_filename]) +typedef union m4_bregexp(b4_stype, [^{], [YYSTYPE ])b4_stype YYSTYPE; +/* Line __line__ of yacc.c. */ +b4_syncline([@oline@], [@ofile@])], +[typedef int YYSTYPE;]) +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + +b4_pure_if([], +[extern YYSTYPE b4_prefix[]lval;]) + +b4_location_if( +[#if ! defined (YYLTYPE) && ! defined (YYLTYPE_IS_DECLARED) +typedef struct YYLTYPE +{ + int first_line; + int first_column; + int last_line; + int last_column; +} YYLTYPE; +# define yyltype YYLTYPE /* obsolescent; will be withdrawn */ +# define YYLTYPE_IS_DECLARED 1 +# define YYLTYPE_IS_TRIVIAL 1 +#endif + +m4_if(b4_pure, [0], +[extern YYLTYPE b4_prefix[]lloc;]) +]) +]) diff --git a/src/apps/bin/bison/doc/FAQ b/src/apps/bin/bison/doc/FAQ new file mode 100644 index 0000000000..37aea57cb9 --- /dev/null +++ b/src/apps/bin/bison/doc/FAQ @@ -0,0 +1,109 @@ +Frequently Asked Questions about Bison: + +---------------------------------------------------------------------- + +Q1. Is Bison Y2K compliant? + +A1. If you're looking for a guarantee or certification, I can't + provide it. With a little thought you can answer this one for + yourself, though. (Hint: does a parser generator rely on the + date or time for anything?) If you're still confused, see + http://www.gnu.org/software/year2000.html for more information. + +---------------------------------------------------------------------- + +Q2. I can't build Bison because "make" complains that "msgfmt" is not + found. What should I do? + +A2. Like most GNU packages with internationalization support, that + feature is turned on by default. If you have problems building + in the "po" subdirectory, it indicates that your system's + internationalization support is lacking. You can re-configure + Bison with "--disable-nls" to turn off this support, or you can + install GNU gettext from ftp://ftp.gnu.org/gnu/gettext/ and + re-configure Bison. See the file "ABOUT-NLS" for more + information. + +---------------------------------------------------------------------- + +Q3. I'm having trouble using Bison. Where can I find help? + +A3. First, read the fine manual which comes with bison. Beyond that, + you can send mail to . This mailing list is + intended to be populated with people who are willing to answer + questions about using and installing Bison. Please keep in mind + that (most of) the people on the list have aspects of their lives + which are not related to Bison (!), so you may not receive an + answer to your question right away. This can be frustrating, but + please try not to honk them off; remember that any help they + provide is purely voluntary and out of the kindness of their + hearts. + +---------------------------------------------------------------------- + +Q4. I found a bug. What should I include in the bug report? + +A4. Before you send a bug report, make sure you are using the latest + version. Check ftp://ftp.gnu.org/pub/gnu/bison/ or one of its + mirrors. Be sure to include the version number in your bug + report. If the bug is present in the latest version but not in a + previous version, try to determine the most recent version which + did not contain the bug. + + If the bug is parser-related, you should include the smallest + grammar you can which demonstrates the bug. The grammar file + should also be complete (i.e., I should be able to run it through + Bison without having to edit or add anything). The smaller and + simpler the grammar, the easier it will be to fix the bug. + + Include information about your compilation environment, including + your operating system's name and version and your compiler's name + and version. If you have trouble compiling, you should also + include a transcript of the build session, starting with the + invocation of `configure'. Depending on the nature of the bug, + you may be asked to send additional files as well (such as + `config.h' or `config.cache'). + + Patches are most welcome, but not required. That is, do not + hesitate to send a bug report just because you can not provide a + fix. + + Send bug reports to . + +---------------------------------------------------------------------- + +Q5. Will Bison ever have C++ support? + +A5. Yes, it's in the works. Things are very chaotic right now, but + what little information floats around is posted to the bug-bison + mailing list. If you're interested in testing C++ support when + it becomes available, please consider subscribing to the list, + especially if you are willing to beta test other releases as + well. + +---------------------------------------------------------------------- + +Q6. What is involved in being a beta tester? + +A6. It's not terribly involved. Basically, you would download a test + release, compile it, and use it to build and run a parser or two. + After that, you would submit either a bug report or a message + saying that everything is okay. It is important to report + successes as well as failures because test releases eventually + become mainstream releases, but only if they are adequately + tested. If no one tests, development is essentially halted. + + Beta testers are particularly needed for operating systems to + which I do not have access. I currently have easy access to + Linux (x86 glibc 2.1), Solaris (SPARC) 2.6 and 2.7, and HP-UX + 10.20. Reports about other operating systems are especially + welcome. + +---------------------------------------------------------------------- + +Q7. How do I join the help-bison and bug-bison mailing lists? + +A7. See http://www.gnu.org/ (the section about "GNU mailing lists") + for more information. + +---------------------------------------------------------------------- diff --git a/src/apps/bin/bison/doc/Makefile.am b/src/apps/bin/bison/doc/Makefile.am new file mode 100644 index 0000000000..a909a0d22e --- /dev/null +++ b/src/apps/bin/bison/doc/Makefile.am @@ -0,0 +1,31 @@ +## Process this file with automake to produce Makefile.in -*-Makefile-*- +## Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. + +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +## 02111-1307 USA + +AM_MAKEINFOFLAGS = --no-split +info_TEXINFOS = bison.texinfo +man_MANS = bison.1 +bison_TEXINFOS = gpl.texi fdl.texi + +EXTRA_DIST = FAQ bison.1 refcard.tex + +CLEANFILES = refcard.dvi refcard.log refcard.ps bison.fns + +refcard.dvi: refcard.tex + tex refcard.tex + +refcard.ps: refcard.dvi diff --git a/src/apps/bin/bison/doc/Makefile.in b/src/apps/bin/bison/doc/Makefile.in new file mode 100644 index 0000000000..9bf7bdd340 --- /dev/null +++ b/src/apps/bin/bison/doc/Makefile.in @@ -0,0 +1,570 @@ +# Makefile.in generated by automake 1.8.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = doc +DIST_COMMON = $(bison_TEXINFOS) $(srcdir)/Makefile.am \ + $(srcdir)/Makefile.in $(srcdir)/stamp-vti \ + $(srcdir)/version.texi +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/alloca.m4 \ + $(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dmalloc.m4 \ + $(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/error.m4 \ + $(top_srcdir)/m4/exitfail.m4 $(top_srcdir)/m4/extensions.m4 \ + $(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gnulib.m4 $(top_srcdir)/m4/hard-locale.m4 \ + $(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/m4.m4 \ + $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbstate_t.m4 \ + $(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/obstack.m4 $(top_srcdir)/m4/onceonly.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \ + $(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stpcpy.m4 \ + $(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \ + $(top_srcdir)/m4/subpipe.m4 $(top_srcdir)/m4/timevar.m4 \ + $(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/warning.m4 \ + $(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xstrndup.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +SOURCES = +DIST_SOURCES = +INFO_DEPS = $(srcdir)/bison.info +TEXINFO_TEX = $(top_srcdir)/config/texinfo.tex +am__TEXINFO_TEX_DIR = $(top_srcdir)/config +DVIS = bison.dvi +PDFS = bison.pdf +PSS = bison.ps +HTMLS = bison.html +TEXINFOS = bison.texinfo +TEXI2DVI = texi2dvi +TEXI2PDF = $(TEXI2DVI) --pdf --batch +MAKEINFOHTML = $(MAKEINFO) --html +AM_MAKEINFOHTMLFLAGS = $(AM_MAKEINFOFLAGS) +DVIPS = dvips +am__installdirs = "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)" +man1dir = $(mandir)/man1 +NROFF = nroff +MANS = $(man_MANS) +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALLOCA_H = @ALLOCA_H@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOM4TE = @AUTOM4TE@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GCC = @GCC@ +GMSGFMT = @GMSGFMT@ +HAVE__BOOL = @HAVE__BOOL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +O0CFLAGS = @O0CFLAGS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STDBOOL_H = @STDBOOL_H@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VALGRIND = @VALGRIND@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WERROR_CFLAGS = @WERROR_CFLAGS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +YACC_LIBRARY = @YACC_LIBRARY@ +YACC_SCRIPT = @YACC_SCRIPT@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +AM_MAKEINFOFLAGS = --no-split +info_TEXINFOS = bison.texinfo +man_MANS = bison.1 +bison_TEXINFOS = gpl.texi fdl.texi +EXTRA_DIST = FAQ bison.1 refcard.tex +CLEANFILES = refcard.dvi refcard.log refcard.ps bison.fns +all: all-am + +.SUFFIXES: +.SUFFIXES: .dvi .html .info .pdf .ps .texinfo +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu doc/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu doc/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +.texinfo.info: + restore=: && \ + backupdir="$(am__leading_dot)am$$$$" && \ + am__cwd=`pwd` && cd $(srcdir) && \ + rm -rf $$backupdir && mkdir $$backupdir && \ + for f in $@ $@-[0-9] $@-[0-9][0-9] $(@:.info=).i[0-9] $(@:.info=).i[0-9][0-9]; do \ + if test -f $$f; then \ + mv $$f $$backupdir; \ + restore=mv; \ + fi; \ + done; \ + cd "$$am__cwd"; \ + if $(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ + -o $@ $<; \ + then \ + rc=0; \ + cd $(srcdir); \ + else \ + rc=$$?; \ + cd $(srcdir) && \ + $$restore $$backupdir/* `echo "./$@" | sed 's|[^/]*$$||'`; \ + fi; \ + rm -rf $$backupdir; \ + exit $$rc + +.texinfo.dvi: + TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ + $(TEXI2DVI) $< + +.texinfo.pdf: + TEXINPUTS="$(am__TEXINFO_TEX_DIR)$(PATH_SEPARATOR)$$TEXINPUTS" \ + MAKEINFO='$(MAKEINFO) $(AM_MAKEINFOFLAGS) $(MAKEINFOFLAGS) -I $(srcdir)' \ + $(TEXI2PDF) $< + +.texinfo.html: + $(MAKEINFOHTML) $(AM_MAKEINFOHTMLFLAGS) $(MAKEINFOFLAGS) -I $(srcdir) \ + -o $@ $< + if test ! -d $@ && test -d $(@:.html=); then \ + mv $(@:.html=) $@; else :; fi +$(srcdir)/bison.info: bison.texinfo $(srcdir)/version.texi $(bison_TEXINFOS) +bison.dvi: bison.texinfo $(srcdir)/version.texi $(bison_TEXINFOS) +bison.pdf: bison.texinfo $(srcdir)/version.texi $(bison_TEXINFOS) +bison.html: bison.texinfo $(srcdir)/version.texi $(bison_TEXINFOS) +$(srcdir)/version.texi: $(srcdir)/stamp-vti +$(srcdir)/stamp-vti: bison.texinfo $(top_srcdir)/configure + @(dir=.; test -f ./bison.texinfo || dir=$(srcdir); \ + set `$(SHELL) $(top_srcdir)/config/mdate-sh $$dir/bison.texinfo`; \ + echo "@set UPDATED $$1 $$2 $$3"; \ + echo "@set UPDATED-MONTH $$2 $$3"; \ + echo "@set EDITION $(VERSION)"; \ + echo "@set VERSION $(VERSION)") > vti.tmp + @cmp -s vti.tmp $(srcdir)/version.texi \ + || (echo "Updating $(srcdir)/version.texi"; \ + cp vti.tmp $(srcdir)/version.texi) + -@rm -f vti.tmp + @cp $(srcdir)/version.texi $@ + +mostlyclean-vti: + -rm -f vti.tmp + +maintainer-clean-vti: + -rm -f $(srcdir)/stamp-vti $(srcdir)/version.texi +.dvi.ps: + $(DVIPS) -o $@ $< + +uninstall-info-am: + $(PRE_UNINSTALL) + @if (install-info --version && \ + install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ + list='$(INFO_DEPS)'; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + echo " install-info --info-dir='$(DESTDIR)$(infodir)' --remove '$(DESTDIR)$(infodir)/$$relfile'"; \ + install-info --info-dir="$(DESTDIR)$(infodir)" --remove "$(DESTDIR)$(infodir)/$$relfile"; \ + done; \ + else :; fi + @$(NORMAL_UNINSTALL) + @list='$(INFO_DEPS)'; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + relfile_i=`echo "$$relfile" | sed 's|\.info$$||;s|$$|.i|'`; \ + (if cd "$(DESTDIR)$(infodir)"; then \ + echo " rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9])"; \ + rm -f $$relfile $$relfile-[0-9] $$relfile-[0-9][0-9] $$relfile_i[0-9] $$relfile_i[0-9][0-9]; \ + else :; fi); \ + done + +dist-info: $(INFO_DEPS) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + list='$(INFO_DEPS)'; \ + for base in $$list; do \ + case $$base in \ + $(srcdir)/*) base=`echo "$$base" | sed "s|^$$srcdirstrip/||"`;; \ + esac; \ + if test -f $$base; then d=.; else d=$(srcdir); fi; \ + for file in $$d/$$base*; do \ + relfile=`expr "$$file" : "$$d/\(.*\)"`; \ + test -f $(distdir)/$$relfile || \ + cp -p $$file $(distdir)/$$relfile; \ + done; \ + done + +mostlyclean-aminfo: + -rm -rf bison.aux bison.cp bison.cps bison.fn bison.ky bison.kys bison.log \ + bison.pg bison.pgs bison.tmp bison.toc bison.tp bison.vr \ + bison.dvi bison.pdf bison.ps bison.html + +maintainer-clean-aminfo: + @list='$(INFO_DEPS)'; for i in $$list; do \ + i_i=`echo "$$i" | sed 's|\.info$$||;s|$$|.i|'`; \ + echo " rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]"; \ + rm -f $$i $$i-[0-9] $$i-[0-9][0-9] $$i_i[0-9] $$i_i[0-9][0-9]; \ + done +install-man1: $(man1_MANS) $(man_MANS) + @$(NORMAL_INSTALL) + test -z "$(man1dir)" || $(mkdir_p) "$(DESTDIR)$(man1dir)" + @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + if test -f $(srcdir)/$$i; then file=$(srcdir)/$$i; \ + else file=$$i; fi; \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 1*) ;; \ + *) ext='1' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " $(INSTALL_DATA) '$$file' '$(DESTDIR)$(man1dir)/$$inst'"; \ + $(INSTALL_DATA) "$$file" "$(DESTDIR)$(man1dir)/$$inst"; \ + done +uninstall-man1: + @$(NORMAL_UNINSTALL) + @list='$(man1_MANS) $(dist_man1_MANS) $(nodist_man1_MANS)'; \ + l2='$(man_MANS) $(dist_man_MANS) $(nodist_man_MANS)'; \ + for i in $$l2; do \ + case "$$i" in \ + *.1*) list="$$list $$i" ;; \ + esac; \ + done; \ + for i in $$list; do \ + ext=`echo $$i | sed -e 's/^.*\\.//'`; \ + case "$$ext" in \ + 1*) ;; \ + *) ext='1' ;; \ + esac; \ + inst=`echo $$i | sed -e 's/\\.[0-9a-z]*$$//'`; \ + inst=`echo $$inst | sed -e 's/^.*\///'`; \ + inst=`echo $$inst | sed '$(transform)'`.$$ext; \ + echo " rm -f '$(DESTDIR)$(man1dir)/$$inst'"; \ + rm -f "$(DESTDIR)$(man1dir)/$$inst"; \ + done +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done + $(MAKE) $(AM_MAKEFLAGS) \ + top_distdir="$(top_distdir)" distdir="$(distdir)" \ + dist-info +check-am: all-am +check: check-am +all-am: Makefile $(INFO_DEPS) $(MANS) +installdirs: + for dir in "$(DESTDIR)$(infodir)" "$(DESTDIR)$(man1dir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + -test -z "$(CLEANFILES)" || rm -f $(CLEANFILES) + +distclean-generic: + -rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." +clean: clean-am + +clean-am: clean-generic mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: $(DVIS) + +html: html-am + +html-am: $(HTMLS) + +info: info-am + +info-am: $(INFO_DEPS) + +install-data-am: install-info-am install-man + +install-exec-am: + +install-info: install-info-am + +install-info-am: $(INFO_DEPS) + @$(NORMAL_INSTALL) + test -z "$(infodir)" || $(mkdir_p) "$(DESTDIR)$(infodir)" + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + list='$(INFO_DEPS)'; \ + for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + esac; \ + if test -f $$file; then d=.; else d=$(srcdir); fi; \ + file_i=`echo "$$file" | sed 's|\.info$$||;s|$$|.i|'`; \ + for ifile in $$d/$$file $$d/$$file-[0-9] $$d/$$file-[0-9][0-9] \ + $$d/$$file_i[0-9] $$d/$$file_i[0-9][0-9] ; do \ + if test -f $$ifile; then \ + relfile=`echo "$$ifile" | sed 's|^.*/||'`; \ + echo " $(INSTALL_DATA) '$$ifile' '$(DESTDIR)$(infodir)/$$relfile'"; \ + $(INSTALL_DATA) "$$ifile" "$(DESTDIR)$(infodir)/$$relfile"; \ + else : ; fi; \ + done; \ + done + @$(POST_INSTALL) + @if (install-info --version && \ + install-info --version 2>&1 | sed 1q | grep -i -v debian) >/dev/null 2>&1; then \ + list='$(INFO_DEPS)'; \ + for file in $$list; do \ + relfile=`echo "$$file" | sed 's|^.*/||'`; \ + echo " install-info --info-dir='$(DESTDIR)$(infodir)' '$(DESTDIR)$(infodir)/$$relfile'";\ + install-info --info-dir="$(DESTDIR)$(infodir)" "$(DESTDIR)$(infodir)/$$relfile" || :;\ + done; \ + else : ; fi +install-man: install-man1 + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-aminfo \ + maintainer-clean-generic maintainer-clean-vti + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-aminfo mostlyclean-generic mostlyclean-vti + +pdf: pdf-am + +pdf-am: $(PDFS) + +ps: ps-am + +ps-am: $(PSS) + +uninstall-am: uninstall-info-am uninstall-man + +uninstall-man: uninstall-man1 + +.PHONY: all all-am check check-am clean clean-generic dist-info \ + distclean distclean-generic distdir dvi dvi-am html html-am \ + info info-am install install-am install-data install-data-am \ + install-exec install-exec-am install-info install-info-am \ + install-man install-man1 install-strip installcheck \ + installcheck-am installdirs maintainer-clean \ + maintainer-clean-aminfo maintainer-clean-generic \ + maintainer-clean-vti mostlyclean mostlyclean-aminfo \ + mostlyclean-generic mostlyclean-vti pdf pdf-am ps ps-am \ + uninstall uninstall-am uninstall-info-am uninstall-man \ + uninstall-man1 + + +refcard.dvi: refcard.tex + tex refcard.tex + +refcard.ps: refcard.dvi +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/apps/bin/bison/doc/bison.1 b/src/apps/bin/bison/doc/bison.1 new file mode 100644 index 0000000000..5e1d962d8b --- /dev/null +++ b/src/apps/bin/bison/doc/bison.1 @@ -0,0 +1,369 @@ +.TH BISON 1 local +.SH NAME +bison \- GNU Project parser generator (yacc replacement) +.SH SYNOPSIS +.B bison +[ +.BI \-b " file-prefix" +] [ +.BI \-\-file-prefix= file-prefix +] [ +.B \-d +] [ +.BI \-\-defines= defines-file +] [ +.B \-g +] [ +.BI \-\-graph= graph-file +] [ +.B \-k +] [ +.B \-\-token-table +] [ +.B \-l +] [ +.B \-\-no-lines +] [ +.B \-n +] [ +.B \-\-no-parser +] [ +.BI \-o " outfile" +] [ +.BI \-\-output-file= outfile +] [ +.BI \-p " prefix" +] [ +.BI \-\-name-prefix= prefix +] [ +.B \-t +] [ +.B \-\-debug +] [ +.B \-v +] [ +.B \-\-verbose +] [ +.B \-V +] [ +.B \-\-version +] [ +.B \-y +] [ +.B \-\-yacc +] [ +.B \-h +] [ +.B \-\-help +] [ +.B \-\-fixed-output-files +] +file +.br +.B yacc +[ +.I "similar options and operands" +] +.SH DESCRIPTION +.I Bison +is a parser generator in the style of +.IR yacc (1). +It should be upwardly compatible with input files designed +for +.IR yacc . +.PP +Input files should follow the +.I yacc +convention of ending in +.BR .y . +Unlike +.IR yacc , +the generated files do not have fixed names, but instead use the prefix +of the input file. +Moreover, if you need to put +.I C++ +code in the input file, you can end his name by a C++-like extension +(.ypp or .y++), then bison will follow your extension to name the +output file (.cpp or .c++). +For instance, a grammar description file named +.B parse.yxx +would produce the generated parser in a file named +.BR parse.tab.cxx , +instead of +.IR yacc 's +.B y.tab.c +or old +.I Bison +version's +.BR parse.tab.c . +.PP +This description of the options that can be given to +.I bison +is adapted from the node +.B Invocation +in the +.B bison.texinfo +manual, which should be taken as authoritative. +.PP +.I Bison +supports both traditional single-letter options and mnemonic long +option names. Long option names are indicated with +.B \-\- +instead of +.BR \- . +Abbreviations for option names are allowed as long as they +are unique. When a long option takes an argument, like +.BR \-\-file-prefix , +connect the option name and the argument with +.BR = . +.SS OPTIONS +.TP +.BI \-b " file-prefix" +.br +.ns +.TP +.BI \-\-file-prefix= file-prefix +Specify a prefix to use for all +.I bison +output file names. The names are +chosen as if the input file were named +\fIfile-prefix\fP\fB.c\fP. +.TP +.B \-d +.br +.ns +Write an extra output file containing macro definitions for the token +type names defined in the grammar and the semantic value type +.BR YYSTYPE , +as well as a few +.B extern +variable declarations. +.sp +If the parser output file is named +.IB name .c +then this file +is named +\fIname\fP\fB.h\fP. +.sp +This output file is essential if you wish to put the definition of +.B yylex +in a separate source file, because +.B yylex +needs to be able to refer to token type codes and the variable +.BR yylval . +.TP +.BI \-\-defines= defines-file +The behavior of +.B \-\-defines +is the same than +.B \-d +option. +The only difference is that it has an optional argument which is +the name of the output filename. +.TP +.BI \-g +.br +.ns +Output a VCG definition of the LALR(1) grammar automaton computed by +Bison. If the grammar file is +.BR foo.y +, the VCG output file will be +.BR foo.vcg . +.TP +.BI \-\-graph= graph-file +The behavior of +.BI \-\-graph +is the same than +.BI \-g +option. The only difference is that it has an optional argument which +is the name of the output graph filename. +.TP +.B \-k +.br +.ns +.TP +.B \-\-token-table +This switch causes the +.IB name .tab.c +output to include a list of +token names in order by their token numbers; this is defined in the array +.IR yytname . +Also generated +are #defines for +.IR YYNTOKENS , +.IR YYNNTS , +.IR YYNRULES , +and +.IR YYNSTATES . +.TP +.B \-l +.br +.ns +.TP +.B \-\-no-lines +Don't put any +.B #line +preprocessor commands in the parser file. +Ordinarily +.I bison +puts them in the parser file so that the C compiler +and debuggers will associate errors with your source file, the +grammar file. This option causes them to associate errors with the +parser file, treating it an independent source file in its own right. +.TP +.B \-n +.br +.ns +.TP +.B \-\-no-parser +Do not generate the parser code into the output; generate only +declarations. The generated +.IB name .tab.c +file will have only +constant declarations. In addition, a +.IB name .act +file is +generated containing a switch statement body containing all the +translated actions. +.TP +.BI \-o " outfile" +.br +.ns +.TP +.BI \-\-output-file= outfile +Specify the name +.I outfile +for the parser file. +.sp +The other output files' names are constructed from +.I outfile +as described under the +.B \-v +and +.B \-d +switches. +.TP +.BI \-p " prefix" +.br +.ns +.TP +.BI \-\-name-prefix= prefix +Rename the external symbols used in the parser so that they start with +.I prefix +instead of +.BR yy . +The precise list of symbols renamed is +.BR yyparse , +.BR yylex , +.BR yyerror , +.BR yylval , +.BR yychar , +and +.BR yydebug . +.sp +For example, if you use +.BR "\-p c" , +the names become +.BR cparse , +.BR clex , +and so on. +.TP +.B \-t +.br +.ns +.TP +.B \-\-debug +In the parser file, define the macro +.B YYDEBUG +to 1 if it is not already defined, +so that the debugging facilities are compiled. +.TP +.B \-v +.br +.ns +.TP +.B \-\-verbose +Write an extra output file containing verbose descriptions of the +parser states and what is done for each type of look-ahead token in +that state. +.sp +This file also describes all the conflicts, both those resolved by +operator precedence and the unresolved ones. +.sp +The file's name is made by removing +.B .tab.c +or +.B .c +from the parser output file name, and adding +.B .output +instead. +.sp +Therefore, if the input file is +.BR foo.y , +then the parser file is called +.B foo.tab.c +by default. As a consequence, the verbose +output file is called +.BR foo.output . +.TP +.B \-V +.br +.ns +.TP +.B \-\-version +Print the version number of +.I bison +and exit. +.TP +.B \-h +.br +.ns +.TP +.B \-\-help +Print a summary of the options to +.I bison +and exit. +.TP +.B \-y +.br +.ns +.TP +.B \-\-yacc +.br +.ns +.TP +.B \-\-fixed-output-files +Equivalent to +.BR "\-o y.tab.c" ; +the parser output file is called +.BR y.tab.c , +and the other outputs are called +.B y.output +and +.BR y.tab.h . +The purpose of this switch is to imitate +.IR yacc 's +output file name conventions. +Thus, the following shell script can substitute for +.I yacc +and is often installed as +.IR yacc : +.sp +.RS +.ft B +bison \-y "$@" +.ft R +.sp +.RE +.SH SEE ALSO +.IR yacc (1) +.br +The +.IR "Bison Reference Manual" , +included as the file +.B bison.texinfo +in the +.I bison +source distribution. +.SH DIAGNOSTICS +Self explanatory. diff --git a/src/apps/bin/bison/doc/bison.info b/src/apps/bin/bison/doc/bison.info new file mode 100644 index 0000000000..38cfbdd1e9 --- /dev/null +++ b/src/apps/bin/bison/doc/bison.info @@ -0,0 +1,7548 @@ +This is bison.info, produced by makeinfo version 4.7 from bison.texinfo. + + This manual is for GNU Bison (version 1.875d, 30 March 2004), the +GNU parser generator. + + Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1995, 1998, 1999, +2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.1 or any later version published by the Free Software + Foundation; with no Invariant Sections, with the Front-Cover texts + being "A GNU Manual," and with the Back-Cover Texts as in (a) + below. A copy of the license is included in the section entitled + "GNU Free Documentation License." + + (a) The FSF's Back-Cover Text is: "You have freedom to copy and + modify this GNU Manual, like GNU software. Copies published by + the Free Software Foundation raise funds for GNU development." + +INFO-DIR-SECTION GNU programming tools +START-INFO-DIR-ENTRY +* bison: (bison). GNU parser generator (Yacc replacement). +END-INFO-DIR-ENTRY + + +File: bison.info, Node: Top, Next: Introduction, Up: (dir) + +Bison +***** + +This manual is for GNU Bison (version 1.875d, 30 March 2004), the GNU +parser generator. + + Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1995, 1998, 1999, +2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + Permission is granted to copy, distribute and/or modify this + document under the terms of the GNU Free Documentation License, + Version 1.1 or any later version published by the Free Software + Foundation; with no Invariant Sections, with the Front-Cover texts + being "A GNU Manual," and with the Back-Cover Texts as in (a) + below. A copy of the license is included in the section entitled + "GNU Free Documentation License." + + (a) The FSF's Back-Cover Text is: "You have freedom to copy and + modify this GNU Manual, like GNU software. Copies published by + the Free Software Foundation raise funds for GNU development." + +* Menu: + +* Introduction:: +* Conditions:: +* Copying:: The GNU General Public License says + how you can copy and share Bison + +Tutorial sections: +* Concepts:: Basic concepts for understanding Bison. +* Examples:: Three simple explained examples of using Bison. + +Reference sections: +* Grammar File:: Writing Bison declarations and rules. +* Interface:: C-language interface to the parser function `yyparse'. +* Algorithm:: How the Bison parser works at run-time. +* Error Recovery:: Writing rules for error recovery. +* Context Dependency:: What to do if your language syntax is too + messy for Bison to handle straightforwardly. +* Debugging:: Understanding or debugging Bison parsers. +* Invocation:: How to run Bison (to produce the parser source file). +* Table of Symbols:: All the keywords of the Bison language are explained. +* Glossary:: Basic concepts are explained. +* FAQ:: Frequently Asked Questions +* Copying This Manual:: License for copying this manual. +* Index:: Cross-references to the text. + + --- The Detailed Node Listing --- + +The Concepts of Bison + +* Language and Grammar:: Languages and context-free grammars, + as mathematical ideas. +* Grammar in Bison:: How we represent grammars for Bison's sake. +* Semantic Values:: Each token or syntactic grouping can have + a semantic value (the value of an integer, + the name of an identifier, etc.). +* Semantic Actions:: Each rule can have an action containing C code. +* GLR Parsers:: Writing parsers for general context-free languages +* Locations Overview:: Tracking Locations. +* Bison Parser:: What are Bison's input and output, + how is the output used? +* Stages:: Stages in writing and running Bison grammars. +* Grammar Layout:: Overall structure of a Bison grammar file. + +Examples + +* RPN Calc:: Reverse polish notation calculator; + a first example with no operator precedence. +* Infix Calc:: Infix (algebraic) notation calculator. + Operator precedence is introduced. +* Simple Error Recovery:: Continuing after syntax errors. +* Location Tracking Calc:: Demonstrating the use of @N and @$. +* Multi-function Calc:: Calculator with memory and trig functions. + It uses multiple data-types for semantic values. +* Exercises:: Ideas for improving the multi-function calculator. + +Reverse Polish Notation Calculator + +* Decls: Rpcalc Decls. Prologue (declarations) for rpcalc. +* Rules: Rpcalc Rules. Grammar Rules for rpcalc, with explanation. +* Lexer: Rpcalc Lexer. The lexical analyzer. +* Main: Rpcalc Main. The controlling function. +* Error: Rpcalc Error. The error reporting function. +* Gen: Rpcalc Gen. Running Bison on the grammar file. +* Comp: Rpcalc Compile. Run the C compiler on the output code. + +Grammar Rules for `rpcalc' + +* Rpcalc Input:: +* Rpcalc Line:: +* Rpcalc Expr:: + +Location Tracking Calculator: `ltcalc' + +* Decls: Ltcalc Decls. Bison and C declarations for ltcalc. +* Rules: Ltcalc Rules. Grammar rules for ltcalc, with explanations. +* Lexer: Ltcalc Lexer. The lexical analyzer. + +Multi-Function Calculator: `mfcalc' + +* Decl: Mfcalc Decl. Bison declarations for multi-function calculator. +* Rules: Mfcalc Rules. Grammar rules for the calculator. +* Symtab: Mfcalc Symtab. Symbol table management subroutines. + +Bison Grammar Files + +* Grammar Outline:: Overall layout of the grammar file. +* Symbols:: Terminal and nonterminal symbols. +* Rules:: How to write grammar rules. +* Recursion:: Writing recursive rules. +* Semantics:: Semantic values and actions. +* Locations:: Locations and actions. +* Declarations:: All kinds of Bison declarations are described here. +* Multiple Parsers:: Putting more than one Bison parser in one program. + +Outline of a Bison Grammar + +* Prologue:: Syntax and usage of the prologue. +* Bison Declarations:: Syntax and usage of the Bison declarations section. +* Grammar Rules:: Syntax and usage of the grammar rules section. +* Epilogue:: Syntax and usage of the epilogue. + +Defining Language Semantics + +* Value Type:: Specifying one data type for all semantic values. +* Multiple Types:: Specifying several alternative data types. +* Actions:: An action is the semantic definition of a grammar rule. +* Action Types:: Specifying data types for actions to operate on. +* Mid-Rule Actions:: Most actions go at the end of a rule. + This says when, why and how to use the exceptional + action in the middle of a rule. + +Tracking Locations + +* Location Type:: Specifying a data type for locations. +* Actions and Locations:: Using locations in actions. +* Location Default Action:: Defining a general way to compute locations. + +Bison Declarations + +* Token Decl:: Declaring terminal symbols. +* Precedence Decl:: Declaring terminals with precedence and associativity. +* Union Decl:: Declaring the set of all semantic value types. +* Type Decl:: Declaring the choice of type for a nonterminal symbol. +* Destructor Decl:: Declaring how symbols are freed. +* Expect Decl:: Suppressing warnings about parsing conflicts. +* Start Decl:: Specifying the start symbol. +* Pure Decl:: Requesting a reentrant parser. +* Decl Summary:: Table of all Bison declarations. + +Parser C-Language Interface + +* Parser Function:: How to call `yyparse' and what it returns. +* Lexical:: You must supply a function `yylex' + which reads tokens. +* Error Reporting:: You must supply a function `yyerror'. +* Action Features:: Special features for use in actions. + +The Lexical Analyzer Function `yylex' + +* Calling Convention:: How `yyparse' calls `yylex'. +* Token Values:: How `yylex' must return the semantic value + of the token it has read. +* Token Locations:: How `yylex' must return the text location + (line number, etc.) of the token, if the + actions want that. +* Pure Calling:: How the calling convention differs + in a pure parser (*note A Pure (Reentrant) Parser: Pure Decl.). + +The Bison Parser Algorithm + +* Look-Ahead:: Parser looks one token ahead when deciding what to do. +* Shift/Reduce:: Conflicts: when either shifting or reduction is valid. +* Precedence:: Operator precedence works by resolving conflicts. +* Contextual Precedence:: When an operator's precedence depends on context. +* Parser States:: The parser is a finite-state-machine with stack. +* Reduce/Reduce:: When two rules are applicable in the same situation. +* Mystery Conflicts:: Reduce/reduce conflicts that look unjustified. +* Generalized LR Parsing:: Parsing arbitrary context-free grammars. +* Stack Overflow:: What happens when stack gets full. How to avoid it. + +Operator Precedence + +* Why Precedence:: An example showing why precedence is needed. +* Using Precedence:: How to specify precedence in Bison grammars. +* Precedence Examples:: How these features are used in the previous example. +* How Precedence:: How they work. + +Handling Context Dependencies + +* Semantic Tokens:: Token parsing can depend on the semantic context. +* Lexical Tie-ins:: Token parsing can depend on the syntactic context. +* Tie-in Recovery:: Lexical tie-ins have implications for how + error recovery rules must be written. + +Debugging Your Parser + +* Understanding:: Understanding the structure of your parser. +* Tracing:: Tracing the execution of your parser. + +Invoking Bison + +* Bison Options:: All the options described in detail, + in alphabetical order by short options. +* Option Cross Key:: Alphabetical list of long options. +* Yacc Library:: Yacc-compatible `yylex' and `main'. + +Frequently Asked Questions + +* Parser Stack Overflow:: Breaking the Stack Limits +* How Can I Reset the Parser:: `yyparse' Keeps some State +* Strings are Destroyed:: `yylval' Loses Track of Strings +* C++ Parsers:: Compiling Parsers with C++ Compilers +* Implementing Loops:: Control Flow in the Calculator + +Copying This Manual + +* GNU Free Documentation License:: License for copying this manual. + + +File: bison.info, Node: Introduction, Next: Conditions, Prev: Top, Up: Top + +Introduction +************ + +"Bison" is a general-purpose parser generator that converts a grammar +description for an LALR(1) context-free grammar into a C program to +parse that grammar. Once you are proficient with Bison, you may use it +to develop a wide range of language parsers, from those used in simple +desk calculators to complex programming languages. + + Bison is upward compatible with Yacc: all properly-written Yacc +grammars ought to work with Bison with no change. Anyone familiar with +Yacc should be able to use Bison with little trouble. You need to be +fluent in C programming in order to use Bison or to understand this +manual. + + We begin with tutorial chapters that explain the basic concepts of +using Bison and show three explained examples, each building on the +last. If you don't know Bison or Yacc, start by reading these +chapters. Reference chapters follow which describe specific aspects of +Bison in detail. + + Bison was written primarily by Robert Corbett; Richard Stallman made +it Yacc-compatible. Wilfred Hansen of Carnegie Mellon University added +multi-character string literals and other features. + + This edition corresponds to version 1.875d of Bison. + + +File: bison.info, Node: Conditions, Next: Copying, Prev: Introduction, Up: Top + +Conditions for Using Bison +************************** + +As of Bison version 1.24, we have changed the distribution terms for +`yyparse' to permit using Bison's output in nonfree programs when Bison +is generating C code for LALR(1) parsers. Formerly, these parsers +could be used only in programs that were free software. + + The other GNU programming tools, such as the GNU C compiler, have +never had such a requirement. They could always be used for nonfree +software. The reason Bison was different was not due to a special +policy decision; it resulted from applying the usual General Public +License to all of the Bison source code. + + The output of the Bison utility--the Bison parser file--contains a +verbatim copy of a sizable piece of Bison, which is the code for the +`yyparse' function. (The actions from your grammar are inserted into +this function at one point, but the rest of the function is not +changed.) When we applied the GPL terms to the code for `yyparse', the +effect was to restrict the use of Bison output to free software. + + We didn't change the terms because of sympathy for people who want to +make software proprietary. *Software should be free.* But we +concluded that limiting Bison's use to free software was doing little to +encourage people to make other software free. So we decided to make the +practical conditions for using Bison match the practical conditions for +using the other GNU tools. + + This exception applies only when Bison is generating C code for an +LALR(1) parser; otherwise, the GPL terms operate as usual. You can +tell whether the exception applies to your `.c' output file by +inspecting it to see whether it says "As a special exception, when this +file is copied by Bison into a Bison output file, you may use that +output file without restriction." + + +File: bison.info, Node: Copying, Next: Concepts, Prev: Conditions, Up: Top + +GNU GENERAL PUBLIC LICENSE +************************** + + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc. + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + +Preamble +======== + +The licenses for most software are designed to take away your freedom +to share and change it. By contrast, the GNU General Public License is +intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it in +new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, +and (2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + 0. This License applies to any program or other work which contains a + notice placed by the copyright holder saying it may be distributed + under the terms of this General Public License. The "Program", + below, refers to any such program or work, and a "work based on + the Program" means either the Program or any derivative work under + copyright law: that is to say, a work containing the Program or a + portion of it, either verbatim or with modifications and/or + translated into another language. (Hereinafter, translation is + included without limitation in the term "modification".) Each + licensee is addressed as "you". + + Activities other than copying, distribution and modification are + not covered by this License; they are outside its scope. The act + of running the Program is not restricted, and the output from the + Program is covered only if its contents constitute a work based on + the Program (independent of having been made by running the + Program). Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's + source code as you receive it, in any medium, provided that you + conspicuously and appropriately publish on each copy an appropriate + copyright notice and disclaimer of warranty; keep intact all the + notices that refer to this License and to the absence of any + warranty; and give any other recipients of the Program a copy of + this License along with the Program. + + You may charge a fee for the physical act of transferring a copy, + and you may at your option offer warranty protection in exchange + for a fee. + + 2. You may modify your copy or copies of the Program or any portion + of it, thus forming a work based on the Program, and copy and + distribute such modifications or work under the terms of Section 1 + above, provided that you also meet all of these conditions: + + a. You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b. You must cause any work that you distribute or publish, that + in whole or in part contains or is derived from the Program + or any part thereof, to be licensed as a whole at no charge + to all third parties under the terms of this License. + + c. If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display + an announcement including an appropriate copyright notice and + a notice that there is no warranty (or else, saying that you + provide a warranty) and that users may redistribute the + program under these conditions, and telling the user how to + view a copy of this License. (Exception: if the Program + itself is interactive but does not normally print such an + announcement, your work based on the Program is not required + to print an announcement.) + + These requirements apply to the modified work as a whole. If + identifiable sections of that work are not derived from the + Program, and can be reasonably considered independent and separate + works in themselves, then this License, and its terms, do not + apply to those sections when you distribute them as separate + works. But when you distribute the same sections as part of a + whole which is a work based on the Program, the distribution of + the whole must be on the terms of this License, whose permissions + for other licensees extend to the entire whole, and thus to each + and every part regardless of who wrote it. + + Thus, it is not the intent of this section to claim rights or + contest your rights to work written entirely by you; rather, the + intent is to exercise the right to control the distribution of + derivative or collective works based on the Program. + + In addition, mere aggregation of another work not based on the + Program with the Program (or with a work based on the Program) on + a volume of a storage or distribution medium does not bring the + other work under the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, + under Section 2) in object code or executable form under the terms + of Sections 1 and 2 above provided that you also do one of the + following: + + a. Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of + Sections 1 and 2 above on a medium customarily used for + software interchange; or, + + b. Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a + medium customarily used for software interchange; or, + + c. Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with + such an offer, in accord with Subsection b above.) + + The source code for a work means the preferred form of the work for + making modifications to it. For an executable work, complete + source code means all the source code for all modules it contains, + plus any associated interface definition files, plus the scripts + used to control compilation and installation of the executable. + However, as a special exception, the source code distributed need + not include anything that is normally distributed (in either + source or binary form) with the major components (compiler, + kernel, and so on) of the operating system on which the executable + runs, unless that component itself accompanies the executable. + + If distribution of executable or object code is made by offering + access to copy from a designated place, then offering equivalent + access to copy the source code from the same place counts as + distribution of the source code, even though third parties are not + compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program + except as expressly provided under this License. Any attempt + otherwise to copy, modify, sublicense or distribute the Program is + void, and will automatically terminate your rights under this + License. However, parties who have received copies, or rights, + from you under this License will not have their licenses + terminated so long as such parties remain in full compliance. + + 5. You are not required to accept this License, since you have not + signed it. However, nothing else grants you permission to modify + or distribute the Program or its derivative works. These actions + are prohibited by law if you do not accept this License. + Therefore, by modifying or distributing the Program (or any work + based on the Program), you indicate your acceptance of this + License to do so, and all its terms and conditions for copying, + distributing or modifying the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the + Program), the recipient automatically receives a license from the + original licensor to copy, distribute or modify the Program + subject to these terms and conditions. You may not impose any + further restrictions on the recipients' exercise of the rights + granted herein. You are not responsible for enforcing compliance + by third parties to this License. + + 7. If, as a consequence of a court judgment or allegation of patent + infringement or for any other reason (not limited to patent + issues), conditions are imposed on you (whether by court order, + agreement or otherwise) that contradict the conditions of this + License, they do not excuse you from the conditions of this + License. If you cannot distribute so as to satisfy simultaneously + your obligations under this License and any other pertinent + obligations, then as a consequence you may not distribute the + Program at all. For example, if a patent license would not permit + royalty-free redistribution of the Program by all those who + receive copies directly or indirectly through you, then the only + way you could satisfy both it and this License would be to refrain + entirely from distribution of the Program. + + If any portion of this section is held invalid or unenforceable + under any particular circumstance, the balance of the section is + intended to apply and the section as a whole is intended to apply + in other circumstances. + + It is not the purpose of this section to induce you to infringe any + patents or other property right claims or to contest validity of + any such claims; this section has the sole purpose of protecting + the integrity of the free software distribution system, which is + implemented by public license practices. Many people have made + generous contributions to the wide range of software distributed + through that system in reliance on consistent application of that + system; it is up to the author/donor to decide if he or she is + willing to distribute software through any other system and a + licensee cannot impose that choice. + + This section is intended to make thoroughly clear what is believed + to be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in + certain countries either by patents or by copyrighted interfaces, + the original copyright holder who places the Program under this + License may add an explicit geographical distribution limitation + excluding those countries, so that distribution is permitted only + in or among countries not thus excluded. In such case, this + License incorporates the limitation as if written in the body of + this License. + + 9. The Free Software Foundation may publish revised and/or new + versions of the General Public License from time to time. Such + new versions will be similar in spirit to the present version, but + may differ in detail to address new problems or concerns. + + Each version is given a distinguishing version number. If the + Program specifies a version number of this License which applies + to it and "any later version", you have the option of following + the terms and conditions either of that version or of any later + version published by the Free Software Foundation. If the Program + does not specify a version number of this License, you may choose + any version ever published by the Free Software Foundation. + + 10. If you wish to incorporate parts of the Program into other free + programs whose distribution conditions are different, write to the + author to ask for permission. For software which is copyrighted + by the Free Software Foundation, write to the Free Software + Foundation; we sometimes make exceptions for this. Our decision + will be guided by the two goals of preserving the free status of + all derivatives of our free software and of promoting the sharing + and reuse of software generally. + + NO WARRANTY + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO + WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE + LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT + HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT + WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT + NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS TO THE + QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE + PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY + SERVICING, REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN + WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY + MODIFY AND/OR REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE + LIABLE TO YOU FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, + INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR + INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF + DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU + OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY + OTHER PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN + ADVISED OF THE POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS +Appendix: How to Apply These Terms to Your New Programs +======================================================= + +If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these +terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + ONE LINE TO GIVE THE PROGRAM'S NAME AND A BRIEF IDEA OF WHAT IT DOES. + Copyright (C) YYYY NAME OF AUTHOR + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + + Also add information on how to contact you by electronic and paper +mail. + + If the program is interactive, make it output a short notice like +this when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) 19YY NAME OF AUTHOR + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + + The hypothetical commands `show w' and `show c' should show the +appropriate parts of the General Public License. Of course, the +commands you use may be called something other than `show w' and `show +c'; they could even be mouse-clicks or menu items--whatever suits your +program. + + You should also get your employer (if you work as a programmer) or +your school, if any, to sign a "copyright disclaimer" for the program, +if necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + SIGNATURE OF TY COON, 1 April 1989 + Ty Coon, President of Vice + + This General Public License does not permit incorporating your +program into proprietary programs. If your program is a subroutine +library, you may consider it more useful to permit linking proprietary +applications with the library. If this is what you want to do, use the +GNU Library General Public License instead of this License. + + +File: bison.info, Node: Concepts, Next: Examples, Prev: Copying, Up: Top + +1 The Concepts of Bison +*********************** + +This chapter introduces many of the basic concepts without which the +details of Bison will not make sense. If you do not already know how to +use Bison or Yacc, we suggest you start by reading this chapter +carefully. + +* Menu: + +* Language and Grammar:: Languages and context-free grammars, + as mathematical ideas. +* Grammar in Bison:: How we represent grammars for Bison's sake. +* Semantic Values:: Each token or syntactic grouping can have + a semantic value (the value of an integer, + the name of an identifier, etc.). +* Semantic Actions:: Each rule can have an action containing C code. +* GLR Parsers:: Writing parsers for general context-free languages +* Locations Overview:: Tracking Locations. +* Bison Parser:: What are Bison's input and output, + how is the output used? +* Stages:: Stages in writing and running Bison grammars. +* Grammar Layout:: Overall structure of a Bison grammar file. + + +File: bison.info, Node: Language and Grammar, Next: Grammar in Bison, Up: Concepts + +1.1 Languages and Context-Free Grammars +======================================= + +In order for Bison to parse a language, it must be described by a +"context-free grammar". This means that you specify one or more +"syntactic groupings" and give rules for constructing them from their +parts. For example, in the C language, one kind of grouping is called +an `expression'. One rule for making an expression might be, "An +expression can be made of a minus sign and another expression". +Another would be, "An expression can be an integer". As you can see, +rules are often recursive, but there must be at least one rule which +leads out of the recursion. + + The most common formal system for presenting such rules for humans +to read is "Backus-Naur Form" or "BNF", which was developed in order to +specify the language Algol 60. Any grammar expressed in BNF is a +context-free grammar. The input to Bison is essentially +machine-readable BNF. + + There are various important subclasses of context-free grammar. +Although it can handle almost all context-free grammars, Bison is +optimized for what are called LALR(1) grammars. In brief, in these +grammars, it must be possible to tell how to parse any portion of an +input string with just a single token of look-ahead. Strictly +speaking, that is a description of an LR(1) grammar, and LALR(1) +involves additional restrictions that are hard to explain simply; but +it is rare in actual practice to find an LR(1) grammar that fails to be +LALR(1). *Note Mysterious Reduce/Reduce Conflicts: Mystery Conflicts, +for more information on this. + + Parsers for LALR(1) grammars are "deterministic", meaning roughly +that the next grammar rule to apply at any point in the input is +uniquely determined by the preceding input and a fixed, finite portion +(called a "look-ahead") of the remaining input. A context-free grammar +can be "ambiguous", meaning that there are multiple ways to apply the +grammar rules to get the some inputs. Even unambiguous grammars can be +"non-deterministic", meaning that no fixed look-ahead always suffices +to determine the next grammar rule to apply. With the proper +declarations, Bison is also able to parse these more general +context-free grammars, using a technique known as GLR parsing (for +Generalized LR). Bison's GLR parsers are able to handle any +context-free grammar for which the number of possible parses of any +given string is finite. + + In the formal grammatical rules for a language, each kind of +syntactic unit or grouping is named by a "symbol". Those which are +built by grouping smaller constructs according to grammatical rules are +called "nonterminal symbols"; those which can't be subdivided are called +"terminal symbols" or "token types". We call a piece of input +corresponding to a single terminal symbol a "token", and a piece +corresponding to a single nonterminal symbol a "grouping". + + We can use the C language as an example of what symbols, terminal and +nonterminal, mean. The tokens of C are identifiers, constants (numeric +and string), and the various keywords, arithmetic operators and +punctuation marks. So the terminal symbols of a grammar for C include +`identifier', `number', `string', plus one symbol for each keyword, +operator or punctuation mark: `if', `return', `const', `static', `int', +`char', `plus-sign', `open-brace', `close-brace', `comma' and many more. +(These tokens can be subdivided into characters, but that is a matter of +lexicography, not grammar.) + + Here is a simple C function subdivided into tokens: + + int /* keyword `int' */ + square (int x) /* identifier, open-paren, identifier, + identifier, close-paren */ + { /* open-brace */ + return x * x; /* keyword `return', identifier, asterisk, + identifier, semicolon */ + } /* close-brace */ + + The syntactic groupings of C include the expression, the statement, +the declaration, and the function definition. These are represented in +the grammar of C by nonterminal symbols `expression', `statement', +`declaration' and `function definition'. The full grammar uses dozens +of additional language constructs, each with its own nonterminal +symbol, in order to express the meanings of these four. The example +above is a function definition; it contains one declaration, and one +statement. In the statement, each `x' is an expression and so is `x * +x'. + + Each nonterminal symbol must have grammatical rules showing how it +is made out of simpler constructs. For example, one kind of C +statement is the `return' statement; this would be described with a +grammar rule which reads informally as follows: + + A `statement' can be made of a `return' keyword, an `expression' + and a `semicolon'. + +There would be many other rules for `statement', one for each kind of +statement in C. + + One nonterminal symbol must be distinguished as the special one which +defines a complete utterance in the language. It is called the "start +symbol". In a compiler, this means a complete input program. In the C +language, the nonterminal symbol `sequence of definitions and +declarations' plays this role. + + For example, `1 + 2' is a valid C expression--a valid part of a C +program--but it is not valid as an _entire_ C program. In the +context-free grammar of C, this follows from the fact that `expression' +is not the start symbol. + + The Bison parser reads a sequence of tokens as its input, and groups +the tokens using the grammar rules. If the input is valid, the end +result is that the entire token sequence reduces to a single grouping +whose symbol is the grammar's start symbol. If we use a grammar for C, +the entire input must be a `sequence of definitions and declarations'. +If not, the parser reports a syntax error. + + +File: bison.info, Node: Grammar in Bison, Next: Semantic Values, Prev: Language and Grammar, Up: Concepts + +1.2 From Formal Rules to Bison Input +==================================== + +A formal grammar is a mathematical construct. To define the language +for Bison, you must write a file expressing the grammar in Bison syntax: +a "Bison grammar" file. *Note Bison Grammar Files: Grammar File. + + A nonterminal symbol in the formal grammar is represented in Bison +input as an identifier, like an identifier in C. By convention, it +should be in lower case, such as `expr', `stmt' or `declaration'. + + The Bison representation for a terminal symbol is also called a +"token type". Token types as well can be represented as C-like +identifiers. By convention, these identifiers should be upper case to +distinguish them from nonterminals: for example, `INTEGER', +`IDENTIFIER', `IF' or `RETURN'. A terminal symbol that stands for a +particular keyword in the language should be named after that keyword +converted to upper case. The terminal symbol `error' is reserved for +error recovery. *Note Symbols::. + + A terminal symbol can also be represented as a character literal, +just like a C character constant. You should do this whenever a token +is just a single character (parenthesis, plus-sign, etc.): use that +same character in a literal as the terminal symbol for that token. + + A third way to represent a terminal symbol is with a C string +constant containing several characters. *Note Symbols::, for more +information. + + The grammar rules also have an expression in Bison syntax. For +example, here is the Bison rule for a C `return' statement. The +semicolon in quotes is a literal character token, representing part of +the C syntax for the statement; the naked semicolon, and the colon, are +Bison punctuation used in every rule. + + stmt: RETURN expr ';' + ; + +*Note Syntax of Grammar Rules: Rules. + + +File: bison.info, Node: Semantic Values, Next: Semantic Actions, Prev: Grammar in Bison, Up: Concepts + +1.3 Semantic Values +=================== + +A formal grammar selects tokens only by their classifications: for +example, if a rule mentions the terminal symbol `integer constant', it +means that _any_ integer constant is grammatically valid in that +position. The precise value of the constant is irrelevant to how to +parse the input: if `x+4' is grammatical then `x+1' or `x+3989' is +equally grammatical. + + But the precise value is very important for what the input means +once it is parsed. A compiler is useless if it fails to distinguish +between 4, 1 and 3989 as constants in the program! Therefore, each +token in a Bison grammar has both a token type and a "semantic value". +*Note Defining Language Semantics: Semantics, for details. + + The token type is a terminal symbol defined in the grammar, such as +`INTEGER', `IDENTIFIER' or `',''. It tells everything you need to know +to decide where the token may validly appear and how to group it with +other tokens. The grammar rules know nothing about tokens except their +types. + + The semantic value has all the rest of the information about the +meaning of the token, such as the value of an integer, or the name of an +identifier. (A token such as `','' which is just punctuation doesn't +need to have any semantic value.) + + For example, an input token might be classified as token type +`INTEGER' and have the semantic value 4. Another input token might +have the same token type `INTEGER' but value 3989. When a grammar rule +says that `INTEGER' is allowed, either of these tokens is acceptable +because each is an `INTEGER'. When the parser accepts the token, it +keeps track of the token's semantic value. + + Each grouping can also have a semantic value as well as its +nonterminal symbol. For example, in a calculator, an expression +typically has a semantic value that is a number. In a compiler for a +programming language, an expression typically has a semantic value that +is a tree structure describing the meaning of the expression. + + +File: bison.info, Node: Semantic Actions, Next: GLR Parsers, Prev: Semantic Values, Up: Concepts + +1.4 Semantic Actions +==================== + +In order to be useful, a program must do more than parse input; it must +also produce some output based on the input. In a Bison grammar, a +grammar rule can have an "action" made up of C statements. Each time +the parser recognizes a match for that rule, the action is executed. +*Note Actions::. + + Most of the time, the purpose of an action is to compute the +semantic value of the whole construct from the semantic values of its +parts. For example, suppose we have a rule which says an expression +can be the sum of two expressions. When the parser recognizes such a +sum, each of the subexpressions has a semantic value which describes +how it was built up. The action for this rule should create a similar +sort of value for the newly recognized larger expression. + + For example, here is a rule that says an expression can be the sum of +two subexpressions: + + expr: expr '+' expr { $$ = $1 + $3; } + ; + +The action says how to produce the semantic value of the sum expression +from the values of the two subexpressions. + + +File: bison.info, Node: GLR Parsers, Next: Locations Overview, Prev: Semantic Actions, Up: Concepts + +1.5 Writing GLR Parsers +======================= + +In some grammars, there will be cases where Bison's standard LALR(1) +parsing algorithm cannot decide whether to apply a certain grammar rule +at a given point. That is, it may not be able to decide (on the basis +of the input read so far) which of two possible reductions +(applications of a grammar rule) applies, or whether to apply a +reduction or read more of the input and apply a reduction later in the +input. These are known respectively as "reduce/reduce" conflicts +(*note Reduce/Reduce::), and "shift/reduce" conflicts (*note +Shift/Reduce::). + + To use a grammar that is not easily modified to be LALR(1), a more +general parsing algorithm is sometimes necessary. If you include +`%glr-parser' among the Bison declarations in your file (*note Grammar +Outline::), the result will be a Generalized LR (GLR) parser. These +parsers handle Bison grammars that contain no unresolved conflicts +(i.e., after applying precedence declarations) identically to LALR(1) +parsers. However, when faced with unresolved shift/reduce and +reduce/reduce conflicts, GLR parsers use the simple expedient of doing +both, effectively cloning the parser to follow both possibilities. +Each of the resulting parsers can again split, so that at any given +time, there can be any number of possible parses being explored. The +parsers proceed in lockstep; that is, all of them consume (shift) a +given input symbol before any of them proceed to the next. Each of the +cloned parsers eventually meets one of two possible fates: either it +runs into a parsing error, in which case it simply vanishes, or it +merges with another parser, because the two of them have reduced the +input to an identical set of symbols. + + During the time that there are multiple parsers, semantic actions are +recorded, but not performed. When a parser disappears, its recorded +semantic actions disappear as well, and are never performed. When a +reduction makes two parsers identical, causing them to merge, Bison +records both sets of semantic actions. Whenever the last two parsers +merge, reverting to the single-parser case, Bison resolves all the +outstanding actions either by precedences given to the grammar rules +involved, or by performing both actions, and then calling a designated +user-defined function on the resulting values to produce an arbitrary +merged result. + + Let's consider an example, vastly simplified from a C++ grammar. + + %{ + #include + #define YYSTYPE char const * + int yylex (void); + void yyerror (char const *); + %} + + %token TYPENAME ID + + %right '=' + %left '+' + + %glr-parser + + %% + + prog : + | prog stmt { printf ("\n"); } + ; + + stmt : expr ';' %dprec 1 + | decl %dprec 2 + ; + + expr : ID { printf ("%s ", $$); } + | TYPENAME '(' expr ')' + { printf ("%s ", $1); } + | expr '+' expr { printf ("+ "); } + | expr '=' expr { printf ("= "); } + ; + + decl : TYPENAME declarator ';' + { printf ("%s ", $1); } + | TYPENAME declarator '=' expr ';' + { printf ("%s ", $1); } + ; + + declarator : ID { printf ("\"%s\" ", $1); } + | '(' declarator ')' + ; + +This models a problematic part of the C++ grammar--the ambiguity between +certain declarations and statements. For example, + + T (x) = y+z; + +parses as either an `expr' or a `stmt' (assuming that `T' is recognized +as a `TYPENAME' and `x' as an `ID'). Bison detects this as a +reduce/reduce conflict between the rules `expr : ID' and `declarator : +ID', which it cannot resolve at the time it encounters `x' in the +example above. The two `%dprec' declarations, however, give precedence +to interpreting the example as a `decl', which implies that `x' is a +declarator. The parser therefore prints + + "x" y z + T + + Consider a different input string for this parser: + + T (x) + y; + +Here, there is no ambiguity (this cannot be parsed as a declaration). +However, at the time the Bison parser encounters `x', it does not have +enough information to resolve the reduce/reduce conflict (again, +between `x' as an `expr' or a `declarator'). In this case, no +precedence declaration is used. Instead, the parser splits into two, +one assuming that `x' is an `expr', and the other assuming `x' is a +`declarator'. The second of these parsers then vanishes when it sees +`+', and the parser prints + + x T y + + + Suppose that instead of resolving the ambiguity, you wanted to see +all the possibilities. For this purpose, we must "merge" the semantic +actions of the two possible parsers, rather than choosing one over the +other. To do so, you could change the declaration of `stmt' as follows: + + stmt : expr ';' %merge + | decl %merge + ; + +and define the `stmtMerge' function as: + + static YYSTYPE + stmtMerge (YYSTYPE x0, YYSTYPE x1) + { + printf (" "); + return ""; + } + +with an accompanying forward declaration in the C declarations at the +beginning of the file: + + %{ + #define YYSTYPE char const * + static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1); + %} + +With these declarations, the resulting parser will parse the first +example as both an `expr' and a `decl', and print + + "x" y z + T x T y z + = + + + The GLR parsers require a compiler for ISO C89 or later. In +addition, they use the `inline' keyword, which is not C89, but is C99 +and is a common extension in pre-C99 compilers. It is up to the user +of these parsers to handle portability issues. For instance, if using +Autoconf and the Autoconf macro `AC_C_INLINE', a mere + + %{ + #include + %} + +will suffice. Otherwise, we suggest + + %{ + #if __STDC_VERSION__ < 199901 && ! defined __GNUC__ && ! defined inline + #define inline + #endif + %} + + +File: bison.info, Node: Locations Overview, Next: Bison Parser, Prev: GLR Parsers, Up: Concepts + +1.6 Locations +============= + +Many applications, like interpreters or compilers, have to produce +verbose and useful error messages. To achieve this, one must be able +to keep track of the "textual location", or "location", of each +syntactic construct. Bison provides a mechanism for handling these +locations. + + Each token has a semantic value. In a similar fashion, each token +has an associated location, but the type of locations is the same for +all tokens and groupings. Moreover, the output parser is equipped with +a default data structure for storing locations (*note Locations::, for +more details). + + Like semantic values, locations can be reached in actions using a +dedicated set of constructs. In the example above, the location of the +whole grouping is `@$', while the locations of the subexpressions are +`@1' and `@3'. + + When a rule is matched, a default action is used to compute the +semantic value of its left hand side (*note Actions::). In the same +way, another default action is used for locations. However, the action +for locations is general enough for most cases, meaning there is +usually no need to describe for each rule how `@$' should be formed. +When building a new location for a given grouping, the default behavior +of the output parser is to take the beginning of the first symbol, and +the end of the last symbol. + + +File: bison.info, Node: Bison Parser, Next: Stages, Prev: Locations Overview, Up: Concepts + +1.7 Bison Output: the Parser File +================================= + +When you run Bison, you give it a Bison grammar file as input. The +output is a C source file that parses the language described by the +grammar. This file is called a "Bison parser". Keep in mind that the +Bison utility and the Bison parser are two distinct programs: the Bison +utility is a program whose output is the Bison parser that becomes part +of your program. + + The job of the Bison parser is to group tokens into groupings +according to the grammar rules--for example, to build identifiers and +operators into expressions. As it does this, it runs the actions for +the grammar rules it uses. + + The tokens come from a function called the "lexical analyzer" that +you must supply in some fashion (such as by writing it in C). The Bison +parser calls the lexical analyzer each time it wants a new token. It +doesn't know what is "inside" the tokens (though their semantic values +may reflect this). Typically the lexical analyzer makes the tokens by +parsing characters of text, but Bison does not depend on this. *Note +The Lexical Analyzer Function `yylex': Lexical. + + The Bison parser file is C code which defines a function named +`yyparse' which implements that grammar. This function does not make a +complete C program: you must supply some additional functions. One is +the lexical analyzer. Another is an error-reporting function which the +parser calls to report an error. In addition, a complete C program must +start with a function called `main'; you have to provide this, and +arrange for it to call `yyparse' or the parser will never run. *Note +Parser C-Language Interface: Interface. + + Aside from the token type names and the symbols in the actions you +write, all symbols defined in the Bison parser file itself begin with +`yy' or `YY'. This includes interface functions such as the lexical +analyzer function `yylex', the error reporting function `yyerror' and +the parser function `yyparse' itself. This also includes numerous +identifiers used for internal purposes. Therefore, you should avoid +using C identifiers starting with `yy' or `YY' in the Bison grammar +file except for the ones defined in this manual. + + In some cases the Bison parser file includes system headers, and in +those cases your code should respect the identifiers reserved by those +headers. On some non-GNU hosts, `', `', and +`' are included as needed to declare memory allocators and +related types. Other system headers may be included if you define +`YYDEBUG' to a nonzero value (*note Tracing Your Parser: Tracing.). + + +File: bison.info, Node: Stages, Next: Grammar Layout, Prev: Bison Parser, Up: Concepts + +1.8 Stages in Using Bison +========================= + +The actual language-design process using Bison, from grammar +specification to a working compiler or interpreter, has these parts: + + 1. Formally specify the grammar in a form recognized by Bison (*note + Bison Grammar Files: Grammar File.). For each grammatical rule in + the language, describe the action that is to be taken when an + instance of that rule is recognized. The action is described by a + sequence of C statements. + + 2. Write a lexical analyzer to process input and pass tokens to the + parser. The lexical analyzer may be written by hand in C (*note + The Lexical Analyzer Function `yylex': Lexical.). It could also + be produced using Lex, but the use of Lex is not discussed in this + manual. + + 3. Write a controlling function that calls the Bison-produced parser. + + 4. Write error-reporting routines. + + To turn this source code as written into a runnable program, you +must follow these steps: + + 1. Run Bison on the grammar to produce the parser. + + 2. Compile the code output by Bison, as well as any other source + files. + + 3. Link the object files to produce the finished product. + + +File: bison.info, Node: Grammar Layout, Prev: Stages, Up: Concepts + +1.9 The Overall Layout of a Bison Grammar +========================================= + +The input file for the Bison utility is a "Bison grammar file". The +general form of a Bison grammar file is as follows: + + %{ + PROLOGUE + %} + + BISON DECLARATIONS + + %% + GRAMMAR RULES + %% + EPILOGUE + +The `%%', `%{' and `%}' are punctuation that appears in every Bison +grammar file to separate the sections. + + The prologue may define types and variables used in the actions. +You can also use preprocessor commands to define macros used there, and +use `#include' to include header files that do any of these things. +You need to declare the lexical analyzer `yylex' and the error printer +`yyerror' here, along with any other global identifiers used by the +actions in the grammar rules. + + The Bison declarations declare the names of the terminal and +nonterminal symbols, and may also describe operator precedence and the +data types of semantic values of various symbols. + + The grammar rules define how to construct each nonterminal symbol +from its parts. + + The epilogue can contain any code you want to use. Often the +definitions of functions declared in the prologue go here. In a simple +program, all the rest of the program can go here. + + +File: bison.info, Node: Examples, Next: Grammar File, Prev: Concepts, Up: Top + +2 Examples +********** + +Now we show and explain three sample programs written using Bison: a +reverse polish notation calculator, an algebraic (infix) notation +calculator, and a multi-function calculator. All three have been tested +under BSD Unix 4.3; each produces a usable, though limited, interactive +desk-top calculator. + + These examples are simple, but Bison grammars for real programming +languages are written the same way. You can copy these examples out of +the Info file and into a source file to try them. + +* Menu: + +* RPN Calc:: Reverse polish notation calculator; + a first example with no operator precedence. +* Infix Calc:: Infix (algebraic) notation calculator. + Operator precedence is introduced. +* Simple Error Recovery:: Continuing after syntax errors. +* Location Tracking Calc:: Demonstrating the use of @N and @$. +* Multi-function Calc:: Calculator with memory and trig functions. + It uses multiple data-types for semantic values. +* Exercises:: Ideas for improving the multi-function calculator. + + +File: bison.info, Node: RPN Calc, Next: Infix Calc, Up: Examples + +2.1 Reverse Polish Notation Calculator +====================================== + +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. The second example will illustrate how operator +precedence is handled. + + The source code for this calculator is named `rpcalc.y'. The `.y' +extension is a convention used for Bison input files. + +* Menu: + +* Decls: Rpcalc Decls. Prologue (declarations) for rpcalc. +* Rules: Rpcalc Rules. Grammar Rules for rpcalc, with explanation. +* Lexer: Rpcalc Lexer. The lexical analyzer. +* Main: Rpcalc Main. The controlling function. +* Error: Rpcalc Error. The error reporting function. +* Gen: Rpcalc Gen. Running Bison on the grammar file. +* Comp: Rpcalc Compile. Run the C compiler on the output code. + + +File: bison.info, Node: Rpcalc Decls, Next: Rpcalc Rules, Up: RPN Calc + +2.1.1 Declarations for `rpcalc' +------------------------------- + +Here are the C and Bison declarations for the reverse polish notation +calculator. As in C, comments are placed between `/*...*/'. + + /* Reverse polish notation calculator. */ + + %{ + #define YYSTYPE double + #include + int yylex (void); + void yyerror (char const *); + %} + + %token NUM + + %% /* Grammar rules and actions follow. */ + + The declarations section (*note The prologue: Prologue.) contains two +preprocessor directives and two forward declarations. + + The `#define' directive defines the macro `YYSTYPE', thus specifying +the C data type for semantic values of both tokens and groupings (*note +Data Types of Semantic Values: Value Type.). The Bison parser will use +whatever type `YYSTYPE' is defined as; if you don't define it, `int' is +the default. Because we specify `double', each token and each +expression has an associated value, which is a floating point number. + + The `#include' directive is used to declare the exponentiation +function `pow'. + + The forward declarations for `yylex' and `yyerror' are needed +because the C language requires that functions be declared before they +are used. These functions will be defined in the epilogue, but the +parser calls them so they must be declared in the prologue. + + The second section, Bison declarations, provides information to Bison +about the token types (*note The Bison Declarations Section: Bison +Declarations.). Each terminal symbol that is not a single-character +literal must be declared here. (Single-character literals normally +don't need to be declared.) In this example, all the arithmetic +operators are designated by single-character literals, so the only +terminal symbol that needs to be declared is `NUM', the token type for +numeric constants. + + +File: bison.info, Node: Rpcalc Rules, Next: Rpcalc Lexer, Prev: Rpcalc Decls, Up: RPN Calc + +2.1.2 Grammar Rules for `rpcalc' +-------------------------------- + +Here are the grammar rules for the reverse polish notation calculator. + + input: /* empty */ + | input line + ; + + line: '\n' + | exp '\n' { printf ("\t%.10g\n", $1); } + ; + + exp: NUM { $$ = $1; } + | exp exp '+' { $$ = $1 + $2; } + | exp exp '-' { $$ = $1 - $2; } + | exp exp '*' { $$ = $1 * $2; } + | exp exp '/' { $$ = $1 / $2; } + /* Exponentiation */ + | exp exp '^' { $$ = pow ($1, $2); } + /* Unary minus */ + | exp 'n' { $$ = -$1; } + ; + %% + + The groupings of the rpcalc "language" defined here are the +expression (given the name `exp'), the line of input (`line'), and the +complete input transcript (`input'). Each of these nonterminal symbols +has several alternate rules, joined by the `|' punctuator which is read +as "or". The following sections explain what these rules mean. + + The semantics of the language is determined by the actions taken +when a grouping is recognized. The actions are the C code that appears +inside braces. *Note Actions::. + + You must specify these actions in C, but Bison provides the means for +passing semantic values between the rules. In each action, the +pseudo-variable `$$' stands for the semantic value for the grouping +that the rule is going to construct. Assigning a value to `$$' is the +main job of most actions. The semantic values of the components of the +rule are referred to as `$1', `$2', and so on. + +* Menu: + +* Rpcalc Input:: +* Rpcalc Line:: +* Rpcalc Expr:: + + +File: bison.info, Node: Rpcalc Input, Next: Rpcalc Line, Up: Rpcalc Rules + +2.1.2.1 Explanation of `input' +.............................. + +Consider the definition of `input': + + input: /* empty */ + | input line + ; + + This definition reads as follows: "A complete input is either an +empty string, or a complete input followed by an input line". Notice +that "complete input" is defined in terms of itself. This definition +is said to be "left recursive" since `input' appears always as the +leftmost symbol in the sequence. *Note Recursive Rules: Recursion. + + The first alternative is empty because there are no symbols between +the colon and the first `|'; this means that `input' can match an empty +string of input (no tokens). We write the rules this way because it is +legitimate to type `Ctrl-d' right after you start the calculator. It's +conventional to put an empty alternative first and write the comment +`/* empty */' in it. + + The second alternate rule (`input line') handles all nontrivial +input. It means, "After reading any number of lines, read one more +line if possible." The left recursion makes this rule into a loop. +Since the first alternative matches empty input, the loop can be +executed zero or more times. + + The parser function `yyparse' continues to process input until a +grammatical error is seen or the lexical analyzer says there are no more +input tokens; we will arrange for the latter to happen at end-of-input. + + +File: bison.info, Node: Rpcalc Line, Next: Rpcalc Expr, Prev: Rpcalc Input, Up: Rpcalc Rules + +2.1.2.2 Explanation of `line' +............................. + +Now consider the definition of `line': + + line: '\n' + | exp '\n' { printf ("\t%.10g\n", $1); } + ; + + The first alternative is a token which is a newline character; this +means that rpcalc accepts a blank line (and ignores it, since there is +no action). The second alternative is an expression followed by a +newline. This is the alternative that makes rpcalc useful. The +semantic value of the `exp' grouping is the value of `$1' because the +`exp' in question is the first symbol in the alternative. The action +prints this value, which is the result of the computation the user +asked for. + + This action is unusual because it does not assign a value to `$$'. +As a consequence, the semantic value associated with the `line' is +uninitialized (its value will be unpredictable). This would be a bug if +that value were ever used, but we don't use it: once rpcalc has printed +the value of the user's input line, that value is no longer needed. + + +File: bison.info, Node: Rpcalc Expr, Prev: Rpcalc Line, Up: Rpcalc Rules + +2.1.2.3 Explanation of `expr' +............................. + +The `exp' grouping has several rules, one for each kind of expression. +The first rule handles the simplest expressions: those that are just +numbers. The second handles an addition-expression, which looks like +two expressions followed by a plus-sign. The third handles +subtraction, and so on. + + exp: NUM + | exp exp '+' { $$ = $1 + $2; } + | exp exp '-' { $$ = $1 - $2; } + ... + ; + + We have used `|' to join all the rules for `exp', but we could +equally well have written them separately: + + exp: NUM ; + exp: exp exp '+' { $$ = $1 + $2; } ; + exp: exp exp '-' { $$ = $1 - $2; } ; + ... + + Most of the rules have actions that compute the value of the +expression in terms of the value of its parts. For example, in the +rule for addition, `$1' refers to the first component `exp' and `$2' +refers to the second one. The third component, `'+'', has no meaningful +associated semantic value, but if it had one you could refer to it as +`$3'. When `yyparse' recognizes a sum expression using this rule, the +sum of the two subexpressions' values is produced as the value of the +entire expression. *Note Actions::. + + You don't have to give an action for every rule. When a rule has no +action, Bison by default copies the value of `$1' into `$$'. This is +what happens in the first rule (the one that uses `NUM'). + + The formatting shown here is the recommended convention, but Bison +does not require it. You can add or change white space as much as you +wish. For example, this: + + exp : NUM | exp exp '+' {$$ = $1 + $2; } | ... + +means the same thing as this: + + exp: NUM + | exp exp '+' { $$ = $1 + $2; } + | ... + +The latter, however, is much more readable. + + +File: bison.info, Node: Rpcalc Lexer, Next: Rpcalc Main, Prev: Rpcalc Rules, Up: RPN Calc + +2.1.3 The `rpcalc' Lexical Analyzer +----------------------------------- + +The lexical analyzer's job is low-level parsing: converting characters +or sequences of characters into tokens. The Bison parser gets its +tokens by calling the lexical analyzer. *Note The Lexical Analyzer +Function `yylex': Lexical. + + Only a simple lexical analyzer is needed for the RPN calculator. +This lexical analyzer skips blanks and tabs, then reads in numbers as +`double' and returns them as `NUM' tokens. Any other character that +isn't part of a number is a separate token. Note that the token-code +for such a single-character token is the character itself. + + The return value of the lexical analyzer function is a numeric code +which represents a token type. The same text used in Bison rules to +stand for this token type is also a C expression for the numeric code +for the type. This works in two ways. If the token type is a +character literal, then its numeric code is that of the character; you +can use the same character literal in the lexical analyzer to express +the number. If the token type is an identifier, that identifier is +defined by Bison as a C macro whose definition is the appropriate +number. In this example, therefore, `NUM' becomes a macro for `yylex' +to use. + + The semantic value of the token (if it has one) is stored into the +global variable `yylval', which is where the Bison parser will look for +it. (The C data type of `yylval' is `YYSTYPE', which was defined at +the beginning of the grammar; *note Declarations for `rpcalc': Rpcalc +Decls.) + + A token type code of zero is returned if the end-of-input is +encountered. (Bison recognizes any nonpositive value as indicating +end-of-input.) + + Here is the code for the lexical analyzer: + + /* The lexical analyzer returns a double floating point + number on the stack and the token NUM, or the numeric code + of the character read if not a number. It skips all blanks + and tabs, and returns 0 for end-of-input. */ + + #include + + int + yylex (void) + { + int c; + + /* Skip white space. */ + while ((c = getchar ()) == ' ' || c == '\t') + ; + /* Process numbers. */ + if (c == '.' || isdigit (c)) + { + ungetc (c, stdin); + scanf ("%lf", &yylval); + return NUM; + } + /* Return end-of-input. */ + if (c == EOF) + return 0; + /* Return a single char. */ + return c; + } + + +File: bison.info, Node: Rpcalc Main, Next: Rpcalc Error, Prev: Rpcalc Lexer, Up: RPN Calc + +2.1.4 The Controlling Function +------------------------------ + +In keeping with the spirit of this example, the controlling function is +kept to the bare minimum. The only requirement is that it call +`yyparse' to start the process of parsing. + + int + main (void) + { + return yyparse (); + } + + +File: bison.info, Node: Rpcalc Error, Next: Rpcalc Gen, Prev: Rpcalc Main, Up: RPN Calc + +2.1.5 The Error Reporting Routine +--------------------------------- + +When `yyparse' detects a syntax error, it calls the error reporting +function `yyerror' to print an error message (usually but not always +`"syntax error"'). It is up to the programmer to supply `yyerror' +(*note Parser C-Language Interface: Interface.), so here is the +definition we will use: + + #include + + /* Called by yyparse on error. */ + void + yyerror (char const *s) + { + fprintf (stderr, "%s\n", s); + } + + After `yyerror' returns, the Bison parser may recover from the error +and continue parsing if the grammar contains a suitable error rule +(*note Error Recovery::). Otherwise, `yyparse' returns nonzero. We +have not written any error rules in this example, so any invalid input +will cause the calculator program to exit. This is not clean behavior +for a real calculator, but it is adequate for the first example. + + +File: bison.info, Node: Rpcalc Gen, Next: Rpcalc Compile, Prev: Rpcalc Error, Up: RPN Calc + +2.1.6 Running Bison to Make the Parser +-------------------------------------- + +Before running Bison to produce a parser, we need to decide how to +arrange all the source code in one or more source files. For such a +simple example, the easiest thing is to put everything in one file. The +definitions of `yylex', `yyerror' and `main' go at the end, in the +epilogue of the file (*note The Overall Layout of a Bison Grammar: +Grammar Layout.). + + For a large project, you would probably have several source files, +and use `make' to arrange to recompile them. + + With all the source in a single file, you use the following command +to convert it into a parser file: + + bison FILE_NAME.y + +In this example the file was called `rpcalc.y' (for "Reverse Polish +CALCulator"). Bison produces a file named `FILE_NAME.tab.c', removing +the `.y' from the original file name. The file output by Bison +contains the source code for `yyparse'. The additional functions in +the input file (`yylex', `yyerror' and `main') are copied verbatim to +the output. + + +File: bison.info, Node: Rpcalc Compile, Prev: Rpcalc Gen, Up: RPN Calc + +2.1.7 Compiling the Parser File +------------------------------- + +Here is how to compile and run the parser file: + + # List files in current directory. + $ ls + rpcalc.tab.c rpcalc.y + + # Compile the Bison parser. + # `-lm' tells compiler to search math library for `pow'. + $ cc -lm -o rpcalc rpcalc.tab.c + + # List files again. + $ ls + rpcalc rpcalc.tab.c rpcalc.y + + The file `rpcalc' now contains the executable code. Here is an +example session using `rpcalc'. + + $ rpcalc + 4 9 + + 13 + 3 7 + 3 4 5 *+- + -13 + 3 7 + 3 4 5 * + - n Note the unary minus, `n' + 13 + 5 6 / 4 n + + -3.166666667 + 3 4 ^ Exponentiation + 81 + ^D End-of-file indicator + $ + + +File: bison.info, Node: Infix Calc, Next: Simple Error Recovery, Prev: RPN Calc, Up: Examples + +2.2 Infix Notation Calculator: `calc' +===================================== + +We now modify rpcalc to handle infix operators instead of postfix. +Infix notation involves the concept of operator precedence and the need +for parentheses nested to arbitrary depth. Here is the Bison code for +`calc.y', an infix desk-top calculator. + + /* Infix notation calculator. */ + + %{ + #define YYSTYPE double + #include + #include + int yylex (void); + void yyerror (char const *); + %} + + /* Bison declarations. */ + %token NUM + %left '-' '+' + %left '*' '/' + %left NEG /* negation--unary minus */ + %right '^' /* exponentiation */ + + %% /* The grammar follows. */ + input: /* empty */ + | input line + ; + + line: '\n' + | exp '\n' { printf ("\t%.10g\n", $1); } + ; + + exp: NUM { $$ = $1; } + | exp '+' exp { $$ = $1 + $3; } + | exp '-' exp { $$ = $1 - $3; } + | exp '*' exp { $$ = $1 * $3; } + | exp '/' exp { $$ = $1 / $3; } + | '-' exp %prec NEG { $$ = -$2; } + | exp '^' exp { $$ = pow ($1, $3); } + | '(' exp ')' { $$ = $2; } + ; + %% + +The functions `yylex', `yyerror' and `main' can be the same as before. + + There are two important new features shown in this code. + + In the second section (Bison declarations), `%left' declares token +types and says they are left-associative operators. The declarations +`%left' and `%right' (right associativity) take the place of `%token' +which is used to declare a token type name without associativity. +(These tokens are single-character literals, which ordinarily don't +need to be declared. We declare them here to specify the +associativity.) + + Operator precedence is determined by the line ordering of the +declarations; the higher the line number of the declaration (lower on +the page or screen), the higher the precedence. Hence, exponentiation +has the highest precedence, unary minus (`NEG') is next, followed by +`*' and `/', and so on. *Note Operator Precedence: Precedence. + + The other important new feature is the `%prec' in the grammar +section for the unary minus operator. The `%prec' simply instructs +Bison that the rule `| '-' exp' has the same precedence as `NEG'--in +this case the next-to-highest. *Note Context-Dependent Precedence: +Contextual Precedence. + + Here is a sample run of `calc.y': + + $ calc + 4 + 4.5 - (34/(8*3+-3)) + 6.880952381 + -56 + 2 + -54 + 3 ^ 2 + 9 + + +File: bison.info, Node: Simple Error Recovery, Next: Location Tracking Calc, Prev: Infix Calc, Up: Examples + +2.3 Simple Error Recovery +========================= + +Up to this point, this manual has not addressed the issue of "error +recovery"--how to continue parsing after the parser detects a syntax +error. All we have handled is error reporting with `yyerror'. Recall +that by default `yyparse' returns after calling `yyerror'. This means +that an erroneous input line causes the calculator program to exit. +Now we show how to rectify this deficiency. + + The Bison language itself includes the reserved word `error', which +may be included in the grammar rules. In the example below it has been +added to one of the alternatives for `line': + + line: '\n' + | exp '\n' { printf ("\t%.10g\n", $1); } + | error '\n' { yyerrok; } + ; + + This addition to the grammar allows for simple error recovery in the +event of a syntax error. If an expression that cannot be evaluated is +read, the error will be recognized by the third rule for `line', and +parsing will continue. (The `yyerror' function is still called upon to +print its message as well.) The action executes the statement +`yyerrok', a macro defined automatically by Bison; its meaning is that +error recovery is complete (*note Error Recovery::). Note the +difference between `yyerrok' and `yyerror'; neither one is a misprint. + + This form of error recovery deals with syntax errors. There are +other kinds of errors; for example, division by zero, which raises an +exception signal that is normally fatal. A real calculator program +must handle this signal and use `longjmp' to return to `main' and +resume parsing input lines; it would also have to discard the rest of +the current line of input. We won't discuss this issue further because +it is not specific to Bison programs. + + +File: bison.info, Node: Location Tracking Calc, Next: Multi-function Calc, Prev: Simple Error Recovery, Up: Examples + +2.4 Location Tracking Calculator: `ltcalc' +========================================== + +This example extends the infix notation calculator with location +tracking. This feature will be used to improve the error messages. For +the sake of clarity, this example is a simple integer calculator, since +most of the work needed to use locations will be done in the lexical +analyzer. + +* Menu: + +* Decls: Ltcalc Decls. Bison and C declarations for ltcalc. +* Rules: Ltcalc Rules. Grammar rules for ltcalc, with explanations. +* Lexer: Ltcalc Lexer. The lexical analyzer. + + +File: bison.info, Node: Ltcalc Decls, Next: Ltcalc Rules, Up: Location Tracking Calc + +2.4.1 Declarations for `ltcalc' +------------------------------- + +The C and Bison declarations for the location tracking calculator are +the same as the declarations for the infix notation calculator. + + /* Location tracking calculator. */ + + %{ + #define YYSTYPE int + #include + int yylex (void); + void yyerror (char const *); + %} + + /* Bison declarations. */ + %token NUM + + %left '-' '+' + %left '*' '/' + %left NEG + %right '^' + + %% /* The grammar follows. */ + +Note there are no declarations specific to locations. Defining a data +type for storing locations is not needed: we will use the type provided +by default (*note Data Types of Locations: Location Type.), which is a +four member structure with the following integer fields: `first_line', +`first_column', `last_line' and `last_column'. + + +File: bison.info, Node: Ltcalc Rules, Next: Ltcalc Lexer, Prev: Ltcalc Decls, Up: Location Tracking Calc + +2.4.2 Grammar Rules for `ltcalc' +-------------------------------- + +Whether handling locations or not has no effect on the syntax of your +language. Therefore, grammar rules for this example will be very close +to those of the previous example: we will only modify them to benefit +from the new information. + + Here, we will use locations to report divisions by zero, and locate +the wrong expressions or subexpressions. + + input : /* empty */ + | input line + ; + + line : '\n' + | exp '\n' { printf ("%d\n", $1); } + ; + + exp : NUM { $$ = $1; } + | exp '+' exp { $$ = $1 + $3; } + | exp '-' exp { $$ = $1 - $3; } + | exp '*' exp { $$ = $1 * $3; } + | exp '/' exp + { + if ($3) + $$ = $1 / $3; + else + { + $$ = 1; + fprintf (stderr, "%d.%d-%d.%d: division by zero", + @3.first_line, @3.first_column, + @3.last_line, @3.last_column); + } + } + | '-' exp %preg NEG { $$ = -$2; } + | exp '^' exp { $$ = pow ($1, $3); } + | '(' exp ')' { $$ = $2; } + + This code shows how to reach locations inside of semantic actions, by +using the pseudo-variables `@N' for rule components, and the +pseudo-variable `@$' for groupings. + + We don't need to assign a value to `@$': the output parser does it +automatically. By default, before executing the C code of each action, +`@$' is set to range from the beginning of `@1' to the end of `@N', for +a rule with N components. This behavior can be redefined (*note +Default Action for Locations: Location Default Action.), and for very +specific rules, `@$' can be computed by hand. + + +File: bison.info, Node: Ltcalc Lexer, Prev: Ltcalc Rules, Up: Location Tracking Calc + +2.4.3 The `ltcalc' Lexical Analyzer. +------------------------------------ + +Until now, we relied on Bison's defaults to enable location tracking. +The next step is to rewrite the lexical analyzer, and make it able to +feed the parser with the token locations, as it already does for +semantic values. + + To this end, we must take into account every single character of the +input text, to avoid the computed locations of being fuzzy or wrong: + + int + yylex (void) + { + int c; + + /* Skip white space. */ + while ((c = getchar ()) == ' ' || c == '\t') + ++yylloc.last_column; + + /* Step. */ + yylloc.first_line = yylloc.last_line; + yylloc.first_column = yylloc.last_column; + + /* Process numbers. */ + if (isdigit (c)) + { + yylval = c - '0'; + ++yylloc.last_column; + while (isdigit (c = getchar ())) + { + ++yylloc.last_column; + yylval = yylval * 10 + c - '0'; + } + ungetc (c, stdin); + return NUM; + } + + /* Return end-of-input. */ + if (c == EOF) + return 0; + + /* Return a single char, and update location. */ + if (c == '\n') + { + ++yylloc.last_line; + yylloc.last_column = 0; + } + else + ++yylloc.last_column; + return c; + } + + Basically, the lexical analyzer performs the same processing as +before: it skips blanks and tabs, and reads numbers or single-character +tokens. In addition, it updates `yylloc', the global variable (of type +`YYLTYPE') containing the token's location. + + Now, each time this function returns a token, the parser has its +number as well as its semantic value, and its location in the text. +The last needed change is to initialize `yylloc', for example in the +controlling function: + + int + main (void) + { + yylloc.first_line = yylloc.last_line = 1; + yylloc.first_column = yylloc.last_column = 0; + return yyparse (); + } + + Remember that computing locations is not a matter of syntax. Every +character must be associated to a location update, whether it is in +valid input, in comments, in literal strings, and so on. + + +File: bison.info, Node: Multi-function Calc, Next: Exercises, Prev: Location Tracking Calc, Up: Examples + +2.5 Multi-Function Calculator: `mfcalc' +======================================= + +Now that the basics of Bison have been discussed, it is time to move on +to a more advanced problem. The above calculators provided only five +functions, `+', `-', `*', `/' and `^'. It would be nice to have a +calculator that provides other mathematical functions such as `sin', +`cos', etc. + + It is easy to add new operators to the infix calculator as long as +they are only single-character literals. The lexical analyzer `yylex' +passes back all nonnumber characters as tokens, so new grammar rules +suffice for adding a new operator. But we want something more +flexible: built-in functions whose syntax has this form: + + FUNCTION_NAME (ARGUMENT) + +At the same time, we will add memory to the calculator, by allowing you +to create named variables, store values in them, and use them later. +Here is a sample session with the multi-function calculator: + + $ mfcalc + pi = 3.141592653589 + 3.1415926536 + sin(pi) + 0.0000000000 + alpha = beta1 = 2.3 + 2.3000000000 + alpha + 2.3000000000 + ln(alpha) + 0.8329091229 + exp(ln(beta1)) + 2.3000000000 + $ + + Note that multiple assignment and nested function calls are +permitted. + +* Menu: + +* Decl: Mfcalc Decl. Bison declarations for multi-function calculator. +* Rules: Mfcalc Rules. Grammar rules for the calculator. +* Symtab: Mfcalc Symtab. Symbol table management subroutines. + + +File: bison.info, Node: Mfcalc Decl, Next: Mfcalc Rules, Up: Multi-function Calc + +2.5.1 Declarations for `mfcalc' +------------------------------- + +Here are the C and Bison declarations for the multi-function calculator. + + %{ + #include /* For math functions, cos(), sin(), etc. */ + #include "calc.h" /* Contains definition of `symrec'. */ + int yylex (void); + void yyerror (char const *); + %} + %union { + double val; /* For returning numbers. */ + symrec *tptr; /* For returning symbol-table pointers. */ + } + %token NUM /* Simple double precision number. */ + %token VAR FNCT /* Variable and Function. */ + %type exp + + %right '=' + %left '-' '+' + %left '*' '/' + %left NEG /* negation--unary minus */ + %right '^' /* exponentiation */ + %% /* The grammar follows. */ + + The above grammar introduces only two new features of the Bison +language. These features allow semantic values to have various data +types (*note More Than One Value Type: Multiple Types.). + + The `%union' declaration specifies the entire list of possible types; +this is instead of defining `YYSTYPE'. The allowable types are now +double-floats (for `exp' and `NUM') and pointers to entries in the +symbol table. *Note The Collection of Value Types: Union Decl. + + Since values can now have various types, it is necessary to +associate a type with each grammar symbol whose semantic value is used. +These symbols are `NUM', `VAR', `FNCT', and `exp'. Their declarations +are augmented with information about their data type (placed between +angle brackets). + + The Bison construct `%type' is used for declaring nonterminal +symbols, just as `%token' is used for declaring token types. We have +not used `%type' before because nonterminal symbols are normally +declared implicitly by the rules that define them. But `exp' must be +declared explicitly so we can specify its value type. *Note +Nonterminal Symbols: Type Decl. + + +File: bison.info, Node: Mfcalc Rules, Next: Mfcalc Symtab, Prev: Mfcalc Decl, Up: Multi-function Calc + +2.5.2 Grammar Rules for `mfcalc' +-------------------------------- + +Here are the grammar rules for the multi-function calculator. Most of +them are copied directly from `calc'; three rules, those which mention +`VAR' or `FNCT', are new. + + input: /* empty */ + | input line + ; + + line: + '\n' + | exp '\n' { printf ("\t%.10g\n", $1); } + | error '\n' { yyerrok; } + ; + + exp: NUM { $$ = $1; } + | VAR { $$ = $1->value.var; } + | VAR '=' exp { $$ = $3; $1->value.var = $3; } + | FNCT '(' exp ')' { $$ = (*($1->value.fnctptr))($3); } + | exp '+' exp { $$ = $1 + $3; } + | exp '-' exp { $$ = $1 - $3; } + | exp '*' exp { $$ = $1 * $3; } + | exp '/' exp { $$ = $1 / $3; } + | '-' exp %prec NEG { $$ = -$2; } + | exp '^' exp { $$ = pow ($1, $3); } + | '(' exp ')' { $$ = $2; } + ; + /* End of grammar. */ + %% + + +File: bison.info, Node: Mfcalc Symtab, Prev: Mfcalc Rules, Up: Multi-function Calc + +2.5.3 The `mfcalc' Symbol Table +------------------------------- + +The multi-function calculator requires a symbol table to keep track of +the names and meanings of variables and functions. This doesn't affect +the grammar rules (except for the actions) or the Bison declarations, +but it requires some additional C functions for support. + + The symbol table itself consists of a linked list of records. Its +definition, which is kept in the header `calc.h', is as follows. It +provides for either functions or variables to be placed in the table. + + /* Function type. */ + typedef double (*func_t) (double); + + /* Data type for links in the chain of symbols. */ + struct symrec + { + char *name; /* name of symbol */ + int type; /* type of symbol: either VAR or FNCT */ + union + { + double var; /* value of a VAR */ + func_t fnctptr; /* value of a FNCT */ + } value; + struct symrec *next; /* link field */ + }; + + typedef struct symrec symrec; + + /* The symbol table: a chain of `struct symrec'. */ + extern symrec *sym_table; + + symrec *putsym (char const *, func_t); + symrec *getsym (char const *); + + The new version of `main' includes a call to `init_table', a +function that initializes the symbol table. Here it is, and +`init_table' as well: + + #include + + /* Called by yyparse on error. */ + void + yyerror (char const *s) + { + printf ("%s\n", s); + } + + struct init + { + char const *fname; + double (*fnct) (double); + }; + + struct init const arith_fncts[] = + { + "sin", sin, + "cos", cos, + "atan", atan, + "ln", log, + "exp", exp, + "sqrt", sqrt, + 0, 0 + }; + + /* The symbol table: a chain of `struct symrec'. */ + symrec *sym_table; + + /* Put arithmetic functions in table. */ + void + init_table (void) + { + int i; + symrec *ptr; + for (i = 0; arith_fncts[i].fname != 0; i++) + { + ptr = putsym (arith_fncts[i].fname, FNCT); + ptr->value.fnctptr = arith_fncts[i].fnct; + } + } + + int + main (void) + { + init_table (); + return yyparse (); + } + + By simply editing the initialization list and adding the necessary +include files, you can add additional functions to the calculator. + + Two important functions allow look-up and installation of symbols in +the symbol table. The function `putsym' is passed a name and the type +(`VAR' or `FNCT') of the object to be installed. The object is linked +to the front of the list, and a pointer to the object is returned. The +function `getsym' is passed the name of the symbol to look up. If +found, a pointer to that symbol is returned; otherwise zero is returned. + + symrec * + putsym (char const *sym_name, int sym_type) + { + symrec *ptr; + ptr = (symrec *) malloc (sizeof (symrec)); + ptr->name = (char *) malloc (strlen (sym_name) + 1); + strcpy (ptr->name,sym_name); + ptr->type = sym_type; + ptr->value.var = 0; /* Set value to 0 even if fctn. */ + ptr->next = (struct symrec *)sym_table; + sym_table = ptr; + return ptr; + } + + symrec * + getsym (char const *sym_name) + { + symrec *ptr; + for (ptr = sym_table; ptr != (symrec *) 0; + ptr = (symrec *)ptr->next) + if (strcmp (ptr->name,sym_name) == 0) + return ptr; + return 0; + } + + The function `yylex' must now recognize variables, numeric values, +and the single-character arithmetic operators. Strings of alphanumeric +characters with a leading non-digit are recognized as either variables +or functions depending on what the symbol table says about them. + + The string is passed to `getsym' for look up in the symbol table. If +the name appears in the table, a pointer to its location and its type +(`VAR' or `FNCT') is returned to `yyparse'. If it is not already in +the table, then it is installed as a `VAR' using `putsym'. Again, a +pointer and its type (which must be `VAR') is returned to `yyparse'. + + No change is needed in the handling of numeric values and arithmetic +operators in `yylex'. + + #include + + int + yylex (void) + { + int c; + + /* Ignore white space, get first nonwhite character. */ + while ((c = getchar ()) == ' ' || c == '\t'); + + if (c == EOF) + return 0; + + /* Char starts a number => parse the number. */ + if (c == '.' || isdigit (c)) + { + ungetc (c, stdin); + scanf ("%lf", &yylval.val); + return NUM; + } + + /* Char starts an identifier => read the name. */ + if (isalpha (c)) + { + symrec *s; + static char *symbuf = 0; + static int length = 0; + int i; + + /* Initially make the buffer long enough + for a 40-character symbol name. */ + if (length == 0) + length = 40, symbuf = (char *)malloc (length + 1); + + i = 0; + do + { + /* If buffer is full, make it bigger. */ + if (i == length) + { + length *= 2; + symbuf = (char *) realloc (symbuf, length + 1); + } + /* Add this character to the buffer. */ + symbuf[i++] = c; + /* Get another character. */ + c = getchar (); + } + while (isalnum (c)); + + ungetc (c, stdin); + symbuf[i] = '\0'; + + s = getsym (symbuf); + if (s == 0) + s = putsym (symbuf, VAR); + yylval.tptr = s; + return s->type; + } + + /* Any other character is a token by itself. */ + return c; + } + + This program is both powerful and flexible. You may easily add new +functions, and it is a simple job to modify this code to install +predefined variables such as `pi' or `e' as well. + + +File: bison.info, Node: Exercises, Prev: Multi-function Calc, Up: Examples + +2.6 Exercises +============= + + 1. Add some new functions from `math.h' to the initialization list. + + 2. Add another array that contains constants and their values. Then + modify `init_table' to add these constants to the symbol table. + It will be easiest to give the constants type `VAR'. + + 3. Make the program report an error if the user refers to an + uninitialized variable in any way except to store a value in it. + + +File: bison.info, Node: Grammar File, Next: Interface, Prev: Examples, Up: Top + +3 Bison Grammar Files +********************* + +Bison takes as input a context-free grammar specification and produces a +C-language function that recognizes correct instances of the grammar. + + The Bison grammar input file conventionally has a name ending in +`.y'. *Note Invoking Bison: Invocation. + +* Menu: + +* Grammar Outline:: Overall layout of the grammar file. +* Symbols:: Terminal and nonterminal symbols. +* Rules:: How to write grammar rules. +* Recursion:: Writing recursive rules. +* Semantics:: Semantic values and actions. +* Locations:: Locations and actions. +* Declarations:: All kinds of Bison declarations are described here. +* Multiple Parsers:: Putting more than one Bison parser in one program. + + +File: bison.info, Node: Grammar Outline, Next: Symbols, Up: Grammar File + +3.1 Outline of a Bison Grammar +============================== + +A Bison grammar file has four main sections, shown here with the +appropriate delimiters: + + %{ + PROLOGUE + %} + + BISON DECLARATIONS + + %% + GRAMMAR RULES + %% + + EPILOGUE + + Comments enclosed in `/* ... */' may appear in any of the sections. +As a GNU extension, `//' introduces a comment that continues until end +of line. + +* Menu: + +* Prologue:: Syntax and usage of the prologue. +* Bison Declarations:: Syntax and usage of the Bison declarations section. +* Grammar Rules:: Syntax and usage of the grammar rules section. +* Epilogue:: Syntax and usage of the epilogue. + + +File: bison.info, Node: Prologue, Next: Bison Declarations, Up: Grammar Outline + +3.1.1 The prologue +------------------ + +The PROLOGUE section contains macro definitions and declarations of +functions and variables that are used in the actions in the grammar +rules. These are copied to the beginning of the parser file so that +they precede the definition of `yyparse'. You can use `#include' to +get the declarations from a header file. If you don't need any C +declarations, you may omit the `%{' and `%}' delimiters that bracket +this section. + + You may have more than one PROLOGUE section, intermixed with the +BISON DECLARATIONS. This allows you to have C and Bison declarations +that refer to each other. For example, the `%union' declaration may +use types defined in a header file, and you may wish to prototype +functions that take arguments of type `YYSTYPE'. This can be done with +two PROLOGUE blocks, one before and one after the `%union' declaration. + + %{ + #include + #include "ptypes.h" + %} + + %union { + long int n; + tree t; /* `tree' is defined in `ptypes.h'. */ + } + + %{ + static void print_token_value (FILE *, int, YYSTYPE); + #define YYPRINT(F, N, L) print_token_value (F, N, L) + %} + + ... + + +File: bison.info, Node: Bison Declarations, Next: Grammar Rules, Prev: Prologue, Up: Grammar Outline + +3.1.2 The Bison Declarations Section +------------------------------------ + +The BISON DECLARATIONS section contains declarations that define +terminal and nonterminal symbols, specify precedence, and so on. In +some simple grammars you may not need any declarations. *Note Bison +Declarations: Declarations. + + +File: bison.info, Node: Grammar Rules, Next: Epilogue, Prev: Bison Declarations, Up: Grammar Outline + +3.1.3 The Grammar Rules Section +------------------------------- + +The "grammar rules" section contains one or more Bison grammar rules, +and nothing else. *Note Syntax of Grammar Rules: Rules. + + There must always be at least one grammar rule, and the first `%%' +(which precedes the grammar rules) may never be omitted even if it is +the first thing in the file. + + +File: bison.info, Node: Epilogue, Prev: Grammar Rules, Up: Grammar Outline + +3.1.4 The epilogue +------------------ + +The EPILOGUE is copied verbatim to the end of the parser file, just as +the PROLOGUE is copied to the beginning. This is the most convenient +place to put anything that you want to have in the parser file but +which need not come before the definition of `yyparse'. For example, +the definitions of `yylex' and `yyerror' often go here. Because C +requires functions to be declared before being used, you often need to +declare functions like `yylex' and `yyerror' in the Prologue, even if +you define them int he Epilogue. *Note Parser C-Language Interface: +Interface. + + If the last section is empty, you may omit the `%%' that separates it +from the grammar rules. + + The Bison parser itself contains many macros and identifiers whose +names start with `yy' or `YY', so it is a good idea to avoid using any +such names (except those documented in this manual) in the epilogue of +the grammar file. + + +File: bison.info, Node: Symbols, Next: Rules, Prev: Grammar Outline, Up: Grammar File + +3.2 Symbols, Terminal and Nonterminal +===================================== + +"Symbols" in Bison grammars represent the grammatical classifications +of the language. + + A "terminal symbol" (also known as a "token type") represents a +class of syntactically equivalent tokens. You use the symbol in grammar +rules to mean that a token in that class is allowed. The symbol is +represented in the Bison parser by a numeric code, and the `yylex' +function returns a token type code to indicate what kind of token has +been read. You don't need to know what the code value is; you can use +the symbol to stand for it. + + A "nonterminal symbol" stands for a class of syntactically equivalent +groupings. The symbol name is used in writing grammar rules. By +convention, it should be all lower case. + + Symbol names can contain letters, digits (not at the beginning), +underscores and periods. Periods make sense only in nonterminals. + + There are three ways of writing terminal symbols in the grammar: + + * A "named token type" is written with an identifier, like an + identifier in C. By convention, it should be all upper case. Each + such name must be defined with a Bison declaration such as + `%token'. *Note Token Type Names: Token Decl. + + * A "character token type" (or "literal character token") is written + in the grammar using the same syntax used in C for character + constants; for example, `'+'' is a character token type. A + character token type doesn't need to be declared unless you need to + specify its semantic value data type (*note Data Types of Semantic + Values: Value Type.), associativity, or precedence (*note Operator + Precedence: Precedence.). + + By convention, a character token type is used only to represent a + token that consists of that particular character. Thus, the token + type `'+'' is used to represent the character `+' as a token. + Nothing enforces this convention, but if you depart from it, your + program will confuse other readers. + + All the usual escape sequences used in character literals in C can + be used in Bison as well, but you must not use the null character + as a character literal because its numeric code, zero, signifies + end-of-input (*note Calling Convention for `yylex': Calling + Convention.). Also, unlike standard C, trigraphs have no special + meaning in Bison character literals, nor is backslash-newline + allowed. + + * A "literal string token" is written like a C string constant; for + example, `"<="' is a literal string token. A literal string token + doesn't need to be declared unless you need to specify its semantic + value data type (*note Value Type::), associativity, or precedence + (*note Precedence::). + + You can associate the literal string token with a symbolic name as + an alias, using the `%token' declaration (*note Token + Declarations: Token Decl.). If you don't do that, the lexical + analyzer has to retrieve the token number for the literal string + token from the `yytname' table (*note Calling Convention::). + + *Warning*: literal string tokens do not work in Yacc. + + By convention, a literal string token is used only to represent a + token that consists of that particular string. Thus, you should + use the token type `"<="' to represent the string `<=' as a token. + Bison does not enforce this convention, but if you depart from + it, people who read your program will be confused. + + All the escape sequences used in string literals in C can be used + in Bison as well, except that you must not use a null character + within a string literal. Also, unlike Standard C, trigraphs have + no special meaning in Bison string literals, nor is + backslash-newline allowed. A literal string token must contain + two or more characters; for a token containing just one character, + use a character token (see above). + + How you choose to write a terminal symbol has no effect on its +grammatical meaning. That depends only on where it appears in rules and +on when the parser function returns that symbol. + + The value returned by `yylex' is always one of the terminal symbols, +except that a zero or negative value signifies end-of-input. Whichever +way you write the token type in the grammar rules, you write it the +same way in the definition of `yylex'. The numeric code for a +character token type is simply the positive numeric code of the +character, so `yylex' can use the identical value to generate the +requisite code, though you may need to convert it to `unsigned char' to +avoid sign-extension on hosts where `char' is signed. Each named token +type becomes a C macro in the parser file, so `yylex' can use the name +to stand for the code. (This is why periods don't make sense in +terminal symbols.) *Note Calling Convention for `yylex': Calling +Convention. + + If `yylex' is defined in a separate file, you need to arrange for the +token-type macro definitions to be available there. Use the `-d' +option when you run Bison, so that it will write these macro definitions +into a separate header file `NAME.tab.h' which you can include in the +other source files that need it. *Note Invoking Bison: Invocation. + + If you want to write a grammar that is portable to any Standard C +host, you must use only non-null character tokens taken from the basic +execution character set of Standard C. This set consists of the ten +digits, the 52 lower- and upper-case English letters, and the +characters in the following C-language string: + + "\a\b\t\n\v\f\r !\"#%&'()*+,-./:;<=>?[\\]^_{|}~" + + The `yylex' function and Bison must use a consistent character set +and encoding for character tokens. For example, if you run Bison in an +ASCII environment, but then compile and run the resulting program in an +environment that uses an incompatible character set like EBCDIC, the +resulting program may not work because the tables generated by Bison +will assume ASCII numeric values for character tokens. It is standard +practice for software distributions to contain C source files that were +generated by Bison in an ASCII environment, so installers on platforms +that are incompatible with ASCII must rebuild those files before +compiling them. + + The symbol `error' is a terminal symbol reserved for error recovery +(*note Error Recovery::); you shouldn't use it for any other purpose. +In particular, `yylex' should never return this value. The default +value of the error token is 256, unless you explicitly assigned 256 to +one of your tokens with a `%token' declaration. + + +File: bison.info, Node: Rules, Next: Recursion, Prev: Symbols, Up: Grammar File + +3.3 Syntax of Grammar Rules +=========================== + +A Bison grammar rule has the following general form: + + RESULT: COMPONENTS... + ; + +where RESULT is the nonterminal symbol that this rule describes, and +COMPONENTS are various terminal and nonterminal symbols that are put +together by this rule (*note Symbols::). + + For example, + + exp: exp '+' exp + ; + +says that two groupings of type `exp', with a `+' token in between, can +be combined into a larger grouping of type `exp'. + + White space in rules is significant only to separate symbols. You +can add extra white space as you wish. + + Scattered among the components can be ACTIONS that determine the +semantics of the rule. An action looks like this: + + {C STATEMENTS} + +Usually there is only one action and it follows the components. *Note +Actions::. + + Multiple rules for the same RESULT can be written separately or can +be joined with the vertical-bar character `|' as follows: + + RESULT: RULE1-COMPONENTS... + | RULE2-COMPONENTS... + ... + ; + +They are still considered distinct rules even when joined in this way. + + If COMPONENTS in a rule is empty, it means that RESULT can match the +empty string. For example, here is how to define a comma-separated +sequence of zero or more `exp' groupings: + + expseq: /* empty */ + | expseq1 + ; + + expseq1: exp + | expseq1 ',' exp + ; + +It is customary to write a comment `/* empty */' in each rule with no +components. + + +File: bison.info, Node: Recursion, Next: Semantics, Prev: Rules, Up: Grammar File + +3.4 Recursive Rules +=================== + +A rule is called "recursive" when its RESULT nonterminal appears also +on its right hand side. Nearly all Bison grammars need to use +recursion, because that is the only way to define a sequence of any +number of a particular thing. Consider this recursive definition of a +comma-separated sequence of one or more expressions: + + expseq1: exp + | expseq1 ',' exp + ; + +Since the recursive use of `expseq1' is the leftmost symbol in the +right hand side, we call this "left recursion". By contrast, here the +same construct is defined using "right recursion": + + expseq1: exp + | exp ',' expseq1 + ; + +Any kind of sequence can be defined using either left recursion or right +recursion, but you should always use left recursion, because it can +parse a sequence of any number of elements with bounded stack space. +Right recursion uses up space on the Bison stack in proportion to the +number of elements in the sequence, because all the elements must be +shifted onto the stack before the rule can be applied even once. *Note +The Bison Parser Algorithm: Algorithm, for further explanation of this. + + "Indirect" or "mutual" recursion occurs when the result of the rule +does not appear directly on its right hand side, but does appear in +rules for other nonterminals which do appear on its right hand side. + + For example: + + expr: primary + | primary '+' primary + ; + + primary: constant + | '(' expr ')' + ; + +defines two mutually-recursive nonterminals, since each refers to the +other. + + +File: bison.info, Node: Semantics, Next: Locations, Prev: Recursion, Up: Grammar File + +3.5 Defining Language Semantics +=============================== + +The grammar rules for a language determine only the syntax. The +semantics are determined by the semantic values associated with various +tokens and groupings, and by the actions taken when various groupings +are recognized. + + For example, the calculator calculates properly because the value +associated with each expression is the proper number; it adds properly +because the action for the grouping `X + Y' is to add the numbers +associated with X and Y. + +* Menu: + +* Value Type:: Specifying one data type for all semantic values. +* Multiple Types:: Specifying several alternative data types. +* Actions:: An action is the semantic definition of a grammar rule. +* Action Types:: Specifying data types for actions to operate on. +* Mid-Rule Actions:: Most actions go at the end of a rule. + This says when, why and how to use the exceptional + action in the middle of a rule. + + +File: bison.info, Node: Value Type, Next: Multiple Types, Up: Semantics + +3.5.1 Data Types of Semantic Values +----------------------------------- + +In a simple program it may be sufficient to use the same data type for +the semantic values of all language constructs. This was true in the +RPN and infix calculator examples (*note Reverse Polish Notation +Calculator: RPN Calc.). + + Bison's default is to use type `int' for all semantic values. To +specify some other type, define `YYSTYPE' as a macro, like this: + + #define YYSTYPE double + +This macro definition must go in the prologue of the grammar file +(*note Outline of a Bison Grammar: Grammar Outline.). + + +File: bison.info, Node: Multiple Types, Next: Actions, Prev: Value Type, Up: Semantics + +3.5.2 More Than One Value Type +------------------------------ + +In most programs, you will need different data types for different kinds +of tokens and groupings. For example, a numeric constant may need type +`int' or `long int', while a string constant needs type `char *', and +an identifier might need a pointer to an entry in the symbol table. + + To use more than one data type for semantic values in one parser, +Bison requires you to do two things: + + * Specify the entire collection of possible data types, with the + `%union' Bison declaration (*note The Collection of Value Types: + Union Decl.). + + * Choose one of those types for each symbol (terminal or + nonterminal) for which semantic values are used. This is done for + tokens with the `%token' Bison declaration (*note Token Type + Names: Token Decl.) and for groupings with the `%type' Bison + declaration (*note Nonterminal Symbols: Type Decl.). + + +File: bison.info, Node: Actions, Next: Action Types, Prev: Multiple Types, Up: Semantics + +3.5.3 Actions +------------- + +An action accompanies a syntactic rule and contains C code to be +executed each time an instance of that rule is recognized. The task of +most actions is to compute a semantic value for the grouping built by +the rule from the semantic values associated with tokens or smaller +groupings. + + An action consists of C statements surrounded by braces, much like a +compound statement in C. An action can contain any sequence of C +statements. Bison does not look for trigraphs, though, so if your C +code uses trigraphs you should ensure that they do not affect the +nesting of braces or the boundaries of comments, strings, or character +literals. + + An action can be placed at any position in the rule; it is executed +at that position. Most rules have just one action at the end of the +rule, following all the components. Actions in the middle of a rule +are tricky and used only for special purposes (*note Actions in +Mid-Rule: Mid-Rule Actions.). + + The C code in an action can refer to the semantic values of the +components matched by the rule with the construct `$N', which stands for +the value of the Nth component. The semantic value for the grouping +being constructed is `$$'. Bison translates both of these constructs +into expressions of the appropriate type when it copies the actions +into the parser file. `$$' is translated to a modifiable lvalue, so it +can be assigned to. + + Here is a typical example: + + exp: ... + | exp '+' exp + { $$ = $1 + $3; } + +This rule constructs an `exp' from two smaller `exp' groupings +connected by a plus-sign token. In the action, `$1' and `$3' refer to +the semantic values of the two component `exp' groupings, which are the +first and third symbols on the right hand side of the rule. The sum is +stored into `$$' so that it becomes the semantic value of the +addition-expression just recognized by the rule. If there were a +useful semantic value associated with the `+' token, it could be +referred to as `$2'. + + Note that the vertical-bar character `|' is really a rule separator, +and actions are attached to a single rule. This is a difference with +tools like Flex, for which `|' stands for either "or", or "the same +action as that of the next rule". In the following example, the action +is triggered only when `b' is found: + + a-or-b: 'a'|'b' { a_or_b_found = 1; }; + + If you don't specify an action for a rule, Bison supplies a default: +`$$ = $1'. Thus, the value of the first symbol in the rule becomes the +value of the whole rule. Of course, the default action is valid only +if the two data types match. There is no meaningful default action for +an empty rule; every empty rule must have an explicit action unless the +rule's value does not matter. + + `$N' with N zero or negative is allowed for reference to tokens and +groupings on the stack _before_ those that match the current rule. +This is a very risky practice, and to use it reliably you must be +certain of the context in which the rule is applied. Here is a case in +which you can use this reliably: + + foo: expr bar '+' expr { ... } + | expr bar '-' expr { ... } + ; + + bar: /* empty */ + { previous_expr = $0; } + ; + + As long as `bar' is used only in the fashion shown here, `$0' always +refers to the `expr' which precedes `bar' in the definition of `foo'. + + +File: bison.info, Node: Action Types, Next: Mid-Rule Actions, Prev: Actions, Up: Semantics + +3.5.4 Data Types of Values in Actions +------------------------------------- + +If you have chosen a single data type for semantic values, the `$$' and +`$N' constructs always have that data type. + + If you have used `%union' to specify a variety of data types, then +you must declare a choice among these types for each terminal or +nonterminal symbol that can have a semantic value. Then each time you +use `$$' or `$N', its data type is determined by which symbol it refers +to in the rule. In this example, + + exp: ... + | exp '+' exp + { $$ = $1 + $3; } + +`$1' and `$3' refer to instances of `exp', so they all have the data +type declared for the nonterminal symbol `exp'. If `$2' were used, it +would have the data type declared for the terminal symbol `'+'', +whatever that might be. + + Alternatively, you can specify the data type when you refer to the +value, by inserting `' after the `$' at the beginning of the +reference. For example, if you have defined types as shown here: + + %union { + int itype; + double dtype; + } + +then you can write `$1' to refer to the first subunit of the +rule as an integer, or `$1' to refer to it as a double. + + +File: bison.info, Node: Mid-Rule Actions, Prev: Action Types, Up: Semantics + +3.5.5 Actions in Mid-Rule +------------------------- + +Occasionally it is useful to put an action in the middle of a rule. +These actions are written just like usual end-of-rule actions, but they +are executed before the parser even recognizes the following components. + + A mid-rule action may refer to the components preceding it using +`$N', but it may not refer to subsequent components because it is run +before they are parsed. + + The mid-rule action itself counts as one of the components of the +rule. This makes a difference when there is another action later in +the same rule (and usually there is another at the end): you have to +count the actions along with the symbols when working out which number +N to use in `$N'. + + The mid-rule action can also have a semantic value. The action can +set its value with an assignment to `$$', and actions later in the rule +can refer to the value using `$N'. Since there is no symbol to name +the action, there is no way to declare a data type for the value in +advance, so you must use the `$<...>N' construct to specify a data type +each time you refer to this value. + + There is no way to set the value of the entire rule with a mid-rule +action, because assignments to `$$' do not have that effect. The only +way to set the value for the entire rule is with an ordinary action at +the end of the rule. + + Here is an example from a hypothetical compiler, handling a `let' +statement that looks like `let (VARIABLE) STATEMENT' and serves to +create a variable named VARIABLE temporarily for the duration of +STATEMENT. To parse this construct, we must put VARIABLE into the +symbol table while STATEMENT is parsed, then remove it afterward. Here +is how it is done: + + stmt: LET '(' var ')' + { $$ = push_context (); + declare_variable ($3); } + stmt { $$ = $6; + pop_context ($5); } + +As soon as `let (VARIABLE)' has been recognized, the first action is +run. It saves a copy of the current semantic context (the list of +accessible variables) as its semantic value, using alternative +`context' in the data-type union. Then it calls `declare_variable' to +add the new variable to that list. Once the first action is finished, +the embedded statement `stmt' can be parsed. Note that the mid-rule +action is component number 5, so the `stmt' is component number 6. + + After the embedded statement is parsed, its semantic value becomes +the value of the entire `let'-statement. Then the semantic value from +the earlier action is used to restore the prior list of variables. This +removes the temporary `let'-variable from the list so that it won't +appear to exist while the rest of the program is parsed. + + Taking action before a rule is completely recognized often leads to +conflicts since the parser must commit to a parse in order to execute +the action. For example, the following two rules, without mid-rule +actions, can coexist in a working parser because the parser can shift +the open-brace token and look at what follows before deciding whether +there is a declaration or not: + + compound: '{' declarations statements '}' + | '{' statements '}' + ; + +But when we add a mid-rule action as follows, the rules become +nonfunctional: + + compound: { prepare_for_local_variables (); } + '{' declarations statements '}' + | '{' statements '}' + ; + +Now the parser is forced to decide whether to run the mid-rule action +when it has read no farther than the open-brace. In other words, it +must commit to using one rule or the other, without sufficient +information to do it correctly. (The open-brace token is what is called +the "look-ahead" token at this time, since the parser is still deciding +what to do about it. *Note Look-Ahead Tokens: Look-Ahead.) + + You might think that you could correct the problem by putting +identical actions into the two rules, like this: + + compound: { prepare_for_local_variables (); } + '{' declarations statements '}' + | { prepare_for_local_variables (); } + '{' statements '}' + ; + +But this does not help, because Bison does not realize that the two +actions are identical. (Bison never tries to understand the C code in +an action.) + + If the grammar is such that a declaration can be distinguished from a +statement by the first token (which is true in C), then one solution +which does work is to put the action after the open-brace, like this: + + compound: '{' { prepare_for_local_variables (); } + declarations statements '}' + | '{' statements '}' + ; + +Now the first token of the following declaration or statement, which +would in any case tell Bison which rule to use, can still do so. + + Another solution is to bury the action inside a nonterminal symbol +which serves as a subroutine: + + subroutine: /* empty */ + { prepare_for_local_variables (); } + ; + + compound: subroutine + '{' declarations statements '}' + | subroutine + '{' statements '}' + ; + +Now Bison can execute the action in the rule for `subroutine' without +deciding which rule for `compound' it will eventually use. Note that +the action is now at the end of its rule. Any mid-rule action can be +converted to an end-of-rule action in this way, and this is what Bison +actually does to implement mid-rule actions. + + +File: bison.info, Node: Locations, Next: Declarations, Prev: Semantics, Up: Grammar File + +3.6 Tracking Locations +====================== + +Though grammar rules and semantic actions are enough to write a fully +functional parser, it can be useful to process some additional +information, especially symbol locations. + + The way locations are handled is defined by providing a data type, +and actions to take when rules are matched. + +* Menu: + +* Location Type:: Specifying a data type for locations. +* Actions and Locations:: Using locations in actions. +* Location Default Action:: Defining a general way to compute locations. + + +File: bison.info, Node: Location Type, Next: Actions and Locations, Up: Locations + +3.6.1 Data Type of Locations +---------------------------- + +Defining a data type for locations is much simpler than for semantic +values, since all tokens and groupings always use the same type. + + The type of locations is specified by defining a macro called +`YYLTYPE'. When `YYLTYPE' is not defined, Bison uses a default +structure type with four members: + + typedef struct YYLTYPE + { + int first_line; + int first_column; + int last_line; + int last_column; + } YYLTYPE; + + +File: bison.info, Node: Actions and Locations, Next: Location Default Action, Prev: Location Type, Up: Locations + +3.6.2 Actions and Locations +--------------------------- + +Actions are not only useful for defining language semantics, but also +for describing the behavior of the output parser with locations. + + The most obvious way for building locations of syntactic groupings +is very similar to the way semantic values are computed. In a given +rule, several constructs can be used to access the locations of the +elements being matched. The location of the Nth component of the right +hand side is `@N', while the location of the left hand side grouping is +`@$'. + + Here is a basic example using the default data type for locations: + + exp: ... + | exp '/' exp + { + @$.first_column = @1.first_column; + @$.first_line = @1.first_line; + @$.last_column = @3.last_column; + @$.last_line = @3.last_line; + if ($3) + $$ = $1 / $3; + else + { + $$ = 1; + fprintf (stderr, + "Division by zero, l%d,c%d-l%d,c%d", + @3.first_line, @3.first_column, + @3.last_line, @3.last_column); + } + } + + As for semantic values, there is a default action for locations that +is run each time a rule is matched. It sets the beginning of `@$' to +the beginning of the first symbol, and the end of `@$' to the end of the +last symbol. + + With this default action, the location tracking can be fully +automatic. The example above simply rewrites this way: + + exp: ... + | exp '/' exp + { + if ($3) + $$ = $1 / $3; + else + { + $$ = 1; + fprintf (stderr, + "Division by zero, l%d,c%d-l%d,c%d", + @3.first_line, @3.first_column, + @3.last_line, @3.last_column); + } + } + + +File: bison.info, Node: Location Default Action, Prev: Actions and Locations, Up: Locations + +3.6.3 Default Action for Locations +---------------------------------- + +Actually, actions are not the best place to compute locations. Since +locations are much more general than semantic values, there is room in +the output parser to redefine the default action to take for each rule. +The `YYLLOC_DEFAULT' macro is invoked each time a rule is matched, +before the associated action is run. It is also invoked while +processing a syntax error, to compute the error's location. + + Most of the time, this macro is general enough to suppress location +dedicated code from semantic actions. + + The `YYLLOC_DEFAULT' macro takes three parameters. The first one is +the location of the grouping (the result of the computation). When a +rule is matched, the second parameter is an array holding locations of +all right hand side elements of the rule being matched, and the third +parameter is the size of the rule's right hand side. When processing a +syntax error, the second parameter is an array holding locations of the +symbols that were discarded during error processing, and the third +parameter is the number of discarded symbols. + + By default, `YYLLOC_DEFAULT' is defined this way for simple LALR(1) +parsers: + + # define YYLLOC_DEFAULT(Current, Rhs, N) \ + ((Current).first_line = (Rhs)[1].first_line, \ + (Current).first_column = (Rhs)[1].first_column, \ + (Current).last_line = (Rhs)[N].last_line, \ + (Current).last_column = (Rhs)[N].last_column) + +and like this for GLR parsers: + + # define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN) \ + ((yyCurrent).first_line = YYRHSLOC(yyRhs, 1).first_line, \ + (yyCurrent).first_column = YYRHSLOC(yyRhs, 1).first_column, \ + (yyCurrent).last_line = YYRHSLOC(yyRhs, YYN).last_line, \ + (yyCurrent).last_column = YYRHSLOC(yyRhs, YYN).last_column) + + When defining `YYLLOC_DEFAULT', you should consider that: + + * All arguments are free of side-effects. However, only the first + one (the result) should be modified by `YYLLOC_DEFAULT'. + + * For consistency with semantic actions, valid indexes for the + location array range from 1 to N. + + * Your macro should parenthesize its arguments, if need be, since the + actual arguments may not be surrounded by parentheses. Also, your + macro should expand to something that can be used as a single + statement when it is followed by a semicolon. + + +File: bison.info, Node: Declarations, Next: Multiple Parsers, Prev: Locations, Up: Grammar File + +3.7 Bison Declarations +====================== + +The "Bison declarations" section of a Bison grammar defines the symbols +used in formulating the grammar and the data types of semantic values. +*Note Symbols::. + + All token type names (but not single-character literal tokens such as +`'+'' and `'*'') must be declared. Nonterminal symbols must be +declared if you need to specify which data type to use for the semantic +value (*note More Than One Value Type: Multiple Types.). + + The first rule in the file also specifies the start symbol, by +default. If you want some other symbol to be the start symbol, you +must declare it explicitly (*note Languages and Context-Free Grammars: +Language and Grammar.). + +* Menu: + +* Token Decl:: Declaring terminal symbols. +* Precedence Decl:: Declaring terminals with precedence and associativity. +* Union Decl:: Declaring the set of all semantic value types. +* Type Decl:: Declaring the choice of type for a nonterminal symbol. +* Destructor Decl:: Declaring how symbols are freed. +* Expect Decl:: Suppressing warnings about parsing conflicts. +* Start Decl:: Specifying the start symbol. +* Pure Decl:: Requesting a reentrant parser. +* Decl Summary:: Table of all Bison declarations. + + +File: bison.info, Node: Token Decl, Next: Precedence Decl, Up: Declarations + +3.7.1 Token Type Names +---------------------- + +The basic way to declare a token type name (terminal symbol) is as +follows: + + %token NAME + + Bison will convert this into a `#define' directive in the parser, so +that the function `yylex' (if it is in this file) can use the name NAME +to stand for this token type's code. + + Alternatively, you can use `%left', `%right', or `%nonassoc' instead +of `%token', if you wish to specify associativity and precedence. +*Note Operator Precedence: Precedence Decl. + + You can explicitly specify the numeric code for a token type by +appending a decimal or hexadecimal integer value in the field +immediately following the token name: + + %token NUM 300 + %token XNUM 0x12d // a GNU extension + +It is generally best, however, to let Bison choose the numeric codes for +all token types. Bison will automatically select codes that don't +conflict with each other or with normal characters. + + In the event that the stack type is a union, you must augment the +`%token' or other token declaration to include the data type +alternative delimited by angle-brackets (*note More Than One Value +Type: Multiple Types.). + + For example: + + %union { /* define stack type */ + double val; + symrec *tptr; + } + %token NUM /* define token NUM and its type */ + + You can associate a literal string token with a token type name by +writing the literal string at the end of a `%token' declaration which +declares the name. For example: + + %token arrow "=>" + +For example, a grammar for the C language might specify these names with +equivalent literal string tokens: + + %token OR "||" + %token LE 134 "<=" + %left OR "<=" + +Once you equate the literal string and the token name, you can use them +interchangeably in further declarations or the grammar rules. The +`yylex' function can use the token name or the literal string to obtain +the token type code number (*note Calling Convention::). + + +File: bison.info, Node: Precedence Decl, Next: Union Decl, Prev: Token Decl, Up: Declarations + +3.7.2 Operator Precedence +------------------------- + +Use the `%left', `%right' or `%nonassoc' declaration to declare a token +and specify its precedence and associativity, all at once. These are +called "precedence declarations". *Note Operator Precedence: +Precedence, for general information on operator precedence. + + The syntax of a precedence declaration is the same as that of +`%token': either + + %left SYMBOLS... + +or + + %left SYMBOLS... + + And indeed any of these declarations serves the purposes of `%token'. +But in addition, they specify the associativity and relative precedence +for all the SYMBOLS: + + * The associativity of an operator OP determines how repeated uses + of the operator nest: whether `X OP Y OP Z' is parsed by grouping + X with Y first or by grouping Y with Z first. `%left' specifies + left-associativity (grouping X with Y first) and `%right' + specifies right-associativity (grouping Y with Z first). + `%nonassoc' specifies no associativity, which means that `X OP Y + OP Z' is considered a syntax error. + + * The precedence of an operator determines how it nests with other + operators. All the tokens declared in a single precedence + declaration have equal precedence and nest together according to + their associativity. When two tokens declared in different + precedence declarations associate, the one declared later has the + higher precedence and is grouped first. + + +File: bison.info, Node: Union Decl, Next: Type Decl, Prev: Precedence Decl, Up: Declarations + +3.7.3 The Collection of Value Types +----------------------------------- + +The `%union' declaration specifies the entire collection of possible +data types for semantic values. The keyword `%union' is followed by a +pair of braces containing the same thing that goes inside a `union' in +C. + + For example: + + %union { + double val; + symrec *tptr; + } + +This says that the two alternative types are `double' and `symrec *'. +They are given names `val' and `tptr'; these names are used in the +`%token' and `%type' declarations to pick one of the types for a +terminal or nonterminal symbol (*note Nonterminal Symbols: Type Decl.). + + As an extension to POSIX, a tag is allowed after the `union'. For +example: + + %union value { + double val; + symrec *tptr; + } + + specifies the union tag `value', so the corresponding C type is +`union value'. If you do not specify a tag, it defaults to `YYSTYPE'. + + Note that, unlike making a `union' declaration in C, you need not +write a semicolon after the closing brace. + + +File: bison.info, Node: Type Decl, Next: Destructor Decl, Prev: Union Decl, Up: Declarations + +3.7.4 Nonterminal Symbols +------------------------- + +When you use `%union' to specify multiple value types, you must declare +the value type of each nonterminal symbol for which values are used. +This is done with a `%type' declaration, like this: + + %type NONTERMINAL... + +Here NONTERMINAL is the name of a nonterminal symbol, and TYPE is the +name given in the `%union' to the alternative that you want (*note The +Collection of Value Types: Union Decl.). You can give any number of +nonterminal symbols in the same `%type' declaration, if they have the +same value type. Use spaces to separate the symbol names. + + You can also declare the value type of a terminal symbol. To do +this, use the same `' construction in a declaration for the +terminal symbol. All kinds of token declarations allow `'. + + +File: bison.info, Node: Destructor Decl, Next: Expect Decl, Prev: Type Decl, Up: Declarations + +3.7.5 Freeing Discarded Symbols +------------------------------- + +Some symbols can be discarded by the parser, typically during error +recovery (*note Error Recovery::). Basically, during error recovery, +embarrassing symbols already pushed on the stack, and embarrassing +tokens coming from the rest of the file are thrown away until the parser +falls on its feet. If these symbols convey heap based information, this +memory is lost. While this behavior is tolerable for batch parsers, +such as in compilers, it is unacceptable for parsers that can +possibility "never end" such as shells, or implementations of +communication protocols. + + The `%destructor' directive allows for the definition of code that +is called when a symbol is thrown away. + + -- Directive: %destructor { CODE } SYMBOLS + Declare that the CODE must be invoked for each of the SYMBOLS that + will be discarded by the parser. The CODE should use `$$' to + designate the semantic value associated to the SYMBOLS. The + additional parser parameters are also available (*note The Parser + Function `yyparse': Parser Function.). + + *Warning:* as of Bison 1.875, this feature is still considered as + experimental, as there was not enough user feedback. In + particular, the syntax might still change. + + For instance: + + %union + { + char *string; + } + %token STRING + %type string + %destructor { free ($$); } STRING string + +guarantees that when a `STRING' or a `string' will be discarded, its +associated memory will be freed. + + Note that in the future, Bison might also consider that right hand +side members that are not mentioned in the action can be destroyed. For +instance, in: + + comment: "/*" STRING "*/"; + +the parser is entitled to destroy the semantic value of the `string'. +Of course, this will not apply to the default action; compare: + + typeless: string; // $$ = $1 does not apply; $1 is destroyed. + typefull: string; // $$ = $1 applies, $1 is not destroyed. + + +File: bison.info, Node: Expect Decl, Next: Start Decl, Prev: Destructor Decl, Up: Declarations + +3.7.6 Suppressing Conflict Warnings +----------------------------------- + +Bison normally warns if there are any conflicts in the grammar (*note +Shift/Reduce Conflicts: Shift/Reduce.), but most real grammars have +harmless shift/reduce conflicts which are resolved in a predictable way +and would be difficult to eliminate. It is desirable to suppress the +warning about these conflicts unless the number of conflicts changes. +You can do this with the `%expect' declaration. + + The declaration looks like this: + + %expect N + + Here N is a decimal integer. The declaration says there should be +no warning if there are N shift/reduce conflicts and no reduce/reduce +conflicts. The usual warning is given if there are either more or +fewer conflicts, or if there are any reduce/reduce conflicts. + + For normal LALR(1) parsers, reduce/reduce conflicts are more serious, +and should be eliminated entirely. Bison will always report +reduce/reduce conflicts for these parsers. With GLR parsers, however, +both shift/reduce and reduce/reduce are routine (otherwise, there would +be no need to use GLR parsing). Therefore, it is also possible to +specify an expected number of reduce/reduce conflicts in GLR parsers, +using the declaration: + + %expect-rr N + + In general, using `%expect' involves these steps: + + * Compile your grammar without `%expect'. Use the `-v' option to + get a verbose list of where the conflicts occur. Bison will also + print the number of conflicts. + + * Check each of the conflicts to make sure that Bison's default + resolution is what you really want. If not, rewrite the grammar + and go back to the beginning. + + * Add an `%expect' declaration, copying the number N from the number + which Bison printed. + + Now Bison will stop annoying you if you do not change the number of +conflicts, but it will warn you again if changes in the grammar result +in more or fewer conflicts. + + +File: bison.info, Node: Start Decl, Next: Pure Decl, Prev: Expect Decl, Up: Declarations + +3.7.7 The Start-Symbol +---------------------- + +Bison assumes by default that the start symbol for the grammar is the +first nonterminal specified in the grammar specification section. The +programmer may override this restriction with the `%start' declaration +as follows: + + %start SYMBOL + + +File: bison.info, Node: Pure Decl, Next: Decl Summary, Prev: Start Decl, Up: Declarations + +3.7.8 A Pure (Reentrant) Parser +------------------------------- + +A "reentrant" program is one which does not alter in the course of +execution; in other words, it consists entirely of "pure" (read-only) +code. Reentrancy is important whenever asynchronous execution is +possible; for example, a non-reentrant program may not be safe to call +from a signal handler. In systems with multiple threads of control, a +non-reentrant program must be called only within interlocks. + + Normally, Bison generates a parser which is not reentrant. This is +suitable for most uses, and it permits compatibility with Yacc. (The +standard Yacc interfaces are inherently nonreentrant, because they use +statically allocated variables for communication with `yylex', +including `yylval' and `yylloc'.) + + Alternatively, you can generate a pure, reentrant parser. The Bison +declaration `%pure-parser' says that you want the parser to be +reentrant. It looks like this: + + %pure-parser + + The result is that the communication variables `yylval' and `yylloc' +become local variables in `yyparse', and a different calling convention +is used for the lexical analyzer function `yylex'. *Note Calling +Conventions for Pure Parsers: Pure Calling, for the details of this. +The variable `yynerrs' also becomes local in `yyparse' (*note The Error +Reporting Function `yyerror': Error Reporting.). The convention for +calling `yyparse' itself is unchanged. + + Whether the parser is pure has nothing to do with the grammar rules. +You can generate either a pure parser or a nonreentrant parser from any +valid grammar. + + +File: bison.info, Node: Decl Summary, Prev: Pure Decl, Up: Declarations + +3.7.9 Bison Declaration Summary +------------------------------- + +Here is a summary of the declarations used to define a grammar: + + -- Directive: %union + Declare the collection of data types that semantic values may have + (*note The Collection of Value Types: Union Decl.). + + -- Directive: %token + Declare a terminal symbol (token type name) with no precedence or + associativity specified (*note Token Type Names: Token Decl.). + + -- Directive: %right + Declare a terminal symbol (token type name) that is + right-associative (*note Operator Precedence: Precedence Decl.). + + -- Directive: %left + Declare a terminal symbol (token type name) that is + left-associative (*note Operator Precedence: Precedence Decl.). + + -- Directive: %nonassoc + Declare a terminal symbol (token type name) that is nonassociative + (*note Operator Precedence: Precedence Decl.). Using it in a way + that would be associative is a syntax error. + + -- Directive: %type + Declare the type of semantic values for a nonterminal symbol + (*note Nonterminal Symbols: Type Decl.). + + -- Directive: %start + Specify the grammar's start symbol (*note The Start-Symbol: Start + Decl.). + + -- Directive: %expect + Declare the expected number of shift-reduce conflicts (*note + Suppressing Conflict Warnings: Expect Decl.). + + +In order to change the behavior of `bison', use the following +directives: + + -- Directive: %debug + In the parser file, define the macro `YYDEBUG' to 1 if it is not + already defined, so that the debugging facilities are compiled. + *Note Tracing Your Parser: Tracing. + + -- Directive: %defines + Write an extra output file containing macro definitions for the + token type names defined in the grammar and the semantic value type + `YYSTYPE', as well as a few `extern' variable declarations. + + If the parser output file is named `NAME.c' then this file is + named `NAME.h'. + + This output file is essential if you wish to put the definition of + `yylex' in a separate source file, because `yylex' needs to be + able to refer to token type codes and the variable `yylval'. + *Note Semantic Values of Tokens: Token Values. + + -- Directive: %destructor + Specifying how the parser should reclaim the memory associated to + discarded symbols. *Note Freeing Discarded Symbols: Destructor + Decl. + + -- Directive: %file-prefix="PREFIX" + Specify a prefix to use for all Bison output file names. The + names are chosen as if the input file were named `PREFIX.y'. + + -- Directive: %locations + Generate the code processing the locations (*note Special Features + for Use in Actions: Action Features.). This mode is enabled as + soon as the grammar uses the special `@N' tokens, but if your + grammar does not use it, using `%locations' allows for more + accurate syntax error messages. + + -- Directive: %name-prefix="PREFIX" + Rename the external symbols used in the parser so that they start + with PREFIX instead of `yy'. The precise list of symbols renamed + is `yyparse', `yylex', `yyerror', `yynerrs', `yylval', `yylloc', + `yychar', `yydebug', and possible `yylloc'. For example, if you + use `%name-prefix="c_"', the names become `c_parse', `c_lex', and + so on. *Note Multiple Parsers in the Same Program: Multiple + Parsers. + + -- Directive: %no-parser + Do not include any C code in the parser file; generate tables + only. The parser file contains just `#define' directives and + static variable declarations. + + This option also tells Bison to write the C code for the grammar + actions into a file named `FILENAME.act', in the form of a + brace-surrounded body fit for a `switch' statement. + + -- Directive: %no-lines + Don't generate any `#line' preprocessor commands in the parser + file. Ordinarily Bison writes these commands in the parser file + so that the C compiler and debuggers will associate errors and + object code with your source file (the grammar file). This + directive causes them to associate errors with the parser file, + treating it an independent source file in its own right. + + -- Directive: %output="FILENAME" + Specify the FILENAME for the parser file. + + -- Directive: %pure-parser + Request a pure (reentrant) parser program (*note A Pure + (Reentrant) Parser: Pure Decl.). + + -- Directive: %token-table + Generate an array of token names in the parser file. The name of + the array is `yytname'; `yytname[I]' is the name of the token + whose internal Bison token code number is I. The first three + elements of `yytname' correspond to the predefined tokens `"$end"', + `"error"', and `"$undefined"'; after these come the symbols + defined in the grammar file. + + For single-character literal tokens and literal string tokens, the + name in the table includes the single-quote or double-quote + characters: for example, `"'+'"' is a single-character literal and + `"\"<=\""' is a literal string token. All the characters of the + literal string token appear verbatim in the string found in the + table; even double-quote characters are not escaped. For example, + if the token consists of three characters `*"*', its string in + `yytname' contains `"*"*"'. (In C, that would be written as + `"\"*\"*\""'). + + When you specify `%token-table', Bison also generates macro + definitions for macros `YYNTOKENS', `YYNNTS', and `YYNRULES', and + `YYNSTATES': + + `YYNTOKENS' + The highest token number, plus one. + + `YYNNTS' + The number of nonterminal symbols. + + `YYNRULES' + The number of grammar rules, + + `YYNSTATES' + The number of parser states (*note Parser States::). + + -- Directive: %verbose + Write an extra output file containing verbose descriptions of the + parser states and what is done for each type of look-ahead token in + that state. *Note Understanding Your Parser: Understanding, for + more information. + + -- Directive: %yacc + Pretend the option `--yacc' was given, i.e., imitate Yacc, + including its naming conventions. *Note Bison Options::, for more. + + +File: bison.info, Node: Multiple Parsers, Prev: Declarations, Up: Grammar File + +3.8 Multiple Parsers in the Same Program +======================================== + +Most programs that use Bison parse only one language and therefore +contain only one Bison parser. But what if you want to parse more than +one language with the same program? Then you need to avoid a name +conflict between different definitions of `yyparse', `yylval', and so +on. + + The easy way to do this is to use the option `-p PREFIX' (*note +Invoking Bison: Invocation.). This renames the interface functions and +variables of the Bison parser to start with PREFIX instead of `yy'. +You can use this to give each parser distinct names that do not +conflict. + + The precise list of symbols renamed is `yyparse', `yylex', +`yyerror', `yynerrs', `yylval', `yylloc', `yychar' and `yydebug'. For +example, if you use `-p c', the names become `cparse', `clex', and so +on. + + *All the other variables and macros associated with Bison are not +renamed.* These others are not global; there is no conflict if the same +name is used in different parsers. For example, `YYSTYPE' is not +renamed, but defining this in different ways in different parsers causes +no trouble (*note Data Types of Semantic Values: Value Type.). + + The `-p' option works by adding macro definitions to the beginning +of the parser source file, defining `yyparse' as `PREFIXparse', and so +on. This effectively substitutes one name for the other in the entire +parser file. + + +File: bison.info, Node: Interface, Next: Algorithm, Prev: Grammar File, Up: Top + +4 Parser C-Language Interface +***************************** + +The Bison parser is actually a C function named `yyparse'. Here we +describe the interface conventions of `yyparse' and the other functions +that it needs to use. + + Keep in mind that the parser uses many C identifiers starting with +`yy' and `YY' for internal purposes. If you use such an identifier +(aside from those in this manual) in an action or in epilogue in the +grammar file, you are likely to run into trouble. + +* Menu: + +* Parser Function:: How to call `yyparse' and what it returns. +* Lexical:: You must supply a function `yylex' + which reads tokens. +* Error Reporting:: You must supply a function `yyerror'. +* Action Features:: Special features for use in actions. + + +File: bison.info, Node: Parser Function, Next: Lexical, Up: Interface + +4.1 The Parser Function `yyparse' +================================= + +You call the function `yyparse' to cause parsing to occur. This +function reads tokens, executes actions, and ultimately returns when it +encounters end-of-input or an unrecoverable syntax error. You can also +write an action which directs `yyparse' to return immediately without +reading further. + + -- Function: int yyparse (void) + The value returned by `yyparse' is 0 if parsing was successful + (return is due to end-of-input). + + The value is 1 if parsing failed (return is due to a syntax error). + + In an action, you can cause immediate return from `yyparse' by using +these macros: + + -- Macro: YYACCEPT + Return immediately with value 0 (to report success). + + -- Macro: YYABORT + Return immediately with value 1 (to report failure). + + If you use a reentrant parser, you can optionally pass additional +parameter information to it in a reentrant way. To do so, use the +declaration `%parse-param': + + -- Directive: %parse-param {ARGUMENT-DECLARATION} + Declare that an argument declared by `argument-declaration' is an + additional `yyparse' argument. The ARGUMENT-DECLARATION is used + when declaring functions or prototypes. The last identifier in + ARGUMENT-DECLARATION must be the argument name. + + Here's an example. Write this in the parser: + + %parse-param {int *nastiness} + %parse-param {int *randomness} + +Then call the parser like this: + + { + int nastiness, randomness; + ... /* Store proper data in `nastiness' and `randomness'. */ + value = yyparse (&nastiness, &randomness); + ... + } + +In the grammar actions, use expressions like this to refer to the data: + + exp: ... { ...; *randomness += 1; ... } + + +File: bison.info, Node: Lexical, Next: Error Reporting, Prev: Parser Function, Up: Interface + +4.2 The Lexical Analyzer Function `yylex' +========================================= + +The "lexical analyzer" function, `yylex', recognizes tokens from the +input stream and returns them to the parser. Bison does not create +this function automatically; you must write it so that `yyparse' can +call it. The function is sometimes referred to as a lexical scanner. + + In simple programs, `yylex' is often defined at the end of the Bison +grammar file. If `yylex' is defined in a separate source file, you +need to arrange for the token-type macro definitions to be available +there. To do this, use the `-d' option when you run Bison, so that it +will write these macro definitions into a separate header file +`NAME.tab.h' which you can include in the other source files that need +it. *Note Invoking Bison: Invocation. + +* Menu: + +* Calling Convention:: How `yyparse' calls `yylex'. +* Token Values:: How `yylex' must return the semantic value + of the token it has read. +* Token Locations:: How `yylex' must return the text location + (line number, etc.) of the token, if the + actions want that. +* Pure Calling:: How the calling convention differs + in a pure parser (*note A Pure (Reentrant) Parser: Pure Decl.). + + +File: bison.info, Node: Calling Convention, Next: Token Values, Up: Lexical + +4.2.1 Calling Convention for `yylex' +------------------------------------ + +The value that `yylex' returns must be the positive numeric code for +the type of token it has just found; a zero or negative value signifies +end-of-input. + + When a token is referred to in the grammar rules by a name, that name +in the parser file becomes a C macro whose definition is the proper +numeric code for that token type. So `yylex' can use the name to +indicate that type. *Note Symbols::. + + When a token is referred to in the grammar rules by a character +literal, the numeric code for that character is also the code for the +token type. So `yylex' can simply return that character code, possibly +converted to `unsigned char' to avoid sign-extension. The null +character must not be used this way, because its code is zero and that +signifies end-of-input. + + Here is an example showing these things: + + int + yylex (void) + { + ... + if (c == EOF) /* Detect end-of-input. */ + return 0; + ... + if (c == '+' || c == '-') + return c; /* Assume token type for `+' is '+'. */ + ... + return INT; /* Return the type of the token. */ + ... + } + +This interface has been designed so that the output from the `lex' +utility can be used without change as the definition of `yylex'. + + If the grammar uses literal string tokens, there are two ways that +`yylex' can determine the token type codes for them: + + * If the grammar defines symbolic token names as aliases for the + literal string tokens, `yylex' can use these symbolic names like + all others. In this case, the use of the literal string tokens in + the grammar file has no effect on `yylex'. + + * `yylex' can find the multicharacter token in the `yytname' table. + The index of the token in the table is the token type's code. The + name of a multicharacter token is recorded in `yytname' with a + double-quote, the token's characters, and another double-quote. + The token's characters are not escaped in any way; they appear + verbatim in the contents of the string in the table. + + Here's code for looking up a token in `yytname', assuming that the + characters of the token are stored in `token_buffer'. + + for (i = 0; i < YYNTOKENS; i++) + { + if (yytname[i] != 0 + && yytname[i][0] == '"' + && ! strncmp (yytname[i] + 1, token_buffer, + strlen (token_buffer)) + && yytname[i][strlen (token_buffer) + 1] == '"' + && yytname[i][strlen (token_buffer) + 2] == 0) + break; + } + + The `yytname' table is generated only if you use the + `%token-table' declaration. *Note Decl Summary::. + + +File: bison.info, Node: Token Values, Next: Token Locations, Prev: Calling Convention, Up: Lexical + +4.2.2 Semantic Values of Tokens +------------------------------- + +In an ordinary (non-reentrant) parser, the semantic value of the token +must be stored into the global variable `yylval'. When you are using +just one data type for semantic values, `yylval' has that type. Thus, +if the type is `int' (the default), you might write this in `yylex': + + ... + yylval = value; /* Put value onto Bison stack. */ + return INT; /* Return the type of the token. */ + ... + + When you are using multiple data types, `yylval''s type is a union +made from the `%union' declaration (*note The Collection of Value +Types: Union Decl.). So when you store a token's value, you must use +the proper member of the union. If the `%union' declaration looks like +this: + + %union { + int intval; + double val; + symrec *tptr; + } + +then the code in `yylex' might look like this: + + ... + yylval.intval = value; /* Put value onto Bison stack. */ + return INT; /* Return the type of the token. */ + ... + + +File: bison.info, Node: Token Locations, Next: Pure Calling, Prev: Token Values, Up: Lexical + +4.2.3 Textual Locations of Tokens +--------------------------------- + +If you are using the `@N'-feature (*note Tracking Locations: +Locations.) in actions to keep track of the textual locations of tokens +and groupings, then you must provide this information in `yylex'. The +function `yyparse' expects to find the textual location of a token just +parsed in the global variable `yylloc'. So `yylex' must store the +proper data in that variable. + + By default, the value of `yylloc' is a structure and you need only +initialize the members that are going to be used by the actions. The +four members are called `first_line', `first_column', `last_line' and +`last_column'. Note that the use of this feature makes the parser +noticeably slower. + + The data type of `yylloc' has the name `YYLTYPE'. + + +File: bison.info, Node: Pure Calling, Prev: Token Locations, Up: Lexical + +4.2.4 Calling Conventions for Pure Parsers +------------------------------------------ + +When you use the Bison declaration `%pure-parser' to request a pure, +reentrant parser, the global communication variables `yylval' and +`yylloc' cannot be used. (*Note A Pure (Reentrant) Parser: Pure Decl.) +In such parsers the two global variables are replaced by pointers +passed as arguments to `yylex'. You must declare them as shown here, +and pass the information back by storing it through those pointers. + + int + yylex (YYSTYPE *lvalp, YYLTYPE *llocp) + { + ... + *lvalp = value; /* Put value onto Bison stack. */ + return INT; /* Return the type of the token. */ + ... + } + + If the grammar file does not use the `@' constructs to refer to +textual locations, then the type `YYLTYPE' will not be defined. In +this case, omit the second argument; `yylex' will be called with only +one argument. + + If you wish to pass the additional parameter data to `yylex', use +`%lex-param' just like `%parse-param' (*note Parser Function::). + + -- Directive: lex-param {ARGUMENT-DECLARATION} + Declare that `argument-declaration' is an additional `yylex' + argument declaration. + + For instance: + + %parse-param {int *nastiness} + %lex-param {int *nastiness} + %parse-param {int *randomness} + +results in the following signature: + + int yylex (int *nastiness); + int yyparse (int *nastiness, int *randomness); + + If `%pure-parser' is added: + + int yylex (YYSTYPE *lvalp, int *nastiness); + int yyparse (int *nastiness, int *randomness); + +and finally, if both `%pure-parser' and `%locations' are used: + + int yylex (YYSTYPE *lvalp, YYLTYPE *llocp, int *nastiness); + int yyparse (int *nastiness, int *randomness); + + +File: bison.info, Node: Error Reporting, Next: Action Features, Prev: Lexical, Up: Interface + +4.3 The Error Reporting Function `yyerror' +========================================== + +The Bison parser detects a "syntax error" or "parse error" whenever it +reads a token which cannot satisfy any syntax rule. An action in the +grammar can also explicitly proclaim an error, using the macro +`YYERROR' (*note Special Features for Use in Actions: Action Features.). + + The Bison parser expects to report the error by calling an error +reporting function named `yyerror', which you must supply. It is +called by `yyparse' whenever a syntax error is found, and it receives +one argument. For a syntax error, the string is normally +`"syntax error"'. + + If you invoke the directive `%error-verbose' in the Bison +declarations section (*note The Bison Declarations Section: Bison +Declarations.), then Bison provides a more verbose and specific error +message string instead of just plain `"syntax error"'. + + The parser can detect one other kind of error: stack overflow. This +happens when the input contains constructions that are very deeply +nested. It isn't likely you will encounter this, since the Bison +parser extends its stack automatically up to a very large limit. But +if overflow happens, `yyparse' calls `yyerror' in the usual fashion, +except that the argument string is `"parser stack overflow"'. + + The following definition suffices in simple programs: + + void + yyerror (char const *s) + { + fprintf (stderr, "%s\n", s); + } + + After `yyerror' returns to `yyparse', the latter will attempt error +recovery if you have written suitable error recovery grammar rules +(*note Error Recovery::). If recovery is impossible, `yyparse' will +immediately return 1. + + Obviously, in location tracking pure parsers, `yyerror' should have +an access to the current location. This is indeed the case for the GLR +parsers, but not for the Yacc parser, for historical reasons. I.e., if +`%locations %pure-parser' is passed then the prototypes for `yyerror' +are: + + void yyerror (char const *msg); /* Yacc parsers. */ + void yyerror (YYLTYPE *locp, char const *msg); /* GLR parsers. */ + + If `%parse-param {int *nastiness}' is used, then: + + void yyerror (int *nastiness, char const *msg); /* Yacc parsers. */ + void yyerror (int *nastiness, char const *msg); /* GLR parsers. */ + + Finally, GLR and Yacc parsers share the same `yyerror' calling +convention for absolutely pure parsers, i.e., when the calling +convention of `yylex' _and_ the calling convention of `%pure-parser' +are pure. I.e.: + + /* Location tracking. */ + %locations + /* Pure yylex. */ + %pure-parser + %lex-param {int *nastiness} + /* Pure yyparse. */ + %parse-param {int *nastiness} + %parse-param {int *randomness} + +results in the following signatures for all the parser kinds: + + int yylex (YYSTYPE *lvalp, YYLTYPE *llocp, int *nastiness); + int yyparse (int *nastiness, int *randomness); + void yyerror (YYLTYPE *locp, + int *nastiness, int *randomness, + char const *msg); + +The prototypes are only indications of how the code produced by Bison +uses `yyerror'. Bison-generated code always ignores the returned +value, so `yyerror' can return any type, including `void'. Also, +`yyerror' can be a variadic function; that is why the message is always +passed last. + + Traditionally `yyerror' returns an `int' that is always ignored, but +this is purely for historical reasons, and `void' is preferable since +it more accurately describes the return type for `yyerror'. + + The variable `yynerrs' contains the number of syntax errors +encountered so far. Normally this variable is global; but if you +request a pure parser (*note A Pure (Reentrant) Parser: Pure Decl.) +then it is a local variable which only the actions can access. + + +File: bison.info, Node: Action Features, Prev: Error Reporting, Up: Interface + +4.4 Special Features for Use in Actions +======================================= + +Here is a table of Bison constructs, variables and macros that are +useful in actions. + + -- Variable: $$ + Acts like a variable that contains the semantic value for the + grouping made by the current rule. *Note Actions::. + + -- Variable: $N + Acts like a variable that contains the semantic value for the Nth + component of the current rule. *Note Actions::. + + -- Variable: $$ + Like `$$' but specifies alternative TYPEALT in the union specified + by the `%union' declaration. *Note Data Types of Values in + Actions: Action Types. + + -- Variable: $N + Like `$N' but specifies alternative TYPEALT in the union specified + by the `%union' declaration. *Note Data Types of Values in + Actions: Action Types. + + -- Macro: YYABORT; + Return immediately from `yyparse', indicating failure. *Note The + Parser Function `yyparse': Parser Function. + + -- Macro: YYACCEPT; + Return immediately from `yyparse', indicating success. *Note The + Parser Function `yyparse': Parser Function. + + -- Macro: YYBACKUP (TOKEN, VALUE); + Unshift a token. This macro is allowed only for rules that reduce + a single value, and only when there is no look-ahead token. It is + also disallowed in GLR parsers. It installs a look-ahead token + with token type TOKEN and semantic value VALUE; then it discards + the value that was going to be reduced by this rule. + + If the macro is used when it is not valid, such as when there is a + look-ahead token already, then it reports a syntax error with a + message `cannot back up' and performs ordinary error recovery. + + In either case, the rest of the action is not executed. + + -- Macro: YYEMPTY + Value stored in `yychar' when there is no look-ahead token. + + -- Macro: YYERROR; + Cause an immediate syntax error. This statement initiates error + recovery just as if the parser itself had detected an error; + however, it does not call `yyerror', and does not print any + message. If you want to print an error message, call `yyerror' + explicitly before the `YYERROR;' statement. *Note Error + Recovery::. + + -- Macro: YYRECOVERING + This macro stands for an expression that has the value 1 when the + parser is recovering from a syntax error, and 0 the rest of the + time. *Note Error Recovery::. + + -- Variable: yychar + Variable containing the current look-ahead token. (In a pure + parser, this is actually a local variable within `yyparse'.) When + there is no look-ahead token, the value `YYEMPTY' is stored in the + variable. *Note Look-Ahead Tokens: Look-Ahead. + + -- Macro: yyclearin; + Discard the current look-ahead token. This is useful primarily in + error rules. *Note Error Recovery::. + + -- Macro: yyerrok; + Resume generating error messages immediately for subsequent syntax + errors. This is useful primarily in error rules. *Note Error + Recovery::. + + -- Value: @$ + Acts like a structure variable containing information on the + textual location of the grouping made by the current rule. *Note + Tracking Locations: Locations. + + + -- Value: @N + Acts like a structure variable containing information on the + textual location of the Nth component of the current rule. *Note + Tracking Locations: Locations. + + +File: bison.info, Node: Algorithm, Next: Error Recovery, Prev: Interface, Up: Top + +5 The Bison Parser Algorithm +**************************** + +As Bison reads tokens, it pushes them onto a stack along with their +semantic values. The stack is called the "parser stack". Pushing a +token is traditionally called "shifting". + + For example, suppose the infix calculator has read `1 + 5 *', with a +`3' to come. The stack will have four elements, one for each token +that was shifted. + + But the stack does not always have an element for each token read. +When the last N tokens and groupings shifted match the components of a +grammar rule, they can be combined according to that rule. This is +called "reduction". Those tokens and groupings are replaced on the +stack by a single grouping whose symbol is the result (left hand side) +of that rule. Running the rule's action is part of the process of +reduction, because this is what computes the semantic value of the +resulting grouping. + + For example, if the infix calculator's parser stack contains this: + + 1 + 5 * 3 + +and the next input token is a newline character, then the last three +elements can be reduced to 15 via the rule: + + expr: expr '*' expr; + +Then the stack contains just these three elements: + + 1 + 15 + +At this point, another reduction can be made, resulting in the single +value 16. Then the newline token can be shifted. + + The parser tries, by shifts and reductions, to reduce the entire +input down to a single grouping whose symbol is the grammar's +start-symbol (*note Languages and Context-Free Grammars: Language and +Grammar.). + + This kind of parser is known in the literature as a bottom-up parser. + +* Menu: + +* Look-Ahead:: Parser looks one token ahead when deciding what to do. +* Shift/Reduce:: Conflicts: when either shifting or reduction is valid. +* Precedence:: Operator precedence works by resolving conflicts. +* Contextual Precedence:: When an operator's precedence depends on context. +* Parser States:: The parser is a finite-state-machine with stack. +* Reduce/Reduce:: When two rules are applicable in the same situation. +* Mystery Conflicts:: Reduce/reduce conflicts that look unjustified. +* Generalized LR Parsing:: Parsing arbitrary context-free grammars. +* Stack Overflow:: What happens when stack gets full. How to avoid it. + + +File: bison.info, Node: Look-Ahead, Next: Shift/Reduce, Up: Algorithm + +5.1 Look-Ahead Tokens +===================== + +The Bison parser does _not_ always reduce immediately as soon as the +last N tokens and groupings match a rule. This is because such a +simple strategy is inadequate to handle most languages. Instead, when a +reduction is possible, the parser sometimes "looks ahead" at the next +token in order to decide what to do. + + When a token is read, it is not immediately shifted; first it +becomes the "look-ahead token", which is not on the stack. Now the +parser can perform one or more reductions of tokens and groupings on +the stack, while the look-ahead token remains off to the side. When no +more reductions should take place, the look-ahead token is shifted onto +the stack. This does not mean that all possible reductions have been +done; depending on the token type of the look-ahead token, some rules +may choose to delay their application. + + Here is a simple case where look-ahead is needed. These three rules +define expressions which contain binary addition operators and postfix +unary factorial operators (`!'), and allow parentheses for grouping. + + expr: term '+' expr + | term + ; + + term: '(' expr ')' + | term '!' + | NUMBER + ; + + Suppose that the tokens `1 + 2' have been read and shifted; what +should be done? If the following token is `)', then the first three +tokens must be reduced to form an `expr'. This is the only valid +course, because shifting the `)' would produce a sequence of symbols +`term ')'', and no rule allows this. + + If the following token is `!', then it must be shifted immediately so +that `2 !' can be reduced to make a `term'. If instead the parser were +to reduce before shifting, `1 + 2' would become an `expr'. It would +then be impossible to shift the `!' because doing so would produce on +the stack the sequence of symbols `expr '!''. No rule allows that +sequence. + + The current look-ahead token is stored in the variable `yychar'. +*Note Special Features for Use in Actions: Action Features. + + +File: bison.info, Node: Shift/Reduce, Next: Precedence, Prev: Look-Ahead, Up: Algorithm + +5.2 Shift/Reduce Conflicts +========================== + +Suppose we are parsing a language which has if-then and if-then-else +statements, with a pair of rules like this: + + if_stmt: + IF expr THEN stmt + | IF expr THEN stmt ELSE stmt + ; + +Here we assume that `IF', `THEN' and `ELSE' are terminal symbols for +specific keyword tokens. + + When the `ELSE' token is read and becomes the look-ahead token, the +contents of the stack (assuming the input is valid) are just right for +reduction by the first rule. But it is also legitimate to shift the +`ELSE', because that would lead to eventual reduction by the second +rule. + + This situation, where either a shift or a reduction would be valid, +is called a "shift/reduce conflict". Bison is designed to resolve +these conflicts by choosing to shift, unless otherwise directed by +operator precedence declarations. To see the reason for this, let's +contrast it with the other alternative. + + Since the parser prefers to shift the `ELSE', the result is to attach +the else-clause to the innermost if-statement, making these two inputs +equivalent: + + if x then if y then win (); else lose; + + if x then do; if y then win (); else lose; end; + + But if the parser chose to reduce when possible rather than shift, +the result would be to attach the else-clause to the outermost +if-statement, making these two inputs equivalent: + + if x then if y then win (); else lose; + + if x then do; if y then win (); end; else lose; + + The conflict exists because the grammar as written is ambiguous: +either parsing of the simple nested if-statement is legitimate. The +established convention is that these ambiguities are resolved by +attaching the else-clause to the innermost if-statement; this is what +Bison accomplishes by choosing to shift rather than reduce. (It would +ideally be cleaner to write an unambiguous grammar, but that is very +hard to do in this case.) This particular ambiguity was first +encountered in the specifications of Algol 60 and is called the +"dangling `else'" ambiguity. + + To avoid warnings from Bison about predictable, legitimate +shift/reduce conflicts, use the `%expect N' declaration. There will be +no warning as long as the number of shift/reduce conflicts is exactly N. +*Note Suppressing Conflict Warnings: Expect Decl. + + The definition of `if_stmt' above is solely to blame for the +conflict, but the conflict does not actually appear without additional +rules. Here is a complete Bison input file that actually manifests the +conflict: + + %token IF THEN ELSE variable + %% + stmt: expr + | if_stmt + ; + + if_stmt: + IF expr THEN stmt + | IF expr THEN stmt ELSE stmt + ; + + expr: variable + ; + + +File: bison.info, Node: Precedence, Next: Contextual Precedence, Prev: Shift/Reduce, Up: Algorithm + +5.3 Operator Precedence +======================= + +Another situation where shift/reduce conflicts appear is in arithmetic +expressions. Here shifting is not always the preferred resolution; the +Bison declarations for operator precedence allow you to specify when to +shift and when to reduce. + +* Menu: + +* Why Precedence:: An example showing why precedence is needed. +* Using Precedence:: How to specify precedence in Bison grammars. +* Precedence Examples:: How these features are used in the previous example. +* How Precedence:: How they work. + + +File: bison.info, Node: Why Precedence, Next: Using Precedence, Up: Precedence + +5.3.1 When Precedence is Needed +------------------------------- + +Consider the following ambiguous grammar fragment (ambiguous because the +input `1 - 2 * 3' can be parsed in two different ways): + + expr: expr '-' expr + | expr '*' expr + | expr '<' expr + | '(' expr ')' + ... + ; + +Suppose the parser has seen the tokens `1', `-' and `2'; should it +reduce them via the rule for the subtraction operator? It depends on +the next token. Of course, if the next token is `)', we must reduce; +shifting is invalid because no single rule can reduce the token +sequence `- 2 )' or anything starting with that. But if the next token +is `*' or `<', we have a choice: either shifting or reduction would +allow the parse to complete, but with different results. + + To decide which one Bison should do, we must consider the results. +If the next operator token OP is shifted, then it must be reduced first +in order to permit another opportunity to reduce the difference. The +result is (in effect) `1 - (2 OP 3)'. On the other hand, if the +subtraction is reduced before shifting OP, the result is +`(1 - 2) OP 3'. Clearly, then, the choice of shift or reduce should +depend on the relative precedence of the operators `-' and OP: `*' +should be shifted first, but not `<'. + + What about input such as `1 - 2 - 5'; should this be `(1 - 2) - 5' +or should it be `1 - (2 - 5)'? For most operators we prefer the +former, which is called "left association". The latter alternative, +"right association", is desirable for assignment operators. The choice +of left or right association is a matter of whether the parser chooses +to shift or reduce when the stack contains `1 - 2' and the look-ahead +token is `-': shifting makes right-associativity. + + +File: bison.info, Node: Using Precedence, Next: Precedence Examples, Prev: Why Precedence, Up: Precedence + +5.3.2 Specifying Operator Precedence +------------------------------------ + +Bison allows you to specify these choices with the operator precedence +declarations `%left' and `%right'. Each such declaration contains a +list of tokens, which are operators whose precedence and associativity +is being declared. The `%left' declaration makes all those operators +left-associative and the `%right' declaration makes them +right-associative. A third alternative is `%nonassoc', which declares +that it is a syntax error to find the same operator twice "in a row". + + The relative precedence of different operators is controlled by the +order in which they are declared. The first `%left' or `%right' +declaration in the file declares the operators whose precedence is +lowest, the next such declaration declares the operators whose +precedence is a little higher, and so on. + + +File: bison.info, Node: Precedence Examples, Next: How Precedence, Prev: Using Precedence, Up: Precedence + +5.3.3 Precedence Examples +------------------------- + +In our example, we would want the following declarations: + + %left '<' + %left '-' + %left '*' + + In a more complete example, which supports other operators as well, +we would declare them in groups of equal precedence. For example, +`'+'' is declared with `'-'': + + %left '<' '>' '=' NE LE GE + %left '+' '-' + %left '*' '/' + +(Here `NE' and so on stand for the operators for "not equal" and so on. +We assume that these tokens are more than one character long and +therefore are represented by names, not character literals.) + + +File: bison.info, Node: How Precedence, Prev: Precedence Examples, Up: Precedence + +5.3.4 How Precedence Works +-------------------------- + +The first effect of the precedence declarations is to assign precedence +levels to the terminal symbols declared. The second effect is to assign +precedence levels to certain rules: each rule gets its precedence from +the last terminal symbol mentioned in the components. (You can also +specify explicitly the precedence of a rule. *Note Context-Dependent +Precedence: Contextual Precedence.) + + Finally, the resolution of conflicts works by comparing the +precedence of the rule being considered with that of the look-ahead +token. If the token's precedence is higher, the choice is to shift. +If the rule's precedence is higher, the choice is to reduce. If they +have equal precedence, the choice is made based on the associativity of +that precedence level. The verbose output file made by `-v' (*note +Invoking Bison: Invocation.) says how each conflict was resolved. + + Not all rules and not all tokens have precedence. If either the +rule or the look-ahead token has no precedence, then the default is to +shift. + + +File: bison.info, Node: Contextual Precedence, Next: Parser States, Prev: Precedence, Up: Algorithm + +5.4 Context-Dependent Precedence +================================ + +Often the precedence of an operator depends on the context. This sounds +outlandish at first, but it is really very common. For example, a minus +sign typically has a very high precedence as a unary operator, and a +somewhat lower precedence (lower than multiplication) as a binary +operator. + + The Bison precedence declarations, `%left', `%right' and +`%nonassoc', can only be used once for a given token; so a token has +only one precedence declared in this way. For context-dependent +precedence, you need to use an additional mechanism: the `%prec' +modifier for rules. + + The `%prec' modifier declares the precedence of a particular rule by +specifying a terminal symbol whose precedence should be used for that +rule. It's not necessary for that symbol to appear otherwise in the +rule. The modifier's syntax is: + + %prec TERMINAL-SYMBOL + +and it is written after the components of the rule. Its effect is to +assign the rule the precedence of TERMINAL-SYMBOL, overriding the +precedence that would be deduced for it in the ordinary way. The +altered rule precedence then affects how conflicts involving that rule +are resolved (*note Operator Precedence: Precedence.). + + Here is how `%prec' solves the problem of unary minus. First, +declare a precedence for a fictitious terminal symbol named `UMINUS'. +There are no tokens of this type, but the symbol serves to stand for its +precedence: + + ... + %left '+' '-' + %left '*' + %left UMINUS + + Now the precedence of `UMINUS' can be used in specific rules: + + exp: ... + | exp '-' exp + ... + | '-' exp %prec UMINUS + + +File: bison.info, Node: Parser States, Next: Reduce/Reduce, Prev: Contextual Precedence, Up: Algorithm + +5.5 Parser States +================= + +The function `yyparse' is implemented using a finite-state machine. +The values pushed on the parser stack are not simply token type codes; +they represent the entire sequence of terminal and nonterminal symbols +at or near the top of the stack. The current state collects all the +information about previous input which is relevant to deciding what to +do next. + + Each time a look-ahead token is read, the current parser state +together with the type of look-ahead token are looked up in a table. +This table entry can say, "Shift the look-ahead token." In this case, +it also specifies the new parser state, which is pushed onto the top of +the parser stack. Or it can say, "Reduce using rule number N." This +means that a certain number of tokens or groupings are taken off the +top of the stack, and replaced by one grouping. In other words, that +number of states are popped from the stack, and one new state is pushed. + + There is one other alternative: the table can say that the +look-ahead token is erroneous in the current state. This causes error +processing to begin (*note Error Recovery::). + + +File: bison.info, Node: Reduce/Reduce, Next: Mystery Conflicts, Prev: Parser States, Up: Algorithm + +5.6 Reduce/Reduce Conflicts +=========================== + +A reduce/reduce conflict occurs if there are two or more rules that +apply to the same sequence of input. This usually indicates a serious +error in the grammar. + + For example, here is an erroneous attempt to define a sequence of +zero or more `word' groupings. + + sequence: /* empty */ + { printf ("empty sequence\n"); } + | maybeword + | sequence word + { printf ("added word %s\n", $2); } + ; + + maybeword: /* empty */ + { printf ("empty maybeword\n"); } + | word + { printf ("single word %s\n", $1); } + ; + +The error is an ambiguity: there is more than one way to parse a single +`word' into a `sequence'. It could be reduced to a `maybeword' and +then into a `sequence' via the second rule. Alternatively, +nothing-at-all could be reduced into a `sequence' via the first rule, +and this could be combined with the `word' using the third rule for +`sequence'. + + There is also more than one way to reduce nothing-at-all into a +`sequence'. This can be done directly via the first rule, or +indirectly via `maybeword' and then the second rule. + + You might think that this is a distinction without a difference, +because it does not change whether any particular input is valid or +not. But it does affect which actions are run. One parsing order runs +the second rule's action; the other runs the first rule's action and +the third rule's action. In this example, the output of the program +changes. + + Bison resolves a reduce/reduce conflict by choosing to use the rule +that appears first in the grammar, but it is very risky to rely on +this. Every reduce/reduce conflict must be studied and usually +eliminated. Here is the proper way to define `sequence': + + sequence: /* empty */ + { printf ("empty sequence\n"); } + | sequence word + { printf ("added word %s\n", $2); } + ; + + Here is another common error that yields a reduce/reduce conflict: + + sequence: /* empty */ + | sequence words + | sequence redirects + ; + + words: /* empty */ + | words word + ; + + redirects:/* empty */ + | redirects redirect + ; + +The intention here is to define a sequence which can contain either +`word' or `redirect' groupings. The individual definitions of +`sequence', `words' and `redirects' are error-free, but the three +together make a subtle ambiguity: even an empty input can be parsed in +infinitely many ways! + + Consider: nothing-at-all could be a `words'. Or it could be two +`words' in a row, or three, or any number. It could equally well be a +`redirects', or two, or any number. Or it could be a `words' followed +by three `redirects' and another `words'. And so on. + + Here are two ways to correct these rules. First, to make it a +single level of sequence: + + sequence: /* empty */ + | sequence word + | sequence redirect + ; + + Second, to prevent either a `words' or a `redirects' from being +empty: + + sequence: /* empty */ + | sequence words + | sequence redirects + ; + + words: word + | words word + ; + + redirects:redirect + | redirects redirect + ; + + +File: bison.info, Node: Mystery Conflicts, Next: Generalized LR Parsing, Prev: Reduce/Reduce, Up: Algorithm + +5.7 Mysterious Reduce/Reduce Conflicts +====================================== + +Sometimes reduce/reduce conflicts can occur that don't look warranted. +Here is an example: + + %token ID + + %% + def: param_spec return_spec ',' + ; + param_spec: + type + | name_list ':' type + ; + return_spec: + type + | name ':' type + ; + type: ID + ; + name: ID + ; + name_list: + name + | name ',' name_list + ; + + It would seem that this grammar can be parsed with only a single +token of look-ahead: when a `param_spec' is being read, an `ID' is a +`name' if a comma or colon follows, or a `type' if another `ID' +follows. In other words, this grammar is LR(1). + + However, Bison, like most parser generators, cannot actually handle +all LR(1) grammars. In this grammar, two contexts, that after an `ID' +at the beginning of a `param_spec' and likewise at the beginning of a +`return_spec', are similar enough that Bison assumes they are the same. +They appear similar because the same set of rules would be active--the +rule for reducing to a `name' and that for reducing to a `type'. Bison +is unable to determine at that stage of processing that the rules would +require different look-ahead tokens in the two contexts, so it makes a +single parser state for them both. Combining the two contexts causes a +conflict later. In parser terminology, this occurrence means that the +grammar is not LALR(1). + + In general, it is better to fix deficiencies than to document them. +But this particular deficiency is intrinsically hard to fix; parser +generators that can handle LR(1) grammars are hard to write and tend to +produce parsers that are very large. In practice, Bison is more useful +as it is now. + + When the problem arises, you can often fix it by identifying the two +parser states that are being confused, and adding something to make them +look distinct. In the above example, adding one rule to `return_spec' +as follows makes the problem go away: + + %token BOGUS + ... + %% + ... + return_spec: + type + | name ':' type + /* This rule is never used. */ + | ID BOGUS + ; + + This corrects the problem because it introduces the possibility of an +additional active rule in the context after the `ID' at the beginning of +`return_spec'. This rule is not active in the corresponding context in +a `param_spec', so the two contexts receive distinct parser states. As +long as the token `BOGUS' is never generated by `yylex', the added rule +cannot alter the way actual input is parsed. + + In this particular example, there is another way to solve the +problem: rewrite the rule for `return_spec' to use `ID' directly +instead of via `name'. This also causes the two confusing contexts to +have different sets of active rules, because the one for `return_spec' +activates the altered rule for `return_spec' rather than the one for +`name'. + + param_spec: + type + | name_list ':' type + ; + return_spec: + type + | ID ':' type + ; + + +File: bison.info, Node: Generalized LR Parsing, Next: Stack Overflow, Prev: Mystery Conflicts, Up: Algorithm + +5.8 Generalized LR (GLR) Parsing +================================ + +Bison produces _deterministic_ parsers that choose uniquely when to +reduce and which reduction to apply based on a summary of the preceding +input and on one extra token of lookahead. As a result, normal Bison +handles a proper subset of the family of context-free languages. +Ambiguous grammars, since they have strings with more than one possible +sequence of reductions cannot have deterministic parsers in this sense. +The same is true of languages that require more than one symbol of +lookahead, since the parser lacks the information necessary to make a +decision at the point it must be made in a shift-reduce parser. +Finally, as previously mentioned (*note Mystery Conflicts::), there are +languages where Bison's particular choice of how to summarize the input +seen so far loses necessary information. + + When you use the `%glr-parser' declaration in your grammar file, +Bison generates a parser that uses a different algorithm, called +Generalized LR (or GLR). A Bison GLR parser uses the same basic +algorithm for parsing as an ordinary Bison parser, but behaves +differently in cases where there is a shift-reduce conflict that has not +been resolved by precedence rules (*note Precedence::) or a +reduce-reduce conflict. When a GLR parser encounters such a situation, +it effectively _splits_ into a several parsers, one for each possible +shift or reduction. These parsers then proceed as usual, consuming +tokens in lock-step. Some of the stacks may encounter other conflicts +and split further, with the result that instead of a sequence of states, +a Bison GLR parsing stack is what is in effect a tree of states. + + In effect, each stack represents a guess as to what the proper parse +is. Additional input may indicate that a guess was wrong, in which case +the appropriate stack silently disappears. Otherwise, the semantics +actions generated in each stack are saved, rather than being executed +immediately. When a stack disappears, its saved semantic actions never +get executed. When a reduction causes two stacks to become equivalent, +their sets of semantic actions are both saved with the state that +results from the reduction. We say that two stacks are equivalent when +they both represent the same sequence of states, and each pair of +corresponding states represents a grammar symbol that produces the same +segment of the input token stream. + + Whenever the parser makes a transition from having multiple states +to having one, it reverts to the normal LALR(1) parsing algorithm, +after resolving and executing the saved-up actions. At this +transition, some of the states on the stack will have semantic values +that are sets (actually multisets) of possible actions. The parser +tries to pick one of the actions by first finding one whose rule has +the highest dynamic precedence, as set by the `%dprec' declaration. +Otherwise, if the alternative actions are not ordered by precedence, +but there the same merging function is declared for both rules by the +`%merge' declaration, Bison resolves and evaluates both and then calls +the merge function on the result. Otherwise, it reports an ambiguity. + + It is possible to use a data structure for the GLR parsing tree that +permits the processing of any LALR(1) grammar in linear time (in the +size of the input), any unambiguous (not necessarily LALR(1)) grammar in +quadratic worst-case time, and any general (possibly ambiguous) +context-free grammar in cubic worst-case time. However, Bison currently +uses a simpler data structure that requires time proportional to the +length of the input times the maximum number of stacks required for any +prefix of the input. Thus, really ambiguous or non-deterministic +grammars can require exponential time and space to process. Such badly +behaving examples, however, are not generally of practical interest. +Usually, non-determinism in a grammar is local--the parser is "in +doubt" only for a few tokens at a time. Therefore, the current data +structure should generally be adequate. On LALR(1) portions of a +grammar, in particular, it is only slightly slower than with the default +Bison parser. + + For a more detailed exposition of GLR parsers, please see: Elizabeth +Scott, Adrian Johnstone and Shamsa Sadaf Hussain, Tomita-Style +Generalised LR Parsers, Royal Holloway, University of London, +Department of Computer Science, TR-00-12, +`http://www.cs.rhul.ac.uk/research/languages/publications/tomita_style_1.ps', +(2000-12-24). + + +File: bison.info, Node: Stack Overflow, Prev: Generalized LR Parsing, Up: Algorithm + +5.9 Stack Overflow, and How to Avoid It +======================================= + +The Bison parser stack can overflow if too many tokens are shifted and +not reduced. When this happens, the parser function `yyparse' returns +a nonzero value, pausing only to call `yyerror' to report the overflow. + + Because Bison parsers have growing stacks, hitting the upper limit +usually results from using a right recursion instead of a left +recursion, *Note Recursive Rules: Recursion. + + By defining the macro `YYMAXDEPTH', you can control how deep the +parser stack can become before a stack overflow occurs. Define the +macro with a value that is an integer. This value is the maximum number +of tokens that can be shifted (and not reduced) before overflow. It +must be a constant expression whose value is known at compile time. + + The stack space allowed is not necessarily allocated. If you +specify a large value for `YYMAXDEPTH', the parser actually allocates a +small stack at first, and then makes it bigger by stages as needed. +This increasing allocation happens automatically and silently. +Therefore, you do not need to make `YYMAXDEPTH' painfully small merely +to save space for ordinary inputs that do not need much stack. + + The default value of `YYMAXDEPTH', if you do not define it, is 10000. + + You can control how much stack is allocated initially by defining the +macro `YYINITDEPTH'. This value too must be a compile-time constant +integer. The default is 200. + + Because of semantical differences between C and C++, the LALR(1) +parsers in C produced by Bison by compiled as C++ cannot grow. In this +precise case (compiling a C parser as C++) you are suggested to grow +`YYINITDEPTH'. In the near future, a C++ output output will be +provided which addresses this issue. + + +File: bison.info, Node: Error Recovery, Next: Context Dependency, Prev: Algorithm, Up: Top + +6 Error Recovery +**************** + +It is not usually acceptable to have a program terminate on a syntax +error. For example, a compiler should recover sufficiently to parse the +rest of the input file and check it for errors; a calculator should +accept another expression. + + In a simple interactive command parser where each input is one line, +it may be sufficient to allow `yyparse' to return 1 on error and have +the caller ignore the rest of the input line when that happens (and +then call `yyparse' again). But this is inadequate for a compiler, +because it forgets all the syntactic context leading up to the error. +A syntax error deep within a function in the compiler input should not +cause the compiler to treat the following line like the beginning of a +source file. + + You can define how to recover from a syntax error by writing rules to +recognize the special token `error'. This is a terminal symbol that is +always defined (you need not declare it) and reserved for error +handling. The Bison parser generates an `error' token whenever a +syntax error happens; if you have provided a rule to recognize this +token in the current context, the parse can continue. + + For example: + + stmnts: /* empty string */ + | stmnts '\n' + | stmnts exp '\n' + | stmnts error '\n' + + The fourth rule in this example says that an error followed by a +newline makes a valid addition to any `stmnts'. + + What happens if a syntax error occurs in the middle of an `exp'? The +error recovery rule, interpreted strictly, applies to the precise +sequence of a `stmnts', an `error' and a newline. If an error occurs in +the middle of an `exp', there will probably be some additional tokens +and subexpressions on the stack after the last `stmnts', and there will +be tokens to read before the next newline. So the rule is not +applicable in the ordinary way. + + But Bison can force the situation to fit the rule, by discarding +part of the semantic context and part of the input. First it discards +states and objects from the stack until it gets back to a state in +which the `error' token is acceptable. (This means that the +subexpressions already parsed are discarded, back to the last complete +`stmnts'.) At this point the `error' token can be shifted. Then, if +the old look-ahead token is not acceptable to be shifted next, the +parser reads tokens and discards them until it finds a token which is +acceptable. In this example, Bison reads and discards input until the +next newline so that the fourth rule can apply. Note that discarded +symbols are possible sources of memory leaks, see *Note Freeing +Discarded Symbols: Destructor Decl, for a means to reclaim this memory. + + The choice of error rules in the grammar is a choice of strategies +for error recovery. A simple and useful strategy is simply to skip the +rest of the current input line or current statement if an error is +detected: + + stmnt: error ';' /* On error, skip until ';' is read. */ + + It is also useful to recover to the matching close-delimiter of an +opening-delimiter that has already been parsed. Otherwise the +close-delimiter will probably appear to be unmatched, and generate +another, spurious error message: + + primary: '(' expr ')' + | '(' error ')' + ... + ; + + Error recovery strategies are necessarily guesses. When they guess +wrong, one syntax error often leads to another. In the above example, +the error recovery rule guesses that an error is due to bad input +within one `stmnt'. Suppose that instead a spurious semicolon is +inserted in the middle of a valid `stmnt'. After the error recovery +rule recovers from the first error, another syntax error will be found +straightaway, since the text following the spurious semicolon is also +an invalid `stmnt'. + + To prevent an outpouring of error messages, the parser will output +no error message for another syntax error that happens shortly after +the first; only after three consecutive input tokens have been +successfully shifted will error messages resume. + + Note that rules which accept the `error' token may have actions, just +as any other rules can. + + You can make error messages resume immediately by using the macro +`yyerrok' in an action. If you do this in the error rule's action, no +error messages will be suppressed. This macro requires no arguments; +`yyerrok;' is a valid C statement. + + The previous look-ahead token is reanalyzed immediately after an +error. If this is unacceptable, then the macro `yyclearin' may be used +to clear this token. Write the statement `yyclearin;' in the error +rule's action. + + For example, suppose that on a syntax error, an error handling +routine is called that advances the input stream to some point where +parsing should once again commence. The next symbol returned by the +lexical scanner is probably correct. The previous look-ahead token +ought to be discarded with `yyclearin;'. + + The macro `YYRECOVERING' stands for an expression that has the value +1 when the parser is recovering from a syntax error, and 0 the rest of +the time. A value of 1 indicates that error messages are currently +suppressed for new syntax errors. + + +File: bison.info, Node: Context Dependency, Next: Debugging, Prev: Error Recovery, Up: Top + +7 Handling Context Dependencies +******************************* + +The Bison paradigm is to parse tokens first, then group them into larger +syntactic units. In many languages, the meaning of a token is affected +by its context. Although this violates the Bison paradigm, certain +techniques (known as "kludges") may enable you to write Bison parsers +for such languages. + +* Menu: + +* Semantic Tokens:: Token parsing can depend on the semantic context. +* Lexical Tie-ins:: Token parsing can depend on the syntactic context. +* Tie-in Recovery:: Lexical tie-ins have implications for how + error recovery rules must be written. + + (Actually, "kludge" means any technique that gets its job done but is +neither clean nor robust.) + + +File: bison.info, Node: Semantic Tokens, Next: Lexical Tie-ins, Up: Context Dependency + +7.1 Semantic Info in Token Types +================================ + +The C language has a context dependency: the way an identifier is used +depends on what its current meaning is. For example, consider this: + + foo (x); + + This looks like a function call statement, but if `foo' is a typedef +name, then this is actually a declaration of `x'. How can a Bison +parser for C decide how to parse this input? + + The method used in GNU C is to have two different token types, +`IDENTIFIER' and `TYPENAME'. When `yylex' finds an identifier, it +looks up the current declaration of the identifier in order to decide +which token type to return: `TYPENAME' if the identifier is declared as +a typedef, `IDENTIFIER' otherwise. + + The grammar rules can then express the context dependency by the +choice of token type to recognize. `IDENTIFIER' is accepted as an +expression, but `TYPENAME' is not. `TYPENAME' can start a declaration, +but `IDENTIFIER' cannot. In contexts where the meaning of the +identifier is _not_ significant, such as in declarations that can +shadow a typedef name, either `TYPENAME' or `IDENTIFIER' is +accepted--there is one rule for each of the two token types. + + This technique is simple to use if the decision of which kinds of +identifiers to allow is made at a place close to where the identifier is +parsed. But in C this is not always so: C allows a declaration to +redeclare a typedef name provided an explicit type has been specified +earlier: + + typedef int foo, bar, lose; + static foo (bar); /* redeclare `bar' as static variable */ + static int foo (lose); /* redeclare `foo' as function */ + + Unfortunately, the name being declared is separated from the +declaration construct itself by a complicated syntactic structure--the +"declarator". + + As a result, part of the Bison parser for C needs to be duplicated, +with all the nonterminal names changed: once for parsing a declaration +in which a typedef name can be redefined, and once for parsing a +declaration in which that can't be done. Here is a part of the +duplication, with actions omitted for brevity: + + initdcl: + declarator maybeasm '=' + init + | declarator maybeasm + ; + + notype_initdcl: + notype_declarator maybeasm '=' + init + | notype_declarator maybeasm + ; + +Here `initdcl' can redeclare a typedef name, but `notype_initdcl' +cannot. The distinction between `declarator' and `notype_declarator' +is the same sort of thing. + + There is some similarity between this technique and a lexical tie-in +(described next), in that information which alters the lexical analysis +is changed during parsing by other parts of the program. The +difference is here the information is global, and is used for other +purposes in the program. A true lexical tie-in has a special-purpose +flag controlled by the syntactic context. + + +File: bison.info, Node: Lexical Tie-ins, Next: Tie-in Recovery, Prev: Semantic Tokens, Up: Context Dependency + +7.2 Lexical Tie-ins +=================== + +One way to handle context-dependency is the "lexical tie-in": a flag +which is set by Bison actions, whose purpose is to alter the way tokens +are parsed. + + For example, suppose we have a language vaguely like C, but with a +special construct `hex (HEX-EXPR)'. After the keyword `hex' comes an +expression in parentheses in which all integers are hexadecimal. In +particular, the token `a1b' must be treated as an integer rather than +as an identifier if it appears in that context. Here is how you can do +it: + + %{ + int hexflag; + int yylex (void); + void yyerror (char const *); + %} + %% + ... + expr: IDENTIFIER + | constant + | HEX '(' + { hexflag = 1; } + expr ')' + { hexflag = 0; + $$ = $4; } + | expr '+' expr + { $$ = make_sum ($1, $3); } + ... + ; + + constant: + INTEGER + | STRING + ; + +Here we assume that `yylex' looks at the value of `hexflag'; when it is +nonzero, all integers are parsed in hexadecimal, and tokens starting +with letters are parsed as integers if possible. + + The declaration of `hexflag' shown in the prologue of the parser file +is needed to make it accessible to the actions (*note The Prologue: +Prologue.). You must also write the code in `yylex' to obey the flag. + + +File: bison.info, Node: Tie-in Recovery, Prev: Lexical Tie-ins, Up: Context Dependency + +7.3 Lexical Tie-ins and Error Recovery +====================================== + +Lexical tie-ins make strict demands on any error recovery rules you +have. *Note Error Recovery::. + + The reason for this is that the purpose of an error recovery rule is +to abort the parsing of one construct and resume in some larger +construct. For example, in C-like languages, a typical error recovery +rule is to skip tokens until the next semicolon, and then start a new +statement, like this: + + stmt: expr ';' + | IF '(' expr ')' stmt { ... } + ... + error ';' + { hexflag = 0; } + ; + + If there is a syntax error in the middle of a `hex (EXPR)' +construct, this error rule will apply, and then the action for the +completed `hex (EXPR)' will never run. So `hexflag' would remain set +for the entire rest of the input, or until the next `hex' keyword, +causing identifiers to be misinterpreted as integers. + + To avoid this problem the error recovery rule itself clears +`hexflag'. + + There may also be an error recovery rule that works within +expressions. For example, there could be a rule which applies within +parentheses and skips to the close-parenthesis: + + expr: ... + | '(' expr ')' + { $$ = $2; } + | '(' error ')' + ... + + If this rule acts within the `hex' construct, it is not going to +abort that construct (since it applies to an inner level of parentheses +within the construct). Therefore, it should not clear the flag: the +rest of the `hex' construct should be parsed with the flag still in +effect. + + What if there is an error recovery rule which might abort out of the +`hex' construct or might not, depending on circumstances? There is no +way you can write the action to determine whether a `hex' construct is +being aborted or not. So if you are using a lexical tie-in, you had +better make sure your error recovery rules are not of this kind. Each +rule must be such that you can be sure that it always will, or always +won't, have to clear the flag. + + +File: bison.info, Node: Debugging, Next: Invocation, Prev: Context Dependency, Up: Top + +8 Debugging Your Parser +*********************** + +Developing a parser can be a challenge, especially if you don't +understand the algorithm (*note The Bison Parser Algorithm: +Algorithm.). Even so, sometimes a detailed description of the automaton +can help (*note Understanding Your Parser: Understanding.), or tracing +the execution of the parser can give some insight on why it behaves +improperly (*note Tracing Your Parser: Tracing.). + +* Menu: + +* Understanding:: Understanding the structure of your parser. +* Tracing:: Tracing the execution of your parser. + + +File: bison.info, Node: Understanding, Next: Tracing, Up: Debugging + +8.1 Understanding Your Parser +============================= + +As documented elsewhere (*note The Bison Parser Algorithm: Algorithm.) +Bison parsers are "shift/reduce automata". In some cases (much more +frequent than one would hope), looking at this automaton is required to +tune or simply fix a parser. Bison provides two different +representation of it, either textually or graphically (as a VCG file). + + The textual file is generated when the options `--report' or +`--verbose' are specified, see *Note Invoking Bison: Invocation. Its +name is made by removing `.tab.c' or `.c' from the parser output file +name, and adding `.output' instead. Therefore, if the input file is +`foo.y', then the parser file is called `foo.tab.c' by default. As a +consequence, the verbose output file is called `foo.output'. + + The following grammar file, `calc.y', will be used in the sequel: + + %token NUM STR + %left '+' '-' + %left '*' + %% + exp: exp '+' exp + | exp '-' exp + | exp '*' exp + | exp '/' exp + | NUM + ; + useless: STR; + %% + + `bison' reports: + + calc.y: warning: 1 useless nonterminal and 1 useless rule + calc.y:11.1-7: warning: useless nonterminal: useless + calc.y:11.10-12: warning: useless rule: useless: STR + calc.y: conflicts: 7 shift/reduce + + When given `--report=state', in addition to `calc.tab.c', it creates +a file `calc.output' with contents detailed below. The order of the +output and the exact presentation might vary, but the interpretation is +the same. + + The first section includes details on conflicts that were solved +thanks to precedence and/or associativity: + + Conflict in state 8 between rule 2 and token '+' resolved as reduce. + Conflict in state 8 between rule 2 and token '-' resolved as reduce. + Conflict in state 8 between rule 2 and token '*' resolved as shift. +... + + +The next section lists states that still have conflicts. + + State 8 conflicts: 1 shift/reduce + State 9 conflicts: 1 shift/reduce + State 10 conflicts: 1 shift/reduce + State 11 conflicts: 4 shift/reduce + +The next section reports useless tokens, nonterminal and rules. Useless +nonterminals and rules are removed in order to produce a smaller parser, +but useless tokens are preserved, since they might be used by the +scanner (note the difference between "useless" and "not used" below): + + Useless nonterminals: + useless + + Terminals which are not used: + STR + + Useless rules: + #6 useless: STR; + +The next section reproduces the exact grammar that Bison used: + + Grammar + + Number, Line, Rule + 0 5 $accept -> exp $end + 1 5 exp -> exp '+' exp + 2 6 exp -> exp '-' exp + 3 7 exp -> exp '*' exp + 4 8 exp -> exp '/' exp + 5 9 exp -> NUM + +and reports the uses of the symbols: + + Terminals, with rules where they appear + + $end (0) 0 + '*' (42) 3 + '+' (43) 1 + '-' (45) 2 + '/' (47) 4 + error (256) + NUM (258) 5 + + Nonterminals, with rules where they appear + + $accept (8) + on left: 0 + exp (9) + on left: 1 2 3 4 5, on right: 0 1 2 3 4 + +Bison then proceeds onto the automaton itself, describing each state +with it set of "items", also known as "pointed rules". Each item is a +production rule together with a point (marked by `.') that the input +cursor. + + state 0 + + $accept -> . exp $ (rule 0) + + NUM shift, and go to state 1 + + exp go to state 2 + + This reads as follows: "state 0 corresponds to being at the very +beginning of the parsing, in the initial rule, right before the start +symbol (here, `exp'). When the parser returns to this state right +after having reduced a rule that produced an `exp', the control flow +jumps to state 2. If there is no such transition on a nonterminal +symbol, and the lookahead is a `NUM', then this token is shifted on the +parse stack, and the control flow jumps to state 1. Any other +lookahead triggers a syntax error." + + Even though the only active rule in state 0 seems to be rule 0, the +report lists `NUM' as a lookahead symbol because `NUM' can be at the +beginning of any rule deriving an `exp'. By default Bison reports the +so-called "core" or "kernel" of the item set, but if you want to see +more detail you can invoke `bison' with `--report=itemset' to list all +the items, include those that can be derived: + + state 0 + + $accept -> . exp $ (rule 0) + exp -> . exp '+' exp (rule 1) + exp -> . exp '-' exp (rule 2) + exp -> . exp '*' exp (rule 3) + exp -> . exp '/' exp (rule 4) + exp -> . NUM (rule 5) + + NUM shift, and go to state 1 + + exp go to state 2 + +In the state 1... + + state 1 + + exp -> NUM . (rule 5) + + $default reduce using rule 5 (exp) + +the rule 5, `exp: NUM;', is completed. Whatever the lookahead +(`$default'), the parser will reduce it. If it was coming from state +0, then, after this reduction it will return to state 0, and will jump +to state 2 (`exp: go to state 2'). + + state 2 + + $accept -> exp . $ (rule 0) + exp -> exp . '+' exp (rule 1) + exp -> exp . '-' exp (rule 2) + exp -> exp . '*' exp (rule 3) + exp -> exp . '/' exp (rule 4) + + $ shift, and go to state 3 + '+' shift, and go to state 4 + '-' shift, and go to state 5 + '*' shift, and go to state 6 + '/' shift, and go to state 7 + +In state 2, the automaton can only shift a symbol. For instance, +because of the item `exp -> exp . '+' exp', if the lookahead if `+', it +will be shifted on the parse stack, and the automaton control will jump +to state 4, corresponding to the item `exp -> exp '+' . exp'. Since +there is no default action, any other token than those listed above +will trigger a syntax error. + + The state 3 is named the "final state", or the "accepting state": + + state 3 + + $accept -> exp $ . (rule 0) + + $default accept + +the initial rule is completed (the start symbol and the end of input +were read), the parsing exits successfully. + + The interpretation of states 4 to 7 is straightforward, and is left +to the reader. + + state 4 + + exp -> exp '+' . exp (rule 1) + + NUM shift, and go to state 1 + + exp go to state 8 + + state 5 + + exp -> exp '-' . exp (rule 2) + + NUM shift, and go to state 1 + + exp go to state 9 + + state 6 + + exp -> exp '*' . exp (rule 3) + + NUM shift, and go to state 1 + + exp go to state 10 + + state 7 + + exp -> exp '/' . exp (rule 4) + + NUM shift, and go to state 1 + + exp go to state 11 + + As was announced in beginning of the report, `State 8 conflicts: 1 +shift/reduce': + + state 8 + + exp -> exp . '+' exp (rule 1) + exp -> exp '+' exp . (rule 1) + exp -> exp . '-' exp (rule 2) + exp -> exp . '*' exp (rule 3) + exp -> exp . '/' exp (rule 4) + + '*' shift, and go to state 6 + '/' shift, and go to state 7 + + '/' [reduce using rule 1 (exp)] + $default reduce using rule 1 (exp) + + Indeed, there are two actions associated to the lookahead `/': +either shifting (and going to state 7), or reducing rule 1. The +conflict means that either the grammar is ambiguous, or the parser lacks +information to make the right decision. Indeed the grammar is +ambiguous, as, since we did not specify the precedence of `/', the +sentence `NUM + NUM / NUM' can be parsed as `NUM + (NUM / NUM)', which +corresponds to shifting `/', or as `(NUM + NUM) / NUM', which +corresponds to reducing rule 1. + + Because in LALR(1) parsing a single decision can be made, Bison +arbitrarily chose to disable the reduction, see *Note Shift/Reduce +Conflicts: Shift/Reduce. Discarded actions are reported in between +square brackets. + + Note that all the previous states had a single possible action: +either shifting the next token and going to the corresponding state, or +reducing a single rule. In the other cases, i.e., when shifting _and_ +reducing is possible or when _several_ reductions are possible, the +lookahead is required to select the action. State 8 is one such state: +if the lookahead is `*' or `/' then the action is shifting, otherwise +the action is reducing rule 1. In other words, the first two items, +corresponding to rule 1, are not eligible when the lookahead is `*', +since we specified that `*' has higher precedence that `+'. More +generally, some items are eligible only with some set of possible +lookaheads. When run with `--report=lookahead', Bison specifies these +lookaheads: + + state 8 + + exp -> exp . '+' exp [$, '+', '-', '/'] (rule 1) + exp -> exp '+' exp . [$, '+', '-', '/'] (rule 1) + exp -> exp . '-' exp (rule 2) + exp -> exp . '*' exp (rule 3) + exp -> exp . '/' exp (rule 4) + + '*' shift, and go to state 6 + '/' shift, and go to state 7 + + '/' [reduce using rule 1 (exp)] + $default reduce using rule 1 (exp) + + The remaining states are similar: + + state 9 + + exp -> exp . '+' exp (rule 1) + exp -> exp . '-' exp (rule 2) + exp -> exp '-' exp . (rule 2) + exp -> exp . '*' exp (rule 3) + exp -> exp . '/' exp (rule 4) + + '*' shift, and go to state 6 + '/' shift, and go to state 7 + + '/' [reduce using rule 2 (exp)] + $default reduce using rule 2 (exp) + + state 10 + + exp -> exp . '+' exp (rule 1) + exp -> exp . '-' exp (rule 2) + exp -> exp . '*' exp (rule 3) + exp -> exp '*' exp . (rule 3) + exp -> exp . '/' exp (rule 4) + + '/' shift, and go to state 7 + + '/' [reduce using rule 3 (exp)] + $default reduce using rule 3 (exp) + + state 11 + + exp -> exp . '+' exp (rule 1) + exp -> exp . '-' exp (rule 2) + exp -> exp . '*' exp (rule 3) + exp -> exp . '/' exp (rule 4) + exp -> exp '/' exp . (rule 4) + + '+' shift, and go to state 4 + '-' shift, and go to state 5 + '*' shift, and go to state 6 + '/' shift, and go to state 7 + + '+' [reduce using rule 4 (exp)] + '-' [reduce using rule 4 (exp)] + '*' [reduce using rule 4 (exp)] + '/' [reduce using rule 4 (exp)] + $default reduce using rule 4 (exp) + +Observe that state 11 contains conflicts due to the lack of precedence +of `/' wrt `+', `-', and `*', but also because the associativity of `/' +is not specified. + + +File: bison.info, Node: Tracing, Prev: Understanding, Up: Debugging + +8.2 Tracing Your Parser +======================= + +If a Bison grammar compiles properly but doesn't do what you want when +it runs, the `yydebug' parser-trace feature can help you figure out why. + + There are several means to enable compilation of trace facilities: + +the macro `YYDEBUG' + Define the macro `YYDEBUG' to a nonzero value when you compile the + parser. This is compliant with POSIX Yacc. You could use + `-DYYDEBUG=1' as a compiler option or you could put `#define + YYDEBUG 1' in the prologue of the grammar file (*note The + Prologue: Prologue.). + +the option `-t', `--debug' + Use the `-t' option when you run Bison (*note Invoking Bison: + Invocation.). This is POSIX compliant too. + +the directive `%debug' + Add the `%debug' directive (*note Bison Declaration Summary: Decl + Summary.). This is a Bison extension, which will prove useful + when Bison will output parsers for languages that don't use a + preprocessor. Unless POSIX and Yacc portability matter to you, + this is the preferred solution. + + We suggest that you always enable the debug option so that debugging +is always possible. + + The trace facility outputs messages with macro calls of the form +`YYFPRINTF (stderr, FORMAT, ARGS)' where FORMAT and ARGS are the usual +`printf' format and arguments. If you define `YYDEBUG' to a nonzero +value but do not define `YYFPRINTF', `' is automatically +included and `YYPRINTF' is defined to `fprintf'. + + Once you have compiled the program with trace facilities, the way to +request a trace is to store a nonzero value in the variable `yydebug'. +You can do this by making the C code do it (in `main', perhaps), or you +can alter the value with a C debugger. + + Each step taken by the parser when `yydebug' is nonzero produces a +line or two of trace information, written on `stderr'. The trace +messages tell you these things: + + * Each time the parser calls `yylex', what kind of token was read. + + * Each time a token is shifted, the depth and complete contents of + the state stack (*note Parser States::). + + * Each time a rule is reduced, which rule it is, and the complete + contents of the state stack afterward. + + To make sense of this information, it helps to refer to the listing +file produced by the Bison `-v' option (*note Invoking Bison: +Invocation.). This file shows the meaning of each state in terms of +positions in various rules, and also what each state will do with each +possible input token. As you read the successive trace messages, you +can see that the parser is functioning according to its specification in +the listing file. Eventually you will arrive at the place where +something undesirable happens, and you will see which parts of the +grammar are to blame. + + The parser file is a C program and you can use C debuggers on it, +but it's not easy to interpret what it is doing. The parser function +is a finite-state machine interpreter, and aside from the actions it +executes the same code over and over. Only the values of variables +show where in the grammar it is working. + + The debugging information normally gives the token type of each token +read, but not its semantic value. You can optionally define a macro +named `YYPRINT' to provide a way to print the value. If you define +`YYPRINT', it should take three arguments. The parser will pass a +standard I/O stream, the numeric code for the token type, and the token +value (from `yylval'). + + Here is an example of `YYPRINT' suitable for the multi-function +calculator (*note Declarations for `mfcalc': Mfcalc Decl.): + + %{ + static void print_token_value (FILE *, int, YYSTYPE); + #define YYPRINT(file, type, value) print_token_value (file, type, value) + %} + + ... %% ... %% ... + + static void + print_token_value (FILE *file, int type, YYSTYPE value) + { + if (type == VAR) + fprintf (file, "%s", value.tptr->name); + else if (type == NUM) + fprintf (file, "%d", value.val); + } + + +File: bison.info, Node: Invocation, Next: Table of Symbols, Prev: Debugging, Up: Top + +9 Invoking Bison +**************** + +The usual way to invoke Bison is as follows: + + bison INFILE + + Here INFILE is the grammar file name, which usually ends in `.y'. +The parser file's name is made by replacing the `.y' with `.tab.c'. +Thus, the `bison foo.y' filename yields `foo.tab.c', and the `bison +hack/foo.y' filename yields `hack/foo.tab.c'. It's also possible, in +case you are writing C++ code instead of C in your grammar file, to +name it `foo.ypp' or `foo.y++'. Then, the output files will take an +extension like the given one as input (respectively `foo.tab.cpp' and +`foo.tab.c++'). This feature takes effect with all options that +manipulate filenames like `-o' or `-d'. + + For example : + + bison -d INFILE.YXX + will produce `infile.tab.cxx' and `infile.tab.hxx', and + + bison -d -o OUTPUT.C++ INFILE.Y + will produce `output.c++' and `outfile.h++'. + + For compatibility with POSIX, the standard Bison distribution also +contains a shell script called `yacc' that invokes Bison with the `-y' +option. + +* Menu: + +* Bison Options:: All the options described in detail, + in alphabetical order by short options. +* Option Cross Key:: Alphabetical list of long options. +* Yacc Library:: Yacc-compatible `yylex' and `main'. + + +File: bison.info, Node: Bison Options, Next: Option Cross Key, Up: Invocation + +9.1 Bison Options +================= + +Bison supports both traditional single-letter options and mnemonic long +option names. Long option names are indicated with `--' instead of +`-'. Abbreviations for option names are allowed as long as they are +unique. When a long option takes an argument, like `--file-prefix', +connect the option name and the argument with `='. + + Here is a list of options that can be used with Bison, alphabetized +by short option. It is followed by a cross key alphabetized by long +option. + +Operations modes: +`-h' +`--help' + Print a summary of the command-line options to Bison and exit. + +`-V' +`--version' + Print the version number of Bison and exit. + +`-y' +`--yacc' + Equivalent to `-o y.tab.c'; the parser output file is called + `y.tab.c', and the other outputs are called `y.output' and + `y.tab.h'. The purpose of this option is to imitate Yacc's output + file name conventions. Thus, the following shell script can + substitute for Yacc, and the Bison distribution contains such a + script for compatibility with POSIX: + + #! /bin/sh + bison -y "$@" + +Tuning the parser: + +`-S FILE' +`--skeleton=FILE' + Specify the skeleton to use. You probably don't need this option + unless you are developing Bison. + +`-t' +`--debug' + In the parser file, define the macro `YYDEBUG' to 1 if it is not + already defined, so that the debugging facilities are compiled. + *Note Tracing Your Parser: Tracing. + +`--locations' + Pretend that `%locations' was specified. *Note Decl Summary::. + +`-p PREFIX' +`--name-prefix=PREFIX' + Pretend that `%name-prefix="PREFIX"' was specified. *Note Decl + Summary::. + +`-l' +`--no-lines' + Don't put any `#line' preprocessor commands in the parser file. + Ordinarily Bison puts them in the parser file so that the C + compiler and debuggers will associate errors with your source + file, the grammar file. This option causes them to associate + errors with the parser file, treating it as an independent source + file in its own right. + +`-n' +`--no-parser' + Pretend that `%no-parser' was specified. *Note Decl Summary::. + +`-k' +`--token-table' + Pretend that `%token-table' was specified. *Note Decl Summary::. + +Adjust the output: + +`-d' +`--defines' + Pretend that `%defines' was specified, i.e., write an extra output + file containing macro definitions for the token type names defined + in the grammar and the semantic value type `YYSTYPE', as well as a + few `extern' variable declarations. *Note Decl Summary::. + +`--defines=DEFINES-FILE' + Same as above, but save in the file DEFINES-FILE. + +`-b FILE-PREFIX' +`--file-prefix=PREFIX' + Pretend that `%verbose' was specified, i.e, specify prefix to use + for all Bison output file names. *Note Decl Summary::. + +`-r THINGS' +`--report=THINGS' + Write an extra output file containing verbose description of the + comma separated list of THINGS among: + + `state' + Description of the grammar, conflicts (resolved and + unresolved), and LALR automaton. + + `lookahead' + Implies `state' and augments the description of the automaton + with each rule's lookahead set. + + `itemset' + Implies `state' and augments the description of the automaton + with the full set of items for each state, instead of its + core only. + + For instance, on the following grammar + +`-v' +`--verbose' + Pretend that `%verbose' was specified, i.e, write an extra output + file containing verbose descriptions of the grammar and parser. + *Note Decl Summary::. + +`-o FILENAME' +`--output=FILENAME' + Specify the FILENAME for the parser file. + + The other output files' names are constructed from FILENAME as + described under the `-v' and `-d' options. + +`-g' + Output a VCG definition of the LALR(1) grammar automaton computed + by Bison. If the grammar file is `foo.y', the VCG output file will + be `foo.vcg'. + +`--graph=GRAPH-FILE' + The behavior of -GRAPH is the same than `-g'. The only difference + is that it has an optional argument which is the name of the + output graph filename. + + +File: bison.info, Node: Option Cross Key, Next: Yacc Library, Prev: Bison Options, Up: Invocation + +9.2 Option Cross Key +==================== + +Here is a list of options, alphabetized by long option, to help you find +the corresponding short option. + + --debug -t + --defines=DEFINES-FILE -d + --file-prefix=PREFIX -b FILE-PREFIX + --graph=GRAPH-FILE -d + --help -h + --name-prefix=PREFIX -p NAME-PREFIX + --no-lines -l + --no-parser -n + --output=OUTFILE -o OUTFILE + --token-table -k + --verbose -v + --version -V + --yacc -y + + +File: bison.info, Node: Yacc Library, Prev: Option Cross Key, Up: Invocation + +9.3 Yacc Library +================ + +The Yacc library contains default implementations of the `yyerror' and +`main' functions. These default implementations are normally not +useful, but POSIX requires them. To use the Yacc library, link your +program with the `-ly' option. Note that Bison's implementation of the +Yacc library is distributed under the terms of the GNU General Public +License (*note Copying::). + + If you use the Yacc library's `yyerror' function, you should declare +`yyerror' as follows: + + int yyerror (char const *); + + Bison ignores the `int' value returned by this `yyerror'. If you +use the Yacc library's `main' function, your `yyparse' function should +have the following type signature: + + int yyparse (void); + + +File: bison.info, Node: FAQ, Next: Copying This Manual, Prev: Glossary, Up: Top + +10 Frequently Asked Questions +***************************** + +Several questions about Bison come up occasionally. Here some of them +are addressed. + +* Menu: + +* Parser Stack Overflow:: Breaking the Stack Limits +* How Can I Reset the Parser:: `yyparse' Keeps some State +* Strings are Destroyed:: `yylval' Loses Track of Strings +* C++ Parsers:: Compiling Parsers with C++ Compilers +* Implementing Loops:: Control Flow in the Calculator + + +File: bison.info, Node: Parser Stack Overflow, Next: How Can I Reset the Parser, Up: FAQ + +10.1 Parser Stack Overflow +========================== + + My parser returns with error with a `parser stack overflow' + message. What can I do? + + This question is already addressed elsewhere, *Note Recursive Rules: +Recursion. + + +File: bison.info, Node: How Can I Reset the Parser, Next: Strings are Destroyed, Prev: Parser Stack Overflow, Up: FAQ + +10.2 How Can I Reset the Parser +=============================== + +The following phenomenon has several symptoms, resulting in the +following typical questions: + + I invoke `yyparse' several times, and on correct input it works + properly; but when a parse error is found, all the other calls fail + too. How can I reset the error flag of `yyparse'? + +or + + My parser includes support for an `#include'-like feature, in + which case I run `yyparse' from `yyparse'. This fails + although I did specify I needed a `%pure-parser'. + + These problems typically come not from Bison itself, but from +Lex-generated scanners. Because these scanners use large buffers for +speed, they might not notice a change of input file. As a +demonstration, consider the following source file, `first-line.l': + + +%{ +#include +#include +%} +%% +.*\n ECHO; return 1; +%% +int +yyparse (char const *file) +{ + yyin = fopen (file, "r"); + if (!yyin) + exit (2); + /* One token only. */ + yylex (); + if (fclose (yyin) != 0) + exit (3); + return 0; +} + +int +main (void) +{ + yyparse ("input"); + yyparse ("input"); + return 0; +} + +If the file `input' contains + + +input:1: Hello, +input:2: World! + +then instead of getting the first line twice, you get: + + $ flex -ofirst-line.c first-line.l + $ gcc -ofirst-line first-line.c -ll + $ ./first-line + input:1: Hello, + input:2: World! + + Therefore, whenever you change `yyin', you must tell the +Lex-generated scanner to discard its current buffer and switch to the +new one. This depends upon your implementation of Lex; see its +documentation for more. For Flex, it suffices to call +`YY_FLUSH_BUFFER' after each change to `yyin'. If your Flex-generated +scanner needs to read from several input streams to handle features +like include files, you might consider using Flex functions like +`yy_switch_to_buffer' that manipulate multiple input buffers. + + If your Flex-generated scanner uses start conditions (*note Start +conditions: (flex)Start conditions.), you might also want to reset the +scanner's state, i.e., go back to the initial start condition, through +a call to `BEGIN (0)'. + + +File: bison.info, Node: Strings are Destroyed, Next: C++ Parsers, Prev: How Can I Reset the Parser, Up: FAQ + +10.3 Strings are Destroyed +========================== + + My parser seems to destroy old strings, or maybe it loses track of + them. Instead of reporting `"foo", "bar"', it reports + `"bar", "bar"', or even `"foo\nbar", "bar"'. + + This error is probably the single most frequent "bug report" sent to +Bison lists, but is only concerned with a misunderstanding of the role +of scanner. Consider the following Lex code: + + +%{ +#include +char *yylval = NULL; +%} +%% +.* yylval = yytext; return 1; +\n /* IGNORE */ +%% +int +main () +{ + /* Similar to using $1, $2 in a Bison action. */ + char *fst = (yylex (), yylval); + char *snd = (yylex (), yylval); + printf ("\"%s\", \"%s\"\n", fst, snd); + return 0; +} + + If you compile and run this code, you get: + + $ flex -osplit-lines.c split-lines.l + $ gcc -osplit-lines split-lines.c -ll + $ printf 'one\ntwo\n' | ./split-lines + "one + two", "two" + +this is because `yytext' is a buffer provided for _reading_ in the +action, but if you want to keep it, you have to duplicate it (e.g., +using `strdup'). Note that the output may depend on how your +implementation of Lex handles `yytext'. For instance, when given the +Lex compatibility option `-l' (which triggers the option `%array') Flex +generates a different behavior: + + $ flex -l -osplit-lines.c split-lines.l + $ gcc -osplit-lines split-lines.c -ll + $ printf 'one\ntwo\n' | ./split-lines + "two", "two" + + +File: bison.info, Node: C++ Parsers, Next: Implementing Loops, Prev: Strings are Destroyed, Up: FAQ + +10.4 C++ Parsers +================ + + How can I generate parsers in C++? + + We are working on a C++ output for Bison, but unfortunately, for lack +of time, the skeleton is not finished. It is functional, but in +numerous respects, it will require additional work which _might_ break +backward compatibility. Since the skeleton for C++ is not documented, +we do not consider ourselves bound to this interface, nevertheless, as +much as possible we will try to keep compatibility. + + Another possibility is to use the regular C parsers, and to compile +them with a C++ compiler. This works properly, provided that you bear +some simple C++ rules in mind, such as not including "real classes" +(i.e., structure with constructors) in unions. Therefore, in the +`%union', use pointers to classes, or better yet, a single pointer type +to the root of your lexical/syntactic hierarchy. + + +File: bison.info, Node: Implementing Loops, Prev: C++ Parsers, Up: FAQ + +10.5 Implementing Loops +======================= + + My simple calculator supports variables, assignments, and functions, + but how can I implement loops? + + Although very pedagogical, the examples included in the document blur +the distinction to make between the parser--whose job is to recover the +structure of a text and to transmit it to subsequent modules of the +program--and the processing (such as the execution) of this structure. +This works well with so called straight line programs, i.e., precisely +those that have a straightforward execution model: execute simple +instructions one after the others. + + If you want a richer model, you will probably need to use the parser +to construct a tree that does represent the structure it has recovered; +this tree is usually called the "abstract syntax tree", or "AST" for +short. Then, walking through this tree, traversing it in various ways, +will enable treatments such as its execution or its translation, which +will result in an interpreter or a compiler. + + This topic is way beyond the scope of this manual, and the reader is +invited to consult the dedicated literature. + + +File: bison.info, Node: Table of Symbols, Next: Glossary, Prev: Invocation, Up: Top + +Appendix A Bison Symbols +************************ + + -- Variable: @$ + In an action, the location of the left-hand side of the rule. + *Note Locations Overview: Locations. + + -- Variable: @N + In an action, the location of the N-th symbol of the right-hand + side of the rule. *Note Locations Overview: Locations. + + -- Variable: $$ + In an action, the semantic value of the left-hand side of the rule. + *Note Actions::. + + -- Variable: $N + In an action, the semantic value of the N-th symbol of the + right-hand side of the rule. *Note Actions::. + + -- Symbol: $accept + The predefined nonterminal whose only rule is `$accept: START + $end', where START is the start symbol. *Note The Start-Symbol: + Start Decl. It cannot be used in the grammar. + + -- Symbol: $end + The predefined token marking the end of the token stream. It + cannot be used in the grammar. + + -- Symbol: $undefined + The predefined token onto which all undefined values returned by + `yylex' are mapped. It cannot be used in the grammar, rather, use + `error'. + + -- Symbol: error + A token name reserved for error recovery. This token may be used + in grammar rules so as to allow the Bison parser to recognize an + error in the grammar without halting the process. In effect, a + sentence containing an error may be recognized as valid. On a + syntax error, the token `error' becomes the current look-ahead + token. Actions corresponding to `error' are then executed, and + the look-ahead token is reset to the token that originally caused + the violation. *Note Error Recovery::. + + -- Macro: YYABORT + Macro to pretend that an unrecoverable syntax error has occurred, + by making `yyparse' return 1 immediately. The error reporting + function `yyerror' is not called. *Note The Parser Function + `yyparse': Parser Function. + + -- Macro: YYACCEPT + Macro to pretend that a complete utterance of the language has been + read, by making `yyparse' return 0 immediately. *Note The Parser + Function `yyparse': Parser Function. + + -- Macro: YYBACKUP + Macro to discard a value from the parser stack and fake a + look-ahead token. *Note Special Features for Use in Actions: + Action Features. + + -- Macro: YYDEBUG + Macro to define to equip the parser with tracing code. *Note + Tracing Your Parser: Tracing. + + -- Macro: YYERROR + Macro to pretend that a syntax error has just been detected: call + `yyerror' and then perform normal error recovery if possible + (*note Error Recovery::), or (if recovery is impossible) make + `yyparse' return 1. *Note Error Recovery::. + + -- Macro: YYERROR_VERBOSE + An obsolete macro that you define with `#define' in the prologue + to request verbose, specific error message strings when `yyerror' + is called. It doesn't matter what definition you use for + `YYERROR_VERBOSE', just whether you define it. Using + `%error-verbose' is preferred. + + -- Macro: YYINITDEPTH + Macro for specifying the initial size of the parser stack. *Note + Stack Overflow::. + + -- Macro: YYLEX_PARAM + An obsolete macro for specifying an extra argument (or list of + extra arguments) for `yyparse' to pass to `yylex'. he use of this + macro is deprecated, and is supported only for Yacc like parsers. + *Note Calling Conventions for Pure Parsers: Pure Calling. + + -- Type: YYLTYPE + Data type of `yylloc'; by default, a structure with four members. + *Note Data Types of Locations: Location Type. + + -- Macro: YYMAXDEPTH + Macro for specifying the maximum size of the parser stack. *Note + Stack Overflow::. + + -- Macro: YYPARSE_PARAM + An obsolete macro for specifying the name of a parameter that + `yyparse' should accept. The use of this macro is deprecated, and + is supported only for Yacc like parsers. *Note Calling + Conventions for Pure Parsers: Pure Calling. + + -- Macro: YYRECOVERING + Macro whose value indicates whether the parser is recovering from a + syntax error. *Note Special Features for Use in Actions: Action + Features. + + -- Macro: YYSTACK_USE_ALLOCA + Macro used to control the use of `alloca'. If defined to `0', the + parser will not use `alloca' but `malloc' when trying to grow its + internal stacks. Do _not_ define `YYSTACK_USE_ALLOCA' to anything + else. + + -- Type: YYSTYPE + Data type of semantic values; `int' by default. *Note Data Types + of Semantic Values: Value Type. + + -- Variable: yychar + External integer variable that contains the integer value of the + current look-ahead token. (In a pure parser, it is a local + variable within `yyparse'.) Error-recovery rule actions may + examine this variable. *Note Special Features for Use in Actions: + Action Features. + + -- Variable: yyclearin + Macro used in error-recovery rule actions. It clears the previous + look-ahead token. *Note Error Recovery::. + + -- Variable: yydebug + External integer variable set to zero by default. If `yydebug' is + given a nonzero value, the parser will output information on input + symbols and parser action. *Note Tracing Your Parser: Tracing. + + -- Macro: yyerrok + Macro to cause parser to recover immediately to its normal mode + after a syntax error. *Note Error Recovery::. + + -- Function: yyerror + User-supplied function to be called by `yyparse' on error. *Note + The Error Reporting Function `yyerror': Error Reporting. + + -- Function: yylex + User-supplied lexical analyzer function, called with no arguments + to get the next token. *Note The Lexical Analyzer Function + `yylex': Lexical. + + -- Variable: yylval + External variable in which `yylex' should place the semantic value + associated with a token. (In a pure parser, it is a local + variable within `yyparse', and its address is passed to `yylex'.) + *Note Semantic Values of Tokens: Token Values. + + -- Variable: yylloc + External variable in which `yylex' should place the line and column + numbers associated with a token. (In a pure parser, it is a local + variable within `yyparse', and its address is passed to `yylex'.) + You can ignore this variable if you don't use the `@' feature in + the grammar actions. *Note Textual Locations of Tokens: Token + Locations. + + -- Variable: yynerrs + Global variable which Bison increments each time there is a syntax + error. (In a pure parser, it is a local variable within + `yyparse'.) *Note The Error Reporting Function `yyerror': Error + Reporting. + + -- Function: yyparse + The parser function produced by Bison; call this function to start + parsing. *Note The Parser Function `yyparse': Parser Function. + + -- Directive: %debug + Equip the parser for debugging. *Note Decl Summary::. + + -- Directive: %defines + Bison declaration to create a header file meant for the scanner. + *Note Decl Summary::. + + -- Directive: %destructor + Specifying how the parser should reclaim the memory associated to + discarded symbols. *Note Freeing Discarded Symbols: Destructor + Decl. + + -- Directive: %dprec + Bison declaration to assign a precedence to a rule that is used at + parse time to resolve reduce/reduce conflicts. *Note Writing GLR + Parsers: GLR Parsers. + + -- Directive: %error-verbose + Bison declaration to request verbose, specific error message + strings when `yyerror' is called. + + -- Directive: %file-prefix="PREFIX" + Bison declaration to set the prefix of the output files. *Note + Decl Summary::. + + -- Directive: %glr-parser + Bison declaration to produce a GLR parser. *Note Writing GLR + Parsers: GLR Parsers. + + -- Directive: %left + Bison declaration to assign left associativity to token(s). *Note + Operator Precedence: Precedence Decl. + + -- Directive: %lex-param {ARGUMENT-DECLARATION} + Bison declaration to specifying an additional parameter that + `yylex' should accept. *Note Calling Conventions for Pure + Parsers: Pure Calling. + + -- Directive: %merge + Bison declaration to assign a merging function to a rule. If + there is a reduce/reduce conflict with a rule having the same + merging function, the function is applied to the two semantic + values to get a single result. *Note Writing GLR Parsers: GLR + Parsers. + + -- Directive: %name-prefix="PREFIX" + Bison declaration to rename the external symbols. *Note Decl + Summary::. + + -- Directive: %no-lines + Bison declaration to avoid generating `#line' directives in the + parser file. *Note Decl Summary::. + + -- Directive: %nonassoc + Bison declaration to assign non-associativity to token(s). *Note + Operator Precedence: Precedence Decl. + + -- Directive: %output="FILENAME" + Bison declaration to set the name of the parser file. *Note Decl + Summary::. + + -- Directive: %parse-param {ARGUMENT-DECLARATION} + Bison declaration to specifying an additional parameter that + `yyparse' should accept. *Note The Parser Function `yyparse': + Parser Function. + + -- Directive: %prec + Bison declaration to assign a precedence to a specific rule. + *Note Context-Dependent Precedence: Contextual Precedence. + + -- Directive: %pure-parser + Bison declaration to request a pure (reentrant) parser. *Note A + Pure (Reentrant) Parser: Pure Decl. + + -- Directive: %right + Bison declaration to assign right associativity to token(s). + *Note Operator Precedence: Precedence Decl. + + -- Directive: %start + Bison declaration to specify the start symbol. *Note The + Start-Symbol: Start Decl. + + -- Directive: %token + Bison declaration to declare token(s) without specifying + precedence. *Note Token Type Names: Token Decl. + + -- Directive: %token-table + Bison declaration to include a token name table in the parser file. + *Note Decl Summary::. + + -- Directive: %type + Bison declaration to declare nonterminals. *Note Nonterminal + Symbols: Type Decl. + + -- Directive: %union + Bison declaration to specify several possible data types for + semantic values. *Note The Collection of Value Types: Union Decl. + + + These are the punctuation and delimiters used in Bison input: + + -- Delimiter: %% + Delimiter used to separate the grammar rule section from the Bison + declarations section or the epilogue. *Note The Overall Layout of + a Bison Grammar: Grammar Layout. + + -- Delimiter: %{CODE%} + All code listed between `%{' and `%}' is copied directly to the + output file uninterpreted. Such code forms the prologue of the + input file. *Note Outline of a Bison Grammar: Grammar Outline. + + -- Construct: /*...*/ + Comment delimiters, as in C. + + -- Delimiter: : + Separates a rule's result from its components. *Note Syntax of + Grammar Rules: Rules. + + -- Delimiter: ; + Terminates a rule. *Note Syntax of Grammar Rules: Rules. + + -- Delimiter: | + Separates alternate rules for the same result nonterminal. *Note + Syntax of Grammar Rules: Rules. + + +File: bison.info, Node: Glossary, Next: FAQ, Prev: Table of Symbols, Up: Top + +Appendix B Glossary +******************* + +Backus-Naur Form (BNF; also called "Backus Normal Form") + Formal method of specifying context-free grammars originally + proposed by John Backus, and slightly improved by Peter Naur in + his 1960-01-02 committee document contributing to what became the + Algol 60 report. *Note Languages and Context-Free Grammars: + Language and Grammar. + +Context-free grammars + Grammars specified as rules that can be applied regardless of + context. Thus, if there is a rule which says that an integer can + be used as an expression, integers are allowed _anywhere_ an + expression is permitted. *Note Languages and Context-Free + Grammars: Language and Grammar. + +Dynamic allocation + Allocation of memory that occurs during execution, rather than at + compile time or on entry to a function. + +Empty string + Analogous to the empty set in set theory, the empty string is a + character string of length zero. + +Finite-state stack machine + A "machine" that has discrete states in which it is said to exist + at each instant in time. As input to the machine is processed, the + machine moves from state to state as specified by the logic of the + machine. In the case of the parser, the input is the language + being parsed, and the states correspond to various stages in the + grammar rules. *Note The Bison Parser Algorithm: Algorithm. + +Generalized LR (GLR) + A parsing algorithm that can handle all context-free grammars, + including those that are not LALR(1). It resolves situations that + Bison's usual LALR(1) algorithm cannot by effectively splitting + off multiple parsers, trying all possible parsers, and discarding + those that fail in the light of additional right context. *Note + Generalized LR Parsing: Generalized LR Parsing. + +Grouping + A language construct that is (in general) grammatically divisible; + for example, `expression' or `declaration' in C. *Note Languages + and Context-Free Grammars: Language and Grammar. + +Infix operator + An arithmetic operator that is placed between the operands on + which it performs some operation. + +Input stream + A continuous flow of data between devices or programs. + +Language construct + One of the typical usage schemas of the language. For example, + one of the constructs of the C language is the `if' statement. + *Note Languages and Context-Free Grammars: Language and Grammar. + +Left associativity + Operators having left associativity are analyzed from left to + right: `a+b+c' first computes `a+b' and then combines with `c'. + *Note Operator Precedence: Precedence. + +Left recursion + A rule whose result symbol is also its first component symbol; for + example, `expseq1 : expseq1 ',' exp;'. *Note Recursive Rules: + Recursion. + +Left-to-right parsing + Parsing a sentence of a language by analyzing it token by token + from left to right. *Note The Bison Parser Algorithm: Algorithm. + +Lexical analyzer (scanner) + A function that reads an input stream and returns tokens one by + one. *Note The Lexical Analyzer Function `yylex': Lexical. + +Lexical tie-in + A flag, set by actions in the grammar rules, which alters the way + tokens are parsed. *Note Lexical Tie-ins::. + +Literal string token + A token which consists of two or more fixed characters. *Note + Symbols::. + +Look-ahead token + A token already read but not yet shifted. *Note Look-Ahead + Tokens: Look-Ahead. + +LALR(1) + The class of context-free grammars that Bison (like most other + parser generators) can handle; a subset of LR(1). *Note + Mysterious Reduce/Reduce Conflicts: Mystery Conflicts. + +LR(1) + The class of context-free grammars in which at most one token of + look-ahead is needed to disambiguate the parsing of any piece of + input. + +Nonterminal symbol + A grammar symbol standing for a grammatical construct that can be + expressed through rules in terms of smaller constructs; in other + words, a construct that is not a token. *Note Symbols::. + +Parser + A function that recognizes valid sentences of a language by + analyzing the syntax structure of a set of tokens passed to it + from a lexical analyzer. + +Postfix operator + An arithmetic operator that is placed after the operands upon + which it performs some operation. + +Reduction + Replacing a string of nonterminals and/or terminals with a single + nonterminal, according to a grammar rule. *Note The Bison Parser + Algorithm: Algorithm. + +Reentrant + A reentrant subprogram is a subprogram which can be in invoked any + number of times in parallel, without interference between the + various invocations. *Note A Pure (Reentrant) Parser: Pure Decl. + +Reverse polish notation + A language in which all operators are postfix operators. + +Right recursion + A rule whose result symbol is also its last component symbol; for + example, `expseq1: exp ',' expseq1;'. *Note Recursive Rules: + Recursion. + +Semantics + In computer languages, the semantics are specified by the actions + taken for each instance of the language, i.e., the meaning of each + statement. *Note Defining Language Semantics: Semantics. + +Shift + A parser is said to shift when it makes the choice of analyzing + further input from the stream rather than reducing immediately some + already-recognized rule. *Note The Bison Parser Algorithm: + Algorithm. + +Single-character literal + A single character that is recognized and interpreted as is. + *Note From Formal Rules to Bison Input: Grammar in Bison. + +Start symbol + The nonterminal symbol that stands for a complete valid utterance + in the language being parsed. The start symbol is usually listed + as the first nonterminal symbol in a language specification. + *Note The Start-Symbol: Start Decl. + +Symbol table + A data structure where symbol names and associated data are stored + during parsing to allow for recognition and use of existing + information in repeated uses of a symbol. *Note Multi-function + Calc::. + +Syntax error + An error encountered during parsing of an input stream due to + invalid syntax. *Note Error Recovery::. + +Token + A basic, grammatically indivisible unit of a language. The symbol + that describes a token in the grammar is a terminal symbol. The + input of the Bison parser is a stream of tokens which comes from + the lexical analyzer. *Note Symbols::. + +Terminal symbol + A grammar symbol that has no rules in the grammar and therefore is + grammatically indivisible. The piece of text it represents is a + token. *Note Languages and Context-Free Grammars: Language and + Grammar. + + +File: bison.info, Node: Copying This Manual, Next: Index, Prev: FAQ, Up: Top + +Appendix C Copying This Manual +****************************** + +* Menu: + +* GNU Free Documentation License:: License for copying this manual. + + +File: bison.info, Node: GNU Free Documentation License, Up: Copying This Manual + +C.1 GNU Free Documentation License +================================== + + Version 1.2, November 2002 + + Copyright (C) 2000,2001,2002 Free Software Foundation, Inc. + 59 Temple Place, Suite 330, Boston, MA 02111-1307, USA + + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + 0. PREAMBLE + + The purpose of this License is to make a manual, textbook, or other + functional and useful document "free" in the sense of freedom: to + assure everyone the effective freedom to copy and redistribute it, + with or without modifying it, either commercially or + noncommercially. Secondarily, this License preserves for the + author and publisher a way to get credit for their work, while not + being considered responsible for modifications made by others. + + This License is a kind of "copyleft", which means that derivative + works of the document must themselves be free in the same sense. + It complements the GNU General Public License, which is a copyleft + license designed for free software. + + We have designed this License in order to use it for manuals for + free software, because free software needs free documentation: a + free program should come with manuals providing the same freedoms + that the software does. But this License is not limited to + software manuals; it can be used for any textual work, regardless + of subject matter or whether it is published as a printed book. + We recommend this License principally for works whose purpose is + instruction or reference. + + 1. APPLICABILITY AND DEFINITIONS + + This License applies to any manual or other work, in any medium, + that contains a notice placed by the copyright holder saying it + can be distributed under the terms of this License. Such a notice + grants a world-wide, royalty-free license, unlimited in duration, + to use that work under the conditions stated herein. The + "Document", below, refers to any such manual or work. Any member + of the public is a licensee, and is addressed as "you". You + accept the license if you copy, modify or distribute the work in a + way requiring permission under copyright law. + + A "Modified Version" of the Document means any work containing the + Document or a portion of it, either copied verbatim, or with + modifications and/or translated into another language. + + A "Secondary Section" is a named appendix or a front-matter section + of the Document that deals exclusively with the relationship of the + publishers or authors of the Document to the Document's overall + subject (or to related matters) and contains nothing that could + fall directly within that overall subject. (Thus, if the Document + is in part a textbook of mathematics, a Secondary Section may not + explain any mathematics.) The relationship could be a matter of + historical connection with the subject or with related matters, or + of legal, commercial, philosophical, ethical or political position + regarding them. + + The "Invariant Sections" are certain Secondary Sections whose + titles are designated, as being those of Invariant Sections, in + the notice that says that the Document is released under this + License. If a section does not fit the above definition of + Secondary then it is not allowed to be designated as Invariant. + The Document may contain zero Invariant Sections. If the Document + does not identify any Invariant Sections then there are none. + + The "Cover Texts" are certain short passages of text that are + listed, as Front-Cover Texts or Back-Cover Texts, in the notice + that says that the Document is released under this License. A + Front-Cover Text may be at most 5 words, and a Back-Cover Text may + be at most 25 words. + + A "Transparent" copy of the Document means a machine-readable copy, + represented in a format whose specification is available to the + general public, that is suitable for revising the document + straightforwardly with generic text editors or (for images + composed of pixels) generic paint programs or (for drawings) some + widely available drawing editor, and that is suitable for input to + text formatters or for automatic translation to a variety of + formats suitable for input to text formatters. A copy made in an + otherwise Transparent file format whose markup, or absence of + markup, has been arranged to thwart or discourage subsequent + modification by readers is not Transparent. An image format is + not Transparent if used for any substantial amount of text. A + copy that is not "Transparent" is called "Opaque". + + Examples of suitable formats for Transparent copies include plain + ASCII without markup, Texinfo input format, LaTeX input format, + SGML or XML using a publicly available DTD, and + standard-conforming simple HTML, PostScript or PDF designed for + human modification. Examples of transparent image formats include + PNG, XCF and JPG. Opaque formats include proprietary formats that + can be read and edited only by proprietary word processors, SGML or + XML for which the DTD and/or processing tools are not generally + available, and the machine-generated HTML, PostScript or PDF + produced by some word processors for output purposes only. + + The "Title Page" means, for a printed book, the title page itself, + plus such following pages as are needed to hold, legibly, the + material this License requires to appear in the title page. For + works in formats which do not have any title page as such, "Title + Page" means the text near the most prominent appearance of the + work's title, preceding the beginning of the body of the text. + + A section "Entitled XYZ" means a named subunit of the Document + whose title either is precisely XYZ or contains XYZ in parentheses + following text that translates XYZ in another language. (Here XYZ + stands for a specific section name mentioned below, such as + "Acknowledgements", "Dedications", "Endorsements", or "History".) + To "Preserve the Title" of such a section when you modify the + Document means that it remains a section "Entitled XYZ" according + to this definition. + + The Document may include Warranty Disclaimers next to the notice + which states that this License applies to the Document. These + Warranty Disclaimers are considered to be included by reference in + this License, but only as regards disclaiming warranties: any other + implication that these Warranty Disclaimers may have is void and + has no effect on the meaning of this License. + + 2. VERBATIM COPYING + + You may copy and distribute the Document in any medium, either + commercially or noncommercially, provided that this License, the + copyright notices, and the license notice saying this License + applies to the Document are reproduced in all copies, and that you + add no other conditions whatsoever to those of this License. You + may not use technical measures to obstruct or control the reading + or further copying of the copies you make or distribute. However, + you may accept compensation in exchange for copies. If you + distribute a large enough number of copies you must also follow + the conditions in section 3. + + You may also lend copies, under the same conditions stated above, + and you may publicly display copies. + + 3. COPYING IN QUANTITY + + If you publish printed copies (or copies in media that commonly + have printed covers) of the Document, numbering more than 100, and + the Document's license notice requires Cover Texts, you must + enclose the copies in covers that carry, clearly and legibly, all + these Cover Texts: Front-Cover Texts on the front cover, and + Back-Cover Texts on the back cover. Both covers must also clearly + and legibly identify you as the publisher of these copies. The + front cover must present the full title with all words of the + title equally prominent and visible. You may add other material + on the covers in addition. Copying with changes limited to the + covers, as long as they preserve the title of the Document and + satisfy these conditions, can be treated as verbatim copying in + other respects. + + If the required texts for either cover are too voluminous to fit + legibly, you should put the first ones listed (as many as fit + reasonably) on the actual cover, and continue the rest onto + adjacent pages. + + If you publish or distribute Opaque copies of the Document + numbering more than 100, you must either include a + machine-readable Transparent copy along with each Opaque copy, or + state in or with each Opaque copy a computer-network location from + which the general network-using public has access to download + using public-standard network protocols a complete Transparent + copy of the Document, free of added material. If you use the + latter option, you must take reasonably prudent steps, when you + begin distribution of Opaque copies in quantity, to ensure that + this Transparent copy will remain thus accessible at the stated + location until at least one year after the last time you + distribute an Opaque copy (directly or through your agents or + retailers) of that edition to the public. + + It is requested, but not required, that you contact the authors of + the Document well before redistributing any large number of + copies, to give them a chance to provide you with an updated + version of the Document. + + 4. MODIFICATIONS + + You may copy and distribute a Modified Version of the Document + under the conditions of sections 2 and 3 above, provided that you + release the Modified Version under precisely this License, with + the Modified Version filling the role of the Document, thus + licensing distribution and modification of the Modified Version to + whoever possesses a copy of it. In addition, you must do these + things in the Modified Version: + + A. Use in the Title Page (and on the covers, if any) a title + distinct from that of the Document, and from those of + previous versions (which should, if there were any, be listed + in the History section of the Document). You may use the + same title as a previous version if the original publisher of + that version gives permission. + + B. List on the Title Page, as authors, one or more persons or + entities responsible for authorship of the modifications in + the Modified Version, together with at least five of the + principal authors of the Document (all of its principal + authors, if it has fewer than five), unless they release you + from this requirement. + + C. State on the Title page the name of the publisher of the + Modified Version, as the publisher. + + D. Preserve all the copyright notices of the Document. + + E. Add an appropriate copyright notice for your modifications + adjacent to the other copyright notices. + + F. Include, immediately after the copyright notices, a license + notice giving the public permission to use the Modified + Version under the terms of this License, in the form shown in + the Addendum below. + + G. Preserve in that license notice the full lists of Invariant + Sections and required Cover Texts given in the Document's + license notice. + + H. Include an unaltered copy of this License. + + I. Preserve the section Entitled "History", Preserve its Title, + and add to it an item stating at least the title, year, new + authors, and publisher of the Modified Version as given on + the Title Page. If there is no section Entitled "History" in + the Document, create one stating the title, year, authors, + and publisher of the Document as given on its Title Page, + then add an item describing the Modified Version as stated in + the previous sentence. + + J. Preserve the network location, if any, given in the Document + for public access to a Transparent copy of the Document, and + likewise the network locations given in the Document for + previous versions it was based on. These may be placed in + the "History" section. You may omit a network location for a + work that was published at least four years before the + Document itself, or if the original publisher of the version + it refers to gives permission. + + K. For any section Entitled "Acknowledgements" or "Dedications", + Preserve the Title of the section, and preserve in the + section all the substance and tone of each of the contributor + acknowledgements and/or dedications given therein. + + L. Preserve all the Invariant Sections of the Document, + unaltered in their text and in their titles. Section numbers + or the equivalent are not considered part of the section + titles. + + M. Delete any section Entitled "Endorsements". Such a section + may not be included in the Modified Version. + + N. Do not retitle any existing section to be Entitled + "Endorsements" or to conflict in title with any Invariant + Section. + + O. Preserve any Warranty Disclaimers. + + If the Modified Version includes new front-matter sections or + appendices that qualify as Secondary Sections and contain no + material copied from the Document, you may at your option + designate some or all of these sections as invariant. To do this, + add their titles to the list of Invariant Sections in the Modified + Version's license notice. These titles must be distinct from any + other section titles. + + You may add a section Entitled "Endorsements", provided it contains + nothing but endorsements of your Modified Version by various + parties--for example, statements of peer review or that the text + has been approved by an organization as the authoritative + definition of a standard. + + You may add a passage of up to five words as a Front-Cover Text, + and a passage of up to 25 words as a Back-Cover Text, to the end + of the list of Cover Texts in the Modified Version. Only one + passage of Front-Cover Text and one of Back-Cover Text may be + added by (or through arrangements made by) any one entity. If the + Document already includes a cover text for the same cover, + previously added by you or by arrangement made by the same entity + you are acting on behalf of, you may not add another; but you may + replace the old one, on explicit permission from the previous + publisher that added the old one. + + The author(s) and publisher(s) of the Document do not by this + License give permission to use their names for publicity for or to + assert or imply endorsement of any Modified Version. + + 5. COMBINING DOCUMENTS + + You may combine the Document with other documents released under + this License, under the terms defined in section 4 above for + modified versions, provided that you include in the combination + all of the Invariant Sections of all of the original documents, + unmodified, and list them all as Invariant Sections of your + combined work in its license notice, and that you preserve all + their Warranty Disclaimers. + + The combined work need only contain one copy of this License, and + multiple identical Invariant Sections may be replaced with a single + copy. If there are multiple Invariant Sections with the same name + but different contents, make the title of each such section unique + by adding at the end of it, in parentheses, the name of the + original author or publisher of that section if known, or else a + unique number. Make the same adjustment to the section titles in + the list of Invariant Sections in the license notice of the + combined work. + + In the combination, you must combine any sections Entitled + "History" in the various original documents, forming one section + Entitled "History"; likewise combine any sections Entitled + "Acknowledgements", and any sections Entitled "Dedications". You + must delete all sections Entitled "Endorsements." + + 6. COLLECTIONS OF DOCUMENTS + + You may make a collection consisting of the Document and other + documents released under this License, and replace the individual + copies of this License in the various documents with a single copy + that is included in the collection, provided that you follow the + rules of this License for verbatim copying of each of the + documents in all other respects. + + You may extract a single document from such a collection, and + distribute it individually under this License, provided you insert + a copy of this License into the extracted document, and follow + this License in all other respects regarding verbatim copying of + that document. + + 7. AGGREGATION WITH INDEPENDENT WORKS + + A compilation of the Document or its derivatives with other + separate and independent documents or works, in or on a volume of + a storage or distribution medium, is called an "aggregate" if the + copyright resulting from the compilation is not used to limit the + legal rights of the compilation's users beyond what the individual + works permit. When the Document is included in an aggregate, this + License does not apply to the other works in the aggregate which + are not themselves derivative works of the Document. + + If the Cover Text requirement of section 3 is applicable to these + copies of the Document, then if the Document is less than one half + of the entire aggregate, the Document's Cover Texts may be placed + on covers that bracket the Document within the aggregate, or the + electronic equivalent of covers if the Document is in electronic + form. Otherwise they must appear on printed covers that bracket + the whole aggregate. + + 8. TRANSLATION + + Translation is considered a kind of modification, so you may + distribute translations of the Document under the terms of section + 4. Replacing Invariant Sections with translations requires special + permission from their copyright holders, but you may include + translations of some or all Invariant Sections in addition to the + original versions of these Invariant Sections. You may include a + translation of this License, and all the license notices in the + Document, and any Warranty Disclaimers, provided that you also + include the original English version of this License and the + original versions of those notices and disclaimers. In case of a + disagreement between the translation and the original version of + this License or a notice or disclaimer, the original version will + prevail. + + If a section in the Document is Entitled "Acknowledgements", + "Dedications", or "History", the requirement (section 4) to + Preserve its Title (section 1) will typically require changing the + actual title. + + 9. TERMINATION + + You may not copy, modify, sublicense, or distribute the Document + except as expressly provided for under this License. Any other + attempt to copy, modify, sublicense or distribute the Document is + void, and will automatically terminate your rights under this + License. However, parties who have received copies, or rights, + from you under this License will not have their licenses + terminated so long as such parties remain in full compliance. + + 10. FUTURE REVISIONS OF THIS LICENSE + + The Free Software Foundation may publish new, revised versions of + the GNU Free Documentation License from time to time. Such new + versions will be similar in spirit to the present version, but may + differ in detail to address new problems or concerns. See + `http://www.gnu.org/copyleft/'. + + Each version of the License is given a distinguishing version + number. If the Document specifies that a particular numbered + version of this License "or any later version" applies to it, you + have the option of following the terms and conditions either of + that specified version or of any later version that has been + published (not as a draft) by the Free Software Foundation. If + the Document does not specify a version number of this License, + you may choose any version ever published (not as a draft) by the + Free Software Foundation. + +C.1.1 ADDENDUM: How to use this License for your documents +---------------------------------------------------------- + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and license +notices just after the title page: + + Copyright (C) YEAR YOUR NAME. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.2 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. + A copy of the license is included in the section entitled ``GNU + Free Documentation License''. + + If you have Invariant Sections, Front-Cover Texts and Back-Cover +Texts, replace the "with...Texts." line with this: + + with the Invariant Sections being LIST THEIR TITLES, with + the Front-Cover Texts being LIST, and with the Back-Cover Texts + being LIST. + + If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + + If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, to +permit their use in free software. + + +File: bison.info, Node: Index, Prev: Copying This Manual, Up: Top + +Index +***** + +[index] +* Menu: + +* $ <1>: Table of Symbols. (line 19) +* $: Action Features. (line 14) +* $$ <1>: Table of Symbols. (line 15) +* $$ <2>: Action Features. (line 10) +* $$: Actions. (line 6) +* $<: Action Features. (line 18) +* $accept: Table of Symbols. (line 23) +* $end: Table of Symbols. (line 28) +* $N: Actions. (line 6) +* $undefined: Table of Symbols. (line 32) +* %: Table of Symbols. (line 278) +* %%: Table of Symbols. (line 273) +* %debug <1>: Table of Symbols. (line 172) +* %debug <2>: Tracing. (line 23) +* %debug: Decl Summary. (line 46) +* %defines <1>: Table of Symbols. (line 175) +* %defines: Decl Summary. (line 51) +* %destructor <1>: Table of Symbols. (line 179) +* %destructor <2>: Decl Summary. (line 64) +* %destructor: Destructor Decl. (line 6) +* %dprec: Table of Symbols. (line 184) +* %error-verbose <1>: Table of Symbols. (line 189) +* %error-verbose: Error Reporting. (line 17) +* %expect <1>: Decl Summary. (line 38) +* %expect: Expect Decl. (line 6) +* %expect-rr: Expect Decl. (line 6) +* %file-prefix=" <1>: Table of Symbols. (line 193) +* %file-prefix=": Decl Summary. (line 69) +* %glr-parser <1>: Table of Symbols. (line 197) +* %glr-parser: GLR Parsers. (line 6) +* %left <1>: Table of Symbols. (line 201) +* %left <2>: Using Precedence. (line 6) +* %left: Decl Summary. (line 21) +* %lex-param <1>: Table of Symbols. (line 205) +* %lex-param: Pure Calling. (line 31) +* %locations: Decl Summary. (line 73) +* %merge: Table of Symbols. (line 210) +* %name-prefix=" <1>: Table of Symbols. (line 217) +* %name-prefix=": Decl Summary. (line 80) +* %no-lines <1>: Table of Symbols. (line 221) +* %no-lines: Decl Summary. (line 98) +* %no-parser: Decl Summary. (line 89) +* %nonassoc <1>: Table of Symbols. (line 225) +* %nonassoc <2>: Using Precedence. (line 6) +* %nonassoc: Decl Summary. (line 25) +* %output=" <1>: Table of Symbols. (line 229) +* %output=": Decl Summary. (line 106) +* %parse-param <1>: Table of Symbols. (line 233) +* %parse-param: Parser Function. (line 32) +* %prec <1>: Table of Symbols. (line 238) +* %prec: Contextual Precedence. + (line 6) +* %pure-parser <1>: Table of Symbols. (line 242) +* %pure-parser <2>: Decl Summary. (line 109) +* %pure-parser: Pure Decl. (line 6) +* %right <1>: Table of Symbols. (line 246) +* %right <2>: Using Precedence. (line 6) +* %right: Decl Summary. (line 17) +* %start <1>: Table of Symbols. (line 250) +* %start <2>: Decl Summary. (line 34) +* %start: Start Decl. (line 6) +* %token <1>: Table of Symbols. (line 254) +* %token <2>: Decl Summary. (line 13) +* %token: Token Decl. (line 6) +* %token-table <1>: Table of Symbols. (line 258) +* %token-table: Decl Summary. (line 113) +* %type <1>: Table of Symbols. (line 262) +* %type <2>: Decl Summary. (line 30) +* %type: Type Decl. (line 6) +* %union <1>: Table of Symbols. (line 266) +* %union <2>: Decl Summary. (line 9) +* %union: Union Decl. (line 6) +* %verbose: Decl Summary. (line 147) +* %yacc: Decl Summary. (line 153) +* /*: Table of Symbols. (line 283) +* :: Table of Symbols. (line 286) +* ;: Table of Symbols. (line 290) +* @$ <1>: Table of Symbols. (line 7) +* @$ <2>: Action Features. (line 80) +* @$: Actions and Locations. + (line 6) +* @N <1>: Table of Symbols. (line 11) +* @N <2>: Action Features. (line 86) +* @N: Actions and Locations. + (line 6) +* abstract syntax tree: Implementing Loops. (line 17) +* action: Actions. (line 6) +* action data types: Action Types. (line 6) +* action features summary: Action Features. (line 6) +* actions in mid-rule: Mid-Rule Actions. (line 6) +* actions, location: Actions and Locations. + (line 6) +* actions, semantic: Semantic Actions. (line 6) +* additional C code section: Epilogue. (line 6) +* algorithm of parser: Algorithm. (line 6) +* ambiguous grammars <1>: Generalized LR Parsing. + (line 6) +* ambiguous grammars: Language and Grammar. + (line 33) +* associativity: Why Precedence. (line 33) +* AST: Implementing Loops. (line 17) +* Backus-Naur form: Language and Grammar. + (line 16) +* Bison declaration summary: Decl Summary. (line 6) +* Bison declarations: Declarations. (line 6) +* Bison declarations (introduction): Bison Declarations. (line 6) +* Bison grammar: Grammar in Bison. (line 6) +* Bison invocation: Invocation. (line 6) +* Bison parser: Bison Parser. (line 6) +* Bison parser algorithm: Algorithm. (line 6) +* Bison symbols, table of: Table of Symbols. (line 6) +* Bison utility: Bison Parser. (line 6) +* BNF: Language and Grammar. + (line 16) +* C code, section for additional: Epilogue. (line 6) +* C-language interface: Interface. (line 6) +* calc: Infix Calc. (line 6) +* calculator, infix notation: Infix Calc. (line 6) +* calculator, location tracking: Location Tracking Calc. + (line 6) +* calculator, multi-function: Multi-function Calc. (line 6) +* calculator, simple: RPN Calc. (line 6) +* character token: Symbols. (line 31) +* compiling the parser: Rpcalc Compile. (line 6) +* conflicts <1>: Shift/Reduce. (line 6) +* conflicts: GLR Parsers. (line 6) +* conflicts, reduce/reduce: Reduce/Reduce. (line 6) +* conflicts, suppressing warnings of: Expect Decl. (line 6) +* context-dependent precedence: Contextual Precedence. + (line 6) +* context-free grammar: Language and Grammar. + (line 6) +* controlling function: Rpcalc Main. (line 6) +* core, item set: Understanding. (line 129) +* dangling else: Shift/Reduce. (line 6) +* data type of locations: Location Type. (line 6) +* data types in actions: Action Types. (line 6) +* data types of semantic values: Value Type. (line 6) +* debugging: Tracing. (line 6) +* declaration summary: Decl Summary. (line 6) +* declarations: Prologue. (line 6) +* declarations section: Prologue. (line 6) +* declarations, Bison: Declarations. (line 6) +* declarations, Bison (introduction): Bison Declarations. (line 6) +* declaring literal string tokens: Token Decl. (line 6) +* declaring operator precedence: Precedence Decl. (line 6) +* declaring the start symbol: Start Decl. (line 6) +* declaring token type names: Token Decl. (line 6) +* declaring value types: Union Decl. (line 6) +* declaring value types, nonterminals: Type Decl. (line 6) +* default action: Actions. (line 56) +* default data type: Value Type. (line 6) +* default location type: Location Type. (line 6) +* default stack limit: Stack Overflow. (line 27) +* default start symbol: Start Decl. (line 6) +* defining language semantics: Semantics. (line 6) +* else, dangling: Shift/Reduce. (line 6) +* epilogue: Epilogue. (line 6) +* error <1>: Table of Symbols. (line 37) +* error: Error Recovery. (line 20) +* error recovery: Error Recovery. (line 6) +* error recovery, simple: Simple Error Recovery. + (line 6) +* error reporting function: Error Reporting. (line 6) +* error reporting routine: Rpcalc Error. (line 6) +* examples, simple: Examples. (line 6) +* exercises: Exercises. (line 6) +* FDL, GNU Free Documentation License: GNU Free Documentation License. + (line 6) +* file format: Grammar Layout. (line 6) +* finite-state machine: Parser States. (line 6) +* formal grammar: Grammar in Bison. (line 6) +* format of grammar file: Grammar Layout. (line 6) +* freeing discarded symbols: Destructor Decl. (line 6) +* frequently asked questions: FAQ. (line 6) +* generalized LR (GLR) parsing <1>: Generalized LR Parsing. + (line 6) +* generalized LR (GLR) parsing <2>: GLR Parsers. (line 6) +* generalized LR (GLR) parsing: Language and Grammar. + (line 33) +* glossary: Glossary. (line 6) +* GLR parsers and inline: GLR Parsers. (line 150) +* GLR parsing <1>: Generalized LR Parsing. + (line 6) +* GLR parsing <2>: GLR Parsers. (line 6) +* GLR parsing: Language and Grammar. + (line 33) +* grammar file: Grammar Layout. (line 6) +* grammar rule syntax: Rules. (line 6) +* grammar rules section: Grammar Rules. (line 6) +* grammar, Bison: Grammar in Bison. (line 6) +* grammar, context-free: Language and Grammar. + (line 6) +* grouping, syntactic: Language and Grammar. + (line 47) +* incline: GLR Parsers. (line 150) +* infix notation calculator: Infix Calc. (line 6) +* interface: Interface. (line 6) +* introduction: Introduction. (line 6) +* invoking Bison: Invocation. (line 6) +* item: Understanding. (line 107) +* item set core: Understanding. (line 129) +* kernel, item set: Understanding. (line 129) +* LALR(1): Mystery Conflicts. (line 36) +* LALR(1) grammars: Language and Grammar. + (line 22) +* language semantics, defining: Semantics. (line 6) +* layout of Bison grammar: Grammar Layout. (line 6) +* left recursion: Recursion. (line 16) +* lex-param: Pure Calling. (line 31) +* lexical analyzer: Lexical. (line 6) +* lexical analyzer, purpose: Bison Parser. (line 6) +* lexical analyzer, writing: Rpcalc Lexer. (line 6) +* lexical tie-in: Lexical Tie-ins. (line 6) +* literal string token: Symbols. (line 53) +* literal token: Symbols. (line 31) +* location <1>: Locations. (line 6) +* location: Locations Overview. (line 6) +* location actions: Actions and Locations. + (line 6) +* location tracking calculator: Location Tracking Calc. + (line 6) +* location, textual <1>: Locations. (line 6) +* location, textual: Locations Overview. (line 6) +* look-ahead token: Look-Ahead. (line 6) +* LR(1): Mystery Conflicts. (line 36) +* LR(1) grammars: Language and Grammar. + (line 22) +* ltcalc: Location Tracking Calc. + (line 6) +* main function in simple example: Rpcalc Main. (line 6) +* mfcalc: Multi-function Calc. (line 6) +* mid-rule actions: Mid-Rule Actions. (line 6) +* multi-function calculator: Multi-function Calc. (line 6) +* multicharacter literal: Symbols. (line 53) +* mutual recursion: Recursion. (line 32) +* non-deterministic parsing <1>: Generalized LR Parsing. + (line 6) +* non-deterministic parsing: Language and Grammar. + (line 33) +* nonterminal symbol: Symbols. (line 6) +* nonterminal, useless: Understanding. (line 62) +* operator precedence: Precedence. (line 6) +* operator precedence, declaring: Precedence Decl. (line 6) +* options for invoking Bison: Invocation. (line 6) +* overflow of parser stack: Stack Overflow. (line 6) +* parse error: Error Reporting. (line 6) +* parser: Bison Parser. (line 6) +* parser stack: Algorithm. (line 6) +* parser stack overflow: Stack Overflow. (line 6) +* parser state: Parser States. (line 6) +* pointed rule: Understanding. (line 107) +* polish notation calculator: RPN Calc. (line 6) +* precedence declarations: Precedence Decl. (line 6) +* precedence of operators: Precedence. (line 6) +* precedence, context-dependent: Contextual Precedence. + (line 6) +* precedence, unary operator: Contextual Precedence. + (line 6) +* preventing warnings about conflicts: Expect Decl. (line 6) +* Prologue: Prologue. (line 6) +* pure parser: Pure Decl. (line 6) +* questions: FAQ. (line 6) +* recovery from errors: Error Recovery. (line 6) +* recursive rule: Recursion. (line 6) +* reduce/reduce conflict: Reduce/Reduce. (line 6) +* reduction: Algorithm. (line 6) +* reentrant parser: Pure Decl. (line 6) +* reverse polish notation: RPN Calc. (line 6) +* right recursion: Recursion. (line 16) +* rpcalc: RPN Calc. (line 6) +* rule syntax: Rules. (line 6) +* rule, pointed: Understanding. (line 107) +* rule, useless: Understanding. (line 62) +* rules section for grammar: Grammar Rules. (line 6) +* running Bison (introduction): Rpcalc Gen. (line 6) +* semantic actions: Semantic Actions. (line 6) +* semantic value: Semantic Values. (line 6) +* semantic value type: Value Type. (line 6) +* shift/reduce conflicts <1>: Shift/Reduce. (line 6) +* shift/reduce conflicts: GLR Parsers. (line 6) +* shifting: Algorithm. (line 6) +* simple examples: Examples. (line 6) +* single-character literal: Symbols. (line 31) +* stack overflow: Stack Overflow. (line 6) +* stack, parser: Algorithm. (line 6) +* stages in using Bison: Stages. (line 6) +* start symbol: Language and Grammar. + (line 96) +* start symbol, declaring: Start Decl. (line 6) +* state (of parser): Parser States. (line 6) +* string token: Symbols. (line 53) +* summary, action features: Action Features. (line 6) +* summary, Bison declaration: Decl Summary. (line 6) +* suppressing conflict warnings: Expect Decl. (line 6) +* symbol: Symbols. (line 6) +* symbol table example: Mfcalc Symtab. (line 6) +* symbols (abstract): Language and Grammar. + (line 47) +* symbols in Bison, table of: Table of Symbols. (line 6) +* syntactic grouping: Language and Grammar. + (line 47) +* syntax error: Error Reporting. (line 6) +* syntax of grammar rules: Rules. (line 6) +* terminal symbol: Symbols. (line 6) +* textual location <1>: Locations. (line 6) +* textual location: Locations Overview. (line 6) +* token: Language and Grammar. + (line 47) +* token type: Symbols. (line 6) +* token type names, declaring: Token Decl. (line 6) +* token, useless: Understanding. (line 62) +* tracing the parser: Tracing. (line 6) +* unary operator precedence: Contextual Precedence. + (line 6) +* useless nonterminal: Understanding. (line 62) +* useless rule: Understanding. (line 62) +* useless token: Understanding. (line 62) +* using Bison: Stages. (line 6) +* value type, semantic: Value Type. (line 6) +* value types, declaring: Union Decl. (line 6) +* value types, nonterminals, declaring: Type Decl. (line 6) +* value, semantic: Semantic Values. (line 6) +* warnings, preventing: Expect Decl. (line 6) +* writing a lexical analyzer: Rpcalc Lexer. (line 6) +* YYABORT <1>: Table of Symbols. (line 47) +* YYABORT: Parser Function. (line 25) +* YYABORT;: Action Features. (line 28) +* YYACCEPT <1>: Table of Symbols. (line 53) +* YYACCEPT: Parser Function. (line 22) +* YYACCEPT;: Action Features. (line 32) +* YYBACKUP <1>: Table of Symbols. (line 58) +* YYBACKUP: Action Features. (line 36) +* yychar <1>: Table of Symbols. (line 119) +* yychar <2>: Look-Ahead. (line 47) +* yychar: Action Features. (line 65) +* yyclearin <1>: Table of Symbols. (line 126) +* yyclearin: Error Recovery. (line 97) +* yyclearin;: Action Features. (line 71) +* yydebug: Table of Symbols. (line 130) +* YYDEBUG <1>: Table of Symbols. (line 63) +* YYDEBUG: Tracing. (line 12) +* yydebug: Tracing. (line 6) +* YYEMPTY: Action Features. (line 49) +* yyerrok <1>: Table of Symbols. (line 135) +* yyerrok: Error Recovery. (line 92) +* yyerrok;: Action Features. (line 75) +* yyerror: Table of Symbols. (line 139) +* YYERROR <1>: Table of Symbols. (line 67) +* YYERROR: Action Features. (line 52) +* yyerror: Error Reporting. (line 6) +* YYERROR;: Action Features. (line 52) +* YYERROR_VERBOSE: Table of Symbols. (line 73) +* YYINITDEPTH <1>: Table of Symbols. (line 80) +* YYINITDEPTH: Stack Overflow. (line 29) +* yylex <1>: Table of Symbols. (line 143) +* yylex: Lexical. (line 6) +* YYLEX_PARAM: Table of Symbols. (line 84) +* yylloc <1>: Table of Symbols. (line 154) +* yylloc: Token Locations. (line 6) +* YYLLOC_DEFAULT: Location Default Action. + (line 6) +* YYLTYPE <1>: Table of Symbols. (line 90) +* YYLTYPE: Token Locations. (line 19) +* yylval <1>: Table of Symbols. (line 148) +* yylval: Token Values. (line 6) +* YYMAXDEPTH <1>: Table of Symbols. (line 94) +* YYMAXDEPTH: Stack Overflow. (line 14) +* yynerrs <1>: Table of Symbols. (line 162) +* yynerrs: Error Reporting. (line 88) +* yyparse <1>: Table of Symbols. (line 168) +* yyparse: Parser Function. (line 6) +* YYPARSE_PARAM: Table of Symbols. (line 98) +* YYPRINT: Tracing. (line 71) +* YYRECOVERING <1>: Table of Symbols. (line 104) +* YYRECOVERING <2>: Error Recovery. (line 108) +* YYRECOVERING: Action Features. (line 60) +* YYSTACK_USE_ALLOCA: Table of Symbols. (line 109) +* YYSTYPE: Table of Symbols. (line 115) +* | <1>: Table of Symbols. (line 293) +* |: Rules. (line 34) + + + +Tag Table: +Node: Top1104 +Node: Introduction10643 +Node: Conditions11916 +Node: Copying13805 +Node: Concepts32975 +Node: Language and Grammar34128 +Node: Grammar in Bison40019 +Node: Semantic Values41948 +Node: Semantic Actions44054 +Node: GLR Parsers45241 +Node: Locations Overview51439 +Node: Bison Parser52892 +Node: Stages55612 +Node: Grammar Layout56900 +Node: Examples58232 +Node: RPN Calc59431 +Node: Rpcalc Decls60410 +Node: Rpcalc Rules62331 +Node: Rpcalc Input64138 +Node: Rpcalc Line65613 +Node: Rpcalc Expr66741 +Node: Rpcalc Lexer68699 +Node: Rpcalc Main71286 +Node: Rpcalc Error71693 +Node: Rpcalc Gen72721 +Node: Rpcalc Compile73861 +Node: Infix Calc74735 +Node: Simple Error Recovery77498 +Node: Location Tracking Calc79393 +Node: Ltcalc Decls80080 +Node: Ltcalc Rules81033 +Node: Ltcalc Lexer83042 +Node: Multi-function Calc85365 +Node: Mfcalc Decl86937 +Node: Mfcalc Rules88976 +Node: Mfcalc Symtab90357 +Node: Exercises96533 +Node: Grammar File97047 +Node: Grammar Outline97896 +Node: Prologue98656 +Node: Bison Declarations99937 +Node: Grammar Rules100352 +Node: Epilogue100823 +Node: Symbols101839 +Node: Rules108544 +Node: Recursion110185 +Node: Semantics111903 +Node: Value Type113002 +Node: Multiple Types113669 +Node: Actions114699 +Node: Action Types118203 +Node: Mid-Rule Actions119515 +Node: Locations125089 +Node: Location Type125740 +Node: Actions and Locations126332 +Node: Location Default Action128592 +Node: Declarations131104 +Node: Token Decl132477 +Node: Precedence Decl134564 +Node: Union Decl136124 +Node: Type Decl137266 +Node: Destructor Decl138188 +Node: Expect Decl140312 +Node: Start Decl142340 +Node: Pure Decl142728 +Node: Decl Summary144414 +Node: Multiple Parsers150689 +Node: Interface152198 +Node: Parser Function153062 +Node: Lexical154899 +Node: Calling Convention156310 +Node: Token Values159187 +Node: Token Locations160352 +Node: Pure Calling161246 +Node: Error Reporting163101 +Node: Action Features167024 +Node: Algorithm170514 +Node: Look-Ahead172877 +Node: Shift/Reduce175009 +Node: Precedence177906 +Node: Why Precedence178562 +Node: Using Precedence180436 +Node: Precedence Examples181413 +Node: How Precedence182123 +Node: Contextual Precedence183282 +Node: Parser States185078 +Node: Reduce/Reduce186326 +Node: Mystery Conflicts189867 +Node: Generalized LR Parsing193260 +Node: Stack Overflow197878 +Node: Error Recovery199751 +Node: Context Dependency205049 +Node: Semantic Tokens205898 +Node: Lexical Tie-ins208915 +Node: Tie-in Recovery210492 +Node: Debugging212669 +Node: Understanding213335 +Node: Tracing224426 +Node: Invocation228510 +Node: Bison Options229877 +Node: Option Cross Key234139 +Node: Yacc Library235012 +Node: FAQ235837 +Node: Parser Stack Overflow236390 +Node: How Can I Reset the Parser236720 +Node: Strings are Destroyed239000 +Node: C++ Parsers240571 +Node: Implementing Loops241556 +Node: Table of Symbols242770 +Node: Glossary253936 +Node: Copying This Manual260821 +Node: GNU Free Documentation License261047 +Node: Index283454 + +End Tag Table diff --git a/src/apps/bin/bison/doc/bison.texinfo b/src/apps/bin/bison/doc/bison.texinfo new file mode 100644 index 0000000000..f01c638a88 --- /dev/null +++ b/src/apps/bin/bison/doc/bison.texinfo @@ -0,0 +1,7229 @@ +\input texinfo @c -*-texinfo-*- +@comment %**start of header +@setfilename bison.info +@include version.texi +@settitle Bison @value{VERSION} +@setchapternewpage odd + +@finalout + +@c SMALL BOOK version +@c This edition has been formatted so that you can format and print it in +@c the smallbook format. +@c @smallbook + +@c Set following if you have the new `shorttitlepage' command +@c @clear shorttitlepage-enabled +@c @set shorttitlepage-enabled + +@c Set following if you want to document %default-prec and %no-default-prec. +@c This feature is experimental and may change in future Bison versions. +@c @set defaultprec + +@c ISPELL CHECK: done, 14 Jan 1993 --bob + +@c Check COPYRIGHT dates. should be updated in the titlepage, ifinfo +@c titlepage; should NOT be changed in the GPL. --mew + +@c FIXME: I don't understand this `iftex'. Obsolete? --akim. +@iftex +@syncodeindex fn cp +@syncodeindex vr cp +@syncodeindex tp cp +@end iftex +@ifinfo +@synindex fn cp +@synindex vr cp +@synindex tp cp +@end ifinfo +@comment %**end of header + +@copying + +This manual is for @acronym{GNU} Bison (version @value{VERSION}, +@value{UPDATED}), the @acronym{GNU} parser generator. + +Copyright @copyright{} 1988, 1989, 1990, 1991, 1992, 1993, 1995, 1998, +1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + +@quotation +Permission is granted to copy, distribute and/or modify this document +under the terms of the @acronym{GNU} Free Documentation License, +Version 1.1 or any later version published by the Free Software +Foundation; with no Invariant Sections, with the Front-Cover texts +being ``A @acronym{GNU} Manual,'' and with the Back-Cover Texts as in +(a) below. A copy of the license is included in the section entitled +``@acronym{GNU} Free Documentation License.'' + +(a) The @acronym{FSF}'s Back-Cover Text is: ``You have freedom to copy +and modify this @acronym{GNU} Manual, like @acronym{GNU} software. +Copies published by the Free Software Foundation raise funds for +@acronym{GNU} development.'' +@end quotation +@end copying + +@dircategory GNU programming tools +@direntry +* bison: (bison). @acronym{GNU} parser generator (Yacc replacement). +@end direntry + +@ifset shorttitlepage-enabled +@shorttitlepage Bison +@end ifset +@titlepage +@title Bison +@subtitle The Yacc-compatible Parser Generator +@subtitle @value{UPDATED}, Bison Version @value{VERSION} + +@author by Charles Donnelly and Richard Stallman + +@page +@vskip 0pt plus 1filll +@insertcopying +@sp 2 +Published by the Free Software Foundation @* +59 Temple Place, Suite 330 @* +Boston, MA 02111-1307 USA @* +Printed copies are available from the Free Software Foundation.@* +@acronym{ISBN} 1-882114-44-2 +@sp 2 +Cover art by Etienne Suvasa. +@end titlepage + +@contents + +@ifnottex +@node Top +@top Bison +@insertcopying +@end ifnottex + +@menu +* Introduction:: +* Conditions:: +* Copying:: The @acronym{GNU} General Public License says + how you can copy and share Bison + +Tutorial sections: +* Concepts:: Basic concepts for understanding Bison. +* Examples:: Three simple explained examples of using Bison. + +Reference sections: +* Grammar File:: Writing Bison declarations and rules. +* Interface:: C-language interface to the parser function @code{yyparse}. +* Algorithm:: How the Bison parser works at run-time. +* Error Recovery:: Writing rules for error recovery. +* Context Dependency:: What to do if your language syntax is too + messy for Bison to handle straightforwardly. +* Debugging:: Understanding or debugging Bison parsers. +* Invocation:: How to run Bison (to produce the parser source file). +* Table of Symbols:: All the keywords of the Bison language are explained. +* Glossary:: Basic concepts are explained. +* FAQ:: Frequently Asked Questions +* Copying This Manual:: License for copying this manual. +* Index:: Cross-references to the text. + +@detailmenu + --- The Detailed Node Listing --- + +The Concepts of Bison + +* Language and Grammar:: Languages and context-free grammars, + as mathematical ideas. +* Grammar in Bison:: How we represent grammars for Bison's sake. +* Semantic Values:: Each token or syntactic grouping can have + a semantic value (the value of an integer, + the name of an identifier, etc.). +* Semantic Actions:: Each rule can have an action containing C code. +* GLR Parsers:: Writing parsers for general context-free languages +* Locations Overview:: Tracking Locations. +* Bison Parser:: What are Bison's input and output, + how is the output used? +* Stages:: Stages in writing and running Bison grammars. +* Grammar Layout:: Overall structure of a Bison grammar file. + +Examples + +* RPN Calc:: Reverse polish notation calculator; + a first example with no operator precedence. +* Infix Calc:: Infix (algebraic) notation calculator. + Operator precedence is introduced. +* Simple Error Recovery:: Continuing after syntax errors. +* Location Tracking Calc:: Demonstrating the use of @@@var{n} and @@$. +* Multi-function Calc:: Calculator with memory and trig functions. + It uses multiple data-types for semantic values. +* Exercises:: Ideas for improving the multi-function calculator. + +Reverse Polish Notation Calculator + +* Decls: Rpcalc Decls. Prologue (declarations) for rpcalc. +* Rules: Rpcalc Rules. Grammar Rules for rpcalc, with explanation. +* Lexer: Rpcalc Lexer. The lexical analyzer. +* Main: Rpcalc Main. The controlling function. +* Error: Rpcalc Error. The error reporting function. +* Gen: Rpcalc Gen. Running Bison on the grammar file. +* Comp: Rpcalc Compile. Run the C compiler on the output code. + +Grammar Rules for @code{rpcalc} + +* Rpcalc Input:: +* Rpcalc Line:: +* Rpcalc Expr:: + +Location Tracking Calculator: @code{ltcalc} + +* Decls: Ltcalc Decls. Bison and C declarations for ltcalc. +* Rules: Ltcalc Rules. Grammar rules for ltcalc, with explanations. +* Lexer: Ltcalc Lexer. The lexical analyzer. + +Multi-Function Calculator: @code{mfcalc} + +* Decl: Mfcalc Decl. Bison declarations for multi-function calculator. +* Rules: Mfcalc Rules. Grammar rules for the calculator. +* Symtab: Mfcalc Symtab. Symbol table management subroutines. + +Bison Grammar Files + +* Grammar Outline:: Overall layout of the grammar file. +* Symbols:: Terminal and nonterminal symbols. +* Rules:: How to write grammar rules. +* Recursion:: Writing recursive rules. +* Semantics:: Semantic values and actions. +* Locations:: Locations and actions. +* Declarations:: All kinds of Bison declarations are described here. +* Multiple Parsers:: Putting more than one Bison parser in one program. + +Outline of a Bison Grammar + +* Prologue:: Syntax and usage of the prologue. +* Bison Declarations:: Syntax and usage of the Bison declarations section. +* Grammar Rules:: Syntax and usage of the grammar rules section. +* Epilogue:: Syntax and usage of the epilogue. + +Defining Language Semantics + +* Value Type:: Specifying one data type for all semantic values. +* Multiple Types:: Specifying several alternative data types. +* Actions:: An action is the semantic definition of a grammar rule. +* Action Types:: Specifying data types for actions to operate on. +* Mid-Rule Actions:: Most actions go at the end of a rule. + This says when, why and how to use the exceptional + action in the middle of a rule. + +Tracking Locations + +* Location Type:: Specifying a data type for locations. +* Actions and Locations:: Using locations in actions. +* Location Default Action:: Defining a general way to compute locations. + +Bison Declarations + +* Token Decl:: Declaring terminal symbols. +* Precedence Decl:: Declaring terminals with precedence and associativity. +* Union Decl:: Declaring the set of all semantic value types. +* Type Decl:: Declaring the choice of type for a nonterminal symbol. +* Destructor Decl:: Declaring how symbols are freed. +* Expect Decl:: Suppressing warnings about parsing conflicts. +* Start Decl:: Specifying the start symbol. +* Pure Decl:: Requesting a reentrant parser. +* Decl Summary:: Table of all Bison declarations. + +Parser C-Language Interface + +* Parser Function:: How to call @code{yyparse} and what it returns. +* Lexical:: You must supply a function @code{yylex} + which reads tokens. +* Error Reporting:: You must supply a function @code{yyerror}. +* Action Features:: Special features for use in actions. + +The Lexical Analyzer Function @code{yylex} + +* Calling Convention:: How @code{yyparse} calls @code{yylex}. +* Token Values:: How @code{yylex} must return the semantic value + of the token it has read. +* Token Locations:: How @code{yylex} must return the text location + (line number, etc.) of the token, if the + actions want that. +* Pure Calling:: How the calling convention differs + in a pure parser (@pxref{Pure Decl, ,A Pure (Reentrant) Parser}). + +The Bison Parser Algorithm + +* Look-Ahead:: Parser looks one token ahead when deciding what to do. +* Shift/Reduce:: Conflicts: when either shifting or reduction is valid. +* Precedence:: Operator precedence works by resolving conflicts. +* Contextual Precedence:: When an operator's precedence depends on context. +* Parser States:: The parser is a finite-state-machine with stack. +* Reduce/Reduce:: When two rules are applicable in the same situation. +* Mystery Conflicts:: Reduce/reduce conflicts that look unjustified. +* Generalized LR Parsing:: Parsing arbitrary context-free grammars. +* Stack Overflow:: What happens when stack gets full. How to avoid it. + +Operator Precedence + +* Why Precedence:: An example showing why precedence is needed. +* Using Precedence:: How to specify precedence in Bison grammars. +* Precedence Examples:: How these features are used in the previous example. +* How Precedence:: How they work. + +Handling Context Dependencies + +* Semantic Tokens:: Token parsing can depend on the semantic context. +* Lexical Tie-ins:: Token parsing can depend on the syntactic context. +* Tie-in Recovery:: Lexical tie-ins have implications for how + error recovery rules must be written. + +Debugging Your Parser + +* Understanding:: Understanding the structure of your parser. +* Tracing:: Tracing the execution of your parser. + +Invoking Bison + +* Bison Options:: All the options described in detail, + in alphabetical order by short options. +* Option Cross Key:: Alphabetical list of long options. +* Yacc Library:: Yacc-compatible @code{yylex} and @code{main}. + +Frequently Asked Questions + +* Parser Stack Overflow:: Breaking the Stack Limits +* How Can I Reset the Parser:: @code{yyparse} Keeps some State +* Strings are Destroyed:: @code{yylval} Loses Track of Strings +* C++ Parsers:: Compiling Parsers with C++ Compilers +* Implementing Loops:: Control Flow in the Calculator + +Copying This Manual + +* GNU Free Documentation License:: License for copying this manual. + +@end detailmenu +@end menu + +@node Introduction +@unnumbered Introduction +@cindex introduction + +@dfn{Bison} is a general-purpose parser generator that converts a +grammar description for an @acronym{LALR}(1) context-free grammar into a C +program to parse that grammar. Once you are proficient with Bison, +you may use it to develop a wide range of language parsers, from those +used in simple desk calculators to complex programming languages. + +Bison is upward compatible with Yacc: all properly-written Yacc grammars +ought to work with Bison with no change. Anyone familiar with Yacc +should be able to use Bison with little trouble. You need to be fluent in +C programming in order to use Bison or to understand this manual. + +We begin with tutorial chapters that explain the basic concepts of using +Bison and show three explained examples, each building on the last. If you +don't know Bison or Yacc, start by reading these chapters. Reference +chapters follow which describe specific aspects of Bison in detail. + +Bison was written primarily by Robert Corbett; Richard Stallman made it +Yacc-compatible. Wilfred Hansen of Carnegie Mellon University added +multi-character string literals and other features. + +This edition corresponds to version @value{VERSION} of Bison. + +@node Conditions +@unnumbered Conditions for Using Bison + +As of Bison version 1.24, we have changed the distribution terms for +@code{yyparse} to permit using Bison's output in nonfree programs when +Bison is generating C code for @acronym{LALR}(1) parsers. Formerly, these +parsers could be used only in programs that were free software. + +The other @acronym{GNU} programming tools, such as the @acronym{GNU} C +compiler, have never +had such a requirement. They could always be used for nonfree +software. The reason Bison was different was not due to a special +policy decision; it resulted from applying the usual General Public +License to all of the Bison source code. + +The output of the Bison utility---the Bison parser file---contains a +verbatim copy of a sizable piece of Bison, which is the code for the +@code{yyparse} function. (The actions from your grammar are inserted +into this function at one point, but the rest of the function is not +changed.) When we applied the @acronym{GPL} terms to the code for +@code{yyparse}, +the effect was to restrict the use of Bison output to free software. + +We didn't change the terms because of sympathy for people who want to +make software proprietary. @strong{Software should be free.} But we +concluded that limiting Bison's use to free software was doing little to +encourage people to make other software free. So we decided to make the +practical conditions for using Bison match the practical conditions for +using the other @acronym{GNU} tools. + +This exception applies only when Bison is generating C code for an +@acronym{LALR}(1) parser; otherwise, the @acronym{GPL} terms operate +as usual. You can +tell whether the exception applies to your @samp{.c} output file by +inspecting it to see whether it says ``As a special exception, when +this file is copied by Bison into a Bison output file, you may use +that output file without restriction.'' + +@include gpl.texi + +@node Concepts +@chapter The Concepts of Bison + +This chapter introduces many of the basic concepts without which the +details of Bison will not make sense. If you do not already know how to +use Bison or Yacc, we suggest you start by reading this chapter carefully. + +@menu +* Language and Grammar:: Languages and context-free grammars, + as mathematical ideas. +* Grammar in Bison:: How we represent grammars for Bison's sake. +* Semantic Values:: Each token or syntactic grouping can have + a semantic value (the value of an integer, + the name of an identifier, etc.). +* Semantic Actions:: Each rule can have an action containing C code. +* GLR Parsers:: Writing parsers for general context-free languages +* Locations Overview:: Tracking Locations. +* Bison Parser:: What are Bison's input and output, + how is the output used? +* Stages:: Stages in writing and running Bison grammars. +* Grammar Layout:: Overall structure of a Bison grammar file. +@end menu + +@node Language and Grammar +@section Languages and Context-Free Grammars + +@cindex context-free grammar +@cindex grammar, context-free +In order for Bison to parse a language, it must be described by a +@dfn{context-free grammar}. This means that you specify one or more +@dfn{syntactic groupings} and give rules for constructing them from their +parts. For example, in the C language, one kind of grouping is called an +`expression'. One rule for making an expression might be, ``An expression +can be made of a minus sign and another expression''. Another would be, +``An expression can be an integer''. As you can see, rules are often +recursive, but there must be at least one rule which leads out of the +recursion. + +@cindex @acronym{BNF} +@cindex Backus-Naur form +The most common formal system for presenting such rules for humans to read +is @dfn{Backus-Naur Form} or ``@acronym{BNF}'', which was developed in +order to specify the language Algol 60. Any grammar expressed in +@acronym{BNF} is a context-free grammar. The input to Bison is +essentially machine-readable @acronym{BNF}. + +@cindex @acronym{LALR}(1) grammars +@cindex @acronym{LR}(1) grammars +There are various important subclasses of context-free grammar. Although it +can handle almost all context-free grammars, Bison is optimized for what +are called @acronym{LALR}(1) grammars. +In brief, in these grammars, it must be possible to +tell how to parse any portion of an input string with just a single +token of look-ahead. Strictly speaking, that is a description of an +@acronym{LR}(1) grammar, and @acronym{LALR}(1) involves additional +restrictions that are +hard to explain simply; but it is rare in actual practice to find an +@acronym{LR}(1) grammar that fails to be @acronym{LALR}(1). +@xref{Mystery Conflicts, ,Mysterious Reduce/Reduce Conflicts}, for +more information on this. + +@cindex @acronym{GLR} parsing +@cindex generalized @acronym{LR} (@acronym{GLR}) parsing +@cindex ambiguous grammars +@cindex non-deterministic parsing + +Parsers for @acronym{LALR}(1) grammars are @dfn{deterministic}, meaning +roughly that the next grammar rule to apply at any point in the input is +uniquely determined by the preceding input and a fixed, finite portion +(called a @dfn{look-ahead}) of the remaining input. A context-free +grammar can be @dfn{ambiguous}, meaning that there are multiple ways to +apply the grammar rules to get the some inputs. Even unambiguous +grammars can be @dfn{non-deterministic}, meaning that no fixed +look-ahead always suffices to determine the next grammar rule to apply. +With the proper declarations, Bison is also able to parse these more +general context-free grammars, using a technique known as @acronym{GLR} +parsing (for Generalized @acronym{LR}). Bison's @acronym{GLR} parsers +are able to handle any context-free grammar for which the number of +possible parses of any given string is finite. + +@cindex symbols (abstract) +@cindex token +@cindex syntactic grouping +@cindex grouping, syntactic +In the formal grammatical rules for a language, each kind of syntactic +unit or grouping is named by a @dfn{symbol}. Those which are built by +grouping smaller constructs according to grammatical rules are called +@dfn{nonterminal symbols}; those which can't be subdivided are called +@dfn{terminal symbols} or @dfn{token types}. We call a piece of input +corresponding to a single terminal symbol a @dfn{token}, and a piece +corresponding to a single nonterminal symbol a @dfn{grouping}. + +We can use the C language as an example of what symbols, terminal and +nonterminal, mean. The tokens of C are identifiers, constants (numeric +and string), and the various keywords, arithmetic operators and +punctuation marks. So the terminal symbols of a grammar for C include +`identifier', `number', `string', plus one symbol for each keyword, +operator or punctuation mark: `if', `return', `const', `static', `int', +`char', `plus-sign', `open-brace', `close-brace', `comma' and many more. +(These tokens can be subdivided into characters, but that is a matter of +lexicography, not grammar.) + +Here is a simple C function subdivided into tokens: + +@ifinfo +@example +int /* @r{keyword `int'} */ +square (int x) /* @r{identifier, open-paren, identifier,} + @r{identifier, close-paren} */ +@{ /* @r{open-brace} */ + return x * x; /* @r{keyword `return', identifier, asterisk, + identifier, semicolon} */ +@} /* @r{close-brace} */ +@end example +@end ifinfo +@ifnotinfo +@example +int /* @r{keyword `int'} */ +square (int x) /* @r{identifier, open-paren, identifier, identifier, close-paren} */ +@{ /* @r{open-brace} */ + return x * x; /* @r{keyword `return', identifier, asterisk, identifier, semicolon} */ +@} /* @r{close-brace} */ +@end example +@end ifnotinfo + +The syntactic groupings of C include the expression, the statement, the +declaration, and the function definition. These are represented in the +grammar of C by nonterminal symbols `expression', `statement', +`declaration' and `function definition'. The full grammar uses dozens of +additional language constructs, each with its own nonterminal symbol, in +order to express the meanings of these four. The example above is a +function definition; it contains one declaration, and one statement. In +the statement, each @samp{x} is an expression and so is @samp{x * x}. + +Each nonterminal symbol must have grammatical rules showing how it is made +out of simpler constructs. For example, one kind of C statement is the +@code{return} statement; this would be described with a grammar rule which +reads informally as follows: + +@quotation +A `statement' can be made of a `return' keyword, an `expression' and a +`semicolon'. +@end quotation + +@noindent +There would be many other rules for `statement', one for each kind of +statement in C. + +@cindex start symbol +One nonterminal symbol must be distinguished as the special one which +defines a complete utterance in the language. It is called the @dfn{start +symbol}. In a compiler, this means a complete input program. In the C +language, the nonterminal symbol `sequence of definitions and declarations' +plays this role. + +For example, @samp{1 + 2} is a valid C expression---a valid part of a C +program---but it is not valid as an @emph{entire} C program. In the +context-free grammar of C, this follows from the fact that `expression' is +not the start symbol. + +The Bison parser reads a sequence of tokens as its input, and groups the +tokens using the grammar rules. If the input is valid, the end result is +that the entire token sequence reduces to a single grouping whose symbol is +the grammar's start symbol. If we use a grammar for C, the entire input +must be a `sequence of definitions and declarations'. If not, the parser +reports a syntax error. + +@node Grammar in Bison +@section From Formal Rules to Bison Input +@cindex Bison grammar +@cindex grammar, Bison +@cindex formal grammar + +A formal grammar is a mathematical construct. To define the language +for Bison, you must write a file expressing the grammar in Bison syntax: +a @dfn{Bison grammar} file. @xref{Grammar File, ,Bison Grammar Files}. + +A nonterminal symbol in the formal grammar is represented in Bison input +as an identifier, like an identifier in C@. By convention, it should be +in lower case, such as @code{expr}, @code{stmt} or @code{declaration}. + +The Bison representation for a terminal symbol is also called a @dfn{token +type}. Token types as well can be represented as C-like identifiers. By +convention, these identifiers should be upper case to distinguish them from +nonterminals: for example, @code{INTEGER}, @code{IDENTIFIER}, @code{IF} or +@code{RETURN}. A terminal symbol that stands for a particular keyword in +the language should be named after that keyword converted to upper case. +The terminal symbol @code{error} is reserved for error recovery. +@xref{Symbols}. + +A terminal symbol can also be represented as a character literal, just like +a C character constant. You should do this whenever a token is just a +single character (parenthesis, plus-sign, etc.): use that same character in +a literal as the terminal symbol for that token. + +A third way to represent a terminal symbol is with a C string constant +containing several characters. @xref{Symbols}, for more information. + +The grammar rules also have an expression in Bison syntax. For example, +here is the Bison rule for a C @code{return} statement. The semicolon in +quotes is a literal character token, representing part of the C syntax for +the statement; the naked semicolon, and the colon, are Bison punctuation +used in every rule. + +@example +stmt: RETURN expr ';' + ; +@end example + +@noindent +@xref{Rules, ,Syntax of Grammar Rules}. + +@node Semantic Values +@section Semantic Values +@cindex semantic value +@cindex value, semantic + +A formal grammar selects tokens only by their classifications: for example, +if a rule mentions the terminal symbol `integer constant', it means that +@emph{any} integer constant is grammatically valid in that position. The +precise value of the constant is irrelevant to how to parse the input: if +@samp{x+4} is grammatical then @samp{x+1} or @samp{x+3989} is equally +grammatical. + +But the precise value is very important for what the input means once it is +parsed. A compiler is useless if it fails to distinguish between 4, 1 and +3989 as constants in the program! Therefore, each token in a Bison grammar +has both a token type and a @dfn{semantic value}. @xref{Semantics, +,Defining Language Semantics}, +for details. + +The token type is a terminal symbol defined in the grammar, such as +@code{INTEGER}, @code{IDENTIFIER} or @code{','}. It tells everything +you need to know to decide where the token may validly appear and how to +group it with other tokens. The grammar rules know nothing about tokens +except their types. + +The semantic value has all the rest of the information about the +meaning of the token, such as the value of an integer, or the name of an +identifier. (A token such as @code{','} which is just punctuation doesn't +need to have any semantic value.) + +For example, an input token might be classified as token type +@code{INTEGER} and have the semantic value 4. Another input token might +have the same token type @code{INTEGER} but value 3989. When a grammar +rule says that @code{INTEGER} is allowed, either of these tokens is +acceptable because each is an @code{INTEGER}. When the parser accepts the +token, it keeps track of the token's semantic value. + +Each grouping can also have a semantic value as well as its nonterminal +symbol. For example, in a calculator, an expression typically has a +semantic value that is a number. In a compiler for a programming +language, an expression typically has a semantic value that is a tree +structure describing the meaning of the expression. + +@node Semantic Actions +@section Semantic Actions +@cindex semantic actions +@cindex actions, semantic + +In order to be useful, a program must do more than parse input; it must +also produce some output based on the input. In a Bison grammar, a grammar +rule can have an @dfn{action} made up of C statements. Each time the +parser recognizes a match for that rule, the action is executed. +@xref{Actions}. + +Most of the time, the purpose of an action is to compute the semantic value +of the whole construct from the semantic values of its parts. For example, +suppose we have a rule which says an expression can be the sum of two +expressions. When the parser recognizes such a sum, each of the +subexpressions has a semantic value which describes how it was built up. +The action for this rule should create a similar sort of value for the +newly recognized larger expression. + +For example, here is a rule that says an expression can be the sum of +two subexpressions: + +@example +expr: expr '+' expr @{ $$ = $1 + $3; @} + ; +@end example + +@noindent +The action says how to produce the semantic value of the sum expression +from the values of the two subexpressions. + +@node GLR Parsers +@section Writing @acronym{GLR} Parsers +@cindex @acronym{GLR} parsing +@cindex generalized @acronym{LR} (@acronym{GLR}) parsing +@findex %glr-parser +@cindex conflicts +@cindex shift/reduce conflicts + +In some grammars, there will be cases where Bison's standard +@acronym{LALR}(1) parsing algorithm cannot decide whether to apply a +certain grammar rule at a given point. That is, it may not be able to +decide (on the basis of the input read so far) which of two possible +reductions (applications of a grammar rule) applies, or whether to apply +a reduction or read more of the input and apply a reduction later in the +input. These are known respectively as @dfn{reduce/reduce} conflicts +(@pxref{Reduce/Reduce}), and @dfn{shift/reduce} conflicts +(@pxref{Shift/Reduce}). + +To use a grammar that is not easily modified to be @acronym{LALR}(1), a +more general parsing algorithm is sometimes necessary. If you include +@code{%glr-parser} among the Bison declarations in your file +(@pxref{Grammar Outline}), the result will be a Generalized @acronym{LR} +(@acronym{GLR}) parser. These parsers handle Bison grammars that +contain no unresolved conflicts (i.e., after applying precedence +declarations) identically to @acronym{LALR}(1) parsers. However, when +faced with unresolved shift/reduce and reduce/reduce conflicts, +@acronym{GLR} parsers use the simple expedient of doing both, +effectively cloning the parser to follow both possibilities. Each of +the resulting parsers can again split, so that at any given time, there +can be any number of possible parses being explored. The parsers +proceed in lockstep; that is, all of them consume (shift) a given input +symbol before any of them proceed to the next. Each of the cloned +parsers eventually meets one of two possible fates: either it runs into +a parsing error, in which case it simply vanishes, or it merges with +another parser, because the two of them have reduced the input to an +identical set of symbols. + +During the time that there are multiple parsers, semantic actions are +recorded, but not performed. When a parser disappears, its recorded +semantic actions disappear as well, and are never performed. When a +reduction makes two parsers identical, causing them to merge, Bison +records both sets of semantic actions. Whenever the last two parsers +merge, reverting to the single-parser case, Bison resolves all the +outstanding actions either by precedences given to the grammar rules +involved, or by performing both actions, and then calling a designated +user-defined function on the resulting values to produce an arbitrary +merged result. + +Let's consider an example, vastly simplified from a C++ grammar. + +@example +%@{ + #include + #define YYSTYPE char const * + int yylex (void); + void yyerror (char const *); +%@} + +%token TYPENAME ID + +%right '=' +%left '+' + +%glr-parser + +%% + +prog : + | prog stmt @{ printf ("\n"); @} + ; + +stmt : expr ';' %dprec 1 + | decl %dprec 2 + ; + +expr : ID @{ printf ("%s ", $$); @} + | TYPENAME '(' expr ')' + @{ printf ("%s ", $1); @} + | expr '+' expr @{ printf ("+ "); @} + | expr '=' expr @{ printf ("= "); @} + ; + +decl : TYPENAME declarator ';' + @{ printf ("%s ", $1); @} + | TYPENAME declarator '=' expr ';' + @{ printf ("%s ", $1); @} + ; + +declarator : ID @{ printf ("\"%s\" ", $1); @} + | '(' declarator ')' + ; +@end example + +@noindent +This models a problematic part of the C++ grammar---the ambiguity between +certain declarations and statements. For example, + +@example +T (x) = y+z; +@end example + +@noindent +parses as either an @code{expr} or a @code{stmt} +(assuming that @samp{T} is recognized as a @code{TYPENAME} and +@samp{x} as an @code{ID}). +Bison detects this as a reduce/reduce conflict between the rules +@code{expr : ID} and @code{declarator : ID}, which it cannot resolve at the +time it encounters @code{x} in the example above. The two @code{%dprec} +declarations, however, give precedence to interpreting the example as a +@code{decl}, which implies that @code{x} is a declarator. +The parser therefore prints + +@example +"x" y z + T +@end example + +Consider a different input string for this parser: + +@example +T (x) + y; +@end example + +@noindent +Here, there is no ambiguity (this cannot be parsed as a declaration). +However, at the time the Bison parser encounters @code{x}, it does not +have enough information to resolve the reduce/reduce conflict (again, +between @code{x} as an @code{expr} or a @code{declarator}). In this +case, no precedence declaration is used. Instead, the parser splits +into two, one assuming that @code{x} is an @code{expr}, and the other +assuming @code{x} is a @code{declarator}. The second of these parsers +then vanishes when it sees @code{+}, and the parser prints + +@example +x T y + +@end example + +Suppose that instead of resolving the ambiguity, you wanted to see all +the possibilities. For this purpose, we must @dfn{merge} the semantic +actions of the two possible parsers, rather than choosing one over the +other. To do so, you could change the declaration of @code{stmt} as +follows: + +@example +stmt : expr ';' %merge + | decl %merge + ; +@end example + +@noindent + +and define the @code{stmtMerge} function as: + +@example +static YYSTYPE +stmtMerge (YYSTYPE x0, YYSTYPE x1) +@{ + printf (" "); + return ""; +@} +@end example + +@noindent +with an accompanying forward declaration +in the C declarations at the beginning of the file: + +@example +%@{ + #define YYSTYPE char const * + static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1); +%@} +@end example + +@noindent +With these declarations, the resulting parser will parse the first example +as both an @code{expr} and a @code{decl}, and print + +@example +"x" y z + T x T y z + = +@end example + +@sp 1 + +@cindex @code{incline} +@cindex @acronym{GLR} parsers and @code{inline} +The @acronym{GLR} parsers require a compiler for @acronym{ISO} C89 or +later. In addition, they use the @code{inline} keyword, which is not +C89, but is C99 and is a common extension in pre-C99 compilers. It is +up to the user of these parsers to handle +portability issues. For instance, if using Autoconf and the Autoconf +macro @code{AC_C_INLINE}, a mere + +@example +%@{ + #include +%@} +@end example + +@noindent +will suffice. Otherwise, we suggest + +@example +%@{ + #if __STDC_VERSION__ < 199901 && ! defined __GNUC__ && ! defined inline + #define inline + #endif +%@} +@end example + +@node Locations Overview +@section Locations +@cindex location +@cindex textual location +@cindex location, textual + +Many applications, like interpreters or compilers, have to produce verbose +and useful error messages. To achieve this, one must be able to keep track of +the @dfn{textual location}, or @dfn{location}, of each syntactic construct. +Bison provides a mechanism for handling these locations. + +Each token has a semantic value. In a similar fashion, each token has an +associated location, but the type of locations is the same for all tokens and +groupings. Moreover, the output parser is equipped with a default data +structure for storing locations (@pxref{Locations}, for more details). + +Like semantic values, locations can be reached in actions using a dedicated +set of constructs. In the example above, the location of the whole grouping +is @code{@@$}, while the locations of the subexpressions are @code{@@1} and +@code{@@3}. + +When a rule is matched, a default action is used to compute the semantic value +of its left hand side (@pxref{Actions}). In the same way, another default +action is used for locations. However, the action for locations is general +enough for most cases, meaning there is usually no need to describe for each +rule how @code{@@$} should be formed. When building a new location for a given +grouping, the default behavior of the output parser is to take the beginning +of the first symbol, and the end of the last symbol. + +@node Bison Parser +@section Bison Output: the Parser File +@cindex Bison parser +@cindex Bison utility +@cindex lexical analyzer, purpose +@cindex parser + +When you run Bison, you give it a Bison grammar file as input. The output +is a C source file that parses the language described by the grammar. +This file is called a @dfn{Bison parser}. Keep in mind that the Bison +utility and the Bison parser are two distinct programs: the Bison utility +is a program whose output is the Bison parser that becomes part of your +program. + +The job of the Bison parser is to group tokens into groupings according to +the grammar rules---for example, to build identifiers and operators into +expressions. As it does this, it runs the actions for the grammar rules it +uses. + +The tokens come from a function called the @dfn{lexical analyzer} that +you must supply in some fashion (such as by writing it in C). The Bison +parser calls the lexical analyzer each time it wants a new token. It +doesn't know what is ``inside'' the tokens (though their semantic values +may reflect this). Typically the lexical analyzer makes the tokens by +parsing characters of text, but Bison does not depend on this. +@xref{Lexical, ,The Lexical Analyzer Function @code{yylex}}. + +The Bison parser file is C code which defines a function named +@code{yyparse} which implements that grammar. This function does not make +a complete C program: you must supply some additional functions. One is +the lexical analyzer. Another is an error-reporting function which the +parser calls to report an error. In addition, a complete C program must +start with a function called @code{main}; you have to provide this, and +arrange for it to call @code{yyparse} or the parser will never run. +@xref{Interface, ,Parser C-Language Interface}. + +Aside from the token type names and the symbols in the actions you +write, all symbols defined in the Bison parser file itself +begin with @samp{yy} or @samp{YY}. This includes interface functions +such as the lexical analyzer function @code{yylex}, the error reporting +function @code{yyerror} and the parser function @code{yyparse} itself. +This also includes numerous identifiers used for internal purposes. +Therefore, you should avoid using C identifiers starting with @samp{yy} +or @samp{YY} in the Bison grammar file except for the ones defined in +this manual. + +In some cases the Bison parser file includes system headers, and in +those cases your code should respect the identifiers reserved by those +headers. On some non-@acronym{GNU} hosts, @code{}, +@code{}, and @code{} are included as needed to +declare memory allocators and related types. Other system headers may +be included if you define @code{YYDEBUG} to a nonzero value +(@pxref{Tracing, ,Tracing Your Parser}). + +@node Stages +@section Stages in Using Bison +@cindex stages in using Bison +@cindex using Bison + +The actual language-design process using Bison, from grammar specification +to a working compiler or interpreter, has these parts: + +@enumerate +@item +Formally specify the grammar in a form recognized by Bison +(@pxref{Grammar File, ,Bison Grammar Files}). For each grammatical rule +in the language, describe the action that is to be taken when an +instance of that rule is recognized. The action is described by a +sequence of C statements. + +@item +Write a lexical analyzer to process input and pass tokens to the parser. +The lexical analyzer may be written by hand in C (@pxref{Lexical, ,The +Lexical Analyzer Function @code{yylex}}). It could also be produced +using Lex, but the use of Lex is not discussed in this manual. + +@item +Write a controlling function that calls the Bison-produced parser. + +@item +Write error-reporting routines. +@end enumerate + +To turn this source code as written into a runnable program, you +must follow these steps: + +@enumerate +@item +Run Bison on the grammar to produce the parser. + +@item +Compile the code output by Bison, as well as any other source files. + +@item +Link the object files to produce the finished product. +@end enumerate + +@node Grammar Layout +@section The Overall Layout of a Bison Grammar +@cindex grammar file +@cindex file format +@cindex format of grammar file +@cindex layout of Bison grammar + +The input file for the Bison utility is a @dfn{Bison grammar file}. The +general form of a Bison grammar file is as follows: + +@example +%@{ +@var{Prologue} +%@} + +@var{Bison declarations} + +%% +@var{Grammar rules} +%% +@var{Epilogue} +@end example + +@noindent +The @samp{%%}, @samp{%@{} and @samp{%@}} are punctuation that appears +in every Bison grammar file to separate the sections. + +The prologue may define types and variables used in the actions. You can +also use preprocessor commands to define macros used there, and use +@code{#include} to include header files that do any of these things. +You need to declare the lexical analyzer @code{yylex} and the error +printer @code{yyerror} here, along with any other global identifiers +used by the actions in the grammar rules. + +The Bison declarations declare the names of the terminal and nonterminal +symbols, and may also describe operator precedence and the data types of +semantic values of various symbols. + +The grammar rules define how to construct each nonterminal symbol from its +parts. + +The epilogue can contain any code you want to use. Often the +definitions of functions declared in the prologue go here. In a +simple program, all the rest of the program can go here. + +@node Examples +@chapter Examples +@cindex simple examples +@cindex examples, simple + +Now we show and explain three sample programs written using Bison: a +reverse polish notation calculator, an algebraic (infix) notation +calculator, and a multi-function calculator. All three have been tested +under BSD Unix 4.3; each produces a usable, though limited, interactive +desk-top calculator. + +These examples are simple, but Bison grammars for real programming +languages are written the same way. +@ifinfo +You can copy these examples out of the Info file and into a source file +to try them. +@end ifinfo + +@menu +* RPN Calc:: Reverse polish notation calculator; + a first example with no operator precedence. +* Infix Calc:: Infix (algebraic) notation calculator. + Operator precedence is introduced. +* Simple Error Recovery:: Continuing after syntax errors. +* Location Tracking Calc:: Demonstrating the use of @@@var{n} and @@$. +* Multi-function Calc:: Calculator with memory and trig functions. + It uses multiple data-types for semantic values. +* Exercises:: Ideas for improving the multi-function calculator. +@end menu + +@node RPN Calc +@section Reverse Polish Notation Calculator +@cindex reverse polish notation +@cindex polish notation calculator +@cindex @code{rpcalc} +@cindex calculator, simple + +The first example is that of a simple double-precision @dfn{reverse polish +notation} calculator (a calculator using postfix operators). This example +provides a good starting point, since operator precedence is not an issue. +The second example will illustrate how operator precedence is handled. + +The source code for this calculator is named @file{rpcalc.y}. The +@samp{.y} extension is a convention used for Bison input files. + +@menu +* Decls: Rpcalc Decls. Prologue (declarations) for rpcalc. +* Rules: Rpcalc Rules. Grammar Rules for rpcalc, with explanation. +* Lexer: Rpcalc Lexer. The lexical analyzer. +* Main: Rpcalc Main. The controlling function. +* Error: Rpcalc Error. The error reporting function. +* Gen: Rpcalc Gen. Running Bison on the grammar file. +* Comp: Rpcalc Compile. Run the C compiler on the output code. +@end menu + +@node Rpcalc Decls +@subsection Declarations for @code{rpcalc} + +Here are the C and Bison declarations for the reverse polish notation +calculator. As in C, comments are placed between @samp{/*@dots{}*/}. + +@example +/* Reverse polish notation calculator. */ + +%@{ + #define YYSTYPE double + #include + int yylex (void); + void yyerror (char const *); +%@} + +%token NUM + +%% /* Grammar rules and actions follow. */ +@end example + +The declarations section (@pxref{Prologue, , The prologue}) contains two +preprocessor directives and two forward declarations. + +The @code{#define} directive defines the macro @code{YYSTYPE}, thus +specifying the C data type for semantic values of both tokens and +groupings (@pxref{Value Type, ,Data Types of Semantic Values}). The +Bison parser will use whatever type @code{YYSTYPE} is defined as; if you +don't define it, @code{int} is the default. Because we specify +@code{double}, each token and each expression has an associated value, +which is a floating point number. + +The @code{#include} directive is used to declare the exponentiation +function @code{pow}. + +The forward declarations for @code{yylex} and @code{yyerror} are +needed because the C language requires that functions be declared +before they are used. These functions will be defined in the +epilogue, but the parser calls them so they must be declared in the +prologue. + +The second section, Bison declarations, provides information to Bison +about the token types (@pxref{Bison Declarations, ,The Bison +Declarations Section}). Each terminal symbol that is not a +single-character literal must be declared here. (Single-character +literals normally don't need to be declared.) In this example, all the +arithmetic operators are designated by single-character literals, so the +only terminal symbol that needs to be declared is @code{NUM}, the token +type for numeric constants. + +@node Rpcalc Rules +@subsection Grammar Rules for @code{rpcalc} + +Here are the grammar rules for the reverse polish notation calculator. + +@example +input: /* empty */ + | input line +; + +line: '\n' + | exp '\n' @{ printf ("\t%.10g\n", $1); @} +; + +exp: NUM @{ $$ = $1; @} + | exp exp '+' @{ $$ = $1 + $2; @} + | exp exp '-' @{ $$ = $1 - $2; @} + | exp exp '*' @{ $$ = $1 * $2; @} + | exp exp '/' @{ $$ = $1 / $2; @} + /* Exponentiation */ + | exp exp '^' @{ $$ = pow ($1, $2); @} + /* Unary minus */ + | exp 'n' @{ $$ = -$1; @} +; +%% +@end example + +The groupings of the rpcalc ``language'' defined here are the expression +(given the name @code{exp}), the line of input (@code{line}), and the +complete input transcript (@code{input}). Each of these nonterminal +symbols has several alternate rules, joined by the @samp{|} punctuator +which is read as ``or''. The following sections explain what these rules +mean. + +The semantics of the language is determined by the actions taken when a +grouping is recognized. The actions are the C code that appears inside +braces. @xref{Actions}. + +You must specify these actions in C, but Bison provides the means for +passing semantic values between the rules. In each action, the +pseudo-variable @code{$$} stands for the semantic value for the grouping +that the rule is going to construct. Assigning a value to @code{$$} is the +main job of most actions. The semantic values of the components of the +rule are referred to as @code{$1}, @code{$2}, and so on. + +@menu +* Rpcalc Input:: +* Rpcalc Line:: +* Rpcalc Expr:: +@end menu + +@node Rpcalc Input +@subsubsection Explanation of @code{input} + +Consider the definition of @code{input}: + +@example +input: /* empty */ + | input line +; +@end example + +This definition reads as follows: ``A complete input is either an empty +string, or a complete input followed by an input line''. Notice that +``complete input'' is defined in terms of itself. This definition is said +to be @dfn{left recursive} since @code{input} appears always as the +leftmost symbol in the sequence. @xref{Recursion, ,Recursive Rules}. + +The first alternative is empty because there are no symbols between the +colon and the first @samp{|}; this means that @code{input} can match an +empty string of input (no tokens). We write the rules this way because it +is legitimate to type @kbd{Ctrl-d} right after you start the calculator. +It's conventional to put an empty alternative first and write the comment +@samp{/* empty */} in it. + +The second alternate rule (@code{input line}) handles all nontrivial input. +It means, ``After reading any number of lines, read one more line if +possible.'' The left recursion makes this rule into a loop. Since the +first alternative matches empty input, the loop can be executed zero or +more times. + +The parser function @code{yyparse} continues to process input until a +grammatical error is seen or the lexical analyzer says there are no more +input tokens; we will arrange for the latter to happen at end-of-input. + +@node Rpcalc Line +@subsubsection Explanation of @code{line} + +Now consider the definition of @code{line}: + +@example +line: '\n' + | exp '\n' @{ printf ("\t%.10g\n", $1); @} +; +@end example + +The first alternative is a token which is a newline character; this means +that rpcalc accepts a blank line (and ignores it, since there is no +action). The second alternative is an expression followed by a newline. +This is the alternative that makes rpcalc useful. The semantic value of +the @code{exp} grouping is the value of @code{$1} because the @code{exp} in +question is the first symbol in the alternative. The action prints this +value, which is the result of the computation the user asked for. + +This action is unusual because it does not assign a value to @code{$$}. As +a consequence, the semantic value associated with the @code{line} is +uninitialized (its value will be unpredictable). This would be a bug if +that value were ever used, but we don't use it: once rpcalc has printed the +value of the user's input line, that value is no longer needed. + +@node Rpcalc Expr +@subsubsection Explanation of @code{expr} + +The @code{exp} grouping has several rules, one for each kind of expression. +The first rule handles the simplest expressions: those that are just numbers. +The second handles an addition-expression, which looks like two expressions +followed by a plus-sign. The third handles subtraction, and so on. + +@example +exp: NUM + | exp exp '+' @{ $$ = $1 + $2; @} + | exp exp '-' @{ $$ = $1 - $2; @} + @dots{} + ; +@end example + +We have used @samp{|} to join all the rules for @code{exp}, but we could +equally well have written them separately: + +@example +exp: NUM ; +exp: exp exp '+' @{ $$ = $1 + $2; @} ; +exp: exp exp '-' @{ $$ = $1 - $2; @} ; + @dots{} +@end example + +Most of the rules have actions that compute the value of the expression in +terms of the value of its parts. For example, in the rule for addition, +@code{$1} refers to the first component @code{exp} and @code{$2} refers to +the second one. The third component, @code{'+'}, has no meaningful +associated semantic value, but if it had one you could refer to it as +@code{$3}. When @code{yyparse} recognizes a sum expression using this +rule, the sum of the two subexpressions' values is produced as the value of +the entire expression. @xref{Actions}. + +You don't have to give an action for every rule. When a rule has no +action, Bison by default copies the value of @code{$1} into @code{$$}. +This is what happens in the first rule (the one that uses @code{NUM}). + +The formatting shown here is the recommended convention, but Bison does +not require it. You can add or change white space as much as you wish. +For example, this: + +@example +exp : NUM | exp exp '+' @{$$ = $1 + $2; @} | @dots{} +@end example + +@noindent +means the same thing as this: + +@example +exp: NUM + | exp exp '+' @{ $$ = $1 + $2; @} + | @dots{} +@end example + +@noindent +The latter, however, is much more readable. + +@node Rpcalc Lexer +@subsection The @code{rpcalc} Lexical Analyzer +@cindex writing a lexical analyzer +@cindex lexical analyzer, writing + +The lexical analyzer's job is low-level parsing: converting characters +or sequences of characters into tokens. The Bison parser gets its +tokens by calling the lexical analyzer. @xref{Lexical, ,The Lexical +Analyzer Function @code{yylex}}. + +Only a simple lexical analyzer is needed for the @acronym{RPN} +calculator. This +lexical analyzer skips blanks and tabs, then reads in numbers as +@code{double} and returns them as @code{NUM} tokens. Any other character +that isn't part of a number is a separate token. Note that the token-code +for such a single-character token is the character itself. + +The return value of the lexical analyzer function is a numeric code which +represents a token type. The same text used in Bison rules to stand for +this token type is also a C expression for the numeric code for the type. +This works in two ways. If the token type is a character literal, then its +numeric code is that of the character; you can use the same +character literal in the lexical analyzer to express the number. If the +token type is an identifier, that identifier is defined by Bison as a C +macro whose definition is the appropriate number. In this example, +therefore, @code{NUM} becomes a macro for @code{yylex} to use. + +The semantic value of the token (if it has one) is stored into the +global variable @code{yylval}, which is where the Bison parser will look +for it. (The C data type of @code{yylval} is @code{YYSTYPE}, which was +defined at the beginning of the grammar; @pxref{Rpcalc Decls, +,Declarations for @code{rpcalc}}.) + +A token type code of zero is returned if the end-of-input is encountered. +(Bison recognizes any nonpositive value as indicating end-of-input.) + +Here is the code for the lexical analyzer: + +@example +@group +/* The lexical analyzer returns a double floating point + number on the stack and the token NUM, or the numeric code + of the character read if not a number. It skips all blanks + and tabs, and returns 0 for end-of-input. */ + +#include +@end group + +@group +int +yylex (void) +@{ + int c; + + /* Skip white space. */ + while ((c = getchar ()) == ' ' || c == '\t') + ; +@end group +@group + /* Process numbers. */ + if (c == '.' || isdigit (c)) + @{ + ungetc (c, stdin); + scanf ("%lf", &yylval); + return NUM; + @} +@end group +@group + /* Return end-of-input. */ + if (c == EOF) + return 0; + /* Return a single char. */ + return c; +@} +@end group +@end example + +@node Rpcalc Main +@subsection The Controlling Function +@cindex controlling function +@cindex main function in simple example + +In keeping with the spirit of this example, the controlling function is +kept to the bare minimum. The only requirement is that it call +@code{yyparse} to start the process of parsing. + +@example +@group +int +main (void) +@{ + return yyparse (); +@} +@end group +@end example + +@node Rpcalc Error +@subsection The Error Reporting Routine +@cindex error reporting routine + +When @code{yyparse} detects a syntax error, it calls the error reporting +function @code{yyerror} to print an error message (usually but not +always @code{"syntax error"}). It is up to the programmer to supply +@code{yyerror} (@pxref{Interface, ,Parser C-Language Interface}), so +here is the definition we will use: + +@example +@group +#include + +/* Called by yyparse on error. */ +void +yyerror (char const *s) +@{ + fprintf (stderr, "%s\n", s); +@} +@end group +@end example + +After @code{yyerror} returns, the Bison parser may recover from the error +and continue parsing if the grammar contains a suitable error rule +(@pxref{Error Recovery}). Otherwise, @code{yyparse} returns nonzero. We +have not written any error rules in this example, so any invalid input will +cause the calculator program to exit. This is not clean behavior for a +real calculator, but it is adequate for the first example. + +@node Rpcalc Gen +@subsection Running Bison to Make the Parser +@cindex running Bison (introduction) + +Before running Bison to produce a parser, we need to decide how to +arrange all the source code in one or more source files. For such a +simple example, the easiest thing is to put everything in one file. The +definitions of @code{yylex}, @code{yyerror} and @code{main} go at the +end, in the epilogue of the file +(@pxref{Grammar Layout, ,The Overall Layout of a Bison Grammar}). + +For a large project, you would probably have several source files, and use +@code{make} to arrange to recompile them. + +With all the source in a single file, you use the following command to +convert it into a parser file: + +@example +bison @var{file_name}.y +@end example + +@noindent +In this example the file was called @file{rpcalc.y} (for ``Reverse Polish +@sc{calc}ulator''). Bison produces a file named @file{@var{file_name}.tab.c}, +removing the @samp{.y} from the original file name. The file output by +Bison contains the source code for @code{yyparse}. The additional +functions in the input file (@code{yylex}, @code{yyerror} and @code{main}) +are copied verbatim to the output. + +@node Rpcalc Compile +@subsection Compiling the Parser File +@cindex compiling the parser + +Here is how to compile and run the parser file: + +@example +@group +# @r{List files in current directory.} +$ @kbd{ls} +rpcalc.tab.c rpcalc.y +@end group + +@group +# @r{Compile the Bison parser.} +# @r{@samp{-lm} tells compiler to search math library for @code{pow}.} +$ @kbd{cc -lm -o rpcalc rpcalc.tab.c} +@end group + +@group +# @r{List files again.} +$ @kbd{ls} +rpcalc rpcalc.tab.c rpcalc.y +@end group +@end example + +The file @file{rpcalc} now contains the executable code. Here is an +example session using @code{rpcalc}. + +@example +$ @kbd{rpcalc} +@kbd{4 9 +} +13 +@kbd{3 7 + 3 4 5 *+-} +-13 +@kbd{3 7 + 3 4 5 * + - n} @r{Note the unary minus, @samp{n}} +13 +@kbd{5 6 / 4 n +} +-3.166666667 +@kbd{3 4 ^} @r{Exponentiation} +81 +@kbd{^D} @r{End-of-file indicator} +$ +@end example + +@node Infix Calc +@section Infix Notation Calculator: @code{calc} +@cindex infix notation calculator +@cindex @code{calc} +@cindex calculator, infix notation + +We now modify rpcalc to handle infix operators instead of postfix. Infix +notation involves the concept of operator precedence and the need for +parentheses nested to arbitrary depth. Here is the Bison code for +@file{calc.y}, an infix desk-top calculator. + +@example +/* Infix notation calculator. */ + +%@{ + #define YYSTYPE double + #include + #include + int yylex (void); + void yyerror (char const *); +%@} + +/* Bison declarations. */ +%token NUM +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +%% /* The grammar follows. */ +input: /* empty */ + | input line +; + +line: '\n' + | exp '\n' @{ printf ("\t%.10g\n", $1); @} +; + +exp: NUM @{ $$ = $1; @} + | exp '+' exp @{ $$ = $1 + $3; @} + | exp '-' exp @{ $$ = $1 - $3; @} + | exp '*' exp @{ $$ = $1 * $3; @} + | exp '/' exp @{ $$ = $1 / $3; @} + | '-' exp %prec NEG @{ $$ = -$2; @} + | exp '^' exp @{ $$ = pow ($1, $3); @} + | '(' exp ')' @{ $$ = $2; @} +; +%% +@end example + +@noindent +The functions @code{yylex}, @code{yyerror} and @code{main} can be the +same as before. + +There are two important new features shown in this code. + +In the second section (Bison declarations), @code{%left} declares token +types and says they are left-associative operators. The declarations +@code{%left} and @code{%right} (right associativity) take the place of +@code{%token} which is used to declare a token type name without +associativity. (These tokens are single-character literals, which +ordinarily don't need to be declared. We declare them here to specify +the associativity.) + +Operator precedence is determined by the line ordering of the +declarations; the higher the line number of the declaration (lower on +the page or screen), the higher the precedence. Hence, exponentiation +has the highest precedence, unary minus (@code{NEG}) is next, followed +by @samp{*} and @samp{/}, and so on. @xref{Precedence, ,Operator +Precedence}. + +The other important new feature is the @code{%prec} in the grammar +section for the unary minus operator. The @code{%prec} simply instructs +Bison that the rule @samp{| '-' exp} has the same precedence as +@code{NEG}---in this case the next-to-highest. @xref{Contextual +Precedence, ,Context-Dependent Precedence}. + +Here is a sample run of @file{calc.y}: + +@need 500 +@example +$ @kbd{calc} +@kbd{4 + 4.5 - (34/(8*3+-3))} +6.880952381 +@kbd{-56 + 2} +-54 +@kbd{3 ^ 2} +9 +@end example + +@node Simple Error Recovery +@section Simple Error Recovery +@cindex error recovery, simple + +Up to this point, this manual has not addressed the issue of @dfn{error +recovery}---how to continue parsing after the parser detects a syntax +error. All we have handled is error reporting with @code{yyerror}. +Recall that by default @code{yyparse} returns after calling +@code{yyerror}. This means that an erroneous input line causes the +calculator program to exit. Now we show how to rectify this deficiency. + +The Bison language itself includes the reserved word @code{error}, which +may be included in the grammar rules. In the example below it has +been added to one of the alternatives for @code{line}: + +@example +@group +line: '\n' + | exp '\n' @{ printf ("\t%.10g\n", $1); @} + | error '\n' @{ yyerrok; @} +; +@end group +@end example + +This addition to the grammar allows for simple error recovery in the +event of a syntax error. If an expression that cannot be evaluated is +read, the error will be recognized by the third rule for @code{line}, +and parsing will continue. (The @code{yyerror} function is still called +upon to print its message as well.) The action executes the statement +@code{yyerrok}, a macro defined automatically by Bison; its meaning is +that error recovery is complete (@pxref{Error Recovery}). Note the +difference between @code{yyerrok} and @code{yyerror}; neither one is a +misprint. + +This form of error recovery deals with syntax errors. There are other +kinds of errors; for example, division by zero, which raises an exception +signal that is normally fatal. A real calculator program must handle this +signal and use @code{longjmp} to return to @code{main} and resume parsing +input lines; it would also have to discard the rest of the current line of +input. We won't discuss this issue further because it is not specific to +Bison programs. + +@node Location Tracking Calc +@section Location Tracking Calculator: @code{ltcalc} +@cindex location tracking calculator +@cindex @code{ltcalc} +@cindex calculator, location tracking + +This example extends the infix notation calculator with location +tracking. This feature will be used to improve the error messages. For +the sake of clarity, this example is a simple integer calculator, since +most of the work needed to use locations will be done in the lexical +analyzer. + +@menu +* Decls: Ltcalc Decls. Bison and C declarations for ltcalc. +* Rules: Ltcalc Rules. Grammar rules for ltcalc, with explanations. +* Lexer: Ltcalc Lexer. The lexical analyzer. +@end menu + +@node Ltcalc Decls +@subsection Declarations for @code{ltcalc} + +The C and Bison declarations for the location tracking calculator are +the same as the declarations for the infix notation calculator. + +@example +/* Location tracking calculator. */ + +%@{ + #define YYSTYPE int + #include + int yylex (void); + void yyerror (char const *); +%@} + +/* Bison declarations. */ +%token NUM + +%left '-' '+' +%left '*' '/' +%left NEG +%right '^' + +%% /* The grammar follows. */ +@end example + +@noindent +Note there are no declarations specific to locations. Defining a data +type for storing locations is not needed: we will use the type provided +by default (@pxref{Location Type, ,Data Types of Locations}), which is a +four member structure with the following integer fields: +@code{first_line}, @code{first_column}, @code{last_line} and +@code{last_column}. + +@node Ltcalc Rules +@subsection Grammar Rules for @code{ltcalc} + +Whether handling locations or not has no effect on the syntax of your +language. Therefore, grammar rules for this example will be very close +to those of the previous example: we will only modify them to benefit +from the new information. + +Here, we will use locations to report divisions by zero, and locate the +wrong expressions or subexpressions. + +@example +@group +input : /* empty */ + | input line +; +@end group + +@group +line : '\n' + | exp '\n' @{ printf ("%d\n", $1); @} +; +@end group + +@group +exp : NUM @{ $$ = $1; @} + | exp '+' exp @{ $$ = $1 + $3; @} + | exp '-' exp @{ $$ = $1 - $3; @} + | exp '*' exp @{ $$ = $1 * $3; @} +@end group +@group + | exp '/' exp + @{ + if ($3) + $$ = $1 / $3; + else + @{ + $$ = 1; + fprintf (stderr, "%d.%d-%d.%d: division by zero", + @@3.first_line, @@3.first_column, + @@3.last_line, @@3.last_column); + @} + @} +@end group +@group + | '-' exp %preg NEG @{ $$ = -$2; @} + | exp '^' exp @{ $$ = pow ($1, $3); @} + | '(' exp ')' @{ $$ = $2; @} +@end group +@end example + +This code shows how to reach locations inside of semantic actions, by +using the pseudo-variables @code{@@@var{n}} for rule components, and the +pseudo-variable @code{@@$} for groupings. + +We don't need to assign a value to @code{@@$}: the output parser does it +automatically. By default, before executing the C code of each action, +@code{@@$} is set to range from the beginning of @code{@@1} to the end +of @code{@@@var{n}}, for a rule with @var{n} components. This behavior +can be redefined (@pxref{Location Default Action, , Default Action for +Locations}), and for very specific rules, @code{@@$} can be computed by +hand. + +@node Ltcalc Lexer +@subsection The @code{ltcalc} Lexical Analyzer. + +Until now, we relied on Bison's defaults to enable location +tracking. The next step is to rewrite the lexical analyzer, and make it +able to feed the parser with the token locations, as it already does for +semantic values. + +To this end, we must take into account every single character of the +input text, to avoid the computed locations of being fuzzy or wrong: + +@example +@group +int +yylex (void) +@{ + int c; +@end group + +@group + /* Skip white space. */ + while ((c = getchar ()) == ' ' || c == '\t') + ++yylloc.last_column; +@end group + +@group + /* Step. */ + yylloc.first_line = yylloc.last_line; + yylloc.first_column = yylloc.last_column; +@end group + +@group + /* Process numbers. */ + if (isdigit (c)) + @{ + yylval = c - '0'; + ++yylloc.last_column; + while (isdigit (c = getchar ())) + @{ + ++yylloc.last_column; + yylval = yylval * 10 + c - '0'; + @} + ungetc (c, stdin); + return NUM; + @} +@end group + + /* Return end-of-input. */ + if (c == EOF) + return 0; + + /* Return a single char, and update location. */ + if (c == '\n') + @{ + ++yylloc.last_line; + yylloc.last_column = 0; + @} + else + ++yylloc.last_column; + return c; +@} +@end example + +Basically, the lexical analyzer performs the same processing as before: +it skips blanks and tabs, and reads numbers or single-character tokens. +In addition, it updates @code{yylloc}, the global variable (of type +@code{YYLTYPE}) containing the token's location. + +Now, each time this function returns a token, the parser has its number +as well as its semantic value, and its location in the text. The last +needed change is to initialize @code{yylloc}, for example in the +controlling function: + +@example +@group +int +main (void) +@{ + yylloc.first_line = yylloc.last_line = 1; + yylloc.first_column = yylloc.last_column = 0; + return yyparse (); +@} +@end group +@end example + +Remember that computing locations is not a matter of syntax. Every +character must be associated to a location update, whether it is in +valid input, in comments, in literal strings, and so on. + +@node Multi-function Calc +@section Multi-Function Calculator: @code{mfcalc} +@cindex multi-function calculator +@cindex @code{mfcalc} +@cindex calculator, multi-function + +Now that the basics of Bison have been discussed, it is time to move on to +a more advanced problem. The above calculators provided only five +functions, @samp{+}, @samp{-}, @samp{*}, @samp{/} and @samp{^}. It would +be nice to have a calculator that provides other mathematical functions such +as @code{sin}, @code{cos}, etc. + +It is easy to add new operators to the infix calculator as long as they are +only single-character literals. The lexical analyzer @code{yylex} passes +back all nonnumber characters as tokens, so new grammar rules suffice for +adding a new operator. But we want something more flexible: built-in +functions whose syntax has this form: + +@example +@var{function_name} (@var{argument}) +@end example + +@noindent +At the same time, we will add memory to the calculator, by allowing you +to create named variables, store values in them, and use them later. +Here is a sample session with the multi-function calculator: + +@example +$ @kbd{mfcalc} +@kbd{pi = 3.141592653589} +3.1415926536 +@kbd{sin(pi)} +0.0000000000 +@kbd{alpha = beta1 = 2.3} +2.3000000000 +@kbd{alpha} +2.3000000000 +@kbd{ln(alpha)} +0.8329091229 +@kbd{exp(ln(beta1))} +2.3000000000 +$ +@end example + +Note that multiple assignment and nested function calls are permitted. + +@menu +* Decl: Mfcalc Decl. Bison declarations for multi-function calculator. +* Rules: Mfcalc Rules. Grammar rules for the calculator. +* Symtab: Mfcalc Symtab. Symbol table management subroutines. +@end menu + +@node Mfcalc Decl +@subsection Declarations for @code{mfcalc} + +Here are the C and Bison declarations for the multi-function calculator. + +@smallexample +@group +%@{ + #include /* For math functions, cos(), sin(), etc. */ + #include "calc.h" /* Contains definition of `symrec'. */ + int yylex (void); + void yyerror (char const *); +%@} +@end group +@group +%union @{ + double val; /* For returning numbers. */ + symrec *tptr; /* For returning symbol-table pointers. */ +@} +@end group +%token NUM /* Simple double precision number. */ +%token VAR FNCT /* Variable and Function. */ +%type exp + +@group +%right '=' +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ +@end group +%% /* The grammar follows. */ +@end smallexample + +The above grammar introduces only two new features of the Bison language. +These features allow semantic values to have various data types +(@pxref{Multiple Types, ,More Than One Value Type}). + +The @code{%union} declaration specifies the entire list of possible types; +this is instead of defining @code{YYSTYPE}. The allowable types are now +double-floats (for @code{exp} and @code{NUM}) and pointers to entries in +the symbol table. @xref{Union Decl, ,The Collection of Value Types}. + +Since values can now have various types, it is necessary to associate a +type with each grammar symbol whose semantic value is used. These symbols +are @code{NUM}, @code{VAR}, @code{FNCT}, and @code{exp}. Their +declarations are augmented with information about their data type (placed +between angle brackets). + +The Bison construct @code{%type} is used for declaring nonterminal +symbols, just as @code{%token} is used for declaring token types. We +have not used @code{%type} before because nonterminal symbols are +normally declared implicitly by the rules that define them. But +@code{exp} must be declared explicitly so we can specify its value type. +@xref{Type Decl, ,Nonterminal Symbols}. + +@node Mfcalc Rules +@subsection Grammar Rules for @code{mfcalc} + +Here are the grammar rules for the multi-function calculator. +Most of them are copied directly from @code{calc}; three rules, +those which mention @code{VAR} or @code{FNCT}, are new. + +@smallexample +@group +input: /* empty */ + | input line +; +@end group + +@group +line: + '\n' + | exp '\n' @{ printf ("\t%.10g\n", $1); @} + | error '\n' @{ yyerrok; @} +; +@end group + +@group +exp: NUM @{ $$ = $1; @} + | VAR @{ $$ = $1->value.var; @} + | VAR '=' exp @{ $$ = $3; $1->value.var = $3; @} + | FNCT '(' exp ')' @{ $$ = (*($1->value.fnctptr))($3); @} + | exp '+' exp @{ $$ = $1 + $3; @} + | exp '-' exp @{ $$ = $1 - $3; @} + | exp '*' exp @{ $$ = $1 * $3; @} + | exp '/' exp @{ $$ = $1 / $3; @} + | '-' exp %prec NEG @{ $$ = -$2; @} + | exp '^' exp @{ $$ = pow ($1, $3); @} + | '(' exp ')' @{ $$ = $2; @} +; +@end group +/* End of grammar. */ +%% +@end smallexample + +@node Mfcalc Symtab +@subsection The @code{mfcalc} Symbol Table +@cindex symbol table example + +The multi-function calculator requires a symbol table to keep track of the +names and meanings of variables and functions. This doesn't affect the +grammar rules (except for the actions) or the Bison declarations, but it +requires some additional C functions for support. + +The symbol table itself consists of a linked list of records. Its +definition, which is kept in the header @file{calc.h}, is as follows. It +provides for either functions or variables to be placed in the table. + +@smallexample +@group +/* Function type. */ +typedef double (*func_t) (double); +@end group + +@group +/* Data type for links in the chain of symbols. */ +struct symrec +@{ + char *name; /* name of symbol */ + int type; /* type of symbol: either VAR or FNCT */ + union + @{ + double var; /* value of a VAR */ + func_t fnctptr; /* value of a FNCT */ + @} value; + struct symrec *next; /* link field */ +@}; +@end group + +@group +typedef struct symrec symrec; + +/* The symbol table: a chain of `struct symrec'. */ +extern symrec *sym_table; + +symrec *putsym (char const *, func_t); +symrec *getsym (char const *); +@end group +@end smallexample + +The new version of @code{main} includes a call to @code{init_table}, a +function that initializes the symbol table. Here it is, and +@code{init_table} as well: + +@smallexample +#include + +@group +/* Called by yyparse on error. */ +void +yyerror (char const *s) +@{ + printf ("%s\n", s); +@} +@end group + +@group +struct init +@{ + char const *fname; + double (*fnct) (double); +@}; +@end group + +@group +struct init const arith_fncts[] = +@{ + "sin", sin, + "cos", cos, + "atan", atan, + "ln", log, + "exp", exp, + "sqrt", sqrt, + 0, 0 +@}; +@end group + +@group +/* The symbol table: a chain of `struct symrec'. */ +symrec *sym_table; +@end group + +@group +/* Put arithmetic functions in table. */ +void +init_table (void) +@{ + int i; + symrec *ptr; + for (i = 0; arith_fncts[i].fname != 0; i++) + @{ + ptr = putsym (arith_fncts[i].fname, FNCT); + ptr->value.fnctptr = arith_fncts[i].fnct; + @} +@} +@end group + +@group +int +main (void) +@{ + init_table (); + return yyparse (); +@} +@end group +@end smallexample + +By simply editing the initialization list and adding the necessary include +files, you can add additional functions to the calculator. + +Two important functions allow look-up and installation of symbols in the +symbol table. The function @code{putsym} is passed a name and the type +(@code{VAR} or @code{FNCT}) of the object to be installed. The object is +linked to the front of the list, and a pointer to the object is returned. +The function @code{getsym} is passed the name of the symbol to look up. If +found, a pointer to that symbol is returned; otherwise zero is returned. + +@smallexample +symrec * +putsym (char const *sym_name, int sym_type) +@{ + symrec *ptr; + ptr = (symrec *) malloc (sizeof (symrec)); + ptr->name = (char *) malloc (strlen (sym_name) + 1); + strcpy (ptr->name,sym_name); + ptr->type = sym_type; + ptr->value.var = 0; /* Set value to 0 even if fctn. */ + ptr->next = (struct symrec *)sym_table; + sym_table = ptr; + return ptr; +@} + +symrec * +getsym (char const *sym_name) +@{ + symrec *ptr; + for (ptr = sym_table; ptr != (symrec *) 0; + ptr = (symrec *)ptr->next) + if (strcmp (ptr->name,sym_name) == 0) + return ptr; + return 0; +@} +@end smallexample + +The function @code{yylex} must now recognize variables, numeric values, and +the single-character arithmetic operators. Strings of alphanumeric +characters with a leading non-digit are recognized as either variables or +functions depending on what the symbol table says about them. + +The string is passed to @code{getsym} for look up in the symbol table. If +the name appears in the table, a pointer to its location and its type +(@code{VAR} or @code{FNCT}) is returned to @code{yyparse}. If it is not +already in the table, then it is installed as a @code{VAR} using +@code{putsym}. Again, a pointer and its type (which must be @code{VAR}) is +returned to @code{yyparse}. + +No change is needed in the handling of numeric values and arithmetic +operators in @code{yylex}. + +@smallexample +@group +#include +@end group + +@group +int +yylex (void) +@{ + int c; + + /* Ignore white space, get first nonwhite character. */ + while ((c = getchar ()) == ' ' || c == '\t'); + + if (c == EOF) + return 0; +@end group + +@group + /* Char starts a number => parse the number. */ + if (c == '.' || isdigit (c)) + @{ + ungetc (c, stdin); + scanf ("%lf", &yylval.val); + return NUM; + @} +@end group + +@group + /* Char starts an identifier => read the name. */ + if (isalpha (c)) + @{ + symrec *s; + static char *symbuf = 0; + static int length = 0; + int i; +@end group + +@group + /* Initially make the buffer long enough + for a 40-character symbol name. */ + if (length == 0) + length = 40, symbuf = (char *)malloc (length + 1); + + i = 0; + do +@end group +@group + @{ + /* If buffer is full, make it bigger. */ + if (i == length) + @{ + length *= 2; + symbuf = (char *) realloc (symbuf, length + 1); + @} + /* Add this character to the buffer. */ + symbuf[i++] = c; + /* Get another character. */ + c = getchar (); + @} +@end group +@group + while (isalnum (c)); + + ungetc (c, stdin); + symbuf[i] = '\0'; +@end group + +@group + s = getsym (symbuf); + if (s == 0) + s = putsym (symbuf, VAR); + yylval.tptr = s; + return s->type; + @} + + /* Any other character is a token by itself. */ + return c; +@} +@end group +@end smallexample + +This program is both powerful and flexible. You may easily add new +functions, and it is a simple job to modify this code to install +predefined variables such as @code{pi} or @code{e} as well. + +@node Exercises +@section Exercises +@cindex exercises + +@enumerate +@item +Add some new functions from @file{math.h} to the initialization list. + +@item +Add another array that contains constants and their values. Then +modify @code{init_table} to add these constants to the symbol table. +It will be easiest to give the constants type @code{VAR}. + +@item +Make the program report an error if the user refers to an +uninitialized variable in any way except to store a value in it. +@end enumerate + +@node Grammar File +@chapter Bison Grammar Files + +Bison takes as input a context-free grammar specification and produces a +C-language function that recognizes correct instances of the grammar. + +The Bison grammar input file conventionally has a name ending in @samp{.y}. +@xref{Invocation, ,Invoking Bison}. + +@menu +* Grammar Outline:: Overall layout of the grammar file. +* Symbols:: Terminal and nonterminal symbols. +* Rules:: How to write grammar rules. +* Recursion:: Writing recursive rules. +* Semantics:: Semantic values and actions. +* Locations:: Locations and actions. +* Declarations:: All kinds of Bison declarations are described here. +* Multiple Parsers:: Putting more than one Bison parser in one program. +@end menu + +@node Grammar Outline +@section Outline of a Bison Grammar + +A Bison grammar file has four main sections, shown here with the +appropriate delimiters: + +@example +%@{ + @var{Prologue} +%@} + +@var{Bison declarations} + +%% +@var{Grammar rules} +%% + +@var{Epilogue} +@end example + +Comments enclosed in @samp{/* @dots{} */} may appear in any of the sections. +As a @acronym{GNU} extension, @samp{//} introduces a comment that +continues until end of line. + +@menu +* Prologue:: Syntax and usage of the prologue. +* Bison Declarations:: Syntax and usage of the Bison declarations section. +* Grammar Rules:: Syntax and usage of the grammar rules section. +* Epilogue:: Syntax and usage of the epilogue. +@end menu + +@node Prologue +@subsection The prologue +@cindex declarations section +@cindex Prologue +@cindex declarations + +The @var{Prologue} section contains macro definitions and +declarations of functions and variables that are used in the actions in the +grammar rules. These are copied to the beginning of the parser file so +that they precede the definition of @code{yyparse}. You can use +@samp{#include} to get the declarations from a header file. If you don't +need any C declarations, you may omit the @samp{%@{} and @samp{%@}} +delimiters that bracket this section. + +You may have more than one @var{Prologue} section, intermixed with the +@var{Bison declarations}. This allows you to have C and Bison +declarations that refer to each other. For example, the @code{%union} +declaration may use types defined in a header file, and you may wish to +prototype functions that take arguments of type @code{YYSTYPE}. This +can be done with two @var{Prologue} blocks, one before and one after the +@code{%union} declaration. + +@smallexample +%@{ + #include + #include "ptypes.h" +%@} + +%union @{ + long int n; + tree t; /* @r{@code{tree} is defined in @file{ptypes.h}.} */ +@} + +%@{ + static void print_token_value (FILE *, int, YYSTYPE); + #define YYPRINT(F, N, L) print_token_value (F, N, L) +%@} + +@dots{} +@end smallexample + +@node Bison Declarations +@subsection The Bison Declarations Section +@cindex Bison declarations (introduction) +@cindex declarations, Bison (introduction) + +The @var{Bison declarations} section contains declarations that define +terminal and nonterminal symbols, specify precedence, and so on. +In some simple grammars you may not need any declarations. +@xref{Declarations, ,Bison Declarations}. + +@node Grammar Rules +@subsection The Grammar Rules Section +@cindex grammar rules section +@cindex rules section for grammar + +The @dfn{grammar rules} section contains one or more Bison grammar +rules, and nothing else. @xref{Rules, ,Syntax of Grammar Rules}. + +There must always be at least one grammar rule, and the first +@samp{%%} (which precedes the grammar rules) may never be omitted even +if it is the first thing in the file. + +@node Epilogue +@subsection The epilogue +@cindex additional C code section +@cindex epilogue +@cindex C code, section for additional + +The @var{Epilogue} is copied verbatim to the end of the parser file, just as +the @var{Prologue} is copied to the beginning. This is the most convenient +place to put anything that you want to have in the parser file but which need +not come before the definition of @code{yyparse}. For example, the +definitions of @code{yylex} and @code{yyerror} often go here. Because +C requires functions to be declared before being used, you often need +to declare functions like @code{yylex} and @code{yyerror} in the Prologue, +even if you define them int he Epilogue. +@xref{Interface, ,Parser C-Language Interface}. + +If the last section is empty, you may omit the @samp{%%} that separates it +from the grammar rules. + +The Bison parser itself contains many macros and identifiers whose +names start with @samp{yy} or @samp{YY}, so it is a +good idea to avoid using any such names (except those documented in this +manual) in the epilogue of the grammar file. + +@node Symbols +@section Symbols, Terminal and Nonterminal +@cindex nonterminal symbol +@cindex terminal symbol +@cindex token type +@cindex symbol + +@dfn{Symbols} in Bison grammars represent the grammatical classifications +of the language. + +A @dfn{terminal symbol} (also known as a @dfn{token type}) represents a +class of syntactically equivalent tokens. You use the symbol in grammar +rules to mean that a token in that class is allowed. The symbol is +represented in the Bison parser by a numeric code, and the @code{yylex} +function returns a token type code to indicate what kind of token has been +read. You don't need to know what the code value is; you can use the +symbol to stand for it. + +A @dfn{nonterminal symbol} stands for a class of syntactically equivalent +groupings. The symbol name is used in writing grammar rules. By convention, +it should be all lower case. + +Symbol names can contain letters, digits (not at the beginning), +underscores and periods. Periods make sense only in nonterminals. + +There are three ways of writing terminal symbols in the grammar: + +@itemize @bullet +@item +A @dfn{named token type} is written with an identifier, like an +identifier in C@. By convention, it should be all upper case. Each +such name must be defined with a Bison declaration such as +@code{%token}. @xref{Token Decl, ,Token Type Names}. + +@item +@cindex character token +@cindex literal token +@cindex single-character literal +A @dfn{character token type} (or @dfn{literal character token}) is +written in the grammar using the same syntax used in C for character +constants; for example, @code{'+'} is a character token type. A +character token type doesn't need to be declared unless you need to +specify its semantic value data type (@pxref{Value Type, ,Data Types of +Semantic Values}), associativity, or precedence (@pxref{Precedence, +,Operator Precedence}). + +By convention, a character token type is used only to represent a +token that consists of that particular character. Thus, the token +type @code{'+'} is used to represent the character @samp{+} as a +token. Nothing enforces this convention, but if you depart from it, +your program will confuse other readers. + +All the usual escape sequences used in character literals in C can be +used in Bison as well, but you must not use the null character as a +character literal because its numeric code, zero, signifies +end-of-input (@pxref{Calling Convention, ,Calling Convention +for @code{yylex}}). Also, unlike standard C, trigraphs have no +special meaning in Bison character literals, nor is backslash-newline +allowed. + +@item +@cindex string token +@cindex literal string token +@cindex multicharacter literal +A @dfn{literal string token} is written like a C string constant; for +example, @code{"<="} is a literal string token. A literal string token +doesn't need to be declared unless you need to specify its semantic +value data type (@pxref{Value Type}), associativity, or precedence +(@pxref{Precedence}). + +You can associate the literal string token with a symbolic name as an +alias, using the @code{%token} declaration (@pxref{Token Decl, ,Token +Declarations}). If you don't do that, the lexical analyzer has to +retrieve the token number for the literal string token from the +@code{yytname} table (@pxref{Calling Convention}). + +@strong{Warning}: literal string tokens do not work in Yacc. + +By convention, a literal string token is used only to represent a token +that consists of that particular string. Thus, you should use the token +type @code{"<="} to represent the string @samp{<=} as a token. Bison +does not enforce this convention, but if you depart from it, people who +read your program will be confused. + +All the escape sequences used in string literals in C can be used in +Bison as well, except that you must not use a null character within a +string literal. Also, unlike Standard C, trigraphs have no special +meaning in Bison string literals, nor is backslash-newline allowed. A +literal string token must contain two or more characters; for a token +containing just one character, use a character token (see above). +@end itemize + +How you choose to write a terminal symbol has no effect on its +grammatical meaning. That depends only on where it appears in rules and +on when the parser function returns that symbol. + +The value returned by @code{yylex} is always one of the terminal +symbols, except that a zero or negative value signifies end-of-input. +Whichever way you write the token type in the grammar rules, you write +it the same way in the definition of @code{yylex}. The numeric code +for a character token type is simply the positive numeric code of the +character, so @code{yylex} can use the identical value to generate the +requisite code, though you may need to convert it to @code{unsigned +char} to avoid sign-extension on hosts where @code{char} is signed. +Each named token type becomes a C macro in +the parser file, so @code{yylex} can use the name to stand for the code. +(This is why periods don't make sense in terminal symbols.) +@xref{Calling Convention, ,Calling Convention for @code{yylex}}. + +If @code{yylex} is defined in a separate file, you need to arrange for the +token-type macro definitions to be available there. Use the @samp{-d} +option when you run Bison, so that it will write these macro definitions +into a separate header file @file{@var{name}.tab.h} which you can include +in the other source files that need it. @xref{Invocation, ,Invoking Bison}. + +If you want to write a grammar that is portable to any Standard C +host, you must use only non-null character tokens taken from the basic +execution character set of Standard C@. This set consists of the ten +digits, the 52 lower- and upper-case English letters, and the +characters in the following C-language string: + +@example +"\a\b\t\n\v\f\r !\"#%&'()*+,-./:;<=>?[\\]^_@{|@}~" +@end example + +The @code{yylex} function and Bison must use a consistent character +set and encoding for character tokens. For example, if you run Bison in an +@acronym{ASCII} environment, but then compile and run the resulting program +in an environment that uses an incompatible character set like +@acronym{EBCDIC}, the resulting program may not work because the +tables generated by Bison will assume @acronym{ASCII} numeric values for +character tokens. It is standard +practice for software distributions to contain C source files that +were generated by Bison in an @acronym{ASCII} environment, so installers on +platforms that are incompatible with @acronym{ASCII} must rebuild those +files before compiling them. + +The symbol @code{error} is a terminal symbol reserved for error recovery +(@pxref{Error Recovery}); you shouldn't use it for any other purpose. +In particular, @code{yylex} should never return this value. The default +value of the error token is 256, unless you explicitly assigned 256 to +one of your tokens with a @code{%token} declaration. + +@node Rules +@section Syntax of Grammar Rules +@cindex rule syntax +@cindex grammar rule syntax +@cindex syntax of grammar rules + +A Bison grammar rule has the following general form: + +@example +@group +@var{result}: @var{components}@dots{} + ; +@end group +@end example + +@noindent +where @var{result} is the nonterminal symbol that this rule describes, +and @var{components} are various terminal and nonterminal symbols that +are put together by this rule (@pxref{Symbols}). + +For example, + +@example +@group +exp: exp '+' exp + ; +@end group +@end example + +@noindent +says that two groupings of type @code{exp}, with a @samp{+} token in between, +can be combined into a larger grouping of type @code{exp}. + +White space in rules is significant only to separate symbols. You can add +extra white space as you wish. + +Scattered among the components can be @var{actions} that determine +the semantics of the rule. An action looks like this: + +@example +@{@var{C statements}@} +@end example + +@noindent +Usually there is only one action and it follows the components. +@xref{Actions}. + +@findex | +Multiple rules for the same @var{result} can be written separately or can +be joined with the vertical-bar character @samp{|} as follows: + +@ifinfo +@example +@var{result}: @var{rule1-components}@dots{} + | @var{rule2-components}@dots{} + @dots{} + ; +@end example +@end ifinfo +@iftex +@example +@group +@var{result}: @var{rule1-components}@dots{} + | @var{rule2-components}@dots{} + @dots{} + ; +@end group +@end example +@end iftex + +@noindent +They are still considered distinct rules even when joined in this way. + +If @var{components} in a rule is empty, it means that @var{result} can +match the empty string. For example, here is how to define a +comma-separated sequence of zero or more @code{exp} groupings: + +@example +@group +expseq: /* empty */ + | expseq1 + ; +@end group + +@group +expseq1: exp + | expseq1 ',' exp + ; +@end group +@end example + +@noindent +It is customary to write a comment @samp{/* empty */} in each rule +with no components. + +@node Recursion +@section Recursive Rules +@cindex recursive rule + +A rule is called @dfn{recursive} when its @var{result} nonterminal appears +also on its right hand side. Nearly all Bison grammars need to use +recursion, because that is the only way to define a sequence of any number +of a particular thing. Consider this recursive definition of a +comma-separated sequence of one or more expressions: + +@example +@group +expseq1: exp + | expseq1 ',' exp + ; +@end group +@end example + +@cindex left recursion +@cindex right recursion +@noindent +Since the recursive use of @code{expseq1} is the leftmost symbol in the +right hand side, we call this @dfn{left recursion}. By contrast, here +the same construct is defined using @dfn{right recursion}: + +@example +@group +expseq1: exp + | exp ',' expseq1 + ; +@end group +@end example + +@noindent +Any kind of sequence can be defined using either left recursion or right +recursion, but you should always use left recursion, because it can +parse a sequence of any number of elements with bounded stack space. +Right recursion uses up space on the Bison stack in proportion to the +number of elements in the sequence, because all the elements must be +shifted onto the stack before the rule can be applied even once. +@xref{Algorithm, ,The Bison Parser Algorithm}, for further explanation +of this. + +@cindex mutual recursion +@dfn{Indirect} or @dfn{mutual} recursion occurs when the result of the +rule does not appear directly on its right hand side, but does appear +in rules for other nonterminals which do appear on its right hand +side. + +For example: + +@example +@group +expr: primary + | primary '+' primary + ; +@end group + +@group +primary: constant + | '(' expr ')' + ; +@end group +@end example + +@noindent +defines two mutually-recursive nonterminals, since each refers to the +other. + +@node Semantics +@section Defining Language Semantics +@cindex defining language semantics +@cindex language semantics, defining + +The grammar rules for a language determine only the syntax. The semantics +are determined by the semantic values associated with various tokens and +groupings, and by the actions taken when various groupings are recognized. + +For example, the calculator calculates properly because the value +associated with each expression is the proper number; it adds properly +because the action for the grouping @w{@samp{@var{x} + @var{y}}} is to add +the numbers associated with @var{x} and @var{y}. + +@menu +* Value Type:: Specifying one data type for all semantic values. +* Multiple Types:: Specifying several alternative data types. +* Actions:: An action is the semantic definition of a grammar rule. +* Action Types:: Specifying data types for actions to operate on. +* Mid-Rule Actions:: Most actions go at the end of a rule. + This says when, why and how to use the exceptional + action in the middle of a rule. +@end menu + +@node Value Type +@subsection Data Types of Semantic Values +@cindex semantic value type +@cindex value type, semantic +@cindex data types of semantic values +@cindex default data type + +In a simple program it may be sufficient to use the same data type for +the semantic values of all language constructs. This was true in the +@acronym{RPN} and infix calculator examples (@pxref{RPN Calc, ,Reverse Polish +Notation Calculator}). + +Bison's default is to use type @code{int} for all semantic values. To +specify some other type, define @code{YYSTYPE} as a macro, like this: + +@example +#define YYSTYPE double +@end example + +@noindent +This macro definition must go in the prologue of the grammar file +(@pxref{Grammar Outline, ,Outline of a Bison Grammar}). + +@node Multiple Types +@subsection More Than One Value Type + +In most programs, you will need different data types for different kinds +of tokens and groupings. For example, a numeric constant may need type +@code{int} or @code{long int}, while a string constant needs type @code{char *}, +and an identifier might need a pointer to an entry in the symbol table. + +To use more than one data type for semantic values in one parser, Bison +requires you to do two things: + +@itemize @bullet +@item +Specify the entire collection of possible data types, with the +@code{%union} Bison declaration (@pxref{Union Decl, ,The Collection of +Value Types}). + +@item +Choose one of those types for each symbol (terminal or nonterminal) for +which semantic values are used. This is done for tokens with the +@code{%token} Bison declaration (@pxref{Token Decl, ,Token Type Names}) +and for groupings with the @code{%type} Bison declaration (@pxref{Type +Decl, ,Nonterminal Symbols}). +@end itemize + +@node Actions +@subsection Actions +@cindex action +@vindex $$ +@vindex $@var{n} + +An action accompanies a syntactic rule and contains C code to be executed +each time an instance of that rule is recognized. The task of most actions +is to compute a semantic value for the grouping built by the rule from the +semantic values associated with tokens or smaller groupings. + +An action consists of C statements surrounded by braces, much like a +compound statement in C@. An action can contain any sequence of C +statements. Bison does not look for trigraphs, though, so if your C +code uses trigraphs you should ensure that they do not affect the +nesting of braces or the boundaries of comments, strings, or character +literals. + +An action can be placed at any position in the rule; +it is executed at that position. Most rules have just one action at the +end of the rule, following all the components. Actions in the middle of +a rule are tricky and used only for special purposes (@pxref{Mid-Rule +Actions, ,Actions in Mid-Rule}). + +The C code in an action can refer to the semantic values of the components +matched by the rule with the construct @code{$@var{n}}, which stands for +the value of the @var{n}th component. The semantic value for the grouping +being constructed is @code{$$}. Bison translates both of these +constructs into expressions of the appropriate type when it copies the +actions into the parser file. @code{$$} is translated to a modifiable +lvalue, so it can be assigned to. + +Here is a typical example: + +@example +@group +exp: @dots{} + | exp '+' exp + @{ $$ = $1 + $3; @} +@end group +@end example + +@noindent +This rule constructs an @code{exp} from two smaller @code{exp} groupings +connected by a plus-sign token. In the action, @code{$1} and @code{$3} +refer to the semantic values of the two component @code{exp} groupings, +which are the first and third symbols on the right hand side of the rule. +The sum is stored into @code{$$} so that it becomes the semantic value of +the addition-expression just recognized by the rule. If there were a +useful semantic value associated with the @samp{+} token, it could be +referred to as @code{$2}. + +Note that the vertical-bar character @samp{|} is really a rule +separator, and actions are attached to a single rule. This is a +difference with tools like Flex, for which @samp{|} stands for either +``or'', or ``the same action as that of the next rule''. In the +following example, the action is triggered only when @samp{b} is found: + +@example +@group +a-or-b: 'a'|'b' @{ a_or_b_found = 1; @}; +@end group +@end example + +@cindex default action +If you don't specify an action for a rule, Bison supplies a default: +@w{@code{$$ = $1}.} Thus, the value of the first symbol in the rule +becomes the value of the whole rule. Of course, the default action is +valid only if the two data types match. There is no meaningful default +action for an empty rule; every empty rule must have an explicit action +unless the rule's value does not matter. + +@code{$@var{n}} with @var{n} zero or negative is allowed for reference +to tokens and groupings on the stack @emph{before} those that match the +current rule. This is a very risky practice, and to use it reliably +you must be certain of the context in which the rule is applied. Here +is a case in which you can use this reliably: + +@example +@group +foo: expr bar '+' expr @{ @dots{} @} + | expr bar '-' expr @{ @dots{} @} + ; +@end group + +@group +bar: /* empty */ + @{ previous_expr = $0; @} + ; +@end group +@end example + +As long as @code{bar} is used only in the fashion shown here, @code{$0} +always refers to the @code{expr} which precedes @code{bar} in the +definition of @code{foo}. + +@node Action Types +@subsection Data Types of Values in Actions +@cindex action data types +@cindex data types in actions + +If you have chosen a single data type for semantic values, the @code{$$} +and @code{$@var{n}} constructs always have that data type. + +If you have used @code{%union} to specify a variety of data types, then you +must declare a choice among these types for each terminal or nonterminal +symbol that can have a semantic value. Then each time you use @code{$$} or +@code{$@var{n}}, its data type is determined by which symbol it refers to +in the rule. In this example, + +@example +@group +exp: @dots{} + | exp '+' exp + @{ $$ = $1 + $3; @} +@end group +@end example + +@noindent +@code{$1} and @code{$3} refer to instances of @code{exp}, so they all +have the data type declared for the nonterminal symbol @code{exp}. If +@code{$2} were used, it would have the data type declared for the +terminal symbol @code{'+'}, whatever that might be. + +Alternatively, you can specify the data type when you refer to the value, +by inserting @samp{<@var{type}>} after the @samp{$} at the beginning of the +reference. For example, if you have defined types as shown here: + +@example +@group +%union @{ + int itype; + double dtype; +@} +@end group +@end example + +@noindent +then you can write @code{$1} to refer to the first subunit of the +rule as an integer, or @code{$1} to refer to it as a double. + +@node Mid-Rule Actions +@subsection Actions in Mid-Rule +@cindex actions in mid-rule +@cindex mid-rule actions + +Occasionally it is useful to put an action in the middle of a rule. +These actions are written just like usual end-of-rule actions, but they +are executed before the parser even recognizes the following components. + +A mid-rule action may refer to the components preceding it using +@code{$@var{n}}, but it may not refer to subsequent components because +it is run before they are parsed. + +The mid-rule action itself counts as one of the components of the rule. +This makes a difference when there is another action later in the same rule +(and usually there is another at the end): you have to count the actions +along with the symbols when working out which number @var{n} to use in +@code{$@var{n}}. + +The mid-rule action can also have a semantic value. The action can set +its value with an assignment to @code{$$}, and actions later in the rule +can refer to the value using @code{$@var{n}}. Since there is no symbol +to name the action, there is no way to declare a data type for the value +in advance, so you must use the @samp{$<@dots{}>@var{n}} construct to +specify a data type each time you refer to this value. + +There is no way to set the value of the entire rule with a mid-rule +action, because assignments to @code{$$} do not have that effect. The +only way to set the value for the entire rule is with an ordinary action +at the end of the rule. + +Here is an example from a hypothetical compiler, handling a @code{let} +statement that looks like @samp{let (@var{variable}) @var{statement}} and +serves to create a variable named @var{variable} temporarily for the +duration of @var{statement}. To parse this construct, we must put +@var{variable} into the symbol table while @var{statement} is parsed, then +remove it afterward. Here is how it is done: + +@example +@group +stmt: LET '(' var ')' + @{ $$ = push_context (); + declare_variable ($3); @} + stmt @{ $$ = $6; + pop_context ($5); @} +@end group +@end example + +@noindent +As soon as @samp{let (@var{variable})} has been recognized, the first +action is run. It saves a copy of the current semantic context (the +list of accessible variables) as its semantic value, using alternative +@code{context} in the data-type union. Then it calls +@code{declare_variable} to add the new variable to that list. Once the +first action is finished, the embedded statement @code{stmt} can be +parsed. Note that the mid-rule action is component number 5, so the +@samp{stmt} is component number 6. + +After the embedded statement is parsed, its semantic value becomes the +value of the entire @code{let}-statement. Then the semantic value from the +earlier action is used to restore the prior list of variables. This +removes the temporary @code{let}-variable from the list so that it won't +appear to exist while the rest of the program is parsed. + +Taking action before a rule is completely recognized often leads to +conflicts since the parser must commit to a parse in order to execute the +action. For example, the following two rules, without mid-rule actions, +can coexist in a working parser because the parser can shift the open-brace +token and look at what follows before deciding whether there is a +declaration or not: + +@example +@group +compound: '@{' declarations statements '@}' + | '@{' statements '@}' + ; +@end group +@end example + +@noindent +But when we add a mid-rule action as follows, the rules become nonfunctional: + +@example +@group +compound: @{ prepare_for_local_variables (); @} + '@{' declarations statements '@}' +@end group +@group + | '@{' statements '@}' + ; +@end group +@end example + +@noindent +Now the parser is forced to decide whether to run the mid-rule action +when it has read no farther than the open-brace. In other words, it +must commit to using one rule or the other, without sufficient +information to do it correctly. (The open-brace token is what is called +the @dfn{look-ahead} token at this time, since the parser is still +deciding what to do about it. @xref{Look-Ahead, ,Look-Ahead Tokens}.) + +You might think that you could correct the problem by putting identical +actions into the two rules, like this: + +@example +@group +compound: @{ prepare_for_local_variables (); @} + '@{' declarations statements '@}' + | @{ prepare_for_local_variables (); @} + '@{' statements '@}' + ; +@end group +@end example + +@noindent +But this does not help, because Bison does not realize that the two actions +are identical. (Bison never tries to understand the C code in an action.) + +If the grammar is such that a declaration can be distinguished from a +statement by the first token (which is true in C), then one solution which +does work is to put the action after the open-brace, like this: + +@example +@group +compound: '@{' @{ prepare_for_local_variables (); @} + declarations statements '@}' + | '@{' statements '@}' + ; +@end group +@end example + +@noindent +Now the first token of the following declaration or statement, +which would in any case tell Bison which rule to use, can still do so. + +Another solution is to bury the action inside a nonterminal symbol which +serves as a subroutine: + +@example +@group +subroutine: /* empty */ + @{ prepare_for_local_variables (); @} + ; + +@end group + +@group +compound: subroutine + '@{' declarations statements '@}' + | subroutine + '@{' statements '@}' + ; +@end group +@end example + +@noindent +Now Bison can execute the action in the rule for @code{subroutine} without +deciding which rule for @code{compound} it will eventually use. Note that +the action is now at the end of its rule. Any mid-rule action can be +converted to an end-of-rule action in this way, and this is what Bison +actually does to implement mid-rule actions. + +@node Locations +@section Tracking Locations +@cindex location +@cindex textual location +@cindex location, textual + +Though grammar rules and semantic actions are enough to write a fully +functional parser, it can be useful to process some additional information, +especially symbol locations. + +The way locations are handled is defined by providing a data type, and +actions to take when rules are matched. + +@menu +* Location Type:: Specifying a data type for locations. +* Actions and Locations:: Using locations in actions. +* Location Default Action:: Defining a general way to compute locations. +@end menu + +@node Location Type +@subsection Data Type of Locations +@cindex data type of locations +@cindex default location type + +Defining a data type for locations is much simpler than for semantic values, +since all tokens and groupings always use the same type. + +The type of locations is specified by defining a macro called @code{YYLTYPE}. +When @code{YYLTYPE} is not defined, Bison uses a default structure type with +four members: + +@example +typedef struct YYLTYPE +@{ + int first_line; + int first_column; + int last_line; + int last_column; +@} YYLTYPE; +@end example + +@node Actions and Locations +@subsection Actions and Locations +@cindex location actions +@cindex actions, location +@vindex @@$ +@vindex @@@var{n} + +Actions are not only useful for defining language semantics, but also for +describing the behavior of the output parser with locations. + +The most obvious way for building locations of syntactic groupings is very +similar to the way semantic values are computed. In a given rule, several +constructs can be used to access the locations of the elements being matched. +The location of the @var{n}th component of the right hand side is +@code{@@@var{n}}, while the location of the left hand side grouping is +@code{@@$}. + +Here is a basic example using the default data type for locations: + +@example +@group +exp: @dots{} + | exp '/' exp + @{ + @@$.first_column = @@1.first_column; + @@$.first_line = @@1.first_line; + @@$.last_column = @@3.last_column; + @@$.last_line = @@3.last_line; + if ($3) + $$ = $1 / $3; + else + @{ + $$ = 1; + fprintf (stderr, + "Division by zero, l%d,c%d-l%d,c%d", + @@3.first_line, @@3.first_column, + @@3.last_line, @@3.last_column); + @} + @} +@end group +@end example + +As for semantic values, there is a default action for locations that is +run each time a rule is matched. It sets the beginning of @code{@@$} to the +beginning of the first symbol, and the end of @code{@@$} to the end of the +last symbol. + +With this default action, the location tracking can be fully automatic. The +example above simply rewrites this way: + +@example +@group +exp: @dots{} + | exp '/' exp + @{ + if ($3) + $$ = $1 / $3; + else + @{ + $$ = 1; + fprintf (stderr, + "Division by zero, l%d,c%d-l%d,c%d", + @@3.first_line, @@3.first_column, + @@3.last_line, @@3.last_column); + @} + @} +@end group +@end example + +@node Location Default Action +@subsection Default Action for Locations +@vindex YYLLOC_DEFAULT + +Actually, actions are not the best place to compute locations. Since +locations are much more general than semantic values, there is room in +the output parser to redefine the default action to take for each +rule. The @code{YYLLOC_DEFAULT} macro is invoked each time a rule is +matched, before the associated action is run. It is also invoked +while processing a syntax error, to compute the error's location. + +Most of the time, this macro is general enough to suppress location +dedicated code from semantic actions. + +The @code{YYLLOC_DEFAULT} macro takes three parameters. The first one is +the location of the grouping (the result of the computation). When a +rule is matched, the second parameter is an array holding locations of +all right hand side elements of the rule being matched, and the third +parameter is the size of the rule's right hand side. When processing +a syntax error, the second parameter is an array holding locations of +the symbols that were discarded during error processing, and the third +parameter is the number of discarded symbols. + +By default, @code{YYLLOC_DEFAULT} is defined this way for simple +@acronym{LALR}(1) parsers: + +@example +@group +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + ((Current).first_line = (Rhs)[1].first_line, \ + (Current).first_column = (Rhs)[1].first_column, \ + (Current).last_line = (Rhs)[N].last_line, \ + (Current).last_column = (Rhs)[N].last_column) +@end group +@end example + +@noindent +and like this for @acronym{GLR} parsers: + +@example +@group +# define YYLLOC_DEFAULT(yyCurrent, yyRhs, YYN) \ + ((yyCurrent).first_line = YYRHSLOC(yyRhs, 1).first_line, \ + (yyCurrent).first_column = YYRHSLOC(yyRhs, 1).first_column, \ + (yyCurrent).last_line = YYRHSLOC(yyRhs, YYN).last_line, \ + (yyCurrent).last_column = YYRHSLOC(yyRhs, YYN).last_column) +@end group +@end example + +When defining @code{YYLLOC_DEFAULT}, you should consider that: + +@itemize @bullet +@item +All arguments are free of side-effects. However, only the first one (the +result) should be modified by @code{YYLLOC_DEFAULT}. + +@item +For consistency with semantic actions, valid indexes for the location +array range from 1 to @var{n}. + +@item +Your macro should parenthesize its arguments, if need be, since the +actual arguments may not be surrounded by parentheses. Also, your +macro should expand to something that can be used as a single +statement when it is followed by a semicolon. +@end itemize + +@node Declarations +@section Bison Declarations +@cindex declarations, Bison +@cindex Bison declarations + +The @dfn{Bison declarations} section of a Bison grammar defines the symbols +used in formulating the grammar and the data types of semantic values. +@xref{Symbols}. + +All token type names (but not single-character literal tokens such as +@code{'+'} and @code{'*'}) must be declared. Nonterminal symbols must be +declared if you need to specify which data type to use for the semantic +value (@pxref{Multiple Types, ,More Than One Value Type}). + +The first rule in the file also specifies the start symbol, by default. +If you want some other symbol to be the start symbol, you must declare +it explicitly (@pxref{Language and Grammar, ,Languages and Context-Free +Grammars}). + +@menu +* Token Decl:: Declaring terminal symbols. +* Precedence Decl:: Declaring terminals with precedence and associativity. +* Union Decl:: Declaring the set of all semantic value types. +* Type Decl:: Declaring the choice of type for a nonterminal symbol. +* Destructor Decl:: Declaring how symbols are freed. +* Expect Decl:: Suppressing warnings about parsing conflicts. +* Start Decl:: Specifying the start symbol. +* Pure Decl:: Requesting a reentrant parser. +* Decl Summary:: Table of all Bison declarations. +@end menu + +@node Token Decl +@subsection Token Type Names +@cindex declaring token type names +@cindex token type names, declaring +@cindex declaring literal string tokens +@findex %token + +The basic way to declare a token type name (terminal symbol) is as follows: + +@example +%token @var{name} +@end example + +Bison will convert this into a @code{#define} directive in +the parser, so that the function @code{yylex} (if it is in this file) +can use the name @var{name} to stand for this token type's code. + +Alternatively, you can use @code{%left}, @code{%right}, or +@code{%nonassoc} instead of @code{%token}, if you wish to specify +associativity and precedence. @xref{Precedence Decl, ,Operator +Precedence}. + +You can explicitly specify the numeric code for a token type by appending +a decimal or hexadecimal integer value in the field immediately +following the token name: + +@example +%token NUM 300 +%token XNUM 0x12d // a GNU extension +@end example + +@noindent +It is generally best, however, to let Bison choose the numeric codes for +all token types. Bison will automatically select codes that don't conflict +with each other or with normal characters. + +In the event that the stack type is a union, you must augment the +@code{%token} or other token declaration to include the data type +alternative delimited by angle-brackets (@pxref{Multiple Types, ,More +Than One Value Type}). + +For example: + +@example +@group +%union @{ /* define stack type */ + double val; + symrec *tptr; +@} +%token NUM /* define token NUM and its type */ +@end group +@end example + +You can associate a literal string token with a token type name by +writing the literal string at the end of a @code{%token} +declaration which declares the name. For example: + +@example +%token arrow "=>" +@end example + +@noindent +For example, a grammar for the C language might specify these names with +equivalent literal string tokens: + +@example +%token OR "||" +%token LE 134 "<=" +%left OR "<=" +@end example + +@noindent +Once you equate the literal string and the token name, you can use them +interchangeably in further declarations or the grammar rules. The +@code{yylex} function can use the token name or the literal string to +obtain the token type code number (@pxref{Calling Convention}). + +@node Precedence Decl +@subsection Operator Precedence +@cindex precedence declarations +@cindex declaring operator precedence +@cindex operator precedence, declaring + +Use the @code{%left}, @code{%right} or @code{%nonassoc} declaration to +declare a token and specify its precedence and associativity, all at +once. These are called @dfn{precedence declarations}. +@xref{Precedence, ,Operator Precedence}, for general information on +operator precedence. + +The syntax of a precedence declaration is the same as that of +@code{%token}: either + +@example +%left @var{symbols}@dots{} +@end example + +@noindent +or + +@example +%left <@var{type}> @var{symbols}@dots{} +@end example + +And indeed any of these declarations serves the purposes of @code{%token}. +But in addition, they specify the associativity and relative precedence for +all the @var{symbols}: + +@itemize @bullet +@item +The associativity of an operator @var{op} determines how repeated uses +of the operator nest: whether @samp{@var{x} @var{op} @var{y} @var{op} +@var{z}} is parsed by grouping @var{x} with @var{y} first or by +grouping @var{y} with @var{z} first. @code{%left} specifies +left-associativity (grouping @var{x} with @var{y} first) and +@code{%right} specifies right-associativity (grouping @var{y} with +@var{z} first). @code{%nonassoc} specifies no associativity, which +means that @samp{@var{x} @var{op} @var{y} @var{op} @var{z}} is +considered a syntax error. + +@item +The precedence of an operator determines how it nests with other operators. +All the tokens declared in a single precedence declaration have equal +precedence and nest together according to their associativity. +When two tokens declared in different precedence declarations associate, +the one declared later has the higher precedence and is grouped first. +@end itemize + +@node Union Decl +@subsection The Collection of Value Types +@cindex declaring value types +@cindex value types, declaring +@findex %union + +The @code{%union} declaration specifies the entire collection of possible +data types for semantic values. The keyword @code{%union} is followed by a +pair of braces containing the same thing that goes inside a @code{union} in +C. + +For example: + +@example +@group +%union @{ + double val; + symrec *tptr; +@} +@end group +@end example + +@noindent +This says that the two alternative types are @code{double} and @code{symrec +*}. They are given names @code{val} and @code{tptr}; these names are used +in the @code{%token} and @code{%type} declarations to pick one of the types +for a terminal or nonterminal symbol (@pxref{Type Decl, ,Nonterminal Symbols}). + +As an extension to @acronym{POSIX}, a tag is allowed after the +@code{union}. For example: + +@example +@group +%union value @{ + double val; + symrec *tptr; +@} +@end group +@end example + +specifies the union tag @code{value}, so the corresponding C type is +@code{union value}. If you do not specify a tag, it defaults to +@code{YYSTYPE}. + +Note that, unlike making a @code{union} declaration in C, you need not write +a semicolon after the closing brace. + +@node Type Decl +@subsection Nonterminal Symbols +@cindex declaring value types, nonterminals +@cindex value types, nonterminals, declaring +@findex %type + +@noindent +When you use @code{%union} to specify multiple value types, you must +declare the value type of each nonterminal symbol for which values are +used. This is done with a @code{%type} declaration, like this: + +@example +%type <@var{type}> @var{nonterminal}@dots{} +@end example + +@noindent +Here @var{nonterminal} is the name of a nonterminal symbol, and +@var{type} is the name given in the @code{%union} to the alternative +that you want (@pxref{Union Decl, ,The Collection of Value Types}). You +can give any number of nonterminal symbols in the same @code{%type} +declaration, if they have the same value type. Use spaces to separate +the symbol names. + +You can also declare the value type of a terminal symbol. To do this, +use the same @code{<@var{type}>} construction in a declaration for the +terminal symbol. All kinds of token declarations allow +@code{<@var{type}>}. + +@node Destructor Decl +@subsection Freeing Discarded Symbols +@cindex freeing discarded symbols +@findex %destructor + +Some symbols can be discarded by the parser, typically during error +recovery (@pxref{Error Recovery}). Basically, during error recovery, +embarrassing symbols already pushed on the stack, and embarrassing +tokens coming from the rest of the file are thrown away until the parser +falls on its feet. If these symbols convey heap based information, this +memory is lost. While this behavior is tolerable for batch parsers, +such as in compilers, it is unacceptable for parsers that can +possibility ``never end'' such as shells, or implementations of +communication protocols. + +The @code{%destructor} directive allows for the definition of code that +is called when a symbol is thrown away. + +@deffn {Directive} %destructor @{ @var{code} @} @var{symbols} +@findex %destructor +Declare that the @var{code} must be invoked for each of the +@var{symbols} that will be discarded by the parser. The @var{code} +should use @code{$$} to designate the semantic value associated to the +@var{symbols}. The additional parser parameters are also available +(@pxref{Parser Function, , The Parser Function @code{yyparse}}). + +@strong{Warning:} as of Bison 1.875, this feature is still considered as +experimental, as there was not enough user feedback. In particular, +the syntax might still change. +@end deffn + +For instance: + +@smallexample +%union +@{ + char *string; +@} +%token STRING +%type string +%destructor @{ free ($$); @} STRING string +@end smallexample + +@noindent +guarantees that when a @code{STRING} or a @code{string} will be discarded, +its associated memory will be freed. + +Note that in the future, Bison might also consider that right hand side +members that are not mentioned in the action can be destroyed. For +instance, in: + +@smallexample +comment: "/*" STRING "*/"; +@end smallexample + +@noindent +the parser is entitled to destroy the semantic value of the +@code{string}. Of course, this will not apply to the default action; +compare: + +@smallexample +typeless: string; // $$ = $1 does not apply; $1 is destroyed. +typefull: string; // $$ = $1 applies, $1 is not destroyed. +@end smallexample + +@node Expect Decl +@subsection Suppressing Conflict Warnings +@cindex suppressing conflict warnings +@cindex preventing warnings about conflicts +@cindex warnings, preventing +@cindex conflicts, suppressing warnings of +@findex %expect +@findex %expect-rr + +Bison normally warns if there are any conflicts in the grammar +(@pxref{Shift/Reduce, ,Shift/Reduce Conflicts}), but most real grammars +have harmless shift/reduce conflicts which are resolved in a predictable +way and would be difficult to eliminate. It is desirable to suppress +the warning about these conflicts unless the number of conflicts +changes. You can do this with the @code{%expect} declaration. + +The declaration looks like this: + +@example +%expect @var{n} +@end example + +Here @var{n} is a decimal integer. The declaration says there should be +no warning if there are @var{n} shift/reduce conflicts and no +reduce/reduce conflicts. The usual warning is +given if there are either more or fewer conflicts, or if there are any +reduce/reduce conflicts. + +For normal LALR(1) parsers, reduce/reduce conflicts are more serious, +and should be eliminated entirely. Bison will always report +reduce/reduce conflicts for these parsers. With GLR parsers, however, +both shift/reduce and reduce/reduce are routine (otherwise, there +would be no need to use GLR parsing). Therefore, it is also possible +to specify an expected number of reduce/reduce conflicts in GLR +parsers, using the declaration: + +@example +%expect-rr @var{n} +@end example + +In general, using @code{%expect} involves these steps: + +@itemize @bullet +@item +Compile your grammar without @code{%expect}. Use the @samp{-v} option +to get a verbose list of where the conflicts occur. Bison will also +print the number of conflicts. + +@item +Check each of the conflicts to make sure that Bison's default +resolution is what you really want. If not, rewrite the grammar and +go back to the beginning. + +@item +Add an @code{%expect} declaration, copying the number @var{n} from the +number which Bison printed. +@end itemize + +Now Bison will stop annoying you if you do not change the number of +conflicts, but it will warn you again if changes in the grammar result +in more or fewer conflicts. + +@node Start Decl +@subsection The Start-Symbol +@cindex declaring the start symbol +@cindex start symbol, declaring +@cindex default start symbol +@findex %start + +Bison assumes by default that the start symbol for the grammar is the first +nonterminal specified in the grammar specification section. The programmer +may override this restriction with the @code{%start} declaration as follows: + +@example +%start @var{symbol} +@end example + +@node Pure Decl +@subsection A Pure (Reentrant) Parser +@cindex reentrant parser +@cindex pure parser +@findex %pure-parser + +A @dfn{reentrant} program is one which does not alter in the course of +execution; in other words, it consists entirely of @dfn{pure} (read-only) +code. Reentrancy is important whenever asynchronous execution is possible; +for example, a non-reentrant program may not be safe to call from a signal +handler. In systems with multiple threads of control, a non-reentrant +program must be called only within interlocks. + +Normally, Bison generates a parser which is not reentrant. This is +suitable for most uses, and it permits compatibility with Yacc. (The +standard Yacc interfaces are inherently nonreentrant, because they use +statically allocated variables for communication with @code{yylex}, +including @code{yylval} and @code{yylloc}.) + +Alternatively, you can generate a pure, reentrant parser. The Bison +declaration @code{%pure-parser} says that you want the parser to be +reentrant. It looks like this: + +@example +%pure-parser +@end example + +The result is that the communication variables @code{yylval} and +@code{yylloc} become local variables in @code{yyparse}, and a different +calling convention is used for the lexical analyzer function +@code{yylex}. @xref{Pure Calling, ,Calling Conventions for Pure +Parsers}, for the details of this. The variable @code{yynerrs} also +becomes local in @code{yyparse} (@pxref{Error Reporting, ,The Error +Reporting Function @code{yyerror}}). The convention for calling +@code{yyparse} itself is unchanged. + +Whether the parser is pure has nothing to do with the grammar rules. +You can generate either a pure parser or a nonreentrant parser from any +valid grammar. + +@node Decl Summary +@subsection Bison Declaration Summary +@cindex Bison declaration summary +@cindex declaration summary +@cindex summary, Bison declaration + +Here is a summary of the declarations used to define a grammar: + +@deffn {Directive} %union +Declare the collection of data types that semantic values may have +(@pxref{Union Decl, ,The Collection of Value Types}). +@end deffn + +@deffn {Directive} %token +Declare a terminal symbol (token type name) with no precedence +or associativity specified (@pxref{Token Decl, ,Token Type Names}). +@end deffn + +@deffn {Directive} %right +Declare a terminal symbol (token type name) that is right-associative +(@pxref{Precedence Decl, ,Operator Precedence}). +@end deffn + +@deffn {Directive} %left +Declare a terminal symbol (token type name) that is left-associative +(@pxref{Precedence Decl, ,Operator Precedence}). +@end deffn + +@deffn {Directive} %nonassoc +Declare a terminal symbol (token type name) that is nonassociative +(@pxref{Precedence Decl, ,Operator Precedence}). +Using it in a way that would be associative is a syntax error. +@end deffn + +@ifset defaultprec +@deffn {Directive} %default-prec +Assign a precedence to rules lacking an explicit @code{%prec} modifier +(@pxref{Contextual Precedence, ,Context-Dependent Precedence}). +@end deffn +@end ifset + +@deffn {Directive} %type +Declare the type of semantic values for a nonterminal symbol +(@pxref{Type Decl, ,Nonterminal Symbols}). +@end deffn + +@deffn {Directive} %start +Specify the grammar's start symbol (@pxref{Start Decl, ,The +Start-Symbol}). +@end deffn + +@deffn {Directive} %expect +Declare the expected number of shift-reduce conflicts +(@pxref{Expect Decl, ,Suppressing Conflict Warnings}). +@end deffn + + +@sp 1 +@noindent +In order to change the behavior of @command{bison}, use the following +directives: + +@deffn {Directive} %debug +In the parser file, define the macro @code{YYDEBUG} to 1 if it is not +already defined, so that the debugging facilities are compiled. +@end deffn +@xref{Tracing, ,Tracing Your Parser}. + +@deffn {Directive} %defines +Write an extra output file containing macro definitions for the token +type names defined in the grammar and the semantic value type +@code{YYSTYPE}, as well as a few @code{extern} variable declarations. + +If the parser output file is named @file{@var{name}.c} then this file +is named @file{@var{name}.h}. + +This output file is essential if you wish to put the definition of +@code{yylex} in a separate source file, because @code{yylex} needs to +be able to refer to token type codes and the variable +@code{yylval}. @xref{Token Values, ,Semantic Values of Tokens}. +@end deffn + +@deffn {Directive} %destructor +Specifying how the parser should reclaim the memory associated to +discarded symbols. @xref{Destructor Decl, , Freeing Discarded Symbols}. +@end deffn + +@deffn {Directive} %file-prefix="@var{prefix}" +Specify a prefix to use for all Bison output file names. The names are +chosen as if the input file were named @file{@var{prefix}.y}. +@end deffn + +@deffn {Directive} %locations +Generate the code processing the locations (@pxref{Action Features, +,Special Features for Use in Actions}). This mode is enabled as soon as +the grammar uses the special @samp{@@@var{n}} tokens, but if your +grammar does not use it, using @samp{%locations} allows for more +accurate syntax error messages. +@end deffn + +@deffn {Directive} %name-prefix="@var{prefix}" +Rename the external symbols used in the parser so that they start with +@var{prefix} instead of @samp{yy}. The precise list of symbols renamed +is @code{yyparse}, @code{yylex}, @code{yyerror}, @code{yynerrs}, +@code{yylval}, @code{yylloc}, @code{yychar}, @code{yydebug}, and +possible @code{yylloc}. For example, if you use +@samp{%name-prefix="c_"}, the names become @code{c_parse}, @code{c_lex}, +and so on. @xref{Multiple Parsers, ,Multiple Parsers in the Same +Program}. +@end deffn + +@ifset defaultprec +@deffn {Directive} %no-default-prec +Do not assign a precedence to rules lacking an explicit @code{%prec} +modifier (@pxref{Contextual Precedence, ,Context-Dependent +Precedence}). +@end deffn +@end ifset + +@deffn {Directive} %no-parser +Do not include any C code in the parser file; generate tables only. The +parser file contains just @code{#define} directives and static variable +declarations. + +This option also tells Bison to write the C code for the grammar actions +into a file named @file{@var{filename}.act}, in the form of a +brace-surrounded body fit for a @code{switch} statement. +@end deffn + +@deffn {Directive} %no-lines +Don't generate any @code{#line} preprocessor commands in the parser +file. Ordinarily Bison writes these commands in the parser file so that +the C compiler and debuggers will associate errors and object code with +your source file (the grammar file). This directive causes them to +associate errors with the parser file, treating it an independent source +file in its own right. +@end deffn + +@deffn {Directive} %output="@var{filename}" +Specify the @var{filename} for the parser file. +@end deffn + +@deffn {Directive} %pure-parser +Request a pure (reentrant) parser program (@pxref{Pure Decl, ,A Pure +(Reentrant) Parser}). +@end deffn + +@deffn {Directive} %token-table +Generate an array of token names in the parser file. The name of the +array is @code{yytname}; @code{yytname[@var{i}]} is the name of the +token whose internal Bison token code number is @var{i}. The first +three elements of @code{yytname} correspond to the predefined tokens +@code{"$end"}, +@code{"error"}, and @code{"$undefined"}; after these come the symbols +defined in the grammar file. + +For single-character literal tokens and literal string tokens, the name +in the table includes the single-quote or double-quote characters: for +example, @code{"'+'"} is a single-character literal and @code{"\"<=\""} +is a literal string token. All the characters of the literal string +token appear verbatim in the string found in the table; even +double-quote characters are not escaped. For example, if the token +consists of three characters @samp{*"*}, its string in @code{yytname} +contains @samp{"*"*"}. (In C, that would be written as +@code{"\"*\"*\""}). + +When you specify @code{%token-table}, Bison also generates macro +definitions for macros @code{YYNTOKENS}, @code{YYNNTS}, and +@code{YYNRULES}, and @code{YYNSTATES}: + +@table @code +@item YYNTOKENS +The highest token number, plus one. +@item YYNNTS +The number of nonterminal symbols. +@item YYNRULES +The number of grammar rules, +@item YYNSTATES +The number of parser states (@pxref{Parser States}). +@end table +@end deffn + +@deffn {Directive} %verbose +Write an extra output file containing verbose descriptions of the +parser states and what is done for each type of look-ahead token in +that state. @xref{Understanding, , Understanding Your Parser}, for more +information. +@end deffn + +@deffn {Directive} %yacc +Pretend the option @option{--yacc} was given, i.e., imitate Yacc, +including its naming conventions. @xref{Bison Options}, for more. +@end deffn + + +@node Multiple Parsers +@section Multiple Parsers in the Same Program + +Most programs that use Bison parse only one language and therefore contain +only one Bison parser. But what if you want to parse more than one +language with the same program? Then you need to avoid a name conflict +between different definitions of @code{yyparse}, @code{yylval}, and so on. + +The easy way to do this is to use the option @samp{-p @var{prefix}} +(@pxref{Invocation, ,Invoking Bison}). This renames the interface +functions and variables of the Bison parser to start with @var{prefix} +instead of @samp{yy}. You can use this to give each parser distinct +names that do not conflict. + +The precise list of symbols renamed is @code{yyparse}, @code{yylex}, +@code{yyerror}, @code{yynerrs}, @code{yylval}, @code{yylloc}, +@code{yychar} and @code{yydebug}. For example, if you use @samp{-p c}, +the names become @code{cparse}, @code{clex}, and so on. + +@strong{All the other variables and macros associated with Bison are not +renamed.} These others are not global; there is no conflict if the same +name is used in different parsers. For example, @code{YYSTYPE} is not +renamed, but defining this in different ways in different parsers causes +no trouble (@pxref{Value Type, ,Data Types of Semantic Values}). + +The @samp{-p} option works by adding macro definitions to the beginning +of the parser source file, defining @code{yyparse} as +@code{@var{prefix}parse}, and so on. This effectively substitutes one +name for the other in the entire parser file. + +@node Interface +@chapter Parser C-Language Interface +@cindex C-language interface +@cindex interface + +The Bison parser is actually a C function named @code{yyparse}. Here we +describe the interface conventions of @code{yyparse} and the other +functions that it needs to use. + +Keep in mind that the parser uses many C identifiers starting with +@samp{yy} and @samp{YY} for internal purposes. If you use such an +identifier (aside from those in this manual) in an action or in epilogue +in the grammar file, you are likely to run into trouble. + +@menu +* Parser Function:: How to call @code{yyparse} and what it returns. +* Lexical:: You must supply a function @code{yylex} + which reads tokens. +* Error Reporting:: You must supply a function @code{yyerror}. +* Action Features:: Special features for use in actions. +@end menu + +@node Parser Function +@section The Parser Function @code{yyparse} +@findex yyparse + +You call the function @code{yyparse} to cause parsing to occur. This +function reads tokens, executes actions, and ultimately returns when it +encounters end-of-input or an unrecoverable syntax error. You can also +write an action which directs @code{yyparse} to return immediately +without reading further. + + +@deftypefun int yyparse (void) +The value returned by @code{yyparse} is 0 if parsing was successful (return +is due to end-of-input). + +The value is 1 if parsing failed (return is due to a syntax error). +@end deftypefun + +In an action, you can cause immediate return from @code{yyparse} by using +these macros: + +@defmac YYACCEPT +@findex YYACCEPT +Return immediately with value 0 (to report success). +@end defmac + +@defmac YYABORT +@findex YYABORT +Return immediately with value 1 (to report failure). +@end defmac + +If you use a reentrant parser, you can optionally pass additional +parameter information to it in a reentrant way. To do so, use the +declaration @code{%parse-param}: + +@deffn {Directive} %parse-param @{@var{argument-declaration}@} +@findex %parse-param +Declare that an argument declared by @code{argument-declaration} is an +additional @code{yyparse} argument. +The @var{argument-declaration} is used when declaring +functions or prototypes. The last identifier in +@var{argument-declaration} must be the argument name. +@end deffn + +Here's an example. Write this in the parser: + +@example +%parse-param @{int *nastiness@} +%parse-param @{int *randomness@} +@end example + +@noindent +Then call the parser like this: + +@example +@{ + int nastiness, randomness; + @dots{} /* @r{Store proper data in @code{nastiness} and @code{randomness}.} */ + value = yyparse (&nastiness, &randomness); + @dots{} +@} +@end example + +@noindent +In the grammar actions, use expressions like this to refer to the data: + +@example +exp: @dots{} @{ @dots{}; *randomness += 1; @dots{} @} +@end example + + +@node Lexical +@section The Lexical Analyzer Function @code{yylex} +@findex yylex +@cindex lexical analyzer + +The @dfn{lexical analyzer} function, @code{yylex}, recognizes tokens from +the input stream and returns them to the parser. Bison does not create +this function automatically; you must write it so that @code{yyparse} can +call it. The function is sometimes referred to as a lexical scanner. + +In simple programs, @code{yylex} is often defined at the end of the Bison +grammar file. If @code{yylex} is defined in a separate source file, you +need to arrange for the token-type macro definitions to be available there. +To do this, use the @samp{-d} option when you run Bison, so that it will +write these macro definitions into a separate header file +@file{@var{name}.tab.h} which you can include in the other source files +that need it. @xref{Invocation, ,Invoking Bison}. + +@menu +* Calling Convention:: How @code{yyparse} calls @code{yylex}. +* Token Values:: How @code{yylex} must return the semantic value + of the token it has read. +* Token Locations:: How @code{yylex} must return the text location + (line number, etc.) of the token, if the + actions want that. +* Pure Calling:: How the calling convention differs + in a pure parser (@pxref{Pure Decl, ,A Pure (Reentrant) Parser}). +@end menu + +@node Calling Convention +@subsection Calling Convention for @code{yylex} + +The value that @code{yylex} returns must be the positive numeric code +for the type of token it has just found; a zero or negative value +signifies end-of-input. + +When a token is referred to in the grammar rules by a name, that name +in the parser file becomes a C macro whose definition is the proper +numeric code for that token type. So @code{yylex} can use the name +to indicate that type. @xref{Symbols}. + +When a token is referred to in the grammar rules by a character literal, +the numeric code for that character is also the code for the token type. +So @code{yylex} can simply return that character code, possibly converted +to @code{unsigned char} to avoid sign-extension. The null character +must not be used this way, because its code is zero and that +signifies end-of-input. + +Here is an example showing these things: + +@example +int +yylex (void) +@{ + @dots{} + if (c == EOF) /* Detect end-of-input. */ + return 0; + @dots{} + if (c == '+' || c == '-') + return c; /* Assume token type for `+' is '+'. */ + @dots{} + return INT; /* Return the type of the token. */ + @dots{} +@} +@end example + +@noindent +This interface has been designed so that the output from the @code{lex} +utility can be used without change as the definition of @code{yylex}. + +If the grammar uses literal string tokens, there are two ways that +@code{yylex} can determine the token type codes for them: + +@itemize @bullet +@item +If the grammar defines symbolic token names as aliases for the +literal string tokens, @code{yylex} can use these symbolic names like +all others. In this case, the use of the literal string tokens in +the grammar file has no effect on @code{yylex}. + +@item +@code{yylex} can find the multicharacter token in the @code{yytname} +table. The index of the token in the table is the token type's code. +The name of a multicharacter token is recorded in @code{yytname} with a +double-quote, the token's characters, and another double-quote. The +token's characters are not escaped in any way; they appear verbatim in +the contents of the string in the table. + +Here's code for looking up a token in @code{yytname}, assuming that the +characters of the token are stored in @code{token_buffer}. + +@smallexample +for (i = 0; i < YYNTOKENS; i++) + @{ + if (yytname[i] != 0 + && yytname[i][0] == '"' + && ! strncmp (yytname[i] + 1, token_buffer, + strlen (token_buffer)) + && yytname[i][strlen (token_buffer) + 1] == '"' + && yytname[i][strlen (token_buffer) + 2] == 0) + break; + @} +@end smallexample + +The @code{yytname} table is generated only if you use the +@code{%token-table} declaration. @xref{Decl Summary}. +@end itemize + +@node Token Values +@subsection Semantic Values of Tokens + +@vindex yylval +In an ordinary (non-reentrant) parser, the semantic value of the token must +be stored into the global variable @code{yylval}. When you are using +just one data type for semantic values, @code{yylval} has that type. +Thus, if the type is @code{int} (the default), you might write this in +@code{yylex}: + +@example +@group + @dots{} + yylval = value; /* Put value onto Bison stack. */ + return INT; /* Return the type of the token. */ + @dots{} +@end group +@end example + +When you are using multiple data types, @code{yylval}'s type is a union +made from the @code{%union} declaration (@pxref{Union Decl, ,The +Collection of Value Types}). So when you store a token's value, you +must use the proper member of the union. If the @code{%union} +declaration looks like this: + +@example +@group +%union @{ + int intval; + double val; + symrec *tptr; +@} +@end group +@end example + +@noindent +then the code in @code{yylex} might look like this: + +@example +@group + @dots{} + yylval.intval = value; /* Put value onto Bison stack. */ + return INT; /* Return the type of the token. */ + @dots{} +@end group +@end example + +@node Token Locations +@subsection Textual Locations of Tokens + +@vindex yylloc +If you are using the @samp{@@@var{n}}-feature (@pxref{Locations, , +Tracking Locations}) in actions to keep track of the +textual locations of tokens and groupings, then you must provide this +information in @code{yylex}. The function @code{yyparse} expects to +find the textual location of a token just parsed in the global variable +@code{yylloc}. So @code{yylex} must store the proper data in that +variable. + +By default, the value of @code{yylloc} is a structure and you need only +initialize the members that are going to be used by the actions. The +four members are called @code{first_line}, @code{first_column}, +@code{last_line} and @code{last_column}. Note that the use of this +feature makes the parser noticeably slower. + +@tindex YYLTYPE +The data type of @code{yylloc} has the name @code{YYLTYPE}. + +@node Pure Calling +@subsection Calling Conventions for Pure Parsers + +When you use the Bison declaration @code{%pure-parser} to request a +pure, reentrant parser, the global communication variables @code{yylval} +and @code{yylloc} cannot be used. (@xref{Pure Decl, ,A Pure (Reentrant) +Parser}.) In such parsers the two global variables are replaced by +pointers passed as arguments to @code{yylex}. You must declare them as +shown here, and pass the information back by storing it through those +pointers. + +@example +int +yylex (YYSTYPE *lvalp, YYLTYPE *llocp) +@{ + @dots{} + *lvalp = value; /* Put value onto Bison stack. */ + return INT; /* Return the type of the token. */ + @dots{} +@} +@end example + +If the grammar file does not use the @samp{@@} constructs to refer to +textual locations, then the type @code{YYLTYPE} will not be defined. In +this case, omit the second argument; @code{yylex} will be called with +only one argument. + + +If you wish to pass the additional parameter data to @code{yylex}, use +@code{%lex-param} just like @code{%parse-param} (@pxref{Parser +Function}). + +@deffn {Directive} lex-param @{@var{argument-declaration}@} +@findex %lex-param +Declare that @code{argument-declaration} is an additional @code{yylex} +argument declaration. +@end deffn + +For instance: + +@example +%parse-param @{int *nastiness@} +%lex-param @{int *nastiness@} +%parse-param @{int *randomness@} +@end example + +@noindent +results in the following signature: + +@example +int yylex (int *nastiness); +int yyparse (int *nastiness, int *randomness); +@end example + +If @code{%pure-parser} is added: + +@example +int yylex (YYSTYPE *lvalp, int *nastiness); +int yyparse (int *nastiness, int *randomness); +@end example + +@noindent +and finally, if both @code{%pure-parser} and @code{%locations} are used: + +@example +int yylex (YYSTYPE *lvalp, YYLTYPE *llocp, int *nastiness); +int yyparse (int *nastiness, int *randomness); +@end example + +@node Error Reporting +@section The Error Reporting Function @code{yyerror} +@cindex error reporting function +@findex yyerror +@cindex parse error +@cindex syntax error + +The Bison parser detects a @dfn{syntax error} or @dfn{parse error} +whenever it reads a token which cannot satisfy any syntax rule. An +action in the grammar can also explicitly proclaim an error, using the +macro @code{YYERROR} (@pxref{Action Features, ,Special Features for Use +in Actions}). + +The Bison parser expects to report the error by calling an error +reporting function named @code{yyerror}, which you must supply. It is +called by @code{yyparse} whenever a syntax error is found, and it +receives one argument. For a syntax error, the string is normally +@w{@code{"syntax error"}}. + +@findex %error-verbose +If you invoke the directive @code{%error-verbose} in the Bison +declarations section (@pxref{Bison Declarations, ,The Bison Declarations +Section}), then Bison provides a more verbose and specific error message +string instead of just plain @w{@code{"syntax error"}}. + +The parser can detect one other kind of error: stack overflow. This +happens when the input contains constructions that are very deeply +nested. It isn't likely you will encounter this, since the Bison +parser extends its stack automatically up to a very large limit. But +if overflow happens, @code{yyparse} calls @code{yyerror} in the usual +fashion, except that the argument string is @w{@code{"parser stack +overflow"}}. + +The following definition suffices in simple programs: + +@example +@group +void +yyerror (char const *s) +@{ +@end group +@group + fprintf (stderr, "%s\n", s); +@} +@end group +@end example + +After @code{yyerror} returns to @code{yyparse}, the latter will attempt +error recovery if you have written suitable error recovery grammar rules +(@pxref{Error Recovery}). If recovery is impossible, @code{yyparse} will +immediately return 1. + +Obviously, in location tracking pure parsers, @code{yyerror} should have +an access to the current location. This is indeed the case for the GLR +parsers, but not for the Yacc parser, for historical reasons. I.e., if +@samp{%locations %pure-parser} is passed then the prototypes for +@code{yyerror} are: + +@example +void yyerror (char const *msg); /* Yacc parsers. */ +void yyerror (YYLTYPE *locp, char const *msg); /* GLR parsers. */ +@end example + +If @samp{%parse-param @{int *nastiness@}} is used, then: + +@example +void yyerror (int *nastiness, char const *msg); /* Yacc parsers. */ +void yyerror (int *nastiness, char const *msg); /* GLR parsers. */ +@end example + +Finally, GLR and Yacc parsers share the same @code{yyerror} calling +convention for absolutely pure parsers, i.e., when the calling +convention of @code{yylex} @emph{and} the calling convention of +@code{%pure-parser} are pure. I.e.: + +@example +/* Location tracking. */ +%locations +/* Pure yylex. */ +%pure-parser +%lex-param @{int *nastiness@} +/* Pure yyparse. */ +%parse-param @{int *nastiness@} +%parse-param @{int *randomness@} +@end example + +@noindent +results in the following signatures for all the parser kinds: + +@example +int yylex (YYSTYPE *lvalp, YYLTYPE *llocp, int *nastiness); +int yyparse (int *nastiness, int *randomness); +void yyerror (YYLTYPE *locp, + int *nastiness, int *randomness, + char const *msg); +@end example + +@noindent +The prototypes are only indications of how the code produced by Bison +uses @code{yyerror}. Bison-generated code always ignores the returned +value, so @code{yyerror} can return any type, including @code{void}. +Also, @code{yyerror} can be a variadic function; that is why the +message is always passed last. + +Traditionally @code{yyerror} returns an @code{int} that is always +ignored, but this is purely for historical reasons, and @code{void} is +preferable since it more accurately describes the return type for +@code{yyerror}. + +@vindex yynerrs +The variable @code{yynerrs} contains the number of syntax errors +encountered so far. Normally this variable is global; but if you +request a pure parser (@pxref{Pure Decl, ,A Pure (Reentrant) Parser}) +then it is a local variable which only the actions can access. + +@node Action Features +@section Special Features for Use in Actions +@cindex summary, action features +@cindex action features summary + +Here is a table of Bison constructs, variables and macros that +are useful in actions. + +@deffn {Variable} $$ +Acts like a variable that contains the semantic value for the +grouping made by the current rule. @xref{Actions}. +@end deffn + +@deffn {Variable} $@var{n} +Acts like a variable that contains the semantic value for the +@var{n}th component of the current rule. @xref{Actions}. +@end deffn + +@deffn {Variable} $<@var{typealt}>$ +Like @code{$$} but specifies alternative @var{typealt} in the union +specified by the @code{%union} declaration. @xref{Action Types, ,Data +Types of Values in Actions}. +@end deffn + +@deffn {Variable} $<@var{typealt}>@var{n} +Like @code{$@var{n}} but specifies alternative @var{typealt} in the +union specified by the @code{%union} declaration. +@xref{Action Types, ,Data Types of Values in Actions}. +@end deffn + +@deffn {Macro} YYABORT; +Return immediately from @code{yyparse}, indicating failure. +@xref{Parser Function, ,The Parser Function @code{yyparse}}. +@end deffn + +@deffn {Macro} YYACCEPT; +Return immediately from @code{yyparse}, indicating success. +@xref{Parser Function, ,The Parser Function @code{yyparse}}. +@end deffn + +@deffn {Macro} YYBACKUP (@var{token}, @var{value}); +@findex YYBACKUP +Unshift a token. This macro is allowed only for rules that reduce +a single value, and only when there is no look-ahead token. +It is also disallowed in @acronym{GLR} parsers. +It installs a look-ahead token with token type @var{token} and +semantic value @var{value}; then it discards the value that was +going to be reduced by this rule. + +If the macro is used when it is not valid, such as when there is +a look-ahead token already, then it reports a syntax error with +a message @samp{cannot back up} and performs ordinary error +recovery. + +In either case, the rest of the action is not executed. +@end deffn + +@deffn {Macro} YYEMPTY +@vindex YYEMPTY +Value stored in @code{yychar} when there is no look-ahead token. +@end deffn + +@deffn {Macro} YYERROR; +@findex YYERROR +Cause an immediate syntax error. This statement initiates error +recovery just as if the parser itself had detected an error; however, it +does not call @code{yyerror}, and does not print any message. If you +want to print an error message, call @code{yyerror} explicitly before +the @samp{YYERROR;} statement. @xref{Error Recovery}. +@end deffn + +@deffn {Macro} YYRECOVERING +This macro stands for an expression that has the value 1 when the parser +is recovering from a syntax error, and 0 the rest of the time. +@xref{Error Recovery}. +@end deffn + +@deffn {Variable} yychar +Variable containing the current look-ahead token. (In a pure parser, +this is actually a local variable within @code{yyparse}.) When there is +no look-ahead token, the value @code{YYEMPTY} is stored in the variable. +@xref{Look-Ahead, ,Look-Ahead Tokens}. +@end deffn + +@deffn {Macro} yyclearin; +Discard the current look-ahead token. This is useful primarily in +error rules. @xref{Error Recovery}. +@end deffn + +@deffn {Macro} yyerrok; +Resume generating error messages immediately for subsequent syntax +errors. This is useful primarily in error rules. +@xref{Error Recovery}. +@end deffn + +@deffn {Value} @@$ +@findex @@$ +Acts like a structure variable containing information on the textual location +of the grouping made by the current rule. @xref{Locations, , +Tracking Locations}. + +@c Check if those paragraphs are still useful or not. + +@c @example +@c struct @{ +@c int first_line, last_line; +@c int first_column, last_column; +@c @}; +@c @end example + +@c Thus, to get the starting line number of the third component, you would +@c use @samp{@@3.first_line}. + +@c In order for the members of this structure to contain valid information, +@c you must make @code{yylex} supply this information about each token. +@c If you need only certain members, then @code{yylex} need only fill in +@c those members. + +@c The use of this feature makes the parser noticeably slower. +@end deffn + +@deffn {Value} @@@var{n} +@findex @@@var{n} +Acts like a structure variable containing information on the textual location +of the @var{n}th component of the current rule. @xref{Locations, , +Tracking Locations}. +@end deffn + + +@node Algorithm +@chapter The Bison Parser Algorithm +@cindex Bison parser algorithm +@cindex algorithm of parser +@cindex shifting +@cindex reduction +@cindex parser stack +@cindex stack, parser + +As Bison reads tokens, it pushes them onto a stack along with their +semantic values. The stack is called the @dfn{parser stack}. Pushing a +token is traditionally called @dfn{shifting}. + +For example, suppose the infix calculator has read @samp{1 + 5 *}, with a +@samp{3} to come. The stack will have four elements, one for each token +that was shifted. + +But the stack does not always have an element for each token read. When +the last @var{n} tokens and groupings shifted match the components of a +grammar rule, they can be combined according to that rule. This is called +@dfn{reduction}. Those tokens and groupings are replaced on the stack by a +single grouping whose symbol is the result (left hand side) of that rule. +Running the rule's action is part of the process of reduction, because this +is what computes the semantic value of the resulting grouping. + +For example, if the infix calculator's parser stack contains this: + +@example +1 + 5 * 3 +@end example + +@noindent +and the next input token is a newline character, then the last three +elements can be reduced to 15 via the rule: + +@example +expr: expr '*' expr; +@end example + +@noindent +Then the stack contains just these three elements: + +@example +1 + 15 +@end example + +@noindent +At this point, another reduction can be made, resulting in the single value +16. Then the newline token can be shifted. + +The parser tries, by shifts and reductions, to reduce the entire input down +to a single grouping whose symbol is the grammar's start-symbol +(@pxref{Language and Grammar, ,Languages and Context-Free Grammars}). + +This kind of parser is known in the literature as a bottom-up parser. + +@menu +* Look-Ahead:: Parser looks one token ahead when deciding what to do. +* Shift/Reduce:: Conflicts: when either shifting or reduction is valid. +* Precedence:: Operator precedence works by resolving conflicts. +* Contextual Precedence:: When an operator's precedence depends on context. +* Parser States:: The parser is a finite-state-machine with stack. +* Reduce/Reduce:: When two rules are applicable in the same situation. +* Mystery Conflicts:: Reduce/reduce conflicts that look unjustified. +* Generalized LR Parsing:: Parsing arbitrary context-free grammars. +* Stack Overflow:: What happens when stack gets full. How to avoid it. +@end menu + +@node Look-Ahead +@section Look-Ahead Tokens +@cindex look-ahead token + +The Bison parser does @emph{not} always reduce immediately as soon as the +last @var{n} tokens and groupings match a rule. This is because such a +simple strategy is inadequate to handle most languages. Instead, when a +reduction is possible, the parser sometimes ``looks ahead'' at the next +token in order to decide what to do. + +When a token is read, it is not immediately shifted; first it becomes the +@dfn{look-ahead token}, which is not on the stack. Now the parser can +perform one or more reductions of tokens and groupings on the stack, while +the look-ahead token remains off to the side. When no more reductions +should take place, the look-ahead token is shifted onto the stack. This +does not mean that all possible reductions have been done; depending on the +token type of the look-ahead token, some rules may choose to delay their +application. + +Here is a simple case where look-ahead is needed. These three rules define +expressions which contain binary addition operators and postfix unary +factorial operators (@samp{!}), and allow parentheses for grouping. + +@example +@group +expr: term '+' expr + | term + ; +@end group + +@group +term: '(' expr ')' + | term '!' + | NUMBER + ; +@end group +@end example + +Suppose that the tokens @w{@samp{1 + 2}} have been read and shifted; what +should be done? If the following token is @samp{)}, then the first three +tokens must be reduced to form an @code{expr}. This is the only valid +course, because shifting the @samp{)} would produce a sequence of symbols +@w{@code{term ')'}}, and no rule allows this. + +If the following token is @samp{!}, then it must be shifted immediately so +that @w{@samp{2 !}} can be reduced to make a @code{term}. If instead the +parser were to reduce before shifting, @w{@samp{1 + 2}} would become an +@code{expr}. It would then be impossible to shift the @samp{!} because +doing so would produce on the stack the sequence of symbols @code{expr +'!'}. No rule allows that sequence. + +@vindex yychar +The current look-ahead token is stored in the variable @code{yychar}. +@xref{Action Features, ,Special Features for Use in Actions}. + +@node Shift/Reduce +@section Shift/Reduce Conflicts +@cindex conflicts +@cindex shift/reduce conflicts +@cindex dangling @code{else} +@cindex @code{else}, dangling + +Suppose we are parsing a language which has if-then and if-then-else +statements, with a pair of rules like this: + +@example +@group +if_stmt: + IF expr THEN stmt + | IF expr THEN stmt ELSE stmt + ; +@end group +@end example + +@noindent +Here we assume that @code{IF}, @code{THEN} and @code{ELSE} are +terminal symbols for specific keyword tokens. + +When the @code{ELSE} token is read and becomes the look-ahead token, the +contents of the stack (assuming the input is valid) are just right for +reduction by the first rule. But it is also legitimate to shift the +@code{ELSE}, because that would lead to eventual reduction by the second +rule. + +This situation, where either a shift or a reduction would be valid, is +called a @dfn{shift/reduce conflict}. Bison is designed to resolve +these conflicts by choosing to shift, unless otherwise directed by +operator precedence declarations. To see the reason for this, let's +contrast it with the other alternative. + +Since the parser prefers to shift the @code{ELSE}, the result is to attach +the else-clause to the innermost if-statement, making these two inputs +equivalent: + +@example +if x then if y then win (); else lose; + +if x then do; if y then win (); else lose; end; +@end example + +But if the parser chose to reduce when possible rather than shift, the +result would be to attach the else-clause to the outermost if-statement, +making these two inputs equivalent: + +@example +if x then if y then win (); else lose; + +if x then do; if y then win (); end; else lose; +@end example + +The conflict exists because the grammar as written is ambiguous: either +parsing of the simple nested if-statement is legitimate. The established +convention is that these ambiguities are resolved by attaching the +else-clause to the innermost if-statement; this is what Bison accomplishes +by choosing to shift rather than reduce. (It would ideally be cleaner to +write an unambiguous grammar, but that is very hard to do in this case.) +This particular ambiguity was first encountered in the specifications of +Algol 60 and is called the ``dangling @code{else}'' ambiguity. + +To avoid warnings from Bison about predictable, legitimate shift/reduce +conflicts, use the @code{%expect @var{n}} declaration. There will be no +warning as long as the number of shift/reduce conflicts is exactly @var{n}. +@xref{Expect Decl, ,Suppressing Conflict Warnings}. + +The definition of @code{if_stmt} above is solely to blame for the +conflict, but the conflict does not actually appear without additional +rules. Here is a complete Bison input file that actually manifests the +conflict: + +@example +@group +%token IF THEN ELSE variable +%% +@end group +@group +stmt: expr + | if_stmt + ; +@end group + +@group +if_stmt: + IF expr THEN stmt + | IF expr THEN stmt ELSE stmt + ; +@end group + +expr: variable + ; +@end example + +@node Precedence +@section Operator Precedence +@cindex operator precedence +@cindex precedence of operators + +Another situation where shift/reduce conflicts appear is in arithmetic +expressions. Here shifting is not always the preferred resolution; the +Bison declarations for operator precedence allow you to specify when to +shift and when to reduce. + +@menu +* Why Precedence:: An example showing why precedence is needed. +* Using Precedence:: How to specify precedence in Bison grammars. +* Precedence Examples:: How these features are used in the previous example. +* How Precedence:: How they work. +@end menu + +@node Why Precedence +@subsection When Precedence is Needed + +Consider the following ambiguous grammar fragment (ambiguous because the +input @w{@samp{1 - 2 * 3}} can be parsed in two different ways): + +@example +@group +expr: expr '-' expr + | expr '*' expr + | expr '<' expr + | '(' expr ')' + @dots{} + ; +@end group +@end example + +@noindent +Suppose the parser has seen the tokens @samp{1}, @samp{-} and @samp{2}; +should it reduce them via the rule for the subtraction operator? It +depends on the next token. Of course, if the next token is @samp{)}, we +must reduce; shifting is invalid because no single rule can reduce the +token sequence @w{@samp{- 2 )}} or anything starting with that. But if +the next token is @samp{*} or @samp{<}, we have a choice: either +shifting or reduction would allow the parse to complete, but with +different results. + +To decide which one Bison should do, we must consider the results. If +the next operator token @var{op} is shifted, then it must be reduced +first in order to permit another opportunity to reduce the difference. +The result is (in effect) @w{@samp{1 - (2 @var{op} 3)}}. On the other +hand, if the subtraction is reduced before shifting @var{op}, the result +is @w{@samp{(1 - 2) @var{op} 3}}. Clearly, then, the choice of shift or +reduce should depend on the relative precedence of the operators +@samp{-} and @var{op}: @samp{*} should be shifted first, but not +@samp{<}. + +@cindex associativity +What about input such as @w{@samp{1 - 2 - 5}}; should this be +@w{@samp{(1 - 2) - 5}} or should it be @w{@samp{1 - (2 - 5)}}? For most +operators we prefer the former, which is called @dfn{left association}. +The latter alternative, @dfn{right association}, is desirable for +assignment operators. The choice of left or right association is a +matter of whether the parser chooses to shift or reduce when the stack +contains @w{@samp{1 - 2}} and the look-ahead token is @samp{-}: shifting +makes right-associativity. + +@node Using Precedence +@subsection Specifying Operator Precedence +@findex %left +@findex %right +@findex %nonassoc + +Bison allows you to specify these choices with the operator precedence +declarations @code{%left} and @code{%right}. Each such declaration +contains a list of tokens, which are operators whose precedence and +associativity is being declared. The @code{%left} declaration makes all +those operators left-associative and the @code{%right} declaration makes +them right-associative. A third alternative is @code{%nonassoc}, which +declares that it is a syntax error to find the same operator twice ``in a +row''. + +The relative precedence of different operators is controlled by the +order in which they are declared. The first @code{%left} or +@code{%right} declaration in the file declares the operators whose +precedence is lowest, the next such declaration declares the operators +whose precedence is a little higher, and so on. + +@node Precedence Examples +@subsection Precedence Examples + +In our example, we would want the following declarations: + +@example +%left '<' +%left '-' +%left '*' +@end example + +In a more complete example, which supports other operators as well, we +would declare them in groups of equal precedence. For example, @code{'+'} is +declared with @code{'-'}: + +@example +%left '<' '>' '=' NE LE GE +%left '+' '-' +%left '*' '/' +@end example + +@noindent +(Here @code{NE} and so on stand for the operators for ``not equal'' +and so on. We assume that these tokens are more than one character long +and therefore are represented by names, not character literals.) + +@node How Precedence +@subsection How Precedence Works + +The first effect of the precedence declarations is to assign precedence +levels to the terminal symbols declared. The second effect is to assign +precedence levels to certain rules: each rule gets its precedence from +the last terminal symbol mentioned in the components. (You can also +specify explicitly the precedence of a rule. @xref{Contextual +Precedence, ,Context-Dependent Precedence}.) + +Finally, the resolution of conflicts works by comparing the precedence +of the rule being considered with that of the look-ahead token. If the +token's precedence is higher, the choice is to shift. If the rule's +precedence is higher, the choice is to reduce. If they have equal +precedence, the choice is made based on the associativity of that +precedence level. The verbose output file made by @samp{-v} +(@pxref{Invocation, ,Invoking Bison}) says how each conflict was +resolved. + +Not all rules and not all tokens have precedence. If either the rule or +the look-ahead token has no precedence, then the default is to shift. + +@node Contextual Precedence +@section Context-Dependent Precedence +@cindex context-dependent precedence +@cindex unary operator precedence +@cindex precedence, context-dependent +@cindex precedence, unary operator +@findex %prec + +Often the precedence of an operator depends on the context. This sounds +outlandish at first, but it is really very common. For example, a minus +sign typically has a very high precedence as a unary operator, and a +somewhat lower precedence (lower than multiplication) as a binary operator. + +The Bison precedence declarations, @code{%left}, @code{%right} and +@code{%nonassoc}, can only be used once for a given token; so a token has +only one precedence declared in this way. For context-dependent +precedence, you need to use an additional mechanism: the @code{%prec} +modifier for rules. + +The @code{%prec} modifier declares the precedence of a particular rule by +specifying a terminal symbol whose precedence should be used for that rule. +It's not necessary for that symbol to appear otherwise in the rule. The +modifier's syntax is: + +@example +%prec @var{terminal-symbol} +@end example + +@noindent +and it is written after the components of the rule. Its effect is to +assign the rule the precedence of @var{terminal-symbol}, overriding +the precedence that would be deduced for it in the ordinary way. The +altered rule precedence then affects how conflicts involving that rule +are resolved (@pxref{Precedence, ,Operator Precedence}). + +Here is how @code{%prec} solves the problem of unary minus. First, declare +a precedence for a fictitious terminal symbol named @code{UMINUS}. There +are no tokens of this type, but the symbol serves to stand for its +precedence: + +@example +@dots{} +%left '+' '-' +%left '*' +%left UMINUS +@end example + +Now the precedence of @code{UMINUS} can be used in specific rules: + +@example +@group +exp: @dots{} + | exp '-' exp + @dots{} + | '-' exp %prec UMINUS +@end group +@end example + +@ifset defaultprec +If you forget to append @code{%prec UMINUS} to the rule for unary +minus, Bison silently assumes that minus has its usual precedence. +This kind of problem can be tricky to debug, since one typically +discovers the mistake only by testing the code. + +The @code{%no-default-prec;} declaration makes it easier to discover +this kind of problem systematically. It causes rules that lack a +@code{%prec} modifier to have no precedence, even if the last terminal +symbol mentioned in their components has a declared precedence. + +If @code{%no-default-prec;} is in effect, you must specify @code{%prec} +for all rules that participate in precedence conflict resolution. +Then you will see any shift/reduce conflict until you tell Bison how +to resolve it, either by changing your grammar or by adding an +explicit precedence. This will probably add declarations to the +grammar, but it helps to protect against incorrect rule precedences. + +The effect of @code{%no-default-prec;} can be reversed by giving +@code{%default-prec;}, which is the default. +@end ifset + +@node Parser States +@section Parser States +@cindex finite-state machine +@cindex parser state +@cindex state (of parser) + +The function @code{yyparse} is implemented using a finite-state machine. +The values pushed on the parser stack are not simply token type codes; they +represent the entire sequence of terminal and nonterminal symbols at or +near the top of the stack. The current state collects all the information +about previous input which is relevant to deciding what to do next. + +Each time a look-ahead token is read, the current parser state together +with the type of look-ahead token are looked up in a table. This table +entry can say, ``Shift the look-ahead token.'' In this case, it also +specifies the new parser state, which is pushed onto the top of the +parser stack. Or it can say, ``Reduce using rule number @var{n}.'' +This means that a certain number of tokens or groupings are taken off +the top of the stack, and replaced by one grouping. In other words, +that number of states are popped from the stack, and one new state is +pushed. + +There is one other alternative: the table can say that the look-ahead token +is erroneous in the current state. This causes error processing to begin +(@pxref{Error Recovery}). + +@node Reduce/Reduce +@section Reduce/Reduce Conflicts +@cindex reduce/reduce conflict +@cindex conflicts, reduce/reduce + +A reduce/reduce conflict occurs if there are two or more rules that apply +to the same sequence of input. This usually indicates a serious error +in the grammar. + +For example, here is an erroneous attempt to define a sequence +of zero or more @code{word} groupings. + +@example +sequence: /* empty */ + @{ printf ("empty sequence\n"); @} + | maybeword + | sequence word + @{ printf ("added word %s\n", $2); @} + ; + +maybeword: /* empty */ + @{ printf ("empty maybeword\n"); @} + | word + @{ printf ("single word %s\n", $1); @} + ; +@end example + +@noindent +The error is an ambiguity: there is more than one way to parse a single +@code{word} into a @code{sequence}. It could be reduced to a +@code{maybeword} and then into a @code{sequence} via the second rule. +Alternatively, nothing-at-all could be reduced into a @code{sequence} +via the first rule, and this could be combined with the @code{word} +using the third rule for @code{sequence}. + +There is also more than one way to reduce nothing-at-all into a +@code{sequence}. This can be done directly via the first rule, +or indirectly via @code{maybeword} and then the second rule. + +You might think that this is a distinction without a difference, because it +does not change whether any particular input is valid or not. But it does +affect which actions are run. One parsing order runs the second rule's +action; the other runs the first rule's action and the third rule's action. +In this example, the output of the program changes. + +Bison resolves a reduce/reduce conflict by choosing to use the rule that +appears first in the grammar, but it is very risky to rely on this. Every +reduce/reduce conflict must be studied and usually eliminated. Here is the +proper way to define @code{sequence}: + +@example +sequence: /* empty */ + @{ printf ("empty sequence\n"); @} + | sequence word + @{ printf ("added word %s\n", $2); @} + ; +@end example + +Here is another common error that yields a reduce/reduce conflict: + +@example +sequence: /* empty */ + | sequence words + | sequence redirects + ; + +words: /* empty */ + | words word + ; + +redirects:/* empty */ + | redirects redirect + ; +@end example + +@noindent +The intention here is to define a sequence which can contain either +@code{word} or @code{redirect} groupings. The individual definitions of +@code{sequence}, @code{words} and @code{redirects} are error-free, but the +three together make a subtle ambiguity: even an empty input can be parsed +in infinitely many ways! + +Consider: nothing-at-all could be a @code{words}. Or it could be two +@code{words} in a row, or three, or any number. It could equally well be a +@code{redirects}, or two, or any number. Or it could be a @code{words} +followed by three @code{redirects} and another @code{words}. And so on. + +Here are two ways to correct these rules. First, to make it a single level +of sequence: + +@example +sequence: /* empty */ + | sequence word + | sequence redirect + ; +@end example + +Second, to prevent either a @code{words} or a @code{redirects} +from being empty: + +@example +sequence: /* empty */ + | sequence words + | sequence redirects + ; + +words: word + | words word + ; + +redirects:redirect + | redirects redirect + ; +@end example + +@node Mystery Conflicts +@section Mysterious Reduce/Reduce Conflicts + +Sometimes reduce/reduce conflicts can occur that don't look warranted. +Here is an example: + +@example +@group +%token ID + +%% +def: param_spec return_spec ',' + ; +param_spec: + type + | name_list ':' type + ; +@end group +@group +return_spec: + type + | name ':' type + ; +@end group +@group +type: ID + ; +@end group +@group +name: ID + ; +name_list: + name + | name ',' name_list + ; +@end group +@end example + +It would seem that this grammar can be parsed with only a single token +of look-ahead: when a @code{param_spec} is being read, an @code{ID} is +a @code{name} if a comma or colon follows, or a @code{type} if another +@code{ID} follows. In other words, this grammar is @acronym{LR}(1). + +@cindex @acronym{LR}(1) +@cindex @acronym{LALR}(1) +However, Bison, like most parser generators, cannot actually handle all +@acronym{LR}(1) grammars. In this grammar, two contexts, that after +an @code{ID} +at the beginning of a @code{param_spec} and likewise at the beginning of +a @code{return_spec}, are similar enough that Bison assumes they are the +same. They appear similar because the same set of rules would be +active---the rule for reducing to a @code{name} and that for reducing to +a @code{type}. Bison is unable to determine at that stage of processing +that the rules would require different look-ahead tokens in the two +contexts, so it makes a single parser state for them both. Combining +the two contexts causes a conflict later. In parser terminology, this +occurrence means that the grammar is not @acronym{LALR}(1). + +In general, it is better to fix deficiencies than to document them. But +this particular deficiency is intrinsically hard to fix; parser +generators that can handle @acronym{LR}(1) grammars are hard to write +and tend to +produce parsers that are very large. In practice, Bison is more useful +as it is now. + +When the problem arises, you can often fix it by identifying the two +parser states that are being confused, and adding something to make them +look distinct. In the above example, adding one rule to +@code{return_spec} as follows makes the problem go away: + +@example +@group +%token BOGUS +@dots{} +%% +@dots{} +return_spec: + type + | name ':' type + /* This rule is never used. */ + | ID BOGUS + ; +@end group +@end example + +This corrects the problem because it introduces the possibility of an +additional active rule in the context after the @code{ID} at the beginning of +@code{return_spec}. This rule is not active in the corresponding context +in a @code{param_spec}, so the two contexts receive distinct parser states. +As long as the token @code{BOGUS} is never generated by @code{yylex}, +the added rule cannot alter the way actual input is parsed. + +In this particular example, there is another way to solve the problem: +rewrite the rule for @code{return_spec} to use @code{ID} directly +instead of via @code{name}. This also causes the two confusing +contexts to have different sets of active rules, because the one for +@code{return_spec} activates the altered rule for @code{return_spec} +rather than the one for @code{name}. + +@example +param_spec: + type + | name_list ':' type + ; +return_spec: + type + | ID ':' type + ; +@end example + +@node Generalized LR Parsing +@section Generalized @acronym{LR} (@acronym{GLR}) Parsing +@cindex @acronym{GLR} parsing +@cindex generalized @acronym{LR} (@acronym{GLR}) parsing +@cindex ambiguous grammars +@cindex non-deterministic parsing + +Bison produces @emph{deterministic} parsers that choose uniquely +when to reduce and which reduction to apply +based on a summary of the preceding input and on one extra token of lookahead. +As a result, normal Bison handles a proper subset of the family of +context-free languages. +Ambiguous grammars, since they have strings with more than one possible +sequence of reductions cannot have deterministic parsers in this sense. +The same is true of languages that require more than one symbol of +lookahead, since the parser lacks the information necessary to make a +decision at the point it must be made in a shift-reduce parser. +Finally, as previously mentioned (@pxref{Mystery Conflicts}), +there are languages where Bison's particular choice of how to +summarize the input seen so far loses necessary information. + +When you use the @samp{%glr-parser} declaration in your grammar file, +Bison generates a parser that uses a different algorithm, called +Generalized @acronym{LR} (or @acronym{GLR}). A Bison @acronym{GLR} +parser uses the same basic +algorithm for parsing as an ordinary Bison parser, but behaves +differently in cases where there is a shift-reduce conflict that has not +been resolved by precedence rules (@pxref{Precedence}) or a +reduce-reduce conflict. When a @acronym{GLR} parser encounters such a +situation, it +effectively @emph{splits} into a several parsers, one for each possible +shift or reduction. These parsers then proceed as usual, consuming +tokens in lock-step. Some of the stacks may encounter other conflicts +and split further, with the result that instead of a sequence of states, +a Bison @acronym{GLR} parsing stack is what is in effect a tree of states. + +In effect, each stack represents a guess as to what the proper parse +is. Additional input may indicate that a guess was wrong, in which case +the appropriate stack silently disappears. Otherwise, the semantics +actions generated in each stack are saved, rather than being executed +immediately. When a stack disappears, its saved semantic actions never +get executed. When a reduction causes two stacks to become equivalent, +their sets of semantic actions are both saved with the state that +results from the reduction. We say that two stacks are equivalent +when they both represent the same sequence of states, +and each pair of corresponding states represents a +grammar symbol that produces the same segment of the input token +stream. + +Whenever the parser makes a transition from having multiple +states to having one, it reverts to the normal @acronym{LALR}(1) parsing +algorithm, after resolving and executing the saved-up actions. +At this transition, some of the states on the stack will have semantic +values that are sets (actually multisets) of possible actions. The +parser tries to pick one of the actions by first finding one whose rule +has the highest dynamic precedence, as set by the @samp{%dprec} +declaration. Otherwise, if the alternative actions are not ordered by +precedence, but there the same merging function is declared for both +rules by the @samp{%merge} declaration, +Bison resolves and evaluates both and then calls the merge function on +the result. Otherwise, it reports an ambiguity. + +It is possible to use a data structure for the @acronym{GLR} parsing tree that +permits the processing of any @acronym{LALR}(1) grammar in linear time (in the +size of the input), any unambiguous (not necessarily +@acronym{LALR}(1)) grammar in +quadratic worst-case time, and any general (possibly ambiguous) +context-free grammar in cubic worst-case time. However, Bison currently +uses a simpler data structure that requires time proportional to the +length of the input times the maximum number of stacks required for any +prefix of the input. Thus, really ambiguous or non-deterministic +grammars can require exponential time and space to process. Such badly +behaving examples, however, are not generally of practical interest. +Usually, non-determinism in a grammar is local---the parser is ``in +doubt'' only for a few tokens at a time. Therefore, the current data +structure should generally be adequate. On @acronym{LALR}(1) portions of a +grammar, in particular, it is only slightly slower than with the default +Bison parser. + +For a more detailed exposition of GLR parsers, please see: Elizabeth +Scott, Adrian Johnstone and Shamsa Sadaf Hussain, Tomita-Style +Generalised @acronym{LR} Parsers, Royal Holloway, University of +London, Department of Computer Science, TR-00-12, +@uref{http://www.cs.rhul.ac.uk/research/languages/publications/tomita_style_1.ps}, +(2000-12-24). + +@node Stack Overflow +@section Stack Overflow, and How to Avoid It +@cindex stack overflow +@cindex parser stack overflow +@cindex overflow of parser stack + +The Bison parser stack can overflow if too many tokens are shifted and +not reduced. When this happens, the parser function @code{yyparse} +returns a nonzero value, pausing only to call @code{yyerror} to report +the overflow. + +Because Bison parsers have growing stacks, hitting the upper limit +usually results from using a right recursion instead of a left +recursion, @xref{Recursion, ,Recursive Rules}. + +@vindex YYMAXDEPTH +By defining the macro @code{YYMAXDEPTH}, you can control how deep the +parser stack can become before a stack overflow occurs. Define the +macro with a value that is an integer. This value is the maximum number +of tokens that can be shifted (and not reduced) before overflow. +It must be a constant expression whose value is known at compile time. + +The stack space allowed is not necessarily allocated. If you specify a +large value for @code{YYMAXDEPTH}, the parser actually allocates a small +stack at first, and then makes it bigger by stages as needed. This +increasing allocation happens automatically and silently. Therefore, +you do not need to make @code{YYMAXDEPTH} painfully small merely to save +space for ordinary inputs that do not need much stack. + +@cindex default stack limit +The default value of @code{YYMAXDEPTH}, if you do not define it, is +10000. + +@vindex YYINITDEPTH +You can control how much stack is allocated initially by defining the +macro @code{YYINITDEPTH}. This value too must be a compile-time +constant integer. The default is 200. + +@c FIXME: C++ output. +Because of semantical differences between C and C++, the +@acronym{LALR}(1) parsers +in C produced by Bison by compiled as C++ cannot grow. In this precise +case (compiling a C parser as C++) you are suggested to grow +@code{YYINITDEPTH}. In the near future, a C++ output output will be +provided which addresses this issue. + +@node Error Recovery +@chapter Error Recovery +@cindex error recovery +@cindex recovery from errors + +It is not usually acceptable to have a program terminate on a syntax +error. For example, a compiler should recover sufficiently to parse the +rest of the input file and check it for errors; a calculator should accept +another expression. + +In a simple interactive command parser where each input is one line, it may +be sufficient to allow @code{yyparse} to return 1 on error and have the +caller ignore the rest of the input line when that happens (and then call +@code{yyparse} again). But this is inadequate for a compiler, because it +forgets all the syntactic context leading up to the error. A syntax error +deep within a function in the compiler input should not cause the compiler +to treat the following line like the beginning of a source file. + +@findex error +You can define how to recover from a syntax error by writing rules to +recognize the special token @code{error}. This is a terminal symbol that +is always defined (you need not declare it) and reserved for error +handling. The Bison parser generates an @code{error} token whenever a +syntax error happens; if you have provided a rule to recognize this token +in the current context, the parse can continue. + +For example: + +@example +stmnts: /* empty string */ + | stmnts '\n' + | stmnts exp '\n' + | stmnts error '\n' +@end example + +The fourth rule in this example says that an error followed by a newline +makes a valid addition to any @code{stmnts}. + +What happens if a syntax error occurs in the middle of an @code{exp}? The +error recovery rule, interpreted strictly, applies to the precise sequence +of a @code{stmnts}, an @code{error} and a newline. If an error occurs in +the middle of an @code{exp}, there will probably be some additional tokens +and subexpressions on the stack after the last @code{stmnts}, and there +will be tokens to read before the next newline. So the rule is not +applicable in the ordinary way. + +But Bison can force the situation to fit the rule, by discarding part of +the semantic context and part of the input. First it discards states +and objects from the stack until it gets back to a state in which the +@code{error} token is acceptable. (This means that the subexpressions +already parsed are discarded, back to the last complete @code{stmnts}.) +At this point the @code{error} token can be shifted. Then, if the old +look-ahead token is not acceptable to be shifted next, the parser reads +tokens and discards them until it finds a token which is acceptable. In +this example, Bison reads and discards input until the next newline so +that the fourth rule can apply. Note that discarded symbols are +possible sources of memory leaks, see @ref{Destructor Decl, , Freeing +Discarded Symbols}, for a means to reclaim this memory. + +The choice of error rules in the grammar is a choice of strategies for +error recovery. A simple and useful strategy is simply to skip the rest of +the current input line or current statement if an error is detected: + +@example +stmnt: error ';' /* On error, skip until ';' is read. */ +@end example + +It is also useful to recover to the matching close-delimiter of an +opening-delimiter that has already been parsed. Otherwise the +close-delimiter will probably appear to be unmatched, and generate another, +spurious error message: + +@example +primary: '(' expr ')' + | '(' error ')' + @dots{} + ; +@end example + +Error recovery strategies are necessarily guesses. When they guess wrong, +one syntax error often leads to another. In the above example, the error +recovery rule guesses that an error is due to bad input within one +@code{stmnt}. Suppose that instead a spurious semicolon is inserted in the +middle of a valid @code{stmnt}. After the error recovery rule recovers +from the first error, another syntax error will be found straightaway, +since the text following the spurious semicolon is also an invalid +@code{stmnt}. + +To prevent an outpouring of error messages, the parser will output no error +message for another syntax error that happens shortly after the first; only +after three consecutive input tokens have been successfully shifted will +error messages resume. + +Note that rules which accept the @code{error} token may have actions, just +as any other rules can. + +@findex yyerrok +You can make error messages resume immediately by using the macro +@code{yyerrok} in an action. If you do this in the error rule's action, no +error messages will be suppressed. This macro requires no arguments; +@samp{yyerrok;} is a valid C statement. + +@findex yyclearin +The previous look-ahead token is reanalyzed immediately after an error. If +this is unacceptable, then the macro @code{yyclearin} may be used to clear +this token. Write the statement @samp{yyclearin;} in the error rule's +action. + +For example, suppose that on a syntax error, an error handling routine is +called that advances the input stream to some point where parsing should +once again commence. The next symbol returned by the lexical scanner is +probably correct. The previous look-ahead token ought to be discarded +with @samp{yyclearin;}. + +@vindex YYRECOVERING +The macro @code{YYRECOVERING} stands for an expression that has the +value 1 when the parser is recovering from a syntax error, and 0 the +rest of the time. A value of 1 indicates that error messages are +currently suppressed for new syntax errors. + +@node Context Dependency +@chapter Handling Context Dependencies + +The Bison paradigm is to parse tokens first, then group them into larger +syntactic units. In many languages, the meaning of a token is affected by +its context. Although this violates the Bison paradigm, certain techniques +(known as @dfn{kludges}) may enable you to write Bison parsers for such +languages. + +@menu +* Semantic Tokens:: Token parsing can depend on the semantic context. +* Lexical Tie-ins:: Token parsing can depend on the syntactic context. +* Tie-in Recovery:: Lexical tie-ins have implications for how + error recovery rules must be written. +@end menu + +(Actually, ``kludge'' means any technique that gets its job done but is +neither clean nor robust.) + +@node Semantic Tokens +@section Semantic Info in Token Types + +The C language has a context dependency: the way an identifier is used +depends on what its current meaning is. For example, consider this: + +@example +foo (x); +@end example + +This looks like a function call statement, but if @code{foo} is a typedef +name, then this is actually a declaration of @code{x}. How can a Bison +parser for C decide how to parse this input? + +The method used in @acronym{GNU} C is to have two different token types, +@code{IDENTIFIER} and @code{TYPENAME}. When @code{yylex} finds an +identifier, it looks up the current declaration of the identifier in order +to decide which token type to return: @code{TYPENAME} if the identifier is +declared as a typedef, @code{IDENTIFIER} otherwise. + +The grammar rules can then express the context dependency by the choice of +token type to recognize. @code{IDENTIFIER} is accepted as an expression, +but @code{TYPENAME} is not. @code{TYPENAME} can start a declaration, but +@code{IDENTIFIER} cannot. In contexts where the meaning of the identifier +is @emph{not} significant, such as in declarations that can shadow a +typedef name, either @code{TYPENAME} or @code{IDENTIFIER} is +accepted---there is one rule for each of the two token types. + +This technique is simple to use if the decision of which kinds of +identifiers to allow is made at a place close to where the identifier is +parsed. But in C this is not always so: C allows a declaration to +redeclare a typedef name provided an explicit type has been specified +earlier: + +@example +typedef int foo, bar, lose; +static foo (bar); /* @r{redeclare @code{bar} as static variable} */ +static int foo (lose); /* @r{redeclare @code{foo} as function} */ +@end example + +Unfortunately, the name being declared is separated from the declaration +construct itself by a complicated syntactic structure---the ``declarator''. + +As a result, part of the Bison parser for C needs to be duplicated, with +all the nonterminal names changed: once for parsing a declaration in +which a typedef name can be redefined, and once for parsing a +declaration in which that can't be done. Here is a part of the +duplication, with actions omitted for brevity: + +@example +initdcl: + declarator maybeasm '=' + init + | declarator maybeasm + ; + +notype_initdcl: + notype_declarator maybeasm '=' + init + | notype_declarator maybeasm + ; +@end example + +@noindent +Here @code{initdcl} can redeclare a typedef name, but @code{notype_initdcl} +cannot. The distinction between @code{declarator} and +@code{notype_declarator} is the same sort of thing. + +There is some similarity between this technique and a lexical tie-in +(described next), in that information which alters the lexical analysis is +changed during parsing by other parts of the program. The difference is +here the information is global, and is used for other purposes in the +program. A true lexical tie-in has a special-purpose flag controlled by +the syntactic context. + +@node Lexical Tie-ins +@section Lexical Tie-ins +@cindex lexical tie-in + +One way to handle context-dependency is the @dfn{lexical tie-in}: a flag +which is set by Bison actions, whose purpose is to alter the way tokens are +parsed. + +For example, suppose we have a language vaguely like C, but with a special +construct @samp{hex (@var{hex-expr})}. After the keyword @code{hex} comes +an expression in parentheses in which all integers are hexadecimal. In +particular, the token @samp{a1b} must be treated as an integer rather than +as an identifier if it appears in that context. Here is how you can do it: + +@example +@group +%@{ + int hexflag; + int yylex (void); + void yyerror (char const *); +%@} +%% +@dots{} +@end group +@group +expr: IDENTIFIER + | constant + | HEX '(' + @{ hexflag = 1; @} + expr ')' + @{ hexflag = 0; + $$ = $4; @} + | expr '+' expr + @{ $$ = make_sum ($1, $3); @} + @dots{} + ; +@end group + +@group +constant: + INTEGER + | STRING + ; +@end group +@end example + +@noindent +Here we assume that @code{yylex} looks at the value of @code{hexflag}; when +it is nonzero, all integers are parsed in hexadecimal, and tokens starting +with letters are parsed as integers if possible. + +The declaration of @code{hexflag} shown in the prologue of the parser file +is needed to make it accessible to the actions (@pxref{Prologue, ,The Prologue}). +You must also write the code in @code{yylex} to obey the flag. + +@node Tie-in Recovery +@section Lexical Tie-ins and Error Recovery + +Lexical tie-ins make strict demands on any error recovery rules you have. +@xref{Error Recovery}. + +The reason for this is that the purpose of an error recovery rule is to +abort the parsing of one construct and resume in some larger construct. +For example, in C-like languages, a typical error recovery rule is to skip +tokens until the next semicolon, and then start a new statement, like this: + +@example +stmt: expr ';' + | IF '(' expr ')' stmt @{ @dots{} @} + @dots{} + error ';' + @{ hexflag = 0; @} + ; +@end example + +If there is a syntax error in the middle of a @samp{hex (@var{expr})} +construct, this error rule will apply, and then the action for the +completed @samp{hex (@var{expr})} will never run. So @code{hexflag} would +remain set for the entire rest of the input, or until the next @code{hex} +keyword, causing identifiers to be misinterpreted as integers. + +To avoid this problem the error recovery rule itself clears @code{hexflag}. + +There may also be an error recovery rule that works within expressions. +For example, there could be a rule which applies within parentheses +and skips to the close-parenthesis: + +@example +@group +expr: @dots{} + | '(' expr ')' + @{ $$ = $2; @} + | '(' error ')' + @dots{} +@end group +@end example + +If this rule acts within the @code{hex} construct, it is not going to abort +that construct (since it applies to an inner level of parentheses within +the construct). Therefore, it should not clear the flag: the rest of +the @code{hex} construct should be parsed with the flag still in effect. + +What if there is an error recovery rule which might abort out of the +@code{hex} construct or might not, depending on circumstances? There is no +way you can write the action to determine whether a @code{hex} construct is +being aborted or not. So if you are using a lexical tie-in, you had better +make sure your error recovery rules are not of this kind. Each rule must +be such that you can be sure that it always will, or always won't, have to +clear the flag. + +@c ================================================== Debugging Your Parser + +@node Debugging +@chapter Debugging Your Parser + +Developing a parser can be a challenge, especially if you don't +understand the algorithm (@pxref{Algorithm, ,The Bison Parser +Algorithm}). Even so, sometimes a detailed description of the automaton +can help (@pxref{Understanding, , Understanding Your Parser}), or +tracing the execution of the parser can give some insight on why it +behaves improperly (@pxref{Tracing, , Tracing Your Parser}). + +@menu +* Understanding:: Understanding the structure of your parser. +* Tracing:: Tracing the execution of your parser. +@end menu + +@node Understanding +@section Understanding Your Parser + +As documented elsewhere (@pxref{Algorithm, ,The Bison Parser Algorithm}) +Bison parsers are @dfn{shift/reduce automata}. In some cases (much more +frequent than one would hope), looking at this automaton is required to +tune or simply fix a parser. Bison provides two different +representation of it, either textually or graphically (as a @acronym{VCG} +file). + +The textual file is generated when the options @option{--report} or +@option{--verbose} are specified, see @xref{Invocation, , Invoking +Bison}. Its name is made by removing @samp{.tab.c} or @samp{.c} from +the parser output file name, and adding @samp{.output} instead. +Therefore, if the input file is @file{foo.y}, then the parser file is +called @file{foo.tab.c} by default. As a consequence, the verbose +output file is called @file{foo.output}. + +The following grammar file, @file{calc.y}, will be used in the sequel: + +@example +%token NUM STR +%left '+' '-' +%left '*' +%% +exp: exp '+' exp + | exp '-' exp + | exp '*' exp + | exp '/' exp + | NUM + ; +useless: STR; +%% +@end example + +@command{bison} reports: + +@example +calc.y: warning: 1 useless nonterminal and 1 useless rule +calc.y:11.1-7: warning: useless nonterminal: useless +calc.y:11.10-12: warning: useless rule: useless: STR +calc.y: conflicts: 7 shift/reduce +@end example + +When given @option{--report=state}, in addition to @file{calc.tab.c}, it +creates a file @file{calc.output} with contents detailed below. The +order of the output and the exact presentation might vary, but the +interpretation is the same. + +The first section includes details on conflicts that were solved thanks +to precedence and/or associativity: + +@example +Conflict in state 8 between rule 2 and token '+' resolved as reduce. +Conflict in state 8 between rule 2 and token '-' resolved as reduce. +Conflict in state 8 between rule 2 and token '*' resolved as shift. +@exdent @dots{} +@end example + +@noindent +The next section lists states that still have conflicts. + +@example +State 8 conflicts: 1 shift/reduce +State 9 conflicts: 1 shift/reduce +State 10 conflicts: 1 shift/reduce +State 11 conflicts: 4 shift/reduce +@end example + +@noindent +@cindex token, useless +@cindex useless token +@cindex nonterminal, useless +@cindex useless nonterminal +@cindex rule, useless +@cindex useless rule +The next section reports useless tokens, nonterminal and rules. Useless +nonterminals and rules are removed in order to produce a smaller parser, +but useless tokens are preserved, since they might be used by the +scanner (note the difference between ``useless'' and ``not used'' +below): + +@example +Useless nonterminals: + useless + +Terminals which are not used: + STR + +Useless rules: +#6 useless: STR; +@end example + +@noindent +The next section reproduces the exact grammar that Bison used: + +@example +Grammar + + Number, Line, Rule + 0 5 $accept -> exp $end + 1 5 exp -> exp '+' exp + 2 6 exp -> exp '-' exp + 3 7 exp -> exp '*' exp + 4 8 exp -> exp '/' exp + 5 9 exp -> NUM +@end example + +@noindent +and reports the uses of the symbols: + +@example +Terminals, with rules where they appear + +$end (0) 0 +'*' (42) 3 +'+' (43) 1 +'-' (45) 2 +'/' (47) 4 +error (256) +NUM (258) 5 + +Nonterminals, with rules where they appear + +$accept (8) + on left: 0 +exp (9) + on left: 1 2 3 4 5, on right: 0 1 2 3 4 +@end example + +@noindent +@cindex item +@cindex pointed rule +@cindex rule, pointed +Bison then proceeds onto the automaton itself, describing each state +with it set of @dfn{items}, also known as @dfn{pointed rules}. Each +item is a production rule together with a point (marked by @samp{.}) +that the input cursor. + +@example +state 0 + + $accept -> . exp $ (rule 0) + + NUM shift, and go to state 1 + + exp go to state 2 +@end example + +This reads as follows: ``state 0 corresponds to being at the very +beginning of the parsing, in the initial rule, right before the start +symbol (here, @code{exp}). When the parser returns to this state right +after having reduced a rule that produced an @code{exp}, the control +flow jumps to state 2. If there is no such transition on a nonterminal +symbol, and the lookahead is a @code{NUM}, then this token is shifted on +the parse stack, and the control flow jumps to state 1. Any other +lookahead triggers a syntax error.'' + +@cindex core, item set +@cindex item set core +@cindex kernel, item set +@cindex item set core +Even though the only active rule in state 0 seems to be rule 0, the +report lists @code{NUM} as a lookahead symbol because @code{NUM} can be +at the beginning of any rule deriving an @code{exp}. By default Bison +reports the so-called @dfn{core} or @dfn{kernel} of the item set, but if +you want to see more detail you can invoke @command{bison} with +@option{--report=itemset} to list all the items, include those that can +be derived: + +@example +state 0 + + $accept -> . exp $ (rule 0) + exp -> . exp '+' exp (rule 1) + exp -> . exp '-' exp (rule 2) + exp -> . exp '*' exp (rule 3) + exp -> . exp '/' exp (rule 4) + exp -> . NUM (rule 5) + + NUM shift, and go to state 1 + + exp go to state 2 +@end example + +@noindent +In the state 1... + +@example +state 1 + + exp -> NUM . (rule 5) + + $default reduce using rule 5 (exp) +@end example + +@noindent +the rule 5, @samp{exp: NUM;}, is completed. Whatever the lookahead +(@samp{$default}), the parser will reduce it. If it was coming from +state 0, then, after this reduction it will return to state 0, and will +jump to state 2 (@samp{exp: go to state 2}). + +@example +state 2 + + $accept -> exp . $ (rule 0) + exp -> exp . '+' exp (rule 1) + exp -> exp . '-' exp (rule 2) + exp -> exp . '*' exp (rule 3) + exp -> exp . '/' exp (rule 4) + + $ shift, and go to state 3 + '+' shift, and go to state 4 + '-' shift, and go to state 5 + '*' shift, and go to state 6 + '/' shift, and go to state 7 +@end example + +@noindent +In state 2, the automaton can only shift a symbol. For instance, +because of the item @samp{exp -> exp . '+' exp}, if the lookahead if +@samp{+}, it will be shifted on the parse stack, and the automaton +control will jump to state 4, corresponding to the item @samp{exp -> exp +'+' . exp}. Since there is no default action, any other token than +those listed above will trigger a syntax error. + +The state 3 is named the @dfn{final state}, or the @dfn{accepting +state}: + +@example +state 3 + + $accept -> exp $ . (rule 0) + + $default accept +@end example + +@noindent +the initial rule is completed (the start symbol and the end +of input were read), the parsing exits successfully. + +The interpretation of states 4 to 7 is straightforward, and is left to +the reader. + +@example +state 4 + + exp -> exp '+' . exp (rule 1) + + NUM shift, and go to state 1 + + exp go to state 8 + +state 5 + + exp -> exp '-' . exp (rule 2) + + NUM shift, and go to state 1 + + exp go to state 9 + +state 6 + + exp -> exp '*' . exp (rule 3) + + NUM shift, and go to state 1 + + exp go to state 10 + +state 7 + + exp -> exp '/' . exp (rule 4) + + NUM shift, and go to state 1 + + exp go to state 11 +@end example + +As was announced in beginning of the report, @samp{State 8 conflicts: +1 shift/reduce}: + +@example +state 8 + + exp -> exp . '+' exp (rule 1) + exp -> exp '+' exp . (rule 1) + exp -> exp . '-' exp (rule 2) + exp -> exp . '*' exp (rule 3) + exp -> exp . '/' exp (rule 4) + + '*' shift, and go to state 6 + '/' shift, and go to state 7 + + '/' [reduce using rule 1 (exp)] + $default reduce using rule 1 (exp) +@end example + +Indeed, there are two actions associated to the lookahead @samp{/}: +either shifting (and going to state 7), or reducing rule 1. The +conflict means that either the grammar is ambiguous, or the parser lacks +information to make the right decision. Indeed the grammar is +ambiguous, as, since we did not specify the precedence of @samp{/}, the +sentence @samp{NUM + NUM / NUM} can be parsed as @samp{NUM + (NUM / +NUM)}, which corresponds to shifting @samp{/}, or as @samp{(NUM + NUM) / +NUM}, which corresponds to reducing rule 1. + +Because in @acronym{LALR}(1) parsing a single decision can be made, Bison +arbitrarily chose to disable the reduction, see @ref{Shift/Reduce, , +Shift/Reduce Conflicts}. Discarded actions are reported in between +square brackets. + +Note that all the previous states had a single possible action: either +shifting the next token and going to the corresponding state, or +reducing a single rule. In the other cases, i.e., when shifting +@emph{and} reducing is possible or when @emph{several} reductions are +possible, the lookahead is required to select the action. State 8 is +one such state: if the lookahead is @samp{*} or @samp{/} then the action +is shifting, otherwise the action is reducing rule 1. In other words, +the first two items, corresponding to rule 1, are not eligible when the +lookahead is @samp{*}, since we specified that @samp{*} has higher +precedence that @samp{+}. More generally, some items are eligible only +with some set of possible lookaheads. When run with +@option{--report=lookahead}, Bison specifies these lookaheads: + +@example +state 8 + + exp -> exp . '+' exp [$, '+', '-', '/'] (rule 1) + exp -> exp '+' exp . [$, '+', '-', '/'] (rule 1) + exp -> exp . '-' exp (rule 2) + exp -> exp . '*' exp (rule 3) + exp -> exp . '/' exp (rule 4) + + '*' shift, and go to state 6 + '/' shift, and go to state 7 + + '/' [reduce using rule 1 (exp)] + $default reduce using rule 1 (exp) +@end example + +The remaining states are similar: + +@example +state 9 + + exp -> exp . '+' exp (rule 1) + exp -> exp . '-' exp (rule 2) + exp -> exp '-' exp . (rule 2) + exp -> exp . '*' exp (rule 3) + exp -> exp . '/' exp (rule 4) + + '*' shift, and go to state 6 + '/' shift, and go to state 7 + + '/' [reduce using rule 2 (exp)] + $default reduce using rule 2 (exp) + +state 10 + + exp -> exp . '+' exp (rule 1) + exp -> exp . '-' exp (rule 2) + exp -> exp . '*' exp (rule 3) + exp -> exp '*' exp . (rule 3) + exp -> exp . '/' exp (rule 4) + + '/' shift, and go to state 7 + + '/' [reduce using rule 3 (exp)] + $default reduce using rule 3 (exp) + +state 11 + + exp -> exp . '+' exp (rule 1) + exp -> exp . '-' exp (rule 2) + exp -> exp . '*' exp (rule 3) + exp -> exp . '/' exp (rule 4) + exp -> exp '/' exp . (rule 4) + + '+' shift, and go to state 4 + '-' shift, and go to state 5 + '*' shift, and go to state 6 + '/' shift, and go to state 7 + + '+' [reduce using rule 4 (exp)] + '-' [reduce using rule 4 (exp)] + '*' [reduce using rule 4 (exp)] + '/' [reduce using rule 4 (exp)] + $default reduce using rule 4 (exp) +@end example + +@noindent +Observe that state 11 contains conflicts due to the lack of precedence +of @samp{/} wrt @samp{+}, @samp{-}, and @samp{*}, but also because the +associativity of @samp{/} is not specified. + + +@node Tracing +@section Tracing Your Parser +@findex yydebug +@cindex debugging +@cindex tracing the parser + +If a Bison grammar compiles properly but doesn't do what you want when it +runs, the @code{yydebug} parser-trace feature can help you figure out why. + +There are several means to enable compilation of trace facilities: + +@table @asis +@item the macro @code{YYDEBUG} +@findex YYDEBUG +Define the macro @code{YYDEBUG} to a nonzero value when you compile the +parser. This is compliant with @acronym{POSIX} Yacc. You could use +@samp{-DYYDEBUG=1} as a compiler option or you could put @samp{#define +YYDEBUG 1} in the prologue of the grammar file (@pxref{Prologue, , The +Prologue}). + +@item the option @option{-t}, @option{--debug} +Use the @samp{-t} option when you run Bison (@pxref{Invocation, +,Invoking Bison}). This is @acronym{POSIX} compliant too. + +@item the directive @samp{%debug} +@findex %debug +Add the @code{%debug} directive (@pxref{Decl Summary, ,Bison +Declaration Summary}). This is a Bison extension, which will prove +useful when Bison will output parsers for languages that don't use a +preprocessor. Unless @acronym{POSIX} and Yacc portability matter to +you, this is +the preferred solution. +@end table + +We suggest that you always enable the debug option so that debugging is +always possible. + +The trace facility outputs messages with macro calls of the form +@code{YYFPRINTF (stderr, @var{format}, @var{args})} where +@var{format} and @var{args} are the usual @code{printf} format and +arguments. If you define @code{YYDEBUG} to a nonzero value but do not +define @code{YYFPRINTF}, @code{} is automatically included +and @code{YYPRINTF} is defined to @code{fprintf}. + +Once you have compiled the program with trace facilities, the way to +request a trace is to store a nonzero value in the variable @code{yydebug}. +You can do this by making the C code do it (in @code{main}, perhaps), or +you can alter the value with a C debugger. + +Each step taken by the parser when @code{yydebug} is nonzero produces a +line or two of trace information, written on @code{stderr}. The trace +messages tell you these things: + +@itemize @bullet +@item +Each time the parser calls @code{yylex}, what kind of token was read. + +@item +Each time a token is shifted, the depth and complete contents of the +state stack (@pxref{Parser States}). + +@item +Each time a rule is reduced, which rule it is, and the complete contents +of the state stack afterward. +@end itemize + +To make sense of this information, it helps to refer to the listing file +produced by the Bison @samp{-v} option (@pxref{Invocation, ,Invoking +Bison}). This file shows the meaning of each state in terms of +positions in various rules, and also what each state will do with each +possible input token. As you read the successive trace messages, you +can see that the parser is functioning according to its specification in +the listing file. Eventually you will arrive at the place where +something undesirable happens, and you will see which parts of the +grammar are to blame. + +The parser file is a C program and you can use C debuggers on it, but it's +not easy to interpret what it is doing. The parser function is a +finite-state machine interpreter, and aside from the actions it executes +the same code over and over. Only the values of variables show where in +the grammar it is working. + +@findex YYPRINT +The debugging information normally gives the token type of each token +read, but not its semantic value. You can optionally define a macro +named @code{YYPRINT} to provide a way to print the value. If you define +@code{YYPRINT}, it should take three arguments. The parser will pass a +standard I/O stream, the numeric code for the token type, and the token +value (from @code{yylval}). + +Here is an example of @code{YYPRINT} suitable for the multi-function +calculator (@pxref{Mfcalc Decl, ,Declarations for @code{mfcalc}}): + +@smallexample +%@{ + static void print_token_value (FILE *, int, YYSTYPE); + #define YYPRINT(file, type, value) print_token_value (file, type, value) +%@} + +@dots{} %% @dots{} %% @dots{} + +static void +print_token_value (FILE *file, int type, YYSTYPE value) +@{ + if (type == VAR) + fprintf (file, "%s", value.tptr->name); + else if (type == NUM) + fprintf (file, "%d", value.val); +@} +@end smallexample + +@c ================================================= Invoking Bison + +@node Invocation +@chapter Invoking Bison +@cindex invoking Bison +@cindex Bison invocation +@cindex options for invoking Bison + +The usual way to invoke Bison is as follows: + +@example +bison @var{infile} +@end example + +Here @var{infile} is the grammar file name, which usually ends in +@samp{.y}. The parser file's name is made by replacing the @samp{.y} +with @samp{.tab.c}. Thus, the @samp{bison foo.y} filename yields +@file{foo.tab.c}, and the @samp{bison hack/foo.y} filename yields +@file{hack/foo.tab.c}. It's also possible, in case you are writing +C++ code instead of C in your grammar file, to name it @file{foo.ypp} +or @file{foo.y++}. Then, the output files will take an extension like +the given one as input (respectively @file{foo.tab.cpp} and +@file{foo.tab.c++}). +This feature takes effect with all options that manipulate filenames like +@samp{-o} or @samp{-d}. + +For example : + +@example +bison -d @var{infile.yxx} +@end example +@noindent +will produce @file{infile.tab.cxx} and @file{infile.tab.hxx}, and + +@example +bison -d -o @var{output.c++} @var{infile.y} +@end example +@noindent +will produce @file{output.c++} and @file{outfile.h++}. + +For compatibility with @acronym{POSIX}, the standard Bison +distribution also contains a shell script called @command{yacc} that +invokes Bison with the @option{-y} option. + +@menu +* Bison Options:: All the options described in detail, + in alphabetical order by short options. +* Option Cross Key:: Alphabetical list of long options. +* Yacc Library:: Yacc-compatible @code{yylex} and @code{main}. +@end menu + +@node Bison Options +@section Bison Options + +Bison supports both traditional single-letter options and mnemonic long +option names. Long option names are indicated with @samp{--} instead of +@samp{-}. Abbreviations for option names are allowed as long as they +are unique. When a long option takes an argument, like +@samp{--file-prefix}, connect the option name and the argument with +@samp{=}. + +Here is a list of options that can be used with Bison, alphabetized by +short option. It is followed by a cross key alphabetized by long +option. + +@c Please, keep this ordered as in `bison --help'. +@noindent +Operations modes: +@table @option +@item -h +@itemx --help +Print a summary of the command-line options to Bison and exit. + +@item -V +@itemx --version +Print the version number of Bison and exit. + +@need 1750 +@item -y +@itemx --yacc +Equivalent to @samp{-o y.tab.c}; the parser output file is called +@file{y.tab.c}, and the other outputs are called @file{y.output} and +@file{y.tab.h}. The purpose of this option is to imitate Yacc's output +file name conventions. Thus, the following shell script can substitute +for Yacc, and the Bison distribution contains such a script for +compatibility with @acronym{POSIX}: + +@example +#! /bin/sh +bison -y "$@@" +@end example +@end table + +@noindent +Tuning the parser: + +@table @option +@item -S @var{file} +@itemx --skeleton=@var{file} +Specify the skeleton to use. You probably don't need this option unless +you are developing Bison. + +@item -t +@itemx --debug +In the parser file, define the macro @code{YYDEBUG} to 1 if it is not +already defined, so that the debugging facilities are compiled. +@xref{Tracing, ,Tracing Your Parser}. + +@item --locations +Pretend that @code{%locations} was specified. @xref{Decl Summary}. + +@item -p @var{prefix} +@itemx --name-prefix=@var{prefix} +Pretend that @code{%name-prefix="@var{prefix}"} was specified. +@xref{Decl Summary}. + +@item -l +@itemx --no-lines +Don't put any @code{#line} preprocessor commands in the parser file. +Ordinarily Bison puts them in the parser file so that the C compiler +and debuggers will associate errors with your source file, the +grammar file. This option causes them to associate errors with the +parser file, treating it as an independent source file in its own right. + +@item -n +@itemx --no-parser +Pretend that @code{%no-parser} was specified. @xref{Decl Summary}. + +@item -k +@itemx --token-table +Pretend that @code{%token-table} was specified. @xref{Decl Summary}. +@end table + +@noindent +Adjust the output: + +@table @option +@item -d +@itemx --defines +Pretend that @code{%defines} was specified, i.e., write an extra output +file containing macro definitions for the token type names defined in +the grammar and the semantic value type @code{YYSTYPE}, as well as a few +@code{extern} variable declarations. @xref{Decl Summary}. + +@item --defines=@var{defines-file} +Same as above, but save in the file @var{defines-file}. + +@item -b @var{file-prefix} +@itemx --file-prefix=@var{prefix} +Pretend that @code{%verbose} was specified, i.e, specify prefix to use +for all Bison output file names. @xref{Decl Summary}. + +@item -r @var{things} +@itemx --report=@var{things} +Write an extra output file containing verbose description of the comma +separated list of @var{things} among: + +@table @code +@item state +Description of the grammar, conflicts (resolved and unresolved), and +@acronym{LALR} automaton. + +@item lookahead +Implies @code{state} and augments the description of the automaton with +each rule's lookahead set. + +@item itemset +Implies @code{state} and augments the description of the automaton with +the full set of items for each state, instead of its core only. +@end table + +For instance, on the following grammar + +@item -v +@itemx --verbose +Pretend that @code{%verbose} was specified, i.e, write an extra output +file containing verbose descriptions of the grammar and +parser. @xref{Decl Summary}. + +@item -o @var{filename} +@itemx --output=@var{filename} +Specify the @var{filename} for the parser file. + +The other output files' names are constructed from @var{filename} as +described under the @samp{-v} and @samp{-d} options. + +@item -g +Output a @acronym{VCG} definition of the @acronym{LALR}(1) grammar +automaton computed by Bison. If the grammar file is @file{foo.y}, the +@acronym{VCG} output file will +be @file{foo.vcg}. + +@item --graph=@var{graph-file} +The behavior of @var{--graph} is the same than @samp{-g}. The only +difference is that it has an optional argument which is the name of +the output graph filename. +@end table + +@node Option Cross Key +@section Option Cross Key + +Here is a list of options, alphabetized by long option, to help you find +the corresponding short option. + +@tex +\def\leaderfill{\leaders\hbox to 1em{\hss.\hss}\hfill} + +{\tt +\line{ --debug \leaderfill -t} +\line{ --defines \leaderfill -d} +\line{ --file-prefix \leaderfill -b} +\line{ --graph \leaderfill -g} +\line{ --help \leaderfill -h} +\line{ --name-prefix \leaderfill -p} +\line{ --no-lines \leaderfill -l} +\line{ --no-parser \leaderfill -n} +\line{ --output \leaderfill -o} +\line{ --token-table \leaderfill -k} +\line{ --verbose \leaderfill -v} +\line{ --version \leaderfill -V} +\line{ --yacc \leaderfill -y} +} +@end tex + +@ifinfo +@example +--debug -t +--defines=@var{defines-file} -d +--file-prefix=@var{prefix} -b @var{file-prefix} +--graph=@var{graph-file} -d +--help -h +--name-prefix=@var{prefix} -p @var{name-prefix} +--no-lines -l +--no-parser -n +--output=@var{outfile} -o @var{outfile} +--token-table -k +--verbose -v +--version -V +--yacc -y +@end example +@end ifinfo + +@node Yacc Library +@section Yacc Library + +The Yacc library contains default implementations of the +@code{yyerror} and @code{main} functions. These default +implementations are normally not useful, but @acronym{POSIX} requires +them. To use the Yacc library, link your program with the +@option{-ly} option. Note that Bison's implementation of the Yacc +library is distributed under the terms of the @acronym{GNU} General +Public License (@pxref{Copying}). + +If you use the Yacc library's @code{yyerror} function, you should +declare @code{yyerror} as follows: + +@example +int yyerror (char const *); +@end example + +Bison ignores the @code{int} value returned by this @code{yyerror}. +If you use the Yacc library's @code{main} function, your +@code{yyparse} function should have the following type signature: + +@example +int yyparse (void); +@end example + +@c ================================================= Invoking Bison + +@node FAQ +@chapter Frequently Asked Questions +@cindex frequently asked questions +@cindex questions + +Several questions about Bison come up occasionally. Here some of them +are addressed. + +@menu +* Parser Stack Overflow:: Breaking the Stack Limits +* How Can I Reset the Parser:: @code{yyparse} Keeps some State +* Strings are Destroyed:: @code{yylval} Loses Track of Strings +* C++ Parsers:: Compiling Parsers with C++ Compilers +* Implementing Loops:: Control Flow in the Calculator +@end menu + +@node Parser Stack Overflow +@section Parser Stack Overflow + +@display +My parser returns with error with a @samp{parser stack overflow} +message. What can I do? +@end display + +This question is already addressed elsewhere, @xref{Recursion, +,Recursive Rules}. + +@node How Can I Reset the Parser +@section How Can I Reset the Parser + +The following phenomenon has several symptoms, resulting in the +following typical questions: + +@display +I invoke @code{yyparse} several times, and on correct input it works +properly; but when a parse error is found, all the other calls fail +too. How can I reset the error flag of @code{yyparse}? +@end display + +@noindent +or + +@display +My parser includes support for an @samp{#include}-like feature, in +which case I run @code{yyparse} from @code{yyparse}. This fails +although I did specify I needed a @code{%pure-parser}. +@end display + +These problems typically come not from Bison itself, but from +Lex-generated scanners. Because these scanners use large buffers for +speed, they might not notice a change of input file. As a +demonstration, consider the following source file, +@file{first-line.l}: + +@verbatim +%{ +#include +#include +%} +%% +.*\n ECHO; return 1; +%% +int +yyparse (char const *file) +{ + yyin = fopen (file, "r"); + if (!yyin) + exit (2); + /* One token only. */ + yylex (); + if (fclose (yyin) != 0) + exit (3); + return 0; +} + +int +main (void) +{ + yyparse ("input"); + yyparse ("input"); + return 0; +} +@end verbatim + +@noindent +If the file @file{input} contains + +@verbatim +input:1: Hello, +input:2: World! +@end verbatim + +@noindent +then instead of getting the first line twice, you get: + +@example +$ @kbd{flex -ofirst-line.c first-line.l} +$ @kbd{gcc -ofirst-line first-line.c -ll} +$ @kbd{./first-line} +input:1: Hello, +input:2: World! +@end example + +Therefore, whenever you change @code{yyin}, you must tell the +Lex-generated scanner to discard its current buffer and switch to the +new one. This depends upon your implementation of Lex; see its +documentation for more. For Flex, it suffices to call +@samp{YY_FLUSH_BUFFER} after each change to @code{yyin}. If your +Flex-generated scanner needs to read from several input streams to +handle features like include files, you might consider using Flex +functions like @samp{yy_switch_to_buffer} that manipulate multiple +input buffers. + +If your Flex-generated scanner uses start conditions (@pxref{Start +conditions, , Start conditions, flex, The Flex Manual}), you might +also want to reset the scanner's state, i.e., go back to the initial +start condition, through a call to @samp{BEGIN (0)}. + +@node Strings are Destroyed +@section Strings are Destroyed + +@display +My parser seems to destroy old strings, or maybe it loses track of +them. Instead of reporting @samp{"foo", "bar"}, it reports +@samp{"bar", "bar"}, or even @samp{"foo\nbar", "bar"}. +@end display + +This error is probably the single most frequent ``bug report'' sent to +Bison lists, but is only concerned with a misunderstanding of the role +of scanner. Consider the following Lex code: + +@verbatim +%{ +#include +char *yylval = NULL; +%} +%% +.* yylval = yytext; return 1; +\n /* IGNORE */ +%% +int +main () +{ + /* Similar to using $1, $2 in a Bison action. */ + char *fst = (yylex (), yylval); + char *snd = (yylex (), yylval); + printf ("\"%s\", \"%s\"\n", fst, snd); + return 0; +} +@end verbatim + +If you compile and run this code, you get: + +@example +$ @kbd{flex -osplit-lines.c split-lines.l} +$ @kbd{gcc -osplit-lines split-lines.c -ll} +$ @kbd{printf 'one\ntwo\n' | ./split-lines} +"one +two", "two" +@end example + +@noindent +this is because @code{yytext} is a buffer provided for @emph{reading} +in the action, but if you want to keep it, you have to duplicate it +(e.g., using @code{strdup}). Note that the output may depend on how +your implementation of Lex handles @code{yytext}. For instance, when +given the Lex compatibility option @option{-l} (which triggers the +option @samp{%array}) Flex generates a different behavior: + +@example +$ @kbd{flex -l -osplit-lines.c split-lines.l} +$ @kbd{gcc -osplit-lines split-lines.c -ll} +$ @kbd{printf 'one\ntwo\n' | ./split-lines} +"two", "two" +@end example + + +@node C++ Parsers +@section C++ Parsers + +@display +How can I generate parsers in C++? +@end display + +We are working on a C++ output for Bison, but unfortunately, for lack +of time, the skeleton is not finished. It is functional, but in +numerous respects, it will require additional work which @emph{might} +break backward compatibility. Since the skeleton for C++ is not +documented, we do not consider ourselves bound to this interface, +nevertheless, as much as possible we will try to keep compatibility. + +Another possibility is to use the regular C parsers, and to compile +them with a C++ compiler. This works properly, provided that you bear +some simple C++ rules in mind, such as not including ``real classes'' +(i.e., structure with constructors) in unions. Therefore, in the +@code{%union}, use pointers to classes, or better yet, a single +pointer type to the root of your lexical/syntactic hierarchy. + + +@node Implementing Loops +@section Implementing Loops + +@display +My simple calculator supports variables, assignments, and functions, +but how can I implement loops? +@end display + +Although very pedagogical, the examples included in the document blur +the distinction to make between the parser---whose job is to recover +the structure of a text and to transmit it to subsequent modules of +the program---and the processing (such as the execution) of this +structure. This works well with so called straight line programs, +i.e., precisely those that have a straightforward execution model: +execute simple instructions one after the others. + +@cindex abstract syntax tree +@cindex @acronym{AST} +If you want a richer model, you will probably need to use the parser +to construct a tree that does represent the structure it has +recovered; this tree is usually called the @dfn{abstract syntax tree}, +or @dfn{@acronym{AST}} for short. Then, walking through this tree, +traversing it in various ways, will enable treatments such as its +execution or its translation, which will result in an interpreter or a +compiler. + +This topic is way beyond the scope of this manual, and the reader is +invited to consult the dedicated literature. + + + +@c ================================================= Table of Symbols + +@node Table of Symbols +@appendix Bison Symbols +@cindex Bison symbols, table of +@cindex symbols in Bison, table of + +@deffn {Variable} @@$ +In an action, the location of the left-hand side of the rule. +@xref{Locations, , Locations Overview}. +@end deffn + +@deffn {Variable} @@@var{n} +In an action, the location of the @var{n}-th symbol of the right-hand +side of the rule. @xref{Locations, , Locations Overview}. +@end deffn + +@deffn {Variable} $$ +In an action, the semantic value of the left-hand side of the rule. +@xref{Actions}. +@end deffn + +@deffn {Variable} $@var{n} +In an action, the semantic value of the @var{n}-th symbol of the +right-hand side of the rule. @xref{Actions}. +@end deffn + +@deffn {Symbol} $accept +The predefined nonterminal whose only rule is @samp{$accept: @var{start} +$end}, where @var{start} is the start symbol. @xref{Start Decl, , The +Start-Symbol}. It cannot be used in the grammar. +@end deffn + +@deffn {Symbol} $end +The predefined token marking the end of the token stream. It cannot be +used in the grammar. +@end deffn + +@deffn {Symbol} $undefined +The predefined token onto which all undefined values returned by +@code{yylex} are mapped. It cannot be used in the grammar, rather, use +@code{error}. +@end deffn + +@deffn {Symbol} error +A token name reserved for error recovery. This token may be used in +grammar rules so as to allow the Bison parser to recognize an error in +the grammar without halting the process. In effect, a sentence +containing an error may be recognized as valid. On a syntax error, the +token @code{error} becomes the current look-ahead token. Actions +corresponding to @code{error} are then executed, and the look-ahead +token is reset to the token that originally caused the violation. +@xref{Error Recovery}. +@end deffn + +@deffn {Macro} YYABORT +Macro to pretend that an unrecoverable syntax error has occurred, by +making @code{yyparse} return 1 immediately. The error reporting +function @code{yyerror} is not called. @xref{Parser Function, ,The +Parser Function @code{yyparse}}. +@end deffn + +@deffn {Macro} YYACCEPT +Macro to pretend that a complete utterance of the language has been +read, by making @code{yyparse} return 0 immediately. +@xref{Parser Function, ,The Parser Function @code{yyparse}}. +@end deffn + +@deffn {Macro} YYBACKUP +Macro to discard a value from the parser stack and fake a look-ahead +token. @xref{Action Features, ,Special Features for Use in Actions}. +@end deffn + +@deffn {Macro} YYDEBUG +Macro to define to equip the parser with tracing code. @xref{Tracing, +,Tracing Your Parser}. +@end deffn + +@deffn {Macro} YYERROR +Macro to pretend that a syntax error has just been detected: call +@code{yyerror} and then perform normal error recovery if possible +(@pxref{Error Recovery}), or (if recovery is impossible) make +@code{yyparse} return 1. @xref{Error Recovery}. +@end deffn + +@deffn {Macro} YYERROR_VERBOSE +An obsolete macro that you define with @code{#define} in the prologue +to request verbose, specific error message strings +when @code{yyerror} is called. It doesn't matter what definition you +use for @code{YYERROR_VERBOSE}, just whether you define it. Using +@code{%error-verbose} is preferred. +@end deffn + +@deffn {Macro} YYINITDEPTH +Macro for specifying the initial size of the parser stack. +@xref{Stack Overflow}. +@end deffn + +@deffn {Macro} YYLEX_PARAM +An obsolete macro for specifying an extra argument (or list of extra +arguments) for @code{yyparse} to pass to @code{yylex}. he use of this +macro is deprecated, and is supported only for Yacc like parsers. +@xref{Pure Calling,, Calling Conventions for Pure Parsers}. +@end deffn + +@deffn {Type} YYLTYPE +Data type of @code{yylloc}; by default, a structure with four +members. @xref{Location Type, , Data Types of Locations}. +@end deffn + +@deffn {Macro} YYMAXDEPTH +Macro for specifying the maximum size of the parser stack. @xref{Stack +Overflow}. +@end deffn + +@deffn {Macro} YYPARSE_PARAM +An obsolete macro for specifying the name of a parameter that +@code{yyparse} should accept. The use of this macro is deprecated, and +is supported only for Yacc like parsers. @xref{Pure Calling,, Calling +Conventions for Pure Parsers}. +@end deffn + +@deffn {Macro} YYRECOVERING +Macro whose value indicates whether the parser is recovering from a +syntax error. @xref{Action Features, ,Special Features for Use in Actions}. +@end deffn + +@deffn {Macro} YYSTACK_USE_ALLOCA +Macro used to control the use of @code{alloca}. If defined to @samp{0}, +the parser will not use @code{alloca} but @code{malloc} when trying to +grow its internal stacks. Do @emph{not} define @code{YYSTACK_USE_ALLOCA} +to anything else. +@end deffn + +@deffn {Type} YYSTYPE +Data type of semantic values; @code{int} by default. +@xref{Value Type, ,Data Types of Semantic Values}. +@end deffn + +@deffn {Variable} yychar +External integer variable that contains the integer value of the current +look-ahead token. (In a pure parser, it is a local variable within +@code{yyparse}.) Error-recovery rule actions may examine this variable. +@xref{Action Features, ,Special Features for Use in Actions}. +@end deffn + +@deffn {Variable} yyclearin +Macro used in error-recovery rule actions. It clears the previous +look-ahead token. @xref{Error Recovery}. +@end deffn + +@deffn {Variable} yydebug +External integer variable set to zero by default. If @code{yydebug} +is given a nonzero value, the parser will output information on input +symbols and parser action. @xref{Tracing, ,Tracing Your Parser}. +@end deffn + +@deffn {Macro} yyerrok +Macro to cause parser to recover immediately to its normal mode +after a syntax error. @xref{Error Recovery}. +@end deffn + +@deffn {Function} yyerror +User-supplied function to be called by @code{yyparse} on error. +@xref{Error Reporting, ,The Error +Reporting Function @code{yyerror}}. +@end deffn + +@deffn {Function} yylex +User-supplied lexical analyzer function, called with no arguments to get +the next token. @xref{Lexical, ,The Lexical Analyzer Function +@code{yylex}}. +@end deffn + +@deffn {Variable} yylval +External variable in which @code{yylex} should place the semantic +value associated with a token. (In a pure parser, it is a local +variable within @code{yyparse}, and its address is passed to +@code{yylex}.) @xref{Token Values, ,Semantic Values of Tokens}. +@end deffn + +@deffn {Variable} yylloc +External variable in which @code{yylex} should place the line and column +numbers associated with a token. (In a pure parser, it is a local +variable within @code{yyparse}, and its address is passed to +@code{yylex}.) You can ignore this variable if you don't use the +@samp{@@} feature in the grammar actions. @xref{Token Locations, +,Textual Locations of Tokens}. +@end deffn + +@deffn {Variable} yynerrs +Global variable which Bison increments each time there is a syntax error. +(In a pure parser, it is a local variable within @code{yyparse}.) +@xref{Error Reporting, ,The Error Reporting Function @code{yyerror}}. +@end deffn + +@deffn {Function} yyparse +The parser function produced by Bison; call this function to start +parsing. @xref{Parser Function, ,The Parser Function @code{yyparse}}. +@end deffn + +@deffn {Directive} %debug +Equip the parser for debugging. @xref{Decl Summary}. +@end deffn + +@ifset defaultprec +@deffn {Directive} %default-prec +Assign a precedence to rules that lack an explicit @samp{%prec} +modifier. @xref{Contextual Precedence, ,Context-Dependent +Precedence}. +@end deffn +@end ifset + +@deffn {Directive} %defines +Bison declaration to create a header file meant for the scanner. +@xref{Decl Summary}. +@end deffn + +@deffn {Directive} %destructor +Specifying how the parser should reclaim the memory associated to +discarded symbols. @xref{Destructor Decl, , Freeing Discarded Symbols}. +@end deffn + +@deffn {Directive} %dprec +Bison declaration to assign a precedence to a rule that is used at parse +time to resolve reduce/reduce conflicts. @xref{GLR Parsers, ,Writing +@acronym{GLR} Parsers}. +@end deffn + +@deffn {Directive} %error-verbose +Bison declaration to request verbose, specific error message strings +when @code{yyerror} is called. +@end deffn + +@deffn {Directive} %file-prefix="@var{prefix}" +Bison declaration to set the prefix of the output files. @xref{Decl +Summary}. +@end deffn + +@deffn {Directive} %glr-parser +Bison declaration to produce a @acronym{GLR} parser. @xref{GLR +Parsers, ,Writing @acronym{GLR} Parsers}. +@end deffn + +@deffn {Directive} %left +Bison declaration to assign left associativity to token(s). +@xref{Precedence Decl, ,Operator Precedence}. +@end deffn + +@deffn {Directive} %lex-param @{@var{argument-declaration}@} +Bison declaration to specifying an additional parameter that +@code{yylex} should accept. @xref{Pure Calling,, Calling Conventions +for Pure Parsers}. +@end deffn + +@deffn {Directive} %merge +Bison declaration to assign a merging function to a rule. If there is a +reduce/reduce conflict with a rule having the same merging function, the +function is applied to the two semantic values to get a single result. +@xref{GLR Parsers, ,Writing @acronym{GLR} Parsers}. +@end deffn + +@deffn {Directive} %name-prefix="@var{prefix}" +Bison declaration to rename the external symbols. @xref{Decl Summary}. +@end deffn + +@ifset defaultprec +@deffn {Directive} %no-default-prec +Do not assign a precedence to rules that lack an explicit @samp{%prec} +modifier. @xref{Contextual Precedence, ,Context-Dependent +Precedence}. +@end deffn +@end ifset + +@deffn {Directive} %no-lines +Bison declaration to avoid generating @code{#line} directives in the +parser file. @xref{Decl Summary}. +@end deffn + +@deffn {Directive} %nonassoc +Bison declaration to assign non-associativity to token(s). +@xref{Precedence Decl, ,Operator Precedence}. +@end deffn + +@deffn {Directive} %output="@var{filename}" +Bison declaration to set the name of the parser file. @xref{Decl +Summary}. +@end deffn + +@deffn {Directive} %parse-param @{@var{argument-declaration}@} +Bison declaration to specifying an additional parameter that +@code{yyparse} should accept. @xref{Parser Function,, The Parser +Function @code{yyparse}}. +@end deffn + +@deffn {Directive} %prec +Bison declaration to assign a precedence to a specific rule. +@xref{Contextual Precedence, ,Context-Dependent Precedence}. +@end deffn + +@deffn {Directive} %pure-parser +Bison declaration to request a pure (reentrant) parser. +@xref{Pure Decl, ,A Pure (Reentrant) Parser}. +@end deffn + +@deffn {Directive} %right +Bison declaration to assign right associativity to token(s). +@xref{Precedence Decl, ,Operator Precedence}. +@end deffn + +@deffn {Directive} %start +Bison declaration to specify the start symbol. @xref{Start Decl, ,The +Start-Symbol}. +@end deffn + +@deffn {Directive} %token +Bison declaration to declare token(s) without specifying precedence. +@xref{Token Decl, ,Token Type Names}. +@end deffn + +@deffn {Directive} %token-table +Bison declaration to include a token name table in the parser file. +@xref{Decl Summary}. +@end deffn + +@deffn {Directive} %type +Bison declaration to declare nonterminals. @xref{Type Decl, +,Nonterminal Symbols}. +@end deffn + +@deffn {Directive} %union +Bison declaration to specify several possible data types for semantic +values. @xref{Union Decl, ,The Collection of Value Types}. +@end deffn + +@sp 1 + +These are the punctuation and delimiters used in Bison input: + +@deffn {Delimiter} %% +Delimiter used to separate the grammar rule section from the +Bison declarations section or the epilogue. +@xref{Grammar Layout, ,The Overall Layout of a Bison Grammar}. +@end deffn + +@c Don't insert spaces, or check the DVI output. +@deffn {Delimiter} %@{@var{code}%@} +All code listed between @samp{%@{} and @samp{%@}} is copied directly to +the output file uninterpreted. Such code forms the prologue of the input +file. @xref{Grammar Outline, ,Outline of a Bison +Grammar}. +@end deffn + +@deffn {Construct} /*@dots{}*/ +Comment delimiters, as in C. +@end deffn + +@deffn {Delimiter} : +Separates a rule's result from its components. @xref{Rules, ,Syntax of +Grammar Rules}. +@end deffn + +@deffn {Delimiter} ; +Terminates a rule. @xref{Rules, ,Syntax of Grammar Rules}. +@end deffn + +@deffn {Delimiter} | +Separates alternate rules for the same result nonterminal. +@xref{Rules, ,Syntax of Grammar Rules}. +@end deffn + +@node Glossary +@appendix Glossary +@cindex glossary + +@table @asis +@item Backus-Naur Form (@acronym{BNF}; also called ``Backus Normal Form'') +Formal method of specifying context-free grammars originally proposed +by John Backus, and slightly improved by Peter Naur in his 1960-01-02 +committee document contributing to what became the Algol 60 report. +@xref{Language and Grammar, ,Languages and Context-Free Grammars}. + +@item Context-free grammars +Grammars specified as rules that can be applied regardless of context. +Thus, if there is a rule which says that an integer can be used as an +expression, integers are allowed @emph{anywhere} an expression is +permitted. @xref{Language and Grammar, ,Languages and Context-Free +Grammars}. + +@item Dynamic allocation +Allocation of memory that occurs during execution, rather than at +compile time or on entry to a function. + +@item Empty string +Analogous to the empty set in set theory, the empty string is a +character string of length zero. + +@item Finite-state stack machine +A ``machine'' that has discrete states in which it is said to exist at +each instant in time. As input to the machine is processed, the +machine moves from state to state as specified by the logic of the +machine. In the case of the parser, the input is the language being +parsed, and the states correspond to various stages in the grammar +rules. @xref{Algorithm, ,The Bison Parser Algorithm}. + +@item Generalized @acronym{LR} (@acronym{GLR}) +A parsing algorithm that can handle all context-free grammars, including those +that are not @acronym{LALR}(1). It resolves situations that Bison's +usual @acronym{LALR}(1) +algorithm cannot by effectively splitting off multiple parsers, trying all +possible parsers, and discarding those that fail in the light of additional +right context. @xref{Generalized LR Parsing, ,Generalized +@acronym{LR} Parsing}. + +@item Grouping +A language construct that is (in general) grammatically divisible; +for example, `expression' or `declaration' in C@. +@xref{Language and Grammar, ,Languages and Context-Free Grammars}. + +@item Infix operator +An arithmetic operator that is placed between the operands on which it +performs some operation. + +@item Input stream +A continuous flow of data between devices or programs. + +@item Language construct +One of the typical usage schemas of the language. For example, one of +the constructs of the C language is the @code{if} statement. +@xref{Language and Grammar, ,Languages and Context-Free Grammars}. + +@item Left associativity +Operators having left associativity are analyzed from left to right: +@samp{a+b+c} first computes @samp{a+b} and then combines with +@samp{c}. @xref{Precedence, ,Operator Precedence}. + +@item Left recursion +A rule whose result symbol is also its first component symbol; for +example, @samp{expseq1 : expseq1 ',' exp;}. @xref{Recursion, ,Recursive +Rules}. + +@item Left-to-right parsing +Parsing a sentence of a language by analyzing it token by token from +left to right. @xref{Algorithm, ,The Bison Parser Algorithm}. + +@item Lexical analyzer (scanner) +A function that reads an input stream and returns tokens one by one. +@xref{Lexical, ,The Lexical Analyzer Function @code{yylex}}. + +@item Lexical tie-in +A flag, set by actions in the grammar rules, which alters the way +tokens are parsed. @xref{Lexical Tie-ins}. + +@item Literal string token +A token which consists of two or more fixed characters. @xref{Symbols}. + +@item Look-ahead token +A token already read but not yet shifted. @xref{Look-Ahead, ,Look-Ahead +Tokens}. + +@item @acronym{LALR}(1) +The class of context-free grammars that Bison (like most other parser +generators) can handle; a subset of @acronym{LR}(1). @xref{Mystery +Conflicts, ,Mysterious Reduce/Reduce Conflicts}. + +@item @acronym{LR}(1) +The class of context-free grammars in which at most one token of +look-ahead is needed to disambiguate the parsing of any piece of input. + +@item Nonterminal symbol +A grammar symbol standing for a grammatical construct that can +be expressed through rules in terms of smaller constructs; in other +words, a construct that is not a token. @xref{Symbols}. + +@item Parser +A function that recognizes valid sentences of a language by analyzing +the syntax structure of a set of tokens passed to it from a lexical +analyzer. + +@item Postfix operator +An arithmetic operator that is placed after the operands upon which it +performs some operation. + +@item Reduction +Replacing a string of nonterminals and/or terminals with a single +nonterminal, according to a grammar rule. @xref{Algorithm, ,The Bison +Parser Algorithm}. + +@item Reentrant +A reentrant subprogram is a subprogram which can be in invoked any +number of times in parallel, without interference between the various +invocations. @xref{Pure Decl, ,A Pure (Reentrant) Parser}. + +@item Reverse polish notation +A language in which all operators are postfix operators. + +@item Right recursion +A rule whose result symbol is also its last component symbol; for +example, @samp{expseq1: exp ',' expseq1;}. @xref{Recursion, ,Recursive +Rules}. + +@item Semantics +In computer languages, the semantics are specified by the actions +taken for each instance of the language, i.e., the meaning of +each statement. @xref{Semantics, ,Defining Language Semantics}. + +@item Shift +A parser is said to shift when it makes the choice of analyzing +further input from the stream rather than reducing immediately some +already-recognized rule. @xref{Algorithm, ,The Bison Parser Algorithm}. + +@item Single-character literal +A single character that is recognized and interpreted as is. +@xref{Grammar in Bison, ,From Formal Rules to Bison Input}. + +@item Start symbol +The nonterminal symbol that stands for a complete valid utterance in +the language being parsed. The start symbol is usually listed as the +first nonterminal symbol in a language specification. +@xref{Start Decl, ,The Start-Symbol}. + +@item Symbol table +A data structure where symbol names and associated data are stored +during parsing to allow for recognition and use of existing +information in repeated uses of a symbol. @xref{Multi-function Calc}. + +@item Syntax error +An error encountered during parsing of an input stream due to invalid +syntax. @xref{Error Recovery}. + +@item Token +A basic, grammatically indivisible unit of a language. The symbol +that describes a token in the grammar is a terminal symbol. +The input of the Bison parser is a stream of tokens which comes from +the lexical analyzer. @xref{Symbols}. + +@item Terminal symbol +A grammar symbol that has no rules in the grammar and therefore is +grammatically indivisible. The piece of text it represents is a token. +@xref{Language and Grammar, ,Languages and Context-Free Grammars}. +@end table + +@node Copying This Manual +@appendix Copying This Manual + +@menu +* GNU Free Documentation License:: License for copying this manual. +@end menu + +@include fdl.texi + +@node Index +@unnumbered Index + +@printindex cp + +@bye + +@c LocalWords: texinfo setfilename settitle setchapternewpage finalout +@c LocalWords: ifinfo smallbook shorttitlepage titlepage GPL FIXME iftex +@c LocalWords: akim fn cp syncodeindex vr tp synindex dircategory direntry +@c LocalWords: ifset vskip pt filll insertcopying sp ISBN Etienne Suvasa +@c LocalWords: ifnottex yyparse detailmenu GLR RPN Calc var Decls Rpcalc +@c LocalWords: rpcalc Lexer Gen Comp Expr ltcalc mfcalc Decl Symtab yylex +@c LocalWords: yyerror pxref LR yylval cindex dfn LALR samp gpl BNF xref +@c LocalWords: const int paren ifnotinfo AC noindent emph expr stmt findex +@c LocalWords: glr YYSTYPE TYPENAME prog dprec printf decl init stmtMerge +@c LocalWords: pre STDC GNUC endif yy YY alloca lf stddef stdlib YYDEBUG +@c LocalWords: NUM exp subsubsection kbd Ctrl ctype EOF getchar isdigit +@c LocalWords: ungetc stdin scanf sc calc ulator ls lm cc NEG prec yyerrok +@c LocalWords: longjmp fprintf stderr preg yylloc YYLTYPE cos ln +@c LocalWords: smallexample symrec val tptr FNCT fnctptr func struct sym +@c LocalWords: fnct putsym getsym fname arith fncts atan ptr malloc sizeof +@c LocalWords: strlen strcpy fctn strcmp isalpha symbuf realloc isalnum +@c LocalWords: ptypes itype YYPRINT trigraphs yytname expseq vindex dtype +@c LocalWords: Rhs YYRHSLOC LE nonassoc op deffn typeless typefull yynerrs +@c LocalWords: yychar yydebug msg YYNTOKENS YYNNTS YYNRULES YYNSTATES +@c LocalWords: cparse clex deftypefun NE defmac YYACCEPT YYABORT param +@c LocalWords: strncmp intval tindex lvalp locp llocp typealt YYBACKUP +@c LocalWords: YYEMPTY YYRECOVERING yyclearin GE def UMINUS maybeword +@c LocalWords: Johnstone Shamsa Sadaf Hussain Tomita TR uref YYMAXDEPTH +@c LocalWords: YYINITDEPTH stmnts ref stmnt initdcl maybeasm VCG notype +@c LocalWords: hexflag STR exdent itemset asis DYYDEBUG YYFPRINTF args +@c LocalWords: YYPRINTF infile ypp yxx outfile itemx vcg tex leaderfill +@c LocalWords: hbox hss hfill tt ly yyin fopen fclose ofirst gcc ll +@c LocalWords: yyrestart nbar yytext fst snd osplit ntwo strdup AST +@c LocalWords: YYSTACK DVI fdl printindex diff --git a/src/apps/bin/bison/doc/fdl.texi b/src/apps/bin/bison/doc/fdl.texi new file mode 100644 index 0000000000..e02da1459e --- /dev/null +++ b/src/apps/bin/bison/doc/fdl.texi @@ -0,0 +1,452 @@ + +@node GNU Free Documentation License +@appendixsec GNU Free Documentation License + +@cindex FDL, GNU Free Documentation License +@center Version 1.2, November 2002 + +@display +Copyright @copyright{} 2000,2001,2002 Free Software Foundation, Inc. +59 Temple Place, Suite 330, Boston, MA 02111-1307, USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. +@end display + +@enumerate 0 +@item +PREAMBLE + +The purpose of this License is to make a manual, textbook, or other +functional and useful document @dfn{free} in the sense of freedom: to +assure everyone the effective freedom to copy and redistribute it, +with or without modifying it, either commercially or noncommercially. +Secondarily, this License preserves for the author and publisher a way +to get credit for their work, while not being considered responsible +for modifications made by others. + +This License is a kind of ``copyleft'', which means that derivative +works of the document must themselves be free in the same sense. It +complements the GNU General Public License, which is a copyleft +license designed for free software. + +We have designed this License in order to use it for manuals for free +software, because free software needs free documentation: a free +program should come with manuals providing the same freedoms that the +software does. But this License is not limited to software manuals; +it can be used for any textual work, regardless of subject matter or +whether it is published as a printed book. We recommend this License +principally for works whose purpose is instruction or reference. + +@item +APPLICABILITY AND DEFINITIONS + +This License applies to any manual or other work, in any medium, that +contains a notice placed by the copyright holder saying it can be +distributed under the terms of this License. Such a notice grants a +world-wide, royalty-free license, unlimited in duration, to use that +work under the conditions stated herein. The ``Document'', below, +refers to any such manual or work. Any member of the public is a +licensee, and is addressed as ``you''. You accept the license if you +copy, modify or distribute the work in a way requiring permission +under copyright law. + +A ``Modified Version'' of the Document means any work containing the +Document or a portion of it, either copied verbatim, or with +modifications and/or translated into another language. + +A ``Secondary Section'' is a named appendix or a front-matter section +of the Document that deals exclusively with the relationship of the +publishers or authors of the Document to the Document's overall +subject (or to related matters) and contains nothing that could fall +directly within that overall subject. (Thus, if the Document is in +part a textbook of mathematics, a Secondary Section may not explain +any mathematics.) The relationship could be a matter of historical +connection with the subject or with related matters, or of legal, +commercial, philosophical, ethical or political position regarding +them. + +The ``Invariant Sections'' are certain Secondary Sections whose titles +are designated, as being those of Invariant Sections, in the notice +that says that the Document is released under this License. If a +section does not fit the above definition of Secondary then it is not +allowed to be designated as Invariant. The Document may contain zero +Invariant Sections. If the Document does not identify any Invariant +Sections then there are none. + +The ``Cover Texts'' are certain short passages of text that are listed, +as Front-Cover Texts or Back-Cover Texts, in the notice that says that +the Document is released under this License. A Front-Cover Text may +be at most 5 words, and a Back-Cover Text may be at most 25 words. + +A ``Transparent'' copy of the Document means a machine-readable copy, +represented in a format whose specification is available to the +general public, that is suitable for revising the document +straightforwardly with generic text editors or (for images composed of +pixels) generic paint programs or (for drawings) some widely available +drawing editor, and that is suitable for input to text formatters or +for automatic translation to a variety of formats suitable for input +to text formatters. A copy made in an otherwise Transparent file +format whose markup, or absence of markup, has been arranged to thwart +or discourage subsequent modification by readers is not Transparent. +An image format is not Transparent if used for any substantial amount +of text. A copy that is not ``Transparent'' is called ``Opaque''. + +Examples of suitable formats for Transparent copies include plain +@sc{ascii} without markup, Texinfo input format, La@TeX{} input +format, @acronym{SGML} or @acronym{XML} using a publicly available +@acronym{DTD}, and standard-conforming simple @acronym{HTML}, +PostScript or @acronym{PDF} designed for human modification. Examples +of transparent image formats include @acronym{PNG}, @acronym{XCF} and +@acronym{JPG}. Opaque formats include proprietary formats that can be +read and edited only by proprietary word processors, @acronym{SGML} or +@acronym{XML} for which the @acronym{DTD} and/or processing tools are +not generally available, and the machine-generated @acronym{HTML}, +PostScript or @acronym{PDF} produced by some word processors for +output purposes only. + +The ``Title Page'' means, for a printed book, the title page itself, +plus such following pages as are needed to hold, legibly, the material +this License requires to appear in the title page. For works in +formats which do not have any title page as such, ``Title Page'' means +the text near the most prominent appearance of the work's title, +preceding the beginning of the body of the text. + +A section ``Entitled XYZ'' means a named subunit of the Document whose +title either is precisely XYZ or contains XYZ in parentheses following +text that translates XYZ in another language. (Here XYZ stands for a +specific section name mentioned below, such as ``Acknowledgements'', +``Dedications'', ``Endorsements'', or ``History''.) To ``Preserve the Title'' +of such a section when you modify the Document means that it remains a +section ``Entitled XYZ'' according to this definition. + +The Document may include Warranty Disclaimers next to the notice which +states that this License applies to the Document. These Warranty +Disclaimers are considered to be included by reference in this +License, but only as regards disclaiming warranties: any other +implication that these Warranty Disclaimers may have is void and has +no effect on the meaning of this License. + +@item +VERBATIM COPYING + +You may copy and distribute the Document in any medium, either +commercially or noncommercially, provided that this License, the +copyright notices, and the license notice saying this License applies +to the Document are reproduced in all copies, and that you add no other +conditions whatsoever to those of this License. You may not use +technical measures to obstruct or control the reading or further +copying of the copies you make or distribute. However, you may accept +compensation in exchange for copies. If you distribute a large enough +number of copies you must also follow the conditions in section 3. + +You may also lend copies, under the same conditions stated above, and +you may publicly display copies. + +@item +COPYING IN QUANTITY + +If you publish printed copies (or copies in media that commonly have +printed covers) of the Document, numbering more than 100, and the +Document's license notice requires Cover Texts, you must enclose the +copies in covers that carry, clearly and legibly, all these Cover +Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on +the back cover. Both covers must also clearly and legibly identify +you as the publisher of these copies. The front cover must present +the full title with all words of the title equally prominent and +visible. You may add other material on the covers in addition. +Copying with changes limited to the covers, as long as they preserve +the title of the Document and satisfy these conditions, can be treated +as verbatim copying in other respects. + +If the required texts for either cover are too voluminous to fit +legibly, you should put the first ones listed (as many as fit +reasonably) on the actual cover, and continue the rest onto adjacent +pages. + +If you publish or distribute Opaque copies of the Document numbering +more than 100, you must either include a machine-readable Transparent +copy along with each Opaque copy, or state in or with each Opaque copy +a computer-network location from which the general network-using +public has access to download using public-standard network protocols +a complete Transparent copy of the Document, free of added material. +If you use the latter option, you must take reasonably prudent steps, +when you begin distribution of Opaque copies in quantity, to ensure +that this Transparent copy will remain thus accessible at the stated +location until at least one year after the last time you distribute an +Opaque copy (directly or through your agents or retailers) of that +edition to the public. + +It is requested, but not required, that you contact the authors of the +Document well before redistributing any large number of copies, to give +them a chance to provide you with an updated version of the Document. + +@item +MODIFICATIONS + +You may copy and distribute a Modified Version of the Document under +the conditions of sections 2 and 3 above, provided that you release +the Modified Version under precisely this License, with the Modified +Version filling the role of the Document, thus licensing distribution +and modification of the Modified Version to whoever possesses a copy +of it. In addition, you must do these things in the Modified Version: + +@enumerate A +@item +Use in the Title Page (and on the covers, if any) a title distinct +from that of the Document, and from those of previous versions +(which should, if there were any, be listed in the History section +of the Document). You may use the same title as a previous version +if the original publisher of that version gives permission. + +@item +List on the Title Page, as authors, one or more persons or entities +responsible for authorship of the modifications in the Modified +Version, together with at least five of the principal authors of the +Document (all of its principal authors, if it has fewer than five), +unless they release you from this requirement. + +@item +State on the Title page the name of the publisher of the +Modified Version, as the publisher. + +@item +Preserve all the copyright notices of the Document. + +@item +Add an appropriate copyright notice for your modifications +adjacent to the other copyright notices. + +@item +Include, immediately after the copyright notices, a license notice +giving the public permission to use the Modified Version under the +terms of this License, in the form shown in the Addendum below. + +@item +Preserve in that license notice the full lists of Invariant Sections +and required Cover Texts given in the Document's license notice. + +@item +Include an unaltered copy of this License. + +@item +Preserve the section Entitled ``History'', Preserve its Title, and add +to it an item stating at least the title, year, new authors, and +publisher of the Modified Version as given on the Title Page. If +there is no section Entitled ``History'' in the Document, create one +stating the title, year, authors, and publisher of the Document as +given on its Title Page, then add an item describing the Modified +Version as stated in the previous sentence. + +@item +Preserve the network location, if any, given in the Document for +public access to a Transparent copy of the Document, and likewise +the network locations given in the Document for previous versions +it was based on. These may be placed in the ``History'' section. +You may omit a network location for a work that was published at +least four years before the Document itself, or if the original +publisher of the version it refers to gives permission. + +@item +For any section Entitled ``Acknowledgements'' or ``Dedications'', Preserve +the Title of the section, and preserve in the section all the +substance and tone of each of the contributor acknowledgements and/or +dedications given therein. + +@item +Preserve all the Invariant Sections of the Document, +unaltered in their text and in their titles. Section numbers +or the equivalent are not considered part of the section titles. + +@item +Delete any section Entitled ``Endorsements''. Such a section +may not be included in the Modified Version. + +@item +Do not retitle any existing section to be Entitled ``Endorsements'' or +to conflict in title with any Invariant Section. + +@item +Preserve any Warranty Disclaimers. +@end enumerate + +If the Modified Version includes new front-matter sections or +appendices that qualify as Secondary Sections and contain no material +copied from the Document, you may at your option designate some or all +of these sections as invariant. To do this, add their titles to the +list of Invariant Sections in the Modified Version's license notice. +These titles must be distinct from any other section titles. + +You may add a section Entitled ``Endorsements'', provided it contains +nothing but endorsements of your Modified Version by various +parties---for example, statements of peer review or that the text has +been approved by an organization as the authoritative definition of a +standard. + +You may add a passage of up to five words as a Front-Cover Text, and a +passage of up to 25 words as a Back-Cover Text, to the end of the list +of Cover Texts in the Modified Version. Only one passage of +Front-Cover Text and one of Back-Cover Text may be added by (or +through arrangements made by) any one entity. If the Document already +includes a cover text for the same cover, previously added by you or +by arrangement made by the same entity you are acting on behalf of, +you may not add another; but you may replace the old one, on explicit +permission from the previous publisher that added the old one. + +The author(s) and publisher(s) of the Document do not by this License +give permission to use their names for publicity for or to assert or +imply endorsement of any Modified Version. + +@item +COMBINING DOCUMENTS + +You may combine the Document with other documents released under this +License, under the terms defined in section 4 above for modified +versions, provided that you include in the combination all of the +Invariant Sections of all of the original documents, unmodified, and +list them all as Invariant Sections of your combined work in its +license notice, and that you preserve all their Warranty Disclaimers. + +The combined work need only contain one copy of this License, and +multiple identical Invariant Sections may be replaced with a single +copy. If there are multiple Invariant Sections with the same name but +different contents, make the title of each such section unique by +adding at the end of it, in parentheses, the name of the original +author or publisher of that section if known, or else a unique number. +Make the same adjustment to the section titles in the list of +Invariant Sections in the license notice of the combined work. + +In the combination, you must combine any sections Entitled ``History'' +in the various original documents, forming one section Entitled +``History''; likewise combine any sections Entitled ``Acknowledgements'', +and any sections Entitled ``Dedications''. You must delete all +sections Entitled ``Endorsements.'' + +@item +COLLECTIONS OF DOCUMENTS + +You may make a collection consisting of the Document and other documents +released under this License, and replace the individual copies of this +License in the various documents with a single copy that is included in +the collection, provided that you follow the rules of this License for +verbatim copying of each of the documents in all other respects. + +You may extract a single document from such a collection, and distribute +it individually under this License, provided you insert a copy of this +License into the extracted document, and follow this License in all +other respects regarding verbatim copying of that document. + +@item +AGGREGATION WITH INDEPENDENT WORKS + +A compilation of the Document or its derivatives with other separate +and independent documents or works, in or on a volume of a storage or +distribution medium, is called an ``aggregate'' if the copyright +resulting from the compilation is not used to limit the legal rights +of the compilation's users beyond what the individual works permit. +When the Document is included in an aggregate, this License does not +apply to the other works in the aggregate which are not themselves +derivative works of the Document. + +If the Cover Text requirement of section 3 is applicable to these +copies of the Document, then if the Document is less than one half of +the entire aggregate, the Document's Cover Texts may be placed on +covers that bracket the Document within the aggregate, or the +electronic equivalent of covers if the Document is in electronic form. +Otherwise they must appear on printed covers that bracket the whole +aggregate. + +@item +TRANSLATION + +Translation is considered a kind of modification, so you may +distribute translations of the Document under the terms of section 4. +Replacing Invariant Sections with translations requires special +permission from their copyright holders, but you may include +translations of some or all Invariant Sections in addition to the +original versions of these Invariant Sections. You may include a +translation of this License, and all the license notices in the +Document, and any Warranty Disclaimers, provided that you also include +the original English version of this License and the original versions +of those notices and disclaimers. In case of a disagreement between +the translation and the original version of this License or a notice +or disclaimer, the original version will prevail. + +If a section in the Document is Entitled ``Acknowledgements'', +``Dedications'', or ``History'', the requirement (section 4) to Preserve +its Title (section 1) will typically require changing the actual +title. + +@item +TERMINATION + +You may not copy, modify, sublicense, or distribute the Document except +as expressly provided for under this License. Any other attempt to +copy, modify, sublicense or distribute the Document is void, and will +automatically terminate your rights under this License. However, +parties who have received copies, or rights, from you under this +License will not have their licenses terminated so long as such +parties remain in full compliance. + +@item +FUTURE REVISIONS OF THIS LICENSE + +The Free Software Foundation may publish new, revised versions +of the GNU Free Documentation License from time to time. Such new +versions will be similar in spirit to the present version, but may +differ in detail to address new problems or concerns. See +@uref{http://www.gnu.org/copyleft/}. + +Each version of the License is given a distinguishing version number. +If the Document specifies that a particular numbered version of this +License ``or any later version'' applies to it, you have the option of +following the terms and conditions either of that specified version or +of any later version that has been published (not as a draft) by the +Free Software Foundation. If the Document does not specify a version +number of this License, you may choose any version ever published (not +as a draft) by the Free Software Foundation. +@end enumerate + +@page +@appendixsubsec ADDENDUM: How to use this License for your documents + +To use this License in a document you have written, include a copy of +the License in the document and put the following copyright and +license notices just after the title page: + +@smallexample +@group + Copyright (C) @var{year} @var{your name}. + Permission is granted to copy, distribute and/or modify this document + under the terms of the GNU Free Documentation License, Version 1.2 + or any later version published by the Free Software Foundation; + with no Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts. + A copy of the license is included in the section entitled ``GNU + Free Documentation License''. +@end group +@end smallexample + +If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts, +replace the ``with...Texts.'' line with this: + +@smallexample +@group + with the Invariant Sections being @var{list their titles}, with + the Front-Cover Texts being @var{list}, and with the Back-Cover Texts + being @var{list}. +@end group +@end smallexample + +If you have Invariant Sections without Cover Texts, or some other +combination of the three, merge those two alternatives to suit the +situation. + +If your document contains nontrivial examples of program code, we +recommend releasing these examples in parallel under your choice of +free software license, such as the GNU General Public License, +to permit their use in free software. + +@c Local Variables: +@c ispell-local-pdict: "ispell-dict" +@c End: + diff --git a/src/apps/bin/bison/doc/gpl.texi b/src/apps/bin/bison/doc/gpl.texi new file mode 100644 index 0000000000..852fa5cfcb --- /dev/null +++ b/src/apps/bin/bison/doc/gpl.texi @@ -0,0 +1,392 @@ +@node Copying +@unnumbered GNU GENERAL PUBLIC LICENSE +@center Version 2, June 1991 + +@c This file is intended to be included in another file. + +@display +Copyright @copyright{} 1989, 1991 Free Software Foundation, Inc. +59 Temple Place - Suite 330, Boston, MA 02111-1307, USA + +Everyone is permitted to copy and distribute verbatim copies +of this license document, but changing it is not allowed. +@end display + +@unnumberedsec Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software---to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Library General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + +@iftex +@unnumberedsec TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +@end iftex +@ifinfo +@center TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION +@end ifinfo + +@enumerate 0 +@item +This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The ``Program'', below, +refers to any such program or work, and a ``work based on the Program'' +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term ``modification''.) Each licensee is addressed as ``you''. + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + +@item +You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + +@item +You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + +@enumerate a +@item +You must cause the modified files to carry prominent notices +stating that you changed the files and the date of any change. + +@item +You must cause any work that you distribute or publish, that in +whole or in part contains or is derived from the Program or any +part thereof, to be licensed as a whole at no charge to all third +parties under the terms of this License. + +@item +If the modified program normally reads commands interactively +when run, you must cause it, when started running for such +interactive use in the most ordinary way, to print or display an +announcement including an appropriate copyright notice and a +notice that there is no warranty (or else, saying that you provide +a warranty) and that users may redistribute the program under +these conditions, and telling the user how to view a copy of this +License. (Exception: if the Program itself is interactive but +does not normally print such an announcement, your work based on +the Program is not required to print an announcement.) +@end enumerate + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + +@item +You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + +@enumerate a +@item +Accompany it with the complete corresponding machine-readable +source code, which must be distributed under the terms of Sections +1 and 2 above on a medium customarily used for software interchange; or, + +@item +Accompany it with a written offer, valid for at least three +years, to give any third party, for a charge no more than your +cost of physically performing source distribution, a complete +machine-readable copy of the corresponding source code, to be +distributed under the terms of Sections 1 and 2 above on a medium +customarily used for software interchange; or, + +@item +Accompany it with the information you received as to the offer +to distribute corresponding source code. (This alternative is +allowed only for noncommercial distribution and only if you +received the program in object code or executable form with such +an offer, in accord with Subsection b above.) +@end enumerate + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + +@item +You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + +@item +You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + +@item +Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + +@item +If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + +@item +If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + +@item +The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and ``any +later version'', you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + +@item +If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + +@iftex +@heading NO WARRANTY +@end iftex +@ifinfo +@center NO WARRANTY +@end ifinfo + +@item +BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM ``AS IS'' WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + +@item +IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. +@end enumerate + +@iftex +@heading END OF TERMS AND CONDITIONS +@end iftex +@ifinfo +@center END OF TERMS AND CONDITIONS +@end ifinfo + +@page +@unnumberedsec Appendix: How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the ``copyright'' line and a pointer to where the full notice is found. + +@smallexample +@var{one line to give the program's name and a brief idea of what it does.} +Copyright (C) @var{yyyy} @var{name of author} + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +@end smallexample + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + +@smallexample +Gnomovision version 69, Copyright (C) 19@var{yy} @var{name of author} +Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. +This is free software, and you are welcome to redistribute it +under certain conditions; type `show c' for details. +@end smallexample + +The hypothetical commands @samp{show w} and @samp{show c} should show +the appropriate parts of the General Public License. Of course, the +commands you use may be called something other than @samp{show w} and +@samp{show c}; they could even be mouse-clicks or menu items---whatever +suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a ``copyright disclaimer'' for the program, if +necessary. Here is a sample; alter the names: + +@example +Yoyodyne, Inc., hereby disclaims all copyright interest in the program +`Gnomovision' (which makes passes at compilers) written by James Hacker. + +@var{signature of Ty Coon}, 1 April 1989 +Ty Coon, President of Vice +@end example + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Library General +Public License instead of this License. diff --git a/src/apps/bin/bison/doc/refcard.tex b/src/apps/bin/bison/doc/refcard.tex new file mode 100644 index 0000000000..ead2a56382 --- /dev/null +++ b/src/apps/bin/bison/doc/refcard.tex @@ -0,0 +1,512 @@ +% Bison Quick Reference + +%**start of header +\newcount\columnsperpage + +% This file can be printed with 1 or 2 columns per page (see below). +% Specify how many you want here. Nothing else needs to be changed +% unless you are maintaining the documentation. +% For printing reference cards to use in books, specify one column +% per page and reduce to 80%. +% Note that if columnsperpage is set to 2, there will be a few overfull +% boxes, but they are not serious. Just uncomment \finalout. + +\columnsperpage=1 + +% comment out this line if you want page numbers to appear. +\nopagenumbers + +\def\finalout{\overfullrule=0pt} +%\finalout + +% Copyright (c) 1998, 2001 Free Software Foundation, Inc. +% +% This file is part of Bison. +% +% Bison is free software; you can redistribute them and/or modify them +% under the terms of the GNU General Public License as published by the +% Free Software Foundation; either version 2, or (at your option) any +% later version. +% +% Bison is distributed in the hope that it will be useful, but WITHOUT +% ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +% FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +% for more details. +% +% You should have received a copy of the GNU General Public License +% along with either Flex or Bison; see the file COPYING. If not, write +% to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, +% Boston, MA 02111-1307, USA. +% +% This file is intended to be processed by plain TeX (TeX82). +% +% The final reference card has two columns: +% This file can be used to produce it in any of three ways: +% 1 column per page +% produces two separate pages, each of which needs to be reduced to 80%. +% This gives the best resolution. +% 2 columns per page +% produces a single page. +% You will still need to cut and paste. +% Which mode to use is controlled by setting \columnsperpage above. +% +% Authors: +% Brendan Kehoe +% UUCP: widener!brendan +% Internet: brendan@cs.widener.edu +% +% Gavin Nicol +% Internet: nick@nsis.cl.co.jp +% +% This refcard format was created by Steve Gildea. +% +% Thanks to Paul Rubin, Bob Chassell, Len Tower, and Richard Mlynarik +% for their many good ideas. + +% We only change the following to change the version numbers and +% such. + +\def\bisonversion{1.31} % the bison version + +\def\refcardversion{0.5} % reference card version +\def\month{November} % month +\def\year{2001} % year +\def\version{\month\ \year, Bison Refcard Version \refcardversion} + +% for copyright notices +\def\small{\smallfont\textfont2=\smallsy\baselineskip=.8\baselineskip} +\def\medium{\mediumfont\textfont2=\mediumsy\baselineskip=.8\baselineskip} + +\def\copyrightnotice{ +\vskip .15ex plus .25 fill +\begingroup\medium +\centerline{Copyright \copyright\ \year\ Free Software Foundation, Inc.} +\vskip .2\baselineskip +\centerline{\version} +\vskip .2\baselineskip +\centerline{designed by Brendan Kehoe and Gavin Nicol} +\vskip .2\baselineskip +\centerline{for Bison \bisonversion} + +Permission is granted to make and distribute copies of this card +provided the copyright notice and this permission notice +are preserved on all copies. +\vskip .2\baselineskip +For information, write to the: +\vskip .2\baselineskip +\centerline{Free Software Foundation, Inc.} +\vskip .2\baselineskip +\centerline{59 Temple Place - Suite 330} +\vskip .2\baselineskip +\centerline{Boston, MA 02111-1307 USA} +\endgroup} + +%%%% smallcopyrightnotice for two column printing on one page. +\def\smallcopyrightnotice{ +\vskip .15ex plus .25 fill +\begingroup\small +\centerline{Copyright \copyright\ \year\ Free Software Foundation, Inc.} +\vskip .2\baselineskip +\centerline{\version} +\vskip .2\baselineskip +\centerline{designed by Brendan Kehoe and Gavin Nicol} +\vskip .2\baselineskip +\centerline{for Bison \bisonversion} + +Permission is granted to make and distribute copies of this card +provided the copyright notice and this permission notice +are preserved on all copies. +\vskip .2\baselineskip +For information, write to the: +\vskip .2\baselineskip +\centerline{Free Software Foundation, Inc.} +\vskip .2\baselineskip +\centerline{59 Temple Place - Suite 330} +\vskip .2\baselineskip +\centerline{Boston, MA 02111-1307 USA} +\endgroup} + +% make \bye not \outer so that the \def\bye in the \else clause below +% can be scanned without complaint. +\def\bye{\par\vfill\supereject\end} + +\newdimen\intercolumnskip +\newbox\columna +\newbox\columnb + +\def\ncolumns{\the\columnsperpage} + +\message{[\ncolumns\space + column\if 1\ncolumns\else s\fi\space per page]} + +\def\scaledmag#1{ scaled \magstep #1} + +% This multi-way format was designed by Stephen Gildea +% October 1986. +\if 1\ncolumns + \hsize 4in + \vsize 10in +% We want output .3 inch *from top of paper edge*; i.e. -.7in from TeX default + \voffset -.7in % Comment out for xdvi viewing; include for printing. + \font\titlefont=\fontname\tenbf \scaledmag3 + \font\headingfont=\fontname\tenbf \scaledmag2 + \font\smallfont=cmr6 + \font\smallsy=cmsy6 + \font\mediumfont=cmr10 + \font\mediumsy=cmsy10 + + +% two lines below commented out in Yet Another Attempt to eliminate +% page numbers from the output. + \footline{\hss} +% \footline{\hss\folio} + \def\makefootline{\baselineskip10pt\hsize6.5in\line{\the\footline}} +\else + \hsize 3.2in + \vsize 7.95in + \hoffset -.75in + \voffset -.745in + \font\titlefont=cmbx10 \scaledmag2 + \font\headingfont=cmbx10 \scaledmag1 + \font\smallfont=cmr6 + \font\smallsy=cmsy6 + \font\eightrm=cmr8 + \font\eightbf=cmbx8 + \font\eightit=cmti8 + \font\eighttt=cmtt8 + \font\eightsy=cmsy8 + \textfont0=\eightrm + \textfont2=\eightsy + \def\rm{\eightrm} + \def\bf{\eightbf} + \def\it{\eightit} + \def\tt{\eighttt} +%%%% Reduce skip from .8 to .75 to permit printing on two pages. + \normalbaselineskip=.75\normalbaselineskip + \normallineskip=.75\normallineskip + \normallineskiplimit=.75\normallineskiplimit + \normalbaselines\rm %make definitions take effect + + \if 2\ncolumns + \let\maxcolumn=b + \footline{\hss\rm\folio\hss} + \def\makefootline{\vskip 2in \hsize=6.86in\line{\the\footline}} + \font\mediumfont=cmr10 + \font\mediumsy=cmsy10 + +% Leave 3 column code here in case size increases. + \else \if 3\ncolumns + \let\maxcolumn=c + \nopagenumbers + \font\mediumfont=cmr10 + \font\mediumsy=cmsy10 + + \else + \errhelp{You must set \columnsperpage equal to 1, 2, or 3.} + \errmessage{Illegal number of columns per page} + \fi\fi + + \intercolumnskip=.46in + \def\abc{a} + \output={% + % This next line is useful when designing the layout. + %\immediate\write16{Column \folio\abc\space starts with \firstmark} + \if \maxcolumn\abc \multicolumnformat \global\def\abc{a} + \else\if a\abc + \global\setbox\columna\columnbox \global\def\abc{b} + %% in case we never use \columnb (two-column mode) + \global\setbox\columnb\hbox to -\intercolumnskip{} + \else + \global\setbox\columnb\columnbox \global\def\abc{c}\fi\fi} + \def\multicolumnformat{\shipout\vbox{\makeheadline + \hbox{\box\columna\hskip\intercolumnskip + \box\columnb\hskip\intercolumnskip\columnbox} + \makefootline}\advancepageno} + \def\columnbox{\leftline{\pagebody}} + + \def\bye{\par\vfill\supereject + \if a\abc \else\null\vfill\eject\fi + \if a\abc \else\null\vfill\eject\fi + \end} +\fi + +% we won't be using math mode much, so redefine some of the characters +% we might want to talk about +\catcode`\^=12 +\catcode`\_=12 + +\chardef\\=`\\ +\chardef\{=`\{ +\chardef\}=`\} + +\hyphenation{mini-buf-fer} + +\parindent 0pt +% \parskip 1ex plus .5ex minus .5ex +\parskip 0.5ex plus .25ex minus .25ex + +\outer\def\newcolumn{\vfill\eject} + +\outer\def\title#1{{\titlefont\centerline{#1}}\vskip 1ex plus .5ex} + +\outer\def\section#1{\par\filbreak + \vskip 1.5ex plus 1ex minus 1ex {\headingfont #1}\mark{#1}% + \vskip 1ex plus .5ex minus 0.75ex} + +\newdimen\keyindent + +\def\beginindentedkeys{\keyindent=1em} +\def\endindentedkeys{\keyindent=0em} +\endindentedkeys + +\def\paralign{\vskip\parskip\halign} + +\def\<#1>{$\langle${\rm #1}$\rangle$} + +\def\kbd#1{{\tt#1}\null} %\null so not an abbrev even if period follows + +\def\beginexample{\par\leavevmode\begingroup + \obeylines\obeyspaces\parskip0pt\tt} +{\obeyspaces\global\let =\ } +\def\endexample{\endgroup} +\def\begincexample{% + \par\leavevmode\begingroup% + \obeylines\obeyspaces% + % bpk--added indentation + \advance\leftskip.25truein +% \parskip0pt% + \tt} +{\obeyspaces\global\let =\ } +\def\endcexample{\endgroup} + +%%%%% Prime definition of key; redefined below to prevent overful hboxes + +\def\key#1#2{\leavevmode\hbox to \hsize + {\vtop {\hsize=.67\hsize \rightskip=1em #1} + \kbd{#2}\hfil}} + +\newbox\metaxbox +\setbox\metaxbox\hbox{\kbd{M-x }} +\newdimen\metaxwidth +\metaxwidth=\wd\metaxbox + +\def\metax#1#2{\leavevmode\hbox to \hsize{\hbox to .75\hsize + {\hskip\keyindent\relax#1\hfil}% + \hskip -\metaxwidth minus 1fil + \kbd{#2}\hfil}} + +\def\threecol#1#2#3{\hskip\keyindent\relax#1\hfil&\kbd{#2}\quad + &\kbd{#3}\quad\cr} + +%**end of header + +% ************ +% ** BISON ** +% ************ + +\title{Bison Quick Reference} + +\section{Starting Bison} +%*********************** + +To use Bison, type: \kbd{bison {\it filename}} + +Options can be used as: \kbd{bison {\it options} {\it filename}} + +\section{Command Line Options} +%***************************** + +\key{Display usage information.} {-h} +\key{Display version information.} {-V} +\key{Generate token and {\tt YYSTYPE} definitions.} {-d} +\key{Prepend a prefix to external symbols.} {-p {\it prefix}} +\key{Don't put {\tt \#line} directives in the parser.} {-l} +\key{Specify the output file.} {-o {\it filename}} +\key{Debug or {\it trace} mode.} {-t} +\key{Verbose description of the parser.} {-v} +\key{Emulate {\tt yacc} (generate {\tt y.tab.*} files).} {-y} + +\vskip .10truein +{\bf Note:} The token and {\tt YYSTYPE} definitions are generated +to a file called {\tt y.tab.h} if the {\tt -y} option is used, +otherwise it will have the format {\tt {\it name}.tab.h}, where +{\it name} is the leading part of the parser definition filename. + +\section{Definitions} +%******************** + +\key{Declare a terminal symbol.}{\%token <{\it t\/}> + {\it n}} + +\key{Declare a terminal symbol, and define its association.} + {{\it association} <{\it t\/}> {\it n}} + +\vskip .2\baselineskip +\key{Generate a reentrant (pure) parser.} + {\%pure_parser} + +\key{Define the union of all data types used in the parser.} + {\%union\{{\it field list}\} } + +\vskip .2\baselineskip +\key{Tell {\tt bison} where to start parsing.} + {\%start {\it m}} + +\key{Tell {\tt bison} the data type of symbols.} + {\%type <{\it t\/}> {\it s1}\dots{\it sn}} + +\vskip .10truein + +In the above, {\it t} is a {\it type} defined in the {\tt \%union} +definition, {\it n} is a {\it terminal} symbol name, {\it m} is a +{\it non-terminal} symbol name, and {\it association} can be one of +{\tt \%left}, {\tt \%right}, or {\tt \%nonassoc}. + +\vskip .10truein + +The {\tt <{\it t\/}>} after {\tt \%token, \%left, \%right} and {\tt + \%nonassoc} is optional. Additionally, precedence may be overridden +in the rules with {\tt \%prec} commands. + +\section{Parser Definition Files} +%********************************* + +The general form for a parser definition is: + +\begincexample +\{\% + /* Initial C code. */ +\%\} + + {\it Token and type definitions} + +\%\% + + Rule definition 1 + \vdots + Rule definition {\it n} + +\%\% + + /* Other C code. */ +\endcexample + + +% Decrease standard baselineskip for the second page + \baselineskip = .9\baselineskip + +\section {Rule definitions} +%************************** + +Rules take the form: + +\vskip -\baselineskip +\beginexample + non-terminal : {\it statement} 1 + | {\it statement} 2 + \vdots + | {\it statement n} + ; +\endexample + +Where {\it statements} can be either empty, or contain +a mixture of C code (enclosed in {\tt \{...\}}), and the +symbols that make up the non-terminal. For example: + +\vskip -\baselineskip +\beginexample + expression : number '$+$' number \{ \$\$ $=$ \$1 $+$ \$3 \} + | number '$-$' number \{ \$\$ $=$ \$1 $-$ \$3 \} + | number '$/$' number \{ \$\$ $=$ \$1 $/$ \$3 \} + | number '$*$' number \{ \$\$ $=$ \$1 $*$ \$3 \} + ; +\endexample + +For altering the precedence of a symbol use: +\vskip -\baselineskip + +\beginexample + \%prec name +\endexample + +For example: +\vskip -\baselineskip +\beginexample + foo : gnu bar gnu \%prec bar + ; +\endexample + +\section{Grammar Variables and Symbols} +%************************************** + +\key{Recognize an error \& continue parsing.}{error} +\key{Access data associated with a symbol.} {\$\$, \$0\dots\${\it n}} +\key{Access a field of the data union.} {\$\$.{\it t}, + \$0.{\it t}\dots\${\it n}.{\it t}} +\key{Access symbol's location.} {@\$, @0\dots@{\it n}} +\key{Access data's line location.} {@{\it x}.{\it line\_spec}} +\key{Access data's column location.} {@{\it x}.{\it column\_spec}} + + +\vskip .10truein +% +Where {\it t} is a type defined in the {\tt \%union}, {\it n} is a +number, {\it x} is a number or \$, {\it line\_spec} one of {\tt + first_line} and {\tt last_line}, and {\it column\_spec} is specified +as either {\tt first_column} or {\tt last_column}. + +\section {Variables and Types} +%***************************** + +\key{Current look ahead token.} {yychar} +\key{Debug mode flag.} {yydebug} +\key{Data associated with the current token.} {yylval} +\key{Source position of current token.} {yylloc} +\key{Number of errors encountered.} {yynerrs} +\key{Position information type.} {YYLTYPE} +\key{Data type associated with symbols.} {YYSTYPE} + +\section {Functions} +%******************* + +% Redefine to prevent overfull hboxes +\def\key#1#2{\leavevmode\hbox to \hsize + {\vtop {\hsize=.625\hsize \rightskip=1em #1} + \kbd{#2}\hfil}} + +\key{User defined error handler.} {int yyerror(char *)} +\key{User defined lexical analyzer.} {int yylex()} +\key{The grammar parser.} {int yyparse()} + +% Return to previous size +\def\key#1#2{\leavevmode\hbox to \hsize + {\vtop {\hsize=.67\hsize \rightskip=1em #1} + \kbd{#2}\hfil}} + +\section{Macros} +%*************** + +\key{Quit parsing immediately. Return 1.} {YYABORT} +\key{Quit parsing immediately. Return 0.} {YYACCEPT} +\key{Pretend a syntax error occurred.} {YYERROR} +\key{Value in {\tt yychar} if no look-ahead token.} {YYEMPTY} +\key{Clear previous look ahead token.} {yyclearin} +\key{Recover normally from an error.} {yyerrok} + +% ************** +% ** The end ** +% ************** + +\vskip \baselineskip +\if 1\ncolumns +\copyrightnotice +\else +\smallcopyrightnotice +\fi + +\bye + + +% Local variables: +% compile-command: "tex refcard" +% End: diff --git a/src/apps/bin/bison/doc/stamp-vti b/src/apps/bin/bison/doc/stamp-vti new file mode 100644 index 0000000000..2e1d5ea4f8 --- /dev/null +++ b/src/apps/bin/bison/doc/stamp-vti @@ -0,0 +1,4 @@ +@set UPDATED 30 March 2004 +@set UPDATED-MONTH March 2004 +@set EDITION 1.875d +@set VERSION 1.875d diff --git a/src/apps/bin/bison/doc/version.texi b/src/apps/bin/bison/doc/version.texi new file mode 100644 index 0000000000..2e1d5ea4f8 --- /dev/null +++ b/src/apps/bin/bison/doc/version.texi @@ -0,0 +1,4 @@ +@set UPDATED 30 March 2004 +@set UPDATED-MONTH March 2004 +@set EDITION 1.875d +@set VERSION 1.875d diff --git a/src/apps/bin/bison/lib/Jamfile b/src/apps/bin/bison/lib/Jamfile new file mode 100644 index 0000000000..1ddb9e7a9b --- /dev/null +++ b/src/apps/bin/bison/lib/Jamfile @@ -0,0 +1,42 @@ +SubDir OBOS_TOP src apps bin bison lib ; + +SubDirCcFlags -DHAVE_CONFIG_H ; + +SubDirHdrs [ FDirName $(SUBDIR) $(DOTDOT) ] ; + +StaticLibrary bison : + abitset.c +#alloca.c +argmatch.c +basename.c +bitset.c +bitset_stats.c +bitsetv-print.c +bitsetv.c +dirname.c +ebitset.c +error.c +exitfail.c +get-errno.c +getopt.c +getopt1.c +hard-locale.c +hash.c +lbitset.c +malloc.c +mbswidth.c +obstack.c +quote.c +quotearg.c +realloc.c +stpcpy.c +stripslash.c +strndup.c +strnlen.c +subpipe.c +timevar.c +vbitset.c +xmalloc.c +xstrdup.c +xstrndup.c +; diff --git a/src/apps/bin/bison/lib/Makefile.am b/src/apps/bin/bison/lib/Makefile.am new file mode 100644 index 0000000000..9a92666efd --- /dev/null +++ b/src/apps/bin/bison/lib/Makefile.am @@ -0,0 +1,53 @@ +## Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. + +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +## 02111-1307 USA + +AM_CFLAGS = $(WARNING_CFLAGS) + +BUILT_SOURCES = +EXTRA_DIST = +MOSTLYCLEANFILES = + +lib_LIBRARIES = $(YACC_LIBRARY) +EXTRA_LIBRARIES = liby.a +noinst_LIBRARIES = libbison.a + +liby_a_SOURCES = main.c yyerror.c + +libbison_a_SOURCES = $(lib_SOURCES) +lib_SOURCES = \ + get-errno.h get-errno.c \ + subpipe.h subpipe.c \ + $(bitsets_sources) $(additional_bitsets_sources) $(timevars_sources) + +# Implementation of bitsets +bitsets_sources = \ + abitset.c abitset.h bbitset.h bitset.c bitset.h bitset_stats.c \ + bitset_stats.h bitsetv.c bitsetv.h ebitset.c ebitset.h lbitset.c \ + lbitset.h libiberty.h vbitset.c vbitset.h + +# Additional bitset operations. +additional_bitsets_sources = \ + bitsetv-print.h bitsetv-print.c + +# timevars, stolen from GCC. +timevars_sources = \ + timevar.h timevar.c timevar.def + +libbison_a_LIBADD = $(LIBOBJS) $(ALLOCA) +libbison_a_DEPENDENCIES = $(libbison_a_LIBADD) + +include gnulib.mk diff --git a/src/apps/bin/bison/lib/Makefile.in b/src/apps/bin/bison/lib/Makefile.in new file mode 100644 index 0000000000..2d82903a06 --- /dev/null +++ b/src/apps/bin/bison/lib/Makefile.in @@ -0,0 +1,600 @@ +# Makefile.in generated by automake 1.8.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + +SOURCES = $(libbison_a_SOURCES) $(liby_a_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/gnulib.mk alloca.c error.c error.h malloc.c \ + obstack.c obstack.h realloc.c stpcpy.c strndup.c strnlen.c +subdir = lib +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/alloca.m4 \ + $(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dmalloc.m4 \ + $(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/error.m4 \ + $(top_srcdir)/m4/exitfail.m4 $(top_srcdir)/m4/extensions.m4 \ + $(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gnulib.m4 $(top_srcdir)/m4/hard-locale.m4 \ + $(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/m4.m4 \ + $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbstate_t.m4 \ + $(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/obstack.m4 $(top_srcdir)/m4/onceonly.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \ + $(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stpcpy.m4 \ + $(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \ + $(top_srcdir)/m4/subpipe.m4 $(top_srcdir)/m4/timevar.m4 \ + $(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/warning.m4 \ + $(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xstrndup.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__installdirs = "$(DESTDIR)$(libdir)" +libLIBRARIES_INSTALL = $(INSTALL_DATA) +LIBRARIES = $(lib_LIBRARIES) $(noinst_LIBRARIES) +AR = ar +ARFLAGS = cru +libbison_a_AR = $(AR) $(ARFLAGS) +am__DEPENDENCIES_1 = @LIBOBJS@ +am__DEPENDENCIES_2 = @ALLOCA@ +am__objects_1 = abitset.$(OBJEXT) bitset.$(OBJEXT) \ + bitset_stats.$(OBJEXT) bitsetv.$(OBJEXT) ebitset.$(OBJEXT) \ + lbitset.$(OBJEXT) vbitset.$(OBJEXT) +am__objects_2 = bitsetv-print.$(OBJEXT) +am__objects_3 = timevar.$(OBJEXT) +am__objects_4 = get-errno.$(OBJEXT) subpipe.$(OBJEXT) $(am__objects_1) \ + $(am__objects_2) $(am__objects_3) argmatch.$(OBJEXT) \ + dirname.$(OBJEXT) basename.$(OBJEXT) stripslash.$(OBJEXT) \ + exitfail.$(OBJEXT) getopt.$(OBJEXT) getopt1.$(OBJEXT) \ + hard-locale.$(OBJEXT) hash.$(OBJEXT) mbswidth.$(OBJEXT) \ + quote.$(OBJEXT) quotearg.$(OBJEXT) xmalloc.$(OBJEXT) \ + xstrdup.$(OBJEXT) xstrndup.$(OBJEXT) +am_libbison_a_OBJECTS = $(am__objects_4) +libbison_a_OBJECTS = $(am_libbison_a_OBJECTS) +liby_a_AR = $(AR) $(ARFLAGS) +liby_a_LIBADD = +am_liby_a_OBJECTS = main.$(OBJEXT) yyerror.$(OBJEXT) +liby_a_OBJECTS = $(am_liby_a_OBJECTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/config/depcomp +am__depfiles_maybe = depfiles +@AMDEP_TRUE@DEP_FILES = $(DEPDIR)/alloca.Po $(DEPDIR)/error.Po \ +@AMDEP_TRUE@ $(DEPDIR)/malloc.Po $(DEPDIR)/obstack.Po \ +@AMDEP_TRUE@ $(DEPDIR)/realloc.Po $(DEPDIR)/stpcpy.Po \ +@AMDEP_TRUE@ $(DEPDIR)/strndup.Po $(DEPDIR)/strnlen.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/abitset.Po ./$(DEPDIR)/argmatch.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/basename.Po ./$(DEPDIR)/bitset.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/bitset_stats.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/bitsetv-print.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/bitsetv.Po ./$(DEPDIR)/dirname.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/ebitset.Po ./$(DEPDIR)/exitfail.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/get-errno.Po ./$(DEPDIR)/getopt.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/getopt1.Po ./$(DEPDIR)/hard-locale.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/hash.Po ./$(DEPDIR)/lbitset.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/main.Po ./$(DEPDIR)/mbswidth.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/quote.Po ./$(DEPDIR)/quotearg.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/stripslash.Po ./$(DEPDIR)/subpipe.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/timevar.Po ./$(DEPDIR)/vbitset.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/xmalloc.Po ./$(DEPDIR)/xstrdup.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/xstrndup.Po ./$(DEPDIR)/yyerror.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +SOURCES = $(libbison_a_SOURCES) $(liby_a_SOURCES) +DIST_SOURCES = $(libbison_a_SOURCES) $(liby_a_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALLOCA_H = @ALLOCA_H@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOM4TE = @AUTOM4TE@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GCC = @GCC@ +GMSGFMT = @GMSGFMT@ +HAVE__BOOL = @HAVE__BOOL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +O0CFLAGS = @O0CFLAGS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STDBOOL_H = @STDBOOL_H@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VALGRIND = @VALGRIND@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WERROR_CFLAGS = @WERROR_CFLAGS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +YACC_LIBRARY = @YACC_LIBRARY@ +YACC_SCRIPT = @YACC_SCRIPT@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +AM_CFLAGS = $(WARNING_CFLAGS) + +# This file is generated automatically by "bootstrap". +BUILT_SOURCES = $(ALLOCA_H) $(STDBOOL_H) +EXTRA_DIST = alloca_.h stdbool_.h +MOSTLYCLEANFILES = alloca.h alloca.h-t stdbool.h stdbool.h-t +lib_LIBRARIES = $(YACC_LIBRARY) +EXTRA_LIBRARIES = liby.a +noinst_LIBRARIES = libbison.a +liby_a_SOURCES = main.c yyerror.c +libbison_a_SOURCES = $(lib_SOURCES) +lib_SOURCES = \ + get-errno.h get-errno.c \ + subpipe.h subpipe.c \ + $(bitsets_sources) $(additional_bitsets_sources) $(timevars_sources)\ +argmatch.h argmatch.c dirname.h dirname.c basename.c stripslash.c exit.h exitfail.h exitfail.c getopt.h getopt.c getopt1.c getopt_int.h gettext.h hard-locale.h hard-locale.c hash.h hash.c mbswidth.h mbswidth.c quote.h quote.c quotearg.h quotearg.c stpcpy.h strndup.h unlocked-io.h xalloc.h xmalloc.c xstrdup.c xstrndup.h xstrndup.c + +# Implementation of bitsets +bitsets_sources = \ + abitset.c abitset.h bbitset.h bitset.c bitset.h bitset_stats.c \ + bitset_stats.h bitsetv.c bitsetv.h ebitset.c ebitset.h lbitset.c \ + lbitset.h libiberty.h vbitset.c vbitset.h + + +# Additional bitset operations. +additional_bitsets_sources = \ + bitsetv-print.h bitsetv-print.c + + +# timevars, stolen from GCC. +timevars_sources = \ + timevar.h timevar.c timevar.def + +libbison_a_LIBADD = $(LIBOBJS) $(ALLOCA) +libbison_a_DEPENDENCIES = $(libbison_a_LIBADD) +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .o .obj +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(srcdir)/gnulib.mk $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu lib/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu lib/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-libLIBRARIES: $(lib_LIBRARIES) + @$(NORMAL_INSTALL) + test -z "$(libdir)" || $(mkdir_p) "$(DESTDIR)$(libdir)" + @list='$(lib_LIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + f="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " $(libLIBRARIES_INSTALL) '$$p' '$(DESTDIR)$(libdir)/$$f'"; \ + $(libLIBRARIES_INSTALL) "$$p" "$(DESTDIR)$(libdir)/$$f"; \ + else :; fi; \ + done + @$(POST_INSTALL) + @list='$(lib_LIBRARIES)'; for p in $$list; do \ + if test -f $$p; then \ + p="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " $(RANLIB) '$(DESTDIR)$(libdir)/$$p'"; \ + $(RANLIB) "$(DESTDIR)$(libdir)/$$p"; \ + else :; fi; \ + done + +uninstall-libLIBRARIES: + @$(NORMAL_UNINSTALL) + @list='$(lib_LIBRARIES)'; for p in $$list; do \ + p="`echo $$p | sed -e 's|^.*/||'`"; \ + echo " rm -f '$(DESTDIR)$(libdir)/$$p'"; \ + rm -f "$(DESTDIR)$(libdir)/$$p"; \ + done + +clean-libLIBRARIES: + -test -z "$(lib_LIBRARIES)" || rm -f $(lib_LIBRARIES) + +clean-noinstLIBRARIES: + -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) +libbison.a: $(libbison_a_OBJECTS) $(libbison_a_DEPENDENCIES) + -rm -f libbison.a + $(libbison_a_AR) libbison.a $(libbison_a_OBJECTS) $(libbison_a_LIBADD) + $(RANLIB) libbison.a +liby.a: $(liby_a_OBJECTS) $(liby_a_DEPENDENCIES) + -rm -f liby.a + $(liby_a_AR) liby.a $(liby_a_OBJECTS) $(liby_a_LIBADD) + $(RANLIB) liby.a + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/alloca.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/error.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/malloc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/obstack.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/realloc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/stpcpy.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strndup.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@$(DEPDIR)/strnlen.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/abitset.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/argmatch.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/basename.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitset.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitset_stats.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitsetv-print.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bitsetv.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/dirname.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ebitset.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/exitfail.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/get-errno.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getopt1.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hard-locale.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/hash.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lbitset.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mbswidth.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quote.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/quotearg.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/stripslash.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/subpipe.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timevar.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vbitset.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xmalloc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xstrdup.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/xstrndup.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/yyerror.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(LIBRARIES) +installdirs: + for dir in "$(DESTDIR)$(libdir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + +distclean-generic: + -rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) +clean: clean-am + +clean-am: clean-generic clean-libLIBRARIES clean-noinstLIBRARIES \ + mostlyclean-am + +distclean: distclean-am + -rm -rf $(DEPDIR) ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-libLIBRARIES + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf $(DEPDIR) ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am uninstall-libLIBRARIES + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-generic \ + clean-libLIBRARIES clean-noinstLIBRARIES ctags distclean \ + distclean-compile distclean-generic distclean-tags distdir dvi \ + dvi-am html html-am info info-am install install-am \ + install-data install-data-am install-exec install-exec-am \ + install-info install-info-am install-libLIBRARIES install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-info-am \ + uninstall-libLIBRARIES + + +# We need the following in order to create an when the system +# doesn't have one that works with the given compiler. +all-local $(lib_OBJECTS): $(ALLOCA_H) +alloca.h: alloca_.h + cp $(srcdir)/alloca_.h $@-t + mv $@-t $@ + +# We need the following in order to create an when the system +# doesn't have one that works. +all-local $(lib_OBJECTS): $(STDBOOL_H) +stdbool.h: stdbool_.h + sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool_.h > $@-t + mv $@-t $@ +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/apps/bin/bison/lib/abitset.c b/src/apps/bin/bison/lib/abitset.c new file mode 100644 index 0000000000..0fe1b47bbb --- /dev/null +++ b/src/apps/bin/bison/lib/abitset.c @@ -0,0 +1,830 @@ +/* Array bitsets. + Copyright (C) 2002, 2003 Free Software Foundation, Inc. + Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "abitset.h" +#include +#include +#include + +/* This file implements fixed size bitsets stored as an array + of words. Any unused bits in the last word must be zero. */ + +#define ABITSET_N_WORDS(N) (((N) + BITSET_WORD_BITS - 1) / BITSET_WORD_BITS) +#define ABITSET_WORDS(X) ((X)->a.words) + + +static bitset_bindex +abitset_resize (bitset src ATTRIBUTE_UNUSED, + bitset_bindex size ATTRIBUTE_UNUSED) +{ + if (BITSET_SIZE_ (src) == size) + return size; + + /* These bitsets have a fixed size. */ + abort (); +} + +/* Find list of up to NUM bits set in BSET starting from and including + *NEXT and store in array LIST. Return with actual number of bits + found and with *NEXT indicating where search stopped. */ +static bitset_bindex +abitset_small_list (bitset src, bitset_bindex *list, + bitset_bindex num, bitset_bindex *next) +{ + bitset_bindex bitno; + bitset_bindex count; + bitset_windex size; + bitset_word word; + + word = ABITSET_WORDS (src)[0]; + + /* Short circuit common case. */ + if (!word) + return 0; + + size = BITSET_SIZE_ (src); + bitno = *next; + if (bitno >= size) + return 0; + + word >>= bitno; + + /* If num is 1, we could speed things up with a binary search + of the word of interest. */ + + if (num >= BITSET_WORD_BITS) + { + for (count = 0; word; bitno++) + { + if (word & 1) + list[count++] = bitno; + word >>= 1; + } + } + else + { + for (count = 0; word; bitno++) + { + if (word & 1) + { + list[count++] = bitno; + if (count >= num) + { + bitno++; + break; + } + } + word >>= 1; + } + } + + *next = bitno; + return count; +} + + +/* Set bit BITNO in bitset DST. */ +static void +abitset_set (bitset dst ATTRIBUTE_UNUSED, bitset_bindex bitno ATTRIBUTE_UNUSED) +{ + /* This should never occur for abitsets since we should always hit + the cache. It is likely someone is trying to access outside the + bounds of the bitset. */ + abort (); +} + + +/* Reset bit BITNO in bitset DST. */ +static void +abitset_reset (bitset dst ATTRIBUTE_UNUSED, + bitset_bindex bitno ATTRIBUTE_UNUSED) +{ + /* This should never occur for abitsets since we should always hit + the cache. It is likely someone is trying to access outside the + bounds of the bitset. Since the bit is zero anyway, let it pass. */ +} + + +/* Test bit BITNO in bitset SRC. */ +static bool +abitset_test (bitset src ATTRIBUTE_UNUSED, + bitset_bindex bitno ATTRIBUTE_UNUSED) +{ + /* This should never occur for abitsets since we should always + hit the cache. */ + return false; +} + + +/* Find list of up to NUM bits set in BSET in reverse order, starting + from and including NEXT and store in array LIST. Return with + actual number of bits found and with *NEXT indicating where search + stopped. */ +static bitset_bindex +abitset_list_reverse (bitset src, bitset_bindex *list, + bitset_bindex num, bitset_bindex *next) +{ + bitset_bindex bitno; + bitset_bindex rbitno; + bitset_bindex count; + bitset_windex windex; + unsigned int bitcnt; + bitset_bindex bitoff; + bitset_word *srcp = ABITSET_WORDS (src); + bitset_bindex n_bits = BITSET_SIZE_ (src); + + rbitno = *next; + + /* If num is 1, we could speed things up with a binary search + of the word of interest. */ + + if (rbitno >= n_bits) + return 0; + + count = 0; + + bitno = n_bits - (rbitno + 1); + + windex = bitno / BITSET_WORD_BITS; + bitcnt = bitno % BITSET_WORD_BITS; + bitoff = windex * BITSET_WORD_BITS; + + do + { + bitset_word word; + + word = srcp[windex] << (BITSET_WORD_BITS - 1 - bitcnt); + for (; word; bitcnt--) + { + if (word & BITSET_MSB) + { + list[count++] = bitoff + bitcnt; + if (count >= num) + { + *next = n_bits - (bitoff + bitcnt); + return count; + } + } + word <<= 1; + } + bitoff -= BITSET_WORD_BITS; + bitcnt = BITSET_WORD_BITS - 1; + } + while (windex--); + + *next = n_bits - (bitoff + 1); + return count; +} + + +/* Find list of up to NUM bits set in BSET starting from and including + *NEXT and store in array LIST. Return with actual number of bits + found and with *NEXT indicating where search stopped. */ +static bitset_bindex +abitset_list (bitset src, bitset_bindex *list, + bitset_bindex num, bitset_bindex *next) +{ + bitset_bindex bitno; + bitset_bindex count; + bitset_windex windex; + bitset_bindex bitoff; + bitset_windex size = src->b.csize; + bitset_word *srcp = ABITSET_WORDS (src); + bitset_word word; + + bitno = *next; + + count = 0; + if (!bitno) + { + /* Many bitsets are zero, so make this common case fast. */ + for (windex = 0; windex < size && !srcp[windex]; windex++) + continue; + if (windex >= size) + return 0; + + /* If num is 1, we could speed things up with a binary search + of the current word. */ + + bitoff = windex * BITSET_WORD_BITS; + } + else + { + if (bitno >= BITSET_SIZE_ (src)) + return 0; + + windex = bitno / BITSET_WORD_BITS; + bitno = bitno % BITSET_WORD_BITS; + + if (bitno) + { + /* Handle the case where we start within a word. + Most often, this is executed with large bitsets + with many set bits where we filled the array + on the previous call to this function. */ + + bitoff = windex * BITSET_WORD_BITS; + word = srcp[windex] >> bitno; + for (bitno = bitoff + bitno; word; bitno++) + { + if (word & 1) + { + list[count++] = bitno; + if (count >= num) + { + *next = bitno + 1; + return count; + } + } + word >>= 1; + } + windex++; + } + bitoff = windex * BITSET_WORD_BITS; + } + + for (; windex < size; windex++, bitoff += BITSET_WORD_BITS) + { + if (!(word = srcp[windex])) + continue; + + if ((count + BITSET_WORD_BITS) < num) + { + for (bitno = bitoff; word; bitno++) + { + if (word & 1) + list[count++] = bitno; + word >>= 1; + } + } + else + { + for (bitno = bitoff; word; bitno++) + { + if (word & 1) + { + list[count++] = bitno; + if (count >= num) + { + *next = bitno + 1; + return count; + } + } + word >>= 1; + } + } + } + + *next = bitoff; + return count; +} + + +/* Ensure that any unused bits within the last word are clear. */ +static inline void +abitset_unused_clear (bitset dst) +{ + unsigned int last_bit; + + last_bit = BITSET_SIZE_ (dst) % BITSET_WORD_BITS; + if (last_bit) + ABITSET_WORDS (dst)[dst->b.csize - 1] &= + ((bitset_word) 1 << last_bit) - 1; +} + + +static void +abitset_ones (bitset dst) +{ + bitset_word *dstp = ABITSET_WORDS (dst); + size_t bytes; + + bytes = sizeof (bitset_word) * dst->b.csize; + + memset (dstp, -1, bytes); + abitset_unused_clear (dst); +} + + +static void +abitset_zero (bitset dst) +{ + bitset_word *dstp = ABITSET_WORDS (dst); + size_t bytes; + + bytes = sizeof (bitset_word) * dst->b.csize; + + memset (dstp, 0, bytes); +} + + +static bool +abitset_empty_p (bitset dst) +{ + bitset_windex i; + bitset_word *dstp = ABITSET_WORDS (dst); + + for (i = 0; i < dst->b.csize; i++) + if (dstp[i]) + return false; + + return true; +} + + +static void +abitset_copy1 (bitset dst, bitset src) +{ + bitset_word *srcp = ABITSET_WORDS (src); + bitset_word *dstp = ABITSET_WORDS (dst); + bitset_windex size = dst->b.csize; + + if (srcp == dstp) + return; + memcpy (dstp, srcp, sizeof (bitset_word) * size); +} + + +static void +abitset_not (bitset dst, bitset src) +{ + bitset_windex i; + bitset_word *srcp = ABITSET_WORDS (src); + bitset_word *dstp = ABITSET_WORDS (dst); + bitset_windex size = dst->b.csize; + + for (i = 0; i < size; i++) + *dstp++ = ~(*srcp++); + abitset_unused_clear (dst); +} + + +static bool +abitset_equal_p (bitset dst, bitset src) +{ + bitset_windex i; + bitset_word *srcp = ABITSET_WORDS (src); + bitset_word *dstp = ABITSET_WORDS (dst); + bitset_windex size = dst->b.csize; + + for (i = 0; i < size; i++) + if (*srcp++ != *dstp++) + return false; + return true; +} + + +static bool +abitset_subset_p (bitset dst, bitset src) +{ + bitset_windex i; + bitset_word *srcp = ABITSET_WORDS (src); + bitset_word *dstp = ABITSET_WORDS (dst); + bitset_windex size = dst->b.csize; + + for (i = 0; i < size; i++, dstp++, srcp++) + if (*dstp != (*srcp | *dstp)) + return false; + return true; +} + + +static bool +abitset_disjoint_p (bitset dst, bitset src) +{ + bitset_windex i; + bitset_word *srcp = ABITSET_WORDS (src); + bitset_word *dstp = ABITSET_WORDS (dst); + bitset_windex size = dst->b.csize; + + for (i = 0; i < size; i++) + if (*srcp++ & *dstp++) + return false; + + return true; +} + + +static void +abitset_and (bitset dst, bitset src1, bitset src2) +{ + bitset_windex i; + bitset_word *src1p = ABITSET_WORDS (src1); + bitset_word *src2p = ABITSET_WORDS (src2); + bitset_word *dstp = ABITSET_WORDS (dst); + bitset_windex size = dst->b.csize; + + for (i = 0; i < size; i++) + *dstp++ = *src1p++ & *src2p++; +} + + +static bool +abitset_and_cmp (bitset dst, bitset src1, bitset src2) +{ + bitset_windex i; + bool changed = false; + bitset_word *src1p = ABITSET_WORDS (src1); + bitset_word *src2p = ABITSET_WORDS (src2); + bitset_word *dstp = ABITSET_WORDS (dst); + bitset_windex size = dst->b.csize; + + for (i = 0; i < size; i++, dstp++) + { + bitset_word tmp = *src1p++ & *src2p++; + + if (*dstp != tmp) + { + changed = true; + *dstp = tmp; + } + } + return changed; +} + + +static void +abitset_andn (bitset dst, bitset src1, bitset src2) +{ + bitset_windex i; + bitset_word *src1p = ABITSET_WORDS (src1); + bitset_word *src2p = ABITSET_WORDS (src2); + bitset_word *dstp = ABITSET_WORDS (dst); + bitset_windex size = dst->b.csize; + + for (i = 0; i < size; i++) + *dstp++ = *src1p++ & ~(*src2p++); +} + + +static bool +abitset_andn_cmp (bitset dst, bitset src1, bitset src2) +{ + bitset_windex i; + bool changed = false; + bitset_word *src1p = ABITSET_WORDS (src1); + bitset_word *src2p = ABITSET_WORDS (src2); + bitset_word *dstp = ABITSET_WORDS (dst); + bitset_windex size = dst->b.csize; + + for (i = 0; i < size; i++, dstp++) + { + bitset_word tmp = *src1p++ & ~(*src2p++); + + if (*dstp != tmp) + { + changed = true; + *dstp = tmp; + } + } + return changed; +} + + +static void +abitset_or (bitset dst, bitset src1, bitset src2) +{ + bitset_windex i; + bitset_word *src1p = ABITSET_WORDS (src1); + bitset_word *src2p = ABITSET_WORDS (src2); + bitset_word *dstp = ABITSET_WORDS (dst); + bitset_windex size = dst->b.csize; + + for (i = 0; i < size; i++) + *dstp++ = *src1p++ | *src2p++; +} + + +static bool +abitset_or_cmp (bitset dst, bitset src1, bitset src2) +{ + bitset_windex i; + bool changed = false; + bitset_word *src1p = ABITSET_WORDS (src1); + bitset_word *src2p = ABITSET_WORDS (src2); + bitset_word *dstp = ABITSET_WORDS (dst); + bitset_windex size = dst->b.csize; + + for (i = 0; i < size; i++, dstp++) + { + bitset_word tmp = *src1p++ | *src2p++; + + if (*dstp != tmp) + { + changed = true; + *dstp = tmp; + } + } + return changed; +} + + +static void +abitset_xor (bitset dst, bitset src1, bitset src2) +{ + bitset_windex i; + bitset_word *src1p = ABITSET_WORDS (src1); + bitset_word *src2p = ABITSET_WORDS (src2); + bitset_word *dstp = ABITSET_WORDS (dst); + bitset_windex size = dst->b.csize; + + for (i = 0; i < size; i++) + *dstp++ = *src1p++ ^ *src2p++; +} + + +static bool +abitset_xor_cmp (bitset dst, bitset src1, bitset src2) +{ + bitset_windex i; + bool changed = false; + bitset_word *src1p = ABITSET_WORDS (src1); + bitset_word *src2p = ABITSET_WORDS (src2); + bitset_word *dstp = ABITSET_WORDS (dst); + bitset_windex size = dst->b.csize; + + for (i = 0; i < size; i++, dstp++) + { + bitset_word tmp = *src1p++ ^ *src2p++; + + if (*dstp != tmp) + { + changed = true; + *dstp = tmp; + } + } + return changed; +} + + +static void +abitset_and_or (bitset dst, bitset src1, bitset src2, bitset src3) +{ + bitset_windex i; + bitset_word *src1p = ABITSET_WORDS (src1); + bitset_word *src2p = ABITSET_WORDS (src2); + bitset_word *src3p = ABITSET_WORDS (src3); + bitset_word *dstp = ABITSET_WORDS (dst); + bitset_windex size = dst->b.csize; + + for (i = 0; i < size; i++) + *dstp++ = (*src1p++ & *src2p++) | *src3p++; +} + + +static bool +abitset_and_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3) +{ + bitset_windex i; + bool changed = false; + bitset_word *src1p = ABITSET_WORDS (src1); + bitset_word *src2p = ABITSET_WORDS (src2); + bitset_word *src3p = ABITSET_WORDS (src3); + bitset_word *dstp = ABITSET_WORDS (dst); + bitset_windex size = dst->b.csize; + + for (i = 0; i < size; i++, dstp++) + { + bitset_word tmp = (*src1p++ & *src2p++) | *src3p++; + + if (*dstp != tmp) + { + changed = true; + *dstp = tmp; + } + } + return changed; +} + + +static void +abitset_andn_or (bitset dst, bitset src1, bitset src2, bitset src3) +{ + bitset_windex i; + bitset_word *src1p = ABITSET_WORDS (src1); + bitset_word *src2p = ABITSET_WORDS (src2); + bitset_word *src3p = ABITSET_WORDS (src3); + bitset_word *dstp = ABITSET_WORDS (dst); + bitset_windex size = dst->b.csize; + + for (i = 0; i < size; i++) + *dstp++ = (*src1p++ & ~(*src2p++)) | *src3p++; +} + + +static bool +abitset_andn_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3) +{ + bitset_windex i; + bool changed = false; + bitset_word *src1p = ABITSET_WORDS (src1); + bitset_word *src2p = ABITSET_WORDS (src2); + bitset_word *src3p = ABITSET_WORDS (src3); + bitset_word *dstp = ABITSET_WORDS (dst); + bitset_windex size = dst->b.csize; + + for (i = 0; i < size; i++, dstp++) + { + bitset_word tmp = (*src1p++ & ~(*src2p++)) | *src3p++; + + if (*dstp != tmp) + { + changed = true; + *dstp = tmp; + } + } + return changed; +} + + +static void +abitset_or_and (bitset dst, bitset src1, bitset src2, bitset src3) +{ + bitset_windex i; + bitset_word *src1p = ABITSET_WORDS (src1); + bitset_word *src2p = ABITSET_WORDS (src2); + bitset_word *src3p = ABITSET_WORDS (src3); + bitset_word *dstp = ABITSET_WORDS (dst); + bitset_windex size = dst->b.csize; + + for (i = 0; i < size; i++) + *dstp++ = (*src1p++ | *src2p++) & *src3p++; +} + + +static bool +abitset_or_and_cmp (bitset dst, bitset src1, bitset src2, bitset src3) +{ + bitset_windex i; + bool changed = false; + bitset_word *src1p = ABITSET_WORDS (src1); + bitset_word *src2p = ABITSET_WORDS (src2); + bitset_word *src3p = ABITSET_WORDS (src3); + bitset_word *dstp = ABITSET_WORDS (dst); + bitset_windex size = dst->b.csize; + + for (i = 0; i < size; i++, dstp++) + { + bitset_word tmp = (*src1p++ | *src2p++) & *src3p++; + + if (*dstp != tmp) + { + changed = true; + *dstp = tmp; + } + } + return changed; +} + + +static void +abitset_copy (bitset dst, bitset src) +{ + if (BITSET_COMPATIBLE_ (dst, src)) + abitset_copy1 (dst, src); + else + bitset_copy_ (dst, src); +} + + +/* Vector of operations for single word bitsets. */ +struct bitset_vtable abitset_small_vtable = { + abitset_set, + abitset_reset, + bitset_toggle_, + abitset_test, + abitset_resize, + bitset_size_, + bitset_count_, + abitset_empty_p, + abitset_ones, + abitset_zero, + abitset_copy, + abitset_disjoint_p, + abitset_equal_p, + abitset_not, + abitset_subset_p, + abitset_and, + abitset_and_cmp, + abitset_andn, + abitset_andn_cmp, + abitset_or, + abitset_or_cmp, + abitset_xor, + abitset_xor_cmp, + abitset_and_or, + abitset_and_or_cmp, + abitset_andn_or, + abitset_andn_or_cmp, + abitset_or_and, + abitset_or_and_cmp, + abitset_small_list, + abitset_list_reverse, + NULL, + BITSET_ARRAY +}; + + +/* Vector of operations for multiple word bitsets. */ +struct bitset_vtable abitset_vtable = { + abitset_set, + abitset_reset, + bitset_toggle_, + abitset_test, + abitset_resize, + bitset_size_, + bitset_count_, + abitset_empty_p, + abitset_ones, + abitset_zero, + abitset_copy, + abitset_disjoint_p, + abitset_equal_p, + abitset_not, + abitset_subset_p, + abitset_and, + abitset_and_cmp, + abitset_andn, + abitset_andn_cmp, + abitset_or, + abitset_or_cmp, + abitset_xor, + abitset_xor_cmp, + abitset_and_or, + abitset_and_or_cmp, + abitset_andn_or, + abitset_andn_or_cmp, + abitset_or_and, + abitset_or_and_cmp, + abitset_list, + abitset_list_reverse, + NULL, + BITSET_ARRAY +}; + + +size_t +abitset_bytes (bitset_bindex n_bits) +{ + bitset_windex size; + size_t bytes; + size_t header_size = offsetof (union bitset_union, a.words); + struct bitset_align_struct { char a; union bitset_union b; }; + size_t bitset_alignment = offsetof (struct bitset_align_struct, b); + + size = ABITSET_N_WORDS (n_bits); + bytes = header_size + size * sizeof (bitset_word); + + /* Align the size properly for a vector of abitset objects. */ + if (header_size % bitset_alignment != 0 + || sizeof (bitset_word) % bitset_alignment != 0) + { + bytes += bitset_alignment - 1; + bytes -= bytes % bitset_alignment; + } + + return bytes; +} + + +bitset +abitset_init (bitset bset, bitset_bindex n_bits) +{ + bitset_windex size; + + size = ABITSET_N_WORDS (n_bits); + BITSET_NBITS_ (bset) = n_bits; + + /* Use optimized routines if bitset fits within a single word. + There is probably little merit if using caching since + the small bitset will always fit in the cache. */ + if (size == 1) + bset->b.vtable = &abitset_small_vtable; + else + bset->b.vtable = &abitset_vtable; + + bset->b.cindex = 0; + bset->b.csize = size; + bset->b.cdata = ABITSET_WORDS (bset); + return bset; +} diff --git a/src/apps/bin/bison/lib/abitset.h b/src/apps/bin/bison/lib/abitset.h new file mode 100644 index 0000000000..728891106d --- /dev/null +++ b/src/apps/bin/bison/lib/abitset.h @@ -0,0 +1,28 @@ +/* Functions to support abitsets. + Copyright (C) 2002, 2004 Free Software Foundation, Inc. + Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _ABITSET_H +#define _ABITSET_H + +#include "bitset.h" + +extern size_t abitset_bytes (bitset_bindex); + +extern bitset abitset_init (bitset, bitset_bindex); + +#endif diff --git a/src/apps/bin/bison/lib/alloca.c b/src/apps/bin/bison/lib/alloca.c new file mode 100644 index 0000000000..d1d54475bb --- /dev/null +++ b/src/apps/bin/bison/lib/alloca.c @@ -0,0 +1,491 @@ +/* alloca.c -- allocate automatically reclaimed memory + (Mostly) portable public-domain implementation -- D A Gwyn + + This implementation of the PWB library alloca function, + which is used to allocate space off the run-time stack so + that it is automatically reclaimed upon procedure exit, + was inspired by discussions with J. Q. Johnson of Cornell. + J.Otto Tennant contributed the Cray support. + + There are some preprocessor constants that can + be defined when compiling for your specific system, for + improved efficiency; however, the defaults should be okay. + + The general concept of this implementation is to keep + track of all alloca-allocated blocks, and reclaim any + that are found to be deeper in the stack than the current + invocation. This heuristic does not reclaim storage as + soon as it becomes invalid, but it will do so eventually. + + As a special case, alloca(0) reclaims storage without + allocating any. It is a good idea to use alloca(0) in + your main control loop, etc. to force garbage collection. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#include +#include + +#ifdef emacs +# include "lisp.h" +# include "blockinput.h" +# ifdef EMACS_FREE +# undef free +# define free EMACS_FREE +# endif +#else +# define memory_full() abort () +#endif + +/* If compiling with GCC 2, this file's not needed. */ +#if !defined (__GNUC__) || __GNUC__ < 2 + +/* If someone has defined alloca as a macro, + there must be some other way alloca is supposed to work. */ +# ifndef alloca + +# ifdef emacs +# ifdef static +/* actually, only want this if static is defined as "" + -- this is for usg, in which emacs must undefine static + in order to make unexec workable + */ +# ifndef STACK_DIRECTION +you +lose +-- must know STACK_DIRECTION at compile-time +/* Using #error here is not wise since this file should work for + old and obscure compilers. */ +# endif /* STACK_DIRECTION undefined */ +# endif /* static */ +# endif /* emacs */ + +/* If your stack is a linked list of frames, you have to + provide an "address metric" ADDRESS_FUNCTION macro. */ + +# if defined (CRAY) && defined (CRAY_STACKSEG_END) +long i00afunc (); +# define ADDRESS_FUNCTION(arg) (char *) i00afunc (&(arg)) +# else +# define ADDRESS_FUNCTION(arg) &(arg) +# endif + +/* Define STACK_DIRECTION if you know the direction of stack + growth for your system; otherwise it will be automatically + deduced at run-time. + + STACK_DIRECTION > 0 => grows toward higher addresses + STACK_DIRECTION < 0 => grows toward lower addresses + STACK_DIRECTION = 0 => direction of growth unknown */ + +# ifndef STACK_DIRECTION +# define STACK_DIRECTION 0 /* Direction unknown. */ +# endif + +# if STACK_DIRECTION != 0 + +# define STACK_DIR STACK_DIRECTION /* Known at compile-time. */ + +# else /* STACK_DIRECTION == 0; need run-time code. */ + +static int stack_dir; /* 1 or -1 once known. */ +# define STACK_DIR stack_dir + +static void +find_stack_direction (void) +{ + static char *addr = NULL; /* Address of first `dummy', once known. */ + auto char dummy; /* To get stack address. */ + + if (addr == NULL) + { /* Initial entry. */ + addr = ADDRESS_FUNCTION (dummy); + + find_stack_direction (); /* Recurse once. */ + } + else + { + /* Second entry. */ + if (ADDRESS_FUNCTION (dummy) > addr) + stack_dir = 1; /* Stack grew upward. */ + else + stack_dir = -1; /* Stack grew downward. */ + } +} + +# endif /* STACK_DIRECTION == 0 */ + +/* An "alloca header" is used to: + (a) chain together all alloca'ed blocks; + (b) keep track of stack depth. + + It is very important that sizeof(header) agree with malloc + alignment chunk size. The following default should work okay. */ + +# ifndef ALIGN_SIZE +# define ALIGN_SIZE sizeof(double) +# endif + +typedef union hdr +{ + char align[ALIGN_SIZE]; /* To force sizeof(header). */ + struct + { + union hdr *next; /* For chaining headers. */ + char *deep; /* For stack depth measure. */ + } h; +} header; + +static header *last_alloca_header = NULL; /* -> last alloca header. */ + +/* Return a pointer to at least SIZE bytes of storage, + which will be automatically reclaimed upon exit from + the procedure that called alloca. Originally, this space + was supposed to be taken from the current stack frame of the + caller, but that method cannot be made to work for some + implementations of C, for example under Gould's UTX/32. */ + +void * +alloca (size_t size) +{ + auto char probe; /* Probes stack depth: */ + register char *depth = ADDRESS_FUNCTION (probe); + +# if STACK_DIRECTION == 0 + if (STACK_DIR == 0) /* Unknown growth direction. */ + find_stack_direction (); +# endif + + /* Reclaim garbage, defined as all alloca'd storage that + was allocated from deeper in the stack than currently. */ + + { + register header *hp; /* Traverses linked list. */ + +# ifdef emacs + BLOCK_INPUT; +# endif + + for (hp = last_alloca_header; hp != NULL;) + if ((STACK_DIR > 0 && hp->h.deep > depth) + || (STACK_DIR < 0 && hp->h.deep < depth)) + { + register header *np = hp->h.next; + + free (hp); /* Collect garbage. */ + + hp = np; /* -> next header. */ + } + else + break; /* Rest are not deeper. */ + + last_alloca_header = hp; /* -> last valid storage. */ + +# ifdef emacs + UNBLOCK_INPUT; +# endif + } + + if (size == 0) + return NULL; /* No allocation required. */ + + /* Allocate combined header + user data storage. */ + + { + /* Address of header. */ + register header *new; + + size_t combined_size = sizeof (header) + size; + if (combined_size < sizeof (header)) + memory_full (); + + new = malloc (combined_size); + + if (! new) + memory_full (); + + new->h.next = last_alloca_header; + new->h.deep = depth; + + last_alloca_header = new; + + /* User storage begins just after header. */ + + return (void *) (new + 1); + } +} + +# if defined (CRAY) && defined (CRAY_STACKSEG_END) + +# ifdef DEBUG_I00AFUNC +# include +# endif + +# ifndef CRAY_STACK +# define CRAY_STACK +# ifndef CRAY2 +/* Stack structures for CRAY-1, CRAY X-MP, and CRAY Y-MP */ +struct stack_control_header + { + long shgrow:32; /* Number of times stack has grown. */ + long shaseg:32; /* Size of increments to stack. */ + long shhwm:32; /* High water mark of stack. */ + long shsize:32; /* Current size of stack (all segments). */ + }; + +/* The stack segment linkage control information occurs at + the high-address end of a stack segment. (The stack + grows from low addresses to high addresses.) The initial + part of the stack segment linkage control information is + 0200 (octal) words. This provides for register storage + for the routine which overflows the stack. */ + +struct stack_segment_linkage + { + long ss[0200]; /* 0200 overflow words. */ + long sssize:32; /* Number of words in this segment. */ + long ssbase:32; /* Offset to stack base. */ + long:32; + long sspseg:32; /* Offset to linkage control of previous + segment of stack. */ + long:32; + long sstcpt:32; /* Pointer to task common address block. */ + long sscsnm; /* Private control structure number for + microtasking. */ + long ssusr1; /* Reserved for user. */ + long ssusr2; /* Reserved for user. */ + long sstpid; /* Process ID for pid based multi-tasking. */ + long ssgvup; /* Pointer to multitasking thread giveup. */ + long sscray[7]; /* Reserved for Cray Research. */ + long ssa0; + long ssa1; + long ssa2; + long ssa3; + long ssa4; + long ssa5; + long ssa6; + long ssa7; + long sss0; + long sss1; + long sss2; + long sss3; + long sss4; + long sss5; + long sss6; + long sss7; + }; + +# else /* CRAY2 */ +/* The following structure defines the vector of words + returned by the STKSTAT library routine. */ +struct stk_stat + { + long now; /* Current total stack size. */ + long maxc; /* Amount of contiguous space which would + be required to satisfy the maximum + stack demand to date. */ + long high_water; /* Stack high-water mark. */ + long overflows; /* Number of stack overflow ($STKOFEN) calls. */ + long hits; /* Number of internal buffer hits. */ + long extends; /* Number of block extensions. */ + long stko_mallocs; /* Block allocations by $STKOFEN. */ + long underflows; /* Number of stack underflow calls ($STKRETN). */ + long stko_free; /* Number of deallocations by $STKRETN. */ + long stkm_free; /* Number of deallocations by $STKMRET. */ + long segments; /* Current number of stack segments. */ + long maxs; /* Maximum number of stack segments so far. */ + long pad_size; /* Stack pad size. */ + long current_address; /* Current stack segment address. */ + long current_size; /* Current stack segment size. This + number is actually corrupted by STKSTAT to + include the fifteen word trailer area. */ + long initial_address; /* Address of initial segment. */ + long initial_size; /* Size of initial segment. */ + }; + +/* The following structure describes the data structure which trails + any stack segment. I think that the description in 'asdef' is + out of date. I only describe the parts that I am sure about. */ + +struct stk_trailer + { + long this_address; /* Address of this block. */ + long this_size; /* Size of this block (does not include + this trailer). */ + long unknown2; + long unknown3; + long link; /* Address of trailer block of previous + segment. */ + long unknown5; + long unknown6; + long unknown7; + long unknown8; + long unknown9; + long unknown10; + long unknown11; + long unknown12; + long unknown13; + long unknown14; + }; + +# endif /* CRAY2 */ +# endif /* not CRAY_STACK */ + +# ifdef CRAY2 +/* Determine a "stack measure" for an arbitrary ADDRESS. + I doubt that "lint" will like this much. */ + +static long +i00afunc (long *address) +{ + struct stk_stat status; + struct stk_trailer *trailer; + long *block, size; + long result = 0; + + /* We want to iterate through all of the segments. The first + step is to get the stack status structure. We could do this + more quickly and more directly, perhaps, by referencing the + $LM00 common block, but I know that this works. */ + + STKSTAT (&status); + + /* Set up the iteration. */ + + trailer = (struct stk_trailer *) (status.current_address + + status.current_size + - 15); + + /* There must be at least one stack segment. Therefore it is + a fatal error if "trailer" is null. */ + + if (trailer == 0) + abort (); + + /* Discard segments that do not contain our argument address. */ + + while (trailer != 0) + { + block = (long *) trailer->this_address; + size = trailer->this_size; + if (block == 0 || size == 0) + abort (); + trailer = (struct stk_trailer *) trailer->link; + if ((block <= address) && (address < (block + size))) + break; + } + + /* Set the result to the offset in this segment and add the sizes + of all predecessor segments. */ + + result = address - block; + + if (trailer == 0) + { + return result; + } + + do + { + if (trailer->this_size <= 0) + abort (); + result += trailer->this_size; + trailer = (struct stk_trailer *) trailer->link; + } + while (trailer != 0); + + /* We are done. Note that if you present a bogus address (one + not in any segment), you will get a different number back, formed + from subtracting the address of the first block. This is probably + not what you want. */ + + return (result); +} + +# else /* not CRAY2 */ +/* Stack address function for a CRAY-1, CRAY X-MP, or CRAY Y-MP. + Determine the number of the cell within the stack, + given the address of the cell. The purpose of this + routine is to linearize, in some sense, stack addresses + for alloca. */ + +static long +i00afunc (long address) +{ + long stkl = 0; + + long size, pseg, this_segment, stack; + long result = 0; + + struct stack_segment_linkage *ssptr; + + /* Register B67 contains the address of the end of the + current stack segment. If you (as a subprogram) store + your registers on the stack and find that you are past + the contents of B67, you have overflowed the segment. + + B67 also points to the stack segment linkage control + area, which is what we are really interested in. */ + + stkl = CRAY_STACKSEG_END (); + ssptr = (struct stack_segment_linkage *) stkl; + + /* If one subtracts 'size' from the end of the segment, + one has the address of the first word of the segment. + + If this is not the first segment, 'pseg' will be + nonzero. */ + + pseg = ssptr->sspseg; + size = ssptr->sssize; + + this_segment = stkl - size; + + /* It is possible that calling this routine itself caused + a stack overflow. Discard stack segments which do not + contain the target address. */ + + while (!(this_segment <= address && address <= stkl)) + { +# ifdef DEBUG_I00AFUNC + fprintf (stderr, "%011o %011o %011o\n", this_segment, address, stkl); +# endif + if (pseg == 0) + break; + stkl = stkl - pseg; + ssptr = (struct stack_segment_linkage *) stkl; + size = ssptr->sssize; + pseg = ssptr->sspseg; + this_segment = stkl - size; + } + + result = address - this_segment; + + /* If you subtract pseg from the current end of the stack, + you get the address of the previous stack segment's end. + This seems a little convoluted to me, but I'll bet you save + a cycle somewhere. */ + + while (pseg != 0) + { +# ifdef DEBUG_I00AFUNC + fprintf (stderr, "%011o %011o\n", pseg, size); +# endif + stkl = stkl - pseg; + ssptr = (struct stack_segment_linkage *) stkl; + size = ssptr->sssize; + pseg = ssptr->sspseg; + result += size; + } + return (result); +} + +# endif /* not CRAY2 */ +# endif /* CRAY */ + +# endif /* no alloca */ +#endif /* not GCC version 2 */ diff --git a/src/apps/bin/bison/lib/alloca_.h b/src/apps/bin/bison/lib/alloca_.h new file mode 100644 index 0000000000..8a91698c54 --- /dev/null +++ b/src/apps/bin/bison/lib/alloca_.h @@ -0,0 +1,54 @@ +/* Memory allocation on the stack. + + Copyright (C) 1995, 1999, 2001, 2002, 2003, 2004 Free Software + Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published + by the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public + License along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* When this file is included, it may be preceded only by preprocessor + declarations. Thanks to AIX. Therefore we include it right after + "config.h", not later. */ + +#ifndef _ALLOCA_H +# define _ALLOCA_H + +/* alloca (N) returns a pointer to N bytes of memory + allocated on the stack, which will last until the function returns. + Use of alloca should be avoided: + - inside arguments of function calls - undefined behaviour, + - in inline functions - the allocation may actually last until the + calling function returns, + - for huge N (say, N >= 65536) - you never know how large (or small) + the stack is, and when the stack cannot fulfill the memory allocation + request, the program just crashes. + */ + +#ifdef __GNUC__ +# define alloca __builtin_alloca +#elif defined _AIX +# define alloca __alloca +#elif defined _MSC_VER +# include +# define alloca _alloca +#else +# include +# ifdef __cplusplus +extern "C" +# endif +void *alloca (size_t); +#endif + +#endif /* _ALLOCA_H */ diff --git a/src/apps/bin/bison/lib/argmatch.c b/src/apps/bin/bison/lib/argmatch.c new file mode 100644 index 0000000000..210689ba3f --- /dev/null +++ b/src/apps/bin/bison/lib/argmatch.c @@ -0,0 +1,277 @@ +/* argmatch.c -- find a match for a string in an array + + Copyright (C) 1990, 1998, 1999, 2001, 2002, 2003, 2004 Free + Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by David MacKenzie + Modified by Akim Demaille */ + +#if HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include "argmatch.h" + +#include +#include +#include + +#include "gettext.h" +#define _(msgid) gettext (msgid) + +#include "error.h" +#include "exit.h" +#include "quotearg.h" +#include "quote.h" +#include "unlocked-io.h" + +/* When reporting an invalid argument, show nonprinting characters + by using the quoting style ARGMATCH_QUOTING_STYLE. Do not use + literal_quoting_style. */ +#ifndef ARGMATCH_QUOTING_STYLE +# define ARGMATCH_QUOTING_STYLE locale_quoting_style +#endif + +/* Non failing version of argmatch call this function after failing. */ +#ifndef ARGMATCH_DIE +# include "exitfail.h" +# define ARGMATCH_DIE exit (exit_failure) +#endif + +#ifdef ARGMATCH_DIE_DECL +ARGMATCH_DIE_DECL; +#endif + +static void +__argmatch_die (void) +{ + ARGMATCH_DIE; +} + +/* Used by XARGMATCH and XARGCASEMATCH. See description in argmatch.h. + Default to __argmatch_die, but allow caller to change this at run-time. */ +argmatch_exit_fn argmatch_die = __argmatch_die; + + +/* If ARG is an unambiguous match for an element of the + null-terminated array ARGLIST, return the index in ARGLIST + of the matched element, else -1 if it does not match any element + or -2 if it is ambiguous (is a prefix of more than one element). + + If VALLIST is none null, use it to resolve ambiguities limited to + synonyms, i.e., for + "yes", "yop" -> 0 + "no", "nope" -> 1 + "y" is a valid argument, for `0', and "n" for `1'. */ + +int +argmatch (const char *arg, const char *const *arglist, + const char *vallist, size_t valsize) +{ + int i; /* Temporary index in ARGLIST. */ + size_t arglen; /* Length of ARG. */ + int matchind = -1; /* Index of first nonexact match. */ + int ambiguous = 0; /* If nonzero, multiple nonexact match(es). */ + + arglen = strlen (arg); + + /* Test all elements for either exact match or abbreviated matches. */ + for (i = 0; arglist[i]; i++) + { + if (!strncmp (arglist[i], arg, arglen)) + { + if (strlen (arglist[i]) == arglen) + /* Exact match found. */ + return i; + else if (matchind == -1) + /* First nonexact match found. */ + matchind = i; + else + { + /* Second nonexact match found. */ + if (vallist == NULL + || memcmp (vallist + valsize * matchind, + vallist + valsize * i, valsize)) + { + /* There is a real ambiguity, or we could not + disambiguate. */ + ambiguous = 1; + } + } + } + } + if (ambiguous) + return -2; + else + return matchind; +} + +/* Error reporting for argmatch. + CONTEXT is a description of the type of entity that was being matched. + VALUE is the invalid value that was given. + PROBLEM is the return value from argmatch. */ + +void +argmatch_invalid (const char *context, const char *value, int problem) +{ + char const *format = (problem == -1 + ? _("invalid argument %s for %s") + : _("ambiguous argument %s for %s")); + + error (0, 0, format, quotearg_n_style (0, ARGMATCH_QUOTING_STYLE, value), + quote_n (1, context)); +} + +/* List the valid arguments for argmatch. + ARGLIST is the same as in argmatch. + VALLIST is a pointer to an array of values. + VALSIZE is the size of the elements of VALLIST */ +void +argmatch_valid (const char *const *arglist, + const char *vallist, size_t valsize) +{ + int i; + const char *last_val = NULL; + + /* We try to put synonyms on the same line. The assumption is that + synonyms follow each other */ + fprintf (stderr, _("Valid arguments are:")); + for (i = 0; arglist[i]; i++) + if ((i == 0) + || memcmp (last_val, vallist + valsize * i, valsize)) + { + fprintf (stderr, "\n - `%s'", arglist[i]); + last_val = vallist + valsize * i; + } + else + { + fprintf (stderr, ", `%s'", arglist[i]); + } + putc ('\n', stderr); +} + +/* Never failing versions of the previous functions. + + CONTEXT is the context for which argmatch is called (e.g., + "--version-control", or "$VERSION_CONTROL" etc.). Upon failure, + calls the (supposed never to return) function EXIT_FN. */ + +int +__xargmatch_internal (const char *context, + const char *arg, const char *const *arglist, + const char *vallist, size_t valsize, + argmatch_exit_fn exit_fn) +{ + int res = argmatch (arg, arglist, vallist, valsize); + if (res >= 0) + /* Success. */ + return res; + + /* We failed. Explain why. */ + argmatch_invalid (context, arg, res); + argmatch_valid (arglist, vallist, valsize); + (*exit_fn) (); + + return -1; /* To please the compilers. */ +} + +/* Look for VALUE in VALLIST, an array of objects of size VALSIZE and + return the first corresponding argument in ARGLIST */ +const char * +argmatch_to_argument (const char *value, + const char *const *arglist, + const char *vallist, size_t valsize) +{ + int i; + + for (i = 0; arglist[i]; i++) + if (!memcmp (value, vallist + valsize * i, valsize)) + return arglist[i]; + return NULL; +} + +#ifdef TEST +/* + * Based on "getversion.c" by David MacKenzie + */ +char *program_name; + +/* When to make backup files. */ +enum backup_type +{ + /* Never make backups. */ + none, + + /* Make simple backups of every file. */ + simple, + + /* Make numbered backups of files that already have numbered backups, + and simple backups of the others. */ + numbered_existing, + + /* Make numbered backups of every file. */ + numbered +}; + +/* Two tables describing arguments (keys) and their corresponding + values */ +static const char *const backup_args[] = +{ + "no", "none", "off", + "simple", "never", + "existing", "nil", + "numbered", "t", + 0 +}; + +static const enum backup_type backup_vals[] = +{ + none, none, none, + simple, simple, + numbered_existing, numbered_existing, + numbered, numbered +}; + +int +main (int argc, const char *const *argv) +{ + const char *cp; + enum backup_type backup_type = none; + + program_name = (char *) argv[0]; + + if (argc > 2) + { + fprintf (stderr, "Usage: %s [VERSION_CONTROL]\n", program_name); + exit (1); + } + + if ((cp = getenv ("VERSION_CONTROL"))) + backup_type = XARGMATCH ("$VERSION_CONTROL", cp, + backup_args, backup_vals); + + if (argc == 2) + backup_type = XARGMATCH (program_name, argv[1], + backup_args, backup_vals); + + printf ("The version control is `%s'\n", + ARGMATCH_TO_ARGUMENT (backup_type, backup_args, backup_vals)); + + return 0; +} +#endif diff --git a/src/apps/bin/bison/lib/argmatch.h b/src/apps/bin/bison/lib/argmatch.h new file mode 100644 index 0000000000..e8bb23c667 --- /dev/null +++ b/src/apps/bin/bison/lib/argmatch.h @@ -0,0 +1,111 @@ +/* argmatch.h -- definitions and prototypes for argmatch.c + + Copyright (C) 1990, 1998, 1999, 2001, 2002, 2004 Free Software + Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by David MacKenzie + Modified by Akim Demaille */ + +#ifndef ARGMATCH_H_ +# define ARGMATCH_H_ 1 + +# include + +# define ARRAY_CARDINALITY(Array) (sizeof (Array) / sizeof *(Array)) + +# define ARGMATCH_CONSTRAINT(Arglist, Vallist) \ + (ARRAY_CARDINALITY (Arglist) == ARRAY_CARDINALITY (Vallist) + 1) + +/* Assert there are as many real arguments as there are values + (argument list ends with a NULL guard). ARGMATCH_VERIFY is + preferred, since it is guaranteed to be checked at compile-time. + ARGMATCH_ASSERT is for backward compatibility only. */ + +# define ARGMATCH_VERIFY(Arglist, Vallist) \ + struct argmatch_verify \ + { \ + char argmatch_verify[ARGMATCH_CONSTRAINT(Arglist, Vallist) ? 1 : -1]; \ + } + +# define ARGMATCH_ASSERT(Arglist, Vallist) \ + assert (ARGMATCH_CONSTRAINT (Arglist, Vallist)) + +/* Return the index of the element of ARGLIST (NULL terminated) that + matches with ARG. If VALLIST is not NULL, then use it to resolve + false ambiguities (i.e., different matches of ARG but corresponding + to the same values in VALLIST). */ + +int argmatch (char const *arg, char const *const *arglist, + char const *vallist, size_t valsize); + +# define ARGMATCH(Arg, Arglist, Vallist) \ + argmatch (Arg, Arglist, (char const *) (Vallist), sizeof *(Vallist)) + +/* xargmatch calls this function when it fails. This function should not + return. By default, this is a function that calls ARGMATCH_DIE which + in turn defaults to `exit (exit_failure)'. */ +typedef void (*argmatch_exit_fn) (void); +extern argmatch_exit_fn argmatch_die; + +/* Report on stderr why argmatch failed. Report correct values. */ + +void argmatch_invalid (char const *context, char const *value, int problem); + +/* Left for compatibility with the old name invalid_arg */ + +# define invalid_arg(Context, Value, Problem) \ + argmatch_invalid (Context, Value, Problem) + + + +/* Report on stderr the list of possible arguments. */ + +void argmatch_valid (char const *const *arglist, + char const *vallist, size_t valsize); + +# define ARGMATCH_VALID(Arglist, Vallist) \ + argmatch_valid (Arglist, (char const *) (Vallist), sizeof *(Vallist)) + + + +/* Same as argmatch, but upon failure, reports a explanation on the + failure, and exits using the function EXIT_FN. */ + +int __xargmatch_internal (char const *context, + char const *arg, char const *const *arglist, + char const *vallist, size_t valsize, + argmatch_exit_fn exit_fn); + +/* Programmer friendly interface to __xargmatch_internal. */ + +# define XARGMATCH(Context, Arg, Arglist, Vallist) \ + ((Vallist) [__xargmatch_internal (Context, Arg, Arglist, \ + (char const *) (Vallist), \ + sizeof *(Vallist), \ + argmatch_die)]) + +/* Convert a value into a corresponding argument. */ + +char const *argmatch_to_argument (char const *value, + char const *const *arglist, + char const *vallist, size_t valsize); + +# define ARGMATCH_TO_ARGUMENT(Value, Arglist, Vallist) \ + argmatch_to_argument (Value, Arglist, \ + (char const *) (Vallist), sizeof *(Vallist)) + +#endif /* ARGMATCH_H_ */ diff --git a/src/apps/bin/bison/lib/basename.c b/src/apps/bin/bison/lib/basename.c new file mode 100644 index 0000000000..5ff2989330 --- /dev/null +++ b/src/apps/bin/bison/lib/basename.c @@ -0,0 +1,79 @@ +/* basename.c -- return the last element in a path + + Copyright (C) 1990, 1998, 1999, 2000, 2001, 2003 Free Software + Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +# include +#endif + +#include "dirname.h" +#include + +/* In general, we can't use the builtin `basename' function if available, + since it has different meanings in different environments. + In some environments the builtin `basename' modifies its argument. + + Return the address of the last file name component of NAME. If + NAME has no file name components because it is all slashes, return + NAME if it is empty, the address of its last slash otherwise. */ + +char * +base_name (char const *name) +{ + char const *base = name + FILESYSTEM_PREFIX_LEN (name); + char const *p; + + for (p = base; *p; p++) + { + if (ISSLASH (*p)) + { + /* Treat multiple adjacent slashes like a single slash. */ + do p++; + while (ISSLASH (*p)); + + /* If the file name ends in slash, use the trailing slash as + the basename if no non-slashes have been found. */ + if (! *p) + { + if (ISSLASH (*base)) + base = p - 1; + break; + } + + /* *P is a non-slash preceded by a slash. */ + base = p; + } + } + + return (char *) base; +} + +/* Return the length of of the basename NAME. Typically NAME is the + value returned by base_name. Act like strlen (NAME), except omit + redundant trailing slashes. */ + +size_t +base_len (char const *name) +{ + size_t len; + + for (len = strlen (name); 1 < len && ISSLASH (name[len - 1]); len--) + continue; + + return len; +} diff --git a/src/apps/bin/bison/lib/bbitset.h b/src/apps/bin/bison/lib/bbitset.h new file mode 100644 index 0000000000..4a9367452f --- /dev/null +++ b/src/apps/bin/bison/lib/bbitset.h @@ -0,0 +1,302 @@ +/* Base bitset stuff. + Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _BBITSET_H +#define _BBITSET_H + +#include "libiberty.h" + +#include +#include +#include + +/* Currently we support five flavours of bitsets: + BITSET_ARRAY: Array of bits (fixed size, fast for dense bitsets). + Memory for bit array and bitset structure allocated + contiguously. + BITSET_LIST: Linked list of arrays of bits (variable size, least storage + for large very sparse sets). + BITSET_TABLE: Expandable table of pointers to arrays of bits + (variable size, less storage for large sparse sets). + Faster than BITSET_LIST for random access. + BITSET_VARRAY: Variable array of bits (variable size, fast for + dense bitsets). + BITSET_STATS: Wrapper bitset for internal use only. Used for gathering + statistics and/or better run-time checking. +*/ +enum bitset_type {BITSET_ARRAY, BITSET_LIST, BITSET_TABLE, BITSET_VARRAY, + BITSET_TYPE_NUM, BITSET_STATS}; +#define BITSET_TYPE_NAMES {"abitset", "lbitset", "ebitset", "vbitset"} + +extern const char * const bitset_type_names[]; + +enum bitset_alloc_type {BITSET_MALLOC, BITSET_OBALLOC}; + +/* Data type used to store a word of bits. */ +typedef unsigned long int bitset_word; +#define BITSET_WORD_BITS ((unsigned int) (CHAR_BIT * sizeof (bitset_word))) + +/* Bit index. In theory we might need a type wider than size_t, but + in practice we lose at most a factor of CHAR_BIT by going with + size_t, and that is good enough. If this type is changed to be + wider than size_t, the code needs to be modified to check for + overflow when converting bit counts to byte or word counts. + The bit and word index types must be unsigned. */ +typedef size_t bitset_bindex; + +/* Word index. */ +typedef size_t bitset_windex; + +/* Maximum values for commonly-used unsigned types. BITSET_SIZE_MAX + always equals SIZE_MAX, but some older systems lack SIZE_MAX. */ +#define BITSET_BINDEX_MAX ((bitset_bindex) -1) + +/* Limit max word index to the maximum value of a signed integer + to simplify cache disabling. */ +#define BITSET_WINDEX_MAX (((bitset_windex) -1) >> 1) +#define BITSET_SIZE_MAX ((size_t) -1) + +#define BITSET_MSB ((bitset_word) 1 << (BITSET_WORD_BITS - 1)) + +#define BITSET_LIST_SIZE 1024 + +enum bitset_ops {BITSET_OP_ZERO, BITSET_OP_ONES, + BITSET_OP_COPY, BITSET_OP_NOT, + BITSET_OP_EMPTY_P, BITSET_OP_EQUAL_P, + BITSET_OP_SUBSET_P, BITSET_OP_DISJOINT_P, + BITSET_OP_AND, BITSET_OP_OR, BITSET_OP_XOR, BITSET_OP_ANDN, + BITSET_OP_OR_AND, BITSET_OP_AND_OR, BITSET_OP_ANDN_OR}; + +struct bbitset_struct +{ + const struct bitset_vtable *vtable; + bitset_windex cindex; /* Cache word index. */ + bitset_windex csize; /* Cache size in words. */ + bitset_word *cdata; /* Cache data pointer. */ + bitset_bindex n_bits; /* Number of bits. */ + /* Perhaps we could sacrifice another word to indicate + that the bitset is known to be zero, that a bit has been set + in the cache, and that a bit has been cleared in the cache. + This would speed up some of the searches but slightly slow down + bit set/reset operations of cached bits. */ +}; + + +typedef union bitset_union *bitset; + + +/* Private accessor macros to bitset structure. */ +#define BITSET_VTABLE_(SRC) (SRC)->b.vtable +#define BITSET_CINDEX_(SRC) (SRC)->b.cindex +#define BITSET_CDATA_(SRC) (SRC)->b.cdata +#define BITSET_CSIZE_(SRC) (SRC)->b.csize +#define BITSET_NBITS_(SRC) (SRC)->b.n_bits + + +/* The contents of this structure should be considered private. */ +struct bitset_vtable +{ + void (*set) (bitset, bitset_bindex); + void (*reset) (bitset, bitset_bindex); + bool (*toggle) (bitset, bitset_bindex); + bool (*test) (bitset, bitset_bindex); + bitset_bindex (*resize) (bitset, bitset_bindex); + bitset_bindex (*size) (bitset); + bitset_bindex (*count) (bitset); + + bool (*empty_p) (bitset); + void (*ones) (bitset); + void (*zero) (bitset); + + void (*copy) (bitset, bitset); + bool (*disjoint_p) (bitset, bitset); + bool (*equal_p) (bitset, bitset); + void (*not) (bitset, bitset); + bool (*subset_p) (bitset, bitset); + + void (*and) (bitset, bitset, bitset); + bool (*and_cmp) (bitset, bitset, bitset); + void (*andn) (bitset, bitset, bitset); + bool (*andn_cmp) (bitset, bitset, bitset); + void (*or) (bitset, bitset, bitset); + bool (*or_cmp) (bitset, bitset, bitset); + void (*xor) (bitset, bitset, bitset); + bool (*xor_cmp) (bitset, bitset, bitset); + + void (*and_or) (bitset, bitset, bitset, bitset); + bool (*and_or_cmp) (bitset, bitset, bitset, bitset); + void (*andn_or) (bitset, bitset, bitset, bitset); + bool (*andn_or_cmp) (bitset, bitset, bitset, bitset); + void (*or_and) (bitset, bitset, bitset, bitset); + bool (*or_and_cmp) (bitset, bitset, bitset, bitset); + + bitset_bindex (*list) (bitset, bitset_bindex *, bitset_bindex, + bitset_bindex *); + bitset_bindex (*list_reverse) (bitset, bitset_bindex *, bitset_bindex, + bitset_bindex *); + void (*free) (bitset); + enum bitset_type type; +}; + +#define BITSET_COMPATIBLE_(BSET1, BSET2) \ +((BSET1)->b.vtable == (BSET2)->b.vtable) + +#define BITSET_CHECK2_(DST, SRC) \ +if (!BITSET_COMPATIBLE_ (DST, SRC)) abort (); + +#define BITSET_CHECK3_(DST, SRC1, SRC2) \ +if (!BITSET_COMPATIBLE_ (DST, SRC1) \ + || !BITSET_COMPATIBLE_ (DST, SRC2)) abort (); + +#define BITSET_CHECK4_(DST, SRC1, SRC2, SRC3) \ +if (!BITSET_COMPATIBLE_ (DST, SRC1) || !BITSET_COMPATIBLE_ (DST, SRC2) \ + || !BITSET_COMPATIBLE_ (DST, SRC3)) abort (); + + +/* Redefine number of bits in bitset DST. */ +#define BITSET_RESIZE_(DST, SIZE) (DST)->b.vtable->resize (DST, SIZE) + +/* Return size in bits of bitset SRC. */ +#define BITSET_SIZE_(SRC) (SRC)->b.vtable->size (SRC) + +/* Return number of bits set in bitset SRC. */ +#define BITSET_COUNT_(SRC) (SRC)->b.vtable->count (SRC) + +/* Return type of bitset SRC. */ +#define BITSET_TYPE_(DST) (DST)->b.vtable->type + +/* Set bit BITNO in bitset DST. */ +#define BITSET_SET_(DST, BITNO) (DST)->b.vtable->set (DST, BITNO) + +/* Reset bit BITNO in bitset DST. */ +#define BITSET_RESET_(DST, BITNO) (DST)->b.vtable->reset (DST, BITNO) + +/* Toggle bit BITNO in bitset DST. */ +#define BITSET_TOGGLE_(DST, BITNO) (DST)->b.vtable->toggle (DST, BITNO) + +/* Return non-zero if bit BITNO in bitset SRC is set. */ +#define BITSET_TEST_(SRC, BITNO) (SRC)->b.vtable->test (SRC, BITNO) + +/* Free bitset SRC. */ +#define BITSET_FREE_(SRC)\ + ((SRC)->b.vtable->free ? (SRC)->b.vtable->free (SRC) :(void)0) + + +/* Return SRC == 0. */ +#define BITSET_EMPTY_P_(SRC) (SRC)->b.vtable->empty_p (SRC) + +/* DST = ~0. */ +#define BITSET_ONES_(DST) (DST)->b.vtable->ones (DST) + +/* DST = 0. */ +#define BITSET_ZERO_(DST) (DST)->b.vtable->zero (DST) + + + +/* DST = SRC. */ +#define BITSET_COPY_(DST, SRC) (SRC)->b.vtable->copy (DST, SRC) + +/* Return DST & SRC == 0. */ +#define BITSET_DISJOINT_P_(DST, SRC) (SRC)->b.vtable->disjoint_p (DST, SRC) + +/* Return DST == SRC. */ +#define BITSET_EQUAL_P_(DST, SRC) (SRC)->b.vtable->equal_p (DST, SRC) + +/* DST = ~SRC. */ +#define BITSET_NOT_(DST, SRC) (SRC)->b.vtable->not (DST, SRC) + +/* Return DST == DST | SRC. */ +#define BITSET_SUBSET_P_(DST, SRC) (SRC)->b.vtable->subset_p (DST, SRC) + + +/* DST = SRC1 & SRC2. */ +#define BITSET_AND_(DST, SRC1, SRC2) (SRC1)->b.vtable->and (DST, SRC1, SRC2) +#define BITSET_AND_CMP_(DST, SRC1, SRC2) (SRC1)->b.vtable->and_cmp (DST, SRC1, SRC2) + +/* DST = SRC1 & ~SRC2. */ +#define BITSET_ANDN_(DST, SRC1, SRC2) (SRC1)->b.vtable->andn (DST, SRC1, SRC2) +#define BITSET_ANDN_CMP_(DST, SRC1, SRC2) (SRC1)->b.vtable->andn_cmp (DST, SRC1, SRC2) + +/* DST = SRC1 | SRC2. */ +#define BITSET_OR_(DST, SRC1, SRC2) (SRC1)->b.vtable->or (DST, SRC1, SRC2) +#define BITSET_OR_CMP_(DST, SRC1, SRC2) (SRC1)->b.vtable->or_cmp (DST, SRC1, SRC2) + +/* DST = SRC1 ^ SRC2. */ +#define BITSET_XOR_(DST, SRC1, SRC2) (SRC1)->b.vtable->xor (DST, SRC1, SRC2) +#define BITSET_XOR_CMP_(DST, SRC1, SRC2) (SRC1)->b.vtable->xor_cmp (DST, SRC1, SRC2) + + + +/* DST = (SRC1 & SRC2) | SRC3. Return non-zero if + DST != (SRC1 & SRC2) | SRC3. */ +#define BITSET_AND_OR_(DST, SRC1, SRC2, SRC3) \ + (SRC1)->b.vtable->and_or (DST, SRC1, SRC2, SRC3) +#define BITSET_AND_OR_CMP_(DST, SRC1, SRC2, SRC3) \ + (SRC1)->b.vtable->and_or_cmp (DST, SRC1, SRC2, SRC3) + +/* DST = (SRC1 & ~SRC2) | SRC3. Return non-zero if + DST != (SRC1 & ~SRC2) | SRC3. */ +#define BITSET_ANDN_OR_(DST, SRC1, SRC2, SRC3) \ + (SRC1)->b.vtable->andn_or (DST, SRC1, SRC2, SRC3) +#define BITSET_ANDN_OR_CMP_(DST, SRC1, SRC2, SRC3) \ + (SRC1)->b.vtable->andn_or_cmp (DST, SRC1, SRC2, SRC3) + +/* DST = (SRC1 | SRC2) & SRC3. Return non-zero if + DST != (SRC1 | SRC2) & SRC3. */ +#define BITSET_OR_AND_(DST, SRC1, SRC2, SRC3) \ + (SRC1)->b.vtable->or_and (DST, SRC1, SRC2, SRC3) +#define BITSET_OR_AND_CMP_(DST, SRC1, SRC2, SRC3) \ + (SRC1)->b.vtable->or_and_cmp (DST, SRC1, SRC2, SRC3) + + +/* Find list of up to NUM bits set in BSET starting from and including + *NEXT. Return with actual number of bits found and with *NEXT + indicating where search stopped. */ +#define BITSET_LIST_(BSET, LIST, NUM, NEXT) \ + (BSET)->b.vtable->list (BSET, LIST, NUM, NEXT) + +/* Find reverse list of up to NUM bits set in BSET starting from and + including NEXT. Return with actual number of bits found and with + *NEXT indicating where search stopped. */ +#define BITSET_LIST_REVERSE_(BSET, LIST, NUM, NEXT) \ + (BSET)->b.vtable->list_reverse (BSET, LIST, NUM, NEXT) + + +/* Private functions for bitset implementations. */ + +extern bool bitset_toggle_ (bitset, bitset_bindex); + +extern bitset_bindex bitset_count_ (bitset); + +extern bitset_bindex bitset_size_ (bitset); + +extern bool bitset_copy_ (bitset, bitset); + +extern void bitset_and_or_ (bitset, bitset, bitset, bitset); + +extern bool bitset_and_or_cmp_ (bitset, bitset, bitset, bitset); + +extern void bitset_andn_or_ (bitset, bitset, bitset, bitset); + +extern bool bitset_andn_or_cmp_ (bitset, bitset, bitset, bitset); + +extern void bitset_or_and_ (bitset, bitset, bitset, bitset); + +extern bool bitset_or_and_cmp_ (bitset, bitset, bitset, bitset); + +#endif /* _BBITSET_H */ diff --git a/src/apps/bin/bison/lib/bitset.c b/src/apps/bin/bison/lib/bitset.c new file mode 100644 index 0000000000..93fe75d33b --- /dev/null +++ b/src/apps/bin/bison/lib/bitset.c @@ -0,0 +1,505 @@ +/* General bitsets. + Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include +#include "bitset.h" +#include "abitset.h" +#include "lbitset.h" +#include "ebitset.h" +#include "vbitset.h" +#include "bitset_stats.h" +#include "obstack.h" + +const char * const bitset_type_names[] = BITSET_TYPE_NAMES; + + +/* Return number of bytes required to create a N_BIT bitset + of TYPE. The bitset may grow to require more bytes than this. */ +size_t +bitset_bytes (enum bitset_type type, bitset_bindex n_bits) +{ + size_t bytes; + + if (bitset_stats_enabled) + return bitset_stats_bytes (); + + switch (type) + { + case BITSET_ARRAY: + bytes = abitset_bytes (n_bits); + break; + + case BITSET_LIST: + bytes = lbitset_bytes (n_bits); + break; + + case BITSET_TABLE: + bytes = ebitset_bytes (n_bits); + break; + + case BITSET_VARRAY: + bytes = vbitset_bytes (n_bits); + break; + + default: + abort (); + } + + return bytes; +} + + +/* Initialise bitset BSET of TYPE for N_BITS. */ +bitset +bitset_init (bitset bset, bitset_bindex n_bits, enum bitset_type type) +{ + if (bitset_stats_enabled) + return bitset_stats_init (bset, n_bits, type); + + switch (type) + { + case BITSET_ARRAY: + return abitset_init (bset, n_bits); + + case BITSET_LIST: + return lbitset_init (bset, n_bits); + + case BITSET_TABLE: + return ebitset_init (bset, n_bits); + + case BITSET_VARRAY: + return vbitset_init (bset, n_bits); + + default: + abort (); + } +} + + +/* Select a bitset type for a set of N_BITS and with attribute hints + specified by ATTR. For variable size bitsets, N_BITS is only a + hint and may be zero. */ +enum bitset_type +bitset_type_choose (bitset_bindex n_bits ATTRIBUTE_UNUSED, unsigned int attr) +{ + /* Check attributes. */ + if (attr & BITSET_FIXED && attr & BITSET_VARIABLE) + abort (); + if (attr & BITSET_SPARSE && attr & BITSET_DENSE) + abort (); + + /* Choose the type of bitset. Note that sometimes we will be asked + for a zero length fixed size bitset. */ + + + /* If no attributes selected, choose a good compromise. */ + if (!attr) + return BITSET_VARRAY; + + if (attr & BITSET_SPARSE) + return BITSET_LIST; + + if (attr & BITSET_FIXED) + return BITSET_ARRAY; + + if (attr & BITSET_GREEDY) + return BITSET_TABLE; + + return BITSET_VARRAY; +} + + +/* Create a bitset of N_BITS of type TYPE. */ +bitset +bitset_alloc (bitset_bindex n_bits, enum bitset_type type) +{ + size_t bytes; + bitset bset; + + bytes = bitset_bytes (type, n_bits); + + bset = (bitset) xcalloc (1, bytes); + + /* The cache is disabled until some elements are allocated. If we + have variable length arrays, then we may need to allocate a dummy + element. */ + + return bitset_init (bset, n_bits, type); +} + + +/* Create a bitset of N_BITS of type TYPE. */ +bitset +bitset_obstack_alloc (struct obstack *bobstack, + bitset_bindex n_bits, enum bitset_type type) +{ + size_t bytes; + bitset bset; + + bytes = bitset_bytes (type, n_bits); + + bset = obstack_alloc (bobstack, bytes); + memset (bset, 0, bytes); + + return bitset_init (bset, n_bits, type); +} + + +/* Create a bitset of N_BITS and with attribute hints specified by + ATTR. */ +bitset +bitset_create (bitset_bindex n_bits, unsigned int attr) +{ + enum bitset_type type; + + type = bitset_type_choose (n_bits, attr); + + return bitset_alloc (n_bits, type); +} + + +/* Free bitset BSET. */ +void +bitset_free (bitset bset) +{ + BITSET_FREE_ (bset); + free (bset); +} + + +/* Free bitset BSET allocated on obstack. */ +void +bitset_obstack_free (bitset bset) +{ + BITSET_FREE_ (bset); +} + + +/* Return bitset type. */ +enum bitset_type +bitset_type_get (bitset bset) +{ + enum bitset_type type; + + type = BITSET_TYPE_ (bset); + if (type != BITSET_STATS) + return type; + + return bitset_stats_type_get (bset); +} + + +/* Return name of bitset type. */ +const char * +bitset_type_name_get (bitset bset) +{ + enum bitset_type type; + + type = bitset_type_get (bset); + + return bitset_type_names[type]; +} + + +/* Find next bit set in SRC starting from and including BITNO. + Return BITSET_BINDEX_MAX if SRC empty. */ +bitset_bindex +bitset_next (bitset src, bitset_bindex bitno) +{ + bitset_bindex val; + bitset_bindex next = bitno; + + if (!bitset_list (src, &val, 1, &next)) + return BITSET_BINDEX_MAX; + return val; +} + + +/* Return true if both bitsets are of the same type and size. */ +extern bool +bitset_compatible_p (bitset bset1, bitset bset2) +{ + return BITSET_COMPATIBLE_ (bset1, bset2); +} + + +/* Find previous bit set in SRC starting from and including BITNO. + Return BITSET_BINDEX_MAX if SRC empty. */ +bitset_bindex +bitset_prev (bitset src, bitset_bindex bitno) +{ + bitset_bindex val; + bitset_bindex next = bitno; + + if (!bitset_list_reverse (src, &val, 1, &next)) + return BITSET_BINDEX_MAX; + return val; +} + + +/* Find first set bit. */ +bitset_bindex +bitset_first (bitset src) +{ + return bitset_next (src, 0); +} + + +/* Find last set bit. */ +bitset_bindex +bitset_last (bitset src) +{ + return bitset_prev (src, 0); +} + + +/* Is BITNO in SRC the only set bit? */ +bool +bitset_only_set_p (bitset src, bitset_bindex bitno) +{ + bitset_bindex val[2]; + bitset_bindex next = 0; + + if (bitset_list (src, val, 2, &next) != 1) + return false; + return val[0] == bitno; +} + + +/* Print contents of bitset BSET to FILE. */ +static void +bitset_print (FILE *file, bitset bset, bool verbose) +{ + unsigned int pos; + bitset_bindex i; + bitset_iterator iter; + + if (verbose) + fprintf (file, "n_bits = %lu, set = {", + (unsigned long int) bitset_size (bset)); + + pos = 30; + BITSET_FOR_EACH (iter, bset, i, 0) + { + if (pos > 70) + { + fprintf (file, "\n"); + pos = 0; + } + + fprintf (file, "%d ", i); + pos += 1 + (i >= 10) + (i >= 100); + }; + + if (verbose) + fprintf (file, "}\n"); +} + + +/* Dump bitset BSET to FILE. */ +void +bitset_dump (FILE *file, bitset bset) +{ + bitset_print (file, bset, false); +} + + +/* Release memory associated with bitsets. */ +void +bitset_release_memory (void) +{ + lbitset_release_memory (); + ebitset_release_memory (); +} + + +/* Toggle bit BITNO in bitset BSET and the new value of the bit. */ +bool +bitset_toggle_ (bitset bset, bitset_bindex bitno) +{ + /* This routine is for completeness. It could be optimized if + required. */ + if (bitset_test (bset, bitno)) + { + bitset_reset (bset, bitno); + return false; + } + else + { + bitset_set (bset, bitno); + return true; + } +} + + +/* Return number of bits in bitset SRC. */ +bitset_bindex +bitset_size_ (bitset src) +{ + return BITSET_NBITS_ (src); +} + + +/* Return number of bits set in bitset SRC. */ +bitset_bindex +bitset_count_ (bitset src) +{ + bitset_bindex list[BITSET_LIST_SIZE]; + bitset_bindex next; + bitset_bindex num; + bitset_bindex count; + + /* This could be greatly sped up by adding a count method for each + bitset implementation that uses a direct technique (based on + masks) for counting the number of bits set in a word. */ + + next = 0; + for (count = 0; (num = bitset_list (src, list, BITSET_LIST_SIZE, &next)); + count += num) + continue; + + return count; +} + + +/* DST = SRC. Return true if DST != SRC. + This is a fallback for the case where SRC and DST are different + bitset types. */ +bool +bitset_copy_ (bitset dst, bitset src) +{ + bitset_bindex i; + bitset_iterator iter; + + /* Convert bitset types. We assume that the DST bitset + is large enough to hold the SRC bitset. */ + bitset_zero (dst); + BITSET_FOR_EACH (iter, src, i, 0) + { + bitset_set (dst, i); + }; + + return true; +} + + +/* This is a fallback for implementations that do not support + four operand operations. */ +static inline bool +bitset_op4_cmp (bitset dst, bitset src1, bitset src2, bitset src3, + enum bitset_ops op) +{ + bool changed = false; + bool stats_enabled_save; + bitset tmp; + + /* Create temporary bitset. */ + stats_enabled_save = bitset_stats_enabled; + bitset_stats_enabled = false; + tmp = bitset_alloc (0, bitset_type_get (dst)); + bitset_stats_enabled = stats_enabled_save; + + switch (op) + { + case BITSET_OP_OR_AND: + bitset_or (tmp, src1, src2); + changed = bitset_and_cmp (dst, src3, tmp); + break; + + case BITSET_OP_AND_OR: + bitset_and (tmp, src1, src2); + changed = bitset_or_cmp (dst, src3, tmp); + break; + + case BITSET_OP_ANDN_OR: + bitset_andn (tmp, src1, src2); + changed = bitset_or_cmp (dst, src3, tmp); + break; + + default: + abort (); + } + + bitset_free (tmp); + return changed; +} + + +/* DST = (SRC1 & SRC2) | SRC3. */ +void +bitset_and_or_ (bitset dst, bitset src1, bitset src2, bitset src3) +{ + bitset_and_or_cmp_ (dst, src1, src2, src3); +} + + +/* DST = (SRC1 & SRC2) | SRC3. Return non-zero if + DST != (SRC1 & SRC2) | SRC3. */ +bool +bitset_and_or_cmp_ (bitset dst, bitset src1, bitset src2, bitset src3) +{ + return bitset_op4_cmp (dst, src1, src2, src3, BITSET_OP_AND_OR); +} + + +/* DST = (SRC1 & ~SRC2) | SRC3. */ +void +bitset_andn_or_ (bitset dst, bitset src1, bitset src2, bitset src3) +{ + bitset_andn_or_cmp_ (dst, src1, src2, src3); +} + + +/* DST = (SRC1 & ~SRC2) | SRC3. Return non-zero if + DST != (SRC1 & ~SRC2) | SRC3. */ +bool +bitset_andn_or_cmp_ (bitset dst, bitset src1, bitset src2, bitset src3) +{ + return bitset_op4_cmp (dst, src1, src2, src3, BITSET_OP_ANDN_OR); +} + + +/* DST = (SRC1 | SRC2) & SRC3. */ +void +bitset_or_and_ (bitset dst, bitset src1, bitset src2, bitset src3) +{ + bitset_or_and_cmp_ (dst, src1, src2, src3); +} + + +/* DST = (SRC1 | SRC2) & SRC3. Return non-zero if + DST != (SRC1 | SRC2) & SRC3. */ +bool +bitset_or_and_cmp_ (bitset dst, bitset src1, bitset src2, bitset src3) +{ + return bitset_op4_cmp (dst, src1, src2, src3, BITSET_OP_OR_AND); +} + + +/* Function to be called from debugger to print bitset. */ +void +debug_bitset (bitset bset) +{ + if (bset) + bitset_print (stderr, bset, true); +} diff --git a/src/apps/bin/bison/lib/bitset.h b/src/apps/bin/bison/lib/bitset.h new file mode 100644 index 0000000000..3f13ffd4e4 --- /dev/null +++ b/src/apps/bin/bison/lib/bitset.h @@ -0,0 +1,389 @@ +/* Generic bitsets. + Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _BITSET_H +#define _BITSET_H + +/* This file is the public interface to the bitset abstract data type. + Only use the functions and macros defined in this file. */ + +#include "bbitset.h" +#include "obstack.h" +#include + +/* Attributes used to select a bitset implementation. */ +enum bitset_attr {BITSET_FIXED = 1, /* Bitset size fixed. */ + BITSET_VARIABLE = 2, /* Bitset size variable. */ + BITSET_DENSE = 4, /* Bitset dense. */ + BITSET_SPARSE = 8, /* Bitset sparse. */ + BITSET_FRUGAL = 16, /* Prefer most compact. */ + BITSET_GREEDY = 32}; /* Prefer fastest at memory expense. */ + +typedef unsigned int bitset_attrs; + +/* The contents of the union should be considered to be private. + While I would like to make this union opaque, it needs to be + visible for the inline bit set/test functions, and for delegation + to the proper implementation. */ +union bitset_union +{ + /* This must be the first member of every other structure that is a + member of this union. */ + struct bbitset_struct b; /* Base bitset data. */ + + struct abitset_struct + { + struct bbitset_struct b; + bitset_word words[1]; /* The array of bits. */ + } a; + + struct ebitset_struct + { + struct bbitset_struct b; + bitset_windex size; /* Number of elements. */ + struct ebitset_elt_struct **elts; /* Expanding array of ptrs to elts. */ + } e; + + struct lbitset_struct + { + struct bbitset_struct b; + struct lbitset_elt_struct *head; /* First element in linked list. */ + struct lbitset_elt_struct *tail; /* Last element in linked list. */ + } l; + + struct bitset_stats_struct + { + struct bbitset_struct b; + bitset bset; + } s; + + struct vbitset_struct + { + struct bbitset_struct b; + bitset_windex size; /* Allocated size of array. */ + } v; + +}; + + +/* The contents of this structure should be considered private. + It is used for iterating over set bits. */ +typedef struct +{ + bitset_bindex list[BITSET_LIST_SIZE]; + bitset_bindex next; + bitset_bindex num; + bitset_bindex i; +} bitset_iterator; + + +/* Return bytes required for bitset of desired type and size. */ +extern size_t bitset_bytes (enum bitset_type, bitset_bindex); + +/* Initialise a bitset with desired type and size. */ +extern bitset bitset_init (bitset, bitset_bindex, enum bitset_type); + +/* Select an implementation type based on the desired bitset size + and attributes. */ +extern enum bitset_type bitset_type_choose (bitset_bindex, bitset_attrs); + +/* Create a bitset of desired type and size. The bitset is zeroed. */ +extern bitset bitset_alloc (bitset_bindex, enum bitset_type); + +/* Free bitset. */ +extern void bitset_free (bitset); + +/* Create a bitset of desired type and size using an obstack. The + bitset is zeroed. */ +extern bitset bitset_obstack_alloc (struct obstack *bobstack, + bitset_bindex, enum bitset_type); + +/* Free bitset allocated on obstack. */ +extern void bitset_obstack_free (bitset); + +/* Create a bitset of desired size and attributes. The bitset is zeroed. */ +extern bitset bitset_create (bitset_bindex, bitset_attrs); + +/* Return bitset type. */ +extern enum bitset_type bitset_type_get (bitset); + +/* Return bitset type name. */ +extern const char *bitset_type_name_get (bitset); + + +/* Set bit BITNO in bitset BSET. */ +static inline void +bitset_set (bitset bset, bitset_bindex bitno) +{ + bitset_windex windex = bitno / BITSET_WORD_BITS; + bitset_windex offset = windex - bset->b.cindex; + + if (offset < bset->b.csize) + bset->b.cdata[offset] |= ((bitset_word) 1 << (bitno % BITSET_WORD_BITS)); + else + BITSET_SET_ (bset, bitno); +} + + +/* Reset bit BITNO in bitset BSET. */ +static inline void +bitset_reset (bitset bset, bitset_bindex bitno) +{ + bitset_windex windex = bitno / BITSET_WORD_BITS; + bitset_windex offset = windex - bset->b.cindex; + + if (offset < bset->b.csize) + bset->b.cdata[offset] &= ~((bitset_word) 1 << (bitno % BITSET_WORD_BITS)); + else + BITSET_RESET_ (bset, bitno); +} + + +/* Test bit BITNO in bitset BSET. */ +static inline bool +bitset_test (bitset bset, bitset_bindex bitno) +{ + bitset_windex windex = bitno / BITSET_WORD_BITS; + bitset_windex offset = windex - bset->b.cindex; + + if (offset < bset->b.csize) + return (bset->b.cdata[offset] >> (bitno % BITSET_WORD_BITS)) & 1; + else + return BITSET_TEST_ (bset, bitno); +} + + +/* Toggle bit BITNO in bitset BSET and return non-zero if now set. */ +#define bitset_toggle(bset, bitno) BITSET_TOGGLE_ (bset, bitno) + +/* Return size in bits of bitset SRC. */ +#define bitset_size(SRC) BITSET_SIZE_ (SRC) + +/* Change size of bitset. */ +extern void bitset_resize (bitset, bitset_bindex); + +/* Return number of bits set in bitset SRC. */ +#define bitset_count(SRC) BITSET_COUNT_ (SRC) + + +/* Return SRC == 0. */ +#define bitset_empty_p(SRC) BITSET_EMPTY_P_ (SRC) + +/* DST = ~0. */ +#define bitset_ones(DST) BITSET_ONES_ (DST) + +/* DST = 0. */ +#define bitset_zero(DST) BITSET_ZERO_ (DST) + + + +/* DST = SRC. */ +#define bitset_copy(DST, SRC) BITSET_COPY_ (DST, SRC) + +/* Return DST & SRC == 0. */ +#define bitset_disjoint_p(DST, SRC) BITSET_DISJOINT_P_ (DST, SRC) + +/* Return DST == SRC. */ +#define bitset_equal_p(DST, SRC) BITSET_EQUAL_P_ (DST, SRC) + +/* DST = ~SRC. */ +#define bitset_not(DST, SRC) BITSET_NOT_ (DST, SRC) + +/* Return DST == DST | SRC. */ +#define bitset_subset_p(DST, SRC) BITSET_SUBSET_P_ (DST, SRC) + + + +/* DST = SRC1 & SRC2. */ +#define bitset_and(DST, SRC1, SRC2) BITSET_AND_ (DST, SRC1, SRC2) + +/* DST = SRC1 & SRC2. Return non-zero if DST != SRC1 & SRC2. */ +#define bitset_and_cmp(DST, SRC1, SRC2) BITSET_AND_CMP_ (DST, SRC1, SRC2) + +/* DST = SRC1 & ~SRC2. */ +#define bitset_andn(DST, SRC1, SRC2) BITSET_ANDN_ (DST, SRC1, SRC2) + +/* DST = SRC1 & ~SRC2. Return non-zero if DST != SRC1 & ~SRC2. */ +#define bitset_andn_cmp(DST, SRC1, SRC2) BITSET_ANDN_CMP_ (DST, SRC1, SRC2) + +/* DST = SRC1 | SRC2. */ +#define bitset_or(DST, SRC1, SRC2) BITSET_OR_ (DST, SRC1, SRC2) + +/* DST = SRC1 | SRC2. Return non-zero if DST != SRC1 | SRC2. */ +#define bitset_or_cmp(DST, SRC1, SRC2) BITSET_OR_CMP_ (DST, SRC1, SRC2) + +/* DST = SRC1 ^ SRC2. */ +#define bitset_xor(DST, SRC1, SRC2) BITSET_XOR_ (DST, SRC1, SRC2) + +/* DST = SRC1 ^ SRC2. Return non-zero if DST != SRC1 ^ SRC2. */ +#define bitset_xor_cmp(DST, SRC1, SRC2) BITSET_XOR_CMP_ (DST, SRC1, SRC2) + + + +/* DST = (SRC1 & SRC2) | SRC3. */ +#define bitset_and_or(DST, SRC1, SRC2, SRC3) \ + BITSET_AND_OR_ (DST, SRC1, SRC2, SRC3) + +/* DST = (SRC1 & SRC2) | SRC3. Return non-zero if + DST != (SRC1 & SRC2) | SRC3. */ +#define bitset_and_or_cmp(DST, SRC1, SRC2, SRC3) \ + BITSET_AND_OR_CMP_ (DST, SRC1, SRC2, SRC3) + +/* DST = (SRC1 & ~SRC2) | SRC3. */ +#define bitset_andn_or(DST, SRC1, SRC2, SRC3) \ + BITSET_ANDN_OR_ (DST, SRC1, SRC2, SRC3) + +/* DST = (SRC1 & ~SRC2) | SRC3. Return non-zero if + DST != (SRC1 & ~SRC2) | SRC3. */ +#define bitset_andn_or_cmp(DST, SRC1, SRC2, SRC3) \ + BITSET_ANDN_OR_CMP_ (DST, SRC1, SRC2, SRC3) + +/* DST = (SRC1 | SRC2) & SRC3. */ +#define bitset_or_and(DST, SRC1, SRC2, SRC3)\ + BITSET_OR_AND_ (DST, SRC1, SRC2, SRC3) + +/* DST = (SRC1 | SRC2) & SRC3. Return non-zero if + DST != (SRC1 | SRC2) & SRC3. */ +#define bitset_or_and_cmp(DST, SRC1, SRC2, SRC3)\ + BITSET_OR_AND_CMP_ (DST, SRC1, SRC2, SRC3) + +/* Find list of up to NUM bits set in BSET starting from and including + *NEXT. Return with actual number of bits found and with *NEXT + indicating where search stopped. */ +#define bitset_list(BSET, LIST, NUM, NEXT) \ + BITSET_LIST_ (BSET, LIST, NUM, NEXT) + +/* Find reverse list of up to NUM bits set in BSET starting from and + including NEXT. Return with actual number of bits found and with + *NEXT indicating where search stopped. */ +#define bitset_list_reverse(BSET, LIST, NUM, NEXT) \ + BITSET_LIST_REVERSE_ (BSET, LIST, NUM, NEXT) + +/* Return true if both bitsets are of the same type and size. */ +extern bool bitset_compatible_p (bitset bset1, bitset bset2); + +/* Find next set bit from the given bit index. */ +extern bitset_bindex bitset_next (bitset, bitset_bindex); + +/* Find previous set bit from the given bit index. */ +extern bitset_bindex bitset_prev (bitset, bitset_bindex); + +/* Find first set bit. */ +extern bitset_bindex bitset_first (bitset); + +/* Find last set bit. */ +extern bitset_bindex bitset_last (bitset); + +/* Return nonzero if this is the only set bit. */ +extern bool bitset_only_set_p (bitset, bitset_bindex); + +/* Dump bitset. */ +extern void bitset_dump (FILE *, bitset); + +/* Loop over all elements of BSET, starting with MIN, setting INDEX + to the index of each set bit. For example, the following will print + the bits set in a bitset: + + bitset_bindex i; + bitset_iterator iter; + + BITSET_FOR_EACH (iter, src, i, 0) + { + printf ("%lu ", (unsigned long int) i); + }; +*/ +#define BITSET_FOR_EACH(ITER, BSET, INDEX, MIN) \ + for (ITER.next = (MIN), ITER.num = BITSET_LIST_SIZE; \ + (ITER.num == BITSET_LIST_SIZE) \ + && (ITER.num = bitset_list (BSET, ITER.list, \ + BITSET_LIST_SIZE, &ITER.next));) \ + for (ITER.i = 0; \ + ITER.i < ITER.num && ((INDEX) = ITER.list[ITER.i], 1); \ + ITER.i++) + + +/* Loop over all elements of BSET, in reverse order starting with + MIN, setting INDEX to the index of each set bit. For example, the + following will print the bits set in a bitset in reverse order: + + bitset_bindex i; + bitset_iterator iter; + + BITSET_FOR_EACH_REVERSE (iter, src, i, 0) + { + printf ("%lu ", (unsigned long int) i); + }; +*/ +#define BITSET_FOR_EACH_REVERSE(ITER, BSET, INDEX, MIN) \ + for (ITER.next = (MIN), ITER.num = BITSET_LIST_SIZE; \ + (ITER.num == BITSET_LIST_SIZE) \ + && (ITER.num = bitset_list_reverse (BSET, ITER.list, \ + BITSET_LIST_SIZE, &ITER.next));) \ + for (ITER.i = 0; \ + ITER.i < ITER.num && ((INDEX) = ITER.list[ITER.i], 1); \ + ITER.i++) + + +/* Define set operations in terms of logical operations. */ + +#define bitset_diff(DST, SRC1, SRC2) bitset_andn (DST, SRC1, SRC2) +#define bitset_diff_cmp(DST, SRC1, SRC2) bitset_andn_cmp (DST, SRC1, SRC2) + +#define bitset_intersection(DST, SRC1, SRC2) bitset_and (DST, SRC1, SRC2) +#define bitset_intersection_cmp(DST, SRC1, SRC2) bitset_and_cmp (DST, SRC1, SRC2) + +#define bitset_union(DST, SRC1, SRC2) bitset_or (DST, SRC1, SRC2) +#define bitset_union_cmp(DST, SRC1, SRC2) bitset_or_cmp (DST, SRC1, SRC2) + +/* Symmetrical difference. */ +#define bitset_symdiff(DST, SRC1, SRC2) bitset_xor (DST, SRC1, SRC2) +#define bitset_symdiff_cmp(DST, SRC1, SRC2) bitset_xor_cmp (DST, SRC1, SRC2) + +/* Union of difference. */ +#define bitset_diff_union(DST, SRC1, SRC2, SRC3) \ + bitset_andn_or (DST, SRC1, SRC2, SRC3) +#define bitset_diff_union_cmp(DST, SRC1, SRC2, SRC3) \ + bitset_andn_or_cmp (DST, SRC1, SRC2, SRC3) + + +/* Release any memory tied up with bitsets. */ +extern void bitset_release_memory (void); + +/* Enable bitset stats gathering. */ +extern void bitset_stats_enable (void); + +/* Disable bitset stats gathering. */ +extern void bitset_stats_disable (void); + +/* Read bitset stats file of accummulated stats. */ +void bitset_stats_read (const char *filename); + +/* Write bitset stats file of accummulated stats. */ +void bitset_stats_write (const char *filename); + +/* Dump bitset stats. */ +extern void bitset_stats_dump (FILE *); + +/* Function to debug bitset from debugger. */ +extern void debug_bitset (bitset); + +/* Function to debug bitset stats from debugger. */ +extern void debug_bitset_stats (void); + +#endif /* _BITSET_H */ + diff --git a/src/apps/bin/bison/lib/bitset_stats.c b/src/apps/bin/bison/lib/bitset_stats.c new file mode 100644 index 0000000000..70acd977de --- /dev/null +++ b/src/apps/bin/bison/lib/bitset_stats.c @@ -0,0 +1,732 @@ +/* Bitset statistics. + Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +/* This file is a wrapper bitset implementation for the other bitset + implementations. It provides bitset compatibility checking and + statistics gathering without having to instrument the bitset + implementations. When statistics gathering is enabled, the bitset + operations get vectored through here and we then call the appropriate + routines. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "bbitset.h" +#include "abitset.h" +#include "ebitset.h" +#include "lbitset.h" +#include "vbitset.h" +#include "bitset_stats.h" +#include +#include +#include + +#include "gettext.h" +#define _(Msgid) gettext (Msgid) + +/* Configuration macros. */ +#define BITSET_STATS_FILE "bitset.dat" +#define BITSET_LOG_COUNT_BINS 10 +#define BITSET_LOG_SIZE_BINS 16 +#define BITSET_DENSITY_BINS 20 + + +/* Accessor macros. */ +#define BITSET_STATS_ALLOCS_INC(TYPE) \ + bitset_stats_info->types[(TYPE)].allocs++ +#define BITSET_STATS_FREES_INC(BSET) \ + bitset_stats_info->types[BITSET_TYPE_ (BSET)].frees++ +#define BITSET_STATS_SETS_INC(BSET) \ + bitset_stats_info->types[BITSET_TYPE_ (BSET)].sets++ +#define BITSET_STATS_CACHE_SETS_INC(BSET) \ + bitset_stats_info->types[BITSET_TYPE_ (BSET)].cache_sets++ +#define BITSET_STATS_RESETS_INC(BSET) \ + bitset_stats_info->types[BITSET_TYPE_ (BSET)].resets++ +#define BITSET_STATS_CACHE_RESETS_INC(BSET) \ + bitset_stats_info->types[BITSET_TYPE_ (BSET)].cache_resets++ +#define BITSET_STATS_TESTS_INC(BSET) \ + bitset_stats_info->types[BITSET_TYPE_ (BSET)].tests++ +#define BITSET_STATS_CACHE_TESTS_INC(BSET) \ + bitset_stats_info->types[BITSET_TYPE_ (BSET)].cache_tests++ +#define BITSET_STATS_LISTS_INC(BSET) \ + bitset_stats_info->types[BITSET_TYPE_ (BSET)].lists++ +#define BITSET_STATS_LIST_COUNTS_INC(BSET, I) \ + bitset_stats_info->types[BITSET_TYPE_ (BSET)].list_counts[(I)]++ +#define BITSET_STATS_LIST_SIZES_INC(BSET, I) \ + bitset_stats_info->types[BITSET_TYPE_ (BSET)].list_sizes[(I)]++ +#define BITSET_STATS_LIST_DENSITY_INC(BSET, I) \ + bitset_stats_info->types[BITSET_TYPE_ (BSET)].list_density[(I)]++ + + +struct bitset_type_info_struct +{ + unsigned int allocs; + unsigned int frees; + unsigned int lists; + unsigned int sets; + unsigned int cache_sets; + unsigned int resets; + unsigned int cache_resets; + unsigned int tests; + unsigned int cache_tests; + unsigned int list_counts[BITSET_LOG_COUNT_BINS]; + unsigned int list_sizes[BITSET_LOG_SIZE_BINS]; + unsigned int list_density[BITSET_DENSITY_BINS]; +}; + +struct bitset_stats_info_struct +{ + unsigned int runs; + struct bitset_type_info_struct types[BITSET_TYPE_NUM]; +}; + + +struct bitset_stats_info_struct bitset_stats_info_data; +struct bitset_stats_info_struct *bitset_stats_info; +bool bitset_stats_enabled = false; + + +/* Print a percentage histogram with message MSG to FILE. */ +static void +bitset_percent_histogram_print (FILE *file, const char *name, const char *msg, + unsigned int n_bins, unsigned int *bins) +{ + unsigned int i; + unsigned int total; + + total = 0; + for (i = 0; i < n_bins; i++) + total += bins[i]; + + if (!total) + return; + + fprintf (file, "%s %s", name, msg); + for (i = 0; i < n_bins; i++) + fprintf (file, "%.0f-%.0f%%\t%8u (%5.1f%%)\n", + i * 100.0 / n_bins, + (i + 1) * 100.0 / n_bins, bins[i], + (100.0 * bins[i]) / total); +} + + +/* Print a log histogram with message MSG to FILE. */ +static void +bitset_log_histogram_print (FILE *file, const char *name, const char *msg, + unsigned int n_bins, unsigned int *bins) +{ + unsigned int i; + unsigned int total; + unsigned int max_width; + + total = 0; + for (i = 0; i < n_bins; i++) + total += bins[i]; + + if (!total) + return; + + /* Determine number of useful bins. */ + for (i = n_bins; i > 3 && ! bins[i - 1]; i--) + continue; + n_bins = i; + + /* 2 * ceil (log10 (2) * (N - 1)) + 1. */ + max_width = 2 * (unsigned int) (0.30103 * (n_bins - 1) + 0.9999) + 1; + + fprintf (file, "%s %s", name, msg); + for (i = 0; i < 2; i++) + fprintf (file, "%*d\t%8u (%5.1f%%)\n", + max_width, i, bins[i], 100.0 * bins[i] / total); + + for (; i < n_bins; i++) + fprintf (file, "%*lu-%lu\t%8u (%5.1f%%)\n", + max_width - ((unsigned int) (0.30103 * (i) + 0.9999) + 1), + 1UL << (i - 1), + (1UL << i) - 1, + bins[i], + (100.0 * bins[i]) / total); +} + + +/* Print bitset statistics to FILE. */ +static void +bitset_stats_print_1 (FILE *file, const char *name, + struct bitset_type_info_struct *stats) +{ + if (!stats) + return; + + fprintf (file, "%s:\n", name); + fprintf (file, _("%u bitset_allocs, %u freed (%.2f%%).\n"), + stats->allocs, stats->frees, + stats->allocs ? 100.0 * stats->frees / stats->allocs : 0); + fprintf (file, _("%u bitset_sets, %u cached (%.2f%%)\n"), + stats->sets, stats->cache_sets, + stats->sets ? 100.0 * stats->cache_sets / stats->sets : 0); + fprintf (file, _("%u bitset_resets, %u cached (%.2f%%)\n"), + stats->resets, stats->cache_resets, + stats->resets ? 100.0 * stats->cache_resets / stats->resets : 0); + fprintf (file, _("%u bitset_tests, %u cached (%.2f%%)\n"), + stats->tests, stats->cache_tests, + stats->tests ? 100.0 * stats->cache_tests / stats->tests : 0); + + fprintf (file, _("%u bitset_lists\n"), stats->lists); + + bitset_log_histogram_print (file, name, _("count log histogram\n"), + BITSET_LOG_COUNT_BINS, stats->list_counts); + + bitset_log_histogram_print (file, name, _("size log histogram\n"), + BITSET_LOG_SIZE_BINS, stats->list_sizes); + + bitset_percent_histogram_print (file, name, _("density histogram\n"), + BITSET_DENSITY_BINS, stats->list_density); +} + + +/* Print all bitset statistics to FILE. */ +static void +bitset_stats_print (FILE *file, bool verbose ATTRIBUTE_UNUSED) +{ + int i; + + if (!bitset_stats_info) + return; + + fprintf (file, _("Bitset statistics:\n\n")); + + if (bitset_stats_info->runs > 1) + fprintf (file, _("Accumulated runs = %u\n"), bitset_stats_info->runs); + + for (i = 0; i < BITSET_TYPE_NUM; i++) + bitset_stats_print_1 (file, bitset_type_names[i], + &bitset_stats_info->types[i]); +} + + +/* Initialise bitset statistics logging. */ +void +bitset_stats_enable (void) +{ + if (!bitset_stats_info) + bitset_stats_info = &bitset_stats_info_data; + bitset_stats_enabled = true; +} + + +void +bitset_stats_disable (void) +{ + bitset_stats_enabled = false; +} + + +/* Read bitset statistics file. */ +void +bitset_stats_read (const char *filename) +{ + FILE *file; + + if (!bitset_stats_info) + return; + + if (!filename) + filename = BITSET_STATS_FILE; + + file = fopen (filename, "r"); + if (file) + { + if (fread (&bitset_stats_info_data, sizeof (bitset_stats_info_data), + 1, file) != 1) + { + if (ferror (file)) + perror (_("Could not read stats file.")); + else + fprintf (stderr, _("Bad stats file size.\n")); + } + if (fclose (file) != 0) + perror (_("Could not read stats file.")); + } + bitset_stats_info_data.runs++; +} + + +/* Write bitset statistics file. */ +void +bitset_stats_write (const char *filename) +{ + FILE *file; + + if (!bitset_stats_info) + return; + + if (!filename) + filename = BITSET_STATS_FILE; + + file = fopen (filename, "w"); + if (file) + { + if (fwrite (&bitset_stats_info_data, sizeof (bitset_stats_info_data), + 1, file) != 1) + perror (_("Could not write stats file.")); + if (fclose (file) != 0) + perror (_("Could not write stats file.")); + } + else + perror (_("Could not open stats file for writing.")); +} + + +/* Dump bitset statistics to FILE. */ +void +bitset_stats_dump (FILE *file) +{ + bitset_stats_print (file, false); +} + + +/* Function to be called from debugger to print bitset stats. */ +void +debug_bitset_stats (void) +{ + bitset_stats_print (stderr, true); +} + + +static void +bitset_stats_set (bitset dst, bitset_bindex bitno) +{ + bitset bset = dst->s.bset; + bitset_windex wordno = bitno / BITSET_WORD_BITS; + bitset_windex offset = wordno - bset->b.cindex; + + BITSET_STATS_SETS_INC (bset); + + if (offset < bset->b.csize) + { + bset->b.cdata[offset] |= (bitset_word) 1 << (bitno % BITSET_WORD_BITS); + BITSET_STATS_CACHE_SETS_INC (bset); + } + else + BITSET_SET_ (bset, bitno); +} + + +static void +bitset_stats_reset (bitset dst, bitset_bindex bitno) +{ + bitset bset = dst->s.bset; + bitset_windex wordno = bitno / BITSET_WORD_BITS; + bitset_windex offset = wordno - bset->b.cindex; + + BITSET_STATS_RESETS_INC (bset); + + if (offset < bset->b.csize) + { + bset->b.cdata[offset] &= + ~((bitset_word) 1 << (bitno % BITSET_WORD_BITS)); + BITSET_STATS_CACHE_RESETS_INC (bset); + } + else + BITSET_RESET_ (bset, bitno); +} + + +static bool +bitset_stats_toggle (bitset src, bitset_bindex bitno) +{ + return BITSET_TOGGLE_ (src->s.bset, bitno); +} + + +static bool +bitset_stats_test (bitset src, bitset_bindex bitno) +{ + bitset bset = src->s.bset; + bitset_windex wordno = bitno / BITSET_WORD_BITS; + bitset_windex offset = wordno - bset->b.cindex; + + BITSET_STATS_TESTS_INC (bset); + + if (offset < bset->b.csize) + { + BITSET_STATS_CACHE_TESTS_INC (bset); + return (bset->b.cdata[offset] >> (bitno % BITSET_WORD_BITS)) & 1; + } + else + return BITSET_TEST_ (bset, bitno); +} + + +static bitset_bindex +bitset_stats_resize (bitset src, bitset_bindex size) +{ + return BITSET_RESIZE_ (src->s.bset, size); +} + + +static bitset_bindex +bitset_stats_size (bitset src) +{ + return BITSET_SIZE_ (src->s.bset); +} + + +static bitset_bindex +bitset_stats_count (bitset src) +{ + return BITSET_COUNT_ (src->s.bset); +} + + +static bool +bitset_stats_empty_p (bitset dst) +{ + return BITSET_EMPTY_P_ (dst->s.bset); +} + + +static void +bitset_stats_ones (bitset dst) +{ + BITSET_ONES_ (dst->s.bset); +} + + +static void +bitset_stats_zero (bitset dst) +{ + BITSET_ZERO_ (dst->s.bset); +} + + +static void +bitset_stats_copy (bitset dst, bitset src) +{ + BITSET_CHECK2_ (dst, src); + BITSET_COPY_ (dst->s.bset, src->s.bset); +} + + +static bool +bitset_stats_disjoint_p (bitset dst, bitset src) +{ + BITSET_CHECK2_ (dst, src); + return BITSET_DISJOINT_P_ (dst->s.bset, src->s.bset); +} + + +static bool +bitset_stats_equal_p (bitset dst, bitset src) +{ + BITSET_CHECK2_ (dst, src); + return BITSET_EQUAL_P_ (dst->s.bset, src->s.bset); +} + + +static void +bitset_stats_not (bitset dst, bitset src) +{ + BITSET_CHECK2_ (dst, src); + BITSET_NOT_ (dst->s.bset, src->s.bset); +} + + +static bool +bitset_stats_subset_p (bitset dst, bitset src) +{ + BITSET_CHECK2_ (dst, src); + return BITSET_SUBSET_P_ (dst->s.bset, src->s.bset); +} + + +static void +bitset_stats_and (bitset dst, bitset src1, bitset src2) +{ + BITSET_CHECK3_ (dst, src1, src2); + BITSET_AND_ (dst->s.bset, src1->s.bset, src2->s.bset); +} + + +static bool +bitset_stats_and_cmp (bitset dst, bitset src1, bitset src2) +{ + BITSET_CHECK3_ (dst, src1, src2); + return BITSET_AND_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset); +} + + +static void +bitset_stats_andn (bitset dst, bitset src1, bitset src2) +{ + BITSET_CHECK3_ (dst, src1, src2); + BITSET_ANDN_ (dst->s.bset, src1->s.bset, src2->s.bset); +} + + +static bool +bitset_stats_andn_cmp (bitset dst, bitset src1, bitset src2) +{ + BITSET_CHECK3_ (dst, src1, src2); + return BITSET_ANDN_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset); +} + + +static void +bitset_stats_or (bitset dst, bitset src1, bitset src2) +{ + BITSET_CHECK3_ (dst, src1, src2); + BITSET_OR_ (dst->s.bset, src1->s.bset, src2->s.bset); +} + + +static bool +bitset_stats_or_cmp (bitset dst, bitset src1, bitset src2) +{ + BITSET_CHECK3_ (dst, src1, src2); + return BITSET_OR_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset); +} + + +static void +bitset_stats_xor (bitset dst, bitset src1, bitset src2) +{ + BITSET_CHECK3_ (dst, src1, src2); + BITSET_XOR_ (dst->s.bset, src1->s.bset, src2->s.bset); +} + + +static bool +bitset_stats_xor_cmp (bitset dst, bitset src1, bitset src2) +{ + BITSET_CHECK3_ (dst, src1, src2); + return BITSET_XOR_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset); +} + + +static void +bitset_stats_and_or (bitset dst, bitset src1, bitset src2, bitset src3) +{ + BITSET_CHECK4_ (dst, src1, src2, src3); + BITSET_AND_OR_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset); +} + + +static bool +bitset_stats_and_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3) +{ + BITSET_CHECK4_ (dst, src1, src2, src3); + return BITSET_AND_OR_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset); +} + + +static void +bitset_stats_andn_or (bitset dst, bitset src1, bitset src2, bitset src3) +{ + BITSET_CHECK4_ (dst, src1, src2, src3); + BITSET_ANDN_OR_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset); +} + + +static bool +bitset_stats_andn_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3) +{ + BITSET_CHECK4_ (dst, src1, src2, src3); + return BITSET_ANDN_OR_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset); +} + + +static void +bitset_stats_or_and (bitset dst, bitset src1, bitset src2, bitset src3) +{ + BITSET_CHECK4_ (dst, src1, src2, src3); + BITSET_OR_AND_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset); +} + + +static bool +bitset_stats_or_and_cmp (bitset dst, bitset src1, bitset src2, bitset src3) +{ + BITSET_CHECK4_ (dst, src1, src2, src3); + return BITSET_OR_AND_CMP_ (dst->s.bset, src1->s.bset, src2->s.bset, src3->s.bset); +} + + +static bitset_bindex +bitset_stats_list (bitset bset, bitset_bindex *list, + bitset_bindex num, bitset_bindex *next) +{ + bitset_bindex count; + bitset_bindex tmp; + bitset_bindex size; + bitset_bindex i; + enum bitset_type type; + + count = BITSET_LIST_ (bset->s.bset, list, num, next); + + type = BITSET_TYPE_ (bset->s.bset); + BITSET_STATS_LISTS_INC (bset->s.bset); + + /* Log histogram of number of set bits. */ + for (i = 0, tmp = count; tmp; tmp >>= 1, i++) + continue; + if (i >= BITSET_LOG_COUNT_BINS) + i = BITSET_LOG_COUNT_BINS - 1; + BITSET_STATS_LIST_COUNTS_INC (bset->s.bset, i); + + /* Log histogram of number of bits in set. */ + size = BITSET_SIZE_ (bset->s.bset); + for (i = 0, tmp = size; tmp; tmp >>= 1, i++) + continue; + if (i >= BITSET_LOG_SIZE_BINS) + i = BITSET_LOG_SIZE_BINS - 1; + BITSET_STATS_LIST_SIZES_INC (bset->s.bset, i); + + /* Histogram of fraction of bits set. */ + i = size ? (count * BITSET_DENSITY_BINS) / size : 0; + if (i >= BITSET_DENSITY_BINS) + i = BITSET_DENSITY_BINS - 1; + BITSET_STATS_LIST_DENSITY_INC (bset->s.bset, i); + return count; +} + + +static bitset_bindex +bitset_stats_list_reverse (bitset bset, bitset_bindex *list, + bitset_bindex num, bitset_bindex *next) +{ + return BITSET_LIST_REVERSE_ (bset->s.bset, list, num, next); +} + + +static void +bitset_stats_free (bitset bset) +{ + BITSET_STATS_FREES_INC (bset->s.bset); + BITSET_FREE_ (bset->s.bset); +} + + +struct bitset_vtable bitset_stats_vtable = { + bitset_stats_set, + bitset_stats_reset, + bitset_stats_toggle, + bitset_stats_test, + bitset_stats_resize, + bitset_stats_size, + bitset_stats_count, + bitset_stats_empty_p, + bitset_stats_ones, + bitset_stats_zero, + bitset_stats_copy, + bitset_stats_disjoint_p, + bitset_stats_equal_p, + bitset_stats_not, + bitset_stats_subset_p, + bitset_stats_and, + bitset_stats_and_cmp, + bitset_stats_andn, + bitset_stats_andn_cmp, + bitset_stats_or, + bitset_stats_or_cmp, + bitset_stats_xor, + bitset_stats_xor_cmp, + bitset_stats_and_or, + bitset_stats_and_or_cmp, + bitset_stats_andn_or, + bitset_stats_andn_or_cmp, + bitset_stats_or_and, + bitset_stats_or_and_cmp, + bitset_stats_list, + bitset_stats_list_reverse, + bitset_stats_free, + BITSET_STATS +}; + + +/* Return enclosed bitset type. */ +enum bitset_type +bitset_stats_type_get (bitset bset) +{ + return BITSET_TYPE_ (bset->s.bset); +} + + +size_t +bitset_stats_bytes (void) +{ + return sizeof (struct bitset_stats_struct); +} + + +bitset +bitset_stats_init (bitset bset, bitset_bindex n_bits, enum bitset_type type) +{ + size_t bytes; + bitset sbset; + + bset->b.vtable = &bitset_stats_vtable; + + /* Disable cache. */ + bset->b.cindex = 0; + bset->b.csize = 0; + bset->b.cdata = 0; + + BITSET_NBITS_ (bset) = n_bits; + + /* Set up the actual bitset implementation that + we are a wrapper over. */ + switch (type) + { + case BITSET_ARRAY: + bytes = abitset_bytes (n_bits); + sbset = (bitset) xcalloc (1, bytes); + abitset_init (sbset, n_bits); + break; + + case BITSET_LIST: + bytes = lbitset_bytes (n_bits); + sbset = (bitset) xcalloc (1, bytes); + lbitset_init (sbset, n_bits); + break; + + case BITSET_TABLE: + bytes = ebitset_bytes (n_bits); + sbset = (bitset) xcalloc (1, bytes); + ebitset_init (sbset, n_bits); + break; + + case BITSET_VARRAY: + bytes = vbitset_bytes (n_bits); + sbset = (bitset) xcalloc (1, bytes); + vbitset_init (sbset, n_bits); + break; + + default: + abort (); + } + + bset->s.bset = sbset; + + BITSET_STATS_ALLOCS_INC (type); + + return bset; +} diff --git a/src/apps/bin/bison/lib/bitset_stats.h b/src/apps/bin/bison/lib/bitset_stats.h new file mode 100644 index 0000000000..2614c22fb5 --- /dev/null +++ b/src/apps/bin/bison/lib/bitset_stats.h @@ -0,0 +1,32 @@ +/* Functions to support bitset statistics. + Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _BITSET_STATS_H +#define _BITSET_STATS_H + +#include "bbitset.h" + +extern bool bitset_stats_enabled; + +extern enum bitset_type bitset_stats_type_get (bitset); + +extern size_t bitset_stats_bytes (void); + +extern bitset bitset_stats_init (bitset, bitset_bindex, enum bitset_type); + +#endif diff --git a/src/apps/bin/bison/lib/bitsetv-print.c b/src/apps/bin/bison/lib/bitsetv-print.c new file mode 100644 index 0000000000..5a624f596b --- /dev/null +++ b/src/apps/bin/bison/lib/bitsetv-print.c @@ -0,0 +1,74 @@ +/* Bitset vectors. + Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc. + +This file is part of Bison. + +Bison is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Bison is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with Bison; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "bitsetv-print.h" + +/*--------------------------------------------------------. +| Display the MATRIX array of SIZE bitsets of size SIZE. | +`--------------------------------------------------------*/ + +void +bitsetv_matrix_dump (FILE * out, const char *title, bitsetv bset) +{ + bitset_bindex i, j; + bitset_bindex hsize = bitset_size (bset[0]); + + /* Title. */ + fprintf (out, "%s BEGIN\n", title); + + /* Column numbers. */ + fputs (" ", out); + for (i = 0; i < hsize; ++i) + putc (i / 10 ? '0' + i / 10 : ' ', out); + putc ('\n', out); + fputs (" ", out); + for (i = 0; i < hsize; ++i) + fprintf (out, "%d", (int) (i % 10)); + putc ('\n', out); + + /* Bar. */ + fputs (" .", out); + for (i = 0; i < hsize; ++i) + putc ('-', out); + fputs (".\n", out); + + /* Contents. */ + for (i = 0; bset[i]; ++i) + { + fprintf (out, "%2lu|", (unsigned long int) i); + for (j = 0; j < hsize; ++j) + fputs (bitset_test (bset[i], j) ? "1" : " ", out); + fputs ("|\n", out); + } + + /* Bar. */ + fputs (" `", out); + for (i = 0; i < hsize; ++i) + putc ('-', out); + fputs ("'\n", out); + + /* End title. */ + fprintf (out, "%s END\n\n", title); +} diff --git a/src/apps/bin/bison/lib/bitsetv-print.h b/src/apps/bin/bison/lib/bitsetv-print.h new file mode 100644 index 0000000000..ccf99acf1d --- /dev/null +++ b/src/apps/bin/bison/lib/bitsetv-print.h @@ -0,0 +1,27 @@ +/* Bitset vectors. + Copyright (C) 2002, 2004 Free Software Foundation, Inc. + Contributed by Akim Demaille (akim@freefriends.org). + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _BITSETV_PRINT_H +#define _BITSETV_PRINT_H + +#include "bitsetv.h" + +/* Dump vector of bitsets as a matrix. */ +extern void bitsetv_matrix_dump (FILE *, const char *, bitsetv); + +#endif /* _BITSETV_H */ diff --git a/src/apps/bin/bison/lib/bitsetv.c b/src/apps/bin/bison/lib/bitsetv.c new file mode 100644 index 0000000000..42e0a3d791 --- /dev/null +++ b/src/apps/bin/bison/lib/bitsetv.c @@ -0,0 +1,172 @@ +/* Bitset vectors. + Copyright (C) 2001, 2002, 2004 Free Software Foundation, Inc. + +This file is part of GCC. + +GCC is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +GCC is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with GCC; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include +#include "bitsetv.h" + + +/* Create a vector of N_VECS bitsets, each of N_BITS, and of + type TYPE. */ +bitset * +bitsetv_alloc (bitset_bindex n_vecs, bitset_bindex n_bits, + enum bitset_type type) +{ + size_t vector_bytes; + size_t bytes; + bitset *bsetv; + bitset_bindex i; + + /* Determine number of bytes for each set. */ + bytes = bitset_bytes (type, n_bits); + + /* If size calculation overflows, memory is exhausted. */ + if (BITSET_SIZE_MAX / (sizeof (bitset) + bytes) <= n_vecs) + xalloc_die (); + + /* Allocate vector table at head of bitset array. */ + vector_bytes = (n_vecs + 1) * sizeof (bitset) + bytes - 1; + vector_bytes -= vector_bytes % bytes; + bsetv = (bitset *) xcalloc (1, vector_bytes + bytes * n_vecs); + + for (i = 0; i < n_vecs; i++) + { + bsetv[i] = (bitset) (void *) ((char *) bsetv + vector_bytes + i * bytes); + + bitset_init (bsetv[i], n_bits, type); + } + + /* Null terminate table. */ + bsetv[i] = 0; + return bsetv; +} + + +/* Create a vector of N_VECS bitsets, each of N_BITS, and with + attribute hints specified by ATTR. */ +bitset * +bitsetv_create (bitset_bindex n_vecs, bitset_bindex n_bits, unsigned int attr) +{ + enum bitset_type type; + + type = bitset_type_choose (n_bits, attr); + return bitsetv_alloc (n_vecs, n_bits, type); +} + + +/* Free bitset vector BSETV. */ +void +bitsetv_free (bitsetv bsetv) +{ + bitset_bindex i; + + for (i = 0; bsetv[i]; i++) + BITSET_FREE_ (bsetv[i]); + free (bsetv); +} + + +/* Zero a vector of bitsets. */ +void +bitsetv_zero (bitsetv bsetv) +{ + bitset_bindex i; + + for (i = 0; bsetv[i]; i++) + bitset_zero (bsetv[i]); +} + + +/* Set a vector of bitsets to ones. */ +void +bitsetv_ones (bitsetv bsetv) +{ + bitset_bindex i; + + for (i = 0; bsetv[i]; i++) + bitset_ones (bsetv[i]); +} + + +/* Given a vector BSETV of N bitsets of size N, modify its contents to + be the transitive closure of what was given. */ +void +bitsetv_transitive_closure (bitsetv bsetv) +{ + bitset_bindex i; + bitset_bindex j; + + for (i = 0; bsetv[i]; i++) + for (j = 0; bsetv[j]; j++) + if (bitset_test (bsetv[j], i)) + bitset_or (bsetv[j], bsetv[j], bsetv[i]); +} + + +/* Given a vector BSETV of N bitsets of size N, modify its contents to + be the reflexive transitive closure of what was given. This is + the same as transitive closure but with all bits on the diagonal + of the bit matrix set. */ +void +bitsetv_reflexive_transitive_closure (bitsetv bsetv) +{ + bitset_bindex i; + + bitsetv_transitive_closure (bsetv); + for (i = 0; bsetv[i]; i++) + bitset_set (bsetv[i], i); +} + + +/* Dump the contents of a bitset vector BSETV with N_VECS elements to + FILE. */ +void +bitsetv_dump (FILE *file, char const *title, char const *subtitle, + bitsetv bsetv) +{ + bitset_windex i; + + fprintf (file, "%s\n", title); + for (i = 0; bsetv[i]; i++) + { + fprintf (file, "%s %lu\n", subtitle, (unsigned long int) i); + bitset_dump (file, bsetv[i]); + } + + fprintf (file, "\n"); +} + + +void +debug_bitsetv (bitsetv bsetv) +{ + bitset_windex i; + + for (i = 0; bsetv[i]; i++) + { + fprintf (stderr, "%lu: ", (unsigned long int) i); + debug_bitset (bsetv[i]); + } + + fprintf (stderr, "\n"); +} diff --git a/src/apps/bin/bison/lib/bitsetv.h b/src/apps/bin/bison/lib/bitsetv.h new file mode 100644 index 0000000000..9065334e17 --- /dev/null +++ b/src/apps/bin/bison/lib/bitsetv.h @@ -0,0 +1,59 @@ +/* Bitset vectors. + Copyright (C) 2002, 2004 Free Software Foundation, Inc. + Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _BITSETV_H +#define _BITSETV_H + +#include "bitset.h" + +typedef bitset * bitsetv; + +/* Create a vector of N_VECS bitsets, each of N_BITS, and of + type TYPE. */ +extern bitsetv bitsetv_alloc (bitset_bindex, bitset_bindex, enum bitset_type); + +/* Create a vector of N_VECS bitsets, each of N_BITS, and with + attribute hints specified by ATTR. */ +extern bitsetv bitsetv_create (bitset_bindex, bitset_bindex, unsigned int); + +/* Free vector of bitsets. */ +extern void bitsetv_free (bitsetv); + +/* Zero vector of bitsets. */ +extern void bitsetv_zero (bitsetv); + +/* Set vector of bitsets. */ +extern void bitsetv_ones (bitsetv); + +/* Given a vector BSETV of N bitsets of size N, modify its contents to + be the transitive closure of what was given. */ +extern void bitsetv_transitive_closure (bitsetv); + +/* Given a vector BSETV of N bitsets of size N, modify its contents to + be the reflexive transitive closure of what was given. This is + the same as transitive closure but with all bits on the diagonal + of the bit matrix set. */ +extern void bitsetv_reflexive_transitive_closure (bitsetv); + +/* Dump vector of bitsets. */ +extern void bitsetv_dump (FILE *, const char *, const char *, bitsetv); + +/* Function to debug vector of bitsets from debugger. */ +extern void debug_bitsetv (bitsetv); + +#endif /* _BITSETV_H */ diff --git a/src/apps/bin/bison/lib/dirname.c b/src/apps/bin/bison/lib/dirname.c new file mode 100644 index 0000000000..815192a66f --- /dev/null +++ b/src/apps/bin/bison/lib/dirname.c @@ -0,0 +1,119 @@ +/* dirname.c -- return all but the last element in a path + Copyright (C) 1990, 1998, 2000, 2001, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +# include +#endif + +#include "dirname.h" + +#include +#include "xalloc.h" + +/* Return the length of `dirname (PATH)', or zero if PATH is + in the working directory. Works properly even if + there are trailing slashes (by effectively ignoring them). */ +size_t +dir_len (char const *path) +{ + size_t prefix_length = FILESYSTEM_PREFIX_LEN (path); + size_t length; + + /* Strip the basename and any redundant slashes before it. */ + for (length = base_name (path) - path; prefix_length < length; length--) + if (! ISSLASH (path[length - 1])) + return length; + + /* But don't strip the only slash from "/". */ + return prefix_length + ISSLASH (path[prefix_length]); +} + +/* Return the leading directories part of PATH, + allocated with xmalloc. + Works properly even if there are trailing slashes + (by effectively ignoring them). */ + +char * +dir_name (char const *path) +{ + size_t length = dir_len (path); + int append_dot = (length == FILESYSTEM_PREFIX_LEN (path)); + char *newpath = xmalloc (length + append_dot + 1); + memcpy (newpath, path, length); + if (append_dot) + newpath[length++] = '.'; + newpath[length] = 0; + return newpath; +} + +#ifdef TEST_DIRNAME +/* + +Run the test like this (expect no output): + gcc -DHAVE_CONFIG_H -DTEST_DIRNAME -I.. -O -Wall \ + basename.c dirname.c xmalloc.c error.c + sed -n '/^BEGIN-DATA$/,/^END-DATA$/p' dirname.c|grep -v DATA|./a.out + +If it's been built on a DOS or Windows platforms, run another test like +this (again, expect no output): + sed -n '/^BEGIN-DOS-DATA$/,/^END-DOS-DATA$/p' dirname.c|grep -v DATA|./a.out + +BEGIN-DATA +foo//// . +bar/foo//// bar +foo/ . +/ / +. . +a . +END-DATA + +BEGIN-DOS-DATA +c:///// c:/ +c:/ c:/ +c:/. c:/ +c:foo c:. +c:foo/bar c:foo +END-DOS-DATA + +*/ + +# define MAX_BUFF_LEN 1024 +# include + +char *program_name; + +int +main (int argc, char *argv[]) +{ + char buff[MAX_BUFF_LEN + 1]; + + program_name = argv[0]; + + buff[MAX_BUFF_LEN] = 0; + while (fgets (buff, MAX_BUFF_LEN, stdin) && buff[0]) + { + char path[MAX_BUFF_LEN]; + char expected_result[MAX_BUFF_LEN]; + char const *result; + sscanf (buff, "%s %s", path, expected_result); + result = dir_name (path); + if (strcmp (result, expected_result)) + printf ("%s: got %s, expected %s\n", path, result, expected_result); + } + return 0; +} +#endif diff --git a/src/apps/bin/bison/lib/dirname.h b/src/apps/bin/bison/lib/dirname.h new file mode 100644 index 0000000000..62da37dc9a --- /dev/null +++ b/src/apps/bin/bison/lib/dirname.h @@ -0,0 +1,43 @@ +/* Take file names apart into directory and base names. + + Copyright (C) 1998, 2001, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef DIRNAME_H_ +# define DIRNAME_H_ 1 + +# include + +# ifndef DIRECTORY_SEPARATOR +# define DIRECTORY_SEPARATOR '/' +# endif + +# ifndef ISSLASH +# define ISSLASH(C) ((C) == DIRECTORY_SEPARATOR) +# endif + +# ifndef FILESYSTEM_PREFIX_LEN +# define FILESYSTEM_PREFIX_LEN(Filename) 0 +# endif + +char *base_name (char const *path); +char *dir_name (char const *path); +size_t base_len (char const *path); +size_t dir_len (char const *path); + +int strip_trailing_slashes (char *path); + +#endif /* not DIRNAME_H_ */ diff --git a/src/apps/bin/bison/lib/ebitset.c b/src/apps/bin/bison/lib/ebitset.c new file mode 100644 index 0000000000..6006c0e244 --- /dev/null +++ b/src/apps/bin/bison/lib/ebitset.c @@ -0,0 +1,1367 @@ +/* Functions to support expandable bitsets. + Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "ebitset.h" +#include "obstack.h" +#include +#include + +/* This file implements expandable bitsets. These bitsets can be of + arbitrary length and are more efficient than arrays of bits for + large sparse sets. + + Empty elements are represented by a NULL pointer in the table of + element pointers. An alternative is to point to a special zero + element. Similarly, we could represent an all 1's element with + another special ones element pointer. + + Bitsets are commonly empty so we need to ensure that this special + case is fast. A zero bitset is indicated when cdata is 0. This is + conservative since cdata may be non zero and the bitset may still + be zero. + + The bitset cache can be disabled either by setting cindex to + BITSET_WINDEX_MAX or by setting csize to 0. Here + we use the former approach since cindex needs to be updated whenever + cdata is changed. +*/ + + +/* Number of words to use for each element. */ +#define EBITSET_ELT_WORDS 2 + +/* Number of bits stored in each element. */ +#define EBITSET_ELT_BITS \ + ((unsigned int) (EBITSET_ELT_WORDS * BITSET_WORD_BITS)) + +/* Ebitset element. We use an array of bits. */ +typedef struct ebitset_elt_struct +{ + union + { + bitset_word words[EBITSET_ELT_WORDS]; /* Bits that are set. */ + struct ebitset_elt_struct *next; + } + u; +} +ebitset_elt; + + +typedef ebitset_elt *ebitset_elts; + + +/* Number of elements to initially allocate. */ + +#ifndef EBITSET_INITIAL_SIZE +#define EBITSET_INITIAL_SIZE 2 +#endif + + +enum ebitset_find_mode + { EBITSET_FIND, EBITSET_CREATE, EBITSET_SUBST }; + +static ebitset_elt ebitset_zero_elts[1]; /* Elements of all zero bits. */ + +/* Obstack to allocate bitset elements from. */ +static struct obstack ebitset_obstack; +static bool ebitset_obstack_init = false; +static ebitset_elt *ebitset_free_list; /* Free list of bitset elements. */ + +#define EBITSET_N_ELTS(N) (((N) + EBITSET_ELT_BITS - 1) / EBITSET_ELT_BITS) +#define EBITSET_ELTS(BSET) ((BSET)->e.elts) +#define EBITSET_SIZE(BSET) EBITSET_N_ELTS (BITSET_NBITS_ (BSET)) +#define EBITSET_ASIZE(BSET) ((BSET)->e.size) + +#define EBITSET_NEXT(ELT) ((ELT)->u.next) +#define EBITSET_WORDS(ELT) ((ELT)->u.words) + +/* Disable bitset cache and mark BSET as being zero. */ +#define EBITSET_ZERO_SET(BSET) ((BSET)->b.cindex = BITSET_WINDEX_MAX, \ + (BSET)->b.cdata = 0) + +#define EBITSET_CACHE_DISABLE(BSET) ((BSET)->b.cindex = BITSET_WINDEX_MAX) + +/* Disable bitset cache and mark BSET as being possibly non-zero. */ +#define EBITSET_NONZERO_SET(BSET) \ + (EBITSET_CACHE_DISABLE (BSET), (BSET)->b.cdata = (bitset_word *)~0) + +/* A conservative estimate of whether the bitset is zero. + This is non-zero only if we know for sure that the bitset is zero. */ +#define EBITSET_ZERO_P(BSET) ((BSET)->b.cdata == 0) + +/* Enable cache to point to element with table index EINDEX. + The element must exist. */ +#define EBITSET_CACHE_SET(BSET, EINDEX) \ + ((BSET)->b.cindex = (EINDEX) * EBITSET_ELT_WORDS, \ + (BSET)->b.cdata = EBITSET_WORDS (EBITSET_ELTS (BSET) [EINDEX])) + + +#define min(a, b) ((a) > (b) ? (b) : (a)) +#define max(a, b) ((a) > (b) ? (a) : (b)) + + +static bitset_bindex +ebitset_resize (bitset src, bitset_bindex n_bits) +{ + bitset_windex oldsize; + bitset_windex newsize; + + if (n_bits == BITSET_NBITS_ (src)) + return n_bits; + + oldsize = EBITSET_SIZE (src); + newsize = EBITSET_N_ELTS (n_bits); + + if (oldsize < newsize) + { + bitset_windex size; + + /* The bitset needs to grow. If we already have enough memory + allocated, then just zero what we need. */ + if (newsize > EBITSET_ASIZE (src)) + { + /* We need to allocate more memory. When oldsize is + non-zero this means that we are changing the size, so + grow the bitset 25% larger than requested to reduce + number of reallocations. */ + + if (oldsize == 0) + size = newsize; + else + size = newsize + newsize / 4; + + EBITSET_ELTS (src) + = realloc (EBITSET_ELTS (src), size * sizeof (ebitset_elt *)); + EBITSET_ASIZE (src) = size; + } + + memset (EBITSET_ELTS (src) + oldsize, 0, + (newsize - oldsize) * sizeof (ebitset_elt *)); + } + else + { + /* The bitset needs to shrink. There's no point deallocating + the memory unless it is shrinking by a reasonable amount. */ + if ((oldsize - newsize) >= oldsize / 2) + { + EBITSET_ELTS (src) + = realloc (EBITSET_ELTS (src), newsize * sizeof (ebitset_elt *)); + EBITSET_ASIZE (src) = newsize; + } + + /* Need to prune any excess bits. FIXME. */ + } + + BITSET_NBITS_ (src) = n_bits; + return n_bits; +} + + +/* Allocate a ebitset element. The bits are not cleared. */ +static inline ebitset_elt * +ebitset_elt_alloc (void) +{ + ebitset_elt *elt; + + if (ebitset_free_list != 0) + { + elt = ebitset_free_list; + ebitset_free_list = EBITSET_NEXT (elt); + } + else + { + if (!ebitset_obstack_init) + { + ebitset_obstack_init = true; + + /* Let particular systems override the size of a chunk. */ + +#ifndef OBSTACK_CHUNK_SIZE +#define OBSTACK_CHUNK_SIZE 0 +#endif + + /* Let them override the alloc and free routines too. */ + +#ifndef OBSTACK_CHUNK_ALLOC +#define OBSTACK_CHUNK_ALLOC xmalloc +#endif + +#ifndef OBSTACK_CHUNK_FREE +#define OBSTACK_CHUNK_FREE free +#endif + +#if !defined(__GNUC__) || (__GNUC__ < 2) +#define __alignof__(type) 0 +#endif + + obstack_specify_allocation (&ebitset_obstack, OBSTACK_CHUNK_SIZE, + __alignof__ (ebitset_elt), + OBSTACK_CHUNK_ALLOC, + OBSTACK_CHUNK_FREE); + } + + /* Perhaps we should add a number of new elements to the free + list. */ + elt = (ebitset_elt *) obstack_alloc (&ebitset_obstack, + sizeof (ebitset_elt)); + } + + return elt; +} + + +/* Allocate a ebitset element. The bits are cleared. */ +static inline ebitset_elt * +ebitset_elt_calloc (void) +{ + ebitset_elt *elt; + + elt = ebitset_elt_alloc (); + memset (EBITSET_WORDS (elt), 0, sizeof (EBITSET_WORDS (elt))); + return elt; +} + + +static inline void +ebitset_elt_free (ebitset_elt *elt) +{ + EBITSET_NEXT (elt) = ebitset_free_list; + ebitset_free_list = elt; +} + + +/* Remove element with index EINDEX from bitset BSET. */ +static inline void +ebitset_elt_remove (bitset bset, bitset_windex eindex) +{ + ebitset_elts *elts; + ebitset_elt *elt; + + elts = EBITSET_ELTS (bset); + + elt = elts[eindex]; + + elts[eindex] = 0; + ebitset_elt_free (elt); +} + + +/* Add ELT into elts at index EINDEX of bitset BSET. */ +static inline void +ebitset_elt_add (bitset bset, ebitset_elt *elt, bitset_windex eindex) +{ + ebitset_elts *elts; + + elts = EBITSET_ELTS (bset); + /* Assume that the elts entry not allocated. */ + elts[eindex] = elt; +} + + +/* Are all bits in an element zero? */ +static inline bool +ebitset_elt_zero_p (ebitset_elt *elt) +{ + int i; + + for (i = 0; i < EBITSET_ELT_WORDS; i++) + if (EBITSET_WORDS (elt)[i]) + return false; + + return true; +} + + +static ebitset_elt * +ebitset_elt_find (bitset bset, bitset_bindex bindex, + enum ebitset_find_mode mode) +{ + ebitset_elt *elt; + bitset_windex size; + bitset_windex eindex; + ebitset_elts *elts; + + eindex = bindex / EBITSET_ELT_BITS; + + elts = EBITSET_ELTS (bset); + size = EBITSET_SIZE (bset); + + if (eindex < size) + { + if ((elt = elts[eindex])) + { + if (EBITSET_WORDS (elt) == bset->b.cdata) + return elt; + + EBITSET_CACHE_SET (bset, eindex); + return elt; + } + } + + /* The element could not be found. */ + + switch (mode) + { + case EBITSET_FIND: + return 0; + + case EBITSET_CREATE: + if (eindex >= size) + ebitset_resize (bset, bindex); + + /* Create a new element. */ + elt = ebitset_elt_calloc (); + ebitset_elt_add (bset, elt, eindex); + EBITSET_CACHE_SET (bset, eindex); + return elt; + + case EBITSET_SUBST: + return &ebitset_zero_elts[0]; + + default: + abort (); + } +} + + +/* Weed out the zero elements from the elts. */ +static inline bitset_windex +ebitset_weed (bitset bset) +{ + ebitset_elts *elts; + bitset_windex j; + bitset_windex count; + + if (EBITSET_ZERO_P (bset)) + return 0; + + elts = EBITSET_ELTS (bset); + count = 0; + for (j = 0; j < EBITSET_SIZE (bset); j++) + { + ebitset_elt *elt = elts[j]; + + if (elt) + { + if (ebitset_elt_zero_p (elt)) + { + ebitset_elt_remove (bset, j); + count++; + } + } + else + count++; + } + + count = j - count; + if (!count) + { + /* All the bits are zero. We could shrink the elts. + For now just mark BSET as known to be zero. */ + EBITSET_ZERO_SET (bset); + } + else + EBITSET_NONZERO_SET (bset); + + return count; +} + + +/* Set all bits in the bitset to zero. */ +static inline void +ebitset_zero (bitset bset) +{ + ebitset_elts *elts; + bitset_windex j; + + if (EBITSET_ZERO_P (bset)) + return; + + elts = EBITSET_ELTS (bset); + for (j = 0; j < EBITSET_SIZE (bset); j++) + { + ebitset_elt *elt = elts[j]; + + if (elt) + ebitset_elt_remove (bset, j); + } + + /* All the bits are zero. We could shrink the elts. + For now just mark BSET as known to be zero. */ + EBITSET_ZERO_SET (bset); +} + + +static inline bool +ebitset_equal_p (bitset dst, bitset src) +{ + ebitset_elts *selts; + ebitset_elts *delts; + bitset_windex j; + + if (src == dst) + return true; + + ebitset_weed (dst); + ebitset_weed (src); + + if (EBITSET_SIZE (src) != EBITSET_SIZE (dst)) + return false; + + selts = EBITSET_ELTS (src); + delts = EBITSET_ELTS (dst); + + for (j = 0; j < EBITSET_SIZE (src); j++) + { + unsigned int i; + ebitset_elt *selt = selts[j]; + ebitset_elt *delt = delts[j]; + + if (!selt && !delt) + continue; + if ((selt && !delt) || (!selt && delt)) + return false; + + for (i = 0; i < EBITSET_ELT_WORDS; i++) + if (EBITSET_WORDS (selt)[i] != EBITSET_WORDS (delt)[i]) + return false; + } + return true; +} + + +/* Copy bits from bitset SRC to bitset DST. */ +static inline void +ebitset_copy_ (bitset dst, bitset src) +{ + ebitset_elts *selts; + ebitset_elts *delts; + bitset_windex j; + + if (src == dst) + return; + + ebitset_zero (dst); + + if (BITSET_NBITS_ (dst) != BITSET_NBITS_ (src)) + ebitset_resize (dst, BITSET_NBITS_ (src)); + + selts = EBITSET_ELTS (src); + delts = EBITSET_ELTS (dst); + for (j = 0; j < EBITSET_SIZE (src); j++) + { + ebitset_elt *selt = selts[j]; + + if (selt) + { + ebitset_elt *tmp; + + tmp = ebitset_elt_alloc (); + delts[j] = tmp; + memcpy (EBITSET_WORDS (tmp), EBITSET_WORDS (selt), + sizeof (EBITSET_WORDS (selt))); + } + } + EBITSET_NONZERO_SET (dst); +} + + +/* Copy bits from bitset SRC to bitset DST. Return true if + bitsets different. */ +static inline bool +ebitset_copy_cmp (bitset dst, bitset src) +{ + if (src == dst) + return false; + + if (EBITSET_ZERO_P (dst)) + { + ebitset_copy_ (dst, src); + return !EBITSET_ZERO_P (src); + } + + if (ebitset_equal_p (dst, src)) + return false; + + ebitset_copy_ (dst, src); + return true; +} + + +/* Set bit BITNO in bitset DST. */ +static void +ebitset_set (bitset dst, bitset_bindex bitno) +{ + bitset_windex windex = bitno / BITSET_WORD_BITS; + + ebitset_elt_find (dst, bitno, EBITSET_CREATE); + + dst->b.cdata[windex - dst->b.cindex] |= + (bitset_word) 1 << (bitno % BITSET_WORD_BITS); +} + + +/* Reset bit BITNO in bitset DST. */ +static void +ebitset_reset (bitset dst, bitset_bindex bitno) +{ + bitset_windex windex = bitno / BITSET_WORD_BITS; + + if (!ebitset_elt_find (dst, bitno, EBITSET_FIND)) + return; + + dst->b.cdata[windex - dst->b.cindex] &= + ~((bitset_word) 1 << (bitno % BITSET_WORD_BITS)); + + /* If all the data is zero, perhaps we should remove it now... + However, there is a good chance that the element will be needed + again soon. */ +} + + +/* Test bit BITNO in bitset SRC. */ +static bool +ebitset_test (bitset src, bitset_bindex bitno) +{ + bitset_windex windex = bitno / BITSET_WORD_BITS; + + return (ebitset_elt_find (src, bitno, EBITSET_FIND) + && ((src->b.cdata[windex - src->b.cindex] + >> (bitno % BITSET_WORD_BITS)) + & 1)); +} + + +static void +ebitset_free (bitset bset) +{ + ebitset_zero (bset); + free (EBITSET_ELTS (bset)); +} + + +/* Find list of up to NUM bits set in BSET starting from and including + *NEXT and store in array LIST. Return with actual number of bits + found and with *NEXT indicating where search stopped. */ +static bitset_bindex +ebitset_list_reverse (bitset bset, bitset_bindex *list, + bitset_bindex num, bitset_bindex *next) +{ + bitset_bindex n_bits; + bitset_bindex bitno; + bitset_bindex rbitno; + unsigned int bcount; + bitset_bindex boffset; + bitset_windex windex; + bitset_windex eindex; + bitset_windex woffset; + bitset_bindex count; + bitset_windex size; + ebitset_elts *elts; + + if (EBITSET_ZERO_P (bset)) + return 0; + + size = EBITSET_SIZE (bset); + n_bits = size * EBITSET_ELT_BITS; + rbitno = *next; + + if (rbitno >= n_bits) + return 0; + + elts = EBITSET_ELTS (bset); + + bitno = n_bits - (rbitno + 1); + + windex = bitno / BITSET_WORD_BITS; + eindex = bitno / EBITSET_ELT_BITS; + woffset = windex - eindex * EBITSET_ELT_WORDS; + + /* If num is 1, we could speed things up with a binary search + of the word of interest. */ + + count = 0; + bcount = bitno % BITSET_WORD_BITS; + boffset = windex * BITSET_WORD_BITS; + + do + { + ebitset_elt *elt; + bitset_word *srcp; + + elt = elts[eindex]; + if (elt) + { + srcp = EBITSET_WORDS (elt); + + do + { + bitset_word word; + + word = srcp[woffset] << (BITSET_WORD_BITS - 1 - bcount); + + for (; word; bcount--) + { + if (word & BITSET_MSB) + { + list[count++] = boffset + bcount; + if (count >= num) + { + *next = n_bits - (boffset + bcount); + return count; + } + } + word <<= 1; + } + boffset -= BITSET_WORD_BITS; + bcount = BITSET_WORD_BITS - 1; + } + while (woffset--); + } + + woffset = EBITSET_ELT_WORDS - 1; + boffset = eindex * EBITSET_ELT_BITS - BITSET_WORD_BITS; + } + while (eindex--); + + *next = n_bits - (boffset + 1); + return count; +} + + +/* Find list of up to NUM bits set in BSET starting from and including + *NEXT and store in array LIST. Return with actual number of bits + found and with *NEXT indicating where search stopped. */ +static bitset_bindex +ebitset_list (bitset bset, bitset_bindex *list, + bitset_bindex num, bitset_bindex *next) +{ + bitset_bindex bitno; + bitset_windex windex; + bitset_windex eindex; + bitset_bindex count; + bitset_windex size; + ebitset_elt *elt; + bitset_word word; + ebitset_elts *elts; + + if (EBITSET_ZERO_P (bset)) + return 0; + + bitno = *next; + count = 0; + + elts = EBITSET_ELTS (bset); + size = EBITSET_SIZE (bset); + eindex = bitno / EBITSET_ELT_BITS; + + if (bitno % EBITSET_ELT_BITS) + { + /* We need to start within an element. This is not very common. */ + + elt = elts[eindex]; + if (elt) + { + bitset_windex woffset; + bitset_word *srcp = EBITSET_WORDS (elt); + + windex = bitno / BITSET_WORD_BITS; + woffset = eindex * EBITSET_ELT_WORDS; + + for (; (windex - woffset) < EBITSET_ELT_WORDS; windex++) + { + word = srcp[windex - woffset] >> (bitno % BITSET_WORD_BITS); + + for (; word; bitno++) + { + if (word & 1) + { + list[count++] = bitno; + if (count >= num) + { + *next = bitno + 1; + return count; + } + } + word >>= 1; + } + bitno = (windex + 1) * BITSET_WORD_BITS; + } + } + + /* Skip to next element. */ + eindex++; + } + + /* If num is 1, we could speed things up with a binary search + of the word of interest. */ + + for (; eindex < size; eindex++) + { + int i; + bitset_word *srcp; + + elt = elts[eindex]; + if (!elt) + continue; + + srcp = EBITSET_WORDS (elt); + windex = eindex * EBITSET_ELT_WORDS; + + if ((count + EBITSET_ELT_BITS) < num) + { + /* The coast is clear, plant boot! */ + +#if EBITSET_ELT_WORDS == 2 + word = srcp[0]; + if (word) + { + if (!(word & 0xffff)) + { + word >>= 16; + bitno += 16; + } + if (!(word & 0xff)) + { + word >>= 8; + bitno += 8; + } + for (; word; bitno++) + { + if (word & 1) + list[count++] = bitno; + word >>= 1; + } + } + windex++; + bitno = windex * BITSET_WORD_BITS; + + word = srcp[1]; + if (word) + { + if (!(word & 0xffff)) + { + word >>= 16; + bitno += 16; + } + for (; word; bitno++) + { + if (word & 1) + list[count++] = bitno; + word >>= 1; + } + } + windex++; + bitno = windex * BITSET_WORD_BITS; +#else + for (i = 0; i < EBITSET_ELT_WORDS; i++, windex++) + { + bitno = windex * BITSET_WORD_BITS; + + word = srcp[i]; + if (word) + { + if (!(word & 0xffff)) + { + word >>= 16; + bitno += 16; + } + if (!(word & 0xff)) + { + word >>= 8; + bitno += 8; + } + for (; word; bitno++) + { + if (word & 1) + list[count++] = bitno; + word >>= 1; + } + } + } +#endif + } + else + { + /* Tread more carefully since we need to check + if array overflows. */ + + for (i = 0; i < EBITSET_ELT_WORDS; i++, windex++) + { + bitno = windex * BITSET_WORD_BITS; + + for (word = srcp[i]; word; bitno++) + { + if (word & 1) + { + list[count++] = bitno; + if (count >= num) + { + *next = bitno + 1; + return count; + } + } + word >>= 1; + } + } + } + } + + *next = bitno; + return count; +} + + +/* Ensure that any unused bits within the last element are clear. */ +static inline void +ebitset_unused_clear (bitset dst) +{ + unsigned int last_bit; + bitset_bindex n_bits; + + n_bits = BITSET_NBITS_ (dst); + last_bit = n_bits % EBITSET_ELT_BITS; + + if (last_bit) + { + bitset_windex eindex; + ebitset_elts *elts; + ebitset_elt *elt; + + elts = EBITSET_ELTS (dst); + + eindex = n_bits / EBITSET_ELT_BITS; + + elt = elts[eindex]; + if (elt) + { + bitset_windex windex; + bitset_windex woffset; + bitset_word *srcp = EBITSET_WORDS (elt); + + windex = n_bits / BITSET_WORD_BITS; + woffset = eindex * EBITSET_ELT_WORDS; + + srcp[windex - woffset] &= ((bitset_word) 1 << last_bit) - 1; + windex++; + for (; (windex - woffset) < EBITSET_ELT_WORDS; windex++) + srcp[windex - woffset] = 0; + } + } +} + + +static void +ebitset_ones (bitset dst) +{ + bitset_windex j; + ebitset_elt *elt; + + for (j = 0; j < EBITSET_SIZE (dst); j++) + { + /* Create new elements if they cannot be found. Perhaps + we should just add pointers to a ones element? */ + elt = + ebitset_elt_find (dst, j * EBITSET_ELT_BITS, EBITSET_CREATE); + memset (EBITSET_WORDS (elt), -1, sizeof (EBITSET_WORDS (elt))); + } + EBITSET_NONZERO_SET (dst); + ebitset_unused_clear (dst); +} + + +static bool +ebitset_empty_p (bitset dst) +{ + ebitset_elts *elts; + bitset_windex j; + + if (EBITSET_ZERO_P (dst)) + return 1; + + elts = EBITSET_ELTS (dst); + for (j = 0; j < EBITSET_SIZE (dst); j++) + { + ebitset_elt *elt = elts[j]; + + if (elt) + { + if (!ebitset_elt_zero_p (elt)) + return 0; + /* Do some weeding as we go. */ + ebitset_elt_remove (dst, j); + } + } + + /* All the bits are zero. We could shrink the elts. + For now just mark DST as known to be zero. */ + EBITSET_ZERO_SET (dst); + return 1; +} + + +static void +ebitset_not (bitset dst, bitset src) +{ + unsigned int i; + ebitset_elt *selt; + ebitset_elt *delt; + bitset_windex j; + + ebitset_resize (dst, BITSET_NBITS_ (src)); + + for (j = 0; j < EBITSET_SIZE (src); j++) + { + /* Create new elements for dst if they cannot be found + or substitute zero elements if src elements not found. */ + selt = + ebitset_elt_find (dst, j * EBITSET_ELT_BITS, EBITSET_SUBST); + delt = + ebitset_elt_find (dst, j * EBITSET_ELT_BITS, EBITSET_CREATE); + + for (i = 0; i < EBITSET_ELT_WORDS; i++) + EBITSET_WORDS (delt)[i] = ~EBITSET_WORDS (selt)[i]; + } + EBITSET_NONZERO_SET (dst); + ebitset_unused_clear (dst); +} + + +/* Is DST == DST | SRC? */ +static bool +ebitset_subset_p (bitset dst, bitset src) +{ + bitset_windex j; + ebitset_elts *selts; + ebitset_elts *delts; + bitset_windex ssize; + bitset_windex dsize; + + selts = EBITSET_ELTS (src); + delts = EBITSET_ELTS (dst); + + ssize = EBITSET_SIZE (src); + dsize = EBITSET_SIZE (dst); + + for (j = 0; j < ssize; j++) + { + unsigned int i; + ebitset_elt *selt; + ebitset_elt *delt; + + selt = j < ssize ? selts[j] : 0; + delt = j < dsize ? delts[j] : 0; + + if (!selt && !delt) + continue; + + if (!selt) + selt = &ebitset_zero_elts[0]; + if (!delt) + delt = &ebitset_zero_elts[0]; + + for (i = 0; i < EBITSET_ELT_WORDS; i++) + if (EBITSET_WORDS (delt)[i] + != (EBITSET_WORDS (selt)[i] | EBITSET_WORDS (delt)[i])) + return false; + } + return true; +} + + +/* Is DST & SRC == 0? */ +static bool +ebitset_disjoint_p (bitset dst, bitset src) +{ + bitset_windex j; + ebitset_elts *selts; + ebitset_elts *delts; + bitset_windex ssize; + bitset_windex dsize; + + selts = EBITSET_ELTS (src); + delts = EBITSET_ELTS (dst); + + ssize = EBITSET_SIZE (src); + dsize = EBITSET_SIZE (dst); + + for (j = 0; j < ssize; j++) + { + unsigned int i; + ebitset_elt *selt; + ebitset_elt *delt; + + selt = j < ssize ? selts[j] : 0; + delt = j < dsize ? delts[j] : 0; + + if (!selt || !delt) + continue; + + for (i = 0; i < EBITSET_ELT_WORDS; i++) + if ((EBITSET_WORDS (selt)[i] & EBITSET_WORDS (delt)[i])) + return false; + } + return true; +} + + + +static bool +ebitset_op3_cmp (bitset dst, bitset src1, bitset src2, enum bitset_ops op) +{ + bitset_windex ssize1; + bitset_windex ssize2; + bitset_windex dsize; + bitset_windex size; + ebitset_elts *selts1; + ebitset_elts *selts2; + ebitset_elts *delts; + bitset_word *srcp1; + bitset_word *srcp2; + bitset_word *dstp; + bool changed = false; + unsigned int i; + bitset_windex j; + + ebitset_resize (dst, max (BITSET_NBITS_ (src1), BITSET_NBITS_ (src2))); + + ssize1 = EBITSET_SIZE (src1); + ssize2 = EBITSET_SIZE (src2); + dsize = EBITSET_SIZE (dst); + size = ssize1; + if (size < ssize2) + size = ssize2; + + selts1 = EBITSET_ELTS (src1); + selts2 = EBITSET_ELTS (src2); + delts = EBITSET_ELTS (dst); + + for (j = 0; j < size; j++) + { + ebitset_elt *selt1; + ebitset_elt *selt2; + ebitset_elt *delt; + + selt1 = j < ssize1 ? selts1[j] : 0; + selt2 = j < ssize2 ? selts2[j] : 0; + delt = j < dsize ? delts[j] : 0; + + if (!selt1 && !selt2) + { + if (delt) + { + changed = true; + ebitset_elt_remove (dst, j); + } + continue; + } + + if (!selt1) + selt1 = &ebitset_zero_elts[0]; + if (!selt2) + selt2 = &ebitset_zero_elts[0]; + if (!delt) + delt = ebitset_elt_calloc (); + else + delts[j] = 0; + + srcp1 = EBITSET_WORDS (selt1); + srcp2 = EBITSET_WORDS (selt2); + dstp = EBITSET_WORDS (delt); + switch (op) + { + case BITSET_OP_OR: + for (i = 0; i < EBITSET_ELT_WORDS; i++, dstp++) + { + bitset_word tmp = *srcp1++ | *srcp2++; + + if (*dstp != tmp) + { + changed = true; + *dstp = tmp; + } + } + break; + + case BITSET_OP_AND: + for (i = 0; i < EBITSET_ELT_WORDS; i++, dstp++) + { + bitset_word tmp = *srcp1++ & *srcp2++; + + if (*dstp != tmp) + { + changed = true; + *dstp = tmp; + } + } + break; + + case BITSET_OP_XOR: + for (i = 0; i < EBITSET_ELT_WORDS; i++, dstp++) + { + bitset_word tmp = *srcp1++ ^ *srcp2++; + + if (*dstp != tmp) + { + changed = true; + *dstp = tmp; + } + } + break; + + case BITSET_OP_ANDN: + for (i = 0; i < EBITSET_ELT_WORDS; i++, dstp++) + { + bitset_word tmp = *srcp1++ & ~(*srcp2++); + + if (*dstp != tmp) + { + changed = true; + *dstp = tmp; + } + } + break; + + default: + abort (); + } + + if (!ebitset_elt_zero_p (delt)) + { + ebitset_elt_add (dst, delt, j); + } + else + { + ebitset_elt_free (delt); + } + } + + /* If we have elements of DST left over, free them all. */ + for (; j < dsize; j++) + { + ebitset_elt *delt; + + changed = true; + + delt = delts[j]; + + if (delt) + ebitset_elt_remove (dst, j); + } + + EBITSET_NONZERO_SET (dst); + return changed; +} + + +static bool +ebitset_and_cmp (bitset dst, bitset src1, bitset src2) +{ + bool changed; + + if (EBITSET_ZERO_P (src2)) + { + ebitset_weed (dst); + changed = EBITSET_ZERO_P (dst); + ebitset_zero (dst); + return changed; + } + else if (EBITSET_ZERO_P (src1)) + { + ebitset_weed (dst); + changed = EBITSET_ZERO_P (dst); + ebitset_zero (dst); + return changed; + } + return ebitset_op3_cmp (dst, src1, src2, BITSET_OP_AND); +} + + +static void +ebitset_and (bitset dst, bitset src1, bitset src2) +{ + ebitset_and_cmp (dst, src1, src2); +} + + +static bool +ebitset_andn_cmp (bitset dst, bitset src1, bitset src2) +{ + bool changed; + + if (EBITSET_ZERO_P (src2)) + { + return ebitset_copy_cmp (dst, src1); + } + else if (EBITSET_ZERO_P (src1)) + { + ebitset_weed (dst); + changed = EBITSET_ZERO_P (dst); + ebitset_zero (dst); + return changed; + } + return ebitset_op3_cmp (dst, src1, src2, BITSET_OP_ANDN); +} + + +static void +ebitset_andn (bitset dst, bitset src1, bitset src2) +{ + ebitset_andn_cmp (dst, src1, src2); +} + + +static bool +ebitset_or_cmp (bitset dst, bitset src1, bitset src2) +{ + if (EBITSET_ZERO_P (src2)) + { + return ebitset_copy_cmp (dst, src1); + } + else if (EBITSET_ZERO_P (src1)) + { + return ebitset_copy_cmp (dst, src2); + } + return ebitset_op3_cmp (dst, src1, src2, BITSET_OP_OR); +} + + +static void +ebitset_or (bitset dst, bitset src1, bitset src2) +{ + ebitset_or_cmp (dst, src1, src2); +} + + +static bool +ebitset_xor_cmp (bitset dst, bitset src1, bitset src2) +{ + if (EBITSET_ZERO_P (src2)) + { + return ebitset_copy_cmp (dst, src1); + } + else if (EBITSET_ZERO_P (src1)) + { + return ebitset_copy_cmp (dst, src2); + } + return ebitset_op3_cmp (dst, src1, src2, BITSET_OP_XOR); +} + + +static void +ebitset_xor (bitset dst, bitset src1, bitset src2) +{ + ebitset_xor_cmp (dst, src1, src2); +} + + +static void +ebitset_copy (bitset dst, bitset src) +{ + if (BITSET_COMPATIBLE_ (dst, src)) + ebitset_copy_ (dst, src); + else + bitset_copy_ (dst, src); +} + + +/* Vector of operations for linked-list bitsets. */ +struct bitset_vtable ebitset_vtable = { + ebitset_set, + ebitset_reset, + bitset_toggle_, + ebitset_test, + ebitset_resize, + bitset_size_, + bitset_count_, + ebitset_empty_p, + ebitset_ones, + ebitset_zero, + ebitset_copy, + ebitset_disjoint_p, + ebitset_equal_p, + ebitset_not, + ebitset_subset_p, + ebitset_and, + ebitset_and_cmp, + ebitset_andn, + ebitset_andn_cmp, + ebitset_or, + ebitset_or_cmp, + ebitset_xor, + ebitset_xor_cmp, + bitset_and_or_, + bitset_and_or_cmp_, + bitset_andn_or_, + bitset_andn_or_cmp_, + bitset_or_and_, + bitset_or_and_cmp_, + ebitset_list, + ebitset_list_reverse, + ebitset_free, + BITSET_TABLE +}; + + +/* Return size of initial structure. */ +size_t +ebitset_bytes (bitset_bindex n_bits ATTRIBUTE_UNUSED) +{ + return sizeof (struct ebitset_struct); +} + + +/* Initialize a bitset. */ + +bitset +ebitset_init (bitset bset, bitset_bindex n_bits) +{ + bitset_windex size; + + bset->b.vtable = &ebitset_vtable; + + bset->b.csize = EBITSET_ELT_WORDS; + + EBITSET_ZERO_SET (bset); + + size = n_bits ? (n_bits + EBITSET_ELT_BITS - 1) / EBITSET_ELT_BITS + : EBITSET_INITIAL_SIZE; + + EBITSET_ASIZE (bset) = 0; + EBITSET_ELTS (bset) = 0; + ebitset_resize (bset, n_bits); + + return bset; +} + + +void +ebitset_release_memory (void) +{ + ebitset_free_list = 0; + if (ebitset_obstack_init) + { + ebitset_obstack_init = false; + obstack_free (&ebitset_obstack, NULL); + } +} diff --git a/src/apps/bin/bison/lib/ebitset.h b/src/apps/bin/bison/lib/ebitset.h new file mode 100644 index 0000000000..70c0fcada3 --- /dev/null +++ b/src/apps/bin/bison/lib/ebitset.h @@ -0,0 +1,30 @@ +/* Functions to support ebitsets. + Copyright (C) 2002, 2004 Free Software Foundation, Inc. + Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _EBITSET_H +#define _EBITSET_H + +#include "bitset.h" + +extern size_t ebitset_bytes (bitset_bindex); + +extern bitset ebitset_init (bitset, bitset_bindex); + +extern void ebitset_release_memory (void); + +#endif diff --git a/src/apps/bin/bison/lib/error.c b/src/apps/bin/bison/lib/error.c new file mode 100644 index 0000000000..1149235a10 --- /dev/null +++ b/src/apps/bin/bison/lib/error.c @@ -0,0 +1,310 @@ +/* Error handler for noninteractive utilities + Copyright (C) 1990-1998, 2000-2002, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by David MacKenzie . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include "error.h" + +#include +#include +#include +#include + +#ifdef _LIBC +# include +#else +# include "gettext.h" +#endif + +#ifdef _LIBC +# include +# define mbsrtowcs __mbsrtowcs +#endif + +#if !_LIBC +# include "unlocked-io.h" +#endif + +#ifndef _ +# define _(String) String +#endif + +/* If NULL, error will flush stdout, then print on stderr the program + name, a colon and a space. Otherwise, error will call this + function without parameters instead. */ +void (*error_print_progname) (void); + +/* This variable is incremented each time `error' is called. */ +unsigned int error_message_count; + +#ifdef _LIBC +/* In the GNU C library, there is a predefined variable for this. */ + +# define program_name program_invocation_name +# include +# include + +/* In GNU libc we want do not want to use the common name `error' directly. + Instead make it a weak alias. */ +extern void __error (int status, int errnum, const char *message, ...) + __attribute__ ((__format__ (__printf__, 3, 4))); +extern void __error_at_line (int status, int errnum, const char *file_name, + unsigned int line_number, const char *message, + ...) + __attribute__ ((__format__ (__printf__, 5, 6)));; +# define error __error +# define error_at_line __error_at_line + +# include +# define fflush(s) INTUSE(_IO_fflush) (s) +# undef putc +# define putc(c, fp) INTUSE(_IO_putc) (c, fp) + +# include + +#else /* not _LIBC */ + +# if !HAVE_DECL_STRERROR_R && STRERROR_R_CHAR_P +# ifndef HAVE_DECL_STRERROR_R +"this configure-time declaration test was not run" +# endif +char *strerror_r (); +# endif + +# ifndef SIZE_MAX +# define SIZE_MAX ((size_t) -1) +# endif + +/* The calling program should define program_name and set it to the + name of the executing program. */ +extern char *program_name; + +# if HAVE_STRERROR_R || defined strerror_r +# define __strerror_r strerror_r +# endif +#endif /* not _LIBC */ + +static void +print_errno_message (int errnum) +{ + char const *s; + +#if defined HAVE_STRERROR_R || _LIBC + char errbuf[1024]; +# if STRERROR_R_CHAR_P || _LIBC + s = __strerror_r (errnum, errbuf, sizeof errbuf); +# else + if (__strerror_r (errnum, errbuf, sizeof errbuf) == 0) + s = errbuf; + else + s = 0; +# endif +#else + s = strerror (errnum); +#endif + +#if !_LIBC + if (! s) + s = _("Unknown system error"); +#endif + +#if _LIBC + if (_IO_fwide (stderr, 0) > 0) + { + __fwprintf (stderr, L": %s", s); + return; + } +#endif + + fprintf (stderr, ": %s", s); +} + +static void +error_tail (int status, int errnum, const char *message, va_list args) +{ +#if _LIBC + if (_IO_fwide (stderr, 0) > 0) + { +# define ALLOCA_LIMIT 2000 + size_t len = strlen (message) + 1; + const wchar_t *wmessage = L"out of memory"; + wchar_t *wbuf = (len < ALLOCA_LIMIT + ? alloca (len * sizeof *wbuf) + : len <= SIZE_MAX / sizeof *wbuf + ? malloc (len * sizeof *wbuf) + : NULL); + + if (wbuf) + { + size_t res; + mbstate_t st; + const char *tmp = message; + memset (&st, '\0', sizeof (st)); + res = mbsrtowcs (wbuf, &tmp, len, &st); + wmessage = res == (size_t) -1 ? L"???" : wbuf; + } + + __vfwprintf (stderr, wmessage, args); + if (! (len < ALLOCA_LIMIT)) + free (wbuf); + } + else +#endif + vfprintf (stderr, message, args); + va_end (args); + + ++error_message_count; + if (errnum) + print_errno_message (errnum); +#if _LIBC + if (_IO_fwide (stderr, 0) > 0) + putwc (L'\n', stderr); + else +#endif + putc ('\n', stderr); + fflush (stderr); + if (status) + exit (status); +} + + +/* Print the program name and error message MESSAGE, which is a printf-style + format string with optional args. + If ERRNUM is nonzero, print its corresponding system error message. + Exit with status STATUS if it is nonzero. */ +void +error (int status, int errnum, const char *message, ...) +{ + va_list args; + +#if defined _LIBC && defined __libc_ptf_call + /* We do not want this call to be cut short by a thread + cancellation. Therefore disable cancellation for now. */ + int state = PTHREAD_CANCEL_ENABLE; + __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state), + 0); +#endif + + fflush (stdout); +#ifdef _LIBC + _IO_flockfile (stderr); +#endif + if (error_print_progname) + (*error_print_progname) (); + else + { +#if _LIBC + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s: ", program_name); + else +#endif + fprintf (stderr, "%s: ", program_name); + } + + va_start (args, message); + error_tail (status, errnum, message, args); + +#ifdef _LIBC + _IO_funlockfile (stderr); +# ifdef __libc_ptf_call + __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0); +# endif +#endif +} + +/* Sometimes we want to have at most one error per line. This + variable controls whether this mode is selected or not. */ +int error_one_per_line; + +void +error_at_line (int status, int errnum, const char *file_name, + unsigned int line_number, const char *message, ...) +{ + va_list args; + + if (error_one_per_line) + { + static const char *old_file_name; + static unsigned int old_line_number; + + if (old_line_number == line_number + && (file_name == old_file_name + || strcmp (old_file_name, file_name) == 0)) + /* Simply return and print nothing. */ + return; + + old_file_name = file_name; + old_line_number = line_number; + } + +#if defined _LIBC && defined __libc_ptf_call + /* We do not want this call to be cut short by a thread + cancellation. Therefore disable cancellation for now. */ + int state = PTHREAD_CANCEL_ENABLE; + __libc_ptf_call (pthread_setcancelstate, (PTHREAD_CANCEL_DISABLE, &state), + 0); +#endif + + fflush (stdout); +#ifdef _LIBC + _IO_flockfile (stderr); +#endif + if (error_print_progname) + (*error_print_progname) (); + else + { +#if _LIBC + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s: ", program_name); + else +#endif + fprintf (stderr, "%s:", program_name); + } + + if (file_name != NULL) + { +#if _LIBC + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s:%d: ", file_name, line_number); + else +#endif + fprintf (stderr, "%s:%d: ", file_name, line_number); + } + + va_start (args, message); + error_tail (status, errnum, message, args); + +#ifdef _LIBC + _IO_funlockfile (stderr); +# ifdef __libc_ptf_call + __libc_ptf_call (pthread_setcancelstate, (state, NULL), 0); +# endif +#endif +} + +#ifdef _LIBC +/* Make the weak alias. */ +# undef error +# undef error_at_line +weak_alias (__error, error) +weak_alias (__error_at_line, error_at_line) +#endif diff --git a/src/apps/bin/bison/lib/error.h b/src/apps/bin/bison/lib/error.h new file mode 100644 index 0000000000..8ed63595f2 --- /dev/null +++ b/src/apps/bin/bison/lib/error.h @@ -0,0 +1,66 @@ +/* Declaration for error-reporting function + Copyright (C) 1995, 1996, 1997, 2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _ERROR_H +#define _ERROR_H 1 + +#ifndef __attribute__ +/* This feature is available in gcc versions 2.5 and later. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) +# define __attribute__(Spec) /* empty */ +# endif +/* The __-protected variants of `format' and `printf' attributes + are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) +# define __format__ format +# define __printf__ printf +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* Print a message with `fprintf (stderr, FORMAT, ...)'; + if ERRNUM is nonzero, follow it with ": " and strerror (ERRNUM). + If STATUS is nonzero, terminate the program with `exit (STATUS)'. */ + +extern void error (int __status, int __errnum, const char *__format, ...) + __attribute__ ((__format__ (__printf__, 3, 4))); + +extern void error_at_line (int __status, int __errnum, const char *__fname, + unsigned int __lineno, const char *__format, ...) + __attribute__ ((__format__ (__printf__, 5, 6))); + +/* If NULL, error will flush stdout, then print on stderr the program + name, a colon and a space. Otherwise, error will call this + function without parameters instead. */ +extern void (*error_print_progname) (void); + +/* This variable is incremented each time `error' is called. */ +extern unsigned int error_message_count; + +/* Sometimes we want to have at most one error per line. This + variable controls whether this mode is selected or not. */ +extern int error_one_per_line; + +#ifdef __cplusplus +} +#endif + +#endif /* error.h */ diff --git a/src/apps/bin/bison/lib/exit.h b/src/apps/bin/bison/lib/exit.h new file mode 100644 index 0000000000..4e8d465165 --- /dev/null +++ b/src/apps/bin/bison/lib/exit.h @@ -0,0 +1,32 @@ +/* exit() function. + Copyright (C) 1995, 2001 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _EXIT_H +#define _EXIT_H + +/* Get exit() declaration. */ +#include + +/* Some systems do not define EXIT_*, even with STDC_HEADERS. */ +#ifndef EXIT_SUCCESS +# define EXIT_SUCCESS 0 +#endif +#ifndef EXIT_FAILURE +# define EXIT_FAILURE 1 +#endif + +#endif /* _EXIT_H */ diff --git a/src/apps/bin/bison/lib/exitfail.c b/src/apps/bin/bison/lib/exitfail.c new file mode 100644 index 0000000000..2ae5f69555 --- /dev/null +++ b/src/apps/bin/bison/lib/exitfail.c @@ -0,0 +1,27 @@ +/* Failure exit status + + Copyright (C) 2002, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. + If not, write to the Free Software Foundation, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +# include +#endif + +#include "exitfail.h" +#include "exit.h" + +int volatile exit_failure = EXIT_FAILURE; diff --git a/src/apps/bin/bison/lib/exitfail.h b/src/apps/bin/bison/lib/exitfail.h new file mode 100644 index 0000000000..cf5ab71958 --- /dev/null +++ b/src/apps/bin/bison/lib/exitfail.h @@ -0,0 +1,20 @@ +/* Failure exit status + + Copyright (C) 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; see the file COPYING. + If not, write to the Free Software Foundation, + 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +extern int volatile exit_failure; diff --git a/src/apps/bin/bison/lib/get-errno.c b/src/apps/bin/bison/lib/get-errno.c new file mode 100644 index 0000000000..57cea01966 --- /dev/null +++ b/src/apps/bin/bison/lib/get-errno.c @@ -0,0 +1,45 @@ +/* get-errno.h - get and set errno. + + Copyright (C) 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Paul Eggert. */ + +#if HAVE_CONFIG_H +# include +#endif + +#include + +#include "get-errno.h" + +/* Get and set errno. A source file that needs to set or get errno, + but doesn't need to test for specific errno values, can use these + functions to avoid namespace pollution. For example, a file that + defines EQUAL should not include , since might + define EQUAL; such a file can include instead. */ + +int +get_errno (void) +{ + return errno; +} + +void +set_errno (int e) +{ + errno = e; +} diff --git a/src/apps/bin/bison/lib/get-errno.h b/src/apps/bin/bison/lib/get-errno.h new file mode 100644 index 0000000000..23f1992bf1 --- /dev/null +++ b/src/apps/bin/bison/lib/get-errno.h @@ -0,0 +1,20 @@ +/* get-errno.h - get and set errno. + + Copyright (C) 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +extern int get_errno (void); +extern void set_errno (int); diff --git a/src/apps/bin/bison/lib/getopt.c b/src/apps/bin/bison/lib/getopt.c new file mode 100644 index 0000000000..8f017f87b1 --- /dev/null +++ b/src/apps/bin/bison/lib/getopt.c @@ -0,0 +1,1254 @@ +/* Getopt for GNU. + NOTE: getopt is now part of the C library, so if you don't know what + "Keep this file name-space clean" means, talk to drepper@gnu.org + before changing it! + Copyright (C) 1987,88,89,90,91,92,93,94,95,96,98,99,2000,2001,2002,2003,2004 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* This tells Alpha OSF/1 not to define a getopt prototype in . + Ditto for AIX 3.2 and . */ +#ifndef _NO_PROTO +# define _NO_PROTO +#endif + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +# include +# if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +# define ELIDE_CODE +# endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +/* Don't include stdlib.h for non-GNU C libraries because some of them + contain conflicting prototypes for getopt. */ +# include +# include +#endif /* GNU C library. */ + +#include + +#ifdef VMS +# include +#endif + +#ifdef _LIBC +# include +#else +# include "gettext.h" +# define _(msgid) gettext (msgid) +#endif + +#if defined _LIBC && defined USE_IN_LIBIO +# include +#endif + +#ifndef attribute_hidden +# define attribute_hidden +#endif + +/* This version of `getopt' appears to the caller like standard Unix `getopt' + but it behaves differently for the user, since it allows the user + to intersperse the options with the other arguments. + + As `getopt' works, it permutes the elements of ARGV so that, + when it is done, all the options precede everything else. Thus + all application programs are extended to handle flexible argument order. + + Setting the environment variable POSIXLY_CORRECT disables permutation. + Then the behavior is completely standard. + + GNU application programs can use a third alternative mode in which + they can distinguish the relative order of options and other arguments. */ + +#include "getopt.h" +#include "getopt_int.h" + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +/* 1003.2 says this must be 1 before any call. */ +int optind = 1; + +/* Callers store zero here to inhibit the error message + for unrecognized options. */ + +int opterr = 1; + +/* Set to an option character which was unrecognized. + This must be initialized on some systems to avoid linking in the + system's own getopt implementation. */ + +int optopt = '?'; + +/* Keep a global copy of all internal members of getopt_data. */ + +static struct _getopt_data getopt_data; + + +#ifndef __GNU_LIBRARY__ + +/* Avoid depending on library functions or files + whose names are inconsistent. */ + +#ifndef getenv +extern char *getenv (); +#endif + +#endif /* not __GNU_LIBRARY__ */ + +#ifdef _LIBC +/* Stored original parameters. + XXX This is no good solution. We should rather copy the args so + that we can compare them later. But we must not use malloc(3). */ +extern int __libc_argc; +extern char **__libc_argv; + +/* Bash 2.0 gives us an environment variable containing flags + indicating ARGV elements that should not be considered arguments. */ + +# ifdef USE_NONOPTION_FLAGS +/* Defined in getopt_init.c */ +extern char *__getopt_nonoption_flags; +# endif + +# ifdef USE_NONOPTION_FLAGS +# define SWAP_FLAGS(ch1, ch2) \ + if (d->__nonoption_flags_len > 0) \ + { \ + char __tmp = __getopt_nonoption_flags[ch1]; \ + __getopt_nonoption_flags[ch1] = __getopt_nonoption_flags[ch2]; \ + __getopt_nonoption_flags[ch2] = __tmp; \ + } +# else +# define SWAP_FLAGS(ch1, ch2) +# endif +#else /* !_LIBC */ +# define SWAP_FLAGS(ch1, ch2) +#endif /* _LIBC */ + +/* Exchange two adjacent subsequences of ARGV. + One subsequence is elements [first_nonopt,last_nonopt) + which contains all the non-options that have been skipped so far. + The other is elements [last_nonopt,optind), which contains all + the options processed since those non-options were skipped. + + `first_nonopt' and `last_nonopt' are relocated so that they describe + the new indices of the non-options in ARGV after they are moved. */ + +static void +exchange (char **argv, struct _getopt_data *d) +{ + int bottom = d->__first_nonopt; + int middle = d->__last_nonopt; + int top = d->optind; + char *tem; + + /* Exchange the shorter segment with the far end of the longer segment. + That puts the shorter segment into the right place. + It leaves the longer segment in the right place overall, + but it consists of two parts that need to be swapped next. */ + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + /* First make sure the handling of the `__getopt_nonoption_flags' + string can work normally. Our top argument must be in the range + of the string. */ + if (d->__nonoption_flags_len > 0 && top >= d->__nonoption_flags_max_len) + { + /* We must extend the array. The user plays games with us and + presents new arguments. */ + char *new_str = malloc (top + 1); + if (new_str == NULL) + d->__nonoption_flags_len = d->__nonoption_flags_max_len = 0; + else + { + memset (__mempcpy (new_str, __getopt_nonoption_flags, + d->__nonoption_flags_max_len), + '\0', top + 1 - d->__nonoption_flags_max_len); + d->__nonoption_flags_max_len = top + 1; + __getopt_nonoption_flags = new_str; + } + } +#endif + + while (top > middle && middle > bottom) + { + if (top - middle > middle - bottom) + { + /* Bottom segment is the short one. */ + int len = middle - bottom; + register int i; + + /* Swap it with the top part of the top segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[top - (middle - bottom) + i]; + argv[top - (middle - bottom) + i] = tem; + SWAP_FLAGS (bottom + i, top - (middle - bottom) + i); + } + /* Exclude the moved bottom segment from further swapping. */ + top -= len; + } + else + { + /* Top segment is the short one. */ + int len = top - middle; + register int i; + + /* Swap it with the bottom part of the bottom segment. */ + for (i = 0; i < len; i++) + { + tem = argv[bottom + i]; + argv[bottom + i] = argv[middle + i]; + argv[middle + i] = tem; + SWAP_FLAGS (bottom + i, middle + i); + } + /* Exclude the moved top segment from further swapping. */ + bottom += len; + } + } + + /* Update records for the slots the non-options now occupy. */ + + d->__first_nonopt += (d->optind - d->__last_nonopt); + d->__last_nonopt = d->optind; +} + +/* Initialize the internal data when the first call is made. */ + +static const char * +_getopt_initialize (int argc, char *const *argv, const char *optstring, + struct _getopt_data *d) +{ + /* Start processing options with ARGV-element 1 (since ARGV-element 0 + is the program name); the sequence of previously skipped + non-option ARGV-elements is empty. */ + + d->__first_nonopt = d->__last_nonopt = d->optind; + + d->__nextchar = NULL; + + d->__posixly_correct = !!getenv ("POSIXLY_CORRECT"); + + /* Determine how to handle the ordering of options and nonoptions. */ + + if (optstring[0] == '-') + { + d->__ordering = RETURN_IN_ORDER; + ++optstring; + } + else if (optstring[0] == '+') + { + d->__ordering = REQUIRE_ORDER; + ++optstring; + } + else if (d->__posixly_correct) + d->__ordering = REQUIRE_ORDER; + else + d->__ordering = PERMUTE; + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + if (!d->__posixly_correct + && argc == __libc_argc && argv == __libc_argv) + { + if (d->__nonoption_flags_max_len == 0) + { + if (__getopt_nonoption_flags == NULL + || __getopt_nonoption_flags[0] == '\0') + d->__nonoption_flags_max_len = -1; + else + { + const char *orig_str = __getopt_nonoption_flags; + int len = d->__nonoption_flags_max_len = strlen (orig_str); + if (d->__nonoption_flags_max_len < argc) + d->__nonoption_flags_max_len = argc; + __getopt_nonoption_flags = + (char *) malloc (d->__nonoption_flags_max_len); + if (__getopt_nonoption_flags == NULL) + d->__nonoption_flags_max_len = -1; + else + memset (__mempcpy (__getopt_nonoption_flags, orig_str, len), + '\0', d->__nonoption_flags_max_len - len); + } + } + d->__nonoption_flags_len = d->__nonoption_flags_max_len; + } + else + d->__nonoption_flags_len = 0; +#endif + + return optstring; +} + +/* Scan elements of ARGV (whose length is ARGC) for option characters + given in OPTSTRING. + + If an element of ARGV starts with '-', and is not exactly "-" or "--", + then it is an option element. The characters of this element + (aside from the initial '-') are option characters. If `getopt' + is called repeatedly, it returns successively each of the option characters + from each of the option elements. + + If `getopt' finds another option character, it returns that character, + updating `optind' and `nextchar' so that the next call to `getopt' can + resume the scan with the following option character or ARGV-element. + + If there are no more option characters, `getopt' returns -1. + Then `optind' is the index in ARGV of the first ARGV-element + that is not an option. (The ARGV-elements have been permuted + so that those that are not options now come last.) + + OPTSTRING is a string containing the legitimate option characters. + If an option character is seen that is not listed in OPTSTRING, + return '?' after printing an error message. If you set `opterr' to + zero, the error message is suppressed but we still return '?'. + + If a char in OPTSTRING is followed by a colon, that means it wants an arg, + so the following text in the same ARGV-element, or the text of the following + ARGV-element, is returned in `optarg'. Two colons mean an option that + wants an optional arg; if there is text in the current ARGV-element, + it is returned in `optarg', otherwise `optarg' is set to zero. + + If OPTSTRING starts with `-' or `+', it requests different methods of + handling the non-option ARGV-elements. + See the comments about RETURN_IN_ORDER and REQUIRE_ORDER, above. + + Long-named options begin with `--' instead of `-'. + Their names may be abbreviated as long as the abbreviation is unique + or is an exact match for some defined option. If they have an + argument, it follows the option name in the same ARGV-element, separated + from the option name by a `=', or else the in next ARGV-element. + When `getopt' finds a long-named option, it returns 0 if that option's + `flag' field is nonzero, the value of the option's `val' field + if the `flag' field is zero. + + The elements of ARGV aren't really const, because we permute them. + But we pretend they're const in the prototype to be compatible + with other systems. + + LONGOPTS is a vector of `struct option' terminated by an + element containing a name which is zero. + + LONGIND returns the index in LONGOPT of the long-named option found. + It is only valid when a long-named option has been found by the most + recent call. + + If LONG_ONLY is nonzero, '-' as well as '--' can introduce + long-named options. */ + +int +_getopt_internal_r (int argc, char *const *argv, const char *optstring, + const struct option *longopts, int *longind, + int long_only, struct _getopt_data *d) +{ + int print_errors = d->opterr; + if (optstring[0] == ':') + print_errors = 0; + + if (argc < 1) + return -1; + + d->optarg = NULL; + + if (d->optind == 0 || !d->__initialized) + { + if (d->optind == 0) + d->optind = 1; /* Don't scan ARGV[0], the program name. */ + optstring = _getopt_initialize (argc, argv, optstring, d); + d->__initialized = 1; + } + + /* Test whether ARGV[optind] points to a non-option argument. + Either it does not have option syntax, or there is an environment flag + from the shell indicating it is not an option. The later information + is only used when the used in the GNU libc. */ +#if defined _LIBC && defined USE_NONOPTION_FLAGS +# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0' \ + || (d->optind < d->__nonoption_flags_len \ + && __getopt_nonoption_flags[d->optind] == '1')) +#else +# define NONOPTION_P (argv[d->optind][0] != '-' || argv[d->optind][1] == '\0') +#endif + + if (d->__nextchar == NULL || *d->__nextchar == '\0') + { + /* Advance to the next ARGV-element. */ + + /* Give FIRST_NONOPT & LAST_NONOPT rational values if OPTIND has been + moved back by the user (who may also have changed the arguments). */ + if (d->__last_nonopt > d->optind) + d->__last_nonopt = d->optind; + if (d->__first_nonopt > d->optind) + d->__first_nonopt = d->optind; + + if (d->__ordering == PERMUTE) + { + /* If we have just processed some options following some non-options, + exchange them so that the options come first. */ + + if (d->__first_nonopt != d->__last_nonopt + && d->__last_nonopt != d->optind) + exchange ((char **) argv, d); + else if (d->__last_nonopt != d->optind) + d->__first_nonopt = d->optind; + + /* Skip any additional non-options + and extend the range of non-options previously skipped. */ + + while (d->optind < argc && NONOPTION_P) + d->optind++; + d->__last_nonopt = d->optind; + } + + /* The special ARGV-element `--' means premature end of options. + Skip it like a null option, + then exchange with previous non-options as if it were an option, + then skip everything else like a non-option. */ + + if (d->optind != argc && !strcmp (argv[d->optind], "--")) + { + d->optind++; + + if (d->__first_nonopt != d->__last_nonopt + && d->__last_nonopt != d->optind) + exchange ((char **) argv, d); + else if (d->__first_nonopt == d->__last_nonopt) + d->__first_nonopt = d->optind; + d->__last_nonopt = argc; + + d->optind = argc; + } + + /* If we have done all the ARGV-elements, stop the scan + and back over any non-options that we skipped and permuted. */ + + if (d->optind == argc) + { + /* Set the next-arg-index to point at the non-options + that we previously skipped, so the caller will digest them. */ + if (d->__first_nonopt != d->__last_nonopt) + d->optind = d->__first_nonopt; + return -1; + } + + /* If we have come to a non-option and did not permute it, + either stop the scan or describe it to the caller and pass it by. */ + + if (NONOPTION_P) + { + if (d->__ordering == REQUIRE_ORDER) + return -1; + d->optarg = argv[d->optind++]; + return 1; + } + + /* We have found another option-ARGV-element. + Skip the initial punctuation. */ + + d->__nextchar = (argv[d->optind] + 1 + + (longopts != NULL && argv[d->optind][1] == '-')); + } + + /* Decode the current option-ARGV-element. */ + + /* Check whether the ARGV-element is a long option. + + If long_only and the ARGV-element has the form "-f", where f is + a valid short option, don't consider it an abbreviated form of + a long option that starts with f. Otherwise there would be no + way to give the -f short option. + + On the other hand, if there's a long option "fubar" and + the ARGV-element is "-fu", do consider that an abbreviation of + the long option, just like "--fu", and not "-f" with arg "u". + + This distinction seems to be the most useful approach. */ + + if (longopts != NULL + && (argv[d->optind][1] == '-' + || (long_only && (argv[d->optind][2] + || !strchr (optstring, argv[d->optind][1]))))) + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = -1; + int option_index; + + for (nameend = d->__nextchar; *nameend && *nameend != '='; nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar)) + { + if ((unsigned int) (nameend - d->__nextchar) + == (unsigned int) strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else if (long_only + || pfound->has_arg != p->has_arg + || pfound->flag != p->flag + || pfound->val != p->val) + /* Second or later nonexact match found. */ + ambig = 1; + } + + if (ambig && !exact) + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("%s: option `%s' is ambiguous\n"), + argv[0], argv[d->optind]) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, _("%s: option `%s' is ambiguous\n"), + argv[0], argv[d->optind]); +#endif + } + d->__nextchar += strlen (d->__nextchar); + d->optind++; + d->optopt = 0; + return '?'; + } + + if (pfound != NULL) + { + option_index = indfound; + d->optind++; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + d->optarg = nameend + 1; + else + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + int n; +#endif + + if (argv[d->optind - 1][1] == '-') + { + /* --option */ +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("\ +%s: option `--%s' doesn't allow an argument\n"), + argv[0], pfound->name); +#else + fprintf (stderr, _("\ +%s: option `--%s' doesn't allow an argument\n"), + argv[0], pfound->name); +#endif + } + else + { + /* +option or -option */ +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("\ +%s: option `%c%s' doesn't allow an argument\n"), + argv[0], argv[d->optind - 1][0], + pfound->name); +#else + fprintf (stderr, _("\ +%s: option `%c%s' doesn't allow an argument\n"), + argv[0], argv[d->optind - 1][0], + pfound->name); +#endif + } + +#if defined _LIBC && defined USE_IN_LIBIO + if (n >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 + |= _IO_FLAGS2_NOTCANCEL; + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#endif + } + + d->__nextchar += strlen (d->__nextchar); + + d->optopt = pfound->val; + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (d->optind < argc) + d->optarg = argv[d->optind++]; + else + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("\ +%s: option `%s' requires an argument\n"), + argv[0], argv[d->optind - 1]) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 + |= _IO_FLAGS2_NOTCANCEL; + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[d->optind - 1]); +#endif + } + d->__nextchar += strlen (d->__nextchar); + d->optopt = pfound->val; + return optstring[0] == ':' ? ':' : '?'; + } + } + d->__nextchar += strlen (d->__nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + + /* Can't find it as a long option. If this is not getopt_long_only, + or the option starts with '--' or is not a valid short + option, then it's an error. + Otherwise interpret it as a short option. */ + if (!long_only || argv[d->optind][1] == '-' + || strchr (optstring, *d->__nextchar) == NULL) + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + int n; +#endif + + if (argv[d->optind][1] == '-') + { + /* --option */ +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("%s: unrecognized option `--%s'\n"), + argv[0], d->__nextchar); +#else + fprintf (stderr, _("%s: unrecognized option `--%s'\n"), + argv[0], d->__nextchar); +#endif + } + else + { + /* +option or -option */ +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("%s: unrecognized option `%c%s'\n"), + argv[0], argv[d->optind][0], d->__nextchar); +#else + fprintf (stderr, _("%s: unrecognized option `%c%s'\n"), + argv[0], argv[d->optind][0], d->__nextchar); +#endif + } + +#if defined _LIBC && defined USE_IN_LIBIO + if (n >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#endif + } + d->__nextchar = (char *) ""; + d->optind++; + d->optopt = 0; + return '?'; + } + } + + /* Look at and handle the next short option-character. */ + + { + char c = *d->__nextchar++; + char *temp = strchr (optstring, c); + + /* Increment `optind' when we start to process its last character. */ + if (*d->__nextchar == '\0') + ++d->optind; + + if (temp == NULL || c == ':') + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + int n; +#endif + + if (d->__posixly_correct) + { + /* 1003.2 specifies the format of this message. */ +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("%s: illegal option -- %c\n"), + argv[0], c); +#else + fprintf (stderr, _("%s: illegal option -- %c\n"), argv[0], c); +#endif + } + else + { +#if defined _LIBC && defined USE_IN_LIBIO + n = __asprintf (&buf, _("%s: invalid option -- %c\n"), + argv[0], c); +#else + fprintf (stderr, _("%s: invalid option -- %c\n"), argv[0], c); +#endif + } + +#if defined _LIBC && defined USE_IN_LIBIO + if (n >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#endif + } + d->optopt = c; + return '?'; + } + /* Convenience. Treat POSIX -W foo same as long option --foo */ + if (temp[0] == 'W' && temp[1] == ';') + { + char *nameend; + const struct option *p; + const struct option *pfound = NULL; + int exact = 0; + int ambig = 0; + int indfound = 0; + int option_index; + + /* This is an option that requires an argument. */ + if (*d->__nextchar != '\0') + { + d->optarg = d->__nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + d->optind++; + } + else if (d->optind == argc) + { + if (print_errors) + { + /* 1003.2 specifies the format of this message. */ +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, + _("%s: option requires an argument -- %c\n"), + argv[0], c) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, _("%s: option requires an argument -- %c\n"), + argv[0], c); +#endif + } + d->optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + return c; + } + else + /* We already incremented `d->optind' once; + increment it again when taking next ARGV-elt as argument. */ + d->optarg = argv[d->optind++]; + + /* optarg is now the argument, see if it's in the + table of longopts. */ + + for (d->__nextchar = nameend = d->optarg; *nameend && *nameend != '='; + nameend++) + /* Do nothing. */ ; + + /* Test all long options for either exact match + or abbreviated matches. */ + for (p = longopts, option_index = 0; p->name; p++, option_index++) + if (!strncmp (p->name, d->__nextchar, nameend - d->__nextchar)) + { + if ((unsigned int) (nameend - d->__nextchar) == strlen (p->name)) + { + /* Exact match found. */ + pfound = p; + indfound = option_index; + exact = 1; + break; + } + else if (pfound == NULL) + { + /* First nonexact match found. */ + pfound = p; + indfound = option_index; + } + else + /* Second or later nonexact match found. */ + ambig = 1; + } + if (ambig && !exact) + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("%s: option `-W %s' is ambiguous\n"), + argv[0], argv[d->optind]) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, _("%s: option `-W %s' is ambiguous\n"), + argv[0], argv[d->optind]); +#endif + } + d->__nextchar += strlen (d->__nextchar); + d->optind++; + return '?'; + } + if (pfound != NULL) + { + option_index = indfound; + if (*nameend) + { + /* Don't test has_arg with >, because some C compilers don't + allow it to be used on enums. */ + if (pfound->has_arg) + d->optarg = nameend + 1; + else + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("\ +%s: option `-W %s' doesn't allow an argument\n"), + argv[0], pfound->name) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 + |= _IO_FLAGS2_NOTCANCEL; + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, _("\ +%s: option `-W %s' doesn't allow an argument\n"), + argv[0], pfound->name); +#endif + } + + d->__nextchar += strlen (d->__nextchar); + return '?'; + } + } + else if (pfound->has_arg == 1) + { + if (d->optind < argc) + d->optarg = argv[d->optind++]; + else + { + if (print_errors) + { +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("\ +%s: option `%s' requires an argument\n"), + argv[0], argv[d->optind - 1]) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 + |= _IO_FLAGS2_NOTCANCEL; + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, + _("%s: option `%s' requires an argument\n"), + argv[0], argv[d->optind - 1]); +#endif + } + d->__nextchar += strlen (d->__nextchar); + return optstring[0] == ':' ? ':' : '?'; + } + } + d->__nextchar += strlen (d->__nextchar); + if (longind != NULL) + *longind = option_index; + if (pfound->flag) + { + *(pfound->flag) = pfound->val; + return 0; + } + return pfound->val; + } + d->__nextchar = NULL; + return 'W'; /* Let the application handle it. */ + } + if (temp[1] == ':') + { + if (temp[2] == ':') + { + /* This is an option that accepts an argument optionally. */ + if (*d->__nextchar != '\0') + { + d->optarg = d->__nextchar; + d->optind++; + } + else + d->optarg = NULL; + d->__nextchar = NULL; + } + else + { + /* This is an option that requires an argument. */ + if (*d->__nextchar != '\0') + { + d->optarg = d->__nextchar; + /* If we end this ARGV-element by taking the rest as an arg, + we must advance to the next element now. */ + d->optind++; + } + else if (d->optind == argc) + { + if (print_errors) + { + /* 1003.2 specifies the format of this message. */ +#if defined _LIBC && defined USE_IN_LIBIO + char *buf; + + if (__asprintf (&buf, _("\ +%s: option requires an argument -- %c\n"), + argv[0], c) >= 0) + { + _IO_flockfile (stderr); + + int old_flags2 = ((_IO_FILE *) stderr)->_flags2; + ((_IO_FILE *) stderr)->_flags2 |= _IO_FLAGS2_NOTCANCEL; + + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s", buf); + else + fputs (buf, stderr); + + ((_IO_FILE *) stderr)->_flags2 = old_flags2; + _IO_funlockfile (stderr); + + free (buf); + } +#else + fprintf (stderr, + _("%s: option requires an argument -- %c\n"), + argv[0], c); +#endif + } + d->optopt = c; + if (optstring[0] == ':') + c = ':'; + else + c = '?'; + } + else + /* We already incremented `optind' once; + increment it again when taking next ARGV-elt as argument. */ + d->optarg = argv[d->optind++]; + d->__nextchar = NULL; + } + } + return c; + } +} + +int +_getopt_internal (int argc, char *const *argv, const char *optstring, + const struct option *longopts, int *longind, int long_only) +{ + int result; + + getopt_data.optind = optind; + getopt_data.opterr = opterr; + + result = _getopt_internal_r (argc, argv, optstring, longopts, + longind, long_only, &getopt_data); + + optind = getopt_data.optind; + optarg = getopt_data.optarg; + optopt = getopt_data.optopt; + + return result; +} + +int +getopt (int argc, char *const *argv, const char *optstring) +{ + return _getopt_internal (argc, argv, optstring, + (const struct option *) 0, + (int *) 0, + 0); +} + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +/* Compile with -DTEST to make an executable for use in testing + the above definition of `getopt'. */ + +int +main (int argc, char **argv) +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + + c = getopt (argc, argv, "abc:d:0123456789"); + if (c == -1) + break; + + switch (c) + { + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/src/apps/bin/bison/lib/getopt.h b/src/apps/bin/bison/lib/getopt.h new file mode 100644 index 0000000000..c61768c691 --- /dev/null +++ b/src/apps/bin/bison/lib/getopt.h @@ -0,0 +1,176 @@ +/* Declarations for getopt. + Copyright (C) 1989-1994,1996-1999,2001,2003,2004 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _GETOPT_H + +#ifndef __need_getopt +# define _GETOPT_H 1 +#endif + +/* If __GNU_LIBRARY__ is not already defined, either we are being used + standalone, or this is the first header included in the source file. + If we are being used with glibc, we need to include , but + that does not exist if we are standalone. So: if __GNU_LIBRARY__ is + not defined, include , which will pull in for us + if it's from glibc. (Why ctype.h? It's guaranteed to exist and it + doesn't flood the namespace with stuff the way some other headers do.) */ +#if !defined __GNU_LIBRARY__ +# include +#endif + +#ifndef __THROW +# ifndef __GNUC_PREREQ +# define __GNUC_PREREQ(maj, min) (0) +# endif +# if defined __cplusplus && __GNUC_PREREQ (2,8) +# define __THROW throw () +# else +# define __THROW +# endif +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* For communication from `getopt' to the caller. + When `getopt' finds an option that takes an argument, + the argument value is returned here. + Also, when `ordering' is RETURN_IN_ORDER, + each non-option ARGV-element is returned here. */ + +extern char *optarg; + +/* Index in ARGV of the next element to be scanned. + This is used for communication to and from the caller + and for communication between successive calls to `getopt'. + + On entry to `getopt', zero means this is the first call; initialize. + + When `getopt' returns -1, this is the index of the first of the + non-option elements that the caller should itself scan. + + Otherwise, `optind' communicates from one call to the next + how much of ARGV has been scanned so far. */ + +extern int optind; + +/* Callers store zero here to inhibit the error message `getopt' prints + for unrecognized options. */ + +extern int opterr; + +/* Set to an option character which was unrecognized. */ + +extern int optopt; + +#ifndef __need_getopt +/* Describe the long-named options requested by the application. + The LONG_OPTIONS argument to getopt_long or getopt_long_only is a vector + of `struct option' terminated by an element containing a name which is + zero. + + The field `has_arg' is: + no_argument (or 0) if the option does not take an argument, + required_argument (or 1) if the option requires an argument, + optional_argument (or 2) if the option takes an optional argument. + + If the field `flag' is not NULL, it points to a variable that is set + to the value given in the field `val' when the option is found, but + left unchanged if the option is not found. + + To have a long-named option do something other than set an `int' to + a compiled-in constant, such as set a value from `optarg', set the + option's `flag' field to zero and its `val' field to a nonzero + value (the equivalent single-letter option character, if there is + one). For long options that have a zero `flag' field, `getopt' + returns the contents of the `val' field. */ + +struct option +{ + const char *name; + /* has_arg can't be an enum because some compilers complain about + type mismatches in all the code that assumes it is an int. */ + int has_arg; + int *flag; + int val; +}; + +/* Names for the values of the `has_arg' field of `struct option'. */ + +# define no_argument 0 +# define required_argument 1 +# define optional_argument 2 +#endif /* need getopt */ + + +/* Get definitions and prototypes for functions to process the + arguments in ARGV (ARGC of them, minus the program name) for + options given in OPTS. + + Return the option character from OPTS just read. Return -1 when + there are no more options. For unrecognized options, or options + missing arguments, `optopt' is set to the option letter, and '?' is + returned. + + The OPTS string is a list of characters which are recognized option + letters, optionally followed by colons, specifying that that letter + takes an argument, to be placed in `optarg'. + + If a letter in OPTS is followed by two colons, its argument is + optional. This behavior is specific to the GNU `getopt'. + + The argument `--' causes premature termination of argument + scanning, explicitly telling `getopt' that there are no more + options. + + If OPTS begins with `--', then non-option arguments are treated as + arguments to the option '\0'. This behavior is specific to the GNU + `getopt'. */ + +#ifdef __GNU_LIBRARY__ +/* Many other libraries have conflicting prototypes for getopt, with + differences in the consts, in stdlib.h. To avoid compilation + errors, only prototype getopt for the GNU C library. */ +extern int getopt (int ___argc, char *const *___argv, const char *__shortopts) + __THROW; +#else /* not __GNU_LIBRARY__ */ +extern int getopt (); +#endif /* __GNU_LIBRARY__ */ + +#ifndef __need_getopt +extern int getopt_long (int ___argc, char *const *___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind) + __THROW; +extern int getopt_long_only (int ___argc, char *const *___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind) + __THROW; + +#endif + +#ifdef __cplusplus +} +#endif + +/* Make sure we later can get all the definitions and declarations. */ +#undef __need_getopt + +#endif /* getopt.h */ diff --git a/src/apps/bin/bison/lib/getopt1.c b/src/apps/bin/bison/lib/getopt1.c new file mode 100644 index 0000000000..7671eba373 --- /dev/null +++ b/src/apps/bin/bison/lib/getopt1.c @@ -0,0 +1,191 @@ +/* getopt_long and getopt_long_only entry points for GNU getopt. + Copyright (C) 1987,88,89,90,91,92,93,94,96,97,98,2004 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +#include +#endif + +#ifdef _LIBC +# include +#else +# include "getopt.h" +#endif +#include "getopt_int.h" + +#include + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself. This code is part of the GNU C + Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object files, + it is simpler to just do this in the source for each such file. */ + +#define GETOPT_INTERFACE_VERSION 2 +#if !defined _LIBC && defined __GLIBC__ && __GLIBC__ >= 2 +#include +#if _GNU_GETOPT_INTERFACE_VERSION == GETOPT_INTERFACE_VERSION +#define ELIDE_CODE +#endif +#endif + +#ifndef ELIDE_CODE + + +/* This needs to come after some library #include + to get __GNU_LIBRARY__ defined. */ +#ifdef __GNU_LIBRARY__ +#include +#endif + +#ifndef NULL +#define NULL 0 +#endif + +int +getopt_long (int argc, char *const *argv, const char *options, + const struct option *long_options, int *opt_index) +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 0); +} + +int +_getopt_long_r (int argc, char *const *argv, const char *options, + const struct option *long_options, int *opt_index, + struct _getopt_data *d) +{ + return _getopt_internal_r (argc, argv, options, long_options, opt_index, + 0, d); +} + +/* Like getopt_long, but '-' as well as '--' can indicate a long option. + If an option that starts with '-' (not '--') doesn't match a long option, + but does match a short option, it is parsed as a short option + instead. */ + +int +getopt_long_only (int argc, char *const *argv, const char *options, + const struct option *long_options, int *opt_index) +{ + return _getopt_internal (argc, argv, options, long_options, opt_index, 1); +} + +int +_getopt_long_only_r (int argc, char *const *argv, const char *options, + const struct option *long_options, int *opt_index, + struct _getopt_data *d) +{ + return _getopt_internal_r (argc, argv, options, long_options, opt_index, + 1, d); +} + +#endif /* Not ELIDE_CODE. */ + +#ifdef TEST + +#include + +int +main (int argc, char **argv) +{ + int c; + int digit_optind = 0; + + while (1) + { + int this_option_optind = optind ? optind : 1; + int option_index = 0; + static struct option long_options[] = + { + {"add", 1, 0, 0}, + {"append", 0, 0, 0}, + {"delete", 1, 0, 0}, + {"verbose", 0, 0, 0}, + {"create", 0, 0, 0}, + {"file", 1, 0, 0}, + {0, 0, 0, 0} + }; + + c = getopt_long (argc, argv, "abc:d:0123456789", + long_options, &option_index); + if (c == -1) + break; + + switch (c) + { + case 0: + printf ("option %s", long_options[option_index].name); + if (optarg) + printf (" with arg %s", optarg); + printf ("\n"); + break; + + case '0': + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': + if (digit_optind != 0 && digit_optind != this_option_optind) + printf ("digits occur in two different argv-elements.\n"); + digit_optind = this_option_optind; + printf ("option %c\n", c); + break; + + case 'a': + printf ("option a\n"); + break; + + case 'b': + printf ("option b\n"); + break; + + case 'c': + printf ("option c with value `%s'\n", optarg); + break; + + case 'd': + printf ("option d with value `%s'\n", optarg); + break; + + case '?': + break; + + default: + printf ("?? getopt returned character code 0%o ??\n", c); + } + } + + if (optind < argc) + { + printf ("non-option ARGV-elements: "); + while (optind < argc) + printf ("%s ", argv[optind++]); + printf ("\n"); + } + + exit (0); +} + +#endif /* TEST */ diff --git a/src/apps/bin/bison/lib/getopt_int.h b/src/apps/bin/bison/lib/getopt_int.h new file mode 100644 index 0000000000..0c5eddeca9 --- /dev/null +++ b/src/apps/bin/bison/lib/getopt_int.h @@ -0,0 +1,129 @@ +/* Internal declarations for getopt. + Copyright (C) 1989-1994,1996-1999,2001,2003,2004 + Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _GETOPT_INT_H +#define _GETOPT_INT_H 1 + +extern int _getopt_internal (int ___argc, char *const *___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind, + int __long_only); + + +/* Reentrant versions which can handle parsing multiple argument + vectors at the same time. */ + +/* Data type for reentrant functions. */ +struct _getopt_data +{ + /* These have exactly the same meaning as the corresponding global + variables, except that they are used for the reentrant + versions of getopt. */ + int optind; + int opterr; + int optopt; + char *optarg; + + /* Internal members. */ + + /* True if the internal members have been initialized. */ + int __initialized; + + /* The next char to be scanned in the option-element + in which the last option character we returned was found. + This allows us to pick up the scan where we left off. + + If this is zero, or a null string, it means resume the scan + by advancing to the next ARGV-element. */ + char *__nextchar; + + /* Describe how to deal with options that follow non-option ARGV-elements. + + If the caller did not specify anything, + the default is REQUIRE_ORDER if the environment variable + POSIXLY_CORRECT is defined, PERMUTE otherwise. + + REQUIRE_ORDER means don't recognize them as options; + stop option processing when the first non-option is seen. + This is what Unix does. + This mode of operation is selected by either setting the environment + variable POSIXLY_CORRECT, or using `+' as the first character + of the list of option characters. + + PERMUTE is the default. We permute the contents of ARGV as we + scan, so that eventually all the non-options are at the end. + This allows options to be given in any order, even with programs + that were not written to expect this. + + RETURN_IN_ORDER is an option available to programs that were + written to expect options and other ARGV-elements in any order + and that care about the ordering of the two. We describe each + non-option ARGV-element as if it were the argument of an option + with character code 1. Using `-' as the first character of the + list of option characters selects this mode of operation. + + The special argument `--' forces an end of option-scanning regardless + of the value of `ordering'. In the case of RETURN_IN_ORDER, only + `--' can cause `getopt' to return -1 with `optind' != ARGC. */ + + enum + { + REQUIRE_ORDER, PERMUTE, RETURN_IN_ORDER + } __ordering; + + /* If the POSIXLY_CORRECT environment variable is set. */ + int __posixly_correct; + + + /* Handle permutation of arguments. */ + + /* Describe the part of ARGV that contains non-options that have + been skipped. `first_nonopt' is the index in ARGV of the first + of them; `last_nonopt' is the index after the last of them. */ + + int __first_nonopt; + int __last_nonopt; + +#if defined _LIBC && defined USE_NONOPTION_FLAGS + int __nonoption_flags_max_len; + int __nonoption_flags_len; +# endif +}; + +/* The initializer is necessary to set OPTIND and OPTERR to their + default values and to clear the initialization flag. */ +#define _GETOPT_DATA_INITIALIZER { 1, 1 } + +extern int _getopt_internal_r (int ___argc, char *const *___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind, + int __long_only, struct _getopt_data *__data); + +extern int _getopt_long_r (int ___argc, char *const *___argv, + const char *__shortopts, + const struct option *__longopts, int *__longind, + struct _getopt_data *__data); + +extern int _getopt_long_only_r (int ___argc, char *const *___argv, + const char *__shortopts, + const struct option *__longopts, + int *__longind, + struct _getopt_data *__data); + +#endif /* getopt_int.h */ diff --git a/src/apps/bin/bison/lib/gettext.h b/src/apps/bin/bison/lib/gettext.h new file mode 100644 index 0000000000..835732e01f --- /dev/null +++ b/src/apps/bin/bison/lib/gettext.h @@ -0,0 +1,68 @@ +/* Convenience header for conditional use of GNU . + Copyright (C) 1995-1998, 2000-2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _LIBGETTEXT_H +#define _LIBGETTEXT_H 1 + +/* NLS can be disabled through the configure --disable-nls option. */ +#if ENABLE_NLS + +/* Get declarations of GNU message catalog functions. */ +# include + +#else + +/* Solaris /usr/include/locale.h includes /usr/include/libintl.h, which + chokes if dcgettext is defined as a macro. So include it now, to make + later inclusions of a NOP. We don't include + as well because people using "gettext.h" will not include , + and also including would fail on SunOS 4, whereas + is OK. */ +#if defined(__sun) +# include +#endif + +/* Disabled NLS. + The casts to 'const char *' serve the purpose of producing warnings + for invalid uses of the value returned from these functions. + On pre-ANSI systems without 'const', the config.h file is supposed to + contain "#define const". */ +# define gettext(Msgid) ((const char *) (Msgid)) +# define dgettext(Domainname, Msgid) ((const char *) (Msgid)) +# define dcgettext(Domainname, Msgid, Category) ((const char *) (Msgid)) +# define ngettext(Msgid1, Msgid2, N) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define dngettext(Domainname, Msgid1, Msgid2, N) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define dcngettext(Domainname, Msgid1, Msgid2, N, Category) \ + ((N) == 1 ? (const char *) (Msgid1) : (const char *) (Msgid2)) +# define textdomain(Domainname) ((const char *) (Domainname)) +# define bindtextdomain(Domainname, Dirname) ((const char *) (Dirname)) +# define bind_textdomain_codeset(Domainname, Codeset) ((const char *) (Codeset)) + +#endif + +/* A pseudo function call that serves as a marker for the automated + extraction of messages, but does not call gettext(). The run-time + translation is done at a different place in the code. + The argument, String, should be a literal string. Concatenated strings + and other string expressions won't work. + The macro's expansion is not parenthesized, so that it is suitable as + initializer for static 'char[]' or 'const char[]' variables. */ +#define gettext_noop(String) String + +#endif /* _LIBGETTEXT_H */ diff --git a/src/apps/bin/bison/lib/gnulib.mk b/src/apps/bin/bison/lib/gnulib.mk new file mode 100644 index 0000000000..912d27eb82 --- /dev/null +++ b/src/apps/bin/bison/lib/gnulib.mk @@ -0,0 +1,61 @@ +# This file is generated automatically by "bootstrap". +BUILT_SOURCES += $(ALLOCA_H) +EXTRA_DIST += alloca_.h + +# We need the following in order to create an when the system +# doesn't have one that works with the given compiler. +all-local $(lib_OBJECTS): $(ALLOCA_H) +alloca.h: alloca_.h + cp $(srcdir)/alloca_.h $@-t + mv $@-t $@ +MOSTLYCLEANFILES += alloca.h alloca.h-t + +lib_SOURCES += argmatch.h argmatch.c + +lib_SOURCES += dirname.h dirname.c basename.c stripslash.c + + +lib_SOURCES += exit.h + +lib_SOURCES += exitfail.h exitfail.c + + +lib_SOURCES += getopt.h getopt.c getopt1.c getopt_int.h + +lib_SOURCES += gettext.h + +lib_SOURCES += hard-locale.h hard-locale.c + +lib_SOURCES += hash.h hash.c + + +lib_SOURCES += mbswidth.h mbswidth.c + + +lib_SOURCES += quote.h quote.c + +lib_SOURCES += quotearg.h quotearg.c + + +BUILT_SOURCES += $(STDBOOL_H) +EXTRA_DIST += stdbool_.h + +# We need the following in order to create an when the system +# doesn't have one that works. +all-local $(lib_OBJECTS): $(STDBOOL_H) +stdbool.h: stdbool_.h + sed -e 's/@''HAVE__BOOL''@/$(HAVE__BOOL)/g' < $(srcdir)/stdbool_.h > $@-t + mv $@-t $@ +MOSTLYCLEANFILES += stdbool.h stdbool.h-t + +lib_SOURCES += stpcpy.h + +lib_SOURCES += strndup.h + + +lib_SOURCES += unlocked-io.h + +lib_SOURCES += xalloc.h xmalloc.c xstrdup.c + +lib_SOURCES += xstrndup.h xstrndup.c + diff --git a/src/apps/bin/bison/lib/hard-locale.c b/src/apps/bin/bison/lib/hard-locale.c new file mode 100644 index 0000000000..8c0ee8c777 --- /dev/null +++ b/src/apps/bin/bison/lib/hard-locale.c @@ -0,0 +1,74 @@ +/* hard-locale.c -- Determine whether a locale is hard. + + Copyright (C) 1997, 1998, 1999, 2002, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +# include +#endif + +#include "hard-locale.h" + +#if HAVE_LOCALE_H +# include +#endif + +#include +#include + +/* Return nonzero if the current CATEGORY locale is hard, i.e. if you + can't get away with assuming traditional C or POSIX behavior. */ +int +hard_locale (int category) +{ +#if ! HAVE_SETLOCALE + return 0; +#else + + int hard = 1; + char const *p = setlocale (category, 0); + + if (p) + { +# if defined __GLIBC__ && 2 <= __GLIBC__ + if (strcmp (p, "C") == 0 || strcmp (p, "POSIX") == 0) + hard = 0; +# else + char *locale = malloc (strlen (p) + 1); + if (locale) + { + strcpy (locale, p); + + /* Temporarily set the locale to the "C" and "POSIX" locales + to find their names, so that we can determine whether one + or the other is the caller's locale. */ + if (((p = setlocale (category, "C")) + && strcmp (p, locale) == 0) + || ((p = setlocale (category, "POSIX")) + && strcmp (p, locale) == 0)) + hard = 0; + + /* Restore the caller's locale. */ + setlocale (category, locale); + free (locale); + } +# endif + } + + return hard; + +#endif +} diff --git a/src/apps/bin/bison/lib/hard-locale.h b/src/apps/bin/bison/lib/hard-locale.h new file mode 100644 index 0000000000..ddc15d019d --- /dev/null +++ b/src/apps/bin/bison/lib/hard-locale.h @@ -0,0 +1,24 @@ +/* Determine whether a locale is hard. + + Copyright (C) 1999, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef HARD_LOCALE_H_ +# define HARD_LOCALE_H_ 1 + +int hard_locale (int); + +#endif /* HARD_LOCALE_H_ */ diff --git a/src/apps/bin/bison/lib/hash.c b/src/apps/bin/bison/lib/hash.c new file mode 100644 index 0000000000..945bb80f78 --- /dev/null +++ b/src/apps/bin/bison/lib/hash.c @@ -0,0 +1,1048 @@ +/* hash - hashing table processing. + + Copyright (C) 1998, 1999, 2000, 2001, 2002, 2003 Free Software + Foundation, Inc. + + Written by Jim Meyering, 1992. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* A generic hash table package. */ + +/* Define USE_OBSTACK to 1 if you want the allocator to use obstacks instead + of malloc. If you change USE_OBSTACK, you have to recompile! */ + +#if HAVE_CONFIG_H +# include +#endif + +#include "hash.h" +#include "xalloc.h" + +#include +#include +#include + +#if USE_OBSTACK +# include "obstack.h" +# ifndef obstack_chunk_alloc +# define obstack_chunk_alloc malloc +# endif +# ifndef obstack_chunk_free +# define obstack_chunk_free free +# endif +#endif + +#ifndef SIZE_MAX +# define SIZE_MAX ((size_t) -1) +#endif + +struct hash_table + { + /* The array of buckets starts at BUCKET and extends to BUCKET_LIMIT-1, + for a possibility of N_BUCKETS. Among those, N_BUCKETS_USED buckets + are not empty, there are N_ENTRIES active entries in the table. */ + struct hash_entry *bucket; + struct hash_entry const *bucket_limit; + size_t n_buckets; + size_t n_buckets_used; + size_t n_entries; + + /* Tuning arguments, kept in a physicaly separate structure. */ + const Hash_tuning *tuning; + + /* Three functions are given to `hash_initialize', see the documentation + block for this function. In a word, HASHER randomizes a user entry + into a number up from 0 up to some maximum minus 1; COMPARATOR returns + true if two user entries compare equally; and DATA_FREER is the cleanup + function for a user entry. */ + Hash_hasher hasher; + Hash_comparator comparator; + Hash_data_freer data_freer; + + /* A linked list of freed struct hash_entry structs. */ + struct hash_entry *free_entry_list; + +#if USE_OBSTACK + /* Whenever obstacks are used, it is possible to allocate all overflowed + entries into a single stack, so they all can be freed in a single + operation. It is not clear if the speedup is worth the trouble. */ + struct obstack entry_stack; +#endif + }; + +/* A hash table contains many internal entries, each holding a pointer to + some user provided data (also called a user entry). An entry indistinctly + refers to both the internal entry and its associated user entry. A user + entry contents may be hashed by a randomization function (the hashing + function, or just `hasher' for short) into a number (or `slot') between 0 + and the current table size. At each slot position in the hash table, + starts a linked chain of entries for which the user data all hash to this + slot. A bucket is the collection of all entries hashing to the same slot. + + A good `hasher' function will distribute entries rather evenly in buckets. + In the ideal case, the length of each bucket is roughly the number of + entries divided by the table size. Finding the slot for a data is usually + done in constant time by the `hasher', and the later finding of a precise + entry is linear in time with the size of the bucket. Consequently, a + larger hash table size (that is, a larger number of buckets) is prone to + yielding shorter chains, *given* the `hasher' function behaves properly. + + Long buckets slow down the lookup algorithm. One might use big hash table + sizes in hope to reduce the average length of buckets, but this might + become inordinate, as unused slots in the hash table take some space. The + best bet is to make sure you are using a good `hasher' function (beware + that those are not that easy to write! :-), and to use a table size + larger than the actual number of entries. */ + +/* If an insertion makes the ratio of nonempty buckets to table size larger + than the growth threshold (a number between 0.0 and 1.0), then increase + the table size by multiplying by the growth factor (a number greater than + 1.0). The growth threshold defaults to 0.8, and the growth factor + defaults to 1.414, meaning that the table will have doubled its size + every second time 80% of the buckets get used. */ +#define DEFAULT_GROWTH_THRESHOLD 0.8 +#define DEFAULT_GROWTH_FACTOR 1.414 + +/* If a deletion empties a bucket and causes the ratio of used buckets to + table size to become smaller than the shrink threshold (a number between + 0.0 and 1.0), then shrink the table by multiplying by the shrink factor (a + number greater than the shrink threshold but smaller than 1.0). The shrink + threshold and factor default to 0.0 and 1.0, meaning that the table never + shrinks. */ +#define DEFAULT_SHRINK_THRESHOLD 0.0 +#define DEFAULT_SHRINK_FACTOR 1.0 + +/* Use this to initialize or reset a TUNING structure to + some sensible values. */ +static const Hash_tuning default_tuning = + { + DEFAULT_SHRINK_THRESHOLD, + DEFAULT_SHRINK_FACTOR, + DEFAULT_GROWTH_THRESHOLD, + DEFAULT_GROWTH_FACTOR, + false + }; + +/* Information and lookup. */ + +/* The following few functions provide information about the overall hash + table organization: the number of entries, number of buckets and maximum + length of buckets. */ + +/* Return the number of buckets in the hash table. The table size, the total + number of buckets (used plus unused), or the maximum number of slots, are + the same quantity. */ + +size_t +hash_get_n_buckets (const Hash_table *table) +{ + return table->n_buckets; +} + +/* Return the number of slots in use (non-empty buckets). */ + +size_t +hash_get_n_buckets_used (const Hash_table *table) +{ + return table->n_buckets_used; +} + +/* Return the number of active entries. */ + +size_t +hash_get_n_entries (const Hash_table *table) +{ + return table->n_entries; +} + +/* Return the length of the longest chain (bucket). */ + +size_t +hash_get_max_bucket_length (const Hash_table *table) +{ + struct hash_entry const *bucket; + size_t max_bucket_length = 0; + + for (bucket = table->bucket; bucket < table->bucket_limit; bucket++) + { + if (bucket->data) + { + struct hash_entry const *cursor = bucket; + size_t bucket_length = 1; + + while (cursor = cursor->next, cursor) + bucket_length++; + + if (bucket_length > max_bucket_length) + max_bucket_length = bucket_length; + } + } + + return max_bucket_length; +} + +/* Do a mild validation of a hash table, by traversing it and checking two + statistics. */ + +bool +hash_table_ok (const Hash_table *table) +{ + struct hash_entry const *bucket; + size_t n_buckets_used = 0; + size_t n_entries = 0; + + for (bucket = table->bucket; bucket < table->bucket_limit; bucket++) + { + if (bucket->data) + { + struct hash_entry const *cursor = bucket; + + /* Count bucket head. */ + n_buckets_used++; + n_entries++; + + /* Count bucket overflow. */ + while (cursor = cursor->next, cursor) + n_entries++; + } + } + + if (n_buckets_used == table->n_buckets_used && n_entries == table->n_entries) + return true; + + return false; +} + +void +hash_print_statistics (const Hash_table *table, FILE *stream) +{ + size_t n_entries = hash_get_n_entries (table); + size_t n_buckets = hash_get_n_buckets (table); + size_t n_buckets_used = hash_get_n_buckets_used (table); + size_t max_bucket_length = hash_get_max_bucket_length (table); + + fprintf (stream, "# entries: %lu\n", (unsigned long int) n_entries); + fprintf (stream, "# buckets: %lu\n", (unsigned long int) n_buckets); + fprintf (stream, "# buckets used: %lu (%.2f%%)\n", + (unsigned long int) n_buckets_used, + (100.0 * n_buckets_used) / n_buckets); + fprintf (stream, "max bucket length: %lu\n", + (unsigned long int) max_bucket_length); +} + +/* If ENTRY matches an entry already in the hash table, return the + entry from the table. Otherwise, return NULL. */ + +void * +hash_lookup (const Hash_table *table, const void *entry) +{ + struct hash_entry const *bucket + = table->bucket + table->hasher (entry, table->n_buckets); + struct hash_entry const *cursor; + + if (! (bucket < table->bucket_limit)) + abort (); + + if (bucket->data == NULL) + return NULL; + + for (cursor = bucket; cursor; cursor = cursor->next) + if (table->comparator (entry, cursor->data)) + return cursor->data; + + return NULL; +} + +/* Walking. */ + +/* The functions in this page traverse the hash table and process the + contained entries. For the traversal to work properly, the hash table + should not be resized nor modified while any particular entry is being + processed. In particular, entries should not be added or removed. */ + +/* Return the first data in the table, or NULL if the table is empty. */ + +void * +hash_get_first (const Hash_table *table) +{ + struct hash_entry const *bucket; + + if (table->n_entries == 0) + return NULL; + + for (bucket = table->bucket; ; bucket++) + if (! (bucket < table->bucket_limit)) + abort (); + else if (bucket->data) + return bucket->data; +} + +/* Return the user data for the entry following ENTRY, where ENTRY has been + returned by a previous call to either `hash_get_first' or `hash_get_next'. + Return NULL if there are no more entries. */ + +void * +hash_get_next (const Hash_table *table, const void *entry) +{ + struct hash_entry const *bucket + = table->bucket + table->hasher (entry, table->n_buckets); + struct hash_entry const *cursor; + + if (! (bucket < table->bucket_limit)) + abort (); + + /* Find next entry in the same bucket. */ + for (cursor = bucket; cursor; cursor = cursor->next) + if (cursor->data == entry && cursor->next) + return cursor->next->data; + + /* Find first entry in any subsequent bucket. */ + while (++bucket < table->bucket_limit) + if (bucket->data) + return bucket->data; + + /* None found. */ + return NULL; +} + +/* Fill BUFFER with pointers to active user entries in the hash table, then + return the number of pointers copied. Do not copy more than BUFFER_SIZE + pointers. */ + +size_t +hash_get_entries (const Hash_table *table, void **buffer, + size_t buffer_size) +{ + size_t counter = 0; + struct hash_entry const *bucket; + struct hash_entry const *cursor; + + for (bucket = table->bucket; bucket < table->bucket_limit; bucket++) + { + if (bucket->data) + { + for (cursor = bucket; cursor; cursor = cursor->next) + { + if (counter >= buffer_size) + return counter; + buffer[counter++] = cursor->data; + } + } + } + + return counter; +} + +/* Call a PROCESSOR function for each entry of a hash table, and return the + number of entries for which the processor function returned success. A + pointer to some PROCESSOR_DATA which will be made available to each call to + the processor function. The PROCESSOR accepts two arguments: the first is + the user entry being walked into, the second is the value of PROCESSOR_DATA + as received. The walking continue for as long as the PROCESSOR function + returns nonzero. When it returns zero, the walking is interrupted. */ + +size_t +hash_do_for_each (const Hash_table *table, Hash_processor processor, + void *processor_data) +{ + size_t counter = 0; + struct hash_entry const *bucket; + struct hash_entry const *cursor; + + for (bucket = table->bucket; bucket < table->bucket_limit; bucket++) + { + if (bucket->data) + { + for (cursor = bucket; cursor; cursor = cursor->next) + { + if (!(*processor) (cursor->data, processor_data)) + return counter; + counter++; + } + } + } + + return counter; +} + +/* Allocation and clean-up. */ + +/* Return a hash index for a NUL-terminated STRING between 0 and N_BUCKETS-1. + This is a convenience routine for constructing other hashing functions. */ + +#if USE_DIFF_HASH + +/* About hashings, Paul Eggert writes to me (FP), on 1994-01-01: "Please see + B. J. McKenzie, R. Harries & T. Bell, Selecting a hashing algorithm, + Software--practice & experience 20, 2 (Feb 1990), 209-224. Good hash + algorithms tend to be domain-specific, so what's good for [diffutils'] io.c + may not be good for your application." */ + +size_t +hash_string (const char *string, size_t n_buckets) +{ +# define ROTATE_LEFT(Value, Shift) \ + ((Value) << (Shift) | (Value) >> ((sizeof (size_t) * CHAR_BIT) - (Shift))) +# define HASH_ONE_CHAR(Value, Byte) \ + ((Byte) + ROTATE_LEFT (Value, 7)) + + size_t value = 0; + + for (; *string; string++) + value = HASH_ONE_CHAR (value, (unsigned char) *string); + return value % n_buckets; + +# undef ROTATE_LEFT +# undef HASH_ONE_CHAR +} + +#else /* not USE_DIFF_HASH */ + +/* This one comes from `recode', and performs a bit better than the above as + per a few experiments. It is inspired from a hashing routine found in the + very old Cyber `snoop', itself written in typical Greg Mansfield style. + (By the way, what happened to this excellent man? Is he still alive?) */ + +size_t +hash_string (const char *string, size_t n_buckets) +{ + size_t value = 0; + + while (*string) + value = (value * 31 + (unsigned char) *string++) % n_buckets; + return value; +} + +#endif /* not USE_DIFF_HASH */ + +/* Return true if CANDIDATE is a prime number. CANDIDATE should be an odd + number at least equal to 11. */ + +static bool +is_prime (size_t candidate) +{ + size_t divisor = 3; + size_t square = divisor * divisor; + + while (square < candidate && (candidate % divisor)) + { + divisor++; + square += 4 * divisor; + divisor++; + } + + return (candidate % divisor ? true : false); +} + +/* Round a given CANDIDATE number up to the nearest prime, and return that + prime. Primes lower than 10 are merely skipped. */ + +static size_t +next_prime (size_t candidate) +{ + /* Skip small primes. */ + if (candidate < 10) + candidate = 10; + + /* Make it definitely odd. */ + candidate |= 1; + + while (!is_prime (candidate)) + candidate += 2; + + return candidate; +} + +void +hash_reset_tuning (Hash_tuning *tuning) +{ + *tuning = default_tuning; +} + +/* For the given hash TABLE, check the user supplied tuning structure for + reasonable values, and return true if there is no gross error with it. + Otherwise, definitively reset the TUNING field to some acceptable default + in the hash table (that is, the user loses the right of further modifying + tuning arguments), and return false. */ + +static bool +check_tuning (Hash_table *table) +{ + const Hash_tuning *tuning = table->tuning; + + /* Be a bit stricter than mathematics would require, so that + rounding errors in size calculations do not cause allocations to + fail to grow or shrink as they should. The smallest allocation + is 11 (due to next_prime's algorithm), so an epsilon of 0.1 + should be good enough. */ + float epsilon = 0.1f; + + if (epsilon < tuning->growth_threshold + && tuning->growth_threshold < 1 - epsilon + && 1 + epsilon < tuning->growth_factor + && 0 <= tuning->shrink_threshold + && tuning->shrink_threshold + epsilon < tuning->shrink_factor + && tuning->shrink_factor <= 1 + && tuning->shrink_threshold + epsilon < tuning->growth_threshold) + return true; + + table->tuning = &default_tuning; + return false; +} + +/* Allocate and return a new hash table, or NULL upon failure. The initial + number of buckets is automatically selected so as to _guarantee_ that you + may insert at least CANDIDATE different user entries before any growth of + the hash table size occurs. So, if have a reasonably tight a-priori upper + bound on the number of entries you intend to insert in the hash table, you + may save some table memory and insertion time, by specifying it here. If + the IS_N_BUCKETS field of the TUNING structure is true, the CANDIDATE + argument has its meaning changed to the wanted number of buckets. + + TUNING points to a structure of user-supplied values, in case some fine + tuning is wanted over the default behavior of the hasher. If TUNING is + NULL, the default tuning parameters are used instead. + + The user-supplied HASHER function should be provided. It accepts two + arguments ENTRY and TABLE_SIZE. It computes, by hashing ENTRY contents, a + slot number for that entry which should be in the range 0..TABLE_SIZE-1. + This slot number is then returned. + + The user-supplied COMPARATOR function should be provided. It accepts two + arguments pointing to user data, it then returns true for a pair of entries + that compare equal, or false otherwise. This function is internally called + on entries which are already known to hash to the same bucket index. + + The user-supplied DATA_FREER function, when not NULL, may be later called + with the user data as an argument, just before the entry containing the + data gets freed. This happens from within `hash_free' or `hash_clear'. + You should specify this function only if you want these functions to free + all of your `data' data. This is typically the case when your data is + simply an auxiliary struct that you have malloc'd to aggregate several + values. */ + +Hash_table * +hash_initialize (size_t candidate, const Hash_tuning *tuning, + Hash_hasher hasher, Hash_comparator comparator, + Hash_data_freer data_freer) +{ + Hash_table *table; + + if (hasher == NULL || comparator == NULL) + return NULL; + + table = malloc (sizeof *table); + if (table == NULL) + return NULL; + + if (!tuning) + tuning = &default_tuning; + table->tuning = tuning; + if (!check_tuning (table)) + { + /* Fail if the tuning options are invalid. This is the only occasion + when the user gets some feedback about it. Once the table is created, + if the user provides invalid tuning options, we silently revert to + using the defaults, and ignore further request to change the tuning + options. */ + goto fail; + } + + if (!tuning->is_n_buckets) + { + float new_candidate = candidate / tuning->growth_threshold; + if (SIZE_MAX <= new_candidate) + goto fail; + candidate = new_candidate; + } + + if (xalloc_oversized (candidate, sizeof *table->bucket)) + goto fail; + table->n_buckets = next_prime (candidate); + if (xalloc_oversized (table->n_buckets, sizeof *table->bucket)) + goto fail; + + table->bucket = calloc (table->n_buckets, sizeof *table->bucket); + table->bucket_limit = table->bucket + table->n_buckets; + table->n_buckets_used = 0; + table->n_entries = 0; + + table->hasher = hasher; + table->comparator = comparator; + table->data_freer = data_freer; + + table->free_entry_list = NULL; +#if USE_OBSTACK + obstack_init (&table->entry_stack); +#endif + return table; + + fail: + free (table); + return NULL; +} + +/* Make all buckets empty, placing any chained entries on the free list. + Apply the user-specified function data_freer (if any) to the datas of any + affected entries. */ + +void +hash_clear (Hash_table *table) +{ + struct hash_entry *bucket; + + for (bucket = table->bucket; bucket < table->bucket_limit; bucket++) + { + if (bucket->data) + { + struct hash_entry *cursor; + struct hash_entry *next; + + /* Free the bucket overflow. */ + for (cursor = bucket->next; cursor; cursor = next) + { + if (table->data_freer) + (*table->data_freer) (cursor->data); + cursor->data = NULL; + + next = cursor->next; + /* Relinking is done one entry at a time, as it is to be expected + that overflows are either rare or short. */ + cursor->next = table->free_entry_list; + table->free_entry_list = cursor; + } + + /* Free the bucket head. */ + if (table->data_freer) + (*table->data_freer) (bucket->data); + bucket->data = NULL; + bucket->next = NULL; + } + } + + table->n_buckets_used = 0; + table->n_entries = 0; +} + +/* Reclaim all storage associated with a hash table. If a data_freer + function has been supplied by the user when the hash table was created, + this function applies it to the data of each entry before freeing that + entry. */ + +void +hash_free (Hash_table *table) +{ + struct hash_entry *bucket; + struct hash_entry *cursor; + struct hash_entry *next; + + /* Call the user data_freer function. */ + if (table->data_freer && table->n_entries) + { + for (bucket = table->bucket; bucket < table->bucket_limit; bucket++) + { + if (bucket->data) + { + for (cursor = bucket; cursor; cursor = cursor->next) + { + (*table->data_freer) (cursor->data); + } + } + } + } + +#if USE_OBSTACK + + obstack_free (&table->entry_stack, NULL); + +#else + + /* Free all bucket overflowed entries. */ + for (bucket = table->bucket; bucket < table->bucket_limit; bucket++) + { + for (cursor = bucket->next; cursor; cursor = next) + { + next = cursor->next; + free (cursor); + } + } + + /* Also reclaim the internal list of previously freed entries. */ + for (cursor = table->free_entry_list; cursor; cursor = next) + { + next = cursor->next; + free (cursor); + } + +#endif + + /* Free the remainder of the hash table structure. */ + free (table->bucket); + free (table); +} + +/* Insertion and deletion. */ + +/* Get a new hash entry for a bucket overflow, possibly by reclying a + previously freed one. If this is not possible, allocate a new one. */ + +static struct hash_entry * +allocate_entry (Hash_table *table) +{ + struct hash_entry *new; + + if (table->free_entry_list) + { + new = table->free_entry_list; + table->free_entry_list = new->next; + } + else + { +#if USE_OBSTACK + new = obstack_alloc (&table->entry_stack, sizeof *new); +#else + new = malloc (sizeof *new); +#endif + } + + return new; +} + +/* Free a hash entry which was part of some bucket overflow, + saving it for later recycling. */ + +static void +free_entry (Hash_table *table, struct hash_entry *entry) +{ + entry->data = NULL; + entry->next = table->free_entry_list; + table->free_entry_list = entry; +} + +/* This private function is used to help with insertion and deletion. When + ENTRY matches an entry in the table, return a pointer to the corresponding + user data and set *BUCKET_HEAD to the head of the selected bucket. + Otherwise, return NULL. When DELETE is true and ENTRY matches an entry in + the table, unlink the matching entry. */ + +static void * +hash_find_entry (Hash_table *table, const void *entry, + struct hash_entry **bucket_head, bool delete) +{ + struct hash_entry *bucket + = table->bucket + table->hasher (entry, table->n_buckets); + struct hash_entry *cursor; + + if (! (bucket < table->bucket_limit)) + abort (); + + *bucket_head = bucket; + + /* Test for empty bucket. */ + if (bucket->data == NULL) + return NULL; + + /* See if the entry is the first in the bucket. */ + if ((*table->comparator) (entry, bucket->data)) + { + void *data = bucket->data; + + if (delete) + { + if (bucket->next) + { + struct hash_entry *next = bucket->next; + + /* Bump the first overflow entry into the bucket head, then save + the previous first overflow entry for later recycling. */ + *bucket = *next; + free_entry (table, next); + } + else + { + bucket->data = NULL; + } + } + + return data; + } + + /* Scan the bucket overflow. */ + for (cursor = bucket; cursor->next; cursor = cursor->next) + { + if ((*table->comparator) (entry, cursor->next->data)) + { + void *data = cursor->next->data; + + if (delete) + { + struct hash_entry *next = cursor->next; + + /* Unlink the entry to delete, then save the freed entry for later + recycling. */ + cursor->next = next->next; + free_entry (table, next); + } + + return data; + } + } + + /* No entry found. */ + return NULL; +} + +/* For an already existing hash table, change the number of buckets through + specifying CANDIDATE. The contents of the hash table are preserved. The + new number of buckets is automatically selected so as to _guarantee_ that + the table may receive at least CANDIDATE different user entries, including + those already in the table, before any other growth of the hash table size + occurs. If TUNING->IS_N_BUCKETS is true, then CANDIDATE specifies the + exact number of buckets desired. */ + +bool +hash_rehash (Hash_table *table, size_t candidate) +{ + Hash_table *new_table; + struct hash_entry *bucket; + struct hash_entry *cursor; + struct hash_entry *next; + + new_table = hash_initialize (candidate, table->tuning, table->hasher, + table->comparator, table->data_freer); + if (new_table == NULL) + return false; + + /* Merely reuse the extra old space into the new table. */ +#if USE_OBSTACK + obstack_free (&new_table->entry_stack, NULL); + new_table->entry_stack = table->entry_stack; +#endif + new_table->free_entry_list = table->free_entry_list; + + for (bucket = table->bucket; bucket < table->bucket_limit; bucket++) + if (bucket->data) + for (cursor = bucket; cursor; cursor = next) + { + void *data = cursor->data; + struct hash_entry *new_bucket + = (new_table->bucket + + new_table->hasher (data, new_table->n_buckets)); + + if (! (new_bucket < new_table->bucket_limit)) + abort (); + + next = cursor->next; + + if (new_bucket->data) + { + if (cursor == bucket) + { + /* Allocate or recycle an entry, when moving from a bucket + header into a bucket overflow. */ + struct hash_entry *new_entry = allocate_entry (new_table); + + if (new_entry == NULL) + return false; + + new_entry->data = data; + new_entry->next = new_bucket->next; + new_bucket->next = new_entry; + } + else + { + /* Merely relink an existing entry, when moving from a + bucket overflow into a bucket overflow. */ + cursor->next = new_bucket->next; + new_bucket->next = cursor; + } + } + else + { + /* Free an existing entry, when moving from a bucket + overflow into a bucket header. Also take care of the + simple case of moving from a bucket header into a bucket + header. */ + new_bucket->data = data; + new_table->n_buckets_used++; + if (cursor != bucket) + free_entry (new_table, cursor); + } + } + + free (table->bucket); + table->bucket = new_table->bucket; + table->bucket_limit = new_table->bucket_limit; + table->n_buckets = new_table->n_buckets; + table->n_buckets_used = new_table->n_buckets_used; + table->free_entry_list = new_table->free_entry_list; + /* table->n_entries already holds its value. */ +#if USE_OBSTACK + table->entry_stack = new_table->entry_stack; +#endif + free (new_table); + + return true; +} + +/* If ENTRY matches an entry already in the hash table, return the pointer + to the entry from the table. Otherwise, insert ENTRY and return ENTRY. + Return NULL if the storage required for insertion cannot be allocated. */ + +void * +hash_insert (Hash_table *table, const void *entry) +{ + void *data; + struct hash_entry *bucket; + + /* The caller cannot insert a NULL entry. */ + if (! entry) + abort (); + + /* If there's a matching entry already in the table, return that. */ + if ((data = hash_find_entry (table, entry, &bucket, false)) != NULL) + return data; + + /* ENTRY is not matched, it should be inserted. */ + + if (bucket->data) + { + struct hash_entry *new_entry = allocate_entry (table); + + if (new_entry == NULL) + return NULL; + + /* Add ENTRY in the overflow of the bucket. */ + + new_entry->data = (void *) entry; + new_entry->next = bucket->next; + bucket->next = new_entry; + table->n_entries++; + return (void *) entry; + } + + /* Add ENTRY right in the bucket head. */ + + bucket->data = (void *) entry; + table->n_entries++; + table->n_buckets_used++; + + /* If the growth threshold of the buckets in use has been reached, increase + the table size and rehash. There's no point in checking the number of + entries: if the hashing function is ill-conditioned, rehashing is not + likely to improve it. */ + + if (table->n_buckets_used + > table->tuning->growth_threshold * table->n_buckets) + { + /* Check more fully, before starting real work. If tuning arguments + became invalid, the second check will rely on proper defaults. */ + check_tuning (table); + if (table->n_buckets_used + > table->tuning->growth_threshold * table->n_buckets) + { + const Hash_tuning *tuning = table->tuning; + float candidate = + (tuning->is_n_buckets + ? (table->n_buckets * tuning->growth_factor) + : (table->n_buckets * tuning->growth_factor + * tuning->growth_threshold)); + + if (SIZE_MAX <= candidate) + return NULL; + + /* If the rehash fails, arrange to return NULL. */ + if (!hash_rehash (table, candidate)) + entry = NULL; + } + } + + return (void *) entry; +} + +/* If ENTRY is already in the table, remove it and return the just-deleted + data (the user may want to deallocate its storage). If ENTRY is not in the + table, don't modify the table and return NULL. */ + +void * +hash_delete (Hash_table *table, const void *entry) +{ + void *data; + struct hash_entry *bucket; + + data = hash_find_entry (table, entry, &bucket, true); + if (!data) + return NULL; + + table->n_entries--; + if (!bucket->data) + { + table->n_buckets_used--; + + /* If the shrink threshold of the buckets in use has been reached, + rehash into a smaller table. */ + + if (table->n_buckets_used + < table->tuning->shrink_threshold * table->n_buckets) + { + /* Check more fully, before starting real work. If tuning arguments + became invalid, the second check will rely on proper defaults. */ + check_tuning (table); + if (table->n_buckets_used + < table->tuning->shrink_threshold * table->n_buckets) + { + const Hash_tuning *tuning = table->tuning; + size_t candidate = + (tuning->is_n_buckets + ? table->n_buckets * tuning->shrink_factor + : (table->n_buckets * tuning->shrink_factor + * tuning->growth_threshold)); + + hash_rehash (table, candidate); + } + } + } + + return data; +} + +/* Testing. */ + +#if TESTING + +void +hash_print (const Hash_table *table) +{ + struct hash_entry const *bucket; + + for (bucket = table->bucket; bucket < table->bucket_limit; bucket++) + { + struct hash_entry *cursor; + + if (bucket) + printf ("%lu:\n", (unsigned long int) (bucket - table->bucket)); + + for (cursor = bucket; cursor; cursor = cursor->next) + { + char const *s = cursor->data; + /* FIXME */ + if (s) + printf (" %s\n", s); + } + } +} + +#endif /* TESTING */ diff --git a/src/apps/bin/bison/lib/hash.h b/src/apps/bin/bison/lib/hash.h new file mode 100644 index 0000000000..6920824e8a --- /dev/null +++ b/src/apps/bin/bison/lib/hash.h @@ -0,0 +1,88 @@ +/* hash - hashing table processing. + Copyright (C) 1998, 1999, 2001, 2003 Free Software Foundation, Inc. + Written by Jim Meyering , 1998. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* A generic hash table package. */ + +/* Make sure USE_OBSTACK is defined to 1 if you want the allocator to use + obstacks instead of malloc, and recompile `hash.c' with same setting. */ + +#ifndef HASH_H_ +# define HASH_H_ + +# include +# include + +typedef size_t (*Hash_hasher) (const void *, size_t); +typedef bool (*Hash_comparator) (const void *, const void *); +typedef void (*Hash_data_freer) (void *); +typedef bool (*Hash_processor) (void *, void *); + +struct hash_entry + { + void *data; + struct hash_entry *next; + }; + +struct hash_tuning + { + /* This structure is mainly used for `hash_initialize', see the block + documentation of `hash_reset_tuning' for more complete comments. */ + + float shrink_threshold; /* ratio of used buckets to trigger a shrink */ + float shrink_factor; /* ratio of new smaller size to original size */ + float growth_threshold; /* ratio of used buckets to trigger a growth */ + float growth_factor; /* ratio of new bigger size to original size */ + bool is_n_buckets; /* if CANDIDATE really means table size */ + }; + +typedef struct hash_tuning Hash_tuning; + +struct hash_table; + +typedef struct hash_table Hash_table; + +/* Information and lookup. */ +size_t hash_get_n_buckets (const Hash_table *); +size_t hash_get_n_buckets_used (const Hash_table *); +size_t hash_get_n_entries (const Hash_table *); +size_t hash_get_max_bucket_length (const Hash_table *); +bool hash_table_ok (const Hash_table *); +void hash_print_statistics (const Hash_table *, FILE *); +void *hash_lookup (const Hash_table *, const void *); + +/* Walking. */ +void *hash_get_first (const Hash_table *); +void *hash_get_next (const Hash_table *, const void *); +size_t hash_get_entries (const Hash_table *, void **, size_t); +size_t hash_do_for_each (const Hash_table *, Hash_processor, void *); + +/* Allocation and clean-up. */ +size_t hash_string (const char *, size_t); +void hash_reset_tuning (Hash_tuning *); +Hash_table *hash_initialize (size_t, const Hash_tuning *, + Hash_hasher, Hash_comparator, + Hash_data_freer); +void hash_clear (Hash_table *); +void hash_free (Hash_table *); + +/* Insertion and deletion. */ +bool hash_rehash (Hash_table *, size_t); +void *hash_insert (Hash_table *, const void *); +void *hash_delete (Hash_table *, const void *); + +#endif diff --git a/src/apps/bin/bison/lib/lbitset.c b/src/apps/bin/bison/lib/lbitset.c new file mode 100644 index 0000000000..a405b8cf61 --- /dev/null +++ b/src/apps/bin/bison/lib/lbitset.c @@ -0,0 +1,1406 @@ +/* Functions to support link list bitsets. + Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "lbitset.h" +#include "obstack.h" +#include +#include +#include +#include + +/* This file implements linked-list bitsets. These bitsets can be of + arbitrary length and are more efficient than arrays of bits for + large sparse sets. + + Usually if all the bits in an element are zero we remove the element + from the list. However, a side effect of the bit caching is that we + do not always notice when an element becomes zero. Hence the + lbitset_weed function which removes zero elements. */ + + +/* Number of words to use for each element. The larger the value the + greater the size of the cache and the shorter the time to find a given bit + but the more memory wasted for sparse bitsets and the longer the time + to search for set bits. + + The routines that dominate timing profiles are lbitset_elt_find + and lbitset_elt_link, especially when accessing the bits randomly. */ + +#define LBITSET_ELT_WORDS 2 + +typedef bitset_word lbitset_word; + +#define LBITSET_WORD_BITS BITSET_WORD_BITS + +/* Number of bits stored in each element. */ +#define LBITSET_ELT_BITS \ + ((unsigned int) (LBITSET_ELT_WORDS * LBITSET_WORD_BITS)) + +/* Lbitset element. We use an array of bits for each element. + These are linked together in a doubly-linked list. */ +typedef struct lbitset_elt_struct +{ + struct lbitset_elt_struct *next; /* Next element. */ + struct lbitset_elt_struct *prev; /* Previous element. */ + bitset_windex index; /* bitno / BITSET_WORD_BITS. */ + bitset_word words[LBITSET_ELT_WORDS]; /* Bits that are set. */ +} +lbitset_elt; + + +enum lbitset_find_mode + { LBITSET_FIND, LBITSET_CREATE, LBITSET_SUBST }; + +static lbitset_elt lbitset_zero_elts[3]; /* Elements of all zero bits. */ + +/* Obstack to allocate bitset elements from. */ +static struct obstack lbitset_obstack; +static bool lbitset_obstack_init = false; +static lbitset_elt *lbitset_free_list; /* Free list of bitset elements. */ + +extern void debug_lbitset (bitset); + +#define LBITSET_CURRENT1(X) \ + ((lbitset_elt *) (void *) ((char *) (X) - offsetof (lbitset_elt, words))) + +#define LBITSET_CURRENT(X) LBITSET_CURRENT1((X)->b.cdata) + +#define LBITSET_HEAD(X) ((X)->l.head) +#define LBITSET_TAIL(X) ((X)->l.tail) + +/* Allocate a lbitset element. The bits are not cleared. */ +static inline lbitset_elt * +lbitset_elt_alloc (void) +{ + lbitset_elt *elt; + + if (lbitset_free_list != 0) + { + elt = lbitset_free_list; + lbitset_free_list = elt->next; + } + else + { + if (!lbitset_obstack_init) + { + lbitset_obstack_init = true; + + /* Let particular systems override the size of a chunk. */ + +#ifndef OBSTACK_CHUNK_SIZE +#define OBSTACK_CHUNK_SIZE 0 +#endif + + /* Let them override the alloc and free routines too. */ + +#ifndef OBSTACK_CHUNK_ALLOC +#define OBSTACK_CHUNK_ALLOC xmalloc +#endif + +#ifndef OBSTACK_CHUNK_FREE +#define OBSTACK_CHUNK_FREE free +#endif + +#if !defined(__GNUC__) || (__GNUC__ < 2) +#define __alignof__(type) 0 +#endif + + obstack_specify_allocation (&lbitset_obstack, OBSTACK_CHUNK_SIZE, + __alignof__ (lbitset_elt), + OBSTACK_CHUNK_ALLOC, + OBSTACK_CHUNK_FREE); + } + + /* Perhaps we should add a number of new elements to the free + list. */ + elt = (lbitset_elt *) obstack_alloc (&lbitset_obstack, + sizeof (lbitset_elt)); + } + + return elt; +} + + +/* Allocate a lbitset element. The bits are cleared. */ +static inline lbitset_elt * +lbitset_elt_calloc (void) +{ + lbitset_elt *elt; + + elt = lbitset_elt_alloc (); + memset (elt->words, 0, sizeof (elt->words)); + return elt; +} + + +static inline void +lbitset_elt_free (lbitset_elt *elt) +{ + elt->next = lbitset_free_list; + lbitset_free_list = elt; +} + + +/* Unlink element ELT from bitset BSET. */ +static inline void +lbitset_elt_unlink (bitset bset, lbitset_elt *elt) +{ + lbitset_elt *next = elt->next; + lbitset_elt *prev = elt->prev; + + if (prev) + prev->next = next; + + if (next) + next->prev = prev; + + if (LBITSET_HEAD (bset) == elt) + LBITSET_HEAD (bset) = next; + if (LBITSET_TAIL (bset) == elt) + LBITSET_TAIL (bset) = prev; + + /* Update cache pointer. Since the first thing we try is to insert + before current, make current the next entry in preference to the + previous. */ + if (LBITSET_CURRENT (bset) == elt) + { + if (next) + { + bset->b.cdata = next->words; + bset->b.cindex = next->index; + } + else if (prev) + { + bset->b.cdata = prev->words; + bset->b.cindex = prev->index; + } + else + { + bset->b.csize = 0; + bset->b.cdata = 0; + } + } + + lbitset_elt_free (elt); +} + + +/* Cut the chain of bitset BSET before element ELT and free the + elements. */ +static inline void +lbitset_prune (bitset bset, lbitset_elt *elt) +{ + lbitset_elt *next; + + if (!elt) + return; + + if (elt->prev) + { + LBITSET_TAIL (bset) = elt->prev; + bset->b.cdata = elt->prev->words; + bset->b.cindex = elt->prev->index; + elt->prev->next = 0; + } + else + { + LBITSET_HEAD (bset) = 0; + LBITSET_TAIL (bset) = 0; + bset->b.cdata = 0; + bset->b.csize = 0; + } + + for (; elt; elt = next) + { + next = elt->next; + lbitset_elt_free (elt); + } +} + + +/* Are all bits in an element zero? */ +static inline bool +lbitset_elt_zero_p (lbitset_elt *elt) +{ + int i; + + for (i = 0; i < LBITSET_ELT_WORDS; i++) + if (elt->words[i]) + return false; + + return true; +} + + +/* Link the bitset element into the current bitset linked list. */ +static inline void +lbitset_elt_link (bitset bset, lbitset_elt *elt) +{ + bitset_windex windex = elt->index; + lbitset_elt *ptr; + lbitset_elt *current; + + if (bset->b.csize) + current = LBITSET_CURRENT (bset); + else + current = LBITSET_HEAD (bset); + + /* If this is the first and only element, add it in. */ + if (LBITSET_HEAD (bset) == 0) + { + elt->next = elt->prev = 0; + LBITSET_HEAD (bset) = elt; + LBITSET_TAIL (bset) = elt; + } + + /* If this index is less than that of the current element, it goes + somewhere before the current element. */ + else if (windex < bset->b.cindex) + { + for (ptr = current; + ptr->prev && ptr->prev->index > windex; ptr = ptr->prev) + continue; + + if (ptr->prev) + ptr->prev->next = elt; + else + LBITSET_HEAD (bset) = elt; + + elt->prev = ptr->prev; + elt->next = ptr; + ptr->prev = elt; + } + + /* Otherwise, it must go somewhere after the current element. */ + else + { + for (ptr = current; + ptr->next && ptr->next->index < windex; ptr = ptr->next) + continue; + + if (ptr->next) + ptr->next->prev = elt; + else + LBITSET_TAIL (bset) = elt; + + elt->next = ptr->next; + elt->prev = ptr; + ptr->next = elt; + } + + /* Set up so this is the first element searched. */ + bset->b.cindex = windex; + bset->b.csize = LBITSET_ELT_WORDS; + bset->b.cdata = elt->words; +} + + +static lbitset_elt * +lbitset_elt_find (bitset bset, bitset_windex windex, + enum lbitset_find_mode mode) +{ + lbitset_elt *elt; + lbitset_elt *current; + + if (bset->b.csize) + { + current = LBITSET_CURRENT (bset); + /* Check if element is the cached element. */ + if ((windex - bset->b.cindex) < bset->b.csize) + return current; + } + else + { + current = LBITSET_HEAD (bset); + } + + if (current) + { + if (windex < bset->b.cindex) + { + for (elt = current; + elt->prev && elt->index > windex; elt = elt->prev) + continue; + } + else + { + for (elt = current; + elt->next && (elt->index + LBITSET_ELT_WORDS - 1) < windex; + elt = elt->next) + continue; + } + + /* ELT is the nearest to the one we want. If it's not the one + we want, the one we want does not exist. */ + if (elt && (windex - elt->index) < LBITSET_ELT_WORDS) + { + bset->b.cindex = elt->index; + bset->b.csize = LBITSET_ELT_WORDS; + bset->b.cdata = elt->words; + return elt; + } + } + + switch (mode) + { + case LBITSET_FIND: + return 0; + + case LBITSET_CREATE: + windex -= windex % LBITSET_ELT_WORDS; + + elt = lbitset_elt_calloc (); + elt->index = windex; + lbitset_elt_link (bset, elt); + return elt; + + case LBITSET_SUBST: + return &lbitset_zero_elts[0]; + + default: + abort (); + } +} + + +/* Weed out the zero elements from the list. */ +static inline void +lbitset_weed (bitset bset) +{ + lbitset_elt *elt; + lbitset_elt *next; + + for (elt = LBITSET_HEAD (bset); elt; elt = next) + { + next = elt->next; + if (lbitset_elt_zero_p (elt)) + lbitset_elt_unlink (bset, elt); + } +} + + +/* Set all bits in the bitset to zero. */ +static void +lbitset_zero (bitset bset) +{ + lbitset_elt *head; + + head = LBITSET_HEAD (bset); + if (!head) + return; + + /* Clear a bitset by freeing the linked list at the head element. */ + lbitset_prune (bset, head); +} + + +/* Is DST == SRC? */ +static inline bool +lbitset_equal_p (bitset dst, bitset src) +{ + lbitset_elt *selt; + lbitset_elt *delt; + int j; + + if (src == dst) + return true; + + lbitset_weed (src); + lbitset_weed (dst); + for (selt = LBITSET_HEAD (src), delt = LBITSET_HEAD (dst); + selt && delt; selt = selt->next, delt = delt->next) + { + if (selt->index != delt->index) + return false; + + for (j = 0; j < LBITSET_ELT_WORDS; j++) + if (delt->words[j] != selt->words[j]) + return false; + } + return !selt && !delt; +} + + +/* Copy bits from bitset SRC to bitset DST. */ +static inline void +lbitset_copy (bitset dst, bitset src) +{ + lbitset_elt *elt; + lbitset_elt *head; + lbitset_elt *prev; + lbitset_elt *tmp; + + if (src == dst) + return; + + lbitset_zero (dst); + + head = LBITSET_HEAD (src); + if (!head) + return; + + prev = 0; + for (elt = head; elt; elt = elt->next) + { + tmp = lbitset_elt_alloc (); + tmp->index = elt->index; + tmp->prev = prev; + tmp->next = 0; + if (prev) + prev->next = tmp; + else + LBITSET_HEAD (dst) = tmp; + prev = tmp; + + memcpy (tmp->words, elt->words, sizeof (elt->words)); + } + LBITSET_TAIL (dst) = tmp; + + dst->b.csize = LBITSET_ELT_WORDS; + dst->b.cdata = LBITSET_HEAD (dst)->words; + dst->b.cindex = LBITSET_HEAD (dst)->index; +} + + +/* Copy bits from bitset SRC to bitset DST. Return true if + bitsets different. */ +static inline bool +lbitset_copy_cmp (bitset dst, bitset src) +{ + if (src == dst) + return false; + + if (!LBITSET_HEAD (dst)) + { + lbitset_copy (dst, src); + return LBITSET_HEAD (src) != 0; + } + + if (lbitset_equal_p (dst, src)) + return false; + + lbitset_copy (dst, src); + return true; +} + + +static bitset_bindex +lbitset_resize (bitset src, bitset_bindex size) +{ + BITSET_NBITS_ (src) = size; + + /* Need to prune any excess bits. FIXME. */ + return size; +} + +/* Set bit BITNO in bitset DST. */ +static void +lbitset_set (bitset dst, bitset_bindex bitno) +{ + bitset_windex windex = bitno / BITSET_WORD_BITS; + + lbitset_elt_find (dst, windex, LBITSET_CREATE); + + dst->b.cdata[windex - dst->b.cindex] |= + (bitset_word) 1 << (bitno % BITSET_WORD_BITS); +} + + +/* Reset bit BITNO in bitset DST. */ +static void +lbitset_reset (bitset dst, bitset_bindex bitno) +{ + bitset_windex windex = bitno / BITSET_WORD_BITS; + + if (!lbitset_elt_find (dst, windex, LBITSET_FIND)) + return; + + dst->b.cdata[windex - dst->b.cindex] &= + ~((bitset_word) 1 << (bitno % BITSET_WORD_BITS)); + + /* If all the data is zero, perhaps we should unlink it now... */ +} + + +/* Test bit BITNO in bitset SRC. */ +static bool +lbitset_test (bitset src, bitset_bindex bitno) +{ + bitset_windex windex = bitno / BITSET_WORD_BITS; + + return (lbitset_elt_find (src, windex, LBITSET_FIND) + && ((src->b.cdata[windex - src->b.cindex] + >> (bitno % BITSET_WORD_BITS)) + & 1)); +} + + +static void +lbitset_free (bitset bset) +{ + lbitset_zero (bset); +} + + +/* Find list of up to NUM bits set in BSET starting from and including + *NEXT and store in array LIST. Return with actual number of bits + found and with *NEXT indicating where search stopped. */ +static bitset_bindex +lbitset_list_reverse (bitset bset, bitset_bindex *list, + bitset_bindex num, bitset_bindex *next) +{ + bitset_bindex rbitno; + bitset_bindex bitno; + unsigned int bcount; + bitset_bindex boffset; + bitset_windex windex; + bitset_bindex count; + lbitset_elt *elt; + bitset_word word; + bitset_bindex n_bits; + + elt = LBITSET_TAIL (bset); + if (!elt) + return 0; + + n_bits = (elt->index + LBITSET_ELT_WORDS) * BITSET_WORD_BITS; + rbitno = *next; + + if (rbitno >= n_bits) + return 0; + + bitno = n_bits - (rbitno + 1); + + windex = bitno / BITSET_WORD_BITS; + + /* Skip back to starting element. */ + for (; elt && elt->index > windex; elt = elt->prev) + continue; + + if (!elt) + return 0; + + if (windex >= elt->index + LBITSET_ELT_WORDS) + { + /* We are trying to start in no-mans land so start + at end of current elt. */ + bcount = BITSET_WORD_BITS - 1; + windex = elt->index + LBITSET_ELT_WORDS - 1; + } + else + { + bcount = bitno % BITSET_WORD_BITS; + } + + count = 0; + boffset = windex * BITSET_WORD_BITS; + + /* If num is 1, we could speed things up with a binary search + of the word of interest. */ + + while (elt) + { + bitset_word *srcp = elt->words; + + for (; (windex - elt->index) < LBITSET_ELT_WORDS; + windex--, boffset -= BITSET_WORD_BITS, + bcount = BITSET_WORD_BITS - 1) + { + word = + srcp[windex - elt->index] << (BITSET_WORD_BITS - 1 - bcount); + + for (; word; bcount--) + { + if (word & BITSET_MSB) + { + list[count++] = boffset + bcount; + if (count >= num) + { + *next = n_bits - (boffset + bcount); + return count; + } + } + word <<= 1; + } + } + + elt = elt->prev; + if (elt) + { + windex = elt->index + LBITSET_ELT_WORDS - 1; + boffset = windex * BITSET_WORD_BITS; + } + } + + *next = n_bits - (boffset + 1); + return count; +} + + +/* Find list of up to NUM bits set in BSET starting from and including + *NEXT and store in array LIST. Return with actual number of bits + found and with *NEXT indicating where search stopped. */ +static bitset_bindex +lbitset_list (bitset bset, bitset_bindex *list, + bitset_bindex num, bitset_bindex *next) +{ + bitset_bindex bitno; + bitset_windex windex; + bitset_bindex count; + lbitset_elt *elt; + lbitset_elt *head; + bitset_word word; + + head = LBITSET_HEAD (bset); + if (!head) + return 0; + + bitno = *next; + count = 0; + + if (!bitno) + { + /* This is the most common case. */ + + /* Start with the first element. */ + elt = head; + windex = elt->index; + bitno = windex * BITSET_WORD_BITS; + } + else + { + windex = bitno / BITSET_WORD_BITS; + + /* Skip to starting element. */ + for (elt = head; + elt && (elt->index + LBITSET_ELT_WORDS - 1) < windex; + elt = elt->next) + continue; + + if (!elt) + return 0; + + if (windex < elt->index) + { + windex = elt->index; + bitno = windex * BITSET_WORD_BITS; + } + else + { + bitset_word *srcp = elt->words; + + /* We are starting within an element. */ + + for (; (windex - elt->index) < LBITSET_ELT_WORDS; windex++) + { + word = srcp[windex - elt->index] >> (bitno % BITSET_WORD_BITS); + + for (; word; bitno++) + { + if (word & 1) + { + list[count++] = bitno; + if (count >= num) + { + *next = bitno + 1; + return count; + } + } + word >>= 1; + } + bitno = (windex + 1) * BITSET_WORD_BITS; + } + + elt = elt->next; + if (elt) + { + windex = elt->index; + bitno = windex * BITSET_WORD_BITS; + } + } + } + + + /* If num is 1, we could speed things up with a binary search + of the word of interest. */ + + while (elt) + { + int i; + bitset_word *srcp = elt->words; + + if ((count + LBITSET_ELT_BITS) < num) + { + /* The coast is clear, plant boot! */ + +#if LBITSET_ELT_WORDS == 2 + word = srcp[0]; + if (word) + { + if (!(word & 0xffff)) + { + word >>= 16; + bitno += 16; + } + if (!(word & 0xff)) + { + word >>= 8; + bitno += 8; + } + for (; word; bitno++) + { + if (word & 1) + list[count++] = bitno; + word >>= 1; + } + } + windex++; + bitno = windex * BITSET_WORD_BITS; + + word = srcp[1]; + if (word) + { + if (!(word & 0xffff)) + { + word >>= 16; + bitno += 16; + } + for (; word; bitno++) + { + if (word & 1) + list[count++] = bitno; + word >>= 1; + } + } + windex++; + bitno = windex * BITSET_WORD_BITS; +#else + for (i = 0; i < LBITSET_ELT_WORDS; i++) + { + word = srcp[i]; + if (word) + { + if (!(word & 0xffff)) + { + word >>= 16; + bitno += 16; + } + if (!(word & 0xff)) + { + word >>= 8; + bitno += 8; + } + for (; word; bitno++) + { + if (word & 1) + list[count++] = bitno; + word >>= 1; + } + } + windex++; + bitno = windex * BITSET_WORD_BITS; + } +#endif + } + else + { + /* Tread more carefully since we need to check + if array overflows. */ + + for (i = 0; i < LBITSET_ELT_WORDS; i++) + { + for (word = srcp[i]; word; bitno++) + { + if (word & 1) + { + list[count++] = bitno; + if (count >= num) + { + *next = bitno + 1; + return count; + } + } + word >>= 1; + } + windex++; + bitno = windex * BITSET_WORD_BITS; + } + } + + elt = elt->next; + if (elt) + { + windex = elt->index; + bitno = windex * BITSET_WORD_BITS; + } + } + + *next = bitno; + return count; +} + + +static bool +lbitset_empty_p (bitset dst) +{ + lbitset_elt *elt; + lbitset_elt *next; + + for (elt = LBITSET_HEAD (dst); elt; elt = next) + { + next = elt->next; + if (!lbitset_elt_zero_p (elt)) + return 0; + /* Weed as we go. */ + lbitset_elt_unlink (dst, elt); + } + + return 1; +} + + +/* Ensure that any unused bits within the last element are clear. */ +static inline void +lbitset_unused_clear (bitset dst) +{ + unsigned int last_bit; + bitset_bindex n_bits; + + n_bits = BITSET_SIZE_ (dst); + last_bit = n_bits % LBITSET_ELT_BITS; + + if (last_bit) + { + lbitset_elt *elt; + bitset_windex windex; + bitset_word *srcp; + + elt = LBITSET_TAIL (dst); + srcp = elt->words; + windex = n_bits / BITSET_WORD_BITS; + + srcp[windex - elt->index] &= ((bitset_word) 1 << last_bit) - 1; + windex++; + + for (; (windex - elt->index) < LBITSET_ELT_WORDS; windex++) + srcp[windex - elt->index] = 0; + } +} + + +static void +lbitset_ones (bitset dst) +{ + bitset_windex i; + bitset_windex windex; + lbitset_elt *elt; + + /* This is a decidedly unfriendly operation for a linked list + bitset! It makes a sparse bitset become dense. An alternative + is to have a flag that indicates that the bitset stores the + complement of what it indicates. */ + + windex = (BITSET_SIZE_ (dst) + BITSET_WORD_BITS - 1) / BITSET_WORD_BITS; + + for (i = 0; i < windex; i += LBITSET_ELT_WORDS) + { + /* Create new elements if they cannot be found. */ + elt = lbitset_elt_find (dst, i, LBITSET_CREATE); + memset (elt->words, -1, sizeof (elt->words)); + } + + lbitset_unused_clear (dst); +} + + +static void +lbitset_not (bitset dst, bitset src) +{ + lbitset_elt *elt; + lbitset_elt *selt; + lbitset_elt *delt; + bitset_windex i; + unsigned int j; + bitset_windex windex; + + /* This is another unfriendly operation for a linked list + bitset! */ + elt = LBITSET_TAIL (dst); + + windex = (BITSET_SIZE_ (dst) + BITSET_WORD_BITS - 1) / BITSET_WORD_BITS; + + for (i = 0; i < windex; i += LBITSET_ELT_WORDS) + { + /* Create new elements for dst if they cannot be found + or substitute zero elements if src elements not found. */ + selt = lbitset_elt_find (src, i, LBITSET_SUBST); + delt = lbitset_elt_find (dst, i, LBITSET_CREATE); + + for (j = 0; j < LBITSET_ELT_WORDS; j++) + delt->words[j] = ~selt->words[j]; + } + lbitset_unused_clear (dst); + lbitset_weed (dst); + return; +} + + +/* Is DST == DST | SRC? */ +static bool +lbitset_subset_p (bitset dst, bitset src) +{ + lbitset_elt *selt; + lbitset_elt *delt; + unsigned int j; + + for (selt = LBITSET_HEAD (src), delt = LBITSET_HEAD (dst); + selt || delt; selt = selt->next, delt = delt->next) + { + if (!selt) + selt = &lbitset_zero_elts[0]; + else if (!delt) + delt = &lbitset_zero_elts[0]; + else if (selt->index != delt->index) + { + if (selt->index < delt->index) + { + lbitset_zero_elts[2].next = delt; + delt = &lbitset_zero_elts[2]; + } + else + { + lbitset_zero_elts[1].next = selt; + selt = &lbitset_zero_elts[1]; + } + } + + for (j = 0; j < LBITSET_ELT_WORDS; j++) + if (delt->words[j] != (selt->words[j] | delt->words[j])) + return false; + } + return true; +} + + +/* Is DST & SRC == 0? */ +static bool +lbitset_disjoint_p (bitset dst, bitset src) +{ + lbitset_elt *selt; + lbitset_elt *delt; + unsigned int j; + + for (selt = LBITSET_HEAD (src), delt = LBITSET_HEAD (dst); + selt && delt; selt = selt->next, delt = delt->next) + { + if (selt->index != delt->index) + { + if (selt->index < delt->index) + { + lbitset_zero_elts[2].next = delt; + delt = &lbitset_zero_elts[2]; + } + else + { + lbitset_zero_elts[1].next = selt; + selt = &lbitset_zero_elts[1]; + } + /* Since the elements are different, there is no + intersection of these elements. */ + continue; + } + + for (j = 0; j < LBITSET_ELT_WORDS; j++) + if (selt->words[j] & delt->words[j]) + return false; + } + return true; +} + + +static bool +lbitset_op3_cmp (bitset dst, bitset src1, bitset src2, enum bitset_ops op) +{ + lbitset_elt *selt1 = LBITSET_HEAD (src1); + lbitset_elt *selt2 = LBITSET_HEAD (src2); + lbitset_elt *delt = LBITSET_HEAD (dst); + bitset_windex windex1; + bitset_windex windex2; + bitset_windex windex; + lbitset_elt *stmp1; + lbitset_elt *stmp2; + lbitset_elt *dtmp; + bitset_word *srcp1; + bitset_word *srcp2; + bitset_word *dstp; + bool changed = false; + unsigned int i; + + LBITSET_HEAD (dst) = 0; + dst->b.csize = 0; + + windex1 = (selt1) ? selt1->index : BITSET_WINDEX_MAX; + windex2 = (selt2) ? selt2->index : BITSET_WINDEX_MAX; + + while (selt1 || selt2) + { + /* Figure out whether we need to substitute zero elements for + missing links. */ + if (windex1 == windex2) + { + windex = windex1; + stmp1 = selt1; + stmp2 = selt2; + selt1 = selt1->next; + windex1 = (selt1) ? selt1->index : BITSET_WINDEX_MAX; + selt2 = selt2->next; + windex2 = (selt2) ? selt2->index : BITSET_WINDEX_MAX; + } + else if (windex1 < windex2) + { + windex = windex1; + stmp1 = selt1; + stmp2 = &lbitset_zero_elts[0]; + selt1 = selt1->next; + windex1 = (selt1) ? selt1->index : BITSET_WINDEX_MAX; + } + else + { + windex = windex2; + stmp1 = &lbitset_zero_elts[0]; + stmp2 = selt2; + selt2 = selt2->next; + windex2 = (selt2) ? selt2->index : BITSET_WINDEX_MAX; + } + + /* Find the appropriate element from DST. Begin by discarding + elements that we've skipped. */ + while (delt && delt->index < windex) + { + changed = true; + dtmp = delt; + delt = delt->next; + lbitset_elt_free (dtmp); + } + if (delt && delt->index == windex) + { + dtmp = delt; + delt = delt->next; + } + else + dtmp = lbitset_elt_calloc (); + + /* Do the operation, and if any bits are set, link it into the + linked list. */ + srcp1 = stmp1->words; + srcp2 = stmp2->words; + dstp = dtmp->words; + switch (op) + { + case BITSET_OP_OR: + for (i = 0; i < LBITSET_ELT_WORDS; i++, dstp++) + { + bitset_word tmp = *srcp1++ | *srcp2++; + + if (*dstp != tmp) + { + changed = true; + *dstp = tmp; + } + } + break; + + case BITSET_OP_AND: + for (i = 0; i < LBITSET_ELT_WORDS; i++, dstp++) + { + bitset_word tmp = *srcp1++ & *srcp2++; + + if (*dstp != tmp) + { + changed = true; + *dstp = tmp; + } + } + break; + + case BITSET_OP_XOR: + for (i = 0; i < LBITSET_ELT_WORDS; i++, dstp++) + { + bitset_word tmp = *srcp1++ ^ *srcp2++; + + if (*dstp != tmp) + { + changed = true; + *dstp = tmp; + } + } + break; + + case BITSET_OP_ANDN: + for (i = 0; i < LBITSET_ELT_WORDS; i++, dstp++) + { + bitset_word tmp = *srcp1++ & ~(*srcp2++); + + if (*dstp != tmp) + { + changed = true; + *dstp = tmp; + } + } + break; + + default: + abort (); + } + + if (!lbitset_elt_zero_p (dtmp)) + { + dtmp->index = windex; + /* Perhaps this could be optimised... */ + lbitset_elt_link (dst, dtmp); + } + else + { + lbitset_elt_free (dtmp); + } + } + + /* If we have elements of DST left over, free them all. */ + if (delt) + { + changed = true; + lbitset_prune (dst, delt); + } + + return changed; +} + + +static bool +lbitset_and_cmp (bitset dst, bitset src1, bitset src2) +{ + lbitset_elt *selt1 = LBITSET_HEAD (src1); + lbitset_elt *selt2 = LBITSET_HEAD (src2); + bool changed; + + if (!selt2) + { + lbitset_weed (dst); + changed = !LBITSET_HEAD (dst); + lbitset_zero (dst); + return changed; + } + else if (!selt1) + { + lbitset_weed (dst); + changed = !LBITSET_HEAD (dst); + lbitset_zero (dst); + return changed; + } + return lbitset_op3_cmp (dst, src1, src2, BITSET_OP_AND); +} + + +static void +lbitset_and (bitset dst, bitset src1, bitset src2) +{ + lbitset_and_cmp (dst, src1, src2); +} + + +static bool +lbitset_andn_cmp (bitset dst, bitset src1, bitset src2) +{ + lbitset_elt *selt1 = LBITSET_HEAD (src1); + lbitset_elt *selt2 = LBITSET_HEAD (src2); + bool changed; + + if (!selt2) + { + return lbitset_copy_cmp (dst, src1); + } + else if (!selt1) + { + lbitset_weed (dst); + changed = !LBITSET_HEAD (dst); + lbitset_zero (dst); + return changed; + } + return lbitset_op3_cmp (dst, src1, src2, BITSET_OP_ANDN); +} + + +static void +lbitset_andn (bitset dst, bitset src1, bitset src2) +{ + lbitset_andn_cmp (dst, src1, src2); +} + + +static bool +lbitset_or_cmp (bitset dst, bitset src1, bitset src2) +{ + lbitset_elt *selt1 = LBITSET_HEAD (src1); + lbitset_elt *selt2 = LBITSET_HEAD (src2); + + if (!selt2) + { + return lbitset_copy_cmp (dst, src1); + } + else if (!selt1) + { + return lbitset_copy_cmp (dst, src2); + } + return lbitset_op3_cmp (dst, src1, src2, BITSET_OP_OR); +} + + +static void +lbitset_or (bitset dst, bitset src1, bitset src2) +{ + lbitset_or_cmp (dst, src1, src2); +} + + +static bool +lbitset_xor_cmp (bitset dst, bitset src1, bitset src2) +{ + lbitset_elt *selt1 = LBITSET_HEAD (src1); + lbitset_elt *selt2 = LBITSET_HEAD (src2); + + if (!selt2) + { + return lbitset_copy_cmp (dst, src1); + } + else if (!selt1) + { + return lbitset_copy_cmp (dst, src2); + } + return lbitset_op3_cmp (dst, src1, src2, BITSET_OP_XOR); +} + + +static void +lbitset_xor (bitset dst, bitset src1, bitset src2) +{ + lbitset_xor_cmp (dst, src1, src2); +} + + + +/* Vector of operations for linked-list bitsets. */ +struct bitset_vtable lbitset_vtable = { + lbitset_set, + lbitset_reset, + bitset_toggle_, + lbitset_test, + lbitset_resize, + bitset_size_, + bitset_count_, + lbitset_empty_p, + lbitset_ones, + lbitset_zero, + lbitset_copy, + lbitset_disjoint_p, + lbitset_equal_p, + lbitset_not, + lbitset_subset_p, + lbitset_and, + lbitset_and_cmp, + lbitset_andn, + lbitset_andn_cmp, + lbitset_or, + lbitset_or_cmp, + lbitset_xor, + lbitset_xor_cmp, + bitset_and_or_, + bitset_and_or_cmp_, + bitset_andn_or_, + bitset_andn_or_cmp_, + bitset_or_and_, + bitset_or_and_cmp_, + lbitset_list, + lbitset_list_reverse, + lbitset_free, + BITSET_LIST +}; + + +/* Return size of initial structure. */ +size_t +lbitset_bytes (bitset_bindex n_bits ATTRIBUTE_UNUSED) +{ + return sizeof (struct lbitset_struct); +} + + +/* Initialize a bitset. */ +bitset +lbitset_init (bitset bset, bitset_bindex n_bits ATTRIBUTE_UNUSED) +{ + BITSET_NBITS_ (bset) = n_bits; + bset->b.vtable = &lbitset_vtable; + return bset; +} + + +void +lbitset_release_memory (void) +{ + lbitset_free_list = 0; + if (lbitset_obstack_init) + { + lbitset_obstack_init = false; + obstack_free (&lbitset_obstack, NULL); + } +} + + +/* Function to be called from debugger to debug lbitset. */ +void +debug_lbitset (bitset bset) +{ + lbitset_elt *elt; + unsigned int i; + + if (!bset) + return; + + for (elt = LBITSET_HEAD (bset); elt; elt = elt->next) + { + fprintf (stderr, "Elt %lu\n", (unsigned long int) elt->index); + for (i = 0; i < LBITSET_ELT_WORDS; i++) + { + unsigned int j; + bitset_word word; + + word = elt->words[i]; + + fprintf (stderr, " Word %u:", i); + for (j = 0; j < LBITSET_WORD_BITS; j++) + if ((word & ((bitset_word) 1 << j))) + fprintf (stderr, " %u", j); + fprintf (stderr, "\n"); + } + } +} diff --git a/src/apps/bin/bison/lib/lbitset.h b/src/apps/bin/bison/lib/lbitset.h new file mode 100644 index 0000000000..72a0d46d87 --- /dev/null +++ b/src/apps/bin/bison/lib/lbitset.h @@ -0,0 +1,30 @@ +/* Functions to support lbitsets. + Copyright (C) 2002, 2004 Free Software Foundation, Inc. + Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _LBITSET_H +#define _LBITSET_H + +#include "bitset.h" + +extern size_t lbitset_bytes (bitset_bindex); + +extern bitset lbitset_init (bitset, bitset_bindex); + +extern void lbitset_release_memory (void); + +#endif diff --git a/src/apps/bin/bison/lib/libiberty.h b/src/apps/bin/bison/lib/libiberty.h new file mode 100644 index 0000000000..1867232b61 --- /dev/null +++ b/src/apps/bin/bison/lib/libiberty.h @@ -0,0 +1,36 @@ +/* Fake libiberty.h for Bison. + Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + + +/* Bison depends on libiberty's implementation of bitsets, which + requires a `libiberty.h' file. This file provides the minimum + services. */ + +#ifndef BISON_LIBIBERTY_H_ +# define BISON_LIBIBERTY_H_ 1 + +# ifndef __attribute__ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__ +# define __attribute__(x) +# endif +# endif + +# define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) + +# include "xalloc.h" + +#endif /* ! BISON_LIBIBERTY_H_ */ diff --git a/src/apps/bin/bison/lib/main.c b/src/apps/bin/bison/lib/main.c new file mode 100644 index 0000000000..10664c7d66 --- /dev/null +++ b/src/apps/bin/bison/lib/main.c @@ -0,0 +1,38 @@ +/* Yacc library main function. + + Copyright (C) 2002 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +#if HAVE_LOCALE_H +# include +#endif +#if ! HAVE_SETLOCALE +# define setlocale(Category, Locale) +#endif + +int yyparse (void); + +int +main (void) +{ + setlocale (LC_ALL, ""); + return yyparse (); +} diff --git a/src/apps/bin/bison/lib/malloc.c b/src/apps/bin/bison/lib/malloc.c new file mode 100644 index 0000000000..a43d169271 --- /dev/null +++ b/src/apps/bin/bison/lib/malloc.c @@ -0,0 +1,36 @@ +/* Work around bug on some systems where malloc (0) fails. + Copyright (C) 1997, 1998 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* written by Jim Meyering */ + +#if HAVE_CONFIG_H +# include +#endif +#undef malloc + +#include + +/* Allocate an N-byte block of memory from the heap. + If N is zero, allocate a 1-byte block. */ + +void * +rpl_malloc (size_t n) +{ + if (n == 0) + n = 1; + return malloc (n); +} diff --git a/src/apps/bin/bison/lib/mbswidth.c b/src/apps/bin/bison/lib/mbswidth.c new file mode 100644 index 0000000000..6b9d4b38bb --- /dev/null +++ b/src/apps/bin/bison/lib/mbswidth.c @@ -0,0 +1,219 @@ +/* Determine the number of screen columns needed for a string. + Copyright (C) 2000-2004 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Bruno Haible . */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include "mbswidth.h" + +/* Get MB_CUR_MAX. */ +#include + +#include + +/* Get isprint(). */ +#include + +/* Get mbstate_t, mbrtowc(), mbsinit(), wcwidth(). */ +#if HAVE_WCHAR_H +/* Tru64 with Desktop Toolkit C has a bug: must be included before + . + BSD/OS 4.1 has a bug: and must be included before + . */ +# include +# include +# include +#endif + +/* Get iswprint(), iswcntrl(). */ +#if HAVE_WCTYPE_H +# include +#endif +#if !defined iswprint && !HAVE_ISWPRINT +# define iswprint(wc) 1 +#endif +#if !defined iswcntrl && !HAVE_ISWCNTRL +# define iswcntrl(wc) 0 +#endif + +#ifndef mbsinit +# if !HAVE_MBSINIT +# define mbsinit(ps) 1 +# endif +#endif + +#ifndef HAVE_DECL_WCWIDTH +"this configure-time declaration test was not run" +#endif +#if !HAVE_DECL_WCWIDTH +int wcwidth (); +#endif + +#ifndef wcwidth +# if !HAVE_WCWIDTH +/* wcwidth doesn't exist, so assume all printable characters have + width 1. */ +# define wcwidth(wc) ((wc) == 0 ? 0 : iswprint (wc) ? 1 : -1) +# endif +#endif + +/* Get ISPRINT. */ +#if defined (STDC_HEADERS) || (!defined (isascii) && !defined (HAVE_ISASCII)) +# define IN_CTYPE_DOMAIN(c) 1 +#else +# define IN_CTYPE_DOMAIN(c) isascii(c) +#endif +/* Undefine to protect against the definition in wctype.h of Solaris 2.6. */ +#undef ISPRINT +#define ISPRINT(c) (IN_CTYPE_DOMAIN (c) && isprint (c)) +#undef ISCNTRL +#define ISCNTRL(c) (IN_CTYPE_DOMAIN (c) && iscntrl (c)) + +/* Returns the number of columns needed to represent the multibyte + character string pointed to by STRING. If a non-printable character + occurs, and MBSW_REJECT_UNPRINTABLE is specified, -1 is returned. + With flags = MBSW_REJECT_INVALID | MBSW_REJECT_UNPRINTABLE, this is + the multibyte analogon of the wcswidth function. */ +int +mbswidth (const char *string, int flags) +{ + return mbsnwidth (string, strlen (string), flags); +} + +/* Returns the number of columns needed to represent the multibyte + character string pointed to by STRING of length NBYTES. If a + non-printable character occurs, and MBSW_REJECT_UNPRINTABLE is + specified, -1 is returned. */ +int +mbsnwidth (const char *string, size_t nbytes, int flags) +{ + const char *p = string; + const char *plimit = p + nbytes; + int width; + + width = 0; +#if HAVE_MBRTOWC + if (MB_CUR_MAX > 1) + { + while (p < plimit) + switch (*p) + { + case ' ': case '!': case '"': case '#': case '%': + case '&': case '\'': case '(': case ')': case '*': + case '+': case ',': case '-': case '.': case '/': + case '0': case '1': case '2': case '3': case '4': + case '5': case '6': case '7': case '8': case '9': + case ':': case ';': case '<': case '=': case '>': + case '?': + case 'A': case 'B': case 'C': case 'D': case 'E': + case 'F': case 'G': case 'H': case 'I': case 'J': + case 'K': case 'L': case 'M': case 'N': case 'O': + case 'P': case 'Q': case 'R': case 'S': case 'T': + case 'U': case 'V': case 'W': case 'X': case 'Y': + case 'Z': + case '[': case '\\': case ']': case '^': case '_': + case 'a': case 'b': case 'c': case 'd': case 'e': + case 'f': case 'g': case 'h': case 'i': case 'j': + case 'k': case 'l': case 'm': case 'n': case 'o': + case 'p': case 'q': case 'r': case 's': case 't': + case 'u': case 'v': case 'w': case 'x': case 'y': + case 'z': case '{': case '|': case '}': case '~': + /* These characters are printable ASCII characters. */ + p++; + width++; + break; + default: + /* If we have a multibyte sequence, scan it up to its end. */ + { + mbstate_t mbstate; + memset (&mbstate, 0, sizeof mbstate); + do + { + wchar_t wc; + size_t bytes; + int w; + + bytes = mbrtowc (&wc, p, plimit - p, &mbstate); + + if (bytes == (size_t) -1) + /* An invalid multibyte sequence was encountered. */ + { + if (!(flags & MBSW_REJECT_INVALID)) + { + p++; + width++; + break; + } + else + return -1; + } + + if (bytes == (size_t) -2) + /* An incomplete multibyte character at the end. */ + { + if (!(flags & MBSW_REJECT_INVALID)) + { + p = plimit; + width++; + break; + } + else + return -1; + } + + if (bytes == 0) + /* A null wide character was encountered. */ + bytes = 1; + + w = wcwidth (wc); + if (w >= 0) + /* A printable multibyte character. */ + width += w; + else + /* An unprintable multibyte character. */ + if (!(flags & MBSW_REJECT_UNPRINTABLE)) + width += (iswcntrl (wc) ? 0 : 1); + else + return -1; + + p += bytes; + } + while (! mbsinit (&mbstate)); + } + break; + } + return width; + } +#endif + + while (p < plimit) + { + unsigned char c = (unsigned char) *p++; + + if (ISPRINT (c)) + width++; + else if (!(flags & MBSW_REJECT_UNPRINTABLE)) + width += (ISCNTRL (c) ? 0 : 1); + else + return -1; + } + return width; +} diff --git a/src/apps/bin/bison/lib/mbswidth.h b/src/apps/bin/bison/lib/mbswidth.h new file mode 100644 index 0000000000..6fec3f4904 --- /dev/null +++ b/src/apps/bin/bison/lib/mbswidth.h @@ -0,0 +1,51 @@ +/* Determine the number of screen columns needed for a string. + Copyright (C) 2000-2004 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include + +/* Avoid a clash of our mbswidth() with a function of the same name defined + in UnixWare 7.1.1 . We need this #include before the #define + below. + However, we don't want to #include on all platforms because + - Tru64 with Desktop Toolkit C has a bug: must be included before + . + - BSD/OS 4.1 has a bug: and must be included before + . */ +#if HAVE_DECL_MBSWIDTH_IN_WCHAR_H +# include +#endif + + +/* Optional flags to influence mbswidth/mbsnwidth behavior. */ + +/* If this bit is set, return -1 upon finding an invalid or incomplete + character. Otherwise, assume invalid characters have width 1. */ +#define MBSW_REJECT_INVALID 1 + +/* If this bit is set, return -1 upon finding a non-printable character. + Otherwise, assume unprintable characters have width 0 if they are + control characters and 1 otherwise. */ +#define MBSW_REJECT_UNPRINTABLE 2 + + +/* Returns the number of screen columns needed for STRING. */ +#define mbswidth gnu_mbswidth /* avoid clash with UnixWare 7.1.1 function */ +extern int mbswidth (const char *string, int flags); + +/* Returns the number of screen columns needed for the NBYTES bytes + starting at BUF. */ +extern int mbsnwidth (const char *buf, size_t nbytes, int flags); diff --git a/src/apps/bin/bison/lib/obstack.c b/src/apps/bin/bison/lib/obstack.c new file mode 100644 index 0000000000..52946d26de --- /dev/null +++ b/src/apps/bin/bison/lib/obstack.c @@ -0,0 +1,424 @@ +/* obstack.c - subroutines used implicitly by object stack macros + + Copyright (C) 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1996, 1997, + 1998, 1999, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, + Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#ifdef _LIBC +# include +#else +# include "obstack.h" +#endif + +/* NOTE BEFORE MODIFYING THIS FILE: This version number must be + incremented whenever callers compiled using an old obstack.h can no + longer properly call the functions in this obstack.c. */ +#define OBSTACK_INTERFACE_VERSION 1 + +/* Comment out all this code if we are using the GNU C Library, and are not + actually compiling the library itself, and the installed library + supports the same library interface we do. This code is part of the GNU + C Library, but also included in many other GNU distributions. Compiling + and linking in this code is a waste when using the GNU C library + (especially if it is a shared library). Rather than having every GNU + program understand `configure --with-gnu-libc' and omit the object + files, it is simpler to just do this in the source for each such file. */ + +#include /* Random thing to get __GNU_LIBRARY__. */ +#if !defined _LIBC && defined __GNU_LIBRARY__ && __GNU_LIBRARY__ > 1 +# include +# if _GNU_OBSTACK_INTERFACE_VERSION == OBSTACK_INTERFACE_VERSION +# define ELIDE_CODE +# endif +#endif + +#if defined _LIBC && defined USE_IN_LIBIO +# include +#endif + +#include + +#ifndef ELIDE_CODE + + +/* Determine default alignment. */ +union fooround +{ + long int i; + long double d; + void *p; +}; +/* If malloc were really smart, it would round addresses to DEFAULT_ALIGNMENT. + But in fact it might be less smart and round addresses to as much as + DEFAULT_ROUNDING. So we prepare for it to do that. */ +enum + { + DEFAULT_ALIGNMENT = offsetof (struct { char c; union fooround u; }, u), + DEFAULT_ROUNDING = sizeof (union fooround) + }; + +/* When we copy a long block of data, this is the unit to do it with. + On some machines, copying successive ints does not work; + in such a case, redefine COPYING_UNIT to `long' (if that works) + or `char' as a last resort. */ +# ifndef COPYING_UNIT +# define COPYING_UNIT int +# endif + + +/* The functions allocating more room by calling `obstack_chunk_alloc' + jump to the handler pointed to by `obstack_alloc_failed_handler'. + This can be set to a user defined function which should either + abort gracefully or use longjump - but shouldn't return. This + variable by default points to the internal function + `print_and_abort'. */ +static void print_and_abort (void); +void (*obstack_alloc_failed_handler) (void) = print_and_abort; + +/* Exit value used when `print_and_abort' is used. */ +# include +# ifdef _LIBC +int obstack_exit_failure = EXIT_FAILURE; +# else +# include "exitfail.h" +# define obstack_exit_failure exit_failure +# endif + +# ifdef _LIBC +/* A looong time ago (before 1994, anyway; we're not sure) this global variable + was used by non-GNU-C macros to avoid multiple evaluation. The GNU C + library still exports it because somebody might use it. */ +struct obstack *_obstack; +# endif + +/* Define a macro that either calls functions with the traditional malloc/free + calling interface, or calls functions with the mmalloc/mfree interface + (that adds an extra first argument), based on the state of use_extra_arg. + For free, do not use ?:, since some compilers, like the MIPS compilers, + do not allow (expr) ? void : void. */ + +# define CALL_CHUNKFUN(h, size) \ + (((h) -> use_extra_arg) \ + ? (*(h)->chunkfun) ((h)->extra_arg, (size)) \ + : (*(struct _obstack_chunk *(*) (long)) (h)->chunkfun) ((size))) + +# define CALL_FREEFUN(h, old_chunk) \ + do { \ + if ((h) -> use_extra_arg) \ + (*(h)->freefun) ((h)->extra_arg, (old_chunk)); \ + else \ + (*(void (*) (void *)) (h)->freefun) ((old_chunk)); \ + } while (0) + + +/* Initialize an obstack H for use. Specify chunk size SIZE (0 means default). + Objects start on multiples of ALIGNMENT (0 means use default). + CHUNKFUN is the function to use to allocate chunks, + and FREEFUN the function to free them. + + Return nonzero if successful, calls obstack_alloc_failed_handler if + allocation fails. */ + +int +_obstack_begin (struct obstack *h, + int size, int alignment, + void *(*chunkfun) (long), + void (*freefun) (void *)) +{ + register struct _obstack_chunk *chunk; /* points to new chunk */ + + if (alignment == 0) + alignment = DEFAULT_ALIGNMENT; + if (size == 0) + /* Default size is what GNU malloc can fit in a 4096-byte block. */ + { + /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc. + Use the values for range checking, because if range checking is off, + the extra bytes won't be missed terribly, but if range checking is on + and we used a larger request, a whole extra 4096 bytes would be + allocated. + + These number are irrelevant to the new GNU malloc. I suspect it is + less sensitive to the size of the request. */ + int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1)) + + 4 + DEFAULT_ROUNDING - 1) + & ~(DEFAULT_ROUNDING - 1)); + size = 4096 - extra; + } + + h->chunkfun = (struct _obstack_chunk * (*)(void *, long)) chunkfun; + h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun; + h->chunk_size = size; + h->alignment_mask = alignment - 1; + h->use_extra_arg = 0; + + chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size); + if (!chunk) + (*obstack_alloc_failed_handler) (); + h->next_free = h->object_base = chunk->contents; + h->chunk_limit = chunk->limit + = (char *) chunk + h->chunk_size; + chunk->prev = 0; + /* The initial chunk now contains no empty object. */ + h->maybe_empty_object = 0; + h->alloc_failed = 0; + return 1; +} + +int +_obstack_begin_1 (struct obstack *h, int size, int alignment, + void *(*chunkfun) (void *, long), + void (*freefun) (void *, void *), + void *arg) +{ + register struct _obstack_chunk *chunk; /* points to new chunk */ + + if (alignment == 0) + alignment = DEFAULT_ALIGNMENT; + if (size == 0) + /* Default size is what GNU malloc can fit in a 4096-byte block. */ + { + /* 12 is sizeof (mhead) and 4 is EXTRA from GNU malloc. + Use the values for range checking, because if range checking is off, + the extra bytes won't be missed terribly, but if range checking is on + and we used a larger request, a whole extra 4096 bytes would be + allocated. + + These number are irrelevant to the new GNU malloc. I suspect it is + less sensitive to the size of the request. */ + int extra = ((((12 + DEFAULT_ROUNDING - 1) & ~(DEFAULT_ROUNDING - 1)) + + 4 + DEFAULT_ROUNDING - 1) + & ~(DEFAULT_ROUNDING - 1)); + size = 4096 - extra; + } + + h->chunkfun = (struct _obstack_chunk * (*)(void *,long)) chunkfun; + h->freefun = (void (*) (void *, struct _obstack_chunk *)) freefun; + h->chunk_size = size; + h->alignment_mask = alignment - 1; + h->extra_arg = arg; + h->use_extra_arg = 1; + + chunk = h->chunk = CALL_CHUNKFUN (h, h -> chunk_size); + if (!chunk) + (*obstack_alloc_failed_handler) (); + h->next_free = h->object_base = chunk->contents; + h->chunk_limit = chunk->limit + = (char *) chunk + h->chunk_size; + chunk->prev = 0; + /* The initial chunk now contains no empty object. */ + h->maybe_empty_object = 0; + h->alloc_failed = 0; + return 1; +} + +/* Allocate a new current chunk for the obstack *H + on the assumption that LENGTH bytes need to be added + to the current object, or a new object of length LENGTH allocated. + Copies any partial object from the end of the old chunk + to the beginning of the new one. */ + +void +_obstack_newchunk (struct obstack *h, int length) +{ + register struct _obstack_chunk *old_chunk = h->chunk; + register struct _obstack_chunk *new_chunk; + register long new_size; + register long obj_size = h->next_free - h->object_base; + register long i; + long already; + char *object_base; + + /* Compute size for new chunk. */ + new_size = (obj_size + length) + (obj_size >> 3) + h->alignment_mask + 100; + if (new_size < h->chunk_size) + new_size = h->chunk_size; + + /* Allocate and initialize the new chunk. */ + new_chunk = CALL_CHUNKFUN (h, new_size); + if (!new_chunk) + (*obstack_alloc_failed_handler) (); + h->chunk = new_chunk; + new_chunk->prev = old_chunk; + new_chunk->limit = h->chunk_limit = (char *) new_chunk + new_size; + + /* Compute an aligned object_base in the new chunk */ + object_base = + __PTR_ALIGN ((char *) new_chunk, new_chunk->contents, h->alignment_mask); + + /* Move the existing object to the new chunk. + Word at a time is fast and is safe if the object + is sufficiently aligned. */ + if (h->alignment_mask + 1 >= DEFAULT_ALIGNMENT) + { + for (i = obj_size / sizeof (COPYING_UNIT) - 1; + i >= 0; i--) + ((COPYING_UNIT *)object_base)[i] + = ((COPYING_UNIT *)h->object_base)[i]; + /* We used to copy the odd few remaining bytes as one extra COPYING_UNIT, + but that can cross a page boundary on a machine + which does not do strict alignment for COPYING_UNITS. */ + already = obj_size / sizeof (COPYING_UNIT) * sizeof (COPYING_UNIT); + } + else + already = 0; + /* Copy remaining bytes one by one. */ + for (i = already; i < obj_size; i++) + object_base[i] = h->object_base[i]; + + /* If the object just copied was the only data in OLD_CHUNK, + free that chunk and remove it from the chain. + But not if that chunk might contain an empty object. */ + if (h->object_base == old_chunk->contents && ! h->maybe_empty_object) + { + new_chunk->prev = old_chunk->prev; + CALL_FREEFUN (h, old_chunk); + } + + h->object_base = object_base; + h->next_free = h->object_base + obj_size; + /* The new chunk certainly contains no empty object yet. */ + h->maybe_empty_object = 0; +} +# ifdef _LIBC +libc_hidden_def (_obstack_newchunk) +# endif + +/* Return nonzero if object OBJ has been allocated from obstack H. + This is here for debugging. + If you use it in a program, you are probably losing. */ + +/* Suppress -Wmissing-prototypes warning. We don't want to declare this in + obstack.h because it is just for debugging. */ +int _obstack_allocated_p (struct obstack *h, void *obj); + +int +_obstack_allocated_p (struct obstack *h, void *obj) +{ + register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */ + register struct _obstack_chunk *plp; /* point to previous chunk if any */ + + lp = (h)->chunk; + /* We use >= rather than > since the object cannot be exactly at + the beginning of the chunk but might be an empty object exactly + at the end of an adjacent chunk. */ + while (lp != 0 && ((void *) lp >= obj || (void *) (lp)->limit < obj)) + { + plp = lp->prev; + lp = plp; + } + return lp != 0; +} + +/* Free objects in obstack H, including OBJ and everything allocate + more recently than OBJ. If OBJ is zero, free everything in H. */ + +# undef obstack_free + +void +obstack_free (struct obstack *h, void *obj) +{ + register struct _obstack_chunk *lp; /* below addr of any objects in this chunk */ + register struct _obstack_chunk *plp; /* point to previous chunk if any */ + + lp = h->chunk; + /* We use >= because there cannot be an object at the beginning of a chunk. + But there can be an empty object at that address + at the end of another chunk. */ + while (lp != 0 && ((void *) lp >= obj || (void *) (lp)->limit < obj)) + { + plp = lp->prev; + CALL_FREEFUN (h, lp); + lp = plp; + /* If we switch chunks, we can't tell whether the new current + chunk contains an empty object, so assume that it may. */ + h->maybe_empty_object = 1; + } + if (lp) + { + h->object_base = h->next_free = (char *) (obj); + h->chunk_limit = lp->limit; + h->chunk = lp; + } + else if (obj != 0) + /* obj is not in any of the chunks! */ + abort (); +} + +# ifdef _LIBC +/* Older versions of libc used a function _obstack_free intended to be + called by non-GCC compilers. */ +strong_alias (obstack_free, _obstack_free) +# endif + +int +_obstack_memory_used (struct obstack *h) +{ + register struct _obstack_chunk* lp; + register int nbytes = 0; + + for (lp = h->chunk; lp != 0; lp = lp->prev) + { + nbytes += lp->limit - (char *) lp; + } + return nbytes; +} + +/* Define the error handler. */ +# ifdef _LIBC +# include +# else +# include "gettext.h" +# endif +# ifndef _ +# define _(msgid) gettext (msgid) +# endif + +# ifdef _LIBC +# include +# endif + +# ifndef __attribute__ +/* This feature is available in gcc versions 2.5 and later. */ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 5) +# define __attribute__(Spec) /* empty */ +# endif +# endif + +static void +__attribute__ ((noreturn)) +print_and_abort (void) +{ + /* Don't change any of these strings. Yes, it would be possible to add + the newline to the string and use fputs or so. But this must not + happen because the "memory exhausted" message appears in other places + like this and the translation should be reused instead of creating + a very similar string which requires a separate translation. */ +# if defined _LIBC && defined USE_IN_LIBIO + if (_IO_fwide (stderr, 0) > 0) + __fwprintf (stderr, L"%s\n", _("memory exhausted")); + else +# endif + fprintf (stderr, "%s\n", _("memory exhausted")); + exit (obstack_exit_failure); +} + +#endif /* !ELIDE_CODE */ diff --git a/src/apps/bin/bison/lib/obstack.h b/src/apps/bin/bison/lib/obstack.h new file mode 100644 index 0000000000..c4140ad292 --- /dev/null +++ b/src/apps/bin/bison/lib/obstack.h @@ -0,0 +1,506 @@ +/* obstack.h - object stack macros + Copyright (C) 1988-1994,1996-1999,2003,2004 Free Software Foundation, Inc. + + This file is part of the GNU C Library. Its master source is NOT part of + the C library, however. The master source lives in /gd/gnu/lib. + + NOTE: The canonical source of this file is maintained with the GNU C Library. + Bugs can be reported to bug-glibc@gnu.org. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Summary: + +All the apparent functions defined here are macros. The idea +is that you would use these pre-tested macros to solve a +very specific set of problems, and they would run fast. +Caution: no side-effects in arguments please!! They may be +evaluated MANY times!! + +These macros operate a stack of objects. Each object starts life +small, and may grow to maturity. (Consider building a word syllable +by syllable.) An object can move while it is growing. Once it has +been "finished" it never changes address again. So the "top of the +stack" is typically an immature growing object, while the rest of the +stack is of mature, fixed size and fixed address objects. + +These routines grab large chunks of memory, using a function you +supply, called `obstack_chunk_alloc'. On occasion, they free chunks, +by calling `obstack_chunk_free'. You must define them and declare +them before using any obstack macros. + +Each independent stack is represented by a `struct obstack'. +Each of the obstack macros expects a pointer to such a structure +as the first argument. + +One motivation for this package is the problem of growing char strings +in symbol tables. Unless you are "fascist pig with a read-only mind" +--Gosper's immortal quote from HAKMEM item 154, out of context--you +would not like to put any arbitrary upper limit on the length of your +symbols. + +In practice this often means you will build many short symbols and a +few long symbols. At the time you are reading a symbol you don't know +how long it is. One traditional method is to read a symbol into a +buffer, realloc()ating the buffer every time you try to read a symbol +that is longer than the buffer. This is beaut, but you still will +want to copy the symbol from the buffer to a more permanent +symbol-table entry say about half the time. + +With obstacks, you can work differently. Use one obstack for all symbol +names. As you read a symbol, grow the name in the obstack gradually. +When the name is complete, finalize it. Then, if the symbol exists already, +free the newly read name. + +The way we do this is to take a large chunk, allocating memory from +low addresses. When you want to build a symbol in the chunk you just +add chars above the current "high water mark" in the chunk. When you +have finished adding chars, because you got to the end of the symbol, +you know how long the chars are, and you can create a new object. +Mostly the chars will not burst over the highest address of the chunk, +because you would typically expect a chunk to be (say) 100 times as +long as an average object. + +In case that isn't clear, when we have enough chars to make up +the object, THEY ARE ALREADY CONTIGUOUS IN THE CHUNK (guaranteed) +so we just point to it where it lies. No moving of chars is +needed and this is the second win: potentially long strings need +never be explicitly shuffled. Once an object is formed, it does not +change its address during its lifetime. + +When the chars burst over a chunk boundary, we allocate a larger +chunk, and then copy the partly formed object from the end of the old +chunk to the beginning of the new larger chunk. We then carry on +accreting characters to the end of the object as we normally would. + +A special macro is provided to add a single char at a time to a +growing object. This allows the use of register variables, which +break the ordinary 'growth' macro. + +Summary: + We allocate large chunks. + We carve out one object at a time from the current chunk. + Once carved, an object never moves. + We are free to append data of any size to the currently + growing object. + Exactly one object is growing in an obstack at any one time. + You can run one obstack per control block. + You may have as many control blocks as you dare. + Because of the way we do it, you can `unwind' an obstack + back to a previous state. (You may remove objects much + as you would with a stack.) +*/ + + +/* Don't do the contents of this file more than once. */ + +#ifndef _OBSTACK_H +#define _OBSTACK_H 1 + +#ifdef __cplusplus +extern "C" { +#endif + +/* We need the type of a pointer subtraction. If __PTRDIFF_TYPE__ is + defined, as with GNU C, use that; that way we don't pollute the + namespace with 's symbols. Otherwise, include + and use ptrdiff_t. */ + +#ifdef __PTRDIFF_TYPE__ +# define PTR_INT_TYPE __PTRDIFF_TYPE__ +#else +# include +# define PTR_INT_TYPE ptrdiff_t +#endif + +/* If B is the base of an object addressed by P, return the result of + aligning P to the next multiple of A + 1. B and P must be of type + char *. A + 1 must be a power of 2. */ + +#define __BPTR_ALIGN(B, P, A) ((B) + (((P) - (B) + (A)) & ~(A))) + +/* Similiar to _BPTR_ALIGN (B, P, A), except optimize the common case + where pointers can be converted to integers, aligned as integers, + and converted back again. If PTR_INT_TYPE is narrower than a + pointer (e.g., the AS/400), play it safe and compute the alignment + relative to B. Otherwise, use the faster strategy of computing the + alignment relative to 0. */ + +#define __PTR_ALIGN(B, P, A) \ + __BPTR_ALIGN (sizeof (PTR_INT_TYPE) < sizeof (void *) ? (B) : (char *) 0, \ + P, A) + +#include + +struct _obstack_chunk /* Lives at front of each chunk. */ +{ + char *limit; /* 1 past end of this chunk */ + struct _obstack_chunk *prev; /* address of prior chunk or NULL */ + char contents[4]; /* objects begin here */ +}; + +struct obstack /* control current object in current chunk */ +{ + long chunk_size; /* preferred size to allocate chunks in */ + struct _obstack_chunk *chunk; /* address of current struct obstack_chunk */ + char *object_base; /* address of object we are building */ + char *next_free; /* where to add next char to current object */ + char *chunk_limit; /* address of char after current chunk */ + union + { + PTR_INT_TYPE tempint; + void *tempptr; + } temp; /* Temporary for some macros. */ + int alignment_mask; /* Mask of alignment for each object. */ + /* These prototypes vary based on `use_extra_arg', and we use + casts to the prototypeless function type in all assignments, + but having prototypes here quiets -Wstrict-prototypes. */ + struct _obstack_chunk *(*chunkfun) (void *, long); + void (*freefun) (void *, struct _obstack_chunk *); + void *extra_arg; /* first arg for chunk alloc/dealloc funcs */ + unsigned use_extra_arg:1; /* chunk alloc/dealloc funcs take extra arg */ + unsigned maybe_empty_object:1;/* There is a possibility that the current + chunk contains a zero-length object. This + prevents freeing the chunk if we allocate + a bigger chunk to replace it. */ + unsigned alloc_failed:1; /* No longer used, as we now call the failed + handler on error, but retained for binary + compatibility. */ +}; + +/* Declare the external functions we use; they are in obstack.c. */ + +extern void _obstack_newchunk (struct obstack *, int); +extern int _obstack_begin (struct obstack *, int, int, + void *(*) (long), void (*) (void *)); +extern int _obstack_begin_1 (struct obstack *, int, int, + void *(*) (void *, long), + void (*) (void *, void *), void *); +extern int _obstack_memory_used (struct obstack *); + +void obstack_free (struct obstack *obstack, void *block); + + +/* Error handler called when `obstack_chunk_alloc' failed to allocate + more memory. This can be set to a user defined function which + should either abort gracefully or use longjump - but shouldn't + return. The default action is to print a message and abort. */ +extern void (*obstack_alloc_failed_handler) (void); + +/* Exit value used when `print_and_abort' is used. */ +extern int obstack_exit_failure; + +/* Pointer to beginning of object being allocated or to be allocated next. + Note that this might not be the final address of the object + because a new chunk might be needed to hold the final size. */ + +#define obstack_base(h) ((h)->object_base) + +/* Size for allocating ordinary chunks. */ + +#define obstack_chunk_size(h) ((h)->chunk_size) + +/* Pointer to next byte not yet allocated in current chunk. */ + +#define obstack_next_free(h) ((h)->next_free) + +/* Mask specifying low bits that should be clear in address of an object. */ + +#define obstack_alignment_mask(h) ((h)->alignment_mask) + +/* To prevent prototype warnings provide complete argument list. */ +#define obstack_init(h) \ + _obstack_begin ((h), 0, 0, \ + (void *(*) (long)) obstack_chunk_alloc, \ + (void (*) (void *)) obstack_chunk_free) + +#define obstack_begin(h, size) \ + _obstack_begin ((h), (size), 0, \ + (void *(*) (long)) obstack_chunk_alloc, \ + (void (*) (void *)) obstack_chunk_free) + +#define obstack_specify_allocation(h, size, alignment, chunkfun, freefun) \ + _obstack_begin ((h), (size), (alignment), \ + (void *(*) (long)) (chunkfun), \ + (void (*) (void *)) (freefun)) + +#define obstack_specify_allocation_with_arg(h, size, alignment, chunkfun, freefun, arg) \ + _obstack_begin_1 ((h), (size), (alignment), \ + (void *(*) (void *, long)) (chunkfun), \ + (void (*) (void *, void *)) (freefun), (arg)) + +#define obstack_chunkfun(h, newchunkfun) \ + ((h) -> chunkfun = (struct _obstack_chunk *(*)(void *, long)) (newchunkfun)) + +#define obstack_freefun(h, newfreefun) \ + ((h) -> freefun = (void (*)(void *, struct _obstack_chunk *)) (newfreefun)) + +#define obstack_1grow_fast(h,achar) (*((h)->next_free)++ = (achar)) + +#define obstack_blank_fast(h,n) ((h)->next_free += (n)) + +#define obstack_memory_used(h) _obstack_memory_used (h) + +#if defined __GNUC__ && defined __STDC__ && __STDC__ +/* NextStep 2.0 cc is really gcc 1.93 but it defines __GNUC__ = 2 and + does not implement __extension__. But that compiler doesn't define + __GNUC_MINOR__. */ +# if __GNUC__ < 2 || (__NeXT__ && !__GNUC_MINOR__) +# define __extension__ +# endif + +/* For GNU C, if not -traditional, + we can define these macros to compute all args only once + without using a global variable. + Also, we can avoid using the `temp' slot, to make faster code. */ + +# define obstack_object_size(OBSTACK) \ + __extension__ \ + ({ struct obstack const *__o = (OBSTACK); \ + (unsigned) (__o->next_free - __o->object_base); }) + +# define obstack_room(OBSTACK) \ + __extension__ \ + ({ struct obstack const *__o = (OBSTACK); \ + (unsigned) (__o->chunk_limit - __o->next_free); }) + +# define obstack_make_room(OBSTACK,length) \ +__extension__ \ +({ struct obstack *__o = (OBSTACK); \ + int __len = (length); \ + if (__o->chunk_limit - __o->next_free < __len) \ + _obstack_newchunk (__o, __len); \ + (void) 0; }) + +# define obstack_empty_p(OBSTACK) \ + __extension__ \ + ({ struct obstack const *__o = (OBSTACK); \ + (__o->chunk->prev == 0 && __o->next_free - __o->chunk->contents == 0); }) + +# define obstack_grow(OBSTACK,where,length) \ +__extension__ \ +({ struct obstack *__o = (OBSTACK); \ + int __len = (length); \ + if (__o->next_free + __len > __o->chunk_limit) \ + _obstack_newchunk (__o, __len); \ + memcpy (__o->next_free, where, __len); \ + __o->next_free += __len; \ + (void) 0; }) + +# define obstack_grow0(OBSTACK,where,length) \ +__extension__ \ +({ struct obstack *__o = (OBSTACK); \ + int __len = (length); \ + if (__o->next_free + __len + 1 > __o->chunk_limit) \ + _obstack_newchunk (__o, __len + 1); \ + memcpy (__o->next_free, where, __len); \ + __o->next_free += __len; \ + *(__o->next_free)++ = 0; \ + (void) 0; }) + +# define obstack_1grow(OBSTACK,datum) \ +__extension__ \ +({ struct obstack *__o = (OBSTACK); \ + if (__o->next_free + 1 > __o->chunk_limit) \ + _obstack_newchunk (__o, 1); \ + obstack_1grow_fast (__o, datum); \ + (void) 0; }) + +/* These assume that the obstack alignment is good enough for pointers + or ints, and that the data added so far to the current object + shares that much alignment. */ + +# define obstack_ptr_grow(OBSTACK,datum) \ +__extension__ \ +({ struct obstack *__o = (OBSTACK); \ + if (__o->next_free + sizeof (void *) > __o->chunk_limit) \ + _obstack_newchunk (__o, sizeof (void *)); \ + obstack_ptr_grow_fast (__o, datum); }) \ + +# define obstack_int_grow(OBSTACK,datum) \ +__extension__ \ +({ struct obstack *__o = (OBSTACK); \ + if (__o->next_free + sizeof (int) > __o->chunk_limit) \ + _obstack_newchunk (__o, sizeof (int)); \ + obstack_int_grow_fast (__o, datum); }) + +# define obstack_ptr_grow_fast(OBSTACK,aptr) \ +__extension__ \ +({ struct obstack *__o1 = (OBSTACK); \ + *(const void **) __o1->next_free = (aptr); \ + __o1->next_free += sizeof (const void *); \ + (void) 0; }) + +# define obstack_int_grow_fast(OBSTACK,aint) \ +__extension__ \ +({ struct obstack *__o1 = (OBSTACK); \ + *(int *) __o1->next_free = (aint); \ + __o1->next_free += sizeof (int); \ + (void) 0; }) + +# define obstack_blank(OBSTACK,length) \ +__extension__ \ +({ struct obstack *__o = (OBSTACK); \ + int __len = (length); \ + if (__o->chunk_limit - __o->next_free < __len) \ + _obstack_newchunk (__o, __len); \ + obstack_blank_fast (__o, __len); \ + (void) 0; }) + +# define obstack_alloc(OBSTACK,length) \ +__extension__ \ +({ struct obstack *__h = (OBSTACK); \ + obstack_blank (__h, (length)); \ + obstack_finish (__h); }) + +# define obstack_copy(OBSTACK,where,length) \ +__extension__ \ +({ struct obstack *__h = (OBSTACK); \ + obstack_grow (__h, (where), (length)); \ + obstack_finish (__h); }) + +# define obstack_copy0(OBSTACK,where,length) \ +__extension__ \ +({ struct obstack *__h = (OBSTACK); \ + obstack_grow0 (__h, (where), (length)); \ + obstack_finish (__h); }) + +/* The local variable is named __o1 to avoid a name conflict + when obstack_blank is called. */ +# define obstack_finish(OBSTACK) \ +__extension__ \ +({ struct obstack *__o1 = (OBSTACK); \ + void *__value = (void *) __o1->object_base; \ + if (__o1->next_free == __value) \ + __o1->maybe_empty_object = 1; \ + __o1->next_free \ + = __PTR_ALIGN (__o1->object_base, __o1->next_free, \ + __o1->alignment_mask); \ + if (__o1->next_free - (char *)__o1->chunk \ + > __o1->chunk_limit - (char *)__o1->chunk) \ + __o1->next_free = __o1->chunk_limit; \ + __o1->object_base = __o1->next_free; \ + __value; }) + +# define obstack_free(OBSTACK, OBJ) \ +__extension__ \ +({ struct obstack *__o = (OBSTACK); \ + void *__obj = (OBJ); \ + if (__obj > (void *)__o->chunk && __obj < (void *)__o->chunk_limit) \ + __o->next_free = __o->object_base = (char *)__obj; \ + else (obstack_free) (__o, __obj); }) + +#else /* not __GNUC__ or not __STDC__ */ + +# define obstack_object_size(h) \ + (unsigned) ((h)->next_free - (h)->object_base) + +# define obstack_room(h) \ + (unsigned) ((h)->chunk_limit - (h)->next_free) + +# define obstack_empty_p(h) \ + ((h)->chunk->prev == 0 && (h)->next_free - (h)->chunk->contents == 0) + +/* Note that the call to _obstack_newchunk is enclosed in (..., 0) + so that we can avoid having void expressions + in the arms of the conditional expression. + Casting the third operand to void was tried before, + but some compilers won't accept it. */ + +# define obstack_make_room(h,length) \ +( (h)->temp.tempint = (length), \ + (((h)->next_free + (h)->temp.tempint > (h)->chunk_limit) \ + ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0)) + +# define obstack_grow(h,where,length) \ +( (h)->temp.tempint = (length), \ + (((h)->next_free + (h)->temp.tempint > (h)->chunk_limit) \ + ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0), \ + memcpy ((h)->next_free, where, (h)->temp.tempint), \ + (h)->next_free += (h)->temp.tempint) + +# define obstack_grow0(h,where,length) \ +( (h)->temp.tempint = (length), \ + (((h)->next_free + (h)->temp.tempint + 1 > (h)->chunk_limit) \ + ? (_obstack_newchunk ((h), (h)->temp.tempint + 1), 0) : 0), \ + memcpy ((h)->next_free, where, (h)->temp.tempint), \ + (h)->next_free += (h)->temp.tempint, \ + *((h)->next_free)++ = 0) + +# define obstack_1grow(h,datum) \ +( (((h)->next_free + 1 > (h)->chunk_limit) \ + ? (_obstack_newchunk ((h), 1), 0) : 0), \ + obstack_1grow_fast (h, datum)) + +# define obstack_ptr_grow(h,datum) \ +( (((h)->next_free + sizeof (char *) > (h)->chunk_limit) \ + ? (_obstack_newchunk ((h), sizeof (char *)), 0) : 0), \ + obstack_ptr_grow_fast (h, datum)) + +# define obstack_int_grow(h,datum) \ +( (((h)->next_free + sizeof (int) > (h)->chunk_limit) \ + ? (_obstack_newchunk ((h), sizeof (int)), 0) : 0), \ + obstack_int_grow_fast (h, datum)) + +# define obstack_ptr_grow_fast(h,aptr) \ + (((const void **) ((h)->next_free += sizeof (void *)))[-1] = (aptr)) + +# define obstack_int_grow_fast(h,aint) \ + (((int *) ((h)->next_free += sizeof (int)))[-1] = (aptr)) + +# define obstack_blank(h,length) \ +( (h)->temp.tempint = (length), \ + (((h)->chunk_limit - (h)->next_free < (h)->temp.tempint) \ + ? (_obstack_newchunk ((h), (h)->temp.tempint), 0) : 0), \ + obstack_blank_fast (h, (h)->temp.tempint)) + +# define obstack_alloc(h,length) \ + (obstack_blank ((h), (length)), obstack_finish ((h))) + +# define obstack_copy(h,where,length) \ + (obstack_grow ((h), (where), (length)), obstack_finish ((h))) + +# define obstack_copy0(h,where,length) \ + (obstack_grow0 ((h), (where), (length)), obstack_finish ((h))) + +# define obstack_finish(h) \ +( ((h)->next_free == (h)->object_base \ + ? (((h)->maybe_empty_object = 1), 0) \ + : 0), \ + (h)->temp.tempptr = (h)->object_base, \ + (h)->next_free \ + = __PTR_ALIGN ((h)->object_base, (h)->next_free, \ + (h)->alignment_mask), \ + (((h)->next_free - (char *) (h)->chunk \ + > (h)->chunk_limit - (char *) (h)->chunk) \ + ? ((h)->next_free = (h)->chunk_limit) : 0), \ + (h)->object_base = (h)->next_free, \ + (h)->temp.tempptr) + +# define obstack_free(h,obj) \ +( (h)->temp.tempint = (char *) (obj) - (char *) (h)->chunk, \ + ((((h)->temp.tempint > 0 \ + && (h)->temp.tempint < (h)->chunk_limit - (char *) (h)->chunk)) \ + ? (int) ((h)->next_free = (h)->object_base \ + = (h)->temp.tempint + (char *) (h)->chunk) \ + : (((obstack_free) ((h), (h)->temp.tempint + (char *) (h)->chunk), 0), 0))) + +#endif /* not __GNUC__ or not __STDC__ */ + +#ifdef __cplusplus +} /* C++ */ +#endif + +#endif /* obstack.h */ diff --git a/src/apps/bin/bison/lib/quote.c b/src/apps/bin/bison/lib/quote.c new file mode 100644 index 0000000000..5f11d836b3 --- /dev/null +++ b/src/apps/bin/bison/lib/quote.c @@ -0,0 +1,41 @@ +/* quote.c - quote arguments for output + Copyright (C) 1998, 1999, 2000, 2001, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Paul Eggert */ + +#if HAVE_CONFIG_H +# include +#endif + +#include "quotearg.h" +#include "quote.h" + +/* Return an unambiguous printable representation of NAME, + allocated in slot N, suitable for diagnostics. */ +char const * +quote_n (int n, char const *name) +{ + return quotearg_n_style (n, locale_quoting_style, name); +} + +/* Return an unambiguous printable representation of NAME, + suitable for diagnostics. */ +char const * +quote (char const *name) +{ + return quote_n (0, name); +} diff --git a/src/apps/bin/bison/lib/quote.h b/src/apps/bin/bison/lib/quote.h new file mode 100644 index 0000000000..682f9d1fd2 --- /dev/null +++ b/src/apps/bin/bison/lib/quote.h @@ -0,0 +1,22 @@ +/* quote.h - prototypes for quote.c + + Copyright (C) 1998, 1999, 2000, 2001, 2003 Free Software + Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + + +char const *quote_n (int n, char const *name); +char const *quote (char const *name); diff --git a/src/apps/bin/bison/lib/quotearg.c b/src/apps/bin/bison/lib/quotearg.c new file mode 100644 index 0000000000..fe747fb0b9 --- /dev/null +++ b/src/apps/bin/bison/lib/quotearg.c @@ -0,0 +1,672 @@ +/* quotearg.c - quote arguments for output + + Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004 Free Software + Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Paul Eggert */ + +#if HAVE_CONFIG_H +# include +#endif + +#include "quotearg.h" + +#include "xalloc.h" + +#include +#include +#include +#include +#include + +#include "gettext.h" +#define _(msgid) gettext (msgid) +#define N_(msgid) msgid + +#if HAVE_WCHAR_H + +/* BSD/OS 4.1 wchar.h requires FILE and struct tm to be declared. */ +# include +# include + +# include +#endif + +#if !HAVE_MBRTOWC +/* Disable multibyte processing entirely. Since MB_CUR_MAX is 1, the + other macros are defined only for documentation and to satisfy C + syntax. */ +# undef MB_CUR_MAX +# define MB_CUR_MAX 1 +# define mbrtowc(pwc, s, n, ps) ((*(pwc) = *(s)) != 0) +# define iswprint(wc) isprint ((unsigned char) (wc)) +# undef HAVE_MBSINIT +#endif + +#if !defined mbsinit && !HAVE_MBSINIT +# define mbsinit(ps) 1 +#endif + +#ifndef iswprint +# if HAVE_WCTYPE_H +# include +# endif +# if !defined iswprint && !HAVE_ISWPRINT +# define iswprint(wc) 1 +# endif +#endif + +#ifndef SIZE_MAX +# define SIZE_MAX ((size_t) -1) +#endif + +#define INT_BITS (sizeof (int) * CHAR_BIT) + +struct quoting_options +{ + /* Basic quoting style. */ + enum quoting_style style; + + /* Quote the characters indicated by this bit vector even if the + quoting style would not normally require them to be quoted. */ + int quote_these_too[(UCHAR_MAX / INT_BITS) + 1]; +}; + +/* Names of quoting styles. */ +char const *const quoting_style_args[] = +{ + "literal", + "shell", + "shell-always", + "c", + "escape", + "locale", + "clocale", + 0 +}; + +/* Correspondences to quoting style names. */ +enum quoting_style const quoting_style_vals[] = +{ + literal_quoting_style, + shell_quoting_style, + shell_always_quoting_style, + c_quoting_style, + escape_quoting_style, + locale_quoting_style, + clocale_quoting_style +}; + +/* The default quoting options. */ +static struct quoting_options default_quoting_options; + +/* Allocate a new set of quoting options, with contents initially identical + to O if O is not null, or to the default if O is null. + It is the caller's responsibility to free the result. */ +struct quoting_options * +clone_quoting_options (struct quoting_options *o) +{ + int e = errno; + struct quoting_options *p = xmalloc (sizeof *p); + *p = *(o ? o : &default_quoting_options); + errno = e; + return p; +} + +/* Get the value of O's quoting style. If O is null, use the default. */ +enum quoting_style +get_quoting_style (struct quoting_options *o) +{ + return (o ? o : &default_quoting_options)->style; +} + +/* In O (or in the default if O is null), + set the value of the quoting style to S. */ +void +set_quoting_style (struct quoting_options *o, enum quoting_style s) +{ + (o ? o : &default_quoting_options)->style = s; +} + +/* In O (or in the default if O is null), + set the value of the quoting options for character C to I. + Return the old value. Currently, the only values defined for I are + 0 (the default) and 1 (which means to quote the character even if + it would not otherwise be quoted). */ +int +set_char_quoting (struct quoting_options *o, char c, int i) +{ + unsigned char uc = c; + int *p = (o ? o : &default_quoting_options)->quote_these_too + uc / INT_BITS; + int shift = uc % INT_BITS; + int r = (*p >> shift) & 1; + *p ^= ((i & 1) ^ r) << shift; + return r; +} + +/* MSGID approximates a quotation mark. Return its translation if it + has one; otherwise, return either it or "\"", depending on S. */ +static char const * +gettext_quote (char const *msgid, enum quoting_style s) +{ + char const *translation = _(msgid); + if (translation == msgid && s == clocale_quoting_style) + translation = "\""; + return translation; +} + +/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of + argument ARG (of size ARGSIZE), using QUOTING_STYLE and the + non-quoting-style part of O to control quoting. + Terminate the output with a null character, and return the written + size of the output, not counting the terminating null. + If BUFFERSIZE is too small to store the output string, return the + value that would have been returned had BUFFERSIZE been large enough. + If ARGSIZE is SIZE_MAX, use the string length of the argument for ARGSIZE. + + This function acts like quotearg_buffer (BUFFER, BUFFERSIZE, ARG, + ARGSIZE, O), except it uses QUOTING_STYLE instead of the quoting + style specified by O, and O may not be null. */ + +static size_t +quotearg_buffer_restyled (char *buffer, size_t buffersize, + char const *arg, size_t argsize, + enum quoting_style quoting_style, + struct quoting_options const *o) +{ + size_t i; + size_t len = 0; + char const *quote_string = 0; + size_t quote_string_len = 0; + int backslash_escapes = 0; + int unibyte_locale = MB_CUR_MAX == 1; + +#define STORE(c) \ + do \ + { \ + if (len < buffersize) \ + buffer[len] = (c); \ + len++; \ + } \ + while (0) + + switch (quoting_style) + { + case c_quoting_style: + STORE ('"'); + backslash_escapes = 1; + quote_string = "\""; + quote_string_len = 1; + break; + + case escape_quoting_style: + backslash_escapes = 1; + break; + + case locale_quoting_style: + case clocale_quoting_style: + { + /* Get translations for open and closing quotation marks. + + The message catalog should translate "`" to a left + quotation mark suitable for the locale, and similarly for + "'". If the catalog has no translation, + locale_quoting_style quotes `like this', and + clocale_quoting_style quotes "like this". + + For example, an American English Unicode locale should + translate "`" to U+201C (LEFT DOUBLE QUOTATION MARK), and + should translate "'" to U+201D (RIGHT DOUBLE QUOTATION + MARK). A British English Unicode locale should instead + translate these to U+2018 (LEFT SINGLE QUOTATION MARK) and + U+2019 (RIGHT SINGLE QUOTATION MARK), respectively. */ + + char const *left = gettext_quote (N_("`"), quoting_style); + char const *right = gettext_quote (N_("'"), quoting_style); + for (quote_string = left; *quote_string; quote_string++) + STORE (*quote_string); + backslash_escapes = 1; + quote_string = right; + quote_string_len = strlen (quote_string); + } + break; + + case shell_always_quoting_style: + STORE ('\''); + quote_string = "'"; + quote_string_len = 1; + break; + + default: + break; + } + + for (i = 0; ! (argsize == SIZE_MAX ? arg[i] == '\0' : i == argsize); i++) + { + unsigned char c; + unsigned char esc; + + if (backslash_escapes + && quote_string_len + && i + quote_string_len <= argsize + && memcmp (arg + i, quote_string, quote_string_len) == 0) + STORE ('\\'); + + c = arg[i]; + switch (c) + { + case '\0': + if (backslash_escapes) + { + STORE ('\\'); + STORE ('0'); + STORE ('0'); + c = '0'; + } + break; + + case '?': + switch (quoting_style) + { + case shell_quoting_style: + goto use_shell_always_quoting_style; + + case c_quoting_style: + if (i + 2 < argsize && arg[i + 1] == '?') + switch (arg[i + 2]) + { + case '!': case '\'': + case '(': case ')': case '-': case '/': + case '<': case '=': case '>': + /* Escape the second '?' in what would otherwise be + a trigraph. */ + c = arg[i + 2]; + i += 2; + STORE ('?'); + STORE ('\\'); + STORE ('?'); + break; + } + break; + + default: + break; + } + break; + + case '\a': esc = 'a'; goto c_escape; + case '\b': esc = 'b'; goto c_escape; + case '\f': esc = 'f'; goto c_escape; + case '\n': esc = 'n'; goto c_and_shell_escape; + case '\r': esc = 'r'; goto c_and_shell_escape; + case '\t': esc = 't'; goto c_and_shell_escape; + case '\v': esc = 'v'; goto c_escape; + case '\\': esc = c; goto c_and_shell_escape; + + c_and_shell_escape: + if (quoting_style == shell_quoting_style) + goto use_shell_always_quoting_style; + c_escape: + if (backslash_escapes) + { + c = esc; + goto store_escape; + } + break; + + case '{': case '}': /* sometimes special if isolated */ + if (! (argsize == SIZE_MAX ? arg[1] == '\0' : argsize == 1)) + break; + /* Fall through. */ + case '#': case '~': + if (i != 0) + break; + /* Fall through. */ + case ' ': + case '!': /* special in bash */ + case '"': case '$': case '&': + case '(': case ')': case '*': case ';': + case '<': + case '=': /* sometimes special in 0th or (with "set -k") later args */ + case '>': case '[': + case '^': /* special in old /bin/sh, e.g. SunOS 4.1.4 */ + case '`': case '|': + /* A shell special character. In theory, '$' and '`' could + be the first bytes of multibyte characters, which means + we should check them with mbrtowc, but in practice this + doesn't happen so it's not worth worrying about. */ + if (quoting_style == shell_quoting_style) + goto use_shell_always_quoting_style; + break; + + case '\'': + switch (quoting_style) + { + case shell_quoting_style: + goto use_shell_always_quoting_style; + + case shell_always_quoting_style: + STORE ('\''); + STORE ('\\'); + STORE ('\''); + break; + + default: + break; + } + break; + + case '%': case '+': case ',': case '-': case '.': case '/': + case '0': case '1': case '2': case '3': case '4': case '5': + case '6': case '7': case '8': case '9': case ':': + case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': + case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': + case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': + case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': + case 'Y': case 'Z': case ']': case '_': case 'a': case 'b': + case 'c': case 'd': case 'e': case 'f': case 'g': case 'h': + case 'i': case 'j': case 'k': case 'l': case 'm': case 'n': + case 'o': case 'p': case 'q': case 'r': case 's': case 't': + case 'u': case 'v': case 'w': case 'x': case 'y': case 'z': + /* These characters don't cause problems, no matter what the + quoting style is. They cannot start multibyte sequences. */ + break; + + default: + /* If we have a multibyte sequence, copy it until we reach + its end, find an error, or come back to the initial shift + state. For C-like styles, if the sequence has + unprintable characters, escape the whole sequence, since + we can't easily escape single characters within it. */ + { + /* Length of multibyte sequence found so far. */ + size_t m; + + int printable; + + if (unibyte_locale) + { + m = 1; + printable = isprint (c); + } + else + { + mbstate_t mbstate; + memset (&mbstate, 0, sizeof mbstate); + + m = 0; + printable = 1; + if (argsize == SIZE_MAX) + argsize = strlen (arg); + + do + { + wchar_t w; + size_t bytes = mbrtowc (&w, &arg[i + m], + argsize - (i + m), &mbstate); + if (bytes == 0) + break; + else if (bytes == (size_t) -1) + { + printable = 0; + break; + } + else if (bytes == (size_t) -2) + { + printable = 0; + while (i + m < argsize && arg[i + m]) + m++; + break; + } + else + { + /* Work around a bug with older shells that "see" a '\' + that is really the 2nd byte of a multibyte character. + In practice the problem is limited to ASCII + chars >= '@' that are shell special chars. */ + if ('[' == 0x5b && quoting_style == shell_quoting_style) + { + size_t j; + for (j = 1; j < bytes; j++) + switch (arg[i + m + j]) + { + case '[': case '\\': case '^': + case '`': case '|': + goto use_shell_always_quoting_style; + } + } + + if (! iswprint (w)) + printable = 0; + m += bytes; + } + } + while (! mbsinit (&mbstate)); + } + + if (1 < m || (backslash_escapes && ! printable)) + { + /* Output a multibyte sequence, or an escaped + unprintable unibyte character. */ + size_t ilim = i + m; + + for (;;) + { + if (backslash_escapes && ! printable) + { + STORE ('\\'); + STORE ('0' + (c >> 6)); + STORE ('0' + ((c >> 3) & 7)); + c = '0' + (c & 7); + } + if (ilim <= i + 1) + break; + STORE (c); + c = arg[++i]; + } + + goto store_c; + } + } + } + + if (! (backslash_escapes + && o->quote_these_too[c / INT_BITS] & (1 << (c % INT_BITS)))) + goto store_c; + + store_escape: + STORE ('\\'); + + store_c: + STORE (c); + } + + if (i == 0 && quoting_style == shell_quoting_style) + goto use_shell_always_quoting_style; + + if (quote_string) + for (; *quote_string; quote_string++) + STORE (*quote_string); + + if (len < buffersize) + buffer[len] = '\0'; + return len; + + use_shell_always_quoting_style: + return quotearg_buffer_restyled (buffer, buffersize, arg, argsize, + shell_always_quoting_style, o); +} + +/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of + argument ARG (of size ARGSIZE), using O to control quoting. + If O is null, use the default. + Terminate the output with a null character, and return the written + size of the output, not counting the terminating null. + If BUFFERSIZE is too small to store the output string, return the + value that would have been returned had BUFFERSIZE been large enough. + If ARGSIZE is SIZE_MAX, use the string length of the argument for + ARGSIZE. */ +size_t +quotearg_buffer (char *buffer, size_t buffersize, + char const *arg, size_t argsize, + struct quoting_options const *o) +{ + struct quoting_options const *p = o ? o : &default_quoting_options; + int e = errno; + size_t r = quotearg_buffer_restyled (buffer, buffersize, arg, argsize, + p->style, p); + errno = e; + return r; +} + +/* Like quotearg_buffer (..., ARG, ARGSIZE, O), except return newly + allocated storage containing the quoted string. */ +char * +quotearg_alloc (char const *arg, size_t argsize, + struct quoting_options const *o) +{ + int e = errno; + size_t bufsize = quotearg_buffer (0, 0, arg, argsize, o) + 1; + char *buf = xmalloc (bufsize); + quotearg_buffer (buf, bufsize, arg, argsize, o); + errno = e; + return buf; +} + +/* Use storage slot N to return a quoted version of argument ARG. + ARG is of size ARGSIZE, but if that is SIZE_MAX, ARG is a + null-terminated string. + OPTIONS specifies the quoting options. + The returned value points to static storage that can be + reused by the next call to this function with the same value of N. + N must be nonnegative. N is deliberately declared with type "int" + to allow for future extensions (using negative values). */ +static char * +quotearg_n_options (int n, char const *arg, size_t argsize, + struct quoting_options const *options) +{ + int e = errno; + + /* Preallocate a slot 0 buffer, so that the caller can always quote + one small component of a "memory exhausted" message in slot 0. */ + static char slot0[256]; + static unsigned int nslots = 1; + unsigned int n0 = n; + struct slotvec + { + size_t size; + char *val; + }; + static struct slotvec slotvec0 = {sizeof slot0, slot0}; + static struct slotvec *slotvec = &slotvec0; + + if (n < 0) + abort (); + + if (nslots <= n0) + { + unsigned int n1 = n0 + 1; + + if (xalloc_oversized (n1, sizeof *slotvec)) + xalloc_die (); + + if (slotvec == &slotvec0) + { + slotvec = xmalloc (sizeof *slotvec); + *slotvec = slotvec0; + } + slotvec = xrealloc (slotvec, n1 * sizeof *slotvec); + memset (slotvec + nslots, 0, (n1 - nslots) * sizeof *slotvec); + nslots = n1; + } + + { + size_t size = slotvec[n].size; + char *val = slotvec[n].val; + size_t qsize = quotearg_buffer (val, size, arg, argsize, options); + + if (size <= qsize) + { + slotvec[n].size = size = qsize + 1; + if (val != slot0) + free (val); + slotvec[n].val = val = xmalloc (size); + quotearg_buffer (val, size, arg, argsize, options); + } + + errno = e; + return val; + } +} + +char * +quotearg_n (int n, char const *arg) +{ + return quotearg_n_options (n, arg, SIZE_MAX, &default_quoting_options); +} + +char * +quotearg (char const *arg) +{ + return quotearg_n (0, arg); +} + +/* Return quoting options for STYLE, with no extra quoting. */ +static struct quoting_options +quoting_options_from_style (enum quoting_style style) +{ + struct quoting_options o; + o.style = style; + memset (o.quote_these_too, 0, sizeof o.quote_these_too); + return o; +} + +char * +quotearg_n_style (int n, enum quoting_style s, char const *arg) +{ + struct quoting_options const o = quoting_options_from_style (s); + return quotearg_n_options (n, arg, SIZE_MAX, &o); +} + +char * +quotearg_n_style_mem (int n, enum quoting_style s, + char const *arg, size_t argsize) +{ + struct quoting_options const o = quoting_options_from_style (s); + return quotearg_n_options (n, arg, argsize, &o); +} + +char * +quotearg_style (enum quoting_style s, char const *arg) +{ + return quotearg_n_style (0, s, arg); +} + +char * +quotearg_char (char const *arg, char ch) +{ + struct quoting_options options; + options = default_quoting_options; + set_char_quoting (&options, ch, 1); + return quotearg_n_options (0, arg, SIZE_MAX, &options); +} + +char * +quotearg_colon (char const *arg) +{ + return quotearg_char (arg, ':'); +} diff --git a/src/apps/bin/bison/lib/quotearg.h b/src/apps/bin/bison/lib/quotearg.h new file mode 100644 index 0000000000..2bbf38d92a --- /dev/null +++ b/src/apps/bin/bison/lib/quotearg.h @@ -0,0 +1,137 @@ +/* quotearg.h - quote arguments for output + + Copyright (C) 1998, 1999, 2000, 2001, 2002, 2004 Free Software + Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Paul Eggert */ + +#ifndef QUOTEARG_H_ +# define QUOTEARG_H_ 1 + +# include + +/* Basic quoting styles. */ +enum quoting_style + { + /* Output names as-is (ls --quoting-style=literal). */ + literal_quoting_style, + + /* Quote names for the shell if they contain shell metacharacters + or would cause ambiguous output (ls --quoting-style=shell). */ + shell_quoting_style, + + /* Quote names for the shell, even if they would normally not + require quoting (ls --quoting-style=shell-always). */ + shell_always_quoting_style, + + /* Quote names as for a C language string (ls --quoting-style=c). */ + c_quoting_style, + + /* Like c_quoting_style except omit the surrounding double-quote + characters (ls --quoting-style=escape). */ + escape_quoting_style, + + /* Like clocale_quoting_style, but quote `like this' instead of + "like this" in the default C locale (ls --quoting-style=locale). */ + locale_quoting_style, + + /* Like c_quoting_style except use quotation marks appropriate for + the locale (ls --quoting-style=clocale). */ + clocale_quoting_style + }; + +/* For now, --quoting-style=literal is the default, but this may change. */ +# ifndef DEFAULT_QUOTING_STYLE +# define DEFAULT_QUOTING_STYLE literal_quoting_style +# endif + +/* Names of quoting styles and their corresponding values. */ +extern char const *const quoting_style_args[]; +extern enum quoting_style const quoting_style_vals[]; + +struct quoting_options; + +/* The functions listed below set and use a hidden variable + that contains the default quoting style options. */ + +/* Allocate a new set of quoting options, with contents initially identical + to O if O is not null, or to the default if O is null. + It is the caller's responsibility to free the result. */ +struct quoting_options *clone_quoting_options (struct quoting_options *o); + +/* Get the value of O's quoting style. If O is null, use the default. */ +enum quoting_style get_quoting_style (struct quoting_options *o); + +/* In O (or in the default if O is null), + set the value of the quoting style to S. */ +void set_quoting_style (struct quoting_options *o, enum quoting_style s); + +/* In O (or in the default if O is null), + set the value of the quoting options for character C to I. + Return the old value. Currently, the only values defined for I are + 0 (the default) and 1 (which means to quote the character even if + it would not otherwise be quoted). */ +int set_char_quoting (struct quoting_options *o, char c, int i); + +/* Place into buffer BUFFER (of size BUFFERSIZE) a quoted version of + argument ARG (of size ARGSIZE), using O to control quoting. + If O is null, use the default. + Terminate the output with a null character, and return the written + size of the output, not counting the terminating null. + If BUFFERSIZE is too small to store the output string, return the + value that would have been returned had BUFFERSIZE been large enough. + If ARGSIZE is -1, use the string length of the argument for ARGSIZE. */ +size_t quotearg_buffer (char *buffer, size_t buffersize, + char const *arg, size_t argsize, + struct quoting_options const *o); + +/* Like quotearg_buffer, except return the result in a newly allocated + buffer. It is the caller's responsibility to free the result. */ +char *quotearg_alloc (char const *arg, size_t argsize, + struct quoting_options const *o); + +/* Use storage slot N to return a quoted version of the string ARG. + Use the default quoting options. + The returned value points to static storage that can be + reused by the next call to this function with the same value of N. + N must be nonnegative. */ +char *quotearg_n (int n, char const *arg); + +/* Equivalent to quotearg_n (0, ARG). */ +char *quotearg (char const *arg); + +/* Use style S and storage slot N to return a quoted version of the string ARG. + This is like quotearg_n (N, ARG), except that it uses S with no other + options to specify the quoting method. */ +char *quotearg_n_style (int n, enum quoting_style s, char const *arg); + +/* Use style S and storage slot N to return a quoted version of the + argument ARG of size ARGSIZE. This is like quotearg_n_style + (N, S, ARG), except it can quote null bytes. */ +char *quotearg_n_style_mem (int n, enum quoting_style s, + char const *arg, size_t argsize); + +/* Equivalent to quotearg_n_style (0, S, ARG). */ +char *quotearg_style (enum quoting_style s, char const *arg); + +/* Like quotearg (ARG), except also quote any instances of CH. */ +char *quotearg_char (char const *arg, char ch); + +/* Equivalent to quotearg_char (ARG, ':'). */ +char *quotearg_colon (char const *arg); + +#endif /* !QUOTEARG_H_ */ diff --git a/src/apps/bin/bison/lib/realloc.c b/src/apps/bin/bison/lib/realloc.c new file mode 100644 index 0000000000..ccbf991388 --- /dev/null +++ b/src/apps/bin/bison/lib/realloc.c @@ -0,0 +1,39 @@ +/* Work around bug on some systems where realloc (NULL, 0) fails. + Copyright (C) 1997, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* written by Jim Meyering */ + +#if HAVE_CONFIG_H +# include +#endif +#undef realloc + +#include + +/* Change the size of an allocated block of memory P to N bytes, + with error checking. If N is zero, change it to 1. If P is NULL, + use malloc. */ + +void * +rpl_realloc (void *p, size_t n) +{ + if (n == 0) + n = 1; + if (p == 0) + return malloc (n); + return realloc (p, n); +} diff --git a/src/apps/bin/bison/lib/stdbool_.h b/src/apps/bin/bison/lib/stdbool_.h new file mode 100644 index 0000000000..e33715a615 --- /dev/null +++ b/src/apps/bin/bison/lib/stdbool_.h @@ -0,0 +1,93 @@ +/* Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + Written by Bruno Haible , 2001. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _STDBOOL_H +#define _STDBOOL_H + +/* ISO C 99 for platforms that lack it. */ + +/* Usage suggestions: + + Programs that use should be aware of some limitations + and standards compliance issues. + + Standards compliance: + + - must be #included before 'bool', 'false', 'true' + can be used. + + - You cannot assume that sizeof (bool) == 1. + + - Programs should not undefine the macros bool, true, and false, + as C99 lists that as an "obsolescent feature". + + Limitations of this substitute, when used in a C89 environment: + + - must be #included before the '_Bool' type can be used. + + - You cannot assume that _Bool is a typedef; it might be a macro. + + - In C99, casts and automatic conversions to '_Bool' or 'bool' are + performed in such a way that every nonzero value gets converted + to 'true', and zero gets converted to 'false'. This doesn't work + with this substitute. With this substitute, only the values 0 and 1 + give the expected result when converted to _Bool' or 'bool'. + + Also, it is suggested that programs use 'bool' rather than '_Bool'; + this isn't required, but 'bool' is more common. */ + + +/* 7.16. Boolean type and values */ + +/* BeOS already #defines false 0, true 1. We use the same + definitions below, but temporarily we have to #undef them. */ +#ifdef __BEOS__ +# include /* defines bool but not _Bool */ +# undef false +# undef true +#endif + +/* For the sake of symbolic names in gdb, we define true and false as + enum constants, not only as macros. + It is tempting to write + typedef enum { false = 0, true = 1 } _Bool; + so that gdb prints values of type 'bool' symbolically. But if we do + this, values of type '_Bool' may promote to 'int' or 'unsigned int' + (see ISO C 99 6.7.2.2.(4)); however, '_Bool' must promote to 'int' + (see ISO C 99 6.3.1.1.(2)). So we add a negative value to the + enum; this ensures that '_Bool' promotes to 'int'. */ +#if !(defined __cplusplus || defined __BEOS__) +# if !@HAVE__BOOL@ +# if defined __SUNPRO_C && (__SUNPRO_C < 0x550 || __STDC__ == 1) + /* Avoid stupid "warning: _Bool is a keyword in ISO C99". */ +# define _Bool signed char +enum { false = 0, true = 1 }; +# else +typedef enum { _Bool_must_promote_to_int = -1, false = 0, true = 1 } _Bool; +# endif +# endif +#else +typedef bool _Bool; +#endif +#define bool _Bool + +/* The other macros must be usable in preprocessor directives. */ +#define false 0 +#define true 1 +#define __bool_true_false_are_defined 1 + +#endif /* _STDBOOL_H */ diff --git a/src/apps/bin/bison/lib/stpcpy.c b/src/apps/bin/bison/lib/stpcpy.c new file mode 100644 index 0000000000..a01636cd1c --- /dev/null +++ b/src/apps/bin/bison/lib/stpcpy.c @@ -0,0 +1,50 @@ +/* stpcpy.c -- copy a string and return pointer to end of new string + Copyright (C) 1992, 1995, 1997, 1998 Free Software Foundation, Inc. + + NOTE: The canonical source of this file is maintained with the GNU C Library. + Bugs can be reported to bug-glibc@prep.ai.mit.edu. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifdef HAVE_CONFIG_H +# include +#endif + +#include + +#undef __stpcpy +#undef stpcpy + +#ifndef weak_alias +# define __stpcpy stpcpy +#endif + +/* Copy SRC to DEST, returning the address of the terminating '\0' in DEST. */ +char * +__stpcpy (char *dest, const char *src) +{ + register char *d = dest; + register const char *s = src; + + do + *d++ = *s; + while (*s++ != '\0'); + + return d - 1; +} +#ifdef weak_alias +weak_alias (__stpcpy, stpcpy) +#endif diff --git a/src/apps/bin/bison/lib/stpcpy.h b/src/apps/bin/bison/lib/stpcpy.h new file mode 100644 index 0000000000..b579c5c9de --- /dev/null +++ b/src/apps/bin/bison/lib/stpcpy.h @@ -0,0 +1,33 @@ +/* String copying. + Copyright (C) 1995, 2001, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _STPCPY_H +#define _STPCPY_H + +#if HAVE_STPCPY + +/* Get stpcpy() declaration. */ +#include + +#else + +/* Copy SRC to DST, returning the address of the terminating '\0' in DST. */ +extern char *stpcpy (char *dst, const char *src); + +#endif + +#endif /* _STPCPY_H */ diff --git a/src/apps/bin/bison/lib/stripslash.c b/src/apps/bin/bison/lib/stripslash.c new file mode 100644 index 0000000000..c6b319e69f --- /dev/null +++ b/src/apps/bin/bison/lib/stripslash.c @@ -0,0 +1,39 @@ +/* stripslash.c -- remove redundant trailing slashes from a file name + Copyright (C) 1990, 2001, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +# include +#endif + +#include "dirname.h" + +/* Remove trailing slashes from PATH. + Return nonzero if a trailing slash was removed. + This is useful when using filename completion from a shell that + adds a "/" after directory names (such as tcsh and bash), because + the Unix rename and rmdir system calls return an "Invalid argument" error + when given a path that ends in "/" (except for the root directory). */ + +int +strip_trailing_slashes (char *path) +{ + char *base = base_name (path); + char *base_lim = base + base_len (base); + int had_slash = *base_lim; + *base_lim = '\0'; + return had_slash; +} diff --git a/src/apps/bin/bison/lib/strndup.c b/src/apps/bin/bison/lib/strndup.c new file mode 100644 index 0000000000..f85627e879 --- /dev/null +++ b/src/apps/bin/bison/lib/strndup.c @@ -0,0 +1,55 @@ +/* Copyright (C) 1996, 1997, 1998, 2000, 2003 Free Software Foundation, Inc. + + NOTE: The canonical source of this file is maintained with the GNU C Library. + Bugs can be reported to bug-glibc@prep.ai.mit.edu. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include +#include + +#ifndef HAVE_DECL_STRNLEN +"this configure-time declaration test was not run" +#endif +#if !HAVE_DECL_STRNLEN +size_t strnlen (); +#endif + +#undef __strndup +#undef strndup + +#ifndef weak_alias +# define __strndup strndup +#endif + +char * +__strndup (const char *s, size_t n) +{ + size_t len = strnlen (s, n); + char *new = malloc (len + 1); + + if (new == NULL) + return NULL; + + new[len] = '\0'; + return memcpy (new, s, len); +} +#ifdef weak_alias +weak_alias (__strndup, strndup) +#endif diff --git a/src/apps/bin/bison/lib/strndup.h b/src/apps/bin/bison/lib/strndup.h new file mode 100644 index 0000000000..318e799839 --- /dev/null +++ b/src/apps/bin/bison/lib/strndup.h @@ -0,0 +1,30 @@ +/* Duplicate a size-bounded string. + Copyright (C) 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_STRNDUP + +/* Get strndup() declaration. */ +#include + +#else + +#include + +/* Return a newly allocated copy of at most N bytes of STRING. */ +extern char *strndup (const char *string, size_t n); + +#endif diff --git a/src/apps/bin/bison/lib/strnlen.c b/src/apps/bin/bison/lib/strnlen.c new file mode 100644 index 0000000000..c9f3898451 --- /dev/null +++ b/src/apps/bin/bison/lib/strnlen.c @@ -0,0 +1,48 @@ +/* Find the length of STRING, but scan at most MAXLEN characters. + Copyright (C) 1996, 1997, 1998, 2000-2003 Free Software Foundation, Inc. + This file is part of the GNU C Library. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +# include +#endif +#undef strnlen + +#include + +#undef __strnlen +#undef strnlen + +#ifndef _LIBC +# define strnlen rpl_strnlen +#endif + +#ifndef weak_alias +# define __strnlen strnlen +#endif + +/* Find the length of STRING, but scan at most MAXLEN characters. + If no '\0' terminator is found in that many characters, return MAXLEN. */ + +size_t +__strnlen (const char *string, size_t maxlen) +{ + const char *end = memchr (string, '\0', maxlen); + return end ? (size_t) (end - string) : maxlen; +} +#ifdef weak_alias +weak_alias (__strnlen, strnlen) +#endif diff --git a/src/apps/bin/bison/lib/subpipe.c b/src/apps/bin/bison/lib/subpipe.c new file mode 100644 index 0000000000..8722bac035 --- /dev/null +++ b/src/apps/bin/bison/lib/subpipe.c @@ -0,0 +1,180 @@ +/* Subprocesses with pipes. + + Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Paul Eggert + and Florian Krohm . */ + +#if HAVE_CONFIG_H +# include +#endif + +#include "subpipe.h" + +#include + +#include +#if ! defined SIGCHLD && defined SIGCLD +# define SIGCHLD SIGCLD +#endif + +#include + +#if HAVE_UNISTD_H +# include +#endif +#ifndef STDIN_FILENO +# define STDIN_FILENO 0 +#endif +#ifndef STDOUT_FILENO +# define STDOUT_FILENO 1 +#endif +#if ! HAVE_DUP2 && ! defined dup2 +# if HAVE_FCNTL_H +# include +# endif +# define dup2(f, t) (close (t), fcntl (f, F_DUPFD, t)) +#endif + +#if HAVE_SYS_WAIT_H +# include +#endif +#ifndef WEXITSTATUS +# define WEXITSTATUS(stat_val) ((unsigned int) (stat_val) >> 8) +#endif +#ifndef WIFEXITED +# define WIFEXITED(stat_val) (((stat_val) & 255) == 0) +#endif + +#if HAVE_VFORK_H +# include +#endif +#if ! HAVE_WORKING_VFORK +# define vfork fork +#endif + +#include "error.h" + +#include "gettext.h" +#define _(Msgid) gettext (Msgid) + + +/* Initialize this module. */ + +void +init_subpipe (void) +{ +#ifdef SIGCHLD + /* System V fork+wait does not work if SIGCHLD is ignored. */ + signal (SIGCHLD, SIG_DFL); +#endif +} + + +/* Create a subprocess that is run as a filter. ARGV is the + NULL-terminated argument vector for the subprocess. Store read and + write file descriptors for communication with the subprocess into + FD[0] and FD[1]: input meant for the process can be written into + FD[0], and output from the process can be read from FD[1]. Return + the subprocess id. + + To avoid deadlock, the invoker must not let incoming data pile up + in FD[1] while writing data to FD[0]. */ + +pid_t +create_subpipe (char const * const *argv, int fd[2]) +{ + int pipe_fd[2]; + int from_in_fd; + int from_out_fd; + int to_in_fd; + int to_out_fd; + pid_t pid; + + if (pipe (pipe_fd) != 0) + error (EXIT_FAILURE, errno, "pipe"); + to_in_fd = pipe_fd[0]; + to_out_fd = pipe_fd[1]; + + if (pipe (pipe_fd) != 0) + error (EXIT_FAILURE, errno, "pipe"); + from_in_fd = pipe_fd[0]; + from_out_fd = pipe_fd[1]; + + pid = vfork (); + if (pid < 0) + error (EXIT_FAILURE, errno, "fork"); + + if (! pid) + { + /* Child. */ + close (to_out_fd); + close (from_in_fd); + + if (to_in_fd != STDIN_FILENO) + { + dup2 (to_in_fd, STDIN_FILENO); + close (to_in_fd); + } + if (from_out_fd != STDOUT_FILENO) + { + dup2 (from_out_fd, STDOUT_FILENO); + close (from_out_fd); + } + + /* The cast to (char **) rather than (char * const *) is needed + for portability to older hosts with a nonstandard prototype + for execvp. */ + execvp (argv[0], (char **) argv); + + _exit (errno == ENOENT ? 127 : 126); + } + + /* Parent. */ + close (to_in_fd); + close (from_out_fd); + fd[0] = to_out_fd; + fd[1] = from_in_fd; + return pid; +} + + +/* Wait for the subprocess to exit. */ + +void +reap_subpipe (pid_t pid, char const *program) +{ +#if HAVE_WAITPID || defined waitpid + int wstatus; + if (waitpid (pid, &wstatus, 0) < 0) + error (EXIT_FAILURE, errno, "waitpid"); + else + { + int status = WIFEXITED (wstatus) ? WEXITSTATUS (wstatus) : -1; + if (status) + error (EXIT_FAILURE, 0, + _(status == 126 + ? "subsidiary program `%s' could not be invoked" + : status == 127 + ? "subsidiary program `%s' not found" + : status < 0 + ? "subsidiary program `%s' failed" + : "subsidiary program `%s' failed (exit status %d)"), + program, status); + } +#endif +} diff --git a/src/apps/bin/bison/lib/subpipe.h b/src/apps/bin/bison/lib/subpipe.h new file mode 100644 index 0000000000..8e1eb8b46c --- /dev/null +++ b/src/apps/bin/bison/lib/subpipe.h @@ -0,0 +1,30 @@ +/* Subprocesses with pipes. + Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to the Free + Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + +/* Written by Paul Eggert + and Florian Krohm . */ + +#if HAVE_SYS_TYPES_H +# include +#endif + +void init_subpipe (void); +pid_t create_subpipe (char const * const *, int[2]); +void reap_subpipe (pid_t, char const *); diff --git a/src/apps/bin/bison/lib/timevar.c b/src/apps/bin/bison/lib/timevar.c new file mode 100644 index 0000000000..625decbb5c --- /dev/null +++ b/src/apps/bin/bison/lib/timevar.c @@ -0,0 +1,565 @@ +/* Timing variables for measuring compiler performance. + Copyright (C) 2000, 2002, 2004 Free Software Foundation, Inc. + Contributed by Alex Samuel + +This file is part of Bison, the GNU Compiler Compiler. + +Bison is free software; you can redistribute it and/or modify it under +the terms of the GNU General Public License as published by the Free +Software Foundation; either version 2, or (at your option) any later +version. + +Bison is distributed in the hope that it will be useful, but WITHOUT ANY +WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with Bison; see the file COPYING. If not, write to the Free +Software Foundation, 59 Temple Place - Suite 330, Boston, MA +02111-1307, USA. */ + +#if IN_GCC + +#include "config.h" +#include "system.h" +#include "intl.h" +#include "rtl.h" + +#else + +/* This source file is taken from the GCC source code, with slight + modifications that are under control of the IN_GCC preprocessor + variable. The !IN_GCC part of this file is specific to Bison. */ + +# include "../src/system.h" +# if HAVE_SYS_TIME_H +# include +# endif +int timevar_report = 0; + +#endif + + +#ifdef HAVE_SYS_TIMES_H +# include +#endif +#ifdef HAVE_SYS_RESOURCE_H +#include +#endif + +#ifndef HAVE_CLOCK_T +typedef int clock_t; +#endif + +#ifndef HAVE_STRUCT_TMS +struct tms +{ + clock_t tms_utime; + clock_t tms_stime; + clock_t tms_cutime; + clock_t tms_cstime; +}; +#endif + +#if defined HAVE_DECL_GETRUSAGE && !HAVE_DECL_GETRUSAGE +extern int getrusage (int, struct rusage *); +#endif +#if defined HAVE_DECL_TIMES && !HAVE_DECL_TIMES +extern clock_t times (struct tms *); +#endif +#if defined HAVE_DECL_CLOCK && !HAVE_DECL_CLOCK +extern clock_t clock (void); +#endif + +#ifndef RUSAGE_SELF +# define RUSAGE_SELF 0 +#endif + +/* Calculation of scale factor to convert ticks to microseconds. + We mustn't use CLOCKS_PER_SEC except with clock(). */ +#if HAVE_SYSCONF && defined _SC_CLK_TCK +# define TICKS_PER_SECOND sysconf (_SC_CLK_TCK) /* POSIX 1003.1-1996 */ +#else +# ifdef CLK_TCK +# define TICKS_PER_SECOND CLK_TCK /* POSIX 1003.1-1988; obsolescent */ +# else +# ifdef HZ +# define TICKS_PER_SECOND HZ /* traditional UNIX */ +# else +# define TICKS_PER_SECOND 100 /* often the correct value */ +# endif +# endif +#endif + +/* Prefer times to getrusage to clock (each gives successively less + information). */ +#ifdef HAVE_TIMES +# define USE_TIMES +# define HAVE_USER_TIME +# define HAVE_SYS_TIME +# define HAVE_WALL_TIME +#else +#ifdef HAVE_GETRUSAGE +# define USE_GETRUSAGE +# define HAVE_USER_TIME +# define HAVE_SYS_TIME +#else +#ifdef HAVE_CLOCK +# define USE_CLOCK +# define HAVE_USER_TIME +#endif +#endif +#endif + +/* libc is very likely to have snuck a call to sysconf() into one of + the underlying constants, and that can be very slow, so we have to + precompute them. Whose wonderful idea was it to make all those + _constants_ variable at run time, anyway? */ +#ifdef USE_TIMES +static float ticks_to_msec; +#define TICKS_TO_MSEC (1.0 / TICKS_PER_SECOND) +#endif + +#ifdef USE_CLOCK +static float clocks_to_msec; +#define CLOCKS_TO_MSEC (1.0 / CLOCKS_PER_SEC) +#endif + +#if IN_GCC +#include "flags.h" +#endif +#include "timevar.h" + +/* See timevar.h for an explanation of timing variables. */ + +/* This macro evaluates to nonzero if timing variables are enabled. */ +#define TIMEVAR_ENABLE (timevar_report) + +/* A timing variable. */ + +struct timevar_def +{ + /* Elapsed time for this variable. */ + struct timevar_time_def elapsed; + + /* If this variable is timed independently of the timing stack, + using timevar_start, this contains the start time. */ + struct timevar_time_def start_time; + + /* The name of this timing variable. */ + const char *name; + + /* Non-zero if this timing variable is running as a standalone + timer. */ + unsigned standalone : 1; + + /* Non-zero if this timing variable was ever started or pushed onto + the timing stack. */ + unsigned used : 1; +}; + +/* An element on the timing stack. Elapsed time is attributed to the + topmost timing variable on the stack. */ + +struct timevar_stack_def +{ + /* The timing variable at this stack level. */ + struct timevar_def *timevar; + + /* The next lower timing variable context in the stack. */ + struct timevar_stack_def *next; +}; + +/* Declared timing variables. Constructed from the contents of + timevar.def. */ +static struct timevar_def timevars[TIMEVAR_LAST]; + +/* The top of the timing stack. */ +static struct timevar_stack_def *stack; + +/* A list of unused (i.e. allocated and subsequently popped) + timevar_stack_def instances. */ +static struct timevar_stack_def *unused_stack_instances; + +/* The time at which the topmost element on the timing stack was + pushed. Time elapsed since then is attributed to the topmost + element. */ +static struct timevar_time_def start_time; + +static void get_time (struct timevar_time_def *); +static void timevar_accumulate (struct timevar_time_def *, + struct timevar_time_def *, + struct timevar_time_def *); + +/* Fill the current times into TIME. The definition of this function + also defines any or all of the HAVE_USER_TIME, HAVE_SYS_TIME, and + HAVE_WALL_TIME macros. */ + +static void +get_time (now) + struct timevar_time_def *now; +{ + now->user = 0; + now->sys = 0; + now->wall = 0; + + if (!TIMEVAR_ENABLE) + return; + + { +#ifdef USE_TIMES + struct tms tms; + now->wall = times (&tms) * ticks_to_msec; +#if IN_GCC + now->user = tms.tms_utime * ticks_to_msec; + now->sys = tms.tms_stime * ticks_to_msec; +#else + now->user = (tms.tms_utime + tms.tms_cutime) * ticks_to_msec; + now->sys = (tms.tms_stime + tms.tms_cstime) * ticks_to_msec; +#endif +#endif +#ifdef USE_GETRUSAGE + struct rusage rusage; +#if IN_GCC + getrusage (RUSAGE_SELF, &rusage); +#else + getrusage (RUSAGE_CHILDREN, &rusage); +#endif + now->user = rusage.ru_utime.tv_sec + rusage.ru_utime.tv_usec * 1e-6; + now->sys = rusage.ru_stime.tv_sec + rusage.ru_stime.tv_usec * 1e-6; +#endif +#ifdef USE_CLOCK + now->user = clock () * clocks_to_msec; +#endif + } +} + +/* Add the difference between STOP and START to TIMER. */ + +static void +timevar_accumulate (timer, start, stop) + struct timevar_time_def *timer; + struct timevar_time_def *start; + struct timevar_time_def *stop; +{ + timer->user += stop->user - start->user; + timer->sys += stop->sys - start->sys; + timer->wall += stop->wall - start->wall; +} + +/* Initialize timing variables. */ + +void +init_timevar () +{ + if (!TIMEVAR_ENABLE) + return; + + /* Zero all elapsed times. */ + memset ((void *) timevars, 0, sizeof (timevars)); + + /* Initialize the names of timing variables. */ +#define DEFTIMEVAR(identifier__, name__) \ + timevars[identifier__].name = name__; +#include "timevar.def" +#undef DEFTIMEVAR + +#ifdef USE_TIMES + ticks_to_msec = TICKS_TO_MSEC; +#endif +#ifdef USE_CLOCK + clocks_to_msec = CLOCKS_TO_MSEC; +#endif +} + +/* Push TIMEVAR onto the timing stack. No further elapsed time is + attributed to the previous topmost timing variable on the stack; + subsequent elapsed time is attributed to TIMEVAR, until it is + popped or another element is pushed on top. + + TIMEVAR cannot be running as a standalone timer. */ + +void +timevar_push (timevar) + timevar_id_t timevar; +{ + struct timevar_def *tv = &timevars[timevar]; + struct timevar_stack_def *context; + struct timevar_time_def now; + + if (!TIMEVAR_ENABLE) + return; + + /* Mark this timing variable as used. */ + tv->used = 1; + + /* Can't push a standalone timer. */ + if (tv->standalone) + abort (); + + /* What time is it? */ + get_time (&now); + + /* If the stack isn't empty, attribute the current elapsed time to + the old topmost element. */ + if (stack) + timevar_accumulate (&stack->timevar->elapsed, &start_time, &now); + + /* Reset the start time; from now on, time is attributed to + TIMEVAR. */ + start_time = now; + + /* See if we have a previously-allocated stack instance. If so, + take it off the list. If not, malloc a new one. */ + if (unused_stack_instances != NULL) + { + context = unused_stack_instances; + unused_stack_instances = unused_stack_instances->next; + } + else + context = (struct timevar_stack_def *) + xmalloc (sizeof (struct timevar_stack_def)); + + /* Fill it in and put it on the stack. */ + context->timevar = tv; + context->next = stack; + stack = context; +} + +/* Pop the topmost timing variable element off the timing stack. The + popped variable must be TIMEVAR. Elapsed time since the that + element was pushed on, or since it was last exposed on top of the + stack when the element above it was popped off, is credited to that + timing variable. */ + +void +timevar_pop (timevar) + timevar_id_t timevar; +{ + struct timevar_time_def now; + struct timevar_stack_def *popped = stack; + + if (!TIMEVAR_ENABLE) + return; + + if (&timevars[timevar] != stack->timevar) + abort (); + + /* What time is it? */ + get_time (&now); + + /* Attribute the elapsed time to the element we're popping. */ + timevar_accumulate (&popped->timevar->elapsed, &start_time, &now); + + /* Reset the start time; from now on, time is attributed to the + element just exposed on the stack. */ + start_time = now; + + /* Take the item off the stack. */ + stack = stack->next; + + /* Don't delete the stack element; instead, add it to the list of + unused elements for later use. */ + popped->next = unused_stack_instances; + unused_stack_instances = popped; +} + +/* Start timing TIMEVAR independently of the timing stack. Elapsed + time until timevar_stop is called for the same timing variable is + attributed to TIMEVAR. */ + +void +timevar_start (timevar) + timevar_id_t timevar; +{ + struct timevar_def *tv = &timevars[timevar]; + + if (!TIMEVAR_ENABLE) + return; + + /* Mark this timing variable as used. */ + tv->used = 1; + + /* Don't allow the same timing variable to be started more than + once. */ + if (tv->standalone) + abort (); + tv->standalone = 1; + + get_time (&tv->start_time); +} + +/* Stop timing TIMEVAR. Time elapsed since timevar_start was called + is attributed to it. */ + +void +timevar_stop (timevar) + timevar_id_t timevar; +{ + struct timevar_def *tv = &timevars[timevar]; + struct timevar_time_def now; + + if (!TIMEVAR_ENABLE) + return; + + /* TIMEVAR must have been started via timevar_start. */ + if (!tv->standalone) + abort (); + + get_time (&now); + timevar_accumulate (&tv->elapsed, &tv->start_time, &now); +} + +/* Fill the elapsed time for TIMEVAR into ELAPSED. Returns + update-to-date information even if TIMEVAR is currently running. */ + +void +timevar_get (timevar, elapsed) + timevar_id_t timevar; + struct timevar_time_def *elapsed; +{ + struct timevar_def *tv = &timevars[timevar]; + struct timevar_time_def now; + + *elapsed = tv->elapsed; + + /* Is TIMEVAR currently running as a standalone timer? */ + if (tv->standalone) + { + get_time (&now); + timevar_accumulate (elapsed, &tv->start_time, &now); + } + /* Or is TIMEVAR at the top of the timer stack? */ + else if (stack->timevar == tv) + { + get_time (&now); + timevar_accumulate (elapsed, &start_time, &now); + } +} + +/* Summarize timing variables to FP. The timing variable TV_TOTAL has + a special meaning -- it's considered to be the total elapsed time, + for normalizing the others, and is displayed last. */ + +void +timevar_print (fp) + FILE *fp; +{ + /* Only print stuff if we have some sort of time information. */ +#if defined (HAVE_USER_TIME) || defined (HAVE_SYS_TIME) || defined (HAVE_WALL_TIME) + unsigned int /* timevar_id_t */ id; + struct timevar_time_def *total = &timevars[TV_TOTAL].elapsed; + struct timevar_time_def now; + + if (!TIMEVAR_ENABLE) + return; + + /* Update timing information in case we're calling this from GDB. */ + + if (fp == 0) + fp = stderr; + + /* What time is it? */ + get_time (&now); + + /* If the stack isn't empty, attribute the current elapsed time to + the old topmost element. */ + if (stack) + timevar_accumulate (&stack->timevar->elapsed, &start_time, &now); + + /* Reset the start time; from now on, time is attributed to + TIMEVAR. */ + start_time = now; + + fputs (_("\nExecution times (seconds)\n"), fp); + for (id = 0; id < (unsigned int) TIMEVAR_LAST; ++id) + { + struct timevar_def *tv = &timevars[(timevar_id_t) id]; + const float tiny = 5e-3; + + /* Don't print the total execution time here; that goes at the + end. */ + if ((timevar_id_t) id == TV_TOTAL) + continue; + + /* Don't print timing variables that were never used. */ + if (!tv->used) + continue; + + /* Don't print timing variables if we're going to get a row of + zeroes. */ + if (tv->elapsed.user < tiny + && tv->elapsed.sys < tiny + && tv->elapsed.wall < tiny) + continue; + + /* The timing variable name. */ + fprintf (fp, " %-22s:", tv->name); + +#ifdef HAVE_USER_TIME + /* Print user-mode time for this process. */ + fprintf (fp, "%7.2f (%2.0f%%) usr", + tv->elapsed.user, + (total->user == 0 ? 0 : tv->elapsed.user / total->user) * 100); +#endif /* HAVE_USER_TIME */ + +#ifdef HAVE_SYS_TIME + /* Print system-mode time for this process. */ + fprintf (fp, "%7.2f (%2.0f%%) sys", + tv->elapsed.sys, + (total->sys == 0 ? 0 : tv->elapsed.sys / total->sys) * 100); +#endif /* HAVE_SYS_TIME */ + +#ifdef HAVE_WALL_TIME + /* Print wall clock time elapsed. */ + fprintf (fp, "%7.2f (%2.0f%%) wall", + tv->elapsed.wall, + (total->wall == 0 ? 0 : tv->elapsed.wall / total->wall) * 100); +#endif /* HAVE_WALL_TIME */ + + putc ('\n', fp); + } + + /* Print total time. */ + fputs (_(" TOTAL :"), fp); +#ifdef HAVE_USER_TIME + fprintf (fp, "%7.2f ", total->user); +#endif +#ifdef HAVE_SYS_TIME + fprintf (fp, "%7.2f ", total->sys); +#endif +#ifdef HAVE_WALL_TIME + fprintf (fp, "%7.2f\n", total->wall); +#endif + +#endif /* defined (HAVE_USER_TIME) || defined (HAVE_SYS_TIME) + || defined (HAVE_WALL_TIME) */ +} + +/* Returns time (user + system) used so far by the compiler process, + in microseconds. */ + +long +get_run_time () +{ + struct timevar_time_def total_elapsed; + timevar_get (TV_TOTAL, &total_elapsed); + return total_elapsed.user + total_elapsed.sys; +} + +/* Prints a message to stderr stating that time elapsed in STR is + TOTAL (given in microseconds). */ + +void +print_time (str, total) + const char *str; + long total; +{ + long all_time = get_run_time (); + fprintf (stderr, + _("time in %s: %ld.%06ld (%ld%%)\n"), + str, total / 1000000, total % 1000000, + all_time == 0 ? 0 + : (long) (((100.0 * (double) total) / (double) all_time) + .5)); +} diff --git a/src/apps/bin/bison/lib/timevar.def b/src/apps/bin/bison/lib/timevar.def new file mode 100644 index 0000000000..e02d013bd8 --- /dev/null +++ b/src/apps/bin/bison/lib/timevar.def @@ -0,0 +1,56 @@ +/* This file contains the definitions for timing variables used to -*- C -*- + measure run-time performance of the compiler. + Copyright (C) 2002 Free Software Foundation, Inc. + Contributed by Akim Demaille . + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* This file contains timing variable definitions, used by timevar.h + and timevar.c. + + Syntax: + + DEFTIMEVAR (id, name) + + where ID is the enumeral value used to identify the timing + variable, and NAME is a character string describing its purpose. */ + +/* The total execution time. */ +DEFTIMEVAR (TV_TOTAL , "total time") + +/* Time spent in the reader. */ +DEFTIMEVAR (TV_READER , "reader") +DEFTIMEVAR (TV_SCANNING , "scanner") +DEFTIMEVAR (TV_PARSING , "parser") + +/* Time spent handling the grammar. */ +DEFTIMEVAR (TV_REDUCE , "reducing the grammar") +DEFTIMEVAR (TV_SETS , "computing the sets") +DEFTIMEVAR (TV_LR0 , "LR(0)") +DEFTIMEVAR (TV_LALR , "LALR(1)") +DEFTIMEVAR (TV_CONFLICTS , "conflicts") + +/* Time spent outputing results. */ +DEFTIMEVAR (TV_REPORT , "outputing report") +DEFTIMEVAR (TV_GRAPH , "outputing graph") +DEFTIMEVAR (TV_ACTIONS , "parser action tables") +DEFTIMEVAR (TV_PARSER , "outputing parser") +DEFTIMEVAR (TV_M4 , "running m4") + +/* Time spent by freeing the memory :). */ +DEFTIMEVAR (TV_FREE , "freeing") diff --git a/src/apps/bin/bison/lib/timevar.h b/src/apps/bin/bison/lib/timevar.h new file mode 100644 index 0000000000..27dab57096 --- /dev/null +++ b/src/apps/bin/bison/lib/timevar.h @@ -0,0 +1,93 @@ +/* Timing variables for measuring compiler performance. + Copyright (C) 2000, 2002, 2004 Free Software Foundation, Inc. + Contributed by Alex Samuel + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, but WITHOUT + ANY WARRANTY; without even the implied warranty of MERCHANTABILITY + or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public + License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to the Free + Software Foundation, 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + +#ifndef GCC_TIMEVAR_H +#define GCC_TIMEVAR_H + +/* Timing variables are used to measure elapsed time in various + portions of the compiler. Each measures elapsed user, system, and + wall-clock time, as appropriate to and supported by the host + system. + + Timing variables are defined using the DEFTIMEVAR macro in + timevar.def. Each has an enumeral identifier, used when referring + to the timing variable in code, and a character string name. + + Timing variables can be used in two ways: + + - On the timing stack, using timevar_push and timevar_pop. + Timing variables may be pushed onto the stack; elapsed time is + attributed to the topmost timing variable on the stack. When + another variable is pushed on, the previous topmost variable is + `paused' until the pushed variable is popped back off. + + - As a standalone timer, using timevar_start and timevar_stop. + All time elapsed between the two calls is attributed to the + variable. +*/ + +/* This structure stores the various varieties of time that can be + measured. Times are stored in seconds. The time may be an + absolute time or a time difference; in the former case, the time + base is undefined, except that the difference between two times + produces a valid time difference. */ + +struct timevar_time_def +{ + /* User time in this process. */ + float user; + + /* System time (if applicable for this host platform) in this + process. */ + float sys; + + /* Wall clock time. */ + float wall; +}; + +/* An enumeration of timing variable identifiers. Constructed from + the contents of timevar.def. */ + +#define DEFTIMEVAR(identifier__, name__) \ + identifier__, +typedef enum +{ +#include "timevar.def" + TIMEVAR_LAST +} +timevar_id_t; +#undef DEFTIMEVAR + +extern void init_timevar (void); +extern void timevar_push (timevar_id_t); +extern void timevar_pop (timevar_id_t); +extern void timevar_start (timevar_id_t); +extern void timevar_stop (timevar_id_t); +extern void timevar_get (timevar_id_t, struct timevar_time_def *); +extern void timevar_print (FILE *); + +/* Provided for backward compatibility. */ +extern long get_run_time (void); +extern void print_time (const char *, long); + +extern int timevar_report; + +#endif /* ! GCC_TIMEVAR_H */ diff --git a/src/apps/bin/bison/lib/unlocked-io.h b/src/apps/bin/bison/lib/unlocked-io.h new file mode 100644 index 0000000000..36a7a4885d --- /dev/null +++ b/src/apps/bin/bison/lib/unlocked-io.h @@ -0,0 +1,132 @@ +/* Prefer faster, non-thread-safe stdio functions if available. + + Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +/* Written by Jim Meyering. */ + +#ifndef UNLOCKED_IO_H +# define UNLOCKED_IO_H 1 + +# ifndef USE_UNLOCKED_IO +# define USE_UNLOCKED_IO 1 +# endif + +# if USE_UNLOCKED_IO + +/* These are wrappers for functions/macros from the GNU C library, and + from other C libraries supporting POSIX's optional thread-safe functions. + + The standard I/O functions are thread-safe. These *_unlocked ones are + more efficient but not thread-safe. That they're not thread-safe is + fine since all of the applications in this package are single threaded. + + Also, some code that is shared with the GNU C library may invoke + the *_unlocked functions directly. On hosts that lack those + functions, invoke the non-thread-safe versions instead. */ + +# include + +# if HAVE_DECL_CLEARERR_UNLOCKED +# undef clearerr +# define clearerr(x) clearerr_unlocked (x) +# else +# define clearerr_unlocked(x) clearerr (x) +# endif +# if HAVE_DECL_FEOF_UNLOCKED +# undef feof +# define feof(x) feof_unlocked (x) +# else +# define feof_unlocked(x) feof (x) +# endif +# if HAVE_DECL_FERROR_UNLOCKED +# undef ferror +# define ferror(x) ferror_unlocked (x) +# else +# define ferror_unlocked(x) ferror (x) +# endif +# if HAVE_DECL_FFLUSH_UNLOCKED +# undef fflush +# define fflush(x) fflush_unlocked (x) +# else +# define fflush_unlocked(x) fflush (x) +# endif +# if HAVE_DECL_FGETS_UNLOCKED +# undef fgets +# define fgets(x,y,z) fgets_unlocked (x,y,z) +# else +# define fgets_unlocked(x,y,z) fgets (x,y,z) +# endif +# if HAVE_DECL_FPUTC_UNLOCKED +# undef fputc +# define fputc(x,y) fputc_unlocked (x,y) +# else +# define fputc_unlocked(x,y) fputc (x,y) +# endif +# if HAVE_DECL_FPUTS_UNLOCKED +# undef fputs +# define fputs(x,y) fputs_unlocked (x,y) +# else +# define fputs_unlocked(x,y) fputs (x,y) +# endif +# if HAVE_DECL_FREAD_UNLOCKED +# undef fread +# define fread(w,x,y,z) fread_unlocked (w,x,y,z) +# else +# define fread_unlocked(w,x,y,z) fread (w,x,y,z) +# endif +# if HAVE_DECL_FWRITE_UNLOCKED +# undef fwrite +# define fwrite(w,x,y,z) fwrite_unlocked (w,x,y,z) +# else +# define fwrite_unlocked(w,x,y,z) fwrite (w,x,y,z) +# endif +# if HAVE_DECL_GETC_UNLOCKED +# undef getc +# define getc(x) getc_unlocked (x) +# else +# define getc_unlocked(x) getc (x) +# endif +# if HAVE_DECL_GETCHAR_UNLOCKED +# undef getchar +# define getchar() getchar_unlocked () +# else +# define getchar_unlocked() getchar () +# endif +# if HAVE_DECL_PUTC_UNLOCKED +# undef putc +# define putc(x,y) putc_unlocked (x,y) +# else +# define putc_unlocked(x,y) putc (x,y) +# endif +# if HAVE_DECL_PUTCHAR_UNLOCKED +# undef putchar +# define putchar(x) putchar_unlocked (x) +# else +# define putchar_unlocked(x) putchar (x) +# endif + +# undef flockfile +# define flockfile(x) ((void) 0) + +# undef ftrylockfile +# define ftrylockfile(x) 0 + +# undef funlockfile +# define funlockfile(x) ((void) 0) + +# endif /* USE_UNLOCKED_IO */ +#endif /* UNLOCKED_IO_H */ diff --git a/src/apps/bin/bison/lib/vbitset.c b/src/apps/bin/bison/lib/vbitset.c new file mode 100644 index 0000000000..c055fbfe13 --- /dev/null +++ b/src/apps/bin/bison/lib/vbitset.c @@ -0,0 +1,1140 @@ +/* Variable array bitsets. + Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. +*/ + +#ifdef HAVE_CONFIG_H +#include "config.h" +#endif + +#include "vbitset.h" +#include +#include + +/* This file implements variable size bitsets stored as a variable + length array of words. Any unused bits in the last word must be + zero. + + Note that binary or ternary operations assume that each bitset operand + has the same size. +*/ + +static void vbitset_unused_clear (bitset); + +static void vbitset_set (bitset, bitset_bindex); +static void vbitset_reset (bitset, bitset_bindex); +static bool vbitset_test (bitset, bitset_bindex); +static bitset_bindex vbitset_list (bitset, bitset_bindex *, + bitset_bindex, bitset_bindex *); +static bitset_bindex vbitset_list_reverse (bitset, bitset_bindex *, + bitset_bindex, bitset_bindex *); + +#define VBITSET_N_WORDS(N) (((N) + BITSET_WORD_BITS - 1) / BITSET_WORD_BITS) +#define VBITSET_WORDS(X) ((X)->b.cdata) +#define VBITSET_SIZE(X) ((X)->b.csize) +#define VBITSET_ASIZE(X) ((X)->v.size) + + +#define min(a, b) ((a) > (b) ? (b) : (a)) +#define max(a, b) ((a) > (b) ? (a) : (b)) + +static bitset_bindex +vbitset_resize (bitset src, bitset_bindex n_bits) +{ + bitset_windex oldsize; + bitset_windex newsize; + + if (n_bits == BITSET_NBITS_ (src)) + return n_bits; + + oldsize = VBITSET_SIZE (src); + newsize = VBITSET_N_WORDS (n_bits); + + if (oldsize < newsize) + { + bitset_windex size; + + /* The bitset needs to grow. If we already have enough memory + allocated, then just zero what we need. */ + if (newsize > VBITSET_ASIZE (src)) + { + /* We need to allocate more memory. When oldsize is + non-zero this means that we are changing the size, so + grow the bitset 25% larger than requested to reduce + number of reallocations. */ + + if (oldsize == 0) + size = newsize; + else + size = newsize + newsize / 4; + + VBITSET_WORDS (src) + = realloc (VBITSET_WORDS (src), size * sizeof (bitset_word)); + VBITSET_ASIZE (src) = size; + } + + memset (VBITSET_WORDS (src) + oldsize, 0, + (newsize - oldsize) * sizeof (bitset_word)); + VBITSET_SIZE (src) = newsize; + } + else + { + /* The bitset needs to shrink. There's no point deallocating + the memory unless it is shrinking by a reasonable amount. */ + if ((oldsize - newsize) >= oldsize / 2) + { + VBITSET_WORDS (src) + = realloc (VBITSET_WORDS (src), newsize * sizeof (bitset_word)); + VBITSET_ASIZE (src) = newsize; + } + + /* Need to prune any excess bits. FIXME. */ + + VBITSET_SIZE (src) = newsize; + } + + BITSET_NBITS_ (src) = n_bits; + return n_bits; +} + + +/* Set bit BITNO in bitset DST. */ +static void +vbitset_set (dst, bitno) + bitset dst; + bitset_bindex bitno; +{ + bitset_windex windex = bitno / BITSET_WORD_BITS; + + /* Perhaps we should abort. The user should explicitly call + bitset_resize since this will not catch the case when we set a + bit larger than the current size but smaller than the allocated + size. */ + vbitset_resize (dst, bitno); + + dst->b.cdata[windex - dst->b.cindex] |= + (bitset_word) 1 << (bitno % BITSET_WORD_BITS); +} + + +/* Reset bit BITNO in bitset DST. */ +static void +vbitset_reset (dst, bitno) + bitset dst ATTRIBUTE_UNUSED; + bitset_bindex bitno ATTRIBUTE_UNUSED; +{ + /* We must be accessing outside the cache so the bit is + zero anyway. */ +} + + +/* Test bit BITNO in bitset SRC. */ +static bool +vbitset_test (src, bitno) + bitset src ATTRIBUTE_UNUSED; + bitset_bindex bitno ATTRIBUTE_UNUSED; +{ + /* We must be accessing outside the cache so the bit is + zero anyway. */ + return 0; +} + + +/* Find list of up to NUM bits set in BSET in reverse order, starting + from and including NEXT and store in array LIST. Return with + actual number of bits found and with *NEXT indicating where search + stopped. */ +static bitset_bindex +vbitset_list_reverse (src, list, num, next) + bitset src; + bitset_bindex *list; + bitset_bindex num; + bitset_bindex *next; +{ + bitset_bindex bitno; + bitset_bindex rbitno; + bitset_bindex count; + bitset_windex windex; + unsigned int bitcnt; + bitset_bindex bitoff; + bitset_word *srcp = VBITSET_WORDS (src); + bitset_bindex n_bits = BITSET_SIZE_ (src); + + rbitno = *next; + + /* If num is 1, we could speed things up with a binary search + of the word of interest. */ + + if (rbitno >= n_bits) + return 0; + + count = 0; + + bitno = n_bits - (rbitno + 1); + + windex = bitno / BITSET_WORD_BITS; + bitcnt = bitno % BITSET_WORD_BITS; + bitoff = windex * BITSET_WORD_BITS; + + do + { + bitset_word word; + + word = srcp[windex] << (BITSET_WORD_BITS - 1 - bitcnt); + for (; word; bitcnt--) + { + if (word & BITSET_MSB) + { + list[count++] = bitoff + bitcnt; + if (count >= num) + { + *next = n_bits - (bitoff + bitcnt); + return count; + } + } + word <<= 1; + } + bitoff -= BITSET_WORD_BITS; + bitcnt = BITSET_WORD_BITS - 1; + } + while (windex--); + + *next = n_bits - (bitoff + 1); + return count; +} + + +/* Find list of up to NUM bits set in BSET starting from and including + *NEXT and store in array LIST. Return with actual number of bits + found and with *NEXT indicating where search stopped. */ +static bitset_bindex +vbitset_list (src, list, num, next) + bitset src; + bitset_bindex *list; + bitset_bindex num; + bitset_bindex *next; +{ + bitset_bindex bitno; + bitset_bindex count; + bitset_windex windex; + bitset_bindex bitoff; + bitset_windex size = VBITSET_SIZE (src); + bitset_word *srcp = VBITSET_WORDS (src); + bitset_word word; + + bitno = *next; + + count = 0; + if (!bitno) + { + /* Many bitsets are zero, so make this common case fast. */ + for (windex = 0; windex < size && !srcp[windex]; windex++) + continue; + if (windex >= size) + return 0; + + /* If num is 1, we could speed things up with a binary search + of the current word. */ + + bitoff = windex * BITSET_WORD_BITS; + } + else + { + if (bitno >= BITSET_SIZE_ (src)) + return 0; + + windex = bitno / BITSET_WORD_BITS; + bitno = bitno % BITSET_WORD_BITS; + + if (bitno) + { + /* Handle the case where we start within a word. + Most often, this is executed with large bitsets + with many set bits where we filled the array + on the previous call to this function. */ + + bitoff = windex * BITSET_WORD_BITS; + word = srcp[windex] >> bitno; + for (bitno = bitoff + bitno; word; bitno++) + { + if (word & 1) + { + list[count++] = bitno; + if (count >= num) + { + *next = bitno + 1; + return count; + } + } + word >>= 1; + } + windex++; + } + bitoff = windex * BITSET_WORD_BITS; + } + + for (; windex < size; windex++, bitoff += BITSET_WORD_BITS) + { + if (!(word = srcp[windex])) + continue; + + if ((count + BITSET_WORD_BITS) < num) + { + for (bitno = bitoff; word; bitno++) + { + if (word & 1) + list[count++] = bitno; + word >>= 1; + } + } + else + { + for (bitno = bitoff; word; bitno++) + { + if (word & 1) + { + list[count++] = bitno; + if (count >= num) + { + *next = bitno + 1; + return count; + } + } + word >>= 1; + } + } + } + + *next = bitoff; + return count; +} + + +/* Ensure that any unused bits within the last word are clear. */ +static inline void +vbitset_unused_clear (dst) + bitset dst; +{ + unsigned int last_bit; + + last_bit = BITSET_SIZE_ (dst) % BITSET_WORD_BITS; + if (last_bit) + VBITSET_WORDS (dst)[VBITSET_SIZE (dst) - 1] &= + ((bitset_word) 1 << last_bit) - 1; +} + + +static void +vbitset_ones (bitset dst) +{ + bitset_word *dstp = VBITSET_WORDS (dst); + unsigned int bytes; + + bytes = sizeof (bitset_word) * VBITSET_SIZE (dst); + + memset (dstp, -1, bytes); + vbitset_unused_clear (dst); +} + + +static void +vbitset_zero (bitset dst) +{ + bitset_word *dstp = VBITSET_WORDS (dst); + unsigned int bytes; + + bytes = sizeof (bitset_word) * VBITSET_SIZE (dst); + + memset (dstp, 0, bytes); +} + + +static bool +vbitset_empty_p (bitset dst) +{ + unsigned int i; + bitset_word *dstp = VBITSET_WORDS (dst); + + for (i = 0; i < VBITSET_SIZE (dst); i++) + if (dstp[i]) + return 0; + + return 1; +} + + +static void +vbitset_copy1 (bitset dst, bitset src) +{ + bitset_word *srcp; + bitset_word *dstp; + bitset_windex ssize; + bitset_windex dsize; + + if (src == dst) + return; + + vbitset_resize (dst, BITSET_SIZE_ (src)); + + srcp = VBITSET_WORDS (src); + dstp = VBITSET_WORDS (dst); + ssize = VBITSET_SIZE (src); + dsize = VBITSET_SIZE (dst); + + memcpy (dstp, srcp, sizeof (bitset_word) * ssize); + + memset (dstp + sizeof (bitset_word) * ssize, 0, + sizeof (bitset_word) * (dsize - ssize)); +} + + +static void +vbitset_not (bitset dst, bitset src) +{ + unsigned int i; + bitset_word *srcp; + bitset_word *dstp; + bitset_windex ssize; + bitset_windex dsize; + + vbitset_resize (dst, BITSET_SIZE_ (src)); + + srcp = VBITSET_WORDS (src); + dstp = VBITSET_WORDS (dst); + ssize = VBITSET_SIZE (src); + dsize = VBITSET_SIZE (dst); + + for (i = 0; i < ssize; i++) + *dstp++ = ~(*srcp++); + + vbitset_unused_clear (dst); + memset (dstp + sizeof (bitset_word) * ssize, 0, + sizeof (bitset_word) * (dsize - ssize)); +} + + +static bool +vbitset_equal_p (bitset dst, bitset src) +{ + unsigned int i; + bitset_word *srcp = VBITSET_WORDS (src); + bitset_word *dstp = VBITSET_WORDS (dst); + bitset_windex ssize = VBITSET_SIZE (src); + bitset_windex dsize = VBITSET_SIZE (dst); + + for (i = 0; i < min (ssize, dsize); i++) + if (*srcp++ != *dstp++) + return 0; + + if (ssize > dsize) + { + for (; i < ssize; i++) + if (*srcp++) + return 0; + } + else + { + for (; i < dsize; i++) + if (*dstp++) + return 0; + } + + return 1; +} + + +static bool +vbitset_subset_p (bitset dst, bitset src) +{ + unsigned int i; + bitset_word *srcp = VBITSET_WORDS (src); + bitset_word *dstp = VBITSET_WORDS (dst); + bitset_windex ssize = VBITSET_SIZE (src); + bitset_windex dsize = VBITSET_SIZE (dst); + + for (i = 0; i < min (ssize, dsize); i++, dstp++, srcp++) + if (*dstp != (*srcp | *dstp)) + return 0; + + if (ssize > dsize) + { + for (; i < ssize; i++) + if (*srcp++) + return 0; + } + + return 1; +} + + +static bool +vbitset_disjoint_p (bitset dst, bitset src) +{ + unsigned int i; + bitset_word *srcp = VBITSET_WORDS (src); + bitset_word *dstp = VBITSET_WORDS (dst); + bitset_windex ssize = VBITSET_SIZE (src); + bitset_windex dsize = VBITSET_SIZE (dst); + + for (i = 0; i < min (ssize, dsize); i++) + if (*srcp++ & *dstp++) + return 0; + + return 1; +} + + +static void +vbitset_and (bitset dst, bitset src1, bitset src2) +{ + unsigned int i; + bitset_word *src1p; + bitset_word *src2p; + bitset_word *dstp; + bitset_windex ssize1; + bitset_windex ssize2; + bitset_windex dsize; + + vbitset_resize (dst, max (BITSET_SIZE_ (src1), BITSET_SIZE_ (src2))); + + dsize = VBITSET_SIZE (dst); + ssize1 = VBITSET_SIZE (src1); + ssize2 = VBITSET_SIZE (src2); + dstp = VBITSET_WORDS (dst); + src1p = VBITSET_WORDS (src1); + src2p = VBITSET_WORDS (src2); + + for (i = 0; i < min (ssize1, ssize2); i++) + *dstp++ = *src1p++ & *src2p++; + + memset (dstp, 0, sizeof (bitset_word) * (dsize - min (ssize1, ssize2))); +} + + +static bool +vbitset_and_cmp (bitset dst, bitset src1, bitset src2) +{ + unsigned int i; + int changed = 0; + bitset_word *src1p; + bitset_word *src2p; + bitset_word *dstp; + bitset_windex ssize1; + bitset_windex ssize2; + bitset_windex dsize; + + vbitset_resize (dst, max (BITSET_SIZE_ (src1), BITSET_SIZE_ (src2))); + + dsize = VBITSET_SIZE (dst); + ssize1 = VBITSET_SIZE (src1); + ssize2 = VBITSET_SIZE (src2); + dstp = VBITSET_WORDS (dst); + src1p = VBITSET_WORDS (src1); + src2p = VBITSET_WORDS (src2); + + for (i = 0; i < min (ssize1, ssize2); i++, dstp++) + { + bitset_word tmp = *src1p++ & *src2p++; + + if (*dstp != tmp) + { + changed = 1; + *dstp = tmp; + } + } + + if (ssize2 > ssize1) + { + src1p = src2p; + ssize1 = ssize2; + } + + for (; i < ssize1; i++, dstp++) + { + if (*dstp != 0) + { + changed = 1; + *dstp = 0; + } + } + + memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize1)); + + return changed; +} + + +static void +vbitset_andn (bitset dst, bitset src1, bitset src2) +{ + unsigned int i; + bitset_word *src1p; + bitset_word *src2p; + bitset_word *dstp; + bitset_windex ssize1; + bitset_windex ssize2; + bitset_windex dsize; + + vbitset_resize (dst, max (BITSET_SIZE_ (src1), BITSET_SIZE_ (src2))); + + dsize = VBITSET_SIZE (dst); + ssize1 = VBITSET_SIZE (src1); + ssize2 = VBITSET_SIZE (src2); + dstp = VBITSET_WORDS (dst); + src1p = VBITSET_WORDS (src1); + src2p = VBITSET_WORDS (src2); + + for (i = 0; i < min (ssize1, ssize2); i++) + *dstp++ = *src1p++ & ~(*src2p++); + + if (ssize2 > ssize1) + { + for (; i < ssize2; i++) + *dstp++ = 0; + + memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize2)); + } + else + { + for (; i < ssize1; i++) + *dstp++ = *src1p++; + + memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize1)); + } +} + + +static bool +vbitset_andn_cmp (bitset dst, bitset src1, bitset src2) +{ + unsigned int i; + int changed = 0; + bitset_word *src1p; + bitset_word *src2p; + bitset_word *dstp; + bitset_windex ssize1; + bitset_windex ssize2; + bitset_windex dsize; + + vbitset_resize (dst, max (BITSET_SIZE_ (src1), BITSET_SIZE_ (src2))); + + dsize = VBITSET_SIZE (dst); + ssize1 = VBITSET_SIZE (src1); + ssize2 = VBITSET_SIZE (src2); + dstp = VBITSET_WORDS (dst); + src1p = VBITSET_WORDS (src1); + src2p = VBITSET_WORDS (src2); + + for (i = 0; i < min (ssize1, ssize2); i++, dstp++) + { + bitset_word tmp = *src1p++ & ~(*src2p++); + + if (*dstp != tmp) + { + changed = 1; + *dstp = tmp; + } + } + + if (ssize2 > ssize1) + { + for (; i < ssize2; i++, dstp++) + { + if (*dstp != 0) + { + changed = 1; + *dstp = 0; + } + } + + memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize2)); + } + else + { + for (; i < ssize1; i++, dstp++) + { + bitset_word tmp = *src1p++; + + if (*dstp != tmp) + { + changed = 1; + *dstp = tmp; + } + } + + memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize1)); + } + + return changed; +} + + +static void +vbitset_or (bitset dst, bitset src1, bitset src2) +{ + unsigned int i; + bitset_word *src1p; + bitset_word *src2p; + bitset_word *dstp; + bitset_windex ssize1; + bitset_windex ssize2; + bitset_windex dsize; + + vbitset_resize (dst, max (BITSET_SIZE_ (src1), BITSET_SIZE_ (src2))); + + dsize = VBITSET_SIZE (dst); + ssize1 = VBITSET_SIZE (src1); + ssize2 = VBITSET_SIZE (src2); + dstp = VBITSET_WORDS (dst); + src1p = VBITSET_WORDS (src1); + src2p = VBITSET_WORDS (src2); + + for (i = 0; i < min (ssize1, ssize2); i++) + *dstp++ = *src1p++ | *src2p++; + + if (ssize2 > ssize1) + { + src1p = src2p; + ssize1 = ssize2; + } + + for (; i < ssize1; i++) + *dstp++ = *src1p++; + + memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize1)); +} + + +static bool +vbitset_or_cmp (bitset dst, bitset src1, bitset src2) +{ + unsigned int i; + int changed = 0; + bitset_word *src1p; + bitset_word *src2p; + bitset_word *dstp; + bitset_windex ssize1; + bitset_windex ssize2; + bitset_windex dsize; + + vbitset_resize (dst, max (BITSET_SIZE_ (src1), BITSET_SIZE_ (src2))); + + dsize = VBITSET_SIZE (dst); + ssize1 = VBITSET_SIZE (src1); + ssize2 = VBITSET_SIZE (src2); + dstp = VBITSET_WORDS (dst); + src1p = VBITSET_WORDS (src1); + src2p = VBITSET_WORDS (src2); + + for (i = 0; i < min (ssize1, ssize2); i++, dstp++) + { + bitset_word tmp = *src1p++ | *src2p++; + + if (*dstp != tmp) + { + changed = 1; + *dstp = tmp; + } + } + + if (ssize2 > ssize1) + { + src1p = src2p; + ssize1 = ssize2; + } + + for (; i < ssize1; i++, dstp++) + { + bitset_word tmp = *src1p++; + + if (*dstp != tmp) + { + changed = 1; + *dstp = tmp; + } + } + + memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize1)); + + return changed; +} + + +static void +vbitset_xor (bitset dst, bitset src1, bitset src2) +{ + unsigned int i; + bitset_word *src1p; + bitset_word *src2p; + bitset_word *dstp; + bitset_windex ssize1; + bitset_windex ssize2; + bitset_windex dsize; + + vbitset_resize (dst, max (BITSET_SIZE_ (src1), BITSET_SIZE_ (src2))); + + dsize = VBITSET_SIZE (dst); + ssize1 = VBITSET_SIZE (src1); + ssize2 = VBITSET_SIZE (src2); + dstp = VBITSET_WORDS (dst); + src1p = VBITSET_WORDS (src1); + src2p = VBITSET_WORDS (src2); + + for (i = 0; i < min (ssize1, ssize2); i++) + *dstp++ = *src1p++ ^ *src2p++; + + if (ssize2 > ssize1) + { + src1p = src2p; + ssize1 = ssize2; + } + + for (; i < ssize1; i++) + *dstp++ = *src1p++; + + memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize1)); +} + + +static bool +vbitset_xor_cmp (bitset dst, bitset src1, bitset src2) +{ + unsigned int i; + int changed = 0; + bitset_word *src1p; + bitset_word *src2p; + bitset_word *dstp; + bitset_windex ssize1; + bitset_windex ssize2; + bitset_windex dsize; + + vbitset_resize (dst, max (BITSET_SIZE_ (src1), BITSET_SIZE_ (src2))); + + dsize = VBITSET_SIZE (dst); + ssize1 = VBITSET_SIZE (src1); + ssize2 = VBITSET_SIZE (src2); + dstp = VBITSET_WORDS (dst); + src1p = VBITSET_WORDS (src1); + src2p = VBITSET_WORDS (src2); + + for (i = 0; i < min (ssize1, ssize2); i++, dstp++) + { + bitset_word tmp = *src1p++ ^ *src2p++; + + if (*dstp != tmp) + { + changed = 1; + *dstp = tmp; + } + } + + if (ssize2 > ssize1) + { + src1p = src2p; + ssize1 = ssize2; + } + + for (; i < ssize1; i++, dstp++) + { + bitset_word tmp = *src1p++; + + if (*dstp != tmp) + { + changed = 1; + *dstp = tmp; + } + } + + memset (dstp, 0, sizeof (bitset_word) * (dsize - ssize1)); + + return changed; +} + + +/* FIXME, these operations need fixing for different size + bitsets. */ + +static void +vbitset_and_or (bitset dst, bitset src1, bitset src2, bitset src3) +{ + unsigned int i; + bitset_word *src1p; + bitset_word *src2p; + bitset_word *src3p; + bitset_word *dstp; + bitset_windex size; + + if (BITSET_NBITS_ (src1) != BITSET_NBITS_ (src2) + || BITSET_NBITS_ (src1) != BITSET_NBITS_ (src3)) + { + bitset_and_or_ (dst, src1, src2, src3); + return; + } + + vbitset_resize (dst, BITSET_NBITS_ (src1)); + + src1p = VBITSET_WORDS (src1); + src2p = VBITSET_WORDS (src2); + src3p = VBITSET_WORDS (src3); + dstp = VBITSET_WORDS (dst); + size = VBITSET_SIZE (dst); + + for (i = 0; i < size; i++) + *dstp++ = (*src1p++ & *src2p++) | *src3p++; +} + + +static bool +vbitset_and_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3) +{ + unsigned int i; + int changed = 0; + bitset_word *src1p; + bitset_word *src2p; + bitset_word *src3p; + bitset_word *dstp; + bitset_windex size; + + if (BITSET_NBITS_ (src1) != BITSET_NBITS_ (src2) + || BITSET_NBITS_ (src1) != BITSET_NBITS_ (src3)) + return bitset_and_or_cmp_ (dst, src1, src2, src3); + + vbitset_resize (dst, BITSET_NBITS_ (src1)); + + src1p = VBITSET_WORDS (src1); + src2p = VBITSET_WORDS (src2); + src3p = VBITSET_WORDS (src3); + dstp = VBITSET_WORDS (dst); + size = VBITSET_SIZE (dst); + + for (i = 0; i < size; i++, dstp++) + { + bitset_word tmp = (*src1p++ & *src2p++) | *src3p++; + + if (*dstp != tmp) + { + changed = 1; + *dstp = tmp; + } + } + return changed; +} + + +static void +vbitset_andn_or (bitset dst, bitset src1, bitset src2, bitset src3) +{ + unsigned int i; + bitset_word *src1p; + bitset_word *src2p; + bitset_word *src3p; + bitset_word *dstp; + bitset_windex size; + + if (BITSET_NBITS_ (src1) != BITSET_NBITS_ (src2) + || BITSET_NBITS_ (src1) != BITSET_NBITS_ (src3)) + { + bitset_andn_or_ (dst, src1, src2, src3); + return; + } + + vbitset_resize (dst, BITSET_NBITS_ (src1)); + + src1p = VBITSET_WORDS (src1); + src2p = VBITSET_WORDS (src2); + src3p = VBITSET_WORDS (src3); + dstp = VBITSET_WORDS (dst); + size = VBITSET_SIZE (dst); + + for (i = 0; i < size; i++) + *dstp++ = (*src1p++ & ~(*src2p++)) | *src3p++; +} + + +static bool +vbitset_andn_or_cmp (bitset dst, bitset src1, bitset src2, bitset src3) +{ + unsigned int i; + int changed = 0; + bitset_word *src1p; + bitset_word *src2p; + bitset_word *src3p; + bitset_word *dstp; + bitset_windex size; + + if (BITSET_NBITS_ (src1) != BITSET_NBITS_ (src2) + || BITSET_NBITS_ (src1) != BITSET_NBITS_ (src3)) + return bitset_andn_or_cmp_ (dst, src1, src2, src3); + + vbitset_resize (dst, BITSET_NBITS_ (src1)); + + src1p = VBITSET_WORDS (src1); + src2p = VBITSET_WORDS (src2); + src3p = VBITSET_WORDS (src3); + dstp = VBITSET_WORDS (dst); + size = VBITSET_SIZE (dst); + + for (i = 0; i < size; i++, dstp++) + { + bitset_word tmp = (*src1p++ & ~(*src2p++)) | *src3p++; + + if (*dstp != tmp) + { + changed = 1; + *dstp = tmp; + } + } + return changed; +} + + +static void +vbitset_or_and (bitset dst, bitset src1, bitset src2, bitset src3) +{ + unsigned int i; + bitset_word *src1p; + bitset_word *src2p; + bitset_word *src3p; + bitset_word *dstp; + bitset_windex size; + + if (BITSET_NBITS_ (src1) != BITSET_NBITS_ (src2) + || BITSET_NBITS_ (src1) != BITSET_NBITS_ (src3)) + { + bitset_or_and_ (dst, src1, src2, src3); + return; + } + + vbitset_resize (dst, BITSET_NBITS_ (src1)); + + src1p = VBITSET_WORDS (src1); + src2p = VBITSET_WORDS (src2); + src3p = VBITSET_WORDS (src3); + dstp = VBITSET_WORDS (dst); + size = VBITSET_SIZE (dst); + + for (i = 0; i < size; i++) + *dstp++ = (*src1p++ | *src2p++) & *src3p++; +} + + +static bool +vbitset_or_and_cmp (bitset dst, bitset src1, bitset src2, bitset src3) +{ + unsigned int i; + int changed = 0; + bitset_word *src1p; + bitset_word *src2p; + bitset_word *src3p; + bitset_word *dstp; + bitset_windex size; + + if (BITSET_NBITS_ (src1) != BITSET_NBITS_ (src2) + || BITSET_NBITS_ (src1) != BITSET_NBITS_ (src3)) + return bitset_or_and_cmp_ (dst, src1, src2, src3); + + vbitset_resize (dst, BITSET_NBITS_ (src1)); + + src1p = VBITSET_WORDS (src1); + src2p = VBITSET_WORDS (src2); + src3p = VBITSET_WORDS (src3); + dstp = VBITSET_WORDS (dst); + size = VBITSET_SIZE (dst); + + for (i = 0; i < size; i++, dstp++) + { + bitset_word tmp = (*src1p++ | *src2p++) & *src3p++; + + if (*dstp != tmp) + { + changed = 1; + *dstp = tmp; + } + } + return changed; +} + + +static void +vbitset_copy (bitset dst, bitset src) +{ + if (BITSET_COMPATIBLE_ (dst, src)) + vbitset_copy1 (dst, src); + else + bitset_copy_ (dst, src); +} + + +/* Vector of operations for multiple word bitsets. */ +struct bitset_vtable vbitset_vtable = { + vbitset_set, + vbitset_reset, + bitset_toggle_, + vbitset_test, + vbitset_resize, + bitset_size_, + bitset_count_, + vbitset_empty_p, + vbitset_ones, + vbitset_zero, + vbitset_copy, + vbitset_disjoint_p, + vbitset_equal_p, + vbitset_not, + vbitset_subset_p, + vbitset_and, + vbitset_and_cmp, + vbitset_andn, + vbitset_andn_cmp, + vbitset_or, + vbitset_or_cmp, + vbitset_xor, + vbitset_xor_cmp, + vbitset_and_or, + vbitset_and_or_cmp, + vbitset_andn_or, + vbitset_andn_or_cmp, + vbitset_or_and, + vbitset_or_and_cmp, + vbitset_list, + vbitset_list_reverse, + NULL, + BITSET_VARRAY +}; + + +size_t +vbitset_bytes (n_bits) + bitset_bindex n_bits ATTRIBUTE_UNUSED; +{ + return sizeof (struct vbitset_struct); +} + + +bitset +vbitset_init (bset, n_bits) + bitset bset; + bitset_bindex n_bits; +{ + bset->b.vtable = &vbitset_vtable; + + bset->b.cindex = 0; + + VBITSET_SIZE (bset) = 0; + vbitset_resize (bset, n_bits); + return bset; +} diff --git a/src/apps/bin/bison/lib/vbitset.h b/src/apps/bin/bison/lib/vbitset.h new file mode 100644 index 0000000000..2660458749 --- /dev/null +++ b/src/apps/bin/bison/lib/vbitset.h @@ -0,0 +1,28 @@ +/* Functions to support vbitsets. + Copyright (C) 2002, 2004 Free Software Foundation, Inc. + Contributed by Michael Hayes (m.hayes@elec.canterbury.ac.nz). + +This program is free software; you can redistribute it and/or modify +it under the terms of the GNU General Public License as published by +the Free Software Foundation; either version 2 of the License, or +(at your option) any later version. + +This program is distributed in the hope that it will be useful, +but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU General Public License for more details. + +You should have received a copy of the GNU General Public License +along with this program; if not, write to the Free Software +Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef _VBITSET_H +#define _VBITSET_H + +#include "bitset.h" + +extern size_t vbitset_bytes (bitset_bindex); + +extern bitset vbitset_init (bitset, bitset_bindex); + +#endif diff --git a/src/apps/bin/bison/lib/xalloc.h b/src/apps/bin/bison/lib/xalloc.h new file mode 100644 index 0000000000..4b6585811b --- /dev/null +++ b/src/apps/bin/bison/lib/xalloc.h @@ -0,0 +1,87 @@ +/* xalloc.h -- malloc with out-of-memory checking + + Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, + 1999, 2000, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef XALLOC_H_ +# define XALLOC_H_ + +# include + +# ifndef __attribute__ +# if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 8) || __STRICT_ANSI__ +# define __attribute__(x) +# endif +# endif + +# ifndef ATTRIBUTE_NORETURN +# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) +# endif + +/* If this pointer is non-zero, run the specified function upon each + allocation failure. It is initialized to zero. */ +extern void (*xalloc_fail_func) (void); + +/* If XALLOC_FAIL_FUNC is undefined or a function that returns, this + message is output. It is translated via gettext. + Its value is "memory exhausted". */ +extern char const xalloc_msg_memory_exhausted[]; + +/* This function is always triggered when memory is exhausted. It is + in charge of honoring the two previous items. It exits with status + exit_failure (defined in exitfail.h). This is the + function to call when one wants the program to die because of a + memory allocation failure. */ +extern void xalloc_die (void) ATTRIBUTE_NORETURN; + +void *xmalloc (size_t s); +void *xnmalloc (size_t n, size_t s); +void *xzalloc (size_t s); +void *xcalloc (size_t n, size_t s); +void *xrealloc (void *p, size_t s); +void *xnrealloc (void *p, size_t n, size_t s); +void *x2realloc (void *p, size_t *pn); +void *x2nrealloc (void *p, size_t *pn, size_t s); +void *xclone (void const *p, size_t s); +char *xstrdup (const char *str); + +/* Return 1 if an array of N objects, each of size S, cannot exist due + to size arithmetic overflow. S must be positive and N must be + nonnegative. This is a macro, not an inline function, so that it + works correctly even when SIZE_MAX < N. + + By gnulib convention, SIZE_MAX represents overflow in size + calculations, so the conservative dividend to use here is + SIZE_MAX - 1, since SIZE_MAX might represent an overflowed value. + However, malloc (SIZE_MAX) fails on all known hosts where + sizeof (ptrdiff_t) <= sizeof (size_t), so do not bother to test for + exactly-SIZE_MAX allocations on such hosts; this avoids a test and + branch when S is known to be 1. */ +# define xalloc_oversized(n, s) \ + ((size_t) (sizeof (ptrdiff_t) <= sizeof (size_t) ? -1 : -2) / (s) < (n)) + +/* These macros are deprecated; they will go away soon, and are retained + temporarily only to ease conversion to the functions described above. */ +# define CCLONE(p, n) xclone (p, (n) * sizeof *(p)) +# define CLONE(p) xclone (p, sizeof *(p)) +# define NEW(type, var) type *var = xmalloc (sizeof (type)) +# define XCALLOC(type, n) xcalloc (n, sizeof (type)) +# define XMALLOC(type, n) xnmalloc (n, sizeof (type)) +# define XREALLOC(p, type, n) xnrealloc (p, n, sizeof (type)) +# define XFREE(p) free (p) + +#endif /* !XALLOC_H_ */ diff --git a/src/apps/bin/bison/lib/xmalloc.c b/src/apps/bin/bison/lib/xmalloc.c new file mode 100644 index 0000000000..181006b43d --- /dev/null +++ b/src/apps/bin/bison/lib/xmalloc.c @@ -0,0 +1,255 @@ +/* xmalloc.c -- malloc with out of memory checking + + Copyright (C) 1990, 1991, 1992, 1993, 1994, 1995, 1996, 1997, 1998, 2003, + 1999, 2000, 2002, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +# include +#endif + +#include "xalloc.h" + +#include +#include + +#include "gettext.h" +#define _(msgid) gettext (msgid) +#define N_(msgid) msgid + +#include "error.h" +#include "exitfail.h" + +#ifndef SIZE_MAX +# define SIZE_MAX ((size_t) -1) +#endif + +#ifndef HAVE_MALLOC +"you must run the autoconf test for a GNU libc compatible malloc" +#endif + +#ifndef HAVE_REALLOC +"you must run the autoconf test for a GNU libc compatible realloc" +#endif + +/* If non NULL, call this function when memory is exhausted. */ +void (*xalloc_fail_func) (void) = 0; + +/* If XALLOC_FAIL_FUNC is NULL, or does return, display this message + before exiting when memory is exhausted. Goes through gettext. */ +char const xalloc_msg_memory_exhausted[] = N_("memory exhausted"); + +void +xalloc_die (void) +{ + if (xalloc_fail_func) + (*xalloc_fail_func) (); + error (exit_failure, 0, "%s", _(xalloc_msg_memory_exhausted)); + /* The `noreturn' cannot be given to error, since it may return if + its first argument is 0. To help compilers understand the + xalloc_die does terminate, call abort. */ + abort (); +} + +/* Allocate an array of N objects, each with S bytes of memory, + dynamically, with error checking. S must be nonzero. */ + +static inline void * +xnmalloc_inline (size_t n, size_t s) +{ + void *p; + if (xalloc_oversized (n, s) || ! (p = malloc (n * s))) + xalloc_die (); + return p; +} + +void * +xnmalloc (size_t n, size_t s) +{ + return xnmalloc_inline (n, s); +} + +/* Allocate N bytes of memory dynamically, with error checking. */ + +void * +xmalloc (size_t n) +{ + return xnmalloc_inline (n, 1); +} + +/* Change the size of an allocated block of memory P to an array of N + objects each of S bytes, with error checking. S must be nonzero. */ + +static inline void * +xnrealloc_inline (void *p, size_t n, size_t s) +{ + if (xalloc_oversized (n, s) || ! (p = realloc (p, n * s))) + xalloc_die (); + return p; +} + +void * +xnrealloc (void *p, size_t n, size_t s) +{ + return xnrealloc_inline (p, n, s); +} + +/* Change the size of an allocated block of memory P to N bytes, + with error checking. */ + +void * +xrealloc (void *p, size_t n) +{ + return xnrealloc_inline (p, n, 1); +} + + +/* If P is null, allocate a block of at least *PN such objects; + otherwise, reallocate P so that it contains more than *PN objects + each of S bytes. *PN must be nonzero unless P is null, and S must + be nonzero. Set *PN to the new number of objects, and return the + pointer to the new block. *PN is never set to zero, and the + returned pointer is never null. + + Repeated reallocations are guaranteed to make progress, either by + allocating an initial block with a nonzero size, or by allocating a + larger block. + + In the following implementation, nonzero sizes are doubled so that + repeated reallocations have O(N log N) overall cost rather than + O(N**2) cost, but the specification for this function does not + guarantee that sizes are doubled. + + Here is an example of use: + + int *p = NULL; + size_t used = 0; + size_t allocated = 0; + + void + append_int (int value) + { + if (used == allocated) + p = x2nrealloc (p, &allocated, sizeof *p); + p[used++] = value; + } + + This causes x2nrealloc to allocate a block of some nonzero size the + first time it is called. + + To have finer-grained control over the initial size, set *PN to a + nonzero value before calling this function with P == NULL. For + example: + + int *p = NULL; + size_t used = 0; + size_t allocated = 0; + size_t allocated1 = 1000; + + void + append_int (int value) + { + if (used == allocated) + { + p = x2nrealloc (p, &allocated1, sizeof *p); + allocated = allocated1; + } + p[used++] = value; + } + + */ + +static inline void * +x2nrealloc_inline (void *p, size_t *pn, size_t s) +{ + size_t n = *pn; + + if (! p) + { + if (! n) + { + /* The approximate size to use for initial small allocation + requests, when the invoking code specifies an old size of + zero. 64 bytes is the largest "small" request for the + GNU C library malloc. */ + enum { DEFAULT_MXFAST = 64 }; + + n = DEFAULT_MXFAST / s; + n += !n; + } + } + else + { + if (SIZE_MAX / 2 / s < n) + xalloc_die (); + n *= 2; + } + + *pn = n; + return xrealloc (p, n * s); +} + +void * +x2nrealloc (void *p, size_t *pn, size_t s) +{ + return x2nrealloc_inline (p, pn, s); +} + +/* If P is null, allocate a block of at least *PN bytes; otherwise, + reallocate P so that it contains more than *PN bytes. *PN must be + nonzero unless P is null. Set *PN to the new block's size, and + return the pointer to the new block. *PN is never set to zero, and + the returned pointer is never null. */ + +void * +x2realloc (void *p, size_t *pn) +{ + return x2nrealloc_inline (p, pn, 1); +} + +/* Allocate S bytes of zeroed memory dynamically, with error checking. + There's no need for xnzalloc (N, S), since it would be equivalent + to xcalloc (N, S). */ + +void * +xzalloc (size_t s) +{ + return memset (xmalloc (s), 0, s); +} + +/* Allocate zeroed memory for N elements of S bytes, with error + checking. S must be nonzero. */ + +void * +xcalloc (size_t n, size_t s) +{ + void *p; + /* Test for overflow, since some calloc implementations don't have + proper overflow checks. */ + if (xalloc_oversized (n, s) || ! (p = calloc (n, s))) + xalloc_die (); + return p; +} + +/* Clone an object P of size S, with error checking. There's no need + for xnclone (P, N, S), since xclone (P, N * S) works without any + need for an arithmetic overflow check. */ + +void * +xclone (void const *p, size_t s) +{ + return memcpy (xmalloc (s), p, s); +} diff --git a/src/apps/bin/bison/lib/xstrdup.c b/src/apps/bin/bison/lib/xstrdup.c new file mode 100644 index 0000000000..58f18beb6f --- /dev/null +++ b/src/apps/bin/bison/lib/xstrdup.c @@ -0,0 +1,33 @@ +/* xstrdup.c -- copy a string with out of memory checking + Copyright (C) 1990, 1996, 1998, 2001, 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include "xalloc.h" + +#include + +/* Return a newly allocated copy of STRING. */ + +char * +xstrdup (const char *string) +{ + return xclone (string, strlen (string) + 1); +} diff --git a/src/apps/bin/bison/lib/xstrndup.c b/src/apps/bin/bison/lib/xstrndup.c new file mode 100644 index 0000000000..5addbf6637 --- /dev/null +++ b/src/apps/bin/bison/lib/xstrndup.c @@ -0,0 +1,39 @@ +/* Duplicate a bounded initial segment of a string, with out-of-memory + checking. + Copyright (C) 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#if HAVE_CONFIG_H +# include +#endif + +/* Specification. */ +#include "xstrndup.h" + +#include "strndup.h" +#include "xalloc.h" + +/* Return a newly allocated copy of at most N bytes of STRING. + In other words, return a copy of the initial segment of length N of + STRING. */ +char * +xstrndup (const char *string, size_t n) +{ + char *s = strndup (string, n); + if (! s) + xalloc_die (); + return s; +} diff --git a/src/apps/bin/bison/lib/xstrndup.h b/src/apps/bin/bison/lib/xstrndup.h new file mode 100644 index 0000000000..b09a2fc0bd --- /dev/null +++ b/src/apps/bin/bison/lib/xstrndup.h @@ -0,0 +1,24 @@ +/* Duplicate a bounded initial segment of a string, with out-of-memory + checking. + Copyright (C) 2003 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#include + +/* Return a newly allocated copy of at most N bytes of STRING. + In other words, return a copy of the initial segment of length N of + STRING. */ +extern char *xstrndup (const char *string, size_t n); diff --git a/src/apps/bin/bison/lib/yyerror.c b/src/apps/bin/bison/lib/yyerror.c new file mode 100644 index 0000000000..7d8cace896 --- /dev/null +++ b/src/apps/bin/bison/lib/yyerror.c @@ -0,0 +1,30 @@ +/* Yacc library error-printing function. + + Copyright (C) 2002 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include + +int yyerror (char const *); + +int +yyerror (char const *message) +{ + return fprintf (stderr, "%s\n", message); +} diff --git a/src/apps/bin/bison/m4/alloca.m4 b/src/apps/bin/bison/m4/alloca.m4 new file mode 100644 index 0000000000..6fcb205e94 --- /dev/null +++ b/src/apps/bin/bison/m4/alloca.m4 @@ -0,0 +1,44 @@ +# alloca.m4 serial 4 +dnl Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +AC_DEFUN([gl_FUNC_ALLOCA], +[ + dnl Work around a bug of AC_EGREP_CPP in autoconf-2.57. + AC_REQUIRE([AC_PROG_CPP]) + AC_REQUIRE([AC_PROG_EGREP]) + + AC_REQUIRE([AC_FUNC_ALLOCA]) + if test $ac_cv_func_alloca_works = no; then + gl_PREREQ_ALLOCA + fi + + # Define an additional variable used in the Makefile substitution. + if test $ac_cv_working_alloca_h = yes; then + AC_EGREP_CPP([Need own alloca], [ +#if defined __GNUC__ || defined _AIX || defined _MSC_VER + Need own alloca +#endif + ], + [AC_DEFINE(HAVE_ALLOCA, 1, + [Define to 1 if you have `alloca' after including , + a header that may be supplied by this distribution.]) + ALLOCA_H=alloca.h], + [ALLOCA_H=]) + else + ALLOCA_H=alloca.h + fi + AC_SUBST([ALLOCA_H]) + + AC_DEFINE(HAVE_ALLOCA_H, 1, + [Define HAVE_ALLOCA_H for backward compatibility with older code + that includes only if HAVE_ALLOCA_H is defined.]) +]) + +# Prerequisites of lib/alloca.c. +# STACK_DIRECTION is already handled by AC_FUNC_ALLOCA. +AC_DEFUN([gl_PREREQ_ALLOCA], [:]) diff --git a/src/apps/bin/bison/m4/dirname.m4 b/src/apps/bin/bison/m4/dirname.m4 new file mode 100644 index 0000000000..d0dacf1e06 --- /dev/null +++ b/src/apps/bin/bison/m4/dirname.m4 @@ -0,0 +1,15 @@ +# dirname.m4 serial 3 +dnl Copyright (C) 2002, 2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +AC_DEFUN([gl_DIRNAME], +[ + dnl Prerequisites of lib/dirname.h. + AC_REQUIRE([gl_AC_DOS]) + + dnl No prerequisites of lib/basename.c, lib/dirname.c, lib/stripslash.c. +]) diff --git a/src/apps/bin/bison/m4/dmalloc.m4 b/src/apps/bin/bison/m4/dmalloc.m4 new file mode 100644 index 0000000000..f724670891 --- /dev/null +++ b/src/apps/bin/bison/m4/dmalloc.m4 @@ -0,0 +1,22 @@ +## ----------------------------------- ## +## Check if --with-dmalloc was given. ## +## From Franc,ois Pinard ## +## ----------------------------------- ## + +# serial 1 + +AC_DEFUN([AM_WITH_DMALLOC], +[AC_MSG_CHECKING([if malloc debugging is wanted]) +AC_ARG_WITH(dmalloc, +[ --with-dmalloc use dmalloc, as in + http://www.dmalloc.com/dmalloc.tar.gz], +[if test "$withval" = yes; then + AC_MSG_RESULT(yes) + AC_DEFINE(WITH_DMALLOC,1, + [Define if using the dmalloc debugging malloc package]) + LIBS="$LIBS -ldmalloc" + LDFLAGS="$LDFLAGS -g" +else + AC_MSG_RESULT(no) +fi], [AC_MSG_RESULT(no)]) +]) diff --git a/src/apps/bin/bison/m4/dos.m4 b/src/apps/bin/bison/m4/dos.m4 new file mode 100644 index 0000000000..fc68724f6b --- /dev/null +++ b/src/apps/bin/bison/m4/dos.m4 @@ -0,0 +1,70 @@ +#serial 7 + +# Define some macros required for proper operation of code in lib/*.c +# on MSDOS/Windows systems. + +# Copyright (C) 2000, 2001, 2004 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# From Jim Meyering. + +AC_DEFUN([gl_AC_DOS], + [ + AC_CACHE_CHECK([whether system is Windows or MSDOS], [ac_cv_win_or_dos], + [ + AC_TRY_COMPILE([], + [#if !defined _WIN32 && !defined __WIN32__ && !defined __MSDOS__ && !defined __CYGWIN__ +neither MSDOS nor Windows +#endif], + [ac_cv_win_or_dos=yes], + [ac_cv_win_or_dos=no]) + ]) + + if test x"$ac_cv_win_or_dos" = xyes; then + ac_fs_accepts_drive_letter_prefix=1 + ac_fs_backslash_is_file_name_separator=1 + else + ac_fs_accepts_drive_letter_prefix=0 + ac_fs_backslash_is_file_name_separator=0 + fi + + AH_VERBATIM(FILESYSTEM_PREFIX_LEN, + [#if FILESYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX +# define FILESYSTEM_PREFIX_LEN(Filename) \ + ((Filename)[0] && (Filename)[1] == ':' ? 2 : 0) +#else +# define FILESYSTEM_PREFIX_LEN(Filename) 0 +#endif]) + + AC_DEFINE_UNQUOTED([FILESYSTEM_ACCEPTS_DRIVE_LETTER_PREFIX], + $ac_fs_accepts_drive_letter_prefix, + [Define on systems for which file names may have a so-called + `drive letter' prefix, define this to compute the length of that + prefix, including the colon.]) + + AH_VERBATIM(ISSLASH, + [#if FILESYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR +# define ISSLASH(C) ((C) == '/' || (C) == '\\') +#else +# define ISSLASH(C) ((C) == '/') +#endif]) + + AC_DEFINE_UNQUOTED([FILESYSTEM_BACKSLASH_IS_FILE_NAME_SEPARATOR], + $ac_fs_backslash_is_file_name_separator, + [Define if the backslash character may also serve as a file name + component separator.]) + ]) diff --git a/src/apps/bin/bison/m4/error.m4 b/src/apps/bin/bison/m4/error.m4 new file mode 100644 index 0000000000..da8fb513c6 --- /dev/null +++ b/src/apps/bin/bison/m4/error.m4 @@ -0,0 +1,15 @@ +#serial 10 + +AC_DEFUN([gl_ERROR], +[ + AC_FUNC_ERROR_AT_LINE + dnl Note: AC_FUNC_ERROR_AT_LINE does AC_LIBSOURCES([error.h, error.c]). + gl_PREREQ_ERROR +]) + +# Prerequisites of lib/error.c. +AC_DEFUN([gl_PREREQ_ERROR], +[ + AC_REQUIRE([AC_FUNC_STRERROR_R]) + : +]) diff --git a/src/apps/bin/bison/m4/exitfail.m4 b/src/apps/bin/bison/m4/exitfail.m4 new file mode 100644 index 0000000000..fa5b14931f --- /dev/null +++ b/src/apps/bin/bison/m4/exitfail.m4 @@ -0,0 +1,13 @@ +# exitfail.m4 serial 3 +dnl Copyright (C) 2002, 2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +AC_DEFUN([gl_EXITFAIL], +[ + dnl No prerequisites of lib/exitfail.c. + : +]) diff --git a/src/apps/bin/bison/m4/extensions.m4 b/src/apps/bin/bison/m4/extensions.m4 new file mode 100644 index 0000000000..58bc0beb6d --- /dev/null +++ b/src/apps/bin/bison/m4/extensions.m4 @@ -0,0 +1,29 @@ +# Enable extensions on systems that normally disable them. + +# Copyright (C) 2003 Free Software Foundation, Inc. + +# This file is free software, distributed under the terms of the GNU +# General Public License. As a special exception to the GNU General +# Public License, this file may be distributed as part of a program +# that contains a configuration script generated by Autoconf, under +# the same distribution terms as the rest of that program. + +# gl_USE_SYSTEM_EXTENSIONS +# ------------------------ +# Enable extensions on systems that normally disable them, +# typically due to standards-conformance issues. +AC_DEFUN([gl_USE_SYSTEM_EXTENSIONS], [ + AC_BEFORE([$0], [AC_COMPILE_IFELSE]) + AC_BEFORE([$0], [AC_RUN_IFELSE]) + + AC_REQUIRE([AC_GNU_SOURCE]) + AC_REQUIRE([AC_AIX]) + AC_REQUIRE([AC_MINIX]) + + AH_VERBATIM([__EXTENSIONS__], +[/* Enable extensions on Solaris. */ +#ifndef __EXTENSIONS__ +# undef __EXTENSIONS__ +#endif]) + AC_DEFINE([__EXTENSIONS__]) +]) diff --git a/src/apps/bin/bison/m4/getopt.m4 b/src/apps/bin/bison/m4/getopt.m4 new file mode 100644 index 0000000000..df602b985f --- /dev/null +++ b/src/apps/bin/bison/m4/getopt.m4 @@ -0,0 +1,13 @@ +# getopt.m4 serial 2 +dnl Copyright (C) 2002, 2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +AC_DEFUN([gl_GETOPT], +[ + dnl Prerequisites of lib/getopt.c. + : +]) diff --git a/src/apps/bin/bison/m4/gettext.m4 b/src/apps/bin/bison/m4/gettext.m4 new file mode 100644 index 0000000000..b0426ddd74 --- /dev/null +++ b/src/apps/bin/bison/m4/gettext.m4 @@ -0,0 +1,371 @@ +# gettext.m4 serial 28 (gettext-0.13) +dnl Copyright (C) 1995-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2003. + +dnl Macro to add for using GNU gettext. + +dnl Usage: AM_GNU_GETTEXT([INTLSYMBOL], [NEEDSYMBOL], [INTLDIR]). +dnl INTLSYMBOL can be one of 'external', 'no-libtool', 'use-libtool'. The +dnl default (if it is not specified or empty) is 'no-libtool'. +dnl INTLSYMBOL should be 'external' for packages with no intl directory, +dnl and 'no-libtool' or 'use-libtool' for packages with an intl directory. +dnl If INTLSYMBOL is 'use-libtool', then a libtool library +dnl $(top_builddir)/intl/libintl.la will be created (shared and/or static, +dnl depending on --{enable,disable}-{shared,static} and on the presence of +dnl AM-DISABLE-SHARED). If INTLSYMBOL is 'no-libtool', a static library +dnl $(top_builddir)/intl/libintl.a will be created. +dnl If NEEDSYMBOL is specified and is 'need-ngettext', then GNU gettext +dnl implementations (in libc or libintl) without the ngettext() function +dnl will be ignored. If NEEDSYMBOL is specified and is +dnl 'need-formatstring-macros', then GNU gettext implementations that don't +dnl support the ISO C 99 formatstring macros will be ignored. +dnl INTLDIR is used to find the intl libraries. If empty, +dnl the value `$(top_builddir)/intl/' is used. +dnl +dnl The result of the configuration is one of three cases: +dnl 1) GNU gettext, as included in the intl subdirectory, will be compiled +dnl and used. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 2) GNU gettext has been found in the system's C library. +dnl Catalog format: GNU --> install in $(datadir) +dnl Catalog extension: .mo after installation, .gmo in source tree +dnl 3) No internationalization, always use English msgid. +dnl Catalog format: none +dnl Catalog extension: none +dnl If INTLSYMBOL is 'external', only cases 2 and 3 can occur. +dnl The use of .gmo is historical (it was needed to avoid overwriting the +dnl GNU format catalogs when building on a platform with an X/Open gettext), +dnl but we keep it in order not to force irrelevant filename changes on the +dnl maintainers. +dnl +AC_DEFUN([AM_GNU_GETTEXT], +[ + dnl Argument checking. + ifelse([$1], [], , [ifelse([$1], [external], , [ifelse([$1], [no-libtool], , [ifelse([$1], [use-libtool], , + [errprint([ERROR: invalid first argument to AM_GNU_GETTEXT +])])])])]) + ifelse([$2], [], , [ifelse([$2], [need-ngettext], , [ifelse([$2], [need-formatstring-macros], , + [errprint([ERROR: invalid second argument to AM_GNU_GETTEXT +])])])]) + define(gt_included_intl, ifelse([$1], [external], [no], [yes])) + define(gt_libtool_suffix_prefix, ifelse([$1], [use-libtool], [l], [])) + + AC_REQUIRE([AM_PO_SUBDIRS])dnl + ifelse(gt_included_intl, yes, [ + AC_REQUIRE([AM_INTL_SUBDIR])dnl + ]) + + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Sometimes libintl requires libiconv, so first search for libiconv. + dnl Ideally we would do this search only after the + dnl if test "$USE_NLS" = "yes"; then + dnl if test "$gt_cv_func_gnugettext_libc" != "yes"; then + dnl tests. But if configure.in invokes AM_ICONV after AM_GNU_GETTEXT + dnl the configure script would need to contain the same shell code + dnl again, outside any 'if'. There are two solutions: + dnl - Invoke AM_ICONV_LINKFLAGS_BODY here, outside any 'if'. + dnl - Control the expansions in more detail using AC_PROVIDE_IFELSE. + dnl Since AC_PROVIDE_IFELSE is only in autoconf >= 2.52 and not + dnl documented, we avoid it. + ifelse(gt_included_intl, yes, , [ + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + ]) + + dnl Set USE_NLS. + AM_NLS + + ifelse(gt_included_intl, yes, [ + BUILD_INCLUDED_LIBINTL=no + USE_INCLUDED_LIBINTL=no + ]) + LIBINTL= + LTLIBINTL= + POSUB= + + dnl If we use NLS figure out what method + if test "$USE_NLS" = "yes"; then + gt_use_preinstalled_gnugettext=no + ifelse(gt_included_intl, yes, [ + AC_MSG_CHECKING([whether included gettext is requested]) + AC_ARG_WITH(included-gettext, + [ --with-included-gettext use the GNU gettext library included here], + nls_cv_force_use_gnu_gettext=$withval, + nls_cv_force_use_gnu_gettext=no) + AC_MSG_RESULT($nls_cv_force_use_gnu_gettext) + + nls_cv_use_gnu_gettext="$nls_cv_force_use_gnu_gettext" + if test "$nls_cv_force_use_gnu_gettext" != "yes"; then + ]) + dnl User does not insist on using GNU NLS library. Figure out what + dnl to use. If GNU gettext is available we use this. Else we have + dnl to fall back to GNU NLS library. + + dnl Add a version number to the cache macros. + define([gt_api_version], ifelse([$2], [need-formatstring-macros], 3, ifelse([$2], [need-ngettext], 2, 1))) + define([gt_cv_func_gnugettext_libc], [gt_cv_func_gnugettext]gt_api_version[_libc]) + define([gt_cv_func_gnugettext_libintl], [gt_cv_func_gnugettext]gt_api_version[_libintl]) + + AC_CACHE_CHECK([for GNU gettext in libc], gt_cv_func_gnugettext_libc, + [AC_TRY_LINK([#include +]ifelse([$2], [need-formatstring-macros], +[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +], [])[extern int _nl_msg_cat_cntr; +extern int *_nl_domain_bindings;], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_domain_bindings], + gt_cv_func_gnugettext_libc=yes, + gt_cv_func_gnugettext_libc=no)]) + + if test "$gt_cv_func_gnugettext_libc" != "yes"; then + dnl Sometimes libintl requires libiconv, so first search for libiconv. + ifelse(gt_included_intl, yes, , [ + AM_ICONV_LINK + ]) + dnl Search for libintl and define LIBINTL, LTLIBINTL and INCINTL + dnl accordingly. Don't use AC_LIB_LINKFLAGS_BODY([intl],[iconv]) + dnl because that would add "-liconv" to LIBINTL and LTLIBINTL + dnl even if libiconv doesn't exist. + AC_LIB_LINKFLAGS_BODY([intl]) + AC_CACHE_CHECK([for GNU gettext in libintl], + gt_cv_func_gnugettext_libintl, + [gt_save_CPPFLAGS="$CPPFLAGS" + CPPFLAGS="$CPPFLAGS $INCINTL" + gt_save_LIBS="$LIBS" + LIBS="$LIBS $LIBINTL" + dnl Now see whether libintl exists and does not depend on libiconv. + AC_TRY_LINK([#include +]ifelse([$2], [need-formatstring-macros], +[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +], [])[extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias ();], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], + gt_cv_func_gnugettext_libintl=yes, + gt_cv_func_gnugettext_libintl=no) + dnl Now see whether libintl exists and depends on libiconv. + if test "$gt_cv_func_gnugettext_libintl" != yes && test -n "$LIBICONV"; then + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include +]ifelse([$2], [need-formatstring-macros], +[#ifndef __GNU_GETTEXT_SUPPORTED_REVISION +#define __GNU_GETTEXT_SUPPORTED_REVISION(major) ((major) == 0 ? 0 : -1) +#endif +changequote(,)dnl +typedef int array [2 * (__GNU_GETTEXT_SUPPORTED_REVISION(0) >= 1) - 1]; +changequote([,])dnl +], [])[extern int _nl_msg_cat_cntr; +extern +#ifdef __cplusplus +"C" +#endif +const char *_nl_expand_alias ();], + [bindtextdomain ("", ""); +return (int) gettext ("")]ifelse([$2], [need-ngettext], [ + (int) ngettext ("", "", 0)], [])[ + _nl_msg_cat_cntr + *_nl_expand_alias (0)], + [LIBINTL="$LIBINTL $LIBICONV" + LTLIBINTL="$LTLIBINTL $LTLIBICONV" + gt_cv_func_gnugettext_libintl=yes + ]) + fi + CPPFLAGS="$gt_save_CPPFLAGS" + LIBS="$gt_save_LIBS"]) + fi + + dnl If an already present or preinstalled GNU gettext() is found, + dnl use it. But if this macro is used in GNU gettext, and GNU + dnl gettext is already preinstalled in libintl, we update this + dnl libintl. (Cf. the install rule in intl/Makefile.in.) + if test "$gt_cv_func_gnugettext_libc" = "yes" \ + || { test "$gt_cv_func_gnugettext_libintl" = "yes" \ + && test "$PACKAGE" != gettext-runtime \ + && test "$PACKAGE" != gettext-tools; }; then + gt_use_preinstalled_gnugettext=yes + else + dnl Reset the values set by searching for libintl. + LIBINTL= + LTLIBINTL= + INCINTL= + fi + + ifelse(gt_included_intl, yes, [ + if test "$gt_use_preinstalled_gnugettext" != "yes"; then + dnl GNU gettext is not found in the C library. + dnl Fall back on included GNU gettext library. + nls_cv_use_gnu_gettext=yes + fi + fi + + if test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions used to generate GNU NLS library. + BUILD_INCLUDED_LIBINTL=yes + USE_INCLUDED_LIBINTL=yes + LIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LIBICONV" + LTLIBINTL="ifelse([$3],[],\${top_builddir}/intl,[$3])/libintl.[]gt_libtool_suffix_prefix[]a $LTLIBICONV" + LIBS=`echo " $LIBS " | sed -e 's/ -lintl / /' -e 's/^ //' -e 's/ $//'` + fi + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + dnl Mark actions to use GNU gettext tools. + CATOBJEXT=.gmo + fi + ]) + + if test "$gt_use_preinstalled_gnugettext" = "yes" \ + || test "$nls_cv_use_gnu_gettext" = "yes"; then + AC_DEFINE(ENABLE_NLS, 1, + [Define to 1 if translation of program messages to the user's native language + is requested.]) + else + USE_NLS=no + fi + fi + + AC_MSG_CHECKING([whether to use NLS]) + AC_MSG_RESULT([$USE_NLS]) + if test "$USE_NLS" = "yes"; then + AC_MSG_CHECKING([where the gettext function comes from]) + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if test "$gt_cv_func_gnugettext_libintl" = "yes"; then + gt_source="external libintl" + else + gt_source="libc" + fi + else + gt_source="included intl directory" + fi + AC_MSG_RESULT([$gt_source]) + fi + + if test "$USE_NLS" = "yes"; then + + if test "$gt_use_preinstalled_gnugettext" = "yes"; then + if test "$gt_cv_func_gnugettext_libintl" = "yes"; then + AC_MSG_CHECKING([how to link with libintl]) + AC_MSG_RESULT([$LIBINTL]) + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCINTL]) + fi + + dnl For backward compatibility. Some packages may be using this. + AC_DEFINE(HAVE_GETTEXT, 1, + [Define if the GNU gettext() function is already present or preinstalled.]) + AC_DEFINE(HAVE_DCGETTEXT, 1, + [Define if the GNU dcgettext() function is already present or preinstalled.]) + fi + + dnl We need to process the po/ directory. + POSUB=po + fi + + ifelse(gt_included_intl, yes, [ + dnl If this is used in GNU gettext we have to set BUILD_INCLUDED_LIBINTL + dnl to 'yes' because some of the testsuite requires it. + if test "$PACKAGE" = gettext-runtime || test "$PACKAGE" = gettext-tools; then + BUILD_INCLUDED_LIBINTL=yes + fi + + dnl Make all variables we use known to autoconf. + AC_SUBST(BUILD_INCLUDED_LIBINTL) + AC_SUBST(USE_INCLUDED_LIBINTL) + AC_SUBST(CATOBJEXT) + + dnl For backward compatibility. Some configure.ins may be using this. + nls_cv_header_intl= + nls_cv_header_libgt= + + dnl For backward compatibility. Some Makefiles may be using this. + DATADIRNAME=share + AC_SUBST(DATADIRNAME) + + dnl For backward compatibility. Some Makefiles may be using this. + INSTOBJEXT=.mo + AC_SUBST(INSTOBJEXT) + + dnl For backward compatibility. Some Makefiles may be using this. + GENCAT=gencat + AC_SUBST(GENCAT) + + dnl For backward compatibility. Some Makefiles may be using this. + if test "$USE_INCLUDED_LIBINTL" = yes; then + INTLOBJS="\$(GETTOBJS)" + fi + AC_SUBST(INTLOBJS) + + dnl Enable libtool support if the surrounding package wishes it. + INTL_LIBTOOL_SUFFIX_PREFIX=gt_libtool_suffix_prefix + AC_SUBST(INTL_LIBTOOL_SUFFIX_PREFIX) + ]) + + dnl For backward compatibility. Some Makefiles may be using this. + INTLLIBS="$LIBINTL" + AC_SUBST(INTLLIBS) + + dnl Make all documented variables known to autoconf. + AC_SUBST(LIBINTL) + AC_SUBST(LTLIBINTL) + AC_SUBST(POSUB) +]) + + +dnl Checks for all prerequisites of the intl subdirectory, +dnl except for INTL_LIBTOOL_SUFFIX_PREFIX (and possibly LIBTOOL), INTLOBJS, +dnl USE_INCLUDED_LIBINTL, BUILD_INCLUDED_LIBINTL. + AC_DEFUN([AM_INTL_SUBDIR], []) + + +dnl gt_CHECK_DECL(FUNC, INCLUDES) +dnl Check whether a function is declared. +AC_DEFUN([gt_CHECK_DECL], +[ + AC_CACHE_CHECK([whether $1 is declared], ac_cv_have_decl_$1, + [AC_TRY_COMPILE([$2], [ +#ifndef $1 + char *p = (char *) $1; +#endif +], ac_cv_have_decl_$1=yes, ac_cv_have_decl_$1=no)]) + if test $ac_cv_have_decl_$1 = yes; then + gt_value=1 + else + gt_value=0 + fi + AC_DEFINE_UNQUOTED([HAVE_DECL_]translit($1, [a-z], [A-Z]), [$gt_value], + [Define to 1 if you have the declaration of `$1', and to 0 if you don't.]) +]) + + +dnl Usage: AM_GNU_GETTEXT_VERSION([gettext-version]) +AC_DEFUN([AM_GNU_GETTEXT_VERSION], []) diff --git a/src/apps/bin/bison/m4/gnulib.m4 b/src/apps/bin/bison/m4/gnulib.m4 new file mode 100644 index 0000000000..a6a8405539 --- /dev/null +++ b/src/apps/bin/bison/m4/gnulib.m4 @@ -0,0 +1,49 @@ +# This file is generated automatically by "bootstrap". +AC_DEFUN([GNULIB_AUTOCONF_SNIPPET],[ +gl_FUNC_ALLOCA + + +gl_DIRNAME + +gl_ERROR + + +gl_EXITFAIL + +dnl gl_USE_SYSTEM_EXTENSIONS must be added quite early to configure.ac. + +gl_GETOPT + +AM_GNU_GETTEXT([external]) + +gl_HARD_LOCALE + +gl_HASH + +AC_FUNC_MALLOC + +gl_MBSWIDTH + +gl_OBSTACK + +gl_QUOTE + +gl_QUOTEARG + +AC_FUNC_REALLOC + +AM_STDBOOL_H + +gl_FUNC_STPCPY + +gl_FUNC_STRNDUP + +gl_FUNC_STRNLEN + +gl_FUNC_GLIBC_UNLOCKED_IO + +gl_XALLOC + +gl_XSTRNDUP + +]) diff --git a/src/apps/bin/bison/m4/hard-locale.m4 b/src/apps/bin/bison/m4/hard-locale.m4 new file mode 100644 index 0000000000..3e2a08ccb5 --- /dev/null +++ b/src/apps/bin/bison/m4/hard-locale.m4 @@ -0,0 +1,14 @@ +# hard-locale.m4 serial 2 +dnl Copyright (C) 2002, 2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +AC_DEFUN([gl_HARD_LOCALE], +[ + dnl Prerequisites of lib/hard-locale.c. + AC_CHECK_HEADERS_ONCE(locale.h) + AC_CHECK_FUNCS_ONCE(setlocale) +]) diff --git a/src/apps/bin/bison/m4/hash.m4 b/src/apps/bin/bison/m4/hash.m4 new file mode 100644 index 0000000000..9fe3211f91 --- /dev/null +++ b/src/apps/bin/bison/m4/hash.m4 @@ -0,0 +1,13 @@ +# hash.m4 serial 3 +dnl Copyright (C) 2002, 2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +AC_DEFUN([gl_HASH], +[ + dnl Prerequisites of lib/hash.c. + AC_REQUIRE([AM_STDBOOL_H]) +]) diff --git a/src/apps/bin/bison/m4/iconv.m4 b/src/apps/bin/bison/m4/iconv.m4 new file mode 100644 index 0000000000..c5f3579827 --- /dev/null +++ b/src/apps/bin/bison/m4/iconv.m4 @@ -0,0 +1,103 @@ +# iconv.m4 serial AM4 (gettext-0.11.3) +dnl Copyright (C) 2000-2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +AC_DEFUN([AM_ICONV_LINKFLAGS_BODY], +[ + dnl Prerequisites of AC_LIB_LINKFLAGS_BODY. + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([iconv]) +]) + +AC_DEFUN([AM_ICONV_LINK], +[ + dnl Some systems have iconv in libc, some have it in libiconv (OSF/1 and + dnl those with the standalone portable GNU libiconv installed). + + dnl Search for libiconv and define LIBICONV, LTLIBICONV and INCICONV + dnl accordingly. + AC_REQUIRE([AM_ICONV_LINKFLAGS_BODY]) + + dnl Add $INCICONV to CPPFLAGS before performing the following checks, + dnl because if the user has installed libiconv and not disabled its use + dnl via --without-libiconv-prefix, he wants to use it. The first + dnl AC_TRY_LINK will then fail, the second AC_TRY_LINK will succeed. + am_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INCICONV]) + + AC_CACHE_CHECK(for iconv, am_cv_func_iconv, [ + am_cv_func_iconv="no, consider installing GNU libiconv" + am_cv_lib_iconv=no + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_func_iconv=yes) + if test "$am_cv_func_iconv" != yes; then + am_save_LIBS="$LIBS" + LIBS="$LIBS $LIBICONV" + AC_TRY_LINK([#include +#include ], + [iconv_t cd = iconv_open("",""); + iconv(cd,NULL,NULL,NULL,NULL); + iconv_close(cd);], + am_cv_lib_iconv=yes + am_cv_func_iconv=yes) + LIBS="$am_save_LIBS" + fi + ]) + if test "$am_cv_func_iconv" = yes; then + AC_DEFINE(HAVE_ICONV, 1, [Define if you have the iconv() function.]) + fi + if test "$am_cv_lib_iconv" = yes; then + AC_MSG_CHECKING([how to link with libiconv]) + AC_MSG_RESULT([$LIBICONV]) + else + dnl If $LIBICONV didn't lead to a usable library, we don't need $INCICONV + dnl either. + CPPFLAGS="$am_save_CPPFLAGS" + LIBICONV= + LTLIBICONV= + fi + AC_SUBST(LIBICONV) + AC_SUBST(LTLIBICONV) +]) + +AC_DEFUN([AM_ICONV], +[ + AM_ICONV_LINK + if test "$am_cv_func_iconv" = yes; then + AC_MSG_CHECKING([for iconv declaration]) + AC_CACHE_VAL(am_cv_proto_iconv, [ + AC_TRY_COMPILE([ +#include +#include +extern +#ifdef __cplusplus +"C" +#endif +#if defined(__STDC__) || defined(__cplusplus) +size_t iconv (iconv_t cd, char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft); +#else +size_t iconv(); +#endif +], [], am_cv_proto_iconv_arg1="", am_cv_proto_iconv_arg1="const") + am_cv_proto_iconv="extern size_t iconv (iconv_t cd, $am_cv_proto_iconv_arg1 char * *inbuf, size_t *inbytesleft, char * *outbuf, size_t *outbytesleft);"]) + am_cv_proto_iconv=`echo "[$]am_cv_proto_iconv" | tr -s ' ' | sed -e 's/( /(/'` + AC_MSG_RESULT([$]{ac_t:- + }[$]am_cv_proto_iconv) + AC_DEFINE_UNQUOTED(ICONV_CONST, $am_cv_proto_iconv_arg1, + [Define as const if the declaration of iconv() needs const.]) + fi +]) diff --git a/src/apps/bin/bison/m4/lib-ld.m4 b/src/apps/bin/bison/m4/lib-ld.m4 new file mode 100644 index 0000000000..38aeaec19f --- /dev/null +++ b/src/apps/bin/bison/m4/lib-ld.m4 @@ -0,0 +1,112 @@ +# lib-ld.m4 serial 3 (gettext-0.13) +dnl Copyright (C) 1996-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl Subroutines of libtool.m4, +dnl with replacements s/AC_/AC_LIB/ and s/lt_cv/acl_cv/ to avoid collision +dnl with libtool.m4. + +dnl From libtool-1.4. Sets the variable with_gnu_ld to yes or no. +AC_DEFUN([AC_LIB_PROG_LD_GNU], +[AC_CACHE_CHECK([if the linker ($LD) is GNU ld], acl_cv_prog_gnu_ld, +[# I'd rather use --version here, but apparently some GNU ld's only accept -v. +case `$LD -v 2>&1 conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi +ac_prog=ld +if test "$GCC" = yes; then + # Check if gcc -print-prog-name=ld gives a path. + AC_MSG_CHECKING([for ld used by GCC]) + case $host in + *-*-mingw*) + # gcc leaves a trailing carriage return which upsets mingw + ac_prog=`($CC -print-prog-name=ld) 2>&5 | tr -d '\015'` ;; + *) + ac_prog=`($CC -print-prog-name=ld) 2>&5` ;; + esac + case $ac_prog in + # Accept absolute paths. + [[\\/]* | [A-Za-z]:[\\/]*)] + [re_direlt='/[^/][^/]*/\.\./'] + # Canonicalize the path of ld + ac_prog=`echo $ac_prog| sed 's%\\\\%/%g'` + while echo $ac_prog | grep "$re_direlt" > /dev/null 2>&1; do + ac_prog=`echo $ac_prog| sed "s%$re_direlt%/%"` + done + test -z "$LD" && LD="$ac_prog" + ;; + "") + # If it fails, then pretend we aren't using GCC. + ac_prog=ld + ;; + *) + # If it is relative, then search for the first ld in PATH. + with_gnu_ld=unknown + ;; + esac +elif test "$with_gnu_ld" = yes; then + AC_MSG_CHECKING([for GNU ld]) +else + AC_MSG_CHECKING([for non-GNU ld]) +fi +AC_CACHE_VAL(acl_cv_path_LD, +[if test -z "$LD"; then + IFS="${IFS= }"; ac_save_ifs="$IFS"; IFS="${IFS}${PATH_SEPARATOR-:}" + for ac_dir in $PATH; do + test -z "$ac_dir" && ac_dir=. + if test -f "$ac_dir/$ac_prog" || test -f "$ac_dir/$ac_prog$ac_exeext"; then + acl_cv_path_LD="$ac_dir/$ac_prog" + # Check to see if the program is GNU ld. I'd rather use --version, + # but apparently some GNU ld's only accept -v. + # Break only if it was the GNU/non-GNU ld that we prefer. + case `"$acl_cv_path_LD" -v 2>&1 < /dev/null` in + *GNU* | *'with BFD'*) + test "$with_gnu_ld" != no && break ;; + *) + test "$with_gnu_ld" != yes && break ;; + esac + fi + done + IFS="$ac_save_ifs" +else + acl_cv_path_LD="$LD" # Let the user override the test with a path. +fi]) +LD="$acl_cv_path_LD" +if test -n "$LD"; then + AC_MSG_RESULT($LD) +else + AC_MSG_RESULT(no) +fi +test -z "$LD" && AC_MSG_ERROR([no acceptable ld found in \$PATH]) +AC_LIB_PROG_LD_GNU +]) diff --git a/src/apps/bin/bison/m4/lib-link.m4 b/src/apps/bin/bison/m4/lib-link.m4 new file mode 100644 index 0000000000..eeb200d266 --- /dev/null +++ b/src/apps/bin/bison/m4/lib-link.m4 @@ -0,0 +1,551 @@ +# lib-link.m4 serial 4 (gettext-0.12) +dnl Copyright (C) 2001-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +dnl AC_LIB_LINKFLAGS(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets and AC_SUBSTs the LIB${NAME} and LTLIB${NAME} variables and +dnl augments the CPPFLAGS variable. +AC_DEFUN([AC_LIB_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + AC_CACHE_CHECK([how to link with lib[]$1], [ac_cv_lib[]Name[]_libs], [ + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + ac_cv_lib[]Name[]_libs="$LIB[]NAME" + ac_cv_lib[]Name[]_ltlibs="$LTLIB[]NAME" + ac_cv_lib[]Name[]_cppflags="$INC[]NAME" + ]) + LIB[]NAME="$ac_cv_lib[]Name[]_libs" + LTLIB[]NAME="$ac_cv_lib[]Name[]_ltlibs" + INC[]NAME="$ac_cv_lib[]Name[]_cppflags" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + dnl Also set HAVE_LIB[]NAME so that AC_LIB_HAVE_LINKFLAGS can reuse the + dnl results of this search when this library appears as a dependency. + HAVE_LIB[]NAME=yes + undefine([Name]) + undefine([NAME]) +]) + +dnl AC_LIB_HAVE_LINKFLAGS(name, dependencies, includes, testcode) +dnl searches for libname and the libraries corresponding to explicit and +dnl implicit dependencies, together with the specified include files and +dnl the ability to compile and link the specified testcode. If found, it +dnl sets and AC_SUBSTs HAVE_LIB${NAME}=yes and the LIB${NAME} and +dnl LTLIB${NAME} variables and augments the CPPFLAGS variable, and +dnl #defines HAVE_LIB${NAME} to 1. Otherwise, it sets and AC_SUBSTs +dnl HAVE_LIB${NAME}=no and LIB${NAME} and LTLIB${NAME} to empty. +AC_DEFUN([AC_LIB_HAVE_LINKFLAGS], +[ + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + AC_REQUIRE([AC_LIB_RPATH]) + define([Name],[translit([$1],[./-], [___])]) + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + + dnl Search for lib[]Name and define LIB[]NAME, LTLIB[]NAME and INC[]NAME + dnl accordingly. + AC_LIB_LINKFLAGS_BODY([$1], [$2]) + + dnl Add $INC[]NAME to CPPFLAGS before performing the following checks, + dnl because if the user has installed lib[]Name and not disabled its use + dnl via --without-lib[]Name-prefix, he wants to use it. + ac_save_CPPFLAGS="$CPPFLAGS" + AC_LIB_APPENDTOVAR([CPPFLAGS], [$INC]NAME) + + AC_CACHE_CHECK([for lib[]$1], [ac_cv_lib[]Name], [ + ac_save_LIBS="$LIBS" + LIBS="$LIBS $LIB[]NAME" + AC_TRY_LINK([$3], [$4], [ac_cv_lib[]Name=yes], [ac_cv_lib[]Name=no]) + LIBS="$ac_save_LIBS" + ]) + if test "$ac_cv_lib[]Name" = yes; then + HAVE_LIB[]NAME=yes + AC_DEFINE([HAVE_LIB]NAME, 1, [Define if you have the $1 library.]) + AC_MSG_CHECKING([how to link with lib[]$1]) + AC_MSG_RESULT([$LIB[]NAME]) + else + HAVE_LIB[]NAME=no + dnl If $LIB[]NAME didn't lead to a usable library, we don't need + dnl $INC[]NAME either. + CPPFLAGS="$ac_save_CPPFLAGS" + LIB[]NAME= + LTLIB[]NAME= + fi + AC_SUBST([HAVE_LIB]NAME) + AC_SUBST([LIB]NAME) + AC_SUBST([LTLIB]NAME) + undefine([Name]) + undefine([NAME]) +]) + +dnl Determine the platform dependent parameters needed to use rpath: +dnl libext, shlibext, hardcode_libdir_flag_spec, hardcode_libdir_separator, +dnl hardcode_direct, hardcode_minus_L. +AC_DEFUN([AC_LIB_RPATH], +[ + AC_REQUIRE([AC_PROG_CC]) dnl we use $CC, $GCC, $LDFLAGS + AC_REQUIRE([AC_LIB_PROG_LD]) dnl we use $LD, $with_gnu_ld + AC_REQUIRE([AC_CANONICAL_HOST]) dnl we use $host + AC_REQUIRE([AC_CONFIG_AUX_DIR_DEFAULT]) dnl we use $ac_aux_dir + AC_CACHE_CHECK([for shared library run path origin], acl_cv_rpath, [ + CC="$CC" GCC="$GCC" LDFLAGS="$LDFLAGS" LD="$LD" with_gnu_ld="$with_gnu_ld" \ + ${CONFIG_SHELL-/bin/sh} "$ac_aux_dir/config.rpath" "$host" > conftest.sh + . ./conftest.sh + rm -f ./conftest.sh + acl_cv_rpath=done + ]) + wl="$acl_cv_wl" + libext="$acl_cv_libext" + shlibext="$acl_cv_shlibext" + hardcode_libdir_flag_spec="$acl_cv_hardcode_libdir_flag_spec" + hardcode_libdir_separator="$acl_cv_hardcode_libdir_separator" + hardcode_direct="$acl_cv_hardcode_direct" + hardcode_minus_L="$acl_cv_hardcode_minus_L" + dnl Determine whether the user wants rpath handling at all. + AC_ARG_ENABLE(rpath, + [ --disable-rpath do not hardcode runtime library paths], + :, enable_rpath=yes) +]) + +dnl AC_LIB_LINKFLAGS_BODY(name [, dependencies]) searches for libname and +dnl the libraries corresponding to explicit and implicit dependencies. +dnl Sets the LIB${NAME}, LTLIB${NAME} and INC${NAME} variables. +AC_DEFUN([AC_LIB_LINKFLAGS_BODY], +[ + define([NAME],[translit([$1],[abcdefghijklmnopqrstuvwxyz./-], + [ABCDEFGHIJKLMNOPQRSTUVWXYZ___])]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib$1-prefix], +[ --with-lib$1-prefix[=DIR] search for lib$1 in DIR/include and DIR/lib + --without-lib$1-prefix don't search for lib$1 in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi +]) + dnl Search the library and its dependencies in $additional_libdir and + dnl $LDFLAGS. Using breadth-first-seach. + LIB[]NAME= + LTLIB[]NAME= + INC[]NAME= + rpathdirs= + ltrpathdirs= + names_already_handled= + names_next_round='$1 $2' + while test -n "$names_next_round"; do + names_this_round="$names_next_round" + names_next_round= + for name in $names_this_round; do + already_handled= + for n in $names_already_handled; do + if test "$n" = "$name"; then + already_handled=yes + break + fi + done + if test -z "$already_handled"; then + names_already_handled="$names_already_handled $name" + dnl See if it was already located by an earlier AC_LIB_LINKFLAGS + dnl or AC_LIB_HAVE_LINKFLAGS call. + uppername=`echo "$name" | sed -e 'y|abcdefghijklmnopqrstuvwxyz./-|ABCDEFGHIJKLMNOPQRSTUVWXYZ___|'` + eval value=\"\$HAVE_LIB$uppername\" + if test -n "$value"; then + if test "$value" = yes; then + eval value=\"\$LIB$uppername\" + test -z "$value" || LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$value" + eval value=\"\$LTLIB$uppername\" + test -z "$value" || LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$value" + else + dnl An earlier call to AC_LIB_HAVE_LINKFLAGS has determined + dnl that this library doesn't exist. So just drop it. + : + fi + else + dnl Search the library lib$name in $additional_libdir and $LDFLAGS + dnl and the already constructed $LIBNAME/$LTLIBNAME. + found_dir= + found_la= + found_so= + found_a= + if test $use_additional = yes; then + if test -n "$shlibext" && test -f "$additional_libdir/lib$name.$shlibext"; then + found_dir="$additional_libdir" + found_so="$additional_libdir/lib$name.$shlibext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + else + if test -f "$additional_libdir/lib$name.$libext"; then + found_dir="$additional_libdir" + found_a="$additional_libdir/lib$name.$libext" + if test -f "$additional_libdir/lib$name.la"; then + found_la="$additional_libdir/lib$name.la" + fi + fi + fi + fi + if test "X$found_dir" = "X"; then + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + case "$x" in + -L*) + dir=`echo "X$x" | sed -e 's/^X-L//'` + if test -n "$shlibext" && test -f "$dir/lib$name.$shlibext"; then + found_dir="$dir" + found_so="$dir/lib$name.$shlibext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + else + if test -f "$dir/lib$name.$libext"; then + found_dir="$dir" + found_a="$dir/lib$name.$libext" + if test -f "$dir/lib$name.la"; then + found_la="$dir/lib$name.la" + fi + fi + fi + ;; + esac + if test "X$found_dir" != "X"; then + break + fi + done + fi + if test "X$found_dir" != "X"; then + dnl Found the library. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$found_dir -l$name" + if test "X$found_so" != "X"; then + dnl Linking with a shared library. We attempt to hardcode its + dnl directory into the executable's runpath, unless it's the + dnl standard /usr/lib. + if test "$enable_rpath" = no || test "X$found_dir" = "X/usr/lib"; then + dnl No hardcoding is needed. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $found_dir" + fi + dnl The hardcoding into $LIBNAME is system dependent. + if test "$hardcode_direct" = yes; then + dnl Using DIR/libNAME.so during linking hardcodes DIR into the + dnl resulting binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + if test -n "$hardcode_libdir_flag_spec" && test "$hardcode_minus_L" = no; then + dnl Use an explicit option to hardcode DIR into the resulting + dnl binary. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $found_dir" + fi + else + dnl Rely on "-L$found_dir". + dnl But don't add it if it's already contained in the LDFLAGS + dnl or the already constructed $LIBNAME + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$found_dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir" + fi + if test "$hardcode_minus_L" != no; then + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_so" + else + dnl We cannot use $hardcode_runpath_var and LD_RUN_PATH + dnl here, because this doesn't fit in flags passed to the + dnl compiler. So give up. No hardcoding. This affects only + dnl very old systems. + dnl FIXME: Not sure whether we should use + dnl "-L$found_dir -l$name" or "-L$found_dir $found_so" + dnl here. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + fi + fi + fi + fi + else + if test "X$found_a" != "X"; then + dnl Linking with a static library. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$found_a" + else + dnl We shouldn't come here, but anyway it's good to have a + dnl fallback. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$found_dir -l$name" + fi + fi + dnl Assume the include files are nearby. + additional_includedir= + case "$found_dir" in + */lib | */lib/) + basedir=`echo "X$found_dir" | sed -e 's,^X,,' -e 's,/lib/*$,,'` + additional_includedir="$basedir/include" + ;; + esac + if test "X$additional_includedir" != "X"; then + dnl Potentially add $additional_includedir to $INCNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's /usr/local/include and we are using GCC on Linux, + dnl 3. if it's already present in $CPPFLAGS or the already + dnl constructed $INCNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + for x in $CPPFLAGS $INC[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $INCNAME. + INC[]NAME="${INC[]NAME}${INC[]NAME:+ }-I$additional_includedir" + fi + fi + fi + fi + fi + dnl Look for dependencies. + if test -n "$found_la"; then + dnl Read the .la file. It defines the variables + dnl dlname, library_names, old_library, dependency_libs, current, + dnl age, revision, installed, dlopen, dlpreopen, libdir. + save_libdir="$libdir" + case "$found_la" in + */* | *\\*) . "$found_la" ;; + *) . "./$found_la" ;; + esac + libdir="$save_libdir" + dnl We use only dependency_libs. + for dep in $dependency_libs; do + case "$dep" in + -L*) + additional_libdir=`echo "X$dep" | sed -e 's/^X-L//'` + dnl Potentially add $additional_libdir to $LIBNAME and $LTLIBNAME. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's /usr/local/lib and we are using GCC on Linux, + dnl 3. if it's already present in $LDFLAGS or the already + dnl constructed $LIBNAME, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + haveit= + for x in $LDFLAGS $LIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LIBNAME. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-L$additional_libdir" + fi + fi + haveit= + for x in $LDFLAGS $LTLIB[]NAME; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LTLIBNAME. + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-L$additional_libdir" + fi + fi + fi + fi + ;; + -R*) + dir=`echo "X$dep" | sed -e 's/^X-R//'` + if test "$enable_rpath" != no; then + dnl Potentially add DIR to rpathdirs. + dnl The rpathdirs will be appended to $LIBNAME at the end. + haveit= + for x in $rpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + rpathdirs="$rpathdirs $dir" + fi + dnl Potentially add DIR to ltrpathdirs. + dnl The ltrpathdirs will be appended to $LTLIBNAME at the end. + haveit= + for x in $ltrpathdirs; do + if test "X$x" = "X$dir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + ltrpathdirs="$ltrpathdirs $dir" + fi + fi + ;; + -l*) + dnl Handle this in the next round. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's/^X-l//'` + ;; + *.la) + dnl Handle this in the next round. Throw away the .la's + dnl directory; it is already contained in a preceding -L + dnl option. + names_next_round="$names_next_round "`echo "X$dep" | sed -e 's,^X.*/,,' -e 's,^lib,,' -e 's,\.la$,,'` + ;; + *) + dnl Most likely an immediate library name. + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$dep" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }$dep" + ;; + esac + done + fi + else + dnl Didn't find the library; assume it is in the system directories + dnl known to the linker and runtime loader. (All the system + dnl directories known to the linker should also be known to the + dnl runtime loader, otherwise the system is severely misconfigured.) + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }-l$name" + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-l$name" + fi + fi + fi + done + done + if test "X$rpathdirs" != "X"; then + if test -n "$hardcode_libdir_separator"; then + dnl Weird platform: only the last -rpath option counts, the user must + dnl pass all path elements in one option. We can arrange that for a + dnl single library, but not when more than one $LIBNAMEs are used. + alldirs= + for found_dir in $rpathdirs; do + alldirs="${alldirs}${alldirs:+$hardcode_libdir_separator}$found_dir" + done + dnl Note: hardcode_libdir_flag_spec uses $libdir and $wl. + acl_save_libdir="$libdir" + libdir="$alldirs" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + else + dnl The -rpath options are cumulative. + for found_dir in $rpathdirs; do + acl_save_libdir="$libdir" + libdir="$found_dir" + eval flag=\"$hardcode_libdir_flag_spec\" + libdir="$acl_save_libdir" + LIB[]NAME="${LIB[]NAME}${LIB[]NAME:+ }$flag" + done + fi + fi + if test "X$ltrpathdirs" != "X"; then + dnl When using libtool, the option that works for both libraries and + dnl executables is -R. The -R options are cumulative. + for found_dir in $ltrpathdirs; do + LTLIB[]NAME="${LTLIB[]NAME}${LTLIB[]NAME:+ }-R$found_dir" + done + fi +]) + +dnl AC_LIB_APPENDTOVAR(VAR, CONTENTS) appends the elements of CONTENTS to VAR, +dnl unless already present in VAR. +dnl Works only for CPPFLAGS, not for LIB* variables because that sometimes +dnl contains two or three consecutive elements that belong together. +AC_DEFUN([AC_LIB_APPENDTOVAR], +[ + for element in [$2]; do + haveit= + for x in $[$1]; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X$element"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + [$1]="${[$1]}${[$1]:+ }$element" + fi + done +]) diff --git a/src/apps/bin/bison/m4/lib-prefix.m4 b/src/apps/bin/bison/m4/lib-prefix.m4 new file mode 100644 index 0000000000..8aff5a9d20 --- /dev/null +++ b/src/apps/bin/bison/m4/lib-prefix.m4 @@ -0,0 +1,155 @@ +# lib-prefix.m4 serial 3 (gettext-0.13) +dnl Copyright (C) 2001-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Bruno Haible. + +dnl AC_LIB_ARG_WITH is synonymous to AC_ARG_WITH in autoconf-2.13, and +dnl similar to AC_ARG_WITH in autoconf 2.52...2.57 except that is doesn't +dnl require excessive bracketing. +ifdef([AC_HELP_STRING], +[AC_DEFUN([AC_LIB_ARG_WITH], [AC_ARG_WITH([$1],[[$2]],[$3],[$4])])], +[AC_DEFUN([AC_][LIB_ARG_WITH], [AC_ARG_WITH([$1],[$2],[$3],[$4])])]) + +dnl AC_LIB_PREFIX adds to the CPPFLAGS and LDFLAGS the flags that are needed +dnl to access previously installed libraries. The basic assumption is that +dnl a user will want packages to use other packages he previously installed +dnl with the same --prefix option. +dnl This macro is not needed if only AC_LIB_LINKFLAGS is used to locate +dnl libraries, but is otherwise very convenient. +AC_DEFUN([AC_LIB_PREFIX], +[ + AC_BEFORE([$0], [AC_LIB_LINKFLAGS]) + AC_REQUIRE([AC_PROG_CC]) + AC_REQUIRE([AC_CANONICAL_HOST]) + AC_REQUIRE([AC_LIB_PREPARE_PREFIX]) + dnl By default, look in $includedir and $libdir. + use_additional=yes + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + AC_LIB_ARG_WITH([lib-prefix], +[ --with-lib-prefix[=DIR] search for libraries in DIR/include and DIR/lib + --without-lib-prefix don't search for libraries in includedir and libdir], +[ + if test "X$withval" = "Xno"; then + use_additional=no + else + if test "X$withval" = "X"; then + AC_LIB_WITH_FINAL_PREFIX([ + eval additional_includedir=\"$includedir\" + eval additional_libdir=\"$libdir\" + ]) + else + additional_includedir="$withval/include" + additional_libdir="$withval/lib" + fi + fi +]) + if test $use_additional = yes; then + dnl Potentially add $additional_includedir to $CPPFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/include, + dnl 2. if it's already present in $CPPFLAGS, + dnl 3. if it's /usr/local/include and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_includedir" != "X/usr/include"; then + haveit= + for x in $CPPFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-I$additional_includedir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_includedir" = "X/usr/local/include"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_includedir"; then + dnl Really add $additional_includedir to $CPPFLAGS. + CPPFLAGS="${CPPFLAGS}${CPPFLAGS:+ }-I$additional_includedir" + fi + fi + fi + fi + dnl Potentially add $additional_libdir to $LDFLAGS. + dnl But don't add it + dnl 1. if it's the standard /usr/lib, + dnl 2. if it's already present in $LDFLAGS, + dnl 3. if it's /usr/local/lib and we are using GCC on Linux, + dnl 4. if it doesn't exist as a directory. + if test "X$additional_libdir" != "X/usr/lib"; then + haveit= + for x in $LDFLAGS; do + AC_LIB_WITH_FINAL_PREFIX([eval x=\"$x\"]) + if test "X$x" = "X-L$additional_libdir"; then + haveit=yes + break + fi + done + if test -z "$haveit"; then + if test "X$additional_libdir" = "X/usr/local/lib"; then + if test -n "$GCC"; then + case $host_os in + linux*) haveit=yes;; + esac + fi + fi + if test -z "$haveit"; then + if test -d "$additional_libdir"; then + dnl Really add $additional_libdir to $LDFLAGS. + LDFLAGS="${LDFLAGS}${LDFLAGS:+ }-L$additional_libdir" + fi + fi + fi + fi + fi +]) + +dnl AC_LIB_PREPARE_PREFIX creates variables acl_final_prefix, +dnl acl_final_exec_prefix, containing the values to which $prefix and +dnl $exec_prefix will expand at the end of the configure script. +AC_DEFUN([AC_LIB_PREPARE_PREFIX], +[ + dnl Unfortunately, prefix and exec_prefix get only finally determined + dnl at the end of configure. + if test "X$prefix" = "XNONE"; then + acl_final_prefix="$ac_default_prefix" + else + acl_final_prefix="$prefix" + fi + if test "X$exec_prefix" = "XNONE"; then + acl_final_exec_prefix='${prefix}' + else + acl_final_exec_prefix="$exec_prefix" + fi + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + eval acl_final_exec_prefix=\"$acl_final_exec_prefix\" + prefix="$acl_save_prefix" +]) + +dnl AC_LIB_WITH_FINAL_PREFIX([statement]) evaluates statement, with the +dnl variables prefix and exec_prefix bound to the values they will have +dnl at the end of the configure script. +AC_DEFUN([AC_LIB_WITH_FINAL_PREFIX], +[ + acl_save_prefix="$prefix" + prefix="$acl_final_prefix" + acl_save_exec_prefix="$exec_prefix" + exec_prefix="$acl_final_exec_prefix" + $1 + exec_prefix="$acl_save_exec_prefix" + prefix="$acl_save_prefix" +]) diff --git a/src/apps/bin/bison/m4/m4.m4 b/src/apps/bin/bison/m4/m4.m4 new file mode 100644 index 0000000000..1b4b903f3e --- /dev/null +++ b/src/apps/bin/bison/m4/m4.m4 @@ -0,0 +1,29 @@ +# Copyright 2000 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# BISON_PROG_GNU_M4 +# ----------------- +# Check for GNU m4, at least 1.3 (supports frozen files). +AC_DEFUN([BISON_PROG_GNU_M4], +[AC_PATH_PROGS(M4, gm4 gnum4 m4, m4) +AC_CACHE_CHECK(whether m4 supports frozen files, ac_cv_prog_gnu_m4, +[ac_cv_prog_gnu_m4=no +if test x"$M4" != x; then + case `$M4 --help < /dev/null 2>&1` in + *reload-state*) ac_cv_prog_gnu_m4=yes ;; + esac +fi])]) diff --git a/src/apps/bin/bison/m4/mbrtowc.m4 b/src/apps/bin/bison/m4/mbrtowc.m4 new file mode 100644 index 0000000000..3d8768ecbe --- /dev/null +++ b/src/apps/bin/bison/m4/mbrtowc.m4 @@ -0,0 +1,27 @@ +# mbrtowc.m4 serial 7 +dnl Copyright (C) 2001-2002, 2004 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl From Paul Eggert + +dnl This file can be removed, and gl_FUNC_MBRTOWC replaced with +dnl AC_FUNC_MBRTOWC, when autoconf 2.57 can be assumed everywhere. + +AC_DEFUN([gl_FUNC_MBRTOWC], +[ + AC_CACHE_CHECK([whether mbrtowc and mbstate_t are properly declared], + gl_cv_func_mbrtowc, + [AC_TRY_LINK( + [#include ], + [mbstate_t state; return ! (sizeof state && mbrtowc);], + gl_cv_func_mbrtowc=yes, + gl_cv_func_mbrtowc=no)]) + if test $gl_cv_func_mbrtowc = yes; then + AC_DEFINE(HAVE_MBRTOWC, 1, + [Define to 1 if mbrtowc and mbstate_t are properly declared.]) + fi +]) diff --git a/src/apps/bin/bison/m4/mbstate_t.m4 b/src/apps/bin/bison/m4/mbstate_t.m4 new file mode 100644 index 0000000000..a07f51bc15 --- /dev/null +++ b/src/apps/bin/bison/m4/mbstate_t.m4 @@ -0,0 +1,32 @@ +# mbstate_t.m4 serial 9 +dnl Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +# From Paul Eggert. + +# BeOS 5 has but does not define mbstate_t, +# so you can't declare an object of that type. +# Check for this incompatibility with Standard C. + +# AC_TYPE_MBSTATE_T +# ----------------- +AC_DEFUN([AC_TYPE_MBSTATE_T], + [AC_CACHE_CHECK([for mbstate_t], ac_cv_type_mbstate_t, + [AC_COMPILE_IFELSE( + [AC_LANG_PROGRAM( + [AC_INCLUDES_DEFAULT +# include ], + [mbstate_t x; return sizeof x;])], + [ac_cv_type_mbstate_t=yes], + [ac_cv_type_mbstate_t=no])]) + if test $ac_cv_type_mbstate_t = yes; then + AC_DEFINE([HAVE_MBSTATE_T], 1, + [Define to 1 if declares mbstate_t.]) + else + AC_DEFINE([mbstate_t], int, + [Define to a type if does not define.]) + fi]) diff --git a/src/apps/bin/bison/m4/mbswidth.m4 b/src/apps/bin/bison/m4/mbswidth.m4 new file mode 100644 index 0000000000..f61be107a8 --- /dev/null +++ b/src/apps/bin/bison/m4/mbswidth.m4 @@ -0,0 +1,55 @@ +#serial 11 + +dnl autoconf tests required for use of mbswidth.c +dnl From Bruno Haible. + +AC_DEFUN([gl_MBSWIDTH], +[ + AC_CHECK_HEADERS_ONCE(wchar.h wctype.h) + AC_CHECK_FUNCS_ONCE(isascii iswprint mbsinit) + AC_CHECK_FUNCS(iswcntrl wcwidth) + gl_FUNC_MBRTOWC + + AC_CACHE_CHECK([whether wcwidth is declared], ac_cv_have_decl_wcwidth, + [AC_TRY_COMPILE([ +/* AIX 3.2.5 declares wcwidth in . */ +#if HAVE_STRING_H +# include +#endif +#if HAVE_WCHAR_H +# include +#endif +], [ +#ifndef wcwidth + char *p = (char *) wcwidth; +#endif +], ac_cv_have_decl_wcwidth=yes, ac_cv_have_decl_wcwidth=no)]) + if test $ac_cv_have_decl_wcwidth = yes; then + ac_val=1 + else + ac_val=0 + fi + AC_DEFINE_UNQUOTED(HAVE_DECL_WCWIDTH, $ac_val, + [Define to 1 if you have the declaration of wcwidth(), and to 0 otherwise.]) + + dnl UnixWare 7.1.1 has a declaration of a function mbswidth() + dnl that clashes with ours. + AC_CACHE_CHECK([whether mbswidth is declared in ], + ac_cv_have_decl_mbswidth, + [AC_TRY_COMPILE([ +#if HAVE_WCHAR_H +# include +#endif +], [ + char *p = (char *) mbswidth; +], ac_cv_have_decl_mbswidth=yes, ac_cv_have_decl_mbswidth=no)]) + if test $ac_cv_have_decl_mbswidth = yes; then + ac_val=1 + else + ac_val=0 + fi + AC_DEFINE_UNQUOTED(HAVE_DECL_MBSWIDTH_IN_WCHAR_H, $ac_val, + [Define to 1 if you have a declaration of mbswidth() in , and to 0 otherwise.]) + + AC_TYPE_MBSTATE_T +]) diff --git a/src/apps/bin/bison/m4/nls.m4 b/src/apps/bin/bison/m4/nls.m4 new file mode 100644 index 0000000000..36bc49317c --- /dev/null +++ b/src/apps/bin/bison/m4/nls.m4 @@ -0,0 +1,49 @@ +# nls.m4 serial 1 (gettext-0.12) +dnl Copyright (C) 1995-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2003. + +AC_DEFUN([AM_NLS], +[ + AC_MSG_CHECKING([whether NLS is requested]) + dnl Default is enabled NLS + AC_ARG_ENABLE(nls, + [ --disable-nls do not use Native Language Support], + USE_NLS=$enableval, USE_NLS=yes) + AC_MSG_RESULT($USE_NLS) + AC_SUBST(USE_NLS) +]) + +AC_DEFUN([AM_MKINSTALLDIRS], +[ + dnl If the AC_CONFIG_AUX_DIR macro for autoconf is used we possibly + dnl find the mkinstalldirs script in another subdir but $(top_srcdir). + dnl Try to locate it. + MKINSTALLDIRS= + if test -n "$ac_aux_dir"; then + case "$ac_aux_dir" in + /*) MKINSTALLDIRS="$ac_aux_dir/mkinstalldirs" ;; + *) MKINSTALLDIRS="\$(top_builddir)/$ac_aux_dir/mkinstalldirs" ;; + esac + fi + if test -z "$MKINSTALLDIRS"; then + MKINSTALLDIRS="\$(top_srcdir)/mkinstalldirs" + fi + AC_SUBST(MKINSTALLDIRS) +]) diff --git a/src/apps/bin/bison/m4/obstack.m4 b/src/apps/bin/bison/m4/obstack.m4 new file mode 100644 index 0000000000..9a56027858 --- /dev/null +++ b/src/apps/bin/bison/m4/obstack.m4 @@ -0,0 +1,19 @@ +# obstack.m4 serial 2 +dnl Copyright (C) 2002, 2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +AC_DEFUN([gl_OBSTACK], +[ + AC_FUNC_OBSTACK + dnl Note: AC_FUNC_OBSTACK does AC_LIBSOURCES([obstack.h, obstack.c]). + if test $ac_cv_func_obstack = no; then + gl_PREREQ_OBSTACK + fi +]) + +# Prerequisites of lib/obstack.c. +AC_DEFUN([gl_PREREQ_OBSTACK], [:]) diff --git a/src/apps/bin/bison/m4/onceonly.m4 b/src/apps/bin/bison/m4/onceonly.m4 new file mode 100644 index 0000000000..9fc510e06e --- /dev/null +++ b/src/apps/bin/bison/m4/onceonly.m4 @@ -0,0 +1,86 @@ +# onceonly_2_57.m4 serial 3 +dnl Copyright (C) 2002-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +dnl This file defines some "once only" variants of standard autoconf macros. +dnl AC_CHECK_HEADERS_ONCE like AC_CHECK_HEADERS +dnl AC_CHECK_FUNCS_ONCE like AC_CHECK_FUNCS +dnl AC_CHECK_DECLS_ONCE like AC_CHECK_DECLS +dnl AC_REQUIRE([AC_HEADER_STDC]) like AC_HEADER_STDC +dnl The advantage is that the check for each of the headers/functions/decls +dnl will be put only once into the 'configure' file. It keeps the size of +dnl the 'configure' file down, and avoids redundant output when 'configure' +dnl is run. +dnl The drawback is that the checks cannot be conditionalized. If you write +dnl if some_condition; then gl_CHECK_HEADERS(stdlib.h); fi +dnl inside an AC_DEFUNed function, the gl_CHECK_HEADERS macro call expands to +dnl empty, and the check will be inserted before the body of the AC_DEFUNed +dnl function. + +dnl This is like onceonly.m4, except that it uses diversions to named sections +dnl DEFAULTS and INIT_PREPARE in order to check all requested headers at once, +dnl thus reducing the size of 'configure'. Works with autoconf-2.57. The +dnl size reduction is ca. 9%. + +dnl Autoconf version 2.57 or newer is recommended. +AC_PREREQ(2.54) + +# AC_CHECK_HEADERS_ONCE(HEADER1 HEADER2 ...) is a once-only variant of +# AC_CHECK_HEADERS(HEADER1 HEADER2 ...). +AC_DEFUN([AC_CHECK_HEADERS_ONCE], [ + : + AC_FOREACH([gl_HEADER_NAME], [$1], [ + AC_DEFUN([gl_CHECK_HEADER_]m4_quote(translit(gl_HEADER_NAME, + [./-], [___])), [ + m4_divert_text([INIT_PREPARE], + [gl_header_list="$gl_header_list gl_HEADER_NAME"]) + gl_HEADERS_EXPANSION + AH_TEMPLATE(AS_TR_CPP([HAVE_]m4_defn([gl_HEADER_NAME])), + [Define to 1 if you have the <]m4_defn([gl_HEADER_NAME])[> header file.]) + ]) + AC_REQUIRE([gl_CHECK_HEADER_]m4_quote(translit(gl_HEADER_NAME, + [./-], [___]))) + ]) +]) +m4_define([gl_HEADERS_EXPANSION], [ + m4_divert_text([DEFAULTS], [gl_header_list=]) + AC_CHECK_HEADERS([$gl_header_list]) + m4_define([gl_HEADERS_EXPANSION], []) +]) + +# AC_CHECK_FUNCS_ONCE(FUNC1 FUNC2 ...) is a once-only variant of +# AC_CHECK_FUNCS(FUNC1 FUNC2 ...). +AC_DEFUN([AC_CHECK_FUNCS_ONCE], [ + : + AC_FOREACH([gl_FUNC_NAME], [$1], [ + AC_DEFUN([gl_CHECK_FUNC_]m4_defn([gl_FUNC_NAME]), [ + m4_divert_text([INIT_PREPARE], + [gl_func_list="$gl_func_list gl_FUNC_NAME"]) + gl_FUNCS_EXPANSION + AH_TEMPLATE(AS_TR_CPP([HAVE_]m4_defn([gl_FUNC_NAME])), + [Define to 1 if you have the `]m4_defn([gl_FUNC_NAME])[' function.]) + ]) + AC_REQUIRE([gl_CHECK_FUNC_]m4_defn([gl_FUNC_NAME])) + ]) +]) +m4_define([gl_FUNCS_EXPANSION], [ + m4_divert_text([DEFAULTS], [gl_func_list=]) + AC_CHECK_FUNCS([$gl_func_list]) + m4_define([gl_FUNCS_EXPANSION], []) +]) + +# AC_CHECK_DECLS_ONCE(DECL1 DECL2 ...) is a once-only variant of +# AC_CHECK_DECLS(DECL1, DECL2, ...). +AC_DEFUN([AC_CHECK_DECLS_ONCE], [ + : + AC_FOREACH([gl_DECL_NAME], [$1], [ + AC_DEFUN([gl_CHECK_DECL_]m4_defn([gl_DECL_NAME]), [ + AC_CHECK_DECLS(m4_defn([gl_DECL_NAME])) + ]) + AC_REQUIRE([gl_CHECK_DECL_]m4_defn([gl_DECL_NAME])) + ]) +]) diff --git a/src/apps/bin/bison/m4/po.m4 b/src/apps/bin/bison/m4/po.m4 new file mode 100644 index 0000000000..e161998818 --- /dev/null +++ b/src/apps/bin/bison/m4/po.m4 @@ -0,0 +1,426 @@ +# po.m4 serial 3 (gettext-0.14) +dnl Copyright (C) 1995-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. +dnl +dnl This file can can be used in projects which are not available under +dnl the GNU General Public License or the GNU Library General Public +dnl License but which still want to provide support for the GNU gettext +dnl functionality. +dnl Please note that the actual code of the GNU gettext library is covered +dnl by the GNU Library General Public License, and the rest of the GNU +dnl gettext package package is covered by the GNU General Public License. +dnl They are *not* in the public domain. + +dnl Authors: +dnl Ulrich Drepper , 1995-2000. +dnl Bruno Haible , 2000-2003. + +dnl Checks for all prerequisites of the po subdirectory. +AC_DEFUN([AM_PO_SUBDIRS], +[ + AC_REQUIRE([AC_PROG_MAKE_SET])dnl + AC_REQUIRE([AC_PROG_INSTALL])dnl + AC_REQUIRE([AM_MKINSTALLDIRS])dnl + AC_REQUIRE([AM_NLS])dnl + + dnl Perform the following tests also if --disable-nls has been given, + dnl because they are needed for "make dist" to work. + + dnl Search for GNU msgfmt in the PATH. + dnl The first test excludes Solaris msgfmt and early GNU msgfmt versions. + dnl The second test excludes FreeBSD msgfmt. + AM_PATH_PROG_WITH_TEST(MSGFMT, msgfmt, + [$ac_dir/$ac_word --statistics /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + AC_PATH_PROG(GMSGFMT, gmsgfmt, $MSGFMT) + + dnl Search for GNU xgettext 0.12 or newer in the PATH. + dnl The first test excludes Solaris xgettext and early GNU xgettext versions. + dnl The second test excludes FreeBSD xgettext. + AM_PATH_PROG_WITH_TEST(XGETTEXT, xgettext, + [$ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 && + (if $ac_dir/$ac_word --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi)], + :) + dnl Remove leftover from FreeBSD xgettext call. + rm -f messages.po + + dnl Search for GNU msgmerge 0.11 or newer in the PATH. + AM_PATH_PROG_WITH_TEST(MSGMERGE, msgmerge, + [$ac_dir/$ac_word --update -q /dev/null /dev/null >/dev/null 2>&1], :) + + dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. + dnl Test whether we really found GNU msgfmt. + if test "$GMSGFMT" != ":"; then + dnl If it is no GNU msgfmt we define it as : so that the + dnl Makefiles still can work. + if $GMSGFMT --statistics /dev/null >/dev/null 2>&1 && + (if $GMSGFMT --statistics /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + GMSGFMT=`echo "$GMSGFMT" | sed -e 's,^.*/,,'` + AC_MSG_RESULT( + [found $GMSGFMT program is not GNU msgfmt; ignore it]) + GMSGFMT=":" + fi + fi + + dnl This could go away some day; the PATH_PROG_WITH_TEST already does it. + dnl Test whether we really found GNU xgettext. + if test "$XGETTEXT" != ":"; then + dnl If it is no GNU xgettext we define it as : so that the + dnl Makefiles still can work. + if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null >/dev/null 2>&1 && + (if $XGETTEXT --omit-header --copyright-holder= --msgid-bugs-address= /dev/null 2>&1 >/dev/null | grep usage >/dev/null; then exit 1; else exit 0; fi); then + : ; + else + AC_MSG_RESULT( + [found xgettext program is not GNU xgettext; ignore it]) + XGETTEXT=":" + fi + dnl Remove leftover from FreeBSD xgettext call. + rm -f messages.po + fi + + AC_OUTPUT_COMMANDS([ + for ac_file in $CONFIG_FILES; do + # Support "outfile[:infile[:infile...]]" + case "$ac_file" in + *:*) ac_file=`echo "$ac_file"|sed 's%:.*%%'` ;; + esac + # PO directories have a Makefile.in generated from Makefile.in.in. + case "$ac_file" in */Makefile.in) + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + if test -f "$ac_given_srcdir/$ac_dir/POTFILES.in"; then + rm -f "$ac_dir/POTFILES" + test -n "$as_me" && echo "$as_me: creating $ac_dir/POTFILES" || echo "creating $ac_dir/POTFILES" + cat "$ac_given_srcdir/$ac_dir/POTFILES.in" | sed -e "/^#/d" -e "/^[ ]*\$/d" -e "s,.*, $top_srcdir/& \\\\," | sed -e "\$s/\(.*\) \\\\/\1/" > "$ac_dir/POTFILES" + POMAKEFILEDEPS="POTFILES.in" + # ALL_LINGUAS, POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES depend + # on $ac_dir but don't depend on user-specified configuration + # parameters. + if test -f "$ac_given_srcdir/$ac_dir/LINGUAS"; then + # The LINGUAS file contains the set of available languages. + if test -n "$OBSOLETE_ALL_LINGUAS"; then + test -n "$as_me" && echo "$as_me: setting ALL_LINGUAS in configure.in is obsolete" || echo "setting ALL_LINGUAS in configure.in is obsolete" + fi + ALL_LINGUAS_=`sed -e "/^#/d" "$ac_given_srcdir/$ac_dir/LINGUAS"` + # Hide the ALL_LINGUAS assigment from automake. + eval 'ALL_LINGUAS''=$ALL_LINGUAS_' + POMAKEFILEDEPS="$POMAKEFILEDEPS LINGUAS" + else + # The set of available languages was given in configure.in. + eval 'ALL_LINGUAS''=$OBSOLETE_ALL_LINGUAS' + fi + # Compute POFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).po) + # Compute UPDATEPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).po-update) + # Compute DUMMYPOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(lang).nop) + # Compute GMOFILES + # as $(foreach lang, $(ALL_LINGUAS), $(srcdir)/$(lang).gmo) + case "$ac_given_srcdir" in + .) srcdirpre= ;; + *) srcdirpre='$(srcdir)/' ;; + esac + POFILES= + UPDATEPOFILES= + DUMMYPOFILES= + GMOFILES= + for lang in $ALL_LINGUAS; do + POFILES="$POFILES $srcdirpre$lang.po" + UPDATEPOFILES="$UPDATEPOFILES $lang.po-update" + DUMMYPOFILES="$DUMMYPOFILES $lang.nop" + GMOFILES="$GMOFILES $srcdirpre$lang.gmo" + done + # CATALOGS depends on both $ac_dir and the user's LINGUAS + # environment variable. + INST_LINGUAS= + if test -n "$ALL_LINGUAS"; then + for presentlang in $ALL_LINGUAS; do + useit=no + if test "%UNSET%" != "$LINGUAS"; then + desiredlanguages="$LINGUAS" + else + desiredlanguages="$ALL_LINGUAS" + fi + for desiredlang in $desiredlanguages; do + # Use the presentlang catalog if desiredlang is + # a. equal to presentlang, or + # b. a variant of presentlang (because in this case, + # presentlang can be used as a fallback for messages + # which are not translated in the desiredlang catalog). + case "$desiredlang" in + "$presentlang"*) useit=yes;; + esac + done + if test $useit = yes; then + INST_LINGUAS="$INST_LINGUAS $presentlang" + fi + done + fi + CATALOGS= + if test -n "$INST_LINGUAS"; then + for lang in $INST_LINGUAS; do + CATALOGS="$CATALOGS $lang.gmo" + done + fi + test -n "$as_me" && echo "$as_me: creating $ac_dir/Makefile" || echo "creating $ac_dir/Makefile" + sed -e "/^POTFILES =/r $ac_dir/POTFILES" -e "/^# Makevars/r $ac_given_srcdir/$ac_dir/Makevars" -e "s|@POFILES@|$POFILES|g" -e "s|@UPDATEPOFILES@|$UPDATEPOFILES|g" -e "s|@DUMMYPOFILES@|$DUMMYPOFILES|g" -e "s|@GMOFILES@|$GMOFILES|g" -e "s|@CATALOGS@|$CATALOGS|g" -e "s|@POMAKEFILEDEPS@|$POMAKEFILEDEPS|g" "$ac_dir/Makefile.in" > "$ac_dir/Makefile" + for f in "$ac_given_srcdir/$ac_dir"/Rules-*; do + if test -f "$f"; then + case "$f" in + *.orig | *.bak | *~) ;; + *) cat "$f" >> "$ac_dir/Makefile" ;; + esac + fi + done + fi + ;; + esac + done], + [# Capture the value of obsolete ALL_LINGUAS because we need it to compute + # POFILES, UPDATEPOFILES, DUMMYPOFILES, GMOFILES, CATALOGS. But hide it + # from automake. + eval 'OBSOLETE_ALL_LINGUAS''="$ALL_LINGUAS"' + # Capture the value of LINGUAS because we need it to compute CATALOGS. + LINGUAS="${LINGUAS-%UNSET%}" + ]) +]) + +dnl Postprocesses a Makefile in a directory containing PO files. +AC_DEFUN([AM_POSTPROCESS_PO_MAKEFILE], +[ + # When this code is run, in config.status, two variables have already been + # set: + # - OBSOLETE_ALL_LINGUAS is the value of LINGUAS set in configure.in, + # - LINGUAS is the value of the environment variable LINGUAS at configure + # time. + +changequote(,)dnl + # Adjust a relative srcdir. + ac_dir=`echo "$ac_file"|sed 's%/[^/][^/]*$%%'` + ac_dir_suffix="/`echo "$ac_dir"|sed 's%^\./%%'`" + ac_dots=`echo "$ac_dir_suffix"|sed 's%/[^/]*%../%g'` + # In autoconf-2.13 it is called $ac_given_srcdir. + # In autoconf-2.50 it is called $srcdir. + test -n "$ac_given_srcdir" || ac_given_srcdir="$srcdir" + case "$ac_given_srcdir" in + .) top_srcdir=`echo $ac_dots|sed 's%/$%%'` ;; + /*) top_srcdir="$ac_given_srcdir" ;; + *) top_srcdir="$ac_dots$ac_given_srcdir" ;; + esac + + # Find a way to echo strings without interpreting backslash. + if test "X`(echo '\t') 2>/dev/null`" = 'X\t'; then + gt_echo='echo' + else + if test "X`(printf '%s\n' '\t') 2>/dev/null`" = 'X\t'; then + gt_echo='printf %s\n' + else + echo_func () { + cat < "$ac_file.tmp" + if grep -l '@TCLCATALOGS@' "$ac_file" > /dev/null; then + # Add dependencies that cannot be formulated as a simple suffix rule. + for lang in $ALL_LINGUAS; do + frobbedlang=`echo $lang | sed -e 's/\..*$//' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefghijklmnopqrstuvwxyz/'` + cat >> "$ac_file.tmp" < /dev/null; then + # Add dependencies that cannot be formulated as a simple suffix rule. + for lang in $ALL_LINGUAS; do + frobbedlang=`echo $lang | sed -e 's/_/-/g'` + cat >> "$ac_file.tmp" <> "$ac_file.tmp" <, 1996. + +# Search path for a program which passes the given test. + +dnl AM_PATH_PROG_WITH_TEST(VARIABLE, PROG-TO-CHECK-FOR, +dnl TEST-PERFORMED-ON-FOUND_PROGRAM [, VALUE-IF-NOT-FOUND [, PATH]]) +AC_DEFUN([AM_PATH_PROG_WITH_TEST], +[ +# Prepare PATH_SEPARATOR. +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + +# Find out how to test for executable files. Don't use a zero-byte file, +# as systems may use methods other than mode bits to determine executability. +cat >conf$$.file <<_ASEOF +#! /bin/sh +exit 0 +_ASEOF +chmod +x conf$$.file +if test -x conf$$.file >/dev/null 2>&1; then + ac_executable_p="test -x" +else + ac_executable_p="test -f" +fi +rm -f conf$$.file + +# Extract the first word of "$2", so it can be a program name with args. +set dummy $2; ac_word=[$]2 +AC_MSG_CHECKING([for $ac_word]) +AC_CACHE_VAL(ac_cv_path_$1, +[case "[$]$1" in + [[\\/]]* | ?:[[\\/]]*) + ac_cv_path_$1="[$]$1" # Let the user override the test with a path. + ;; + *) + ac_save_IFS="$IFS"; IFS=$PATH_SEPARATOR + for ac_dir in ifelse([$5], , $PATH, [$5]); do + IFS="$ac_save_IFS" + test -z "$ac_dir" && ac_dir=. + for ac_exec_ext in '' $ac_executable_extensions; do + if $ac_executable_p "$ac_dir/$ac_word$ac_exec_ext"; then + if [$3]; then + ac_cv_path_$1="$ac_dir/$ac_word$ac_exec_ext" + break 2 + fi + fi + done + done + IFS="$ac_save_IFS" +dnl If no 4th arg is given, leave the cache variable unset, +dnl so AC_PATH_PROGS will keep looking. +ifelse([$4], , , [ test -z "[$]ac_cv_path_$1" && ac_cv_path_$1="$4" +])dnl + ;; +esac])dnl +$1="$ac_cv_path_$1" +if test ifelse([$4], , [-n "[$]$1"], ["[$]$1" != "$4"]); then + AC_MSG_RESULT([$]$1) +else + AC_MSG_RESULT(no) +fi +AC_SUBST($1)dnl +]) diff --git a/src/apps/bin/bison/m4/quote.m4 b/src/apps/bin/bison/m4/quote.m4 new file mode 100644 index 0000000000..14ce1b6198 --- /dev/null +++ b/src/apps/bin/bison/m4/quote.m4 @@ -0,0 +1,13 @@ +# quote.m4 serial 2 +dnl Copyright (C) 2002, 2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +AC_DEFUN([gl_QUOTE], +[ + dnl Prerequisites of lib/quote.c. + dnl (none) +]) diff --git a/src/apps/bin/bison/m4/quotearg.m4 b/src/apps/bin/bison/m4/quotearg.m4 new file mode 100644 index 0000000000..aa4a3d1473 --- /dev/null +++ b/src/apps/bin/bison/m4/quotearg.m4 @@ -0,0 +1,16 @@ +# quotearg.m4 serial 2 +dnl Copyright (C) 2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +AC_DEFUN([gl_QUOTEARG], +[ + dnl Prerequisites of lib/quotearg.c. + AC_CHECK_HEADERS_ONCE(wchar.h wctype.h) + AC_CHECK_FUNCS_ONCE(iswprint mbsinit) + AC_TYPE_MBSTATE_T + gl_FUNC_MBRTOWC +]) diff --git a/src/apps/bin/bison/m4/stdbool.m4 b/src/apps/bin/bison/m4/stdbool.m4 new file mode 100644 index 0000000000..ed000c8163 --- /dev/null +++ b/src/apps/bin/bison/m4/stdbool.m4 @@ -0,0 +1,89 @@ +# Check for stdbool.h that conforms to C99. + +# Copyright (C) 2002-2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# Prepare for substituting if it is not supported. + +AC_DEFUN([AM_STDBOOL_H], +[ + AC_REQUIRE([AC_HEADER_STDBOOL]) + + # Define two additional variables used in the Makefile substitution. + + if test "$ac_cv_header_stdbool_h" = yes; then + STDBOOL_H='' + else + STDBOOL_H='stdbool.h' + fi + AC_SUBST([STDBOOL_H]) + + if test "$ac_cv_type__Bool" = yes; then + HAVE__BOOL=1 + else + HAVE__BOOL=0 + fi + AC_SUBST([HAVE__BOOL]) +]) + +# This macro is only needed in autoconf <= 2.54. Newer versions of autoconf +# have this macro built-in. + +AC_DEFUN([AC_HEADER_STDBOOL], + [AC_CACHE_CHECK([for stdbool.h that conforms to C99], + [ac_cv_header_stdbool_h], + [AC_TRY_COMPILE( + [ + #include + #ifndef bool + "error: bool is not defined" + #endif + #ifndef false + "error: false is not defined" + #endif + #if false + "error: false is not 0" + #endif + #ifndef true + "error: false is not defined" + #endif + #if true != 1 + "error: true is not 1" + #endif + #ifndef __bool_true_false_are_defined + "error: __bool_true_false_are_defined is not defined" + #endif + + struct s { _Bool s: 1; _Bool t; } s; + + char a[true == 1 ? 1 : -1]; + char b[false == 0 ? 1 : -1]; + char c[__bool_true_false_are_defined == 1 ? 1 : -1]; + char d[(bool) -0.5 == true ? 1 : -1]; + bool e = &s; + char f[(_Bool) -0.0 == false ? 1 : -1]; + char g[true]; + char h[sizeof (_Bool)]; + char i[sizeof s.t]; + ], + [ return !a + !b + !c + !d + !e + !f + !g + !h + !i; ], + [ac_cv_header_stdbool_h=yes], + [ac_cv_header_stdbool_h=no])]) + AC_CHECK_TYPES([_Bool]) + if test $ac_cv_header_stdbool_h = yes; then + AC_DEFINE(HAVE_STDBOOL_H, 1, [Define to 1 if stdbool.h conforms to C99.]) + fi]) diff --git a/src/apps/bin/bison/m4/stpcpy.m4 b/src/apps/bin/bison/m4/stpcpy.m4 new file mode 100644 index 0000000000..b3282661b2 --- /dev/null +++ b/src/apps/bin/bison/m4/stpcpy.m4 @@ -0,0 +1,24 @@ +# stpcpy.m4 serial 1 +dnl Copyright (C) 2002 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +AC_DEFUN([gl_FUNC_STPCPY], +[ + dnl Persuade glibc to declare stpcpy(). + AC_REQUIRE([AC_GNU_SOURCE]) + + AC_REPLACE_FUNCS(stpcpy) + if test $ac_cv_func_stpcpy = no; then + gl_PREREQ_STPCPY + fi +]) + +# Prerequisites of lib/stpcpy.c. +AC_DEFUN([gl_PREREQ_STPCPY], [ + : +]) + diff --git a/src/apps/bin/bison/m4/strndup.m4 b/src/apps/bin/bison/m4/strndup.m4 new file mode 100644 index 0000000000..80dfcc1d90 --- /dev/null +++ b/src/apps/bin/bison/m4/strndup.m4 @@ -0,0 +1,24 @@ +# strndup.m4 serial 2 +dnl Copyright (C) 2002, 2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +AC_DEFUN([gl_FUNC_STRNDUP], +[ + dnl Persuade glibc to declare strndup(). + AC_REQUIRE([AC_GNU_SOURCE]) + + AC_REPLACE_FUNCS(strndup) + if test $ac_cv_func_strndup = no; then + gl_PREREQ_STRNDUP + fi +]) + +# Prerequisites of lib/strndup.c. +AC_DEFUN([gl_PREREQ_STRNDUP], [ + AC_CHECK_DECLS(strnlen) +]) + diff --git a/src/apps/bin/bison/m4/strnlen.m4 b/src/apps/bin/bison/m4/strnlen.m4 new file mode 100644 index 0000000000..989ff49f75 --- /dev/null +++ b/src/apps/bin/bison/m4/strnlen.m4 @@ -0,0 +1,27 @@ +# strnlen.m4 serial 3 +dnl Copyright (C) 2002-2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +AC_DEFUN([gl_FUNC_STRNLEN], +[ + dnl Persuade glibc to declare strnlen(). + AC_REQUIRE([AC_GNU_SOURCE]) + + AC_FUNC_STRNLEN + if test $ac_cv_func_strnlen_working = no; then + # This is necessary because automake-1.6.1 doens't understand + # that the above use of AC_FUNC_STRNLEN means we may have to use + # lib/strnlen.c. + #AC_LIBOBJ(strnlen) + AC_DEFINE(strnlen, rpl_strnlen, + [Define to rpl_strnlen if the replacement function should be used.]) + gl_PREREQ_STRNLEN + fi +]) + +# Prerequisites of lib/strnlen.c. +AC_DEFUN([gl_PREREQ_STRNLEN], [:]) diff --git a/src/apps/bin/bison/m4/subpipe.m4 b/src/apps/bin/bison/m4/subpipe.m4 new file mode 100644 index 0000000000..5d6a8c4a07 --- /dev/null +++ b/src/apps/bin/bison/m4/subpipe.m4 @@ -0,0 +1,30 @@ +# -*- Autoconf -*- +# Checks required to run `subpipe'. +# +# Copyright (C) 2002, 2003 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +# 02111-1307 USA + +# Written by Paul Eggert . + +AC_DEFUN([BISON_PREREQ_SUBPIPE], +[ + AC_TYPE_PID_T + AC_CHECK_HEADERS([fcntl.h]) + AC_HEADER_SYS_WAIT + AC_CHECK_FUNCS(dup2 waitpid) + AC_FUNC_FORK +]) diff --git a/src/apps/bin/bison/m4/timevar.m4 b/src/apps/bin/bison/m4/timevar.m4 new file mode 100644 index 0000000000..e755173f5e --- /dev/null +++ b/src/apps/bin/bison/m4/timevar.m4 @@ -0,0 +1,61 @@ +# -*- Autoconf -*- +# Checks required to run `timevar', a time tracker. +# +# Copyright (C) 2002, 2003 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +# 02111-1307 USA + +# serial 2 + +AC_DEFUN([BISON_PREREQ_TIMEVAR], +[AC_CHECK_HEADERS([sys/time.h sys/times.h]) + AC_CHECK_HEADERS([sys/resource.h],,, + [$ac_includes_default +#if HAVE_SYS_TIME_H +# include +#endif +#ifdef HAVE_SYS_TIMES_H +# include +#endif +]) +AC_CHECK_FUNCS([times]) + +AC_CHECK_DECLS([getrusage, times, clock, sysconf], [], [], +[$ac_includes_default +#if HAVE_SYS_TIME_H +# include +#endif +#if HAVE_SYS_TIMES_H +# include +#endif +#if HAVE_SYS_RESOURCE_H +# include +#endif +]) + +AC_CHECK_TYPES([clock_t, struct tms], [], [], +[$ac_includes_default +#if HAVE_SYS_TIME_H +# include +#endif +#if HAVE_SYS_TIMES_H +# include +#endif +#if HAVE_SYS_RESOURCE_H +# include +#endif +]) +]) diff --git a/src/apps/bin/bison/m4/unlocked-io.m4 b/src/apps/bin/bison/m4/unlocked-io.m4 new file mode 100644 index 0000000000..cd1c5f4ef7 --- /dev/null +++ b/src/apps/bin/bison/m4/unlocked-io.m4 @@ -0,0 +1,22 @@ +#serial 9 + +dnl From Jim Meyering. +dnl +dnl See if the glibc *_unlocked I/O macros or functions are available. +dnl Use only those *_unlocked macros or functions that are declared +dnl (because some of them were declared in Solaris 2.5.1 but were removed +dnl in Solaris 2.6, whereas we want binaries built on Solaris 2.5.1 to run +dnl on Solaris 2.6). + +AC_DEFUN([gl_FUNC_GLIBC_UNLOCKED_IO], +[ + dnl Persuade glibc and Solaris to declare + dnl fgets_unlocked(), fputs_unlocked() etc. + AC_REQUIRE([gl_USE_SYSTEM_EXTENSIONS]) + + AC_CHECK_DECLS_ONCE( + [clearerr_unlocked feof_unlocked ferror_unlocked + fflush_unlocked fgets_unlocked fputc_unlocked fputs_unlocked + fread_unlocked fwrite_unlocked getc_unlocked + getchar_unlocked putc_unlocked putchar_unlocked]) +]) diff --git a/src/apps/bin/bison/m4/warning.m4 b/src/apps/bin/bison/m4/warning.m4 new file mode 100644 index 0000000000..c57260f738 --- /dev/null +++ b/src/apps/bin/bison/m4/warning.m4 @@ -0,0 +1,32 @@ +# Finding valid warning flags for the C Compiler. -*-Autoconf-*- +# +# Copyright (C) 2001, 2002 Free Software Foundation, Inc. +# +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +# 02111-1307 USA + +# serial 1 + +AC_DEFUN([BISON_WARNING], +[AC_MSG_CHECKING(whether compiler accepts $1) +AC_SUBST(WARNING_CFLAGS) +ac_save_CFLAGS="$CFLAGS" +CFLAGS="$CFLAGS $1" +AC_TRY_COMPILE(, +[int x;], +WARNING_CFLAGS="$WARNING_CFLAGS $1" +AC_MSG_RESULT(yes), +AC_MSG_RESULT(no)) +CFLAGS="$ac_save_CFLAGS"]) diff --git a/src/apps/bin/bison/m4/xalloc.m4 b/src/apps/bin/bison/m4/xalloc.m4 new file mode 100644 index 0000000000..f3d3790074 --- /dev/null +++ b/src/apps/bin/bison/m4/xalloc.m4 @@ -0,0 +1,32 @@ +# xalloc.m4 serial 8 +dnl Copyright (C) 2002-2004 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +AC_DEFUN([gl_XALLOC], +[ + gl_PREREQ_XALLOC + gl_PREREQ_XMALLOC + gl_PREREQ_XSTRDUP +]) + +# Prerequisites of lib/xalloc.h. +AC_DEFUN([gl_PREREQ_XALLOC], [ + : +]) + +# Prerequisites of lib/xmalloc.c. +AC_DEFUN([gl_PREREQ_XMALLOC], [ + AC_REQUIRE([AC_C_INLINE]) + AC_REQUIRE([AC_FUNC_MALLOC]) + AC_REQUIRE([AC_FUNC_REALLOC]) + : +]) + +# Prerequisites of lib/xstrdup.c. +AC_DEFUN([gl_PREREQ_XSTRDUP], [ + : +]) diff --git a/src/apps/bin/bison/m4/xstrndup.m4 b/src/apps/bin/bison/m4/xstrndup.m4 new file mode 100644 index 0000000000..87c0ab8cb1 --- /dev/null +++ b/src/apps/bin/bison/m4/xstrndup.m4 @@ -0,0 +1,17 @@ +# xstrndup.m4 serial 1 +dnl Copyright (C) 2003 Free Software Foundation, Inc. +dnl This file is free software, distributed under the terms of the GNU +dnl General Public License. As a special exception to the GNU General +dnl Public License, this file may be distributed as part of a program +dnl that contains a configuration script generated by Autoconf, under +dnl the same distribution terms as the rest of that program. + +AC_DEFUN([gl_XSTRNDUP], +[ + gl_PREREQ_XSTRNDUP +]) + +# Prerequisites of lib/xstrndup.c. +AC_DEFUN([gl_PREREQ_XSTRNDUP], [ + : +]) diff --git a/src/apps/bin/bison/po/LINGUAS b/src/apps/bin/bison/po/LINGUAS new file mode 100644 index 0000000000..5e5aec3c49 --- /dev/null +++ b/src/apps/bin/bison/po/LINGUAS @@ -0,0 +1,16 @@ +da +de +es +et +fr +hr +id +it +ja +ms +nl +pt_BR +ro +ru +sv +tr diff --git a/src/apps/bin/bison/po/Makefile.in.in b/src/apps/bin/bison/po/Makefile.in.in new file mode 100644 index 0000000000..fe173892cf --- /dev/null +++ b/src/apps/bin/bison/po/Makefile.in.in @@ -0,0 +1,367 @@ +top_builddir=@top_builddir@ +# Makefile for PO directory in any package using GNU gettext. +# Copyright (C) 1995-1997, 2000-2004 by Ulrich Drepper +# +# This file can be copied and used freely without restrictions. It can +# be used in projects which are not available under the GNU General Public +# License but which still want to provide support for the GNU gettext +# functionality. +# Please note that the actual code of GNU gettext is covered by the GNU +# General Public License and is *not* in the public domain. +# +# Origin: gettext-0.14 + +PACKAGE = @PACKAGE@ +VERSION = @VERSION@ + +SHELL = /bin/sh +@SET_MAKE@ + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ + +prefix = @prefix@ +exec_prefix = @exec_prefix@ +datadir = @datadir@ +localedir = $(datadir)/locale +gettextsrcdir = $(datadir)/gettext/po + +INSTALL = @INSTALL@ +INSTALL_DATA = @INSTALL_DATA@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +mkinstalldirs = $(SHELL) $(MKINSTALLDIRS) + +GMSGFMT = @GMSGFMT@ +MSGFMT = @MSGFMT@ +XGETTEXT = @XGETTEXT@ +MSGMERGE = msgmerge +MSGMERGE_UPDATE = @MSGMERGE@ --update +MSGINIT = msginit +MSGCONV = msgconv +MSGFILTER = msgfilter + +POFILES = @POFILES@ +GMOFILES = @GMOFILES@ +UPDATEPOFILES = @UPDATEPOFILES@ +DUMMYPOFILES = @DUMMYPOFILES@ +DISTFILES.common = Makefile.in.in remove-potcdate.sin \ +$(DISTFILES.common.extra1) $(DISTFILES.common.extra2) $(DISTFILES.common.extra3) +DISTFILES = $(DISTFILES.common) Makevars POTFILES.in $(DOMAIN).pot stamp-po \ +$(POFILES) $(GMOFILES) \ +$(DISTFILES.extra1) $(DISTFILES.extra2) $(DISTFILES.extra3) + +POTFILES = \ + +CATALOGS = @CATALOGS@ + +# Makevars gets inserted here. (Don't remove this line!) + +.SUFFIXES: +.SUFFIXES: .po .gmo .mo .sed .sin .nop .po-create .po-update + +.po.mo: + @echo "$(MSGFMT) -c -o $@ $<"; \ + $(MSGFMT) -c -o t-$@ $< && mv t-$@ $@ + +.po.gmo: + @lang=`echo $* | sed -e 's,.*/,,'`; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o $${lang}.gmo $${lang}.po"; \ + cd $(srcdir) && rm -f $${lang}.gmo && $(GMSGFMT) -c --statistics -o t-$${lang}.gmo $${lang}.po && mv t-$${lang}.gmo $${lang}.gmo + +.sin.sed: + sed -e '/^#/d' $< > t-$@ + mv t-$@ $@ + + +all: all-@USE_NLS@ + +all-yes: stamp-po +all-no: + +# stamp-po is a timestamp denoting the last time at which the CATALOGS have +# been loosely updated. Its purpose is that when a developer or translator +# checks out the package via CVS, and the $(DOMAIN).pot file is not in CVS, +# "make" will update the $(DOMAIN).pot and the $(CATALOGS), but subsequent +# invocations of "make" will do nothing. This timestamp would not be necessary +# if updating the $(CATALOGS) would always touch them; however, the rule for +# $(POFILES) has been designed to not touch files that don't need to be +# changed. +stamp-po: $(srcdir)/$(DOMAIN).pot + test -z "$(GMOFILES)" || $(MAKE) $(GMOFILES) + @echo "touch stamp-po" + @echo timestamp > stamp-poT + @mv stamp-poT stamp-po + +# Note: Target 'all' must not depend on target '$(DOMAIN).pot-update', +# otherwise packages like GCC can not be built if only parts of the source +# have been downloaded. + +# This target rebuilds $(DOMAIN).pot; it is an expensive operation. +# Note that $(DOMAIN).pot is not touched if it doesn't need to be changed. +$(DOMAIN).pot-update: $(POTFILES) $(srcdir)/POTFILES.in remove-potcdate.sed + $(XGETTEXT) --default-domain=$(DOMAIN) --directory=$(top_srcdir) \ + --add-comments=TRANSLATORS: $(XGETTEXT_OPTIONS) \ + --files-from=$(srcdir)/POTFILES.in \ + --copyright-holder='$(COPYRIGHT_HOLDER)' \ + --msgid-bugs-address='$(MSGID_BUGS_ADDRESS)' + test ! -f $(DOMAIN).po || { \ + if test -f $(srcdir)/$(DOMAIN).pot; then \ + sed -f remove-potcdate.sed < $(srcdir)/$(DOMAIN).pot > $(DOMAIN).1po && \ + sed -f remove-potcdate.sed < $(DOMAIN).po > $(DOMAIN).2po && \ + if cmp $(DOMAIN).1po $(DOMAIN).2po >/dev/null 2>&1; then \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(DOMAIN).po; \ + else \ + rm -f $(DOMAIN).1po $(DOMAIN).2po $(srcdir)/$(DOMAIN).pot && \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + else \ + mv $(DOMAIN).po $(srcdir)/$(DOMAIN).pot; \ + fi; \ + } + +# This rule has no dependencies: we don't need to update $(DOMAIN).pot at +# every "make" invocation, only create it when it is missing. +# Only "make $(DOMAIN).pot-update" or "make dist" will force an update. +$(srcdir)/$(DOMAIN).pot: + $(MAKE) $(DOMAIN).pot-update + +# This target rebuilds a PO file if $(DOMAIN).pot has changed. +# Note that a PO file is not touched if it doesn't need to be changed. +$(POFILES): $(srcdir)/$(DOMAIN).pot + @lang=`echo $@ | sed -e 's,.*/,,' -e 's/\.po$$//'`; \ + if test -f "$(srcdir)/$${lang}.po"; then \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot"; \ + cd $(srcdir) && $(MSGMERGE_UPDATE) $${lang}.po $(DOMAIN).pot; \ + else \ + $(MAKE) $${lang}.po-create; \ + fi + + +install: install-exec install-data +install-exec: +install-data: install-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext-tools"; then \ + $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ + for file in $(DISTFILES.common) Makevars.template; do \ + $(INSTALL_DATA) $(srcdir)/$$file \ + $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + for file in Makevars; do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi +install-data-no: all +install-data-yes: all + $(mkinstalldirs) $(DESTDIR)$(datadir) + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkinstalldirs) $(DESTDIR)$$dir; \ + if test -r $$cat; then realcat=$$cat; else realcat=$(srcdir)/$$cat; fi; \ + $(INSTALL_DATA) $$realcat $(DESTDIR)$$dir/$(DOMAIN).mo; \ + echo "installing $$realcat as $(DESTDIR)$$dir/$(DOMAIN).mo"; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + ln -s ../LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + ln $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo 2>/dev/null || \ + cp -p $(DESTDIR)$(localedir)/$$lang/LC_MESSAGES/$(DOMAIN).mo $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + echo "installing $$realcat link as $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo"; \ + fi; \ + done; \ + done + +install-strip: install + +installdirs: installdirs-exec installdirs-data +installdirs-exec: +installdirs-data: installdirs-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext-tools"; then \ + $(mkinstalldirs) $(DESTDIR)$(gettextsrcdir); \ + else \ + : ; \ + fi +installdirs-data-no: +installdirs-data-yes: + $(mkinstalldirs) $(DESTDIR)$(datadir) + @catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + dir=$(localedir)/$$lang/LC_MESSAGES; \ + $(mkinstalldirs) $(DESTDIR)$$dir; \ + for lc in '' $(EXTRA_LOCALE_CATEGORIES); do \ + if test -n "$$lc"; then \ + if (cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc 2>/dev/null) | grep ' -> ' >/dev/null; then \ + link=`cd $(DESTDIR)$(localedir)/$$lang && LC_ALL=C ls -l -d $$lc | sed -e 's/^.* -> //'`; \ + mv $(DESTDIR)$(localedir)/$$lang/$$lc $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + (cd $(DESTDIR)$(localedir)/$$lang/$$lc.old && \ + for file in *; do \ + if test -f $$file; then \ + ln -s ../$$link/$$file $(DESTDIR)$(localedir)/$$lang/$$lc/$$file; \ + fi; \ + done); \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc.old; \ + else \ + if test -d $(DESTDIR)$(localedir)/$$lang/$$lc; then \ + :; \ + else \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc; \ + mkdir $(DESTDIR)$(localedir)/$$lang/$$lc; \ + fi; \ + fi; \ + fi; \ + done; \ + done + +# Define this as empty until I found a useful application. +installcheck: + +uninstall: uninstall-exec uninstall-data +uninstall-exec: +uninstall-data: uninstall-data-@USE_NLS@ + if test "$(PACKAGE)" = "gettext-tools"; then \ + for file in $(DISTFILES.common) Makevars.template; do \ + rm -f $(DESTDIR)$(gettextsrcdir)/$$file; \ + done; \ + else \ + : ; \ + fi +uninstall-data-no: +uninstall-data-yes: + catalogs='$(CATALOGS)'; \ + for cat in $$catalogs; do \ + cat=`basename $$cat`; \ + lang=`echo $$cat | sed -e 's/\.gmo$$//'`; \ + for lc in LC_MESSAGES $(EXTRA_LOCALE_CATEGORIES); do \ + rm -f $(DESTDIR)$(localedir)/$$lang/$$lc/$(DOMAIN).mo; \ + done; \ + done + +check: all + +info dvi ps pdf html tags TAGS ctags CTAGS ID: + +mostlyclean: + rm -f remove-potcdate.sed + rm -f stamp-poT + rm -f core core.* $(DOMAIN).po $(DOMAIN).1po $(DOMAIN).2po *.new.po + rm -fr *.o + +clean: mostlyclean + +distclean: clean + rm -f Makefile Makefile.in POTFILES *.mo + +maintainer-clean: distclean + @echo "This command is intended for maintainers to use;" + @echo "it deletes files that may require special tools to rebuild." + rm -f stamp-po $(GMOFILES) + +distdir = $(top_builddir)/$(PACKAGE)-$(VERSION)/$(subdir) +dist distdir: + $(MAKE) update-po + @$(MAKE) dist2 +# This is a separate target because 'update-po' must be executed before. +dist2: $(DISTFILES) + dists="$(DISTFILES)"; \ + if test "$(PACKAGE)" = "gettext-tools"; then \ + dists="$$dists Makevars.template"; \ + fi; \ + if test -f $(srcdir)/ChangeLog; then \ + dists="$$dists ChangeLog"; \ + fi; \ + for i in 0 1 2 3 4 5 6 7 8 9; do \ + if test -f $(srcdir)/ChangeLog.$$i; then \ + dists="$$dists ChangeLog.$$i"; \ + fi; \ + done; \ + if test -f $(srcdir)/LINGUAS; then dists="$$dists LINGUAS"; fi; \ + for file in $$dists; do \ + if test -f $$file; then \ + cp -p $$file $(distdir); \ + else \ + cp -p $(srcdir)/$$file $(distdir); \ + fi; \ + done + +update-po: Makefile + $(MAKE) $(DOMAIN).pot-update + test -z "$(UPDATEPOFILES)" || $(MAKE) $(UPDATEPOFILES) + $(MAKE) update-gmo + +# General rule for creating PO files. + +.nop.po-create: + @lang=`echo $@ | sed -e 's/\.po-create$$//'`; \ + echo "File $$lang.po does not exist. If you are a translator, you can create it through 'msginit'." 1>&2; \ + exit 1 + +# General rule for updating PO files. + +.nop.po-update: + @lang=`echo $@ | sed -e 's/\.po-update$$//'`; \ + if test "$(PACKAGE)" = "gettext-tools"; then PATH=`pwd`/../src:$$PATH; fi; \ + tmpdir=`pwd`; \ + echo "$$lang:"; \ + test "$(srcdir)" = . && cdcmd="" || cdcmd="cd $(srcdir) && "; \ + echo "$${cdcmd}$(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$lang.new.po"; \ + cd $(srcdir); \ + if $(MSGMERGE) $$lang.po $(DOMAIN).pot -o $$tmpdir/$$lang.new.po; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "msgmerge for $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "msgmerge for $$lang.po failed!" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi + +$(DUMMYPOFILES): + +update-gmo: Makefile $(GMOFILES) + @: + +Makefile: Makefile.in.in $(top_builddir)/config.status @POMAKEFILEDEPS@ + cd $(top_builddir) \ + && CONFIG_FILES=$(subdir)/$@.in CONFIG_HEADERS= \ + $(SHELL) ./config.status + +force: + +# Tell versions [3.59,3.63) of GNU make not to export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/apps/bin/bison/po/Makevars b/src/apps/bin/bison/po/Makevars new file mode 100644 index 0000000000..4fad030846 --- /dev/null +++ b/src/apps/bin/bison/po/Makevars @@ -0,0 +1,41 @@ +# Makefile variables for PO directory in any package using GNU gettext. + +# Usually the message domain is the same as the package name. +DOMAIN = $(PACKAGE) + +# These two variables depend on the location of this directory. +subdir = po +top_builddir = .. + +# These options get passed to xgettext. +XGETTEXT_OPTIONS = --keyword=_ --keyword=N_ + +# This is the copyright holder that gets inserted into the header of the +# $(DOMAIN).pot file. Set this to the copyright holder of the surrounding +# package. (Note that the msgstr strings, extracted from the package's +# sources, belong to the copyright holder of the package.) Translators are +# expected to transfer the copyright for their translations to this person +# or entity, or to disclaim their copyright. The empty string stands for +# the public domain; in this case the translators are expected to disclaim +# their copyright. +COPYRIGHT_HOLDER = Free Software Foundation, Inc. + +# This is the email address or URL to which the translators shall report +# bugs in the untranslated strings: +# - Strings which are not entire sentences, see the maintainer guidelines +# in the GNU gettext documentation, section 'Preparing Strings'. +# - Strings which use unclear terms or require additional context to be +# understood. +# - Strings which make invalid assumptions about notation of date, time or +# money. +# - Pluralisation problems. +# - Incorrect English spelling. +# - Incorrect formatting. +# It can be your email address, or a mailing list address where translators +# can write to without being subscribed, or the URL of a web page through +# which the translators can contact you. +MSGID_BUGS_ADDRESS = bug-bison@gnu.org + +# This is the list of locale categories, beyond LC_MESSAGES, for which the +# message catalogs shall be used. It is usually empty. +EXTRA_LOCALE_CATEGORIES = diff --git a/src/apps/bin/bison/po/POTFILES.in b/src/apps/bin/bison/po/POTFILES.in new file mode 100644 index 0000000000..ea193b14e4 --- /dev/null +++ b/src/apps/bin/bison/po/POTFILES.in @@ -0,0 +1,23 @@ +src/complain.c +src/conflicts.c +src/files.c +src/getargs.c +src/gram.c +src/main.c +src/parse-gram.y +src/print.c +src/reader.c +src/reduce.c +src/scan-gram.l +src/symlist.c +src/symtab.c + +lib/argmatch.c +lib/bitset_stats.c +lib/error.c +lib/getopt.c +lib/obstack.c +lib/quotearg.c +lib/subpipe.c +lib/timevar.c +lib/xmalloc.c diff --git a/src/apps/bin/bison/po/Rules-quot b/src/apps/bin/bison/po/Rules-quot new file mode 100644 index 0000000000..9c2a995e30 --- /dev/null +++ b/src/apps/bin/bison/po/Rules-quot @@ -0,0 +1,47 @@ +# Special Makefile rules for English message catalogs with quotation marks. + +DISTFILES.common.extra1 = quot.sed boldquot.sed en@quot.header en@boldquot.header insert-header.sin Rules-quot + +.SUFFIXES: .insert-header .po-update-en + +en@quot.po-create: + $(MAKE) en@quot.po-update +en@boldquot.po-create: + $(MAKE) en@boldquot.po-update + +en@quot.po-update: en@quot.po-update-en +en@boldquot.po-update: en@boldquot.po-update-en + +.insert-header.po-update-en: + @lang=`echo $@ | sed -e 's/\.po-update-en$$//'`; \ + if test "$(PACKAGE)" = "gettext"; then PATH=`pwd`/../src:$$PATH; GETTEXTLIBDIR=`cd $(top_srcdir)/src && pwd`; export GETTEXTLIBDIR; fi; \ + tmpdir=`pwd`; \ + echo "$$lang:"; \ + ll=`echo $$lang | sed -e 's/@.*//'`; \ + LC_ALL=C; export LC_ALL; \ + cd $(srcdir); \ + if $(MSGINIT) -i $(DOMAIN).pot --no-translator -l $$ll -o - 2>/dev/null | sed -f $$tmpdir/$$lang.insert-header | $(MSGCONV) -t UTF-8 | $(MSGFILTER) sed -f `echo $$lang | sed -e 's/.*@//'`.sed 2>/dev/null > $$tmpdir/$$lang.new.po; then \ + if cmp $$lang.po $$tmpdir/$$lang.new.po >/dev/null 2>&1; then \ + rm -f $$tmpdir/$$lang.new.po; \ + else \ + if mv -f $$tmpdir/$$lang.new.po $$lang.po; then \ + :; \ + else \ + echo "creation of $$lang.po failed: cannot move $$tmpdir/$$lang.new.po to $$lang.po" 1>&2; \ + exit 1; \ + fi; \ + fi; \ + else \ + echo "creation of $$lang.po failed!" 1>&2; \ + rm -f $$tmpdir/$$lang.new.po; \ + fi + +en@quot.insert-header: insert-header.sin + sed -e '/^#/d' -e 's/HEADER/en@quot.header/g' $(srcdir)/insert-header.sin > en@quot.insert-header + +en@boldquot.insert-header: insert-header.sin + sed -e '/^#/d' -e 's/HEADER/en@boldquot.header/g' $(srcdir)/insert-header.sin > en@boldquot.insert-header + +mostlyclean: mostlyclean-quot +mostlyclean-quot: + rm -f *.insert-header diff --git a/src/apps/bin/bison/po/bison.pot b/src/apps/bin/bison/po/bison.pot new file mode 100644 index 0000000000..4ce1f0fb46 --- /dev/null +++ b/src/apps/bin/bison/po/bison.pot @@ -0,0 +1,698 @@ +# SOME DESCRIPTIVE TITLE. +# Copyright (C) YEAR Free Software Foundation, Inc. +# This file is distributed under the same license as the PACKAGE package. +# FIRST AUTHOR , YEAR. +# +#, fuzzy +msgid "" +msgstr "" +"Project-Id-Version: PACKAGE VERSION\n" +"Report-Msgid-Bugs-To: bug-bison@gnu.org\n" +"POT-Creation-Date: 2004-05-21 10:26-0700\n" +"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n" +"Last-Translator: FULL NAME \n" +"Language-Team: LANGUAGE \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=CHARSET\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n" + +#: src/complain.c:51 src/complain.c:66 +msgid "warning: " +msgstr "" + +#: src/complain.c:122 src/complain.c:138 +msgid "fatal error: " +msgstr "" + +#: src/conflicts.c:76 +#, c-format +msgid " Conflict between rule %d and token %s resolved as shift" +msgstr "" + +#: src/conflicts.c:84 +#, c-format +msgid " Conflict between rule %d and token %s resolved as reduce" +msgstr "" + +#: src/conflicts.c:91 +#, c-format +msgid " Conflict between rule %d and token %s resolved as an error" +msgstr "" + +#: src/conflicts.c:399 +#, c-format +msgid "conflicts: %d shift/reduce, %d reduce/reduce\n" +msgstr "" + +#: src/conflicts.c:402 +#, c-format +msgid "conflicts: %d shift/reduce\n" +msgstr "" + +#: src/conflicts.c:404 +#, c-format +msgid "conflicts: %d reduce/reduce\n" +msgstr "" + +#: src/conflicts.c:422 +#, c-format +msgid "State %d " +msgstr "" + +#: src/conflicts.c:487 +#, c-format +msgid "%%expect-rr applies only to GLR parsers" +msgstr "" + +#: src/conflicts.c:511 +#, c-format +msgid "expected %d shift/reduce conflict" +msgid_plural "expected %d shift/reduce conflicts" +msgstr[0] "" +msgstr[1] "" + +#: src/conflicts.c:515 +#, c-format +msgid "expected %d reduce/reduce conflict" +msgid_plural "expected %d reduce/reduce conflicts" +msgstr[0] "" +msgstr[1] "" + +#: src/files.c:100 +#, c-format +msgid "cannot open file `%s'" +msgstr "" + +#: src/files.c:116 +msgid "I/O error" +msgstr "" + +#: src/files.c:119 +msgid "cannot close file" +msgstr "" + +#: src/files.c:337 +#, c-format +msgid "conflicting outputs to file %s" +msgstr "" + +#: src/getargs.c:186 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "" + +#: src/getargs.c:192 +msgid "GNU bison generates parsers for LALR(1) grammars.\n" +msgstr "" + +#: src/getargs.c:196 +#, c-format +msgid "Usage: %s [OPTION]... FILE\n" +msgstr "" + +#: src/getargs.c:200 +msgid "" +"If a long option shows an argument as mandatory, then it is mandatory\n" +"for the equivalent short option also. Similarly for optional arguments.\n" +msgstr "" + +#: src/getargs.c:206 +msgid "" +"Operation modes:\n" +" -h, --help display this help and exit\n" +" -V, --version output version information and exit\n" +" -y, --yacc emulate POSIX yacc\n" +msgstr "" + +#: src/getargs.c:213 +msgid "" +"Parser:\n" +" -S, --skeleton=FILE specify the skeleton to use\n" +" -t, --debug instrument the parser for debugging\n" +" --locations enable locations computation\n" +" -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n" +" -l, --no-lines don't generate `#line' directives\n" +" -n, --no-parser generate the tables only\n" +" -k, --token-table include a table of token names\n" +msgstr "" + +#: src/getargs.c:225 +msgid "" +"Output:\n" +" -d, --defines also produce a header file\n" +" -r, --report=THINGS also produce details on the automaton\n" +" -v, --verbose same as `--report=state'\n" +" -b, --file-prefix=PREFIX specify a PREFIX for output files\n" +" -o, --output=FILE leave output to FILE\n" +" -g, --graph also produce a VCG description of the " +"automaton\n" +msgstr "" + +#: src/getargs.c:236 +msgid "" +"THINGS is a list of comma separated words that can include:\n" +" `state' describe the states\n" +" `itemset' complete the core item sets with their closure\n" +" `lookahead' explicitly associate lookaheads to items\n" +" `solved' describe shift/reduce conflicts solving\n" +" `all' include all the above information\n" +" `none' disable the report\n" +msgstr "" + +#: src/getargs.c:247 +msgid "Report bugs to .\n" +msgstr "" + +#: src/getargs.c:264 +#, c-format +msgid "bison (GNU Bison) %s" +msgstr "" + +#: src/getargs.c:266 +msgid "Written by Robert Corbett and Richard Stallman.\n" +msgstr "" + +#: src/getargs.c:270 +#, c-format +msgid "Copyright (C) %d Free Software Foundation, Inc.\n" +msgstr "" + +#: src/getargs.c:272 +msgid "" +"This is free software; see the source for copying conditions. There is NO\n" +"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +msgstr "" + +#: src/getargs.c:438 +#, c-format +msgid "missing operand after `%s'" +msgstr "" + +#: src/getargs.c:440 +#, c-format +msgid "extra operand `%s'" +msgstr "" + +#: src/gram.c:139 +msgid "empty" +msgstr "" + +#: src/gram.c:233 +msgid "Grammar" +msgstr "" + +#: src/gram.c:321 src/reduce.c:394 +msgid "warning" +msgstr "" + +#: src/main.c:124 +msgid "rule never reduced because of conflicts" +msgstr "" + +#: src/parse-gram.y:363 +msgid "POSIX forbids declarations in the grammar" +msgstr "" + +#: src/parse-gram.y:486 +msgid "missing identifier in parameter declaration" +msgstr "" + +#: src/print.c:49 +#, c-format +msgid " type %d is %s\n" +msgstr "" + +#: src/print.c:165 +#, c-format +msgid "shift, and go to state %d\n" +msgstr "" + +#: src/print.c:167 +#, c-format +msgid "go to state %d\n" +msgstr "" + +#: src/print.c:204 +msgid "error (nonassociative)\n" +msgstr "" + +#: src/print.c:292 +#, c-format +msgid "reduce using rule %d (%s)" +msgstr "" + +#: src/print.c:294 +#, c-format +msgid "accept" +msgstr "" + +#: src/print.c:325 src/print.c:391 +msgid "$default" +msgstr "" + +#: src/print.c:420 +#, c-format +msgid "state %d" +msgstr "" + +#: src/print.c:456 +msgid "Terminals, with rules where they appear" +msgstr "" + +#: src/print.c:483 +msgid "Nonterminals, with rules where they appear" +msgstr "" + +#: src/print.c:512 +#, c-format +msgid " on left:" +msgstr "" + +#: src/print.c:527 +#, c-format +msgid " on right:" +msgstr "" + +#: src/print.c:555 +msgid "Rules never reduced" +msgstr "" + +#: src/reader.c:56 +#, c-format +msgid "multiple %s declarations" +msgstr "" + +#: src/reader.c:118 +#, c-format +msgid "result type clash on merge function %s: <%s> != <%s>" +msgstr "" + +#: src/reader.c:216 +#, c-format +msgid "rule given for %s, which is a token" +msgstr "" + +#: src/reader.c:245 +#, c-format +msgid "type clash on default action: <%s> != <%s>" +msgstr "" + +#: src/reader.c:251 +msgid "empty rule for typed nonterminal, and no action" +msgstr "" + +#: src/reader.c:321 src/reader.c:335 src/reader.c:348 +#, c-format +msgid "only one %s allowed per rule" +msgstr "" + +#: src/reader.c:331 src/reader.c:346 +#, c-format +msgid "%s affects only GLR parsers" +msgstr "" + +#: src/reader.c:333 +#, c-format +msgid "%s must be followed by positive number" +msgstr "" + +#: src/reader.c:490 +msgid "no rules in the input grammar" +msgstr "" + +#: src/reduce.c:242 +msgid "useless rule" +msgstr "" + +#: src/reduce.c:303 +#, c-format +msgid "useless nonterminal: %s" +msgstr "" + +#: src/reduce.c:351 +msgid "Useless nonterminals" +msgstr "" + +#: src/reduce.c:364 +msgid "Terminals which are not used" +msgstr "" + +#: src/reduce.c:373 +msgid "Useless rules" +msgstr "" + +#: src/reduce.c:389 +#, c-format +msgid "%d rule never reduced\n" +msgid_plural "%d rules never reduced\n" +msgstr[0] "" +msgstr[1] "" + +#: src/reduce.c:397 +#, c-format +msgid "%d useless nonterminal" +msgid_plural "%d useless nonterminals" +msgstr[0] "" +msgstr[1] "" + +#: src/reduce.c:403 +#, c-format +msgid " and " +msgstr "" + +#: src/reduce.c:406 +#, c-format +msgid "%d useless rule" +msgid_plural "%d useless rules" +msgstr[0] "" +msgstr[1] "" + +#: src/reduce.c:436 +#, c-format +msgid "start symbol %s does not derive any sentence" +msgstr "" + +#: src/scan-gram.l:162 +msgid "stray `,' treated as white space" +msgstr "" + +#: src/scan-gram.l:225 +#, c-format +msgid "invalid directive: %s" +msgstr "" + +#: src/scan-gram.l:283 +#, c-format +msgid "invalid character: %s" +msgstr "" + +#: src/scan-gram.l:402 +msgid "invalid null character" +msgstr "" + +#: src/scan-gram.l:415 src/scan-gram.l:427 src/scan-gram.l:448 +#, c-format +msgid "invalid escape sequence: %s" +msgstr "" + +#: src/scan-gram.l:417 src/scan-gram.l:429 src/scan-gram.l:450 +#, c-format +msgid "invalid null character: %s" +msgstr "" + +#: src/scan-gram.l:455 +#, c-format +msgid "unrecognized escape sequence: %s" +msgstr "" + +#: src/scan-gram.l:537 +#, c-format +msgid "missing `{' in `%s'" +msgstr "" + +#: src/scan-gram.l:782 +#, c-format +msgid "$$ of `%s' has no declared type" +msgstr "" + +#: src/scan-gram.l:803 +#, c-format +msgid "$%d of `%s' has no declared type" +msgstr "" + +#: src/scan-gram.l:812 src/scan-gram.l:881 src/scan-gram.l:932 +#, c-format +msgid "integer out of range: %s" +msgstr "" + +#: src/scan-gram.l:848 src/scan-gram.l:916 +#, c-format +msgid "invalid value: %s" +msgstr "" + +#: src/scan-gram.l:1036 +#, c-format +msgid "missing `%s' at end of file" +msgstr "" + +#: src/scan-gram.l:1047 +#, c-format +msgid "missing `%s' at end of line" +msgstr "" + +#: src/symlist.c:97 src/symlist.c:108 +msgid "invalid $ value" +msgstr "" + +#: src/symtab.c:85 +#, c-format +msgid "type redeclaration for %s" +msgstr "" + +#: src/symtab.c:102 src/symtab.c:120 +#, c-format +msgid "%s redeclaration for %s" +msgstr "" + +#: src/symtab.c:139 +#, c-format +msgid "redefining precedence of %s" +msgstr "" + +#: src/symtab.c:157 +#, c-format +msgid "symbol %s redefined" +msgstr "" + +#: src/symtab.c:180 +#, c-format +msgid "redefining user token number of %s" +msgstr "" + +#: src/symtab.c:207 +#, c-format +msgid "symbol %s is used, but is not defined as a token and has no rules" +msgstr "" + +#: src/symtab.c:232 +#, c-format +msgid "symbol `%s' used more than once as a literal string" +msgstr "" + +#: src/symtab.c:235 +#, c-format +msgid "symbol `%s' given more than one literal string" +msgstr "" + +#: src/symtab.c:271 +#, c-format +msgid "conflicting precedences for %s and %s" +msgstr "" + +#: src/symtab.c:283 +#, c-format +msgid "conflicting associativities for %s (%s) and %s (%s)" +msgstr "" + +#: src/symtab.c:368 +#, c-format +msgid "tokens %s and %s both assigned number %d" +msgstr "" + +#: src/symtab.c:591 +#, c-format +msgid "the start symbol %s is undefined" +msgstr "" + +#: src/symtab.c:595 +#, c-format +msgid "the start symbol %s is a token" +msgstr "" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "" + +#: lib/bitset_stats.c:179 +#, c-format +msgid "%u bitset_allocs, %u freed (%.2f%%).\n" +msgstr "" + +#: lib/bitset_stats.c:182 +#, c-format +msgid "%u bitset_sets, %u cached (%.2f%%)\n" +msgstr "" + +#: lib/bitset_stats.c:185 +#, c-format +msgid "%u bitset_resets, %u cached (%.2f%%)\n" +msgstr "" + +#: lib/bitset_stats.c:188 +#, c-format +msgid "%u bitset_tests, %u cached (%.2f%%)\n" +msgstr "" + +#: lib/bitset_stats.c:192 +#, c-format +msgid "%u bitset_lists\n" +msgstr "" + +#: lib/bitset_stats.c:194 +msgid "count log histogram\n" +msgstr "" + +#: lib/bitset_stats.c:197 +msgid "size log histogram\n" +msgstr "" + +#: lib/bitset_stats.c:200 +msgid "density histogram\n" +msgstr "" + +#: lib/bitset_stats.c:214 +#, c-format +msgid "" +"Bitset statistics:\n" +"\n" +msgstr "" + +#: lib/bitset_stats.c:217 +#, c-format +msgid "Accumulated runs = %u\n" +msgstr "" + +#: lib/bitset_stats.c:261 lib/bitset_stats.c:266 +msgid "Could not read stats file." +msgstr "" + +#: lib/bitset_stats.c:263 +#, c-format +msgid "Bad stats file size.\n" +msgstr "" + +#: lib/bitset_stats.c:289 lib/bitset_stats.c:291 +msgid "Could not write stats file." +msgstr "" + +#: lib/bitset_stats.c:294 +msgid "Could not open stats file for writing." +msgstr "" + +#: lib/error.c:127 +msgid "Unknown system error" +msgstr "" + +#: lib/getopt.c:570 lib/getopt.c:589 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "" + +#: lib/getopt.c:622 lib/getopt.c:626 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "" + +#: lib/getopt.c:635 lib/getopt.c:640 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "" + +#: lib/getopt.c:686 lib/getopt.c:708 lib/getopt.c:1039 lib/getopt.c:1061 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "" + +#: lib/getopt.c:746 lib/getopt.c:749 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "" + +#: lib/getopt.c:757 lib/getopt.c:760 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "" + +#: lib/getopt.c:815 lib/getopt.c:818 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "" + +#: lib/getopt.c:824 lib/getopt.c:827 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "" + +#: lib/getopt.c:882 lib/getopt.c:901 lib/getopt.c:1114 lib/getopt.c:1135 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "" + +#: lib/getopt.c:954 lib/getopt.c:973 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "" + +#: lib/getopt.c:997 lib/getopt.c:1018 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "" + +#: lib/obstack.c:417 lib/obstack.c:420 lib/xmalloc.c:53 +msgid "memory exhausted" +msgstr "" + +#: lib/quotearg.c:238 +msgid "`" +msgstr "" + +#: lib/quotearg.c:239 +msgid "'" +msgstr "" + +#: lib/subpipe.c:171 +#, c-format +msgid "subsidiary program `%s' could not be invoked" +msgstr "" + +#: lib/subpipe.c:173 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "" + +#: lib/subpipe.c:175 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "" + +#: lib/subpipe.c:176 +#, c-format +msgid "subsidiary program `%s' failed (exit status %d)" +msgstr "" + +#: lib/timevar.c:475 +msgid "" +"\n" +"Execution times (seconds)\n" +msgstr "" + +#: lib/timevar.c:525 +msgid " TOTAL :" +msgstr "" + +#: lib/timevar.c:561 +#, c-format +msgid "time in %s: %ld.%06ld (%ld%%)\n" +msgstr "" diff --git a/src/apps/bin/bison/po/boldquot.sed b/src/apps/bin/bison/po/boldquot.sed new file mode 100644 index 0000000000..4b937aa517 --- /dev/null +++ b/src/apps/bin/bison/po/boldquot.sed @@ -0,0 +1,10 @@ +s/"\([^"]*\)"/“\1â€/g +s/`\([^`']*\)'/‘\1’/g +s/ '\([^`']*\)' / ‘\1’ /g +s/ '\([^`']*\)'$/ ‘\1’/g +s/^'\([^`']*\)' /‘\1’ /g +s/“â€/""/g +s/“/“/g +s/â€/â€/g +s/‘/‘/g +s/’/’/g diff --git a/src/apps/bin/bison/po/da.gmo b/src/apps/bin/bison/po/da.gmo new file mode 100644 index 0000000000000000000000000000000000000000..fd42e71a057eaea3c2b49000ed9b3d66db79e1af GIT binary patch literal 14350 zcmbW7ZHygPdB;zhK;S04g#=olzS^h-hg(27c>RaIfPL2AmEB2$6X z-~XJM`?6lg2_v8V-RZhFdaJxO~5?a)oed<}fhOZdYzb&D~t2ls&Y zf%D)Y@Ja9>_zmzE!JmOI0$+2hF)sz*0M@`agRcPhfo}xoKnn(-miP!b1O85lUoYQ3 z18Uvc%a{XvGx%EYH26zkSmG1lH1|(~zYKmGoCJSRKCivpm^%0Of))%x&G(z2==o}i z-vKr5zrk06uZC#d?*iWhJ^=0l6YvJ`6X0vWr@%YFuYk9M-vsx9-vhPIOPK6+;N771 z^8mOXY=Jj}PlMvuXTjeEzYM+wJoqZ!fi3WY7Q77^02g0v%%5=oN1*6gWpRF*El~4( z9PIG^Q=sH|BTU;3TJTfgNlUaAJP3D z5Z0TdeEtL|zWxDt7x>4Z=J^*;^Zyu>zP*CYXg_uS@W?y>PJk_tEtrpjZv#IEN{{{- zlstY4YQ9}eqIK>ErN=9v?Bc_q1wUFo{}L!Zeh(Bsehl6TzL|$};7L&P{5CiP{vjy- ze+T5BxdCOjpape52Tp-&p!Dsdpy>TG(1PCu#qa+CF-3DT52dfSgU-IeCvISUkgb@{ z-)YQY@LMI`022;!e?KUGJqF@h%qKy~>uC^|VZH!LZeIh%pKpQE>;DABhg*60cJL1H z0C)-%|9%71KE4XFr1^VLbUa()EleW%r$F^T0;>N8$UpO2<@2wA;=@0Jn&)Sr^z@DV z(fIii-wVnP`k?syc~ElrdWk;-Wmm7`&kf)lDES@(weI^s>D}X?nG$=X# zIrt&oe-jja_cNLN$|K-sz$Zb?vy08iF3y7D!#b$`A1t3g1oh2O?gyox?*c9OF_5j9ua@`!1d4Az2KRw?@JHhpK=J<(@J28J zWnUR6I==uu2>x|>f6IQq?>B)Ow-+z8RKw<&NAJPPXhlc4G+okn%)>lF+o0vNQ?!(( zOLo8Deqs0Et>y0zf=$|a+G}X9roEQ7NqdwgJAEHbmu#;~J4-uA`vqEcy}11GB2YSg zhPG8c6G$&t%6rA2n0ADAn)Xtft|w@B(q#K5XgAZ`Rhz#UHu^=BCbo#WVQ#1Lu#qOs zd{50-u48G^ilath*TdpM7$!FB$Dy5U+8}A#BJJ>GGPhZnr}1XU)0`JJ%(685IfrLq zv)>4R&cXRc)GCZ!U0R(xCF;knS>uQ{mc7PdtKgnrS=8Rp&tj|R_7&x9sAhKUvT4h% zP3F7p2AfJ!+YB3V0CldX*#!%pyF)W<1^u`%baXsR!p$&)Q`%m$Ry}6wtDg7sFb;Dq zniOHyjglZ%_Z=SRqtCU<_Io-Ykya~g6gj(%x9q~HW!np~Jj~p?ZaP`7%ZL%TuHq$Uqb{94f0n(lzYxlchQut{Go#~2fg6?|M?x%f3q(w&GX5k0=5t?}I zIqLNnuweaR_V~QXD|=s)!kvh-Bi!mI8FtrBq7Nd2!LGz0ztJ7vyZ!LKZ`Y$D4~zGU zhmCyN@}!l8%rrGQv%fVtxo2jyR~+Sq_%|2^)55|JYXpsrk#VEFo==}5WNNqmRTJ$t zbB#v7+mC~S1+spU+rtoAGe?7_&5Hm9ZAJK&92P+CQMV)a0&=59K3l7qV`*>88LXW; zw#QC3?Fn{iSJGB-0n@Z6(tgr(DmrZ!lLoUKOZ#yXLn`1Yu4-f%>F|XNJx|&*Bi*ua zjGEC`>J51VN@vW%nR9SH$BVSXB+S@YUfC7~mDy8srPC1m{D21dcUW&_a-#6e(CZ+{3sJG*{8w%-Y=rQbMYe3v>xDsPmU`N> zVn;V^hDgZT`o=VBy%EMe?|Yk3-iw1RhC!}-tiTaoj0$yrNS$$ux#qAo?H9d%VXFsG z0+C(6!00G=P_J(VjfP($^g3nFF0CxS%j$W}EV-E+K~43>8Al1y8N0+2+sjgUWMr^` z=<(1}LeZ9KTo(3V;^Ebki)R*As=;I9nqd({v7D>pf6y;dNKO+?u~}|!Jvu*W>; zvSe=821`hRo|A`9 zES{PlE*ysePQ7Guky^dgh_*(cqrHt`U;k@tr-6Ow*aBfNZ)A~IDgvN%Zn$UTWdK?0 zQ8O zB6Cs1E$RcF(|Omujny-Ou6iApS(50VxW8c%tmBM^?;2?r-E1I=j3`C?}BHe5<>j#!gbPnIgMG7YRg-j(vB1*t)h@pC>YxfY#y==7a1<38LCrk1chyo4U|+# zQP#YTR1|wnBzJMzp*6&oHJo&pP_^54li1KJ->H$}!1SKw2sh5RF*wR>BTn;vCZ$@7 z)3g)F7q}V1i#^icsK8?ed7d^RZDr8KF~TkA$a6Vxxo~MHkmr)pyM5xvZhbzTTV>2% z4c7?U)hMVQ$RUp1)`ImEvmJ4UT8rEeg{UsPtW#HU!n>@RSuImXIqs;jfsZGlBM@Rc z&Ed=Ic=%PhZT=~nfMOqK55m5Z>uEp3cghVl2+eFq8*CC)(#+{yDK6Y~M%27mj~@|mgLSpx^#AR zap}x^XJ%%+Gc@O}PQCNNLnYX`dB|n8gNP}<&YFkG4GMNd_Pm^uGZ!43GLB57wYY+1 z_#b3Viy_1@F&oO(3~?=smo4uY^K6GzFgeR46SJmaYH404{_U=@<1R2J6b_Nyl@ z#nA(IZZVarNh+1@Mw`e61NHNh9_D)-g)FJxV`F@va4PO5)zYQ*YD)YZ2bnNw45!mx zM|zQ;WAt9}OZ~46rtmLEZR5G#ky7q3Q=cp+PTLkGEm8%Rnt>n=FI%IJ!fvnFGVZTG ziD~mX?kO=GoUo=HA2{a)c-S;CPFL&{J%+psITYg%@WG6Qpi$~=#hdH*$mvpKfl^W| zqUoj83Q!KOp|jSsi5jWPHRU*KCW6j(NXABbgwJG{S7BcGQ`RmE_QSz_rJp0pRCSdu zvdJ)$4GabhV$0Z5f_=cbI47-?q{rU51>KWwi0y5W)olbECvh*`D9@!MYdS&U$Q2JE z+bQed-D4c+62JNCS%mnCs1>nOUMV7U@!i>IA~Be|;$F~F53OWK1d9lFuT77fS960{ zo$+c``N$|yo>`?L?p%yN)i8GoMY@Q_4KX_Tk~@xTyf!nLkG{jJqEtRyx>NJ8i?YkU zV~1#v-Z)d^&;_}^?m%TB-%twK4YM{z-A|knvc{}EG@0LL?>y|#xEb1H0N!~{DnobP z-Gx-QzV9 zp(p4mdSYCpW~=ILfAU(cgv6rew(;u4A1n#SPdMhHc9 zVJ)*=qjQTC{JO90l#U(FsQMInntQG}o!o0nXGt^ME(})WoF@NqM=$m9rwU*7Dupk5 zE(=CJTnuL@HA!^39MJF63)96ea-IYwfb*~?Q?6KK=-pU%(ZFfT9mHI39bJ4nH8w_C zzFlG?I&zKIY}p-@nnuMyS&KAqGH%XH?tME4=_!6vO{f{CX{wY}(PKU3oQS84+6e^u z!ja_f%4!4kW_H!YN*}vTw_R5;Np&`V>MO(GSn*>gmjqV`&0`fa=a{PJ5``fFkr`Kr zmpz-M=W*us#b*5>e+Zo|&-43c4%~ZBQ1dBo{dC@rn)Rb3zV+3VF545|+S#Sm`Z4J@ zk)wVbHJ`Qn_wIdLeeXT>{rl{`y|eq@Uf+A~-o13JFNd3v&bz~YZ>`gH-+sG)|Li^Y z-nEyJwNpV})K_uyIpvZRPkofS2O6=219^ZDhy5Q~caM%lUDBDEX6HTzCG9>p_0=%w z&f4Qa65&-2HJPPzq(d#v^*X(HdVaXweKUJ&#}ow<)*~j)+JfM8H)r-JIcOCsNR01C6{Q2u{@Ni z5OtJMlj7kR!}GCGX8giOyIkcNU%Gzbqw~(N`n+1D<`t^i+_u!2qnHARj;ExJ?r!7C zdH=htK*NVgUxAkTPfX?$coYRhj&&pmo%nJV`nch$(AV!&TAhJ!o`G(g6mt~rn$**% z^0`+rOYiuuzn=BseAKp4rxVukG{dTN^$K?}`YxnyOwGD_>sKCoq@zlkCCwyNvrC&% z)?sq<~JeVjG zuj8PJXODw62ZuqSy5HW4n^Al4qAFmkA1h6$Og+Im%D-BKsioOC|a}HH>pU+yZ-24JMUYo8RNE%}fUwA5>c~1CU^+%sOs;g3Q_j1y1 zhRUOmo|KkCnyW`g?ei)~UR9Fz15^$Ov++rievD&?DSlM5_^NU^m}IWYqn@nJq`LYEs=_M9A-?w9(d)P1EqLz?!*t)DkQ|6Z`1)@VNgR9<_e&aUh zT+TH}wD2=!9wf&lAt*eURlYdM2QrNdjm|&G83nFX?!ywLa;G&NS150W8)@ua(}Y4m zI8iBEso4WD^R*Jwm~fTruqeARxk}~QJpMfi)AjQR!$&g7RSpvEcPW_snY7CZYGP0i zcQbYH)>vVYZD9|1bP}s9>;}yaAyXXj^ZJqgzl~IMR%DXT`^ja7F01zC!)LO3r#un( z;ba-rShgA^rG!Zq5d=B*B^Mk!Ir8dy zA>%l_J6Z>#P-*Z0Q^L2E0z&gr_Kxb_G=!sKv3sni7 zo>j(w^?6|ARjKg{F7qCZ%Ub_TsFp*S41Nv{i__YLRGahzC#R&|I43*hx(&I>*`Fz} zU#f+!TslVRzymz5PGM%`lJ(sM?^BhGohW_5T@k} z#GL;ggHOmVkrcTalV%9o1=H`UZ(h!tkr^B)tAukz0|)P@=O?~KRUJR8;5YizQVrQe z*{F-ip>12xE$5zX^j)6nqE6bA2^NMAO&qVKbgqV=^nBp9`CnGP9G{GKdu)Pa#_RcD zY*mu)C^6^tpeR3*1dYs5v6%l~hX#8_>kI`8_)I`ta_yfXRs#ifz*d{9V} zD+_i<9RBMDbtn9c3xGMbdg2GA`>Sj9u2?1at!lD!4GJbK&V!N~s8mJEmtnj?!z`l3 zC6Y>HFELfCqsz_`oFVO`u!A$`Hj_oAv!cw(T)oWYUaX^fhU}4y#m8GSVgTlJ5K{(h zIC>_gC-{iq>=x>@jdf0QWIgS~_`^MC*b8Yiaz z03~{GF73=A)Q)wH~(hVM=?WxGxJTi~E&!Iu&PW{+n9XtQ`Ed3O~B$ p>vS@zs|s~xNofa@I#MHKHSt9%3NkzWX!)CBk(F!+IY|9|Cc8p{9x literal 0 HcmV?d00001 diff --git a/src/apps/bin/bison/po/da.po b/src/apps/bin/bison/po/da.po new file mode 100644 index 0000000000..6e71202485 --- /dev/null +++ b/src/apps/bin/bison/po/da.po @@ -0,0 +1,740 @@ +# Danish messages for bison. +# Copyright © 2001, 2002 Free Software Foundation, Inc. +# Keld Simonsen , 2002. +# Byrial Ole Jensen , 2002-2003. +# +msgid "" +msgstr "" +"Project-Id-Version: bison 1.875a\n" +"Report-Msgid-Bugs-To: bug-bison@gnu.org\n" +"POT-Creation-Date: 2004-05-21 10:26-0700\n" +"PO-Revision-Date: 2003-04-12 22:57+0200\n" +"Last-Translator: Byrial Ole Jensen \n" +"Language-Team: Danish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: src/complain.c:51 src/complain.c:66 +msgid "warning: " +msgstr "advarsel: " + +#: src/complain.c:122 src/complain.c:138 +msgid "fatal error: " +msgstr "fatal fejl: " + +#: src/conflicts.c:76 +#, c-format +msgid " Conflict between rule %d and token %s resolved as shift" +msgstr " Konflikt mellem regel %d og element %s løstes som skift" + +#: src/conflicts.c:84 +#, c-format +msgid " Conflict between rule %d and token %s resolved as reduce" +msgstr " Konflikt mellem regel %d og element %s løstes som reducér" + +#: src/conflicts.c:91 +#, c-format +msgid " Conflict between rule %d and token %s resolved as an error" +msgstr " Konflikt mellem regel %d og element %s løstes som en fejl" + +#: src/conflicts.c:399 +#, c-format +msgid "conflicts: %d shift/reduce, %d reduce/reduce\n" +msgstr "konflikter: %d skift/reducér, %d reducér/reducér\n" + +#: src/conflicts.c:402 +#, c-format +msgid "conflicts: %d shift/reduce\n" +msgstr "konflikter: %d skift/reducér\n" + +#: src/conflicts.c:404 +#, c-format +msgid "conflicts: %d reduce/reduce\n" +msgstr "konflikter: %d reducér/reducér\n" + +#: src/conflicts.c:422 +#, c-format +msgid "State %d " +msgstr "Tilstand %d " + +#: src/conflicts.c:487 +#, fuzzy, c-format +msgid "%%expect-rr applies only to GLR parsers" +msgstr "%s påvirker kun GLR-fortolkere" + +#: src/conflicts.c:511 +#, c-format +msgid "expected %d shift/reduce conflict" +msgid_plural "expected %d shift/reduce conflicts" +msgstr[0] "forventede %d skift/reducér-konflikt" +msgstr[1] "forventede %d skift/reducér-konflikter" + +#: src/conflicts.c:515 +#, fuzzy, c-format +msgid "expected %d reduce/reduce conflict" +msgid_plural "expected %d reduce/reduce conflicts" +msgstr[0] "forventede 0 reducér/reducér-konflikter" +msgstr[1] "forventede 0 reducér/reducér-konflikter" + +#: src/files.c:100 +#, c-format +msgid "cannot open file `%s'" +msgstr "kan ikke åbne filen \"%s\"" + +#: src/files.c:116 +msgid "I/O error" +msgstr "Fejl ved ind- eller udlæsning" + +#: src/files.c:119 +msgid "cannot close file" +msgstr "kan ikke lukke fil" + +#: src/files.c:337 +#, c-format +msgid "conflicting outputs to file %s" +msgstr "konfliktende uddata til filen %s" + +#: src/getargs.c:186 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "Prøv med \"%s --help\" for mere information.\n" + +#: src/getargs.c:192 +msgid "GNU bison generates parsers for LALR(1) grammars.\n" +msgstr "GNU bison genererer fortolkere til LALR(1)-grammatiker.\n" + +#: src/getargs.c:196 +#, c-format +msgid "Usage: %s [OPTION]... FILE\n" +msgstr "Brug: %s [FLAG]... FIL\n" + +#: src/getargs.c:200 +msgid "" +"If a long option shows an argument as mandatory, then it is mandatory\n" +"for the equivalent short option also. Similarly for optional arguments.\n" +msgstr "" +"Hvis et lang flag viser et argument som obligatorisk, er det også\n" +"obligatorisk for det tilsvarende korte flag. Tilsvarende\n" +"for valgfrie argumenter.\n" + +#: src/getargs.c:206 +msgid "" +"Operation modes:\n" +" -h, --help display this help and exit\n" +" -V, --version output version information and exit\n" +" -y, --yacc emulate POSIX yacc\n" +msgstr "" +"Arbejdstilstande:\n" +" -h, --help vis denne hjælpetekst og afslut\n" +" -V, --version vis versionsinformation og afslut\n" +" -y, --yacc emulér POSIX-yacc\n" + +#: src/getargs.c:213 +msgid "" +"Parser:\n" +" -S, --skeleton=FILE specify the skeleton to use\n" +" -t, --debug instrument the parser for debugging\n" +" --locations enable locations computation\n" +" -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n" +" -l, --no-lines don't generate `#line' directives\n" +" -n, --no-parser generate the tables only\n" +" -k, --token-table include a table of token names\n" +msgstr "" +"Fortolker:\n" +" -S, --skeleton=FIL angiv skeletfilen som skal bruges\n" +" -t, --debug instrumentér fortolkeren for fejlsøgning\n" +" --locations aktivér tilstandsberegning\n" +" -p, --name-prefix=PRÆFIKS tilføj PRÆFIKS for eksterne symboler\n" +" -l, --no-lines generér ikke \"#line\"-direktiver\n" +" -n, --no-parser generér kun tabellerne\n" +" -k, --token-table inkludér en tabel over elementnavne\n" + +#: src/getargs.c:225 +msgid "" +"Output:\n" +" -d, --defines also produce a header file\n" +" -r, --report=THINGS also produce details on the automaton\n" +" -v, --verbose same as `--report=state'\n" +" -b, --file-prefix=PREFIX specify a PREFIX for output files\n" +" -o, --output=FILE leave output to FILE\n" +" -g, --graph also produce a VCG description of the " +"automaton\n" +msgstr "" +"Uddata:\n" +" -d, --defines lav også en hovedfil\n" +" -r, --report=SAGER lav også detaljer om automaten\n" +" -v, --verbose samme som \"--report=state\"\n" +" -b, --file-prefix=PRÆFIKS angiv et PRÆFIKS for uddatafiler\n" +" -o, --output=FIL læg uddata i FIL\n" +" -g, --graph lav også en VCG-beskrivelse af automaten\n" + +#: src/getargs.c:236 +msgid "" +"THINGS is a list of comma separated words that can include:\n" +" `state' describe the states\n" +" `itemset' complete the core item sets with their closure\n" +" `lookahead' explicitly associate lookaheads to items\n" +" `solved' describe shift/reduce conflicts solving\n" +" `all' include all the above information\n" +" `none' disable the report\n" +msgstr "" +"TING er en liste med kommaseparerede ord som kan indeholde:\n" +" \"state\" beskriv tilstandene\n" +" \"itemset\" komplettér kerneobjektmængderne med deres afslutninger\n" +" \"lookahead\" kobl udtrykkeligt fremadkig til objekter\n" +" \"solved\" beskriv løsninger af skift/reducér-konflikter\n" +" \"all\" inkludér al ovenstående information\n" +" \"none\" deaktivér rapporten\n" + +#: src/getargs.c:247 +msgid "Report bugs to .\n" +msgstr "" +"Rapportér fejl til .\n" +"Rapportér synpunkter om oversættelsen til .\n" + +#: src/getargs.c:264 +#, c-format +msgid "bison (GNU Bison) %s" +msgstr "bison (GNU Bison) %s" + +#: src/getargs.c:266 +msgid "Written by Robert Corbett and Richard Stallman.\n" +msgstr "Skrevet af Robert Corbett og Richard Stallman.\n" + +#: src/getargs.c:270 +#, c-format +msgid "Copyright (C) %d Free Software Foundation, Inc.\n" +msgstr "Copyright © %d Free Software Foundation, Inc.\n" + +#: src/getargs.c:272 +msgid "" +"This is free software; see the source for copying conditions. There is NO\n" +"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +msgstr "" +"Dette er frit programmel, se kildekoden for kopieringsbetingelser. Der\n" +"gives INGEN garanti, endog ikke for SALGBARHED eller EGNETHED FOR NOGET\n" +"BESTEMT FORMÅL.\n" + +#: src/getargs.c:438 +#, c-format +msgid "missing operand after `%s'" +msgstr "manglende operand efter \"%s\"" + +#: src/getargs.c:440 +#, c-format +msgid "extra operand `%s'" +msgstr "overtallig operand \"%s\"" + +#: src/gram.c:139 +msgid "empty" +msgstr "tom" + +#: src/gram.c:233 +msgid "Grammar" +msgstr "Grammatik" + +#: src/gram.c:321 src/reduce.c:394 +msgid "warning" +msgstr "advarsel" + +#: src/main.c:124 +msgid "rule never reduced because of conflicts" +msgstr "regel aldrig reduceret på grund af konflikter" + +#: src/parse-gram.y:363 +msgid "POSIX forbids declarations in the grammar" +msgstr "POSIX forbyder deklarationer i grammatikken" + +#: src/parse-gram.y:486 +msgid "missing identifier in parameter declaration" +msgstr "manglende identifikator i parameterdeklaration" + +#: src/print.c:49 +#, c-format +msgid " type %d is %s\n" +msgstr " type %d er %s\n" + +#: src/print.c:165 +#, c-format +msgid "shift, and go to state %d\n" +msgstr "skift, og gå til tilstand %d\n" + +#: src/print.c:167 +#, c-format +msgid "go to state %d\n" +msgstr "gå til tilstand %d\n" + +#: src/print.c:204 +msgid "error (nonassociative)\n" +msgstr "fejl (ikke-associativ)\n" + +#: src/print.c:292 +#, c-format +msgid "reduce using rule %d (%s)" +msgstr "reducér med regel %d (%s)" + +#: src/print.c:294 +#, c-format +msgid "accept" +msgstr "acceptér" + +#: src/print.c:325 src/print.c:391 +msgid "$default" +msgstr "$default" + +#: src/print.c:420 +#, c-format +msgid "state %d" +msgstr "tilstand %d" + +#: src/print.c:456 +msgid "Terminals, with rules where they appear" +msgstr "Terminaler, med regler hvor de forekommer" + +#: src/print.c:483 +msgid "Nonterminals, with rules where they appear" +msgstr "Ikke-terminaler, med regler hvor de forekommer" + +#: src/print.c:512 +#, c-format +msgid " on left:" +msgstr " til venstre:" + +#: src/print.c:527 +#, c-format +msgid " on right:" +msgstr " til højre:" + +#: src/print.c:555 +msgid "Rules never reduced" +msgstr "Aldrig reducerede regler" + +#: src/reader.c:56 +#, c-format +msgid "multiple %s declarations" +msgstr "flere %s-deklarationer" + +#: src/reader.c:118 +#, c-format +msgid "result type clash on merge function %s: <%s> != <%s>" +msgstr "resultattypekonflikt ved sammenfletningsfunktion %s: <%s> != <%s>" + +#: src/reader.c:216 +#, c-format +msgid "rule given for %s, which is a token" +msgstr "regel givet for %s som er et element" + +#: src/reader.c:245 +#, c-format +msgid "type clash on default action: <%s> != <%s>" +msgstr "typekonflikt for standardhandling: <%s> != <%s>" + +#: src/reader.c:251 +msgid "empty rule for typed nonterminal, and no action" +msgstr "tom regel for typet ikke-terminal, og ingen handling" + +#: src/reader.c:321 src/reader.c:335 src/reader.c:348 +#, c-format +msgid "only one %s allowed per rule" +msgstr "kun en %s tilladt per regel" + +#: src/reader.c:331 src/reader.c:346 +#, c-format +msgid "%s affects only GLR parsers" +msgstr "%s påvirker kun GLR-fortolkere" + +#: src/reader.c:333 +#, c-format +msgid "%s must be followed by positive number" +msgstr "%s skal følges af et positivt tal" + +#: src/reader.c:490 +msgid "no rules in the input grammar" +msgstr "ingen regler i inddatagrammatikken" + +#: src/reduce.c:242 +msgid "useless rule" +msgstr "ubrugelig regel" + +#: src/reduce.c:303 +#, c-format +msgid "useless nonterminal: %s" +msgstr "ubrugelig ikke-terminal: %s" + +#: src/reduce.c:351 +msgid "Useless nonterminals" +msgstr "Ubrugelige ikke-terminaler" + +#: src/reduce.c:364 +msgid "Terminals which are not used" +msgstr "Terminaler som ikke bruges" + +#: src/reduce.c:373 +msgid "Useless rules" +msgstr "Ubrugelige regler" + +#: src/reduce.c:389 +#, c-format +msgid "%d rule never reduced\n" +msgid_plural "%d rules never reduced\n" +msgstr[0] "%d regel reduceres aldrig\n" +msgstr[1] "%d regler reduceres aldrig\n" + +#: src/reduce.c:397 +#, c-format +msgid "%d useless nonterminal" +msgid_plural "%d useless nonterminals" +msgstr[0] "%d ubrugelig ikke-terminal" +msgstr[1] "%d ubrugelige ikke-terminaler" + +#: src/reduce.c:403 +#, c-format +msgid " and " +msgstr " og " + +#: src/reduce.c:406 +#, c-format +msgid "%d useless rule" +msgid_plural "%d useless rules" +msgstr[0] "%d ubrugelig regel" +msgstr[1] "%d ubrugelige regler" + +#: src/reduce.c:436 +#, c-format +msgid "start symbol %s does not derive any sentence" +msgstr "startsymbolet %s genererer ingen sætninger" + +#: src/scan-gram.l:162 +msgid "stray `,' treated as white space" +msgstr "Malplaceret \",\" behandlet som blanktegn" + +#: src/scan-gram.l:225 +#, c-format +msgid "invalid directive: %s" +msgstr "ugyldigt direktiv: %s" + +#: src/scan-gram.l:283 +#, c-format +msgid "invalid character: %s" +msgstr "ugyldigt tegn: %s" + +#: src/scan-gram.l:402 +#, fuzzy +msgid "invalid null character" +msgstr "ugyldigt tegn: %s" + +#: src/scan-gram.l:415 src/scan-gram.l:427 src/scan-gram.l:448 +#, c-format +msgid "invalid escape sequence: %s" +msgstr "ugyldig undvigesekvens: %s" + +#: src/scan-gram.l:417 src/scan-gram.l:429 src/scan-gram.l:450 +#, fuzzy, c-format +msgid "invalid null character: %s" +msgstr "ugyldigt tegn: %s" + +#: src/scan-gram.l:455 +#, c-format +msgid "unrecognized escape sequence: %s" +msgstr "ukendt undvigesekvens: %s" + +#: src/scan-gram.l:537 +#, c-format +msgid "missing `{' in `%s'" +msgstr "manglende \"{\" i \"%s\"" + +#: src/scan-gram.l:782 +#, c-format +msgid "$$ of `%s' has no declared type" +msgstr "$$ for \"%s\" har ingen erklæret type" + +#: src/scan-gram.l:803 +#, c-format +msgid "$%d of `%s' has no declared type" +msgstr "$%d for \"%s\" har ingen erklæret type" + +#: src/scan-gram.l:812 src/scan-gram.l:881 src/scan-gram.l:932 +#, c-format +msgid "integer out of range: %s" +msgstr "heltal uden for gyldigshedsområdet: %s" + +#: src/scan-gram.l:848 src/scan-gram.l:916 +#, c-format +msgid "invalid value: %s" +msgstr "fejlagtig værdi: %s" + +#: src/scan-gram.l:1036 +#, c-format +msgid "missing `%s' at end of file" +msgstr "manglende \"%s\" ved slutningen af filen" + +#: src/scan-gram.l:1047 +#, fuzzy, c-format +msgid "missing `%s' at end of line" +msgstr "manglende \"%s\" ved slutningen af filen" + +#: src/symlist.c:97 src/symlist.c:108 +msgid "invalid $ value" +msgstr "fejlagtig $-værdi" + +#: src/symtab.c:85 +#, c-format +msgid "type redeclaration for %s" +msgstr "gentagen typeerklæring for %s" + +#: src/symtab.c:102 src/symtab.c:120 +#, c-format +msgid "%s redeclaration for %s" +msgstr "gentagen %s-erklæring for %s" + +#: src/symtab.c:139 +#, c-format +msgid "redefining precedence of %s" +msgstr "redefinition af præcedens for %s" + +#: src/symtab.c:157 +#, c-format +msgid "symbol %s redefined" +msgstr "symbol %s redefineret" + +#: src/symtab.c:180 +#, c-format +msgid "redefining user token number of %s" +msgstr "redefinition af elementnummer for %s" + +#: src/symtab.c:207 +#, c-format +msgid "symbol %s is used, but is not defined as a token and has no rules" +msgstr "" +"symbol %s bruges, men er ikke defineret som et element og har ingen regler" + +#: src/symtab.c:232 +#, c-format +msgid "symbol `%s' used more than once as a literal string" +msgstr "symbol \"%s\" bruges mere end en gang som en bogstavelig streng" + +#: src/symtab.c:235 +#, c-format +msgid "symbol `%s' given more than one literal string" +msgstr "symbol \"%s\" har fået mere end én bogstavelig streng" + +#: src/symtab.c:271 +#, c-format +msgid "conflicting precedences for %s and %s" +msgstr "modstridige præcedenser mellem %s og %s" + +#: src/symtab.c:283 +#, c-format +msgid "conflicting associativities for %s (%s) and %s (%s)" +msgstr "modstridige associativiteter for %s (%s) og %s (%s)" + +#: src/symtab.c:368 +#, c-format +msgid "tokens %s and %s both assigned number %d" +msgstr "elementerne %s og %s har begge fået nummer %d" + +#: src/symtab.c:591 +#, c-format +msgid "the start symbol %s is undefined" +msgstr "startsymbolet %s er udefineret" + +#: src/symtab.c:595 +#, c-format +msgid "the start symbol %s is a token" +msgstr "startsymbolet %s er et element" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "ugyldigt argument %s til %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "flertydigt argument %s til %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Gyldige argumenter er:" + +#: lib/bitset_stats.c:179 +#, c-format +msgid "%u bitset_allocs, %u freed (%.2f%%).\n" +msgstr "%u bitmængdeallokeringer, %u frigjort (%.2f%%).\n" + +#: lib/bitset_stats.c:182 +#, c-format +msgid "%u bitset_sets, %u cached (%.2f%%)\n" +msgstr "%u bitmængdeindstillinger, %u cachede (%.2f%%)\n" + +#: lib/bitset_stats.c:185 +#, c-format +msgid "%u bitset_resets, %u cached (%.2f%%)\n" +msgstr "%u bitmængdenulstillinger, %u cachede (%.2f%%)\n" + +#: lib/bitset_stats.c:188 +#, c-format +msgid "%u bitset_tests, %u cached (%.2f%%)\n" +msgstr "%u bitmængdetest, %u cachede (%.2f%%)\n" + +#: lib/bitset_stats.c:192 +#, c-format +msgid "%u bitset_lists\n" +msgstr "%u bitmængdelister\n" + +#: lib/bitset_stats.c:194 +msgid "count log histogram\n" +msgstr "kaldsloghistogram\n" + +#: lib/bitset_stats.c:197 +msgid "size log histogram\n" +msgstr "størrelsesloghistogram\n" + +#: lib/bitset_stats.c:200 +msgid "density histogram\n" +msgstr "densitetshistogram\n" + +#: lib/bitset_stats.c:214 +#, c-format +msgid "" +"Bitset statistics:\n" +"\n" +msgstr "" +"Bitmængdestatistik:\n" +"\n" + +#: lib/bitset_stats.c:217 +#, c-format +msgid "Accumulated runs = %u\n" +msgstr "Akkumulerede kørsler = %u\n" + +#: lib/bitset_stats.c:261 lib/bitset_stats.c:266 +msgid "Could not read stats file." +msgstr "Kunne ikke læse statistikfil." + +#: lib/bitset_stats.c:263 +#, c-format +msgid "Bad stats file size.\n" +msgstr "Dårlig statistikfilstørrelse.\n" + +#: lib/bitset_stats.c:289 lib/bitset_stats.c:291 +msgid "Could not write stats file." +msgstr "Kunne ikke skrive statistikfil." + +#: lib/bitset_stats.c:294 +msgid "Could not open stats file for writing." +msgstr "Kunne ikke åbne statistikfil for skrivning." + +#: lib/error.c:127 +msgid "Unknown system error" +msgstr "Ukendt systemfejl" + +#: lib/getopt.c:570 lib/getopt.c:589 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: flaget \"%s\" er flertydigt\n" + +#: lib/getopt.c:622 lib/getopt.c:626 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: flaget \"--%s\" tager intet argument\n" + +#: lib/getopt.c:635 lib/getopt.c:640 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: flaget \"%c%s\" tager intet argument\n" + +#: lib/getopt.c:686 lib/getopt.c:708 lib/getopt.c:1039 lib/getopt.c:1061 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: flaget \"%s\" behøver et argument\n" + +#: lib/getopt.c:746 lib/getopt.c:749 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: ukendt flag \"--%s\"\n" + +#: lib/getopt.c:757 lib/getopt.c:760 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: ukendt flag \"%c%s\"\n" + +#: lib/getopt.c:815 lib/getopt.c:818 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: ikke tilladt flag -- %c\n" + +#: lib/getopt.c:824 lib/getopt.c:827 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ugyldigt flag --%c\n" + +#: lib/getopt.c:882 lib/getopt.c:901 lib/getopt.c:1114 lib/getopt.c:1135 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: flaget behøver et argument -- %c\n" + +#: lib/getopt.c:954 lib/getopt.c:973 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: flaget \"-W %s\" er flertydigt\n" + +#: lib/getopt.c:997 lib/getopt.c:1018 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: flaget \"-W %s\" tager intet argument\n" + +#: lib/obstack.c:417 lib/obstack.c:420 lib/xmalloc.c:53 +msgid "memory exhausted" +msgstr "hukommelsen opbrugt" + +# Når vi går over til Unicode mere allmænt måske vi bør oversættta båda disse +# med U+201D (RIGHT DOUBLE QUOTATION MARK) på svenska. Eller? +# +#: lib/quotearg.c:238 +msgid "`" +msgstr "\"" + +#: lib/quotearg.c:239 +msgid "'" +msgstr "\"" + +#: lib/subpipe.c:171 +#, c-format +msgid "subsidiary program `%s' could not be invoked" +msgstr "hjælpeprogrammet \"%s\" kunne ikke startes" + +#: lib/subpipe.c:173 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "hjælpeprogrammet \"%s\" ikke fundet" + +#: lib/subpipe.c:175 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "hjælpeprogrammet \"%s\" fejlede" + +#: lib/subpipe.c:176 +#, c-format +msgid "subsidiary program `%s' failed (exit status %d)" +msgstr "hjælpeprogrammet \"%s\" fejlede med afslutningskode %d" + +#: lib/timevar.c:475 +msgid "" +"\n" +"Execution times (seconds)\n" +msgstr "" +"\n" +"Udførelsestider (sekunder)\n" + +#: lib/timevar.c:525 +msgid " TOTAL :" +msgstr " TOTALT :" + +#: lib/timevar.c:561 +#, c-format +msgid "time in %s: %ld.%06ld (%ld%%)\n" +msgstr "tid i %s: %ld.%06ld (%ld%%)\n" diff --git a/src/apps/bin/bison/po/de.gmo b/src/apps/bin/bison/po/de.gmo new file mode 100644 index 0000000000000000000000000000000000000000..39d29091791031f1ecb332805b47c5370049c45d GIT binary patch literal 14927 zcmbW73yd9CdB;y6A>s1OgYal5C&i0x@LjJRLfmy6vbNXuCVsKIw!sAO?7egE9roUt zWggz_0u3dhD6RUC5JjO?BOnDq+9F!&R!xMcSE3Rk2qYw`meN+DQmI5~g^GmwP=Eh( zX6|DjcEZTB|2s41@tyB|zT@xTbnV9t*CX7wao>HdF@FX=a07q1cD%@#UjTQ4_kh#j z-QXkOe(j8aM|2pnP9@sWEk)?*c6tf*SAFK+*HZB|ZbH z-;cnTgEvF8p0|Oo2k!&7fiZXu_%ZNS@Z;bsz&`?S0WX6S;CDgIa|46D2HXv5J@z}mTG#6gHSLQzOm%tXt63nCEo59b3(xblxC6E6B zHQqJ`(L8SjrN?ui?BYY91s^Tne*qL9zYB^VKLu|G-@wZ$@EE9ZejOYK{{R&Kp8@%2 zu0h!?XhA(sfjhtpp!DrgQ1pHowBR>E@%zUhrf9C`rS$a{(AhWm@HNa2(!_k>c4Ll$ zUkC38Z-NQOz;}b<*XKaV^Q)lj=4+tF{|8WV`!7)XeH}~^J-b2i;XF7EHo&{U&x6wY ze+I?B7w{l{-VSPAGa#%rof1C+YP?T_kY=6%HP4UB_pe4NCEvp!ugnrCzI+_iy1r84 z_d&J$KTvw|MvO>yydRW(#NZzAaqxNIw?WbI9Z=)`Cn&wU6=Eg7U7+Oi0LW6z?|}R> zU*^x9;P*iB`6h^|fwzHAfZM^l!EbZTd=@!;5tQ7|Lgc^j{1Nazo)iZ8s>BDPb>S=HvDE>bRz8w54C_elJsCm8(imv|#ZwFtFkxC!;f?D@|py+IX z($|Me{3Iy)z67e>cR<1Gv)IKKjB^7%i&lRUqUNwl6ARQulo z4};Hu7QE?~{krY|Wk+X0(OG~R_i<2keG}9=e*$WqH%=P!Qg9r+9y|cP5S#|D0Z(!3 zQXi&rm*j`I-SyTI1+OlDA1V>j-6eh3h03}sX=#XN4Ry#f28i0*DcxU zBKH!vWT*?VIR88YqDtmr?qzOWn1Zp~AK)&y+uYUlAV03xJNV-A_bS-relPc}+|u_~a$n?rC-;rq@8;Geo9c0& z=HAc!JnrgxLHXl4P&#~)d!>9QkloCc&o2SH-1l;y;FiwndWidW?$>Z1;g(Ljt2X^$ z*eLQSiESSB!p!c-!bTD|vz;|#xeg_9s~a_PyAbBfVHn%A=!SNzX@j_F^JI}XW0_6E zEa_ehd7JUUhH09lKWFzeY!;31=j@zyqE>F~{Hgh=rC{t)S@UhK7!3adUBHTU~&2qUkthtT-xxZd~;!}A@(+tFpIb6HV^^Qo*-=(y)e%GF#X0fMK(ci zA!-*%frvE8@YghaUlE~+TaQt%KZgnH=UC&jCa-M0C54+2XNR~|#3^>yj-yp%&|j4p zceftC7j_}avoL>;c-Y8xS>CkLkdbzbjqh!ZjqMyCZq<#lT>R^IgK1&zyETGF zXQi}oWa^1hj!Yrrai(c?Of8zmoZIyBq`#iQ_)>^CT=jwp`_?GF{B)x z;;M$Gkq$4X=y}{8A8M9{Bh(CkQftWTQ#x*ro;(BRGrUMUjKh?LWtDAVP^mpWb$oWm zo}IRx2E86O2SG>uPcyUoROu#XS~jrVByLw?&pOHSh!V@I_VBkso}??gY~EodQ7&uf zzpZIHK3LfRc8B>`#!0nqXP7}ZOUA98i+T}W3_qX_{u|a?nVcv*Iq*72ayiO7&VOZg zxf8-;CRwq;(oz_t=G2lFt=Q2^njsRhw%*x=T6ecu=pe1dWEDBJ?_CPoJ8bdArs7nmOf0as)Ni z8fP5ENN3~{PwY~f$Ri_z4x-0HO9@3=s(xv>1QQR;ADcOObgt?=(ytljLDZFVb^H&C zJb~mS)({uVVb|fbp~zyuaT7o_Uxgf zgu$$lMqa51fYQ0anvItMWGzI^tPGh>fEn??H7;$zoOUtDNoY>#3I65Ly_5akIU}m;)aOtchtN?-xJ3FJ<#@~>%aTTIKz(Idr>jX~9B**$z2F%|&jALR1%C)~TyF z;ayhE%$KR79Cy^{;NwZ?2!z;9bMWyh9)4bKn}5nCpxDRR{jjg(dQznLPPw55p_%1q zflZ=n5@&>)c^5M1fAUm~2%QFTzOvs@LDCz$ekZ194;`C2IX`u9=J?F~J1j#TnVCO1 zJvV2MoSL;$_Vm>3{LG;<$ERlP=`*u9m}%5(K3!3Ajw&mrY_{14Km#Spq(Vm6drFvO{FDL4IuwjYE=nK(*@?URcg z$}rgB5bBx|AeyRVp{t*7-ux(uF8!6=`BNb#h-K1?% z(mYXMsTl}j^RhDhD(o%gE5`lxJ25R@+dU4+7LeMbvw&KmzTVyoJ(?BUH7SZ(5Y6U2V*U(98+C+`S<(hJwH4{N+J0xQxJ;GV{n#?{mS7*SFV09SCFzlGZbJ8_7h-!W zWObc@?IiA{7iF1r5fs(fS=E6=P_5w|bKpQ@YNg(6)<q&Lpg*mOazuRBm#$T~_PdtutfsEgPsA#+UH zyT`J7?Cl2}8aG0l48S|jF=gn^yStF;=J#zzstR@?Y#MNf>2)GU=BDcS#pUE6KW)=G9m)(gqnNi79x zSuA8xGYZfjQgMmIYfYoSb0dVJy0DhfwrJcU1;6TNyF=R!XH*46p61Rihm(74X)kF8 z%Z0&;oV&<>+}2BN{I0@Ry-MNBp38!f4;OxZP?1djS)w0zR;otSuYed5mg-aU5D#N^($)FO zHoO>VyE|xiM}1;XePXZOvv=~2eUop#^Gy?bXnH)z^7=fEKBHig;Hyt4i3q#)bQHFL zyO$i^+s_LZ$2&!x)Pt?Ucr(0*0pfN+rc<8}gWjY)N;-(b+}#ZC?M5zJubr4VF+EuL zp7Dv=A;rU(d5MmbHYZH&X7?V&`>lcoN%Mg-^GE9Y2JJ*&D@^OtaU*HM+)2BSJwaYO z-7Qey`Vsc;C{VoQ97WP&-=<(fru%mW6d=>QMds4{ejM(nVULsV)|s2$a|z5&GIev>Y{~{NpT3V zD(!P(kILBPYcep_Hh7QN#1n0-#(WL?A~EIiQ)AiXC-F+TT@2Yr#tgZLiLoekrjx5? zKij6I4I3u%Qt(`lqp&B=W5AAID&LkZV(Xg3cJnrIk*_M3WtV`8qkKa(@9NvSPp;10 z|K`ZhY@=^tgL{$&M6FiNw^X(7`e|2p&?idYnboSRdUtBi2c0g$p%~sKP{1s;W8WSY z#H+)OYo%jad%9l&M>E!*Ch;I}pW0CCzT(HSIRc{4i-<7Zpjhx?vQr~v@Ig~Gl!SX> z2W{u*rVXbtve6b{itj{q$i495Ta2ap@w1%P)wiEx+bdAHIeBd7`o{-Fybvz3(}D4W zl{q%~5&g_S3E5@lus&LJAttIHP1i21JwB+Z*ZU2^c(kZ~`SWrg zSF5SxMJ1K~D1I7@8{@UBMbF~q(lC;rTf5Y1;c&*y75fmnui6H;@5kIwb(b5n-l{Eu zq+fMs-Kx672L`VS?>w35-BWcRAI!Nh=Cl%@XuH}`Rhl+zGA^7{>PjhyEGH&RwW&Qe zQBP-zxUQgRbZTz;W)#}BC;Dah&@L7!*>tJI!y{23S$m`tyFp#o#JLZu_kDwv)JDCc ziwv5>c|B@?m^YCUW@o&lbiT}HE6nY3i2286iYf#rDb(kq&CB!f-X4p(D3V_n11a__ zaMnxzacWKdGIm*|FH~y{ivzcSU-ux;?@RfaI(PTZI4DIVG>U#o{|Hb>4e46k-$(cTT< zv}HP7#QI!LFgnmEEt^#G*BdD^<yrigKKS)yT>`PhBmMbc&`{>w0#I`&ij)>6f6psMNISf>Fh@7K@Zq)?2tr}I^<>Z0m#xDZkv zIHPNe%0GTBZgS|O){RcAz9b}Tm)f#ZFOE%$|CL-Ti87sP2^`3|!aqdLxlJFtvQTT4 zbhfVlyF87=&DH%cKUqIa;eSzufBoNz)v&LC>FuB2XVX|yqss;*xNI@s^c(w$0Dpmqx3va6Vr^1dH0XVu}tP%oKSdH54( ztpO0|fs$gl-$m#$NpbG>?DXvYQ)iAGoSMCVdS>2ofX&In z+V9WWxzp32#i2s>!C8SE$&9Lw#8=ym)W+u}GvNxD_hBPzKI8KrYDL*L3>sLvA1ywFT>q_)bD znvNybp2)NMIqgZS`COgU=@2xyql#q;#A&9J2T4A|@0jY<+S8hr_k?wqOt^sL>4J2O zO-1wm&|(LpR=tM?tSm~!Zf#)wb~fyrTv$^!%YTYnRGo(=rBObI2JSRt(~-}wJ)y!y z{TOE8ilH279Cq$?nngY?T_^3h%vI^OUy(CJ1> zm5k8t%G4Vc*7r8gwq0meiwwc8I?1FY!T!XtJ<9h1z{(}2Q9cn#VL#n?2V2}m6<8x)q>tDLPbn=cv*+Cw zFD{3x-rIf@-Y^dZr!ENVH<^Iv0Rr6vB)qH_|s{j4h2PzRq@ zMkKf7w7B1d7VpOkk#1FN6#HnK+Jm8^Kp~vZY>NE(iLdv#%0+*afiPk!WYth|0e;7$ zP0?6ZA1Zp7XT9m};tpBr zM~c{)17xf#MEhY%r>De`x;!zEqn5CXc-icsaBhjd@`$Y(-v{ys1u&W`O!b{bY>>A6 zv$M!6sJh>;j~G0Yb}`h_>6QGRlV!2zOW1PjaAt7Sp#Kb@Om`@6GR}}z$*NAGC?Ul-gUnJXcVaK~gmlZ*07?&1v@kVl5fu9TuJdZ$rR@-b z$0lcsvCb>cHrm|o=u4LAD0Om@bF~pXp;Y#8hD_+Qt-b>K4G4P-B_B?><-(|EdJ*?^ z)5)%1O7+S;G+dncEh?qZA$=~VD?{LNgwBr|T6y3@O6ncRBL8zBB(-uIz-sudx@#`U zaq~gSwV5WTMC-IftCgX;C2rL~46E!C>PULGJQVV*8snhM2iFd)Bss$-IG#c6PkLMC zREV&I2DuoD)_&L>wNOL3m# Mponl_N+d4*Kc}i9lK=n! literal 0 HcmV?d00001 diff --git a/src/apps/bin/bison/po/de.po b/src/apps/bin/bison/po/de.po new file mode 100644 index 0000000000..1981900245 --- /dev/null +++ b/src/apps/bin/bison/po/de.po @@ -0,0 +1,1038 @@ +# German translation for message of GNU bison. +# Copyright (C) 1996 Free Software Foundation, Inc. +# Ulrich Drepper , 1996. +# Michael Piefel , 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: bison 1.875\n" +"Report-Msgid-Bugs-To: bug-bison@gnu.org\n" +"POT-Creation-Date: 2004-05-21 10:26-0700\n" +"PO-Revision-Date: 2003-01-02 12:38:45+0100\n" +"Last-Translator: Michael Piefel \n" +"Language-Team: German \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8-bit\n" +"Plural-Forms: nplurals=2; plural=n != 1;\n" + +#: src/complain.c:51 src/complain.c:66 +msgid "warning: " +msgstr "Warnung: " + +#: src/complain.c:122 src/complain.c:138 +msgid "fatal error: " +msgstr "fataler Fehler: " + +#: src/conflicts.c:76 +#, c-format +msgid " Conflict between rule %d and token %s resolved as shift" +msgstr "" +" Konflikt zwischen Regel %d and Token %s wurde durch Schieben gelöst" + +#: src/conflicts.c:84 +#, c-format +msgid " Conflict between rule %d and token %s resolved as reduce" +msgstr "" +" Konflikt zwischen Regel %d and Token %s wurde durch Reduzierung gelöst" + +#: src/conflicts.c:91 +#, c-format +msgid " Conflict between rule %d and token %s resolved as an error" +msgstr "" +" Konflikt zwischen Regel %d and Token %s wurde als Fehler betrachtet" + +#: src/conflicts.c:399 +#, c-format +msgid "conflicts: %d shift/reduce, %d reduce/reduce\n" +msgstr "Konflikte: %d Schiebe/Reduziere, %d Reduziere/Reduziere\n" + +#: src/conflicts.c:402 +#, c-format +msgid "conflicts: %d shift/reduce\n" +msgstr "Konflikte: %d Schiebe/Reduziere\n" + +#: src/conflicts.c:404 +#, c-format +msgid "conflicts: %d reduce/reduce\n" +msgstr "Konflikte: %d Reduziere/Reduziere\n" + +#: src/conflicts.c:422 +#, c-format +msgid "State %d " +msgstr "Zustand %d " + +#: src/conflicts.c:487 +#, fuzzy, c-format +msgid "%%expect-rr applies only to GLR parsers" +msgstr "%%dprec betrifft nur GLR-Parser" + +#: src/conflicts.c:511 +#, c-format +msgid "expected %d shift/reduce conflict" +msgid_plural "expected %d shift/reduce conflicts" +msgstr[0] "erwartete %d Schiebe/Reduziere-Konflikt" +msgstr[1] "erwartete %d Schiebe/Reduziere-Konflikte" + +#: src/conflicts.c:515 +#, fuzzy, c-format +msgid "expected %d reduce/reduce conflict" +msgid_plural "expected %d reduce/reduce conflicts" +msgstr[0] "erwartete 0 Reduziere/Reduziere-Konflikte" +msgstr[1] "erwartete 0 Reduziere/Reduziere-Konflikte" + +#: src/files.c:100 +#, c-format +msgid "cannot open file `%s'" +msgstr "kann Datei »%s« nicht öffnen" + +#: src/files.c:116 +msgid "I/O error" +msgstr "E/A-Fehler" + +#: src/files.c:119 +msgid "cannot close file" +msgstr "kann Datei nicht schließen" + +#: src/files.c:337 +#, c-format +msgid "conflicting outputs to file %s" +msgstr "widersprüchliche Ausgaben in Datei %s" + +#: src/getargs.c:186 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "»%s --help« gibt weitere Informationen.\n" + +#: src/getargs.c:192 +msgid "GNU bison generates parsers for LALR(1) grammars.\n" +msgstr "GNU bison generiert Parser für LALR(1)-Grammatiken.\n" + +#: src/getargs.c:196 +#, c-format +msgid "Usage: %s [OPTION]... FILE\n" +msgstr "Aufruf: %s [OPTION]... DATEI\n" + +#: src/getargs.c:200 +msgid "" +"If a long option shows an argument as mandatory, then it is mandatory\n" +"for the equivalent short option also. Similarly for optional arguments.\n" +msgstr "" +"Wenn eine lange Option ein Argument als erforderlich anzeigt, dann ist es " +"auch\n" +"für die äquivalente kurze Option erforderlich. Ähnlich für optionale " +"Argumente.\n" + +#: src/getargs.c:206 +msgid "" +"Operation modes:\n" +" -h, --help display this help and exit\n" +" -V, --version output version information and exit\n" +" -y, --yacc emulate POSIX yacc\n" +msgstr "" +"Arbeitsmodi:\n" +" -h, --help diese Hilfe anzeigen und beenden.\n" +" -v, --version Versionsinformation anzeigen und beenden.\n" +" -y, --yacc POSIX' yacc emulieren\n" + +#: src/getargs.c:213 +msgid "" +"Parser:\n" +" -S, --skeleton=FILE specify the skeleton to use\n" +" -t, --debug instrument the parser for debugging\n" +" --locations enable locations computation\n" +" -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n" +" -l, --no-lines don't generate `#line' directives\n" +" -n, --no-parser generate the tables only\n" +" -k, --token-table include a table of token names\n" +msgstr "" +"Parser:\n" +" -S, --skeleton=DATEI zu benutzende Skelettdatei angeben\n" +" -t, --debug den Parser auf Debugging-Unterstützung " +"vorbereiten\n" +" --locations Standortberechnung ermöglichen\n" +" -p, --name-prefix=PRÄFIX PRÄFIX vor alle externen Symbole setzen\n" +" -l, --no-lines keine »#line«-Direktiven erzeugen\n" +" -n, --no-parser nur die Tabellen generieren\n" +" -k, --token-table einer Tabellen der Token-Namen mit " +"einschließen\n" + +#: src/getargs.c:225 +msgid "" +"Output:\n" +" -d, --defines also produce a header file\n" +" -r, --report=THINGS also produce details on the automaton\n" +" -v, --verbose same as `--report=state'\n" +" -b, --file-prefix=PREFIX specify a PREFIX for output files\n" +" -o, --output=FILE leave output to FILE\n" +" -g, --graph also produce a VCG description of the " +"automaton\n" +msgstr "" +"Ausgabe:\n" +" -d, --defines auch eine Header-Datei herstellen\n" +" -r, --report=DINGE auch Details des Automaten ausgeben\n" +" -v, --verbose auch eine Erklärung des Automaten herstellen\n" +" -b, --file-prefix=PRÄFIX einen PRÄFIX für Ausgabe-Dateien angeben\n" +" -o, --output=DATEI Ausgabe in DATEI schreiben\n" +" -g, --graph auch eine VCG-Beschreibung des Automaten " +"herstellen\n" + +#: src/getargs.c:236 +msgid "" +"THINGS is a list of comma separated words that can include:\n" +" `state' describe the states\n" +" `itemset' complete the core item sets with their closure\n" +" `lookahead' explicitly associate lookaheads to items\n" +" `solved' describe shift/reduce conflicts solving\n" +" `all' include all the above information\n" +" `none' disable the report\n" +msgstr "" +"DINGE ist eine Liste kommagetrennter Wörter aus:\n" +" »state« die Zustänge beschreiben\n" +" »itemset« die Kernsybolmengen mit ihrem Abschluss vervollständigen\n" +" »lookahead« explizit Vorschau mit Symbolen verbinden\n" +" »solved« Schiebe-/Reduzier-Konfliktlösung beschreiben\n" +" »all« alle oben genannten Informationen\n" +" »none« den Report abschalten\n" + +#: src/getargs.c:247 +msgid "Report bugs to .\n" +msgstr "" +"Berichten Sie Fehler (auf Englisch, mit LC_ALL=C) an .\n" + +#: src/getargs.c:264 +#, c-format +msgid "bison (GNU Bison) %s" +msgstr "bison (GNU Bison) %s" + +#: src/getargs.c:266 +msgid "Written by Robert Corbett and Richard Stallman.\n" +msgstr "Geschrieben von Robert Corbett und Richard Stallman.\n" + +#: src/getargs.c:270 +#, c-format +msgid "Copyright (C) %d Free Software Foundation, Inc.\n" +msgstr "Copyright © %d Free Software Foundation, Inc.\n" + +#: src/getargs.c:272 +msgid "" +"This is free software; see the source for copying conditions. There is NO\n" +"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +msgstr "" +"Dies ist freie Software; die Kopierbedingungen stehen in den Quellen. Es\n" +"gibt keine Garantie; auch nicht für VERKAUFBARKEIT oder FÜR SPEZIELLE " +"ZWECKE.\n" + +#: src/getargs.c:438 +#, c-format +msgid "missing operand after `%s'" +msgstr "fehlender Operand nach »%s«" + +#: src/getargs.c:440 +#, c-format +msgid "extra operand `%s'" +msgstr "zusätzlicher Operand »%s«" + +#: src/gram.c:139 +msgid "empty" +msgstr "leer" + +#: src/gram.c:233 +msgid "Grammar" +msgstr "Grammatik" + +#: src/gram.c:321 src/reduce.c:394 +msgid "warning" +msgstr "Warnung" + +#: src/main.c:124 +msgid "rule never reduced because of conflicts" +msgstr "Regel nie reduziert wegen Konflikten" + +#: src/parse-gram.y:363 +msgid "POSIX forbids declarations in the grammar" +msgstr "POSIX verbietet Deklarationen in der Grammatik" + +#: src/parse-gram.y:486 +msgid "missing identifier in parameter declaration" +msgstr "fehlender Bezeichner in Parameterdeklaration" + +#: src/print.c:49 +#, c-format +msgid " type %d is %s\n" +msgstr " Typ %d ist %s\n" + +#: src/print.c:165 +#, c-format +msgid "shift, and go to state %d\n" +msgstr "schiebe und gehe zu Zustand %d über\n" + +#: src/print.c:167 +#, c-format +msgid "go to state %d\n" +msgstr "gehe zu Zustand %d über\n" + +#: src/print.c:204 +msgid "error (nonassociative)\n" +msgstr "Fehler (nicht assoziativ)\n" + +#: src/print.c:292 +#, c-format +msgid "reduce using rule %d (%s)" +msgstr "reduziere mit Regel %d (%s)" + +#: src/print.c:294 +#, c-format +msgid "accept" +msgstr "annehmen" + +#: src/print.c:325 src/print.c:391 +msgid "$default" +msgstr "$default" + +#: src/print.c:420 +#, c-format +msgid "state %d" +msgstr "Zustand %d" + +#: src/print.c:456 +msgid "Terminals, with rules where they appear" +msgstr "Terminale und die Regeln, in denen sie verwendet werden" + +#: src/print.c:483 +msgid "Nonterminals, with rules where they appear" +msgstr "Nicht-Terminal und die Regeln, in denen sie verwendet werden" + +#: src/print.c:512 +#, c-format +msgid " on left:" +msgstr " auf der linken Seite:" + +#: src/print.c:527 +#, c-format +msgid " on right:" +msgstr " auf der rechten Seite:" + +#: src/print.c:555 +msgid "Rules never reduced" +msgstr "niemals reduzierte Regeln" + +#: src/reader.c:56 +#, c-format +msgid "multiple %s declarations" +msgstr "mehr als eine %s-Deklaration" + +#: src/reader.c:118 +#, c-format +msgid "result type clash on merge function %s: <%s> != <%s>" +msgstr "Rückgabetyp-Konflikt in merge-Funktion %s: <%s> != <%s>" + +#: src/reader.c:216 +#, c-format +msgid "rule given for %s, which is a token" +msgstr "Regel für %s vorhanden, welches aber ein Token ist" + +#: src/reader.c:245 +#, c-format +msgid "type clash on default action: <%s> != <%s>" +msgstr "Typkonflikt bei Default-Aktion: <%s> != <%s>) " + +#: src/reader.c:251 +msgid "empty rule for typed nonterminal, and no action" +msgstr "leere Regel für Nicht-Terminal mit Typ und keine Aktion" + +#: src/reader.c:321 src/reader.c:335 src/reader.c:348 +#, c-format +msgid "only one %s allowed per rule" +msgstr "nur ein %s pro Regel erlaubt" + +#: src/reader.c:331 src/reader.c:346 +#, c-format +msgid "%s affects only GLR parsers" +msgstr "%s betrifft nur GLR-Parser" + +#: src/reader.c:333 +#, c-format +msgid "%s must be followed by positive number" +msgstr "%s muss von positiver Zahl gefolgt sein" + +#: src/reader.c:490 +msgid "no rules in the input grammar" +msgstr "Eingabegrammatik enthält keine Regeln" + +#: src/reduce.c:242 +msgid "useless rule" +msgstr "nutzlose Regel" + +#: src/reduce.c:303 +#, c-format +msgid "useless nonterminal: %s" +msgstr "nutzloses Nicht-Terminal: %s" + +#: src/reduce.c:351 +msgid "Useless nonterminals" +msgstr "Nutzlose Nicht-Terminale" + +#: src/reduce.c:364 +msgid "Terminals which are not used" +msgstr "Nicht genutzte Terminale" + +#: src/reduce.c:373 +msgid "Useless rules" +msgstr "Nutzlose Regeln" + +#: src/reduce.c:389 +#, c-format +msgid "%d rule never reduced\n" +msgid_plural "%d rules never reduced\n" +msgstr[0] "%d Regel wurde niemals reduziert\n" +msgstr[1] "%d Regeln wurden niemals reduziert\n" + +#: src/reduce.c:397 +#, c-format +msgid "%d useless nonterminal" +msgid_plural "%d useless nonterminals" +msgstr[0] "%d nutzloses Nicht-Terminal" +msgstr[1] "%d nutzlose Nicht-Terminale" + +#: src/reduce.c:403 +#, c-format +msgid " and " +msgstr " und " + +#: src/reduce.c:406 +#, c-format +msgid "%d useless rule" +msgid_plural "%d useless rules" +msgstr[0] "%d nutzlose Regel" +msgstr[1] "%d nutzlose Regeln" + +#: src/reduce.c:436 +#, c-format +msgid "start symbol %s does not derive any sentence" +msgstr "es lassen sich keine Sätze vom Startsymbol %s ableiten" + +#: src/scan-gram.l:162 +msgid "stray `,' treated as white space" +msgstr "überzähliges »,« als Freiraum betrachtet" + +#: src/scan-gram.l:225 +#, c-format +msgid "invalid directive: %s" +msgstr "ungültige Direktive: %s" + +#: src/scan-gram.l:283 +#, c-format +msgid "invalid character: %s" +msgstr "ungültiges Zeichen: %s" + +#: src/scan-gram.l:402 +#, fuzzy +msgid "invalid null character" +msgstr "ungültiges Zeichen: %s" + +#: src/scan-gram.l:415 src/scan-gram.l:427 src/scan-gram.l:448 +#, c-format +msgid "invalid escape sequence: %s" +msgstr "unzulässiges Fluchtzeichen: %s" + +#: src/scan-gram.l:417 src/scan-gram.l:429 src/scan-gram.l:450 +#, fuzzy, c-format +msgid "invalid null character: %s" +msgstr "ungültiges Zeichen: %s" + +#: src/scan-gram.l:455 +#, c-format +msgid "unrecognized escape sequence: %s" +msgstr "unbekanntes Fluchtzeichen: %s" + +#: src/scan-gram.l:537 +#, c-format +msgid "missing `{' in `%s'" +msgstr "fehlende »{« in »%s«" + +#: src/scan-gram.l:782 +#, c-format +msgid "$$ of `%s' has no declared type" +msgstr "$$ von »%s« hat keinen deklarierten Typ" + +#: src/scan-gram.l:803 +#, c-format +msgid "$%d of `%s' has no declared type" +msgstr "$%d von »%s« hat keinen deklarierten Typ" + +#: src/scan-gram.l:812 src/scan-gram.l:881 src/scan-gram.l:932 +#, c-format +msgid "integer out of range: %s" +msgstr "Ganzzahl außerhalb des Wertebereichs: %s" + +#: src/scan-gram.l:848 src/scan-gram.l:916 +#, c-format +msgid "invalid value: %s" +msgstr "unzulässiger Wert: %s" + +#: src/scan-gram.l:1036 +#, c-format +msgid "missing `%s' at end of file" +msgstr "fehlendes »%s« am Ende der Datei" + +#: src/scan-gram.l:1047 +#, fuzzy, c-format +msgid "missing `%s' at end of line" +msgstr "fehlendes »%s« am Ende der Datei" + +#: src/symlist.c:97 src/symlist.c:108 +msgid "invalid $ value" +msgstr "unzulässiger $-Wert" + +#: src/symtab.c:85 +#, c-format +msgid "type redeclaration for %s" +msgstr "erneute Deklaration des Typs für %s" + +#: src/symtab.c:102 src/symtab.c:120 +#, c-format +msgid "%s redeclaration for %s" +msgstr "%s erneute Deklaration für %s" + +#: src/symtab.c:139 +#, c-format +msgid "redefining precedence of %s" +msgstr "Vorrang von %s wird erneut definiert" + +#: src/symtab.c:157 +#, c-format +msgid "symbol %s redefined" +msgstr "Symbol %s noch einmal definiert" + +#: src/symtab.c:180 +#, c-format +msgid "redefining user token number of %s" +msgstr "Nutzertokennummer von %s erneut definiert" + +#: src/symtab.c:207 +#, c-format +msgid "symbol %s is used, but is not defined as a token and has no rules" +msgstr "" +"Symbol %s wird benutzt, ist aber nicht als Token definiert und hat keine " +"Regel" + +#: src/symtab.c:232 +#, c-format +msgid "symbol `%s' used more than once as a literal string" +msgstr "Symbol »%s« wird mehr als einmal als literale Zeichenkette benutzt" + +#: src/symtab.c:235 +#, c-format +msgid "symbol `%s' given more than one literal string" +msgstr "Symbol »%s« wird mehr als eine literale Zeichenkette gegeben" + +#: src/symtab.c:271 +#, c-format +msgid "conflicting precedences for %s and %s" +msgstr "Vorrang für %s und %s widersprechen sich" + +#: src/symtab.c:283 +#, c-format +msgid "conflicting associativities for %s (%s) and %s (%s)" +msgstr "Assoziativitäts-Werte für %s (%s) und %s (%s) widersprechen sich" + +#: src/symtab.c:368 +#, c-format +msgid "tokens %s and %s both assigned number %d" +msgstr "Token %s und %s haben die selbe Nummer %d" + +#: src/symtab.c:591 +#, c-format +msgid "the start symbol %s is undefined" +msgstr "das Startsymbol %s ist undefiniert" + +#: src/symtab.c:595 +#, c-format +msgid "the start symbol %s is a token" +msgstr "das Startsymbol %s ist ein Token" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "unzulässiges Argument %s für %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "mehrdeutiges Argument %s für %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Gültige Argumente sind:" + +#: lib/bitset_stats.c:179 +#, c-format +msgid "%u bitset_allocs, %u freed (%.2f%%).\n" +msgstr "%u bitset_allocs, %u freigegeben (%.2f%%).\n" + +#: lib/bitset_stats.c:182 +#, c-format +msgid "%u bitset_sets, %u cached (%.2f%%)\n" +msgstr "%u bitset_sets, %u zwischengespeichert (%.2f%%)\n" + +#: lib/bitset_stats.c:185 +#, c-format +msgid "%u bitset_resets, %u cached (%.2f%%)\n" +msgstr "%u bitset_resets, %u zwischengespeichert (%.2f%%)\n" + +#: lib/bitset_stats.c:188 +#, c-format +msgid "%u bitset_tests, %u cached (%.2f%%)\n" +msgstr "%u bitset_tests, %u zwischengespeichert (%.2f%%)\n" + +#: lib/bitset_stats.c:192 +#, c-format +msgid "%u bitset_lists\n" +msgstr "%u bitset_lists\n" + +#: lib/bitset_stats.c:194 +msgid "count log histogram\n" +msgstr "Zähler-Histogramm\n" + +#: lib/bitset_stats.c:197 +msgid "size log histogram\n" +msgstr "Größe-Histogramm\n" + +#: lib/bitset_stats.c:200 +msgid "density histogram\n" +msgstr "Dichte-Histogramm\n" + +#: lib/bitset_stats.c:214 +#, c-format +msgid "" +"Bitset statistics:\n" +"\n" +msgstr "" +"Bitset-Statistiken:\n" +"\n" + +#: lib/bitset_stats.c:217 +#, c-format +msgid "Accumulated runs = %u\n" +msgstr "Gesammelte Durchläufe = %u\n" + +#: lib/bitset_stats.c:261 lib/bitset_stats.c:266 +msgid "Could not read stats file." +msgstr "Konnte Statistik-Datei nicht lesen." + +#: lib/bitset_stats.c:263 +#, c-format +msgid "Bad stats file size.\n" +msgstr "Ungültige Statistik-Datei-Größe.\n" + +#: lib/bitset_stats.c:289 lib/bitset_stats.c:291 +msgid "Could not write stats file." +msgstr "Konnte Statistik-Datei nicht schreiben." + +#: lib/bitset_stats.c:294 +msgid "Could not open stats file for writing." +msgstr "Konnte Statistik-Datei nicht zum Schreiben öffnen." + +#: lib/error.c:127 +msgid "Unknown system error" +msgstr "Unbekannter Systemfehler" + +#: lib/getopt.c:570 lib/getopt.c:589 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: Option »%s« ist mehrdeutig\n" + +#: lib/getopt.c:622 lib/getopt.c:626 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: Option »--%s« erlaubt kein Argument\n" + +#: lib/getopt.c:635 lib/getopt.c:640 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: Option »%c%s« erlaubt kein Argument\n" + +#: lib/getopt.c:686 lib/getopt.c:708 lib/getopt.c:1039 lib/getopt.c:1061 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: Option »%s« erfordert ein Argument\n" + +#: lib/getopt.c:746 lib/getopt.c:749 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: unbekannte Option »--%s«\n" + +#: lib/getopt.c:757 lib/getopt.c:760 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: unbekannte Option »%c%s«\n" + +#: lib/getopt.c:815 lib/getopt.c:818 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: ungültige Option -- %c\n" + +#: lib/getopt.c:824 lib/getopt.c:827 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ungültige Option -- %c\n" + +#: lib/getopt.c:882 lib/getopt.c:901 lib/getopt.c:1114 lib/getopt.c:1135 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: Option erfordert ein Argument -- %c\n" + +#: lib/getopt.c:954 lib/getopt.c:973 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: Option »-W %s« ist mehrdeutig\n" + +#: lib/getopt.c:997 lib/getopt.c:1018 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: Option »-W %s« erlaubt kein Argument\n" + +#: lib/obstack.c:417 lib/obstack.c:420 lib/xmalloc.c:53 +msgid "memory exhausted" +msgstr "Speicher ausgeschöpft" + +#: lib/quotearg.c:238 +msgid "`" +msgstr "»" + +#: lib/quotearg.c:239 +msgid "'" +msgstr "«" + +#: lib/subpipe.c:171 +#, c-format +msgid "subsidiary program `%s' could not be invoked" +msgstr "untergeordnetes Programm »%s« konnte nicht aufgerufen werden" + +#: lib/subpipe.c:173 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "untergeordnetes Programm »%s« nicht gefunden" + +#: lib/subpipe.c:175 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "untergeordnetes Programm »%s« fehlgeschlagen" + +#: lib/subpipe.c:176 +#, c-format +msgid "subsidiary program `%s' failed (exit status %d)" +msgstr "untergeordnetes Programm »%s« fehlgeschlagen (Rückgabewert %d)" + +#: lib/timevar.c:475 +msgid "" +"\n" +"Execution times (seconds)\n" +msgstr "" +"\n" +"Ausführungszeiten (Sekunden)\n" + +#: lib/timevar.c:525 +msgid " TOTAL :" +msgstr " ZUSAMMEN :" + +#: lib/timevar.c:561 +#, c-format +msgid "time in %s: %ld.%06ld (%ld%%)\n" +msgstr "Zeit in %s: %ld.%06ld (%ld%%)\n" + +#~ msgid "%d shift/reduce conflict" +#~ msgid_plural "%d shift/reduce conflicts" +#~ msgstr[0] "%d Schiebe/Reduziere-Konflikt" +#~ msgstr[1] "%d Schiebe/Reduziere-Konflikte" + +#~ msgid "and" +#~ msgstr "und" + +#~ msgid "conflicts: " +#~ msgstr "Konflikte: " + +#~ msgid "State %d contains " +#~ msgstr "Zustand %d enthält " + +#~ msgid "too many gotos (max %d)" +#~ msgstr "zu viele Gotos (max %d)" + +#~ msgid "too many symbols (tokens plus nonterminals); maximum %d" +#~ msgstr "zu viele Symbole (Token plus Nicht-Terminale); Maximum %d" + +#~ msgid ": unexpected end of file in a comment\n" +#~ msgstr ": Datei endet unerwartet innerhalb eines Kommentars\n" + +#~ msgid ": unexpected end of file in a string\n" +#~ msgstr ": Datei endet unerwartet innerhalb einer Zeichenkette\n" + +#~ msgid ": unexpected end of file in a character\n" +#~ msgstr ": Datei endet unerwartet innerhalb eines Zeichens\n" + +#~ msgid ": unexpected end of file in a braced code\n" +#~ msgstr ": Datei endet unerwartet innerhalb geklammerten Programmtexts\n" + +#~ msgid ": unexpected end of file in a prologue\n" +#~ msgstr ": Datei endet unerwartet innerhalb eines Prologs\n" + +#~ msgid "%s is invalid" +#~ msgstr "%s ist unzulässig" + +#~ msgid "too many states (max %d)" +#~ msgstr "zu viele Zustände (max %d)" + +#~ msgid "%s: no grammar file given\n" +#~ msgstr "%s: keine Grammatik-Datei angegeben\n" + +#~ msgid "%s: extra arguments ignored after `%s'\n" +#~ msgstr "%s: zusätzliche Argumente nach »%s« werden ignoriert\n" + +#~ msgid "two @prec's in a row" +#~ msgstr "zwei @prec-Anweisungen nacheinander" + +#~ msgid "only one %%dprec allowed per rule" +#~ msgstr "nur ein %%dprec pro Regel erlaubt" + +#~ msgid "state_list_append (state = %d, symbol = %d (%s))\n" +#~ msgstr "state_list_append (Zustand = %d, Symbol = %d (%s))\n" + +#~ msgid "Entering new_itemsets, state = %d\n" +#~ msgstr "Betrete new_itemsets, Zustand = %d\n" + +#~ msgid "Entering get_state, symbol = %d (%s)\n" +#~ msgstr "Betrete get_state, Symbol = %d (%s)\n" + +#~ msgid "Exiting get_state => %d\n" +#~ msgstr "Verlasse get_state => %d\n" + +#~ msgid "Entering append_states, state = %d\n" +#~ msgstr "Betrete append_states, Zustand = %d\n" + +#~ msgid "Processing state %d (reached by %s)\n" +#~ msgstr "Verarbeite Zustand %d (erreicht von %s)\n" + +#~ msgid "undefined associativity" +#~ msgstr "undefinierte Assoziativität" + +#~ msgid "Closure: %s\n" +#~ msgstr "Abschluss: %s\n" + +#~ msgid " (rule %d)\n" +#~ msgstr " (Regel %d)\n" + +#~ msgid "input" +#~ msgstr "Eingabe" + +#~ msgid "output" +#~ msgstr "Ausgabe" + +#~ msgid "" +#~ "Variables\n" +#~ "---------\n" +#~ "\n" +#~ msgstr "" +#~ "Variablen\n" +#~ "---------\n" +#~ "\n" + +#~ msgid "Value Sprec Sassoc Tag\n" +#~ msgstr "Wert Spräz Sassoz Tag\n" + +#~ msgid "" +#~ "Rules\n" +#~ "-----\n" +#~ "\n" +#~ msgstr "" +#~ "Regeln\n" +#~ "-----\n" +#~ "\n" + +#~ msgid "" +#~ "Num (Prec, Assoc, Useful, Ritem Range) Lhs -> Rhs (Ritem range) [Num]\n" +#~ msgstr "" +#~ "Num (Präz, Assoz, Nützl., Ritem-Ber.) LS -> RS (Ritem-Ber.) [Num]\n" + +#~ msgid "" +#~ "Rules interpreted\n" +#~ "-----------------\n" +#~ "\n" +#~ msgstr "" +#~ "Regeln interpretiert\n" +#~ "-----------------\n" +#~ "\n" + +#~ msgid "Lookaheads: BEGIN\n" +#~ msgstr "Vorschau: ANFANG\n" + +#~ msgid "State %d: %d lookaheads\n" +#~ msgstr "Zustand %d: %d Vorschauen\n" + +#~ msgid " on %d (%s) -> rule %d\n" +#~ msgstr " auf %d (%s) -> Regel %d\n" + +#~ msgid "Lookaheads: END\n" +#~ msgstr "Vorschau: ENDE\n" + +#~ msgid "relation_transpose: input\n" +#~ msgstr "relation_transpose: Eingabe\n" + +#~ msgid "relation_transpose: output\n" +#~ msgstr "relation_transpose: Ausgabe\n" + +#~ msgid "reduce" +#~ msgstr "durch Reduzierung gelöst" + +#~ msgid "shift" +#~ msgstr "durch Schieben gelöst" + +#~ msgid "%s contains " +#~ msgstr "%s enthält " + +#~ msgid "`%s' is no longer supported" +#~ msgstr "»%s« wird nicht länger unterstützt" + +#~ msgid "unexpected `/' found and ignored" +#~ msgstr "»/« wird hier nicht erwartet und wird deshalb ignoriert" + +#~ msgid "unterminated comment" +#~ msgstr "unbeendeter Kommentar" + +#~ msgid "unescaped newline in constant" +#~ msgstr "nicht maskiertes Zeilenendezeichen in Konstante" + +#~ msgid "octal value outside range 0...255: `\\%o'" +#~ msgstr "oktaler Zahlenwert außerhalb des Bereichs 0...255: »\\%o«" + +#~ msgid "hexadecimal value above 255: `\\x%x'" +#~ msgstr "hexadezimaler Zahlenwert größer als 255: »\\x%x«" + +# Oder soll man den Begriff "Escapezeichen" verwenden? +#~ msgid "unknown escape sequence: `\\' followed by `%s'" +#~ msgstr "unbekanntes Escapezeichen: »\\« gefolgt von »%s«" + +#~ msgid "unterminated type name at end of file" +#~ msgstr "unerwarteter Typname am Ende der Datei" + +#~ msgid "unterminated type name" +#~ msgstr "unerwarteter Typname" + +#~ msgid "use \"...\" for multi-character literal tokens" +#~ msgstr "für Literal mit mehreren Zeichen bitte \"...\" verwenden" + +#~ msgid "`%s' supports no argument: %s" +#~ msgstr "»%s« unterstützt kein Argument: %s" + +#~ msgid "`%s' requires an argument" +#~ msgstr "die Option »%s« erfordert ein Argument" + +#~ msgid " %-4s\terror (nonassociative)\n" +#~ msgstr " %-4s\tFehler (nicht assoziativ)\n" + +#~ msgid "" +#~ " $default\treduce using rule %d (%s)\n" +#~ "\n" +#~ msgstr "" +#~ " $default\treduziere mit Regel %d (%s)\n" +#~ "\n" + +#~ msgid " %-4s\t[reduce using rule %d (%s)]\n" +#~ msgstr " %-4s\t[reduziere mit Regel %d (%s)]\n" + +#~ msgid " %-4s\treduce using rule %d (%s)\n" +#~ msgstr " %-4s\treduziere mit Regel %d (%s)\n" + +#~ msgid " $default\treduce using rule %d (%s)\n" +#~ msgstr " $default\treduziere mit Regel %d (%s)\n" + +#~ msgid " $default\taccept\n" +#~ msgstr " $default\takzeptiere\n" + +#~ msgid " NO ACTIONS\n" +#~ msgstr " KEINE AKTIONEN\n" + +#~ msgid "Number, Line, Rule" +#~ msgstr "Nummer, Zeile, Regel" + +#~ msgid " %3d %3d %s ->" +#~ msgstr " %3d %3d %s ->" + +#~ msgid " Skipping to next \\n" +#~ msgstr " Überspringe Zeichen bis zum nächsten \\n" + +#~ msgid " Skipping to next %c" +#~ msgstr " Überspringe Zeichen bis zum nächten %c" + +#~ msgid "unterminated string" +#~ msgstr "unbeendete Zeichenkette" + +#~ msgid "unterminated `%{' definition" +#~ msgstr "unbeendete »%{«-Definition" + +#~ msgid "Premature EOF after %s" +#~ msgstr "Vorzeitiges EOF nach %s" + +#~ msgid "`%s' is invalid in %s" +#~ msgstr "»%s« ist in %s nicht erlaubt" + +#~ msgid "invalid %s declaration" +#~ msgstr "ungültige %s-Deklaration" + +#~ msgid "%type declaration has no " +#~ msgstr "%type-Deklaration hat keinen " + +#~ msgid "invalid %%type declaration due to item: %s" +#~ msgstr "ungültige %%type-Deklaration wegen: %s" + +#~ msgid "invalid text (%s) - number should be after identifier" +#~ msgstr "unzulässiger Text (%s) - Zahl sollte nach Bezeichner kommen" + +#~ msgid "unexpected item: %s" +#~ msgstr "unerwartetes Symbol: %s" + +#~ msgid "unmatched %s" +#~ msgstr "%s ohne Gegenstück" + +#~ msgid "argument of %%expect is not an integer" +#~ msgstr "Argument von %%expect ist keine ganze Zahl" + +#~ msgid "unrecognized item %s, expected an identifier" +#~ msgstr "unerwartetes Symbol %s, hier wird ein Bezeichner erwartet" + +#~ msgid "expected string constant instead of %s" +#~ msgstr "hier wird eine Zeichenkette erwartet, nicht %s" + +#~ msgid "no input grammar" +#~ msgstr "keine Eingabe-Grammatik" + +#~ msgid "unknown character: %s" +#~ msgstr "unbekanntes Zeichen: %s" + +#~ msgid "ill-formed rule: initial symbol not followed by colon" +#~ msgstr "" +#~ "falsch geformte Regel: führendes Symbol wird nicht von einem Semikolon " +#~ "gefolgt" + +#~ msgid "grammar starts with vertical bar" +#~ msgstr "Grammatik fängt mit einem vertikalen Strich (»|«) an" + +#~ msgid "previous rule lacks an ending `;'" +#~ msgstr "vorangehende Regel hat kein abschließendes »;«" + +#~ msgid "%%guard present but %%semantic_parser not specified" +#~ msgstr "" +#~ "%%guard-Anweisung vorhanden, jedoch wird %%semantic_parser nicht angegeben" + +#~ msgid "two actions at end of one rule" +#~ msgstr "Zwei Aktionen am Ende einer Regel" + +#~ msgid "maximum table size (%d) exceeded" +#~ msgstr "maximale Tabellengröße (%d) überschritten" + +#~ msgid " $ \tgo to state %d\n" +#~ msgstr " $ \tgehe zu Zustand %d über\n" + +#~ msgid "unterminated %guard clause" +#~ msgstr "unbeendeter %guard-Fall" diff --git a/src/apps/bin/bison/po/en@boldquot.header b/src/apps/bin/bison/po/en@boldquot.header new file mode 100644 index 0000000000..fedb6a06d1 --- /dev/null +++ b/src/apps/bin/bison/po/en@boldquot.header @@ -0,0 +1,25 @@ +# All this catalog "translates" are quotation characters. +# The msgids must be ASCII and therefore cannot contain real quotation +# characters, only substitutes like grave accent (0x60), apostrophe (0x27) +# and double quote (0x22). These substitutes look strange; see +# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html +# +# This catalog translates grave accent (0x60) and apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019). +# It also translates pairs of apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019) +# and pairs of quotation mark (0x22) to +# left double quotation mark (U+201C) and right double quotation mark (U+201D). +# +# When output to an UTF-8 terminal, the quotation characters appear perfectly. +# When output to an ISO-8859-1 terminal, the single quotation marks are +# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to +# grave/acute accent (by libiconv), and the double quotation marks are +# transliterated to 0x22. +# When output to an ASCII terminal, the single quotation marks are +# transliterated to apostrophes, and the double quotation marks are +# transliterated to 0x22. +# +# This catalog furthermore displays the text between the quotation marks in +# bold face, assuming the VT100/XTerm escape sequences. +# diff --git a/src/apps/bin/bison/po/en@quot.header b/src/apps/bin/bison/po/en@quot.header new file mode 100644 index 0000000000..a9647fc35c --- /dev/null +++ b/src/apps/bin/bison/po/en@quot.header @@ -0,0 +1,22 @@ +# All this catalog "translates" are quotation characters. +# The msgids must be ASCII and therefore cannot contain real quotation +# characters, only substitutes like grave accent (0x60), apostrophe (0x27) +# and double quote (0x22). These substitutes look strange; see +# http://www.cl.cam.ac.uk/~mgk25/ucs/quotes.html +# +# This catalog translates grave accent (0x60) and apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019). +# It also translates pairs of apostrophe (0x27) to +# left single quotation mark (U+2018) and right single quotation mark (U+2019) +# and pairs of quotation mark (0x22) to +# left double quotation mark (U+201C) and right double quotation mark (U+201D). +# +# When output to an UTF-8 terminal, the quotation characters appear perfectly. +# When output to an ISO-8859-1 terminal, the single quotation marks are +# transliterated to apostrophes (by iconv in glibc 2.2 or newer) or to +# grave/acute accent (by libiconv), and the double quotation marks are +# transliterated to 0x22. +# When output to an ASCII terminal, the single quotation marks are +# transliterated to apostrophes, and the double quotation marks are +# transliterated to 0x22. +# diff --git a/src/apps/bin/bison/po/es.gmo b/src/apps/bin/bison/po/es.gmo new file mode 100644 index 0000000000000000000000000000000000000000..ec44b4e3b9201701bc31fe7bf30efc6c44a7a5a6 GIT binary patch literal 14972 zcmb`NZHygPdB;zhgoMjWAPIr+(w-1+yawO(+K|Mo?clYuwl}qR-Q9Hp1j^3dJNNFy zb7w9ybJt!|8VXUR6jiCzrj%AH1yragRYjqE;6qg^RHT-mR#gQOh1L?S8dWZ$s8j?h z_4hw#X70V~b(}y)KKs9O=Da-TInUd9j=z2Lbx#_e$0)C*9K6n$&w=l}kv}|>FEZve z;4bh!a1J~OJ_a5DzXZMt{9o{T@U|Bl^Fr{oU<14hyb0V3{v0?9S}*`L#RtGC@Ixhj zvHbotsCgSNVGQst@Ri^x@OCgP@lkL$?;inQ2mUoU0e+{fZ@ko)Chzxx77Rg+_p6}j z`I8c#0@d#l_%iSoh}QcK@J{dna0i%x*MPqX-UdDiz5@IVcq{l<;57JkQ1jf#V6O)E zfLhN3;6AVe-T;0C6u&+OJ^}tQ_y+L6%lQU&z;l}LX7&I$e~U4n<^AKJ=viTMews~C z*;8WbPD4vHT?0Pg_rqH-2I0cxCI1E;{> z2gU!VK>nF)5Oxb%Q17$gB)AGn-W~@<@8>}aehn1AzYC&@<_0PyueX9uzriQ2VSbQ* z<_mWivjBb_TmjS-@zbzd0zq{-8=@0 zAD;v*`1d9L7pQ)>pgfY3L!jC%fa2pOsP7*KuK~Xbvc=|Wpy>S%Q2cx;n=g9q0`CPM z0wKjb0csteFY7OY;`8kcF8<#Meg>QdC6C_%e+PUalYW5-KMsnXxAXCvygvp?4pvbv z@#P7y0e%wv1HOM2)P66)RE9D!_=n(=pw@8!A`vkYf}-z(p!DXCKuo0h3sC%h3e>(l z4Qk!D!^|7N*MM68ouKskFsSj)fOmj7cn|m_DE@pEWXa~cpvHUUKEE%=!Na_7f@=3g zP<;Frcs=;v<@X-c9-?Qgr=uX8^rzCH+|LgrCWeEcY=_Fo1y?~lOy z!Bl~Z?!Mq-PC3pf9e^){6M*?d9 z3-B6nk)lU?&s6TYnZKG#&s#mXzqgmakCrGp^=RFC5Lx$x{MBC0Qr=GqD0&{E+(%iV zyp!@EMb8|C?QxG}S9+$s(DQc60~E~3*z?}(peIA_5i7&rg zzIRIel@iZ@@1a~xn3AfoV}zDG3G9F-w%kD0-wn znfv8+^Co_urSvJ16+LW=lZSZ_kuo2ooTKPLC5)x~5@kT?QmW@XKdz(PN|Bttiz4}w zY_C!Dyq+yp`B>kAZgnoJxk3* zZnH2?c^fLrwRo1U8 z>aOc&vDtU)igFgzFgteGv}0E%@||{_MJ1_ihpjk(I@i+dfCbOqpdEICL0lLbI-Vur zMwr1VEwA0Esu}vS`avGXVXjG&BFuVG62xl0O?5t6uUWRf(|{f6bi!7Vv)Xvm9zVHc z`$3k6nfulo`TCe9s_460bZ)v-vzGY(B&qpEG%7>nl>Y9dUMqTZ1G+@488Jfjy{K zB?kG0Zu{M>hwlTs78Q9|yjwhM<-094oh)Re$%(0bor#HEQ=_foC@;jnx*JRj3*W63 zwAM%ZjkbC&ZHkbg-TapgwA0MCT7%vo4hkm721#xYL1@Dq3EDO<0tB=ZVOw%o0J%rp zirfdtjavCkqhXGw{Y|H^cJk;hJJGhsSfyP~JHh}$Sq z0Z%biBhyHR&t=GY(w!PdOP+V*@sJvS!AvZ_7oZBV4y=5AZ8vy!Ng zHq^BZO~(f-9YF6;AImtI*6kECi1T#H+U2MhVa2cm>fpbjy_L#|!iAyLVJFW;#k#X! zxjnZY!eb`cv_Zcg2ANsxYtix@y|f*&L)JFecO%y8Vchq&w;kpEIM}2c%YC`(Z2U zzZ^Km)dLyruMgY$Ut=o`?1M*- z;|B9q7I~q<0ZQhEYc_rlAZsmZ=cUVZ8<^t{T;oy~%xUL?+zu^k{`@RX55A4jTrF6$ zR1Jta~<=4W2DXaGSO_O@`#mD zv8#8g3BCyT){yDba&_cZP7vX2s%LQ&t_hr~EN?P%tEluzrw7V|A z(=zcFOHLOo+|IQJ2l>%-*6(mP8BC>F_dcx05<$q8n8qwiv}LVLsYmjXR$fRU6pZZ! zHV;{b^9<+G4ACjpgTl6m21=?VD63vaDvG@%61zC*&>UjRDn`18tJ>+CY1@!1->8*h z!1SHza5v7j(K*U&D^Bx4CZSr5)AVd0Ti`|r&-V#`qXLT=_II za^g}^AkPJ*dwk%>YJEJNTSd%X3|Dd6RWGQn_aTnm(t@=VwH+~rnv2*Ffv6s=tP@vp z!kesySt&zD8SbdHj*Tav!x5r8?cv9(Sojs0ZT=~mfMV}w55T^X>**lFcFGL3aLp`7 z3vA<6(lJ|AoZ{9y$w>V)KBbf}l5X{Z7p-9X&C-urhmO{^b11+bu&Kn_pR& zTVA%u7MJX-Jw3a$GJo{U$=M})`pgmrW)3l1$u;7DFCJ(yd48fg!c=7bg{Nlp9rlzL6F*Ii`554ocQUP{u9&}M{?J>pI8S@aa zLBWcMo|jT$=7NJ$#*vAz7E`bU|AVY;QG__gXG7Vl!B2(#!qfq6?Sw^{I7)==gNsSU z8AlXn5cA{)tbIOg#S3I8_)KQkaC-m21Ge=+O-I2 zk;<_&3Hr@*j2VeNK&;G7p=VbjDoS+SF}81gRUP>eyq z2GbXUMya}U_cn>@ z)&q`{n3rCZ=aP|CouDw}@`sS^gth+mUJi7LUwl;;v3*66j z7j)D@GZ_NGBEsBj(Ie;8+_0@qc{QqRWRxh*tU?iYF2&TFyKIf?Vs!E)b{v;@ zEoLGg{f1RVsJy#$r{-Z3MVAA|4$&aFajM3l3vzwlfy_d_t`M>pW?htekT@Y^jv0G! zBEQexamb-@BXo%Xyz!h+gzl`nbE$5A-)1bUVAsMHJ45UzcUw9j(-s`9q&GypkgStbKTylT zS{}8d0Qn&l*OqvxY1Jn;TqvRoYZ>hdjXQ+kSN&`!b?k6TH6Y2;-gU*{WL`TuOPb+w zVX!>sZsH$z^imsts_5OMYx; zlHdxic`Re*3{zFFtuO>2QsWA-vZu535sZ0rzTJG#A3|sB@JzpVYX7}=H+&CTh%oBQ_Kz0))M?rBcnJ3URq z=2Ey3>Bu{5_on9b-sbc^yLaEro9}(&^j_MX4DzD6f~C*Nn4}o%g{YOr7jt_&$Xb_z z=IOAV1&^@z2a_%}QP9Mrxtha4tLNfz#z?vYqMhbS81!cBaz98S49&qXKO9HC$*K8M zbHml|otkbOl~YWZ8y7ia3w+fcj_^@(z{+zFIUkx|UTp5)fA?FOdxwohXeZ2?b4e?0 z!{!;g9}X3b)A0aNZXV+#k0>R5_nIHtcfk6ehb9wQx4pX#G)!Y9!cC_#-Zo@s2CeA( zi89h%1T!r&(sOZb!%`dzX2r$6X2Zyy{R9c9e$vu$4l774sg9EAuWK+$zno#cL33(!86H9@(fN{Z!RegIV0I{C!g?%SionaU4={Qk{MTGoTVf7 zX@BGci`lqHW<2oU*uL^}nGolD(C*1Y%3M7&Oo)q*3^v+C z6%<}Rkk5=ikD1GS_w(;@WpX{+o`v4a*rb$s!kN5cW!0cw%~*pv-93^ek0TCiNP><( z&ofi*^-O8*r|ZsaP(4eXF27pCVa|N}mOIUyw}pfT?6uFKw=w)aeSVC?r36$q6Zvgl zQnoyh$~Y-YIc&}i>z!@&w*@~zI(-2>a4Dj-jHC&crL*niE(;z&4w=FN^G{CM_lrZK z48@X<4&pQ6)srPZE*2%$z_ZP*Byh_BwisJ;BuF}lul2Tlo+p}zzBlM$IMBvpFLl8jgmcu9ADg3Jufqm|Ust)5(;*pGXTg z4L6nUcE=uXr^<^kq*Id3Nt7UmHNefvNHQlXfJu;1!UM9s~qA_dRbwk%GJ3Y%N>Wbxbc+!(Gzn^4CJ1GbQ0T)U&F(>_VWM7=3N_g?JC{N zsp|6F{&s6BllyK>jN|kDqf09j{G8O*FX1rDfI+eeL+LT1b!N79v)g9*hs&r~g4Kd2 zb)Fy1DjN7F}$?+6#=K zWr~>Xv;W#&vSPvaxJRnD)`uMVC1w5DV4`X60n)4F|1sV^hc9ZX%uG<-1BikvC;!PS zlQkiP9}YndkMwZBq|K}4|2GvV_!|IbR>ruurZ9=0Lz~ku^DfOQ0dSVeCCg|PTEo6SqQO&|tr#bN49ZBFi>MXU`|*oW2nD!?V<19wB< zOv5EE4a$9}+lWD;!wst5{(sF>dHni9gH31nH1_A8lE;wc{wI#3YxIcVQ>&$bZ+Dl# zo)#%4oncGM?IfFIJeiwR+O_)JuM^lI7s8XBR9Y)Y>bnHKJi9L<4B^DaURL+@L|<8W z!1lP-a=`>SM#Q#soNlx>cQ4Mizyxj>qF~D6{nmrc#sW98XBK8HXI~a_Dd1Wm;$+~? zL8T8px~R*A`Pq~6@0dM0{|^f`wX^rno?h`U+$+r5GYgF~%Znp-3=NV31Dyp{Cx*8R zj-uX0-C;TxE%qs_DkBJN7V;Y6y0wEoB2CR1Z@ko2xd>f0h=}sC!5io;uDm+OEO~XQ zUQe>+b?Ba#VV&5>|4N*5F_w-e+18r}t|GR-ci`F~$V@$=h;t{1A2W;sCr&dX7Z2{I zyLiAVvFBdn@VgmjCG2(SvdrjLbap&`gPS`|Ex|GyUR89T#+^hPi&+MZ5aVtoHbs_8 zlzPAB+{g+%Jx zL*&TOeDZns7)~&}&(QS4`i80RG9*p0qB>;Dhxe?i2syirHK7$Z9x$+BHiFir)c7N@ zewS*XGwd*86mR@#e^b?{k~?O~>T)9mF~ggWa*x;`Dc{tLc%;#ev+~tUq80S|M$ZwE|GKdu0t{Bx(0ZFo8Dd}&D{hF zu|q5Lr=SsWuj?chmB6=x?4s^OhCSRkL*HBV3S2$^Nm3UgL~%@u((96ByoINrs`FI2 zdlLEt-IO&1rW3@txfa3?_qAZHkIM%BYVRw}^37JcFF~{&UwjQsstXgwV7*i*UhoN2 z?WG%rC0^tjB}>cskcXPr+Ks`}&b_;Vd(ZeA6xFyi?9lweRaPT;DNh;@!)(gfy8{(H zppOF+3v7nn8PXgm{V-w{)&yXlfn6j$VtXr(&{d5$P|!e(kjZ!n)syqU69DiS8`_nYxUdPkR zLd!FdE_XaFC@EGmyUHXGO(-KmDyHdXjfJP;6T@GGS-J&eVQ%%c{5d1)Q>b1oYO$s1 z*mwr5u1445#VKTtG^vv#g%>P98&MjB@)pR9bt;cU3_j9fBfQ|r+R}4m{_TZeipVOP<=vIDDr^o(UX1LRmdb#XMyxc2WtJN<%oQy7Fk|TK{KAOiEW, 1998. +# +# Corregido por: +# +# cll - Carlos Linares López clinares@acm.org +# clinares@delicias.dia.fi.upm.es +# +# Notas: +# +# 1. Nicolás, en algunas ocasiones notarás que algunos `msgstr' no están +# indentados como los `msgid'. No te preocupes, eso es porque yo utilizo +# el `po-mode' de Emacs, ... Él es el responsable de esas indentaciones +# del `msgstr' :) +# +# 2. Todos los comentarios que contengan "Duda:" debieran revisarse. +# +# -------------------------------------------------------------------- +# En mi opinión has hecho un excelente trabajo y te animo a que sigas +# manteniendo esta traducción y a que lo intentes con otras. +# +# (¡te lo dice el tío que ha traducido el paquete más grande: 1406 +# mensajes en el clisp!) +# +# Carlos Linares +# -------------------------------------------------------------------- +# +msgid "" +msgstr "" +"Project-Id-Version: GNU bison 1.875\n" +"Report-Msgid-Bugs-To: bug-bison@gnu.org\n" +"POT-Creation-Date: 2004-05-21 10:26-0700\n" +"PO-Revision-Date: 2003-01-02 12:47+0100\n" +"Last-Translator: Nicolás García-Pedrajas \n" +"Language-Team: Spanish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8-bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: src/complain.c:51 src/complain.c:66 +msgid "warning: " +msgstr "aviso: " + +# Duda: desconozco cuál será el convenio en la lista de correo a +# propósito de "fatal". Por favor, comprueba que "error grave" es +# preferido por todos los miembros a "error fatal" - cll +# veremos que dice la mayoría, como hay otros 2 revisores +# La verdad es que a mi lo de error fatal me suena fatal +# ngp +# +#: src/complain.c:122 src/complain.c:138 +msgid "fatal error: " +msgstr "error grave: " + +#: src/conflicts.c:76 +#, c-format +msgid " Conflict between rule %d and token %s resolved as shift" +msgstr "" +" El conflicto entre la regla %d y el terminal %s se resuelve como " +"desplazamiento." + +#: src/conflicts.c:84 +#, c-format +msgid " Conflict between rule %d and token %s resolved as reduce" +msgstr "" +" El conflicto entre la regla %d y el terminal %s se resuelve como " +"reducción." + +#: src/conflicts.c:91 +#, c-format +msgid " Conflict between rule %d and token %s resolved as an error" +msgstr "" +" El conflicto entre la regla %d y el terminal %s se resuelve como un " +"error." + +#: src/conflicts.c:399 +#, c-format +msgid "conflicts: %d shift/reduce, %d reduce/reduce\n" +msgstr "conflictos: %d desplazamiento/reducción, %d reducción/reducción\n" + +# Date cuenta de que `%d' puede ser cualquier número decimal. Podría +# ocurrir, por lo tanto, que tu mensaje en ejecución se vea luego como: +# +# 23845789243789 desplazamiento/reducción +# +# (¡estoy exagerando!, por supuesto :) +# +# Te sugiero por lo tanto que añadas el caso (s) tal y como se hace en +# español habitualmente. +# ok +# ngp +# +#: src/conflicts.c:402 +#, c-format +msgid "conflicts: %d shift/reduce\n" +msgstr "conflictos: %d desplazamiento(s)/reducción(ones)\n" + +# Date cuenta de que `%d' puede ser cualquier número decimal. Podría +# ocurrir, por lo tanto, que tu mensaje en ejecución se vea luego como: +# +# 23845789243789 reducción/reducción +# +# (¡estoy exagerando!, por supuesto :) +# +# Te sugiero por lo tanto que añadas el caso (s) tal y como se hace en +# español habitualmente. +# +# ok +# ngp +#: src/conflicts.c:404 +#, c-format +msgid "conflicts: %d reduce/reduce\n" +msgstr "conflictos: %d reducción(ones)/reducción(ones)\n" + +#: src/conflicts.c:422 +#, c-format +msgid "State %d " +msgstr "Estado %d " + +#: src/conflicts.c:487 +#, fuzzy, c-format +msgid "%%expect-rr applies only to GLR parsers" +msgstr "%s afecta sólo a los analizadores GLR" + +#: src/conflicts.c:511 +#, c-format +msgid "expected %d shift/reduce conflict" +msgid_plural "expected %d shift/reduce conflicts" +msgstr[0] "esperado %d conflicto desplazamiento/reducción" +msgstr[1] "esperados %d conflictos desplazamiento/reducción" + +#: src/conflicts.c:515 +#, fuzzy, c-format +msgid "expected %d reduce/reduce conflict" +msgid_plural "expected %d reduce/reduce conflicts" +msgstr[0] "esperados 0 conflictos reducción/reducción" +msgstr[1] "esperados 0 conflictos reducción/reducción" + +#: src/files.c:100 +#, c-format +msgid "cannot open file `%s'" +msgstr "no se puede abrir el fichero `%s'" + +#: src/files.c:116 +msgid "I/O error" +msgstr "Error de E/S" + +#: src/files.c:119 +msgid "cannot close file" +msgstr "no se puede cerrar el fichero" + +#: src/files.c:337 +#, c-format +msgid "conflicting outputs to file %s" +msgstr "salidas en conflicto al fichero %s" + +#: src/getargs.c:186 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "Pruebe `%s --help' para más información.\n" + +#: src/getargs.c:192 +msgid "GNU bison generates parsers for LALR(1) grammars.\n" +msgstr "GNU bison genera analizadores para gramáticas LALR(1).\n" + +#: src/getargs.c:196 +#, c-format +msgid "Usage: %s [OPTION]... FILE\n" +msgstr "Utilización: %s [OPCIÓN]... FICHERO\n" + +#: src/getargs.c:200 +msgid "" +"If a long option shows an argument as mandatory, then it is mandatory\n" +"for the equivalent short option also. Similarly for optional arguments.\n" +msgstr "" +"Si una opción larga muestra un argumento como obligatorio, entonces es " +"obligatorio\n" +"para la opción corta equivalente también. De igual forma para los argumentos " +"opcionales.\n" + +#: src/getargs.c:206 +msgid "" +"Operation modes:\n" +" -h, --help display this help and exit\n" +" -V, --version output version information and exit\n" +" -y, --yacc emulate POSIX yacc\n" +msgstr "" +"Modos de operación:\n" +" -h, --help muestra esta ayuda y termina\n" +" -V, --version informa de la versión y termina\n" +" -y, --yacc emula POSIX yacc\n" + +#: src/getargs.c:213 +msgid "" +"Parser:\n" +" -S, --skeleton=FILE specify the skeleton to use\n" +" -t, --debug instrument the parser for debugging\n" +" --locations enable locations computation\n" +" -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n" +" -l, --no-lines don't generate `#line' directives\n" +" -n, --no-parser generate the tables only\n" +" -k, --token-table include a table of token names\n" +msgstr "" +"Analizador:\n" +" -S, --skeleton=FICHERO especifica el skeleton a utilizar\n" +" -t, --debug instrumenta al analizador para depuración\n" +" --locations abilita la computación de localizaciones\n" +" -p, --name-prefix=PREFIJO preañade PREFIJO a los símbolos externos\n" +" -l, --no-lines no genera la directiva `#line'\n" +" -n, --no-parser solamente genera las tablas\n" +" --k, --token-table incluye una tabla de nombres de terminales\n" + +#: src/getargs.c:225 +msgid "" +"Output:\n" +" -d, --defines also produce a header file\n" +" -r, --report=THINGS also produce details on the automaton\n" +" -v, --verbose same as `--report=state'\n" +" -b, --file-prefix=PREFIX specify a PREFIX for output files\n" +" -o, --output=FILE leave output to FILE\n" +" -g, --graph also produce a VCG description of the " +"automaton\n" +msgstr "" +"Salida:\n" +" -d, --defines también produce un fichero de cabecera\n" +" -r, --report=THINGS también produce detalles del automaton\n" +" -v, --verbose también produce una explicación del automaton\n" +" -b, --file-prefix=PREFIJO especifia el PREFIJO para los ficheros de " +"salida\n" +" -o, --output=FICHERO almacena la salida en FICHERO\n" +" -g, --graph también produce una descripción en VCG del " +"automaton\n" + +#: src/getargs.c:236 +msgid "" +"THINGS is a list of comma separated words that can include:\n" +" `state' describe the states\n" +" `itemset' complete the core item sets with their closure\n" +" `lookahead' explicitly associate lookaheads to items\n" +" `solved' describe shift/reduce conflicts solving\n" +" `all' include all the above information\n" +" `none' disable the report\n" +msgstr "" +"THINGS es una lista de palabras separadas por comas que puede incluir:\n" +" `state' describe los estados\n" +" `itemset' completa los conjuntos de ítems núcleo con sus cierres\n" +" `lookahead' asocia explícitamente lookaheads a los ítems\n" +" `solved' describe la resolución de los conflictos desplazamiento/" +"reducción\n" +" `all' incluye toda la información anterior\n" +" `none' disable the report\n" + +#: src/getargs.c:247 +msgid "Report bugs to .\n" +msgstr "Informe de los errores a .\n" + +#: src/getargs.c:264 +#, c-format +msgid "bison (GNU Bison) %s" +msgstr "bison (GNU bison) %s" + +#: src/getargs.c:266 +msgid "Written by Robert Corbett and Richard Stallman.\n" +msgstr "Escrito por Robert Corbett y Richard Stallman.\n" + +#: src/getargs.c:270 +#, c-format +msgid "Copyright (C) %d Free Software Foundation, Inc.\n" +msgstr "Copyright (C) %d Free Software Foundation, Inc.\n" + +#: src/getargs.c:272 +msgid "" +"This is free software; see the source for copying conditions. There is NO\n" +"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +msgstr "" +"Esto es software libre; mire el fuente para las condiciones de copia. No " +"hay\n" +"NINGUNA garantía; ni siquiera para COMERCIALIZACIÓN o ADAPTACIÓN PARA UN\n" +"USO PARTICULAR\n" + +#: src/getargs.c:438 +#, c-format +msgid "missing operand after `%s'" +msgstr "falta un operando después de `%s'" + +#: src/getargs.c:440 +#, c-format +msgid "extra operand `%s'" +msgstr "operando extra `%s'" + +#: src/gram.c:139 +msgid "empty" +msgstr "vacío" + +#: src/gram.c:233 +msgid "Grammar" +msgstr "Gramática" + +#: src/gram.c:321 src/reduce.c:394 +msgid "warning" +msgstr "aviso" + +#: src/main.c:124 +msgid "rule never reduced because of conflicts" +msgstr "la regla nunca se redujo debido a los conflictos" + +#: src/parse-gram.y:363 +msgid "POSIX forbids declarations in the grammar" +msgstr "POSIX prohíbe declaraciones en a gramática" + +#: src/parse-gram.y:486 +msgid "missing identifier in parameter declaration" +msgstr "falta el identificador el la declaración del parámetro" + +#: src/print.c:49 +#, c-format +msgid " type %d is %s\n" +msgstr " el tipo %d es %s\n" + +#: src/print.c:165 +#, c-format +msgid "shift, and go to state %d\n" +msgstr "desplazar e ir al estado %d\n" + +#: src/print.c:167 +#, c-format +msgid "go to state %d\n" +msgstr "ir al estado %d\n" + +#: src/print.c:204 +msgid "error (nonassociative)\n" +msgstr "error (no asociativo)\n" + +#: src/print.c:292 +#, c-format +msgid "reduce using rule %d (%s)" +msgstr "reduce usando la regla %d (%s)" + +#: src/print.c:294 +#, c-format +msgid "accept" +msgstr "aceptar" + +#: src/print.c:325 src/print.c:391 +msgid "$default" +msgstr "$default" + +#: src/print.c:420 +#, c-format +msgid "state %d" +msgstr "estado %d" + +#: src/print.c:456 +msgid "Terminals, with rules where they appear" +msgstr "Terminales con las reglas donde aparecen" + +#: src/print.c:483 +msgid "Nonterminals, with rules where they appear" +msgstr "No terminales con las reglas donde aparecen" + +#: src/print.c:512 +#, c-format +msgid " on left:" +msgstr " en la izquierda:" + +#: src/print.c:527 +#, c-format +msgid " on right:" +msgstr " en la derecha:" + +#: src/print.c:555 +msgid "Rules never reduced" +msgstr "Reglas nunca reducidas" + +#: src/reader.c:56 +#, c-format +msgid "multiple %s declarations" +msgstr "múltiples declaraciones de %s" + +#: src/reader.c:118 +#, c-format +msgid "result type clash on merge function %s: <%s> != <%s>" +msgstr "tipo resultado incompatible en la función combinada %s: <%s> != <%s>" + +#: src/reader.c:216 +#, c-format +msgid "rule given for %s, which is a token" +msgstr "se ha dado una regla para %s, que es un terminal" + +#: src/reader.c:245 +#, c-format +msgid "type clash on default action: <%s> != <%s>" +msgstr "incompatibilidad de tipos en la acción por defecto: <%s> != <%s>" + +#: src/reader.c:251 +msgid "empty rule for typed nonterminal, and no action" +msgstr "regla vacía para un no terminal con tipo y no hay ninguna acción" + +#: src/reader.c:321 src/reader.c:335 src/reader.c:348 +#, c-format +msgid "only one %s allowed per rule" +msgstr "sólo se permite un %s por regla" + +#: src/reader.c:331 src/reader.c:346 +#, c-format +msgid "%s affects only GLR parsers" +msgstr "%s afecta sólo a los analizadores GLR" + +#: src/reader.c:333 +#, c-format +msgid "%s must be followed by positive number" +msgstr "%s debe estar seguido por un número positivo" + +#: src/reader.c:490 +msgid "no rules in the input grammar" +msgstr "no hay reglas en la gramática de entrada" + +#: src/reduce.c:242 +msgid "useless rule" +msgstr "regla sin uso" + +#: src/reduce.c:303 +#, c-format +msgid "useless nonterminal: %s" +msgstr "No terminal sin uso: %s" + +#: src/reduce.c:351 +msgid "Useless nonterminals" +msgstr "No terminales sin uso" + +#: src/reduce.c:364 +msgid "Terminals which are not used" +msgstr "Terminales que no se usan" + +#: src/reduce.c:373 +msgid "Useless rules" +msgstr "Reglas sin uso" + +#: src/reduce.c:389 +#, c-format +msgid "%d rule never reduced\n" +msgid_plural "%d rules never reduced\n" +msgstr[0] "%d regla que nunca se ha reducido\n" +msgstr[1] "%d reglas que nunca se han reducido\n" + +#: src/reduce.c:397 +#, c-format +msgid "%d useless nonterminal" +msgid_plural "%d useless nonterminals" +msgstr[0] "%d no terminal sin uso" +msgstr[1] "%d no terminales sin uso" + +#: src/reduce.c:403 +#, c-format +msgid " and " +msgstr " y " + +#: src/reduce.c:406 +#, c-format +msgid "%d useless rule" +msgid_plural "%d useless rules" +msgstr[0] "%d regla sin uso" +msgstr[1] "%d reglas sin uso" + +#: src/reduce.c:436 +#, c-format +msgid "start symbol %s does not derive any sentence" +msgstr "El símbolo de inicio (axioma) %s no deriva ninguna sentencia" + +#: src/scan-gram.l:162 +msgid "stray `,' treated as white space" +msgstr "`,' perdido se trato como un espacio en blanco" + +#: src/scan-gram.l:225 +#, c-format +msgid "invalid directive: %s" +msgstr "directiva no válida: %s" + +#: src/scan-gram.l:283 +#, c-format +msgid "invalid character: %s" +msgstr "carácter no válido: %s" + +#: src/scan-gram.l:402 +#, fuzzy +msgid "invalid null character" +msgstr "carácter no válido: %s" + +#: src/scan-gram.l:415 src/scan-gram.l:427 src/scan-gram.l:448 +#, c-format +msgid "invalid escape sequence: %s" +msgstr "secuencia de escape no válida: %s" + +#: src/scan-gram.l:417 src/scan-gram.l:429 src/scan-gram.l:450 +#, fuzzy, c-format +msgid "invalid null character: %s" +msgstr "carácter no válido: %s" + +#: src/scan-gram.l:455 +#, c-format +msgid "unrecognized escape sequence: %s" +msgstr "secuencia de escape no reconocida: %s" + +#: src/scan-gram.l:537 +#, c-format +msgid "missing `{' in `%s'" +msgstr "falta `{' en `%s'" + +#: src/scan-gram.l:782 +#, c-format +msgid "$$ of `%s' has no declared type" +msgstr "$$ de `%s' no tiene tipo declarado" + +#: src/scan-gram.l:803 +#, c-format +msgid "$%d of `%s' has no declared type" +msgstr "$%d de `%s' no tiene tipo declarado" + +#: src/scan-gram.l:812 src/scan-gram.l:881 src/scan-gram.l:932 +#, c-format +msgid "integer out of range: %s" +msgstr "entero fuera de rango: %s" + +#: src/scan-gram.l:848 src/scan-gram.l:916 +#, c-format +msgid "invalid value: %s" +msgstr "valor no válido: %s" + +#: src/scan-gram.l:1036 +#, c-format +msgid "missing `%s' at end of file" +msgstr "falta cadena `%s' al final del fichero" + +#: src/scan-gram.l:1047 +#, fuzzy, c-format +msgid "missing `%s' at end of line" +msgstr "falta cadena `%s' al final del fichero" + +#: src/symlist.c:97 src/symlist.c:108 +msgid "invalid $ value" +msgstr "valor $ no válido" + +#: src/symtab.c:85 +#, c-format +msgid "type redeclaration for %s" +msgstr "redeclaración del tipo de %s" + +#: src/symtab.c:102 src/symtab.c:120 +#, c-format +msgid "%s redeclaration for %s" +msgstr "%s redeclaración de %s" + +#: src/symtab.c:139 +#, c-format +msgid "redefining precedence of %s" +msgstr "redefinición de la precedencia de %s" + +#: src/symtab.c:157 +#, c-format +msgid "symbol %s redefined" +msgstr "redefinido el símbolo %s" + +#: src/symtab.c:180 +#, c-format +msgid "redefining user token number of %s" +msgstr "redefinición del número del terminal del usuario de %s" + +# `token' se debe traducir como `literal' - cll +# en terminología de compiladores token es más un terminal - ngp +# +#: src/symtab.c:207 +#, c-format +msgid "symbol %s is used, but is not defined as a token and has no rules" +msgstr "" +"se usa el símbolo %s, pero no está definido como terminal y no tiene reglas" + +#: src/symtab.c:232 +#, c-format +msgid "symbol `%s' used more than once as a literal string" +msgstr "símbolo `%s' utilizado más de una vez como cadena literal" + +#: src/symtab.c:235 +#, c-format +msgid "symbol `%s' given more than one literal string" +msgstr "al símbolo `%s' se le ha dado más de una cadena literal" + +#: src/symtab.c:271 +#, c-format +msgid "conflicting precedences for %s and %s" +msgstr "precedencias en conflicto entre %s y %s" + +#: src/symtab.c:283 +#, c-format +msgid "conflicting associativities for %s (%s) and %s (%s)" +msgstr "conflicto de asociaciatividades para %s (%s) y %s (%s)" + +#: src/symtab.c:368 +#, c-format +msgid "tokens %s and %s both assigned number %d" +msgstr "los terminales %s y %s tienen asignados ambos el número %d" + +#: src/symtab.c:591 +#, c-format +msgid "the start symbol %s is undefined" +msgstr "el símbolo de inicio (axioma) %s no está definido" + +#: src/symtab.c:595 +#, c-format +msgid "the start symbol %s is a token" +msgstr "el símbolo de inicio (axioma) %s es un terminal" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "argumento no válido %s para %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "argumento %s ambigüo para %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Los argumentos válidos son:" + +#: lib/bitset_stats.c:179 +#, c-format +msgid "%u bitset_allocs, %u freed (%.2f%%).\n" +msgstr "%u bitset_allocs, %u liberados (%.2f%%).\n" + +#: lib/bitset_stats.c:182 +#, c-format +msgid "%u bitset_sets, %u cached (%.2f%%)\n" +msgstr "%u bitset_sets, %u en la caché (%.2f%%)\n" + +#: lib/bitset_stats.c:185 +#, c-format +msgid "%u bitset_resets, %u cached (%.2f%%)\n" +msgstr "%u bitset_resets, %u en la caché (%.2f%%)\n" + +#: lib/bitset_stats.c:188 +#, c-format +msgid "%u bitset_tests, %u cached (%.2f%%)\n" +msgstr "%u bitset_tests, %u en la caché (%.2f%%)\n" + +#: lib/bitset_stats.c:192 +#, c-format +msgid "%u bitset_lists\n" +msgstr "%u bitset_lists\n" + +#: lib/bitset_stats.c:194 +msgid "count log histogram\n" +msgstr "histograma del registro de conteo\n" + +#: lib/bitset_stats.c:197 +msgid "size log histogram\n" +msgstr "histograma del registro de tamaño\n" + +#: lib/bitset_stats.c:200 +msgid "density histogram\n" +msgstr "histograma de densidad\n" + +#: lib/bitset_stats.c:214 +#, c-format +msgid "" +"Bitset statistics:\n" +"\n" +msgstr "Estadísticas de bitset\n" + +#: lib/bitset_stats.c:217 +#, c-format +msgid "Accumulated runs = %u\n" +msgstr "Ejecuciones acumuladas = %u\n" + +#: lib/bitset_stats.c:261 lib/bitset_stats.c:266 +msgid "Could not read stats file." +msgstr "No pude leer fichero de estadísticas" + +#: lib/bitset_stats.c:263 +#, c-format +msgid "Bad stats file size.\n" +msgstr "Fichero de estadística no válido.\n" + +#: lib/bitset_stats.c:289 lib/bitset_stats.c:291 +msgid "Could not write stats file." +msgstr "No pude escribir el fichero de estadísticas." + +#: lib/bitset_stats.c:294 +msgid "Could not open stats file for writing." +msgstr "No pude abrir el fichero de estadísticas para escritura" + +#: lib/error.c:127 +msgid "Unknown system error" +msgstr "Error del sistema desconocido" + +#: lib/getopt.c:570 lib/getopt.c:589 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: la opción `%s' es ambigua\n" + +# Pongo esto como en otros .po. sv +#: lib/getopt.c:622 lib/getopt.c:626 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: la opción `--%s' no admite ningún argumento\n" + +#: lib/getopt.c:635 lib/getopt.c:640 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: la opción `%c%s' no admite ningún argumento\n" + +#: lib/getopt.c:686 lib/getopt.c:708 lib/getopt.c:1039 lib/getopt.c:1061 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: la opción `%s' requiere un argumento\n" + +#: lib/getopt.c:746 lib/getopt.c:749 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: opción `--%s' no reconocida\n" + +#: lib/getopt.c:757 lib/getopt.c:760 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: opción `%c%s' no reconocida\n" + +# ¿Qué encuentras de malo en traducir `illegal' como `ilegal'? Date +# cuenta de que el mensaje "opción no válida" parece ambigua y hará +# pensar al usuario de que tal vez la ha usado incorrectamente, sin +# reparar, por lo tanto, en que la opción misma es ilegal. Esto es, ¡¡no +# existe!! (porque imagino que es en este sentido como se ha programado) +# - cll +# Sobre esto hubo una discusión en la lista hace tiempo, +# quizás ilegal queda un poco fuerte, alguien decía que parecía que +# ibas a ir a la carcel por usar la opción. +# ngp +# +# Sí, era Enrique a quien no le gustaba la palabra. +# No creo que debamos dejar de decir algo por la "corrección política" +# Yo creo que si el 386 tiene instrucciones *ilegales*, también puede +# haber opciones ilegales, digo yo, y no por eso las CPUs van +# a la cárcel (como mucho se cuelgan, je, je, 0ff0 :-). sv +# +#: lib/getopt.c:815 lib/getopt.c:818 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opción -- %c ilegal\n" + +# ¡Muy bien traducido! En el grupo de traducción ha habido auténticas +# batallas con el tema "invalid - inválido/a" :) - cll +# Porque Enrique decía que le recordaba a disminuidos físicos. +# Francamente, no creo que haya que andar con estas "fobias". +# Pongo inválida. sv +#: lib/getopt.c:824 lib/getopt.c:827 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opción -- %c no válida\n" + +#: lib/getopt.c:882 lib/getopt.c:901 lib/getopt.c:1114 lib/getopt.c:1135 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: la opción -- %c requiere un argumento\n" + +#: lib/getopt.c:954 lib/getopt.c:973 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: la opción `-W %s' es ambigua\n" + +# Pongo esto como en otros .po. sv +#: lib/getopt.c:997 lib/getopt.c:1018 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: la opción `-W %s' no admite ningún argumento\n" + +#: lib/obstack.c:417 lib/obstack.c:420 lib/xmalloc.c:53 +msgid "memory exhausted" +msgstr "memoria agotada" + +#: lib/quotearg.c:238 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:239 +msgid "'" +msgstr "'" + +#: lib/subpipe.c:171 +#, c-format +msgid "subsidiary program `%s' could not be invoked" +msgstr "no se pudo invocar el programa subsidiario `%s'" + +#: lib/subpipe.c:173 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "no se encontró el programa subsidiario `%s'" + +#: lib/subpipe.c:175 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "falló el programa subsidiario `%s'" + +#: lib/subpipe.c:176 +#, c-format +msgid "subsidiary program `%s' failed (exit status %d)" +msgstr "falló el programa subsidiario `%s' (estado de salida %d)" + +#: lib/timevar.c:475 +msgid "" +"\n" +"Execution times (seconds)\n" +msgstr "" +"\n" +"Tiempos de ejecución (segundo)\n" + +#: lib/timevar.c:525 +msgid " TOTAL :" +msgstr " TOTAL :" + +#: lib/timevar.c:561 +#, c-format +msgid "time in %s: %ld.%06ld (%ld%%)\n" +msgstr "tiempo en %s: %ld.%06ld (%ld%%)\n" + +#~ msgid "too many states (max %d)" +#~ msgstr "demasiados estados (máximo %d)" + +#~ msgid "reduce" +#~ msgstr "reduce" + +#~ msgid "shift" +#~ msgstr "desplaza" + +#~ msgid "%d shift/reduce conflict" +#~ msgid_plural "%d shift/reduce conflicts" +#~ msgstr[0] "%d conflicto desplazamiento/reducción" +#~ msgstr[1] "%d conflictos desplazamiento/reducción" + +#~ msgid "and" +#~ msgstr "y" + +#~ msgid "State %d contains " +#~ msgstr "El estado %d contiene" + +#~ msgid "conflicts: " +#~ msgstr "conflictos: " + +#~ msgid "%s contains " +#~ msgstr "%s contiene " + +#~ msgid "`%s' is no longer supported" +#~ msgstr "`%s' ya no está soportado" + +# Me parece menos "computadora" decir "ningún fichero de gramática" - cll +# +#~ msgid "%s: no grammar file given\n" +#~ msgstr "%s: no se ha especificado ningún fichero de gramática\n" + +# Ignorar es no saber, to ignore es no hacer caso, que no es lo mismo. sv +#~ msgid "%s: extra arguments ignored after `%s'\n" +#~ msgstr "%s: los argumentos extra después de '%s' no se tendrán en cuenta\n" + +#~ msgid "too many gotos (max %d)" +#~ msgstr "demasiados gotos (máximo %d)" + +# to ignore no es ignorar. Pon otra cosa, please. sv +#~ msgid "unexpected `/' found and ignored" +#~ msgstr "se ha encontrado `/' cuando no se esperaba, no se tendrán en cuenta" + +#~ msgid "unterminated comment" +#~ msgstr "comentario sin terminar" + +#~ msgid "unexpected end of file" +#~ msgstr "fin de fichero inesperado" + +# ¿unescaped? +#~ msgid "unescaped newline in constant" +#~ msgstr "salto de línea en constante sin secuencia de escape" + +#~ msgid "octal value outside range 0...255: `\\%o'" +#~ msgstr "valor octal fuera del rango 0...255: `\\%o'" + +#~ msgid "hexadecimal value above 255: `\\x%x'" +#~ msgstr "valor hexadecimal mayor que 255: `\\x%x'" + +#~ msgid "unknown escape sequence: `\\' followed by `%s'" +#~ msgstr "secuencia de escape desconocida: `\\' seguido de `%s'" + +#~ msgid "unterminated type name at end of file" +#~ msgstr "nombre de tipo sin terminar al final del fichero" + +#~ msgid "unterminated type name" +#~ msgstr "nombre de tipo sin terminar" + +# ¿multicarácter o multicaracteres? sv +#~ msgid "use \"...\" for multi-character literal tokens" +#~ msgstr "use \"...\" para terminales literales multicarácter" + +#~ msgid "`%s' supports no argument: %s" +#~ msgstr "`%s' no soporta el argumento: %s" + +#~ msgid "`%s' requires an argument" +#~ msgstr "`%s' requiere un argumento" + +#~ msgid " (rule %d)" +#~ msgstr " (regla %d)" + +#~ msgid " %-4s\terror (nonassociative)\n" +#~ msgstr " %-4s\terror (no asociativo)\n" + +#~ msgid "" +#~ " $default\treduce using rule %d (%s)\n" +#~ "\n" +#~ msgstr "" +#~ " $default\treduce usando la regla %d (%s)\n" +#~ "\n" + +#~ msgid " %-4s\t[reduce using rule %d (%s)]\n" +#~ msgstr " %-4s\t[reduce usando la regla %d (%s)]\n" + +#~ msgid " %-4s\treduce using rule %d (%s)\n" +#~ msgstr " %-4s\treduce usando la regla %d (%s)\n" + +#~ msgid " $default\treduce using rule %d (%s)\n" +#~ msgstr " $default\treduce usando la regla %d (%s)\n" + +#~ msgid " $default\taccept\n" +#~ msgstr " $default\taceptar\n" + +#~ msgid " NO ACTIONS\n" +#~ msgstr " SIN ACCIONES\n" + +#~ msgid "Number, Line, Rule" +#~ msgstr "Número, Línea, Regla" + +#~ msgid " %3d %3d %s ->" +#~ msgstr " %3d %3d %s ->" + +#~ msgid " Skipping to next \\n" +#~ msgstr " Saltando al siguiente \\n" + +#~ msgid " Skipping to next %c" +#~ msgstr " Saltando al siguiente %c" + +#~ msgid "unterminated string" +#~ msgstr "cadena sin terminar" + +#~ msgid "%s is invalid" +#~ msgstr "%s no es válido" + +#~ msgid "unterminated `%{' definition" +#~ msgstr "definición `%{' sin terminar" + +#~ msgid "Premature EOF after %s" +#~ msgstr "EOF prematuro después de %s" + +#~ msgid "`%s' is invalid in %s" +#~ msgstr "`%s' no es válido en %s" + +#~ msgid "invalid %s declaration" +#~ msgstr "declaración de %s no válida" + +#~ msgid "%type declaration has no " +#~ msgstr "la declaración %type no tiene " + +#~ msgid "invalid %%type declaration due to item: %s" +#~ msgstr "declaración de %%type no válida debido al ítem: %s" + +# Una corrección menor: en realidad, `should' es el pasado y condicional +# de "to must" y aquí se emplea en su forma condicional. Por eso, he +# cambiado `debe' por `debería' - cll +# ahí me has pillado en un olvido del inglés - ngp +#~ msgid "invalid text (%s) - number should be after identifier" +#~ msgstr "" +#~ "texto no válido (%s) - el número debería estar después del identificador" + +# En unas ocasiones, has traducido `unexpected' como `no esperado' y, en +# otras, como `inesperado'. Cualquiera es correcta, por supuesto y, en +# este caso, la segunda me parece más apropiada - cll +# ok - ngp +#~ msgid "unexpected item: %s" +#~ msgstr "ítem inesperado: %s" + +# Cambio el orden y el sexo. Ahora está "en español". sv +#~ msgid "unmatched %s" +#~ msgstr "%s desemparejado/a" + +#~ msgid "argument of %%expect is not an integer" +#~ msgstr "el argumento de %%expect no es un entero" + +# No te recomiendo que emplees participios para expresar acciones (¡si +# me oyera mi antigua profesora de lengua, lloraría de emoción! :). En +# vez de eso, emplea las conjugaciones habituales, que para eso están :) +# - cll +# ok - ngp +# +#~ msgid "unrecognized item %s, expected an identifier" +#~ msgstr "no se reconoce el ítem %s, se esperaba un identificador" + +#~ msgid "expected string constant instead of %s" +#~ msgstr "se esperaba una cadena constante en lugar de %s" + +#~ msgid "no input grammar" +#~ msgstr "no hay gramática de entrada" + +#~ msgid "ill-formed rule: initial symbol not followed by colon" +#~ msgstr "regla mal formada: el símbolo inicial no está seguido por :" + +#~ msgid "grammar starts with vertical bar" +#~ msgstr "la gramática comienza con una barra vertical" + +#~ msgid "previous rule lacks an ending `;'" +#~ msgstr "a la regla previa le falta un `;' al final" + +#~ msgid "two @prec's in a row" +#~ msgstr "dos @prec en una línea" + +# Insisto, el empleo de participios a secas me parece como hablar en +# indio. Por favor, permíteme que añada un "está" :) - cll +# ok - ngp +#~ msgid "%%guard present but %%semantic_parser not specified" +#~ msgstr "%%guard presente pero %%semantic_parser está sin especificar" + +#~ msgid "two actions at end of one rule" +#~ msgstr "dos acciones al final de una regla" + +#~ msgid "too many symbols (tokens plus nonterminals); maximum %d" +#~ msgstr "demasiados símbolos (terminales y no terminales); máximo %d" + +# Únicamente cambio la posición del adjetivo `máximo'. En vez de después +# de `tabla', después de `tamaño' - cll +# en inglés era así, pero quizás en español sea mejor como dices +# ngp +# +#~ msgid "maximum table size (%d) exceeded" +#~ msgstr "excedido el tamaño máximo de la tabla (%d)" + +#~ msgid " $ \tgo to state %d\n" +#~ msgstr " $ \tir al estado %d\n" + +# Tal vez pueda parecer pedante, pero `inconclusa' me suena muchísimo +# mejor que `sin terminar' que me parece más "computerizado" - cll +# quizás un poco cacofónico lo de claúsula inconclusa - ngp +# +#~ msgid "unterminated %guard clause" +#~ msgstr "cláusula %guard sin terminar" diff --git a/src/apps/bin/bison/po/et.gmo b/src/apps/bin/bison/po/et.gmo new file mode 100644 index 0000000000000000000000000000000000000000..ab1f88fa37916deba33ebe3c7ed372768056ecb8 GIT binary patch literal 14225 zcmbW7dyHIHeaBD05IO`xLU^@ldjej(4xY{0ki=QrA#2BW*00^}t{osy_Rh@R+3UG; z?{FV$FDXq(P%DZm)CWRK{mz098e*3PM#Wm8dE}D=Pk=typzz4ttR=XZYZ*?+ln*T)RkhiG@x4(~GN%iz0T#s}Br%Z>RZa4+~U zcpN+oeh54SejR*0_`l#wz}Mbp%rAgie;)$09E zK&@MQ1#^IJ244rB1>XRM6+Q*-b{F-+S7TJYoGW1#5z0VsNJU{nZ)I6IYTQxreUjp6+ z^X>!h1R>cR1s?_91*+etLDBmcAS^du16kU9r@H?M$e;NcAEN6n78TwLYW+v}5Z&(v zVZBMJ=TCv+>!-lCfPW5Zp6`R2|0*bXyPeHwKXpEMWKMx^1Xn?}U_K1K4g4%9Ir=A1 z=Wz|xe7l)M>%1M594~>=i>E;gez(7^r!E2b==`7!?1% z1@dQZLD(&5LEX=Sli&&{dHXOZdcOi%@Y|sH{qG>EXl~`9)$VAwK;pC_cQL8|lkk;6d;t zD0-g;E%*gca`ks0OPl`$wccGQhxD@!YTiddJ#T~B|I^j;PlF6G-vD)fKL**dc@dL} zA8)MiFsOAefRd9BR`wO&* zoj(L01a~1MHSjPfKAZ$U3NC;e{{!&j;2kU;vf$@I(Q!LOevbQt-~;N1@QRMtv6$vL z0M7IN5QqqwkDz>#@6UtJfZqkRk9QzM;@>l%`0xo(^L!bU-hI1z|3gsn_&*@inn`YM z1@8sL?*pLreY(0|0VP)(;8F1RK%K`wfTI7uKu9omvq|y$6nGjeLDBJbQ1g8s+y(vz zD7m-->inkm<6FQ}p!DI3;O*eoz&pV2fa>=n@Kxadfui$vgiP~Jf_i=g)IQHu7=W+f zz5qr4GobkMNsy(@mq5|?BT(~S19h&iM+q%>5Y+uULG5n?L{!Y@z=y$af#UmZZ}am# z0BW8#sCl0SB`<#jiobsgN^buil-yherH600A72YT0BYPCxCA}}TJRr1NHhNpif{KK zB-&3C)O=5ZI_FP=>i1QUqcuMTbxwCb==pRA)Orix9bgv}T~C41@81R`5A!r#k~OWT z>rR?z)b(}`?o;&YI_AOYfxaHD?!`AJ??rX zpW-8G?yh(8d5WgJk6uq!H;;jmL&@gLX|JInqUH!q*9Sb9_kudl->mLeEBs)E=fU^U zUR>P^q>qnQ_XVi)*CoA>F8&%#Jk}M_9-=jAE3|~h5t>EXhiJMm2_|#jyzEHsJG356 zXQ*q2CViTtair#1+9jGUM9^5;Z_r9wo7TTB^JN$9E}G>1J+!ybB-0I=F3F)}=3TTk zT24DdOKG~KXD8h^>TSVP3 zx089;Op{i=w`MHYu{2qYqh?_nVR0!86PuNBXeU}WNLsc?J3N`lZ5HNfydLs2=Y8f3s$oJSaHkG8d6*l7l>ReB=8y4KSLn~Yj%D6CebUaJK^)Q1|+Fq;Hf6Ua^ zJumYx4s$J<6k*nlk|0+1Z64>N&$Y_g6MsXargV?4$_oiOA6HPX! zH_3VsM{w!7H`SAsiKf`wO2a(aQ`kTRNP2>-U3SBy@Y4)B)0MLcx{at^rX@$DMMmFd z;rq%6N!)pkdi@0~Sbv;7K5z1>-aAsb9dUMqTV;}=ckLv4KW8x5l^EnVy6tGM|mOs4TizAu<*m0L33?n+-R@o)29fT z+O2=xM0?C^vsre_I4D>kE0f$FfzX;c8nkR)1PJJAgl)-T0puQaJ8~}|H)`fHwVFAW z_BNct+R0;k?L^C-V3&3&T`ex5n)XCmCM_qT`|MoOWR_!T8MjcR0-j>3MwXEbU&@g4 zq&+p#Eep3$Gx|!sA#XtGlsS3sJe<$5BJD541-+vSdJsS92M$(L7g#+x#qAo zEsI`R*#3hkfyl03V008bsMj}wX45YbdYQ5d^GkE@uzFrI^KK?bP)ofr#!%-MsXutjxK>yMQ7q%?_#c!-3dw1rDb}m) zHPSrn5B8V`U6#!4%3uk}Rk%l^8X6@k>b(rIFCST0Jbr?mS)2F5X0!_XZS}|%i z&+LXL)$nR_Bg78|YUM&3@y=g_cQnccZgux&I4nw8aYg6fwyrh*EQV0cOyMfI^w&6U(r8Gly zinXAyO`?H{DhbMp*O5NOUJ{92oOEanv1J7#-NjYy@!fQ6$d&KZOfg`3&vLjMXWJMY zWwsfod6`M5R^l}61hNHghVXKa@HZ;3m_eSW%}84rba9Mu3p(;#3|uW-DGKDdp!7Z; z__13bPv=$9dteRP_LPr_y zsJVuXC!oU-qC2hO%bQsEWtnaM6iq;}_p^s!U&Zyb%&?s@Lrq*W+tCJFc-1t?aW~7( zWibBSd<_qs1xc}S$WcMio49djk1rm3Z1&vp?9sV1bIb3vOm$*z`P}iPC3|9i(aze1 z*~R6#W9QGzF4~3jix`;Wh}m+sq2L@*mQUH^X6m}r9r_HqoliPRdI`V3k?YibUUEJU z+Tjeroqb|{VR>%;+fn5w;I5CKYEKRh&W0lN+=` z=O~ed^_czs6Bpv>fy-M=U(|Feec6rHIU5wz&rf)m?{yTiq`q$%;~j+)aW|=!uB2B} zV&_O?!lXHzPJ12cMSPCZd%>^dzc!e{zZ}(#8@(f>+-9bdC?`(a79lNCIhLA%Ad;7j z(MMsoS8N#f=`%5HUg@3!!$F3%&+&mgFTld4iE*-GC+RWdT}V=lLBIwx7J^2pw|(B+ zyhl!#A`29fq7f~BTB`xV;U#p&nl@e|b+M)lXU#;=*$#==2#>It4D%w)3!i1}wqO|! z?)&mNB24|Rl0`NdX3~MdfPrt>@)TzukQe8Kl{)Dy@7#j!NjF6IHi+uh0@6v$OE=1M z$;gT_C=9v$A!IvY9lU#zgf8)$?>~z;z9L$U*eS2%5xUs!Y&4J<%-!c+u&N$f$q)z@ z5$0Z-9?4g8!?8N$)vU6SQKC4rABwoV7<;N=E(_&!IT|;_DDx$D+$!KE2CxomqV-HW{58Hc=I5cjC zHW7d~o)e1DoppCE)vfRQY^f^PM%d(Ji2dYlD+gqp^m?%$7dPc#T6LD*5V)_9R=}Ep)O{f_sX{waPLxt>&q!U#^c`F z!u)dmn8X{$QGXOEpRos~r{7kezQ2B8zuiAQbKrsc^n=sWbgVCi>ygskVZXQ5r}x*V z57_gANIGN;m!ax91a-ITj~q#HG}l>DGG6^0Kp zGHI8@H}&N(=+4;VIL0JGP!5O1BXQ)S^xE0Ev&V-U-aj>6J0?Gvuq0k_#um7z`^eg( zih2>_7;JwVOBq$G}9KWov{bW2#VT5Tq3^p6J+m*PttR@ z`H=&Mtp9psGLc2wzxPnh)Rs4+0{f2`U!?Rx`MHA>q5%C0^l4|XIt775*p4IF&x?WW zZf0%1=eRv0KpXR^0!i7TdJrUmQDpo=M=DaGjD|TAJ?)=wk|bK|xUr|_PoF+7GPYb) znxWo6b{=%fm|MJD*bVfpxOT0l?coO|$hTJHJgGy6k>&6)HXYTUp-#J0-^f*=UAG(c zsg%wzvsehX=snmg1-R-3R%e?xoggRerKADR72{%M1{LX@-bI>nwYaaecWzULmZ6z~I8MQ6O(kcvlD0s4YJd%aYtxf58$6Oql!GAmUQ9jirm z0@b2tsq|&h6@HD#?dL55f3sTj()j$GXdVQ%6J-~rV%VGx{&YQP1yinOvW1wcb6mE= z8@;b4Q+UW5sE0yTFOE+mo(Dtp{f5z6(~GVNREk?M0oAm-Ymc9Z;qW z@#K|I%V>4dHNyWgk0Xjqc|^G3eM=fErsd}oAE`o@FtaN z3Ql57Z!^jznj&blJUzQ~YWC5An^|W{X=GKG4O)>7z-=&Y<2>?6<8N4-4qzxJzVf`Q z)2AtpdxLMaJUenKL^UxXkfc)Q%b};2eBFPfM(rxyM^4Pn`5$aAZbE1^h1F9>?9LTx zamLr5-9AyJFm7@7DpiwA1f*_3ttv}*!Z5}T4;`sgu2rRhlK1=uRp~x~u-R`^qFEKC zVQ_z8v3BRO^m>3nVS`o4Hjm;`b_j`U2aMFULp|Dip1gD?sUmIWteHHVmfXG^ty7`Q z>KIB!eod8UWnTVF$VJ`H2&b1c!_LL%O-dE6qU?lsv=-edA~HXXzDX_GjjWtImLueM zVU60k7VW4;;>T%LX*!Hm+$10&Q|?jpNSuj6#;`^~i?kZH?ogd}W@8xoU>GW!(K7RK z*pU@CUYW35ajLRKhuEtni=vFodn%$4vYhn*Bbr}H%56&11Sy?T_G&~d#tPHLW~7MK z_O7hqYw$%FU;XOM>F}K7tz>74gPmlo3`)+f=$nTr#2Ac1@nn?-mBT{x^ReMe7--H#?g2T-I%rdH2>N?k51RE`Zp1${pwn>} z$#2A)Yl>JqypnuO*^>;R!W7jO&Yyqu{82^|)?T~Tj_|zeS0V^x3IgOXcL_#ZQ7RU9 z6bYO`o1C%7ar=j=TBP_$S9C>tT|Jtf%l+6YzeY(c>_(L%b>XyqyH7fk^=VSFIP~aT5FMW zb{H1-V108l!(}NC7%Zv1JGs~U8pEe%dFGC0{6HsDO8 zqS5u$@E}$~25D4kV)~TI{m7X`NzGIxrd||fPPd&%1gci~{VB?VW(A0|o(EeE~WrK^p1u=)IVou9|&#Y&&ajQ!6ENNmf&_;wKwnKTS_Rz*7I&5H}%6>&HV<8$(BSV*sB16?ApEZLna8S>vcBG<5{ zH||K8uhHnB*wr98*FR!7d!2+V*RQycJvjTPP_YW*C2+1%UU23z>neIQqP`iRR*qSh z5mvptGho+sHFHRE1pu85#vjwD1wsOz0I^rp&kJbnRJ-3=1yN?uUs5izxKd#5s8I#& z$arJmvW4pe)Mt-!LgN}t1eo!Qtq;eDS|AWxsa=vG2KE|03!RTuu`i5d9!{9fCP@na z*MsaJmN@KA>B{Pg)1}?S8;0zqs-fd4T%ef4R0}b++x_6c`EQP{%V;FU3W3QCD6d~Z1P8SBM^uDE(O{G`YU?m6 zjH9Pmk>rGE{5dQd->V72Hbbx)*H_jx2XZDWH*jc(=M|N`c$mUIUu+rH*oj0tzMfGT x^f65ttFtq&Q=}mW`-Me$H8UvvjG8;ol, 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: bison 1.875\n" +"Report-Msgid-Bugs-To: bug-bison@gnu.org\n" +"POT-Creation-Date: 2004-05-21 10:26-0700\n" +"PO-Revision-Date: 2003-01-02 11:59+0200\n" +"Last-Translator: Toomas Soome \n" +"Language-Team: Estonian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-15\n" +"Content-Transfer-Encoding: 8-bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: src/complain.c:51 src/complain.c:66 +msgid "warning: " +msgstr "hoiatus: " + +#: src/complain.c:122 src/complain.c:138 +msgid "fatal error: " +msgstr "fataalne viga: " + +#: src/conflicts.c:76 +#, c-format +msgid " Conflict between rule %d and token %s resolved as shift" +msgstr " Konflikt reegli %d ja märgi %s vahel lahendatud nihkega" + +#: src/conflicts.c:84 +#, c-format +msgid " Conflict between rule %d and token %s resolved as reduce" +msgstr " Konflikt reegli %d ja märgi %s vahel lahendatud redutseerimisega" + +#: src/conflicts.c:91 +#, c-format +msgid " Conflict between rule %d and token %s resolved as an error" +msgstr " Konflikt reegli %d ja märgi %s vahel lahendatud veana" + +#: src/conflicts.c:399 +#, c-format +msgid "conflicts: %d shift/reduce, %d reduce/reduce\n" +msgstr "" +"konfliktid: %d nihutamine/redutseerimine, %d redutseerimine/redutseerimine\n" + +#: src/conflicts.c:402 +#, c-format +msgid "conflicts: %d shift/reduce\n" +msgstr "konfliktid: %d nihutamine/redutseerimine\n" + +#: src/conflicts.c:404 +#, c-format +msgid "conflicts: %d reduce/reduce\n" +msgstr "konfliktid: %d redutseerimine/redutseerimine\n" + +#: src/conflicts.c:422 +#, c-format +msgid "State %d " +msgstr "Olek %d " + +#: src/conflicts.c:487 +#, fuzzy, c-format +msgid "%%expect-rr applies only to GLR parsers" +msgstr "%s puudutab ainult GLR parsereid" + +#: src/conflicts.c:511 +#, c-format +msgid "expected %d shift/reduce conflict" +msgid_plural "expected %d shift/reduce conflicts" +msgstr[0] "eeldasime %d nihutamine/redutseerimine konflikti" +msgstr[1] "eeldasime %d nihutamine/redutseerimine konflikti" + +#: src/conflicts.c:515 +#, fuzzy, c-format +msgid "expected %d reduce/reduce conflict" +msgid_plural "expected %d reduce/reduce conflicts" +msgstr[0] "eeldasin 0 redutseerimine/redutseerimine konflikti" +msgstr[1] "eeldasin 0 redutseerimine/redutseerimine konflikti" + +#: src/files.c:100 +#, c-format +msgid "cannot open file `%s'" +msgstr "faili `%s' ei saa avada" + +#: src/files.c:116 +msgid "I/O error" +msgstr "S/V viga" + +#: src/files.c:119 +msgid "cannot close file" +msgstr "faili ei õnnestu sulgeda" + +#: src/files.c:337 +#, c-format +msgid "conflicting outputs to file %s" +msgstr "konfliktsed väljundid faili %s" + +#: src/getargs.c:186 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "Lisainfo saamiseks proovige `%s --help'.\n" + +#: src/getargs.c:192 +msgid "GNU bison generates parsers for LALR(1) grammars.\n" +msgstr "GNU bison genereerib parsereid LALR(1) grammatikatele.\n" + +#: src/getargs.c:196 +#, c-format +msgid "Usage: %s [OPTION]... FILE\n" +msgstr "Kasuta: %s [VÕTI]...FAIL\n" + +#: src/getargs.c:200 +msgid "" +"If a long option shows an argument as mandatory, then it is mandatory\n" +"for the equivalent short option also. Similarly for optional arguments.\n" +msgstr "" +"Kui pikk võti näitab, et argument on kohustuslik, siis on see kohustuslik \n" +"ka lühikese võtme korral. Sama ka vabalt valitavate võtmete korral.\n" + +#: src/getargs.c:206 +msgid "" +"Operation modes:\n" +" -h, --help display this help and exit\n" +" -V, --version output version information and exit\n" +" -y, --yacc emulate POSIX yacc\n" +msgstr "" +"Töömoodid:\n" +" -h, --help esita see abiinfo ja lõpeta töö\n" +" -V, --version esita versiooniinfo ja lõpeta töö\n" +" -y, --yacc emuleeri POSIX yacc\n" + +#: src/getargs.c:213 +msgid "" +"Parser:\n" +" -S, --skeleton=FILE specify the skeleton to use\n" +" -t, --debug instrument the parser for debugging\n" +" --locations enable locations computation\n" +" -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n" +" -l, --no-lines don't generate `#line' directives\n" +" -n, --no-parser generate the tables only\n" +" -k, --token-table include a table of token names\n" +msgstr "" +"Parser:\n" +" -S, --skeleton=FAIL kasutatava skeleti kirjeldus\n" +" -t, --debug varusta parser silumisinfoga\n" +" --locations luba asukohtade arvestamine\n" +" -p, --name-prefix=PREFIKS lisa välissümbolite nimedele PREFIKS\n" +" -l, --no-lines ära genereeri `#line' direktiive\n" +" -n, --no-parser genereeri ainult tabelid\n" +" -k, --token-table lisa ka sümbolite nimede tabel\n" + +#: src/getargs.c:225 +msgid "" +"Output:\n" +" -d, --defines also produce a header file\n" +" -r, --report=THINGS also produce details on the automaton\n" +" -v, --verbose same as `--report=state'\n" +" -b, --file-prefix=PREFIX specify a PREFIX for output files\n" +" -o, --output=FILE leave output to FILE\n" +" -g, --graph also produce a VCG description of the " +"automaton\n" +msgstr "" +"Väljund:\n" +" -d, --defines loo ka päisfail\n" +" -r, --report=ASJAD väljasta automaadi kohta selgitusi\n" +" -v, --verbose sama, kui `--report=state'\n" +" -b, --file-prefix=PREFIKS kasuta väljundfailide nimedes PREFIKSit\n" +" -o, --output-file=FAIL jäta väljund FAILi\n" +" -g, --graph loo automaadi kirjeldus VCG graafina\n" + +#: src/getargs.c:236 +msgid "" +"THINGS is a list of comma separated words that can include:\n" +" `state' describe the states\n" +" `itemset' complete the core item sets with their closure\n" +" `lookahead' explicitly associate lookaheads to items\n" +" `solved' describe shift/reduce conflicts solving\n" +" `all' include all the above information\n" +" `none' disable the report\n" +msgstr "" +"ASJAD on loend komadega eraldatud järgnevaid sõnu:\n" +" `state' olekute kirjeldus\n" +" `itemset' täienda põhilisi elemente nende sulunditega\n" +" `lookahead' seo ettevaatamised elementidega\n" +" `solved' kirjelda nihuta/redutseeri konfliktide lahendamisi\n" +" `all' kogu ülaltoodud info\n" +" `none' blokeeri raport\n" + +#: src/getargs.c:247 +msgid "Report bugs to .\n" +msgstr "Teatage palun vigadest aadressil .\n" + +#: src/getargs.c:264 +#, c-format +msgid "bison (GNU Bison) %s" +msgstr "bison (GNU Bison) %s" + +#: src/getargs.c:266 +msgid "Written by Robert Corbett and Richard Stallman.\n" +msgstr "Kirjutanud Robert Corbett ja Richard Stallman.\n" + +#: src/getargs.c:270 +#, c-format +msgid "Copyright (C) %d Free Software Foundation, Inc.\n" +msgstr "Autoriõigus © %d Free Software Foundation, Inc.\n" + +#: src/getargs.c:272 +msgid "" +"This is free software; see the source for copying conditions. There is NO\n" +"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +msgstr "" +"See on vaba tarkvara; kopeerimistingimused leiate lähtetekstidest. Garantii\n" +"PUUDUB; ka müügiks või mingil eesmärgil kasutamiseks.\n" + +#: src/getargs.c:438 +#, c-format +msgid "missing operand after `%s'" +msgstr "`%s' järel puudub operand" + +#: src/getargs.c:440 +#, c-format +msgid "extra operand `%s'" +msgstr "Liigne operand `%s'" + +#: src/gram.c:139 +msgid "empty" +msgstr "tühi" + +#: src/gram.c:233 +msgid "Grammar" +msgstr "Grammatika" + +#: src/gram.c:321 src/reduce.c:394 +msgid "warning" +msgstr "hoiatus" + +#: src/main.c:124 +msgid "rule never reduced because of conflicts" +msgstr "reeglit ei redutseerita konfliktide tõttu kunagi" + +#: src/parse-gram.y:363 +msgid "POSIX forbids declarations in the grammar" +msgstr "POSIX keelab deklareerimised grammatikas" + +#: src/parse-gram.y:486 +msgid "missing identifier in parameter declaration" +msgstr "parameetri deklaratsioonis puudub identifikaator" + +#: src/print.c:49 +#, c-format +msgid " type %d is %s\n" +msgstr " tüüp %d on %s\n" + +#: src/print.c:165 +#, c-format +msgid "shift, and go to state %d\n" +msgstr "nihuta ja liigu olekule %d\n" + +#: src/print.c:167 +#, c-format +msgid "go to state %d\n" +msgstr "liigu olekule %d\n" + +#: src/print.c:204 +msgid "error (nonassociative)\n" +msgstr "viga (mitteassotsiatiivne)\n" + +#: src/print.c:292 +#, c-format +msgid "reduce using rule %d (%s)" +msgstr "redutseerin kasutades reeglit %d (%s)" + +#: src/print.c:294 +#, c-format +msgid "accept" +msgstr "nõustun" + +#: src/print.c:325 src/print.c:391 +msgid "$default" +msgstr "$default" + +#: src/print.c:420 +#, c-format +msgid "state %d" +msgstr "olek %d" + +#: src/print.c:456 +msgid "Terminals, with rules where they appear" +msgstr "Terminalid, koos reeglitega kus nad ilmuvad" + +#: src/print.c:483 +msgid "Nonterminals, with rules where they appear" +msgstr "Mitteterminalid, koos reeglitega kus nad ilmuvad" + +#: src/print.c:512 +#, c-format +msgid " on left:" +msgstr " vasakul:" + +#: src/print.c:527 +#, c-format +msgid " on right:" +msgstr " paremal:" + +#: src/print.c:555 +msgid "Rules never reduced" +msgstr "Mitteredutseeruvad reeglid" + +#: src/reader.c:56 +#, c-format +msgid "multiple %s declarations" +msgstr "korduvad %s deklaratsioonid" + +#: src/reader.c:118 +#, c-format +msgid "result type clash on merge function %s: <%s> != <%s>" +msgstr "tulemuse tüübikonflikt mestimise funktsioonis %s: <%s> != <%s>" + +#: src/reader.c:216 +#, c-format +msgid "rule given for %s, which is a token" +msgstr "%s jaoks on antud reegel, aga see on märk" + +#: src/reader.c:245 +#, c-format +msgid "type clash on default action: <%s> != <%s>" +msgstr "vaikimisi tegevuse tüübikonflikt: <%s> != <%s>" + +#: src/reader.c:251 +msgid "empty rule for typed nonterminal, and no action" +msgstr "tüübiga mitteterminalil on tühi reegel ja puudub tegevus" + +#: src/reader.c:321 src/reader.c:335 src/reader.c:348 +#, c-format +msgid "only one %s allowed per rule" +msgstr "reeglis on lubatud ainult üks %s" + +#: src/reader.c:331 src/reader.c:346 +#, c-format +msgid "%s affects only GLR parsers" +msgstr "%s puudutab ainult GLR parsereid" + +#: src/reader.c:333 +#, c-format +msgid "%s must be followed by positive number" +msgstr "%s järel peab olema positiivne number" + +#: src/reader.c:490 +msgid "no rules in the input grammar" +msgstr "sisendgrammatikas pole reegleid" + +#: src/reduce.c:242 +msgid "useless rule" +msgstr "kasutamata reegel" + +#: src/reduce.c:303 +#, c-format +msgid "useless nonterminal: %s" +msgstr "kasutamata mitteterminal: %s" + +#: src/reduce.c:351 +msgid "Useless nonterminals" +msgstr "Kasutamata mitteterminalid" + +#: src/reduce.c:364 +msgid "Terminals which are not used" +msgstr "Terminalid, mida ei kasutatud" + +#: src/reduce.c:373 +msgid "Useless rules" +msgstr "Kasutamata reeglid" + +#: src/reduce.c:389 +#, c-format +msgid "%d rule never reduced\n" +msgid_plural "%d rules never reduced\n" +msgstr[0] "%d reegel ei redutseeru\n" +msgstr[1] "%d reeglit ei redutseeru\n" + +#: src/reduce.c:397 +#, c-format +msgid "%d useless nonterminal" +msgid_plural "%d useless nonterminals" +msgstr[0] "%d kasutamata mitteterminal" +msgstr[1] "%d kasutamata mitteterminali" + +#: src/reduce.c:403 +#, c-format +msgid " and " +msgstr " ja " + +#: src/reduce.c:406 +#, c-format +msgid "%d useless rule" +msgid_plural "%d useless rules" +msgstr[0] "%d kasutamata reegel" +msgstr[1] "%d kasutamata reeglit" + +#: src/reduce.c:436 +#, c-format +msgid "start symbol %s does not derive any sentence" +msgstr "stardisümbolist %s ei tuletata ühtegi lauset" + +#: src/scan-gram.l:162 +msgid "stray `,' treated as white space" +msgstr "käsitlen juhuslikku `,' kui tühikut" + +#: src/scan-gram.l:225 +#, c-format +msgid "invalid directive: %s" +msgstr "vigane juhus: %s" + +#: src/scan-gram.l:283 +#, c-format +msgid "invalid character: %s" +msgstr "vigased sümbolid: %s" + +#: src/scan-gram.l:402 +#, fuzzy +msgid "invalid null character" +msgstr "vigased sümbolid: %s" + +#: src/scan-gram.l:415 src/scan-gram.l:427 src/scan-gram.l:448 +#, c-format +msgid "invalid escape sequence: %s" +msgstr "vigane paojada: %s" + +#: src/scan-gram.l:417 src/scan-gram.l:429 src/scan-gram.l:450 +#, fuzzy, c-format +msgid "invalid null character: %s" +msgstr "vigased sümbolid: %s" + +#: src/scan-gram.l:455 +#, c-format +msgid "unrecognized escape sequence: %s" +msgstr "tundmatu paojada: %s" + +#: src/scan-gram.l:537 +#, c-format +msgid "missing `{' in `%s'" +msgstr "`%s' juures puudub `{'" + +#: src/scan-gram.l:782 +#, c-format +msgid "$$ of `%s' has no declared type" +msgstr "`%s' $$ ei oma deklareeritud tüüpi" + +#: src/scan-gram.l:803 +#, c-format +msgid "$%d of `%s' has no declared type" +msgstr "$%d `%s' ei oma deklareeritud tüüpi" + +#: src/scan-gram.l:812 src/scan-gram.l:881 src/scan-gram.l:932 +#, c-format +msgid "integer out of range: %s" +msgstr "number piiridest väljas: %s" + +#: src/scan-gram.l:848 src/scan-gram.l:916 +#, c-format +msgid "invalid value: %s" +msgstr "vigane väärtus: %s" + +#: src/scan-gram.l:1036 +#, c-format +msgid "missing `%s' at end of file" +msgstr "faili lõpus puudub `%s'" + +#: src/scan-gram.l:1047 +#, fuzzy, c-format +msgid "missing `%s' at end of line" +msgstr "faili lõpus puudub `%s'" + +#: src/symlist.c:97 src/symlist.c:108 +msgid "invalid $ value" +msgstr "vigane $ väärtus" + +#: src/symtab.c:85 +#, c-format +msgid "type redeclaration for %s" +msgstr "%s tüübi uuesti deklareerimine" + +#: src/symtab.c:102 src/symtab.c:120 +#, c-format +msgid "%s redeclaration for %s" +msgstr "%s uuesti deklareerimine %s jaoks" + +#: src/symtab.c:139 +#, c-format +msgid "redefining precedence of %s" +msgstr "%s prioriteedi uus definitsioon" + +#: src/symtab.c:157 +#, c-format +msgid "symbol %s redefined" +msgstr "sümbol %s on uuesti defineeritud" + +#: src/symtab.c:180 +#, c-format +msgid "redefining user token number of %s" +msgstr "%s kasutaja märgi numbri uuesti defineerimine" + +#: src/symtab.c:207 +#, c-format +msgid "symbol %s is used, but is not defined as a token and has no rules" +msgstr "" +"kasutatakse sümbolit %s, mis ei ole defineeritud märgina ja millel puuduvad " +"reeglid" + +#: src/symtab.c:232 +#, c-format +msgid "symbol `%s' used more than once as a literal string" +msgstr "sümbolit `%s' on kasutatud enam kui kord literaal sõnena" + +#: src/symtab.c:235 +#, c-format +msgid "symbol `%s' given more than one literal string" +msgstr "sümbolile `%s' on antud enam kui üks literaal sõne" + +#: src/symtab.c:271 +#, c-format +msgid "conflicting precedences for %s and %s" +msgstr "%s ja %s omavad konfliktseid prioriteete" + +#: src/symtab.c:283 +#, c-format +msgid "conflicting associativities for %s (%s) and %s (%s)" +msgstr "%s (%s) ja %s (%s) omavad konfliktseid assotsiatiivseid väärtuseid" + +#: src/symtab.c:368 +#, c-format +msgid "tokens %s and %s both assigned number %d" +msgstr "märkidele %s ja %s on mõlemale omistatud number %d" + +#: src/symtab.c:591 +#, c-format +msgid "the start symbol %s is undefined" +msgstr "stardisümbol %s ei ole defineeritud" + +#: src/symtab.c:595 +#, c-format +msgid "the start symbol %s is a token" +msgstr "stardisümbol %s on märk" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "vigane argument %s %s'le" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "segane argument %s %s'le" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Lubatud argumendid on:" + +#: lib/bitset_stats.c:179 +#, c-format +msgid "%u bitset_allocs, %u freed (%.2f%%).\n" +msgstr "%u bitset_allocs, %u vabastatud (%.2f%%).\n" + +#: lib/bitset_stats.c:182 +#, c-format +msgid "%u bitset_sets, %u cached (%.2f%%)\n" +msgstr "%u bitset_sets, %u puhverdatud (%.2f%%)\n" + +#: lib/bitset_stats.c:185 +#, c-format +msgid "%u bitset_resets, %u cached (%.2f%%)\n" +msgstr "%u bitset_resets, %u puhverdatud (%.2f%%)\n" + +#: lib/bitset_stats.c:188 +#, c-format +msgid "%u bitset_tests, %u cached (%.2f%%)\n" +msgstr "%u bitset_tests, %u puhverdatud (%.2f%%)\n" + +#: lib/bitset_stats.c:192 +#, c-format +msgid "%u bitset_lists\n" +msgstr "%u bitset_lists\n" + +#: lib/bitset_stats.c:194 +msgid "count log histogram\n" +msgstr "loenduri logi histogramm\n" + +#: lib/bitset_stats.c:197 +msgid "size log histogram\n" +msgstr "suuruste logi histogramm\n" + +#: lib/bitset_stats.c:200 +msgid "density histogram\n" +msgstr "tiheduse histogramm\n" + +#: lib/bitset_stats.c:214 +#, c-format +msgid "" +"Bitset statistics:\n" +"\n" +msgstr "" +"Bitset statistika:\n" +"\n" + +#: lib/bitset_stats.c:217 +#, c-format +msgid "Accumulated runs = %u\n" +msgstr "Salvestatud läbimisi = %u\n" + +#: lib/bitset_stats.c:261 lib/bitset_stats.c:266 +msgid "Could not read stats file." +msgstr "Statistika faili ei saa lugeda." + +#: lib/bitset_stats.c:263 +#, c-format +msgid "Bad stats file size.\n" +msgstr "Vigane statistika faili suurus.\n" + +#: lib/bitset_stats.c:289 lib/bitset_stats.c:291 +msgid "Could not write stats file." +msgstr "Statistika faili ei saa kirjutada." + +#: lib/bitset_stats.c:294 +msgid "Could not open stats file for writing." +msgstr "Statistika faili ei saa kirjutamiseks avada." + +#: lib/error.c:127 +msgid "Unknown system error" +msgstr "Tundmatu süsteemi viga" + +#: lib/getopt.c:570 lib/getopt.c:589 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: võti `%s' on segane\n" + +#: lib/getopt.c:622 lib/getopt.c:626 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: võti `--%s' ei luba argumenti\n" + +#: lib/getopt.c:635 lib/getopt.c:640 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: võti `%c%s' ei luba argumenti\n" + +#: lib/getopt.c:686 lib/getopt.c:708 lib/getopt.c:1039 lib/getopt.c:1061 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: võti `%s' nõuab argumenti\n" + +#: lib/getopt.c:746 lib/getopt.c:749 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: tundmatu võti `--%s'\n" + +#: lib/getopt.c:757 lib/getopt.c:760 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: tundmatu võti `%c%s'\n" + +#: lib/getopt.c:815 lib/getopt.c:818 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: lubamatu võti -- %c\n" + +#: lib/getopt.c:824 lib/getopt.c:827 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: vigane võti -- %c\n" + +#: lib/getopt.c:882 lib/getopt.c:901 lib/getopt.c:1114 lib/getopt.c:1135 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: võti nõuab argumenti -- %c\n" + +#: lib/getopt.c:954 lib/getopt.c:973 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: võti `-W %s' on segane\n" + +#: lib/getopt.c:997 lib/getopt.c:1018 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: võti `-W %s' ei luba argumenti\n" + +#: lib/obstack.c:417 lib/obstack.c:420 lib/xmalloc.c:53 +msgid "memory exhausted" +msgstr "mälu on otsas" + +#: lib/quotearg.c:238 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:239 +msgid "'" +msgstr "'" + +#: lib/subpipe.c:171 +#, c-format +msgid "subsidiary program `%s' could not be invoked" +msgstr "abiprogrammi `%s' ei saa käivitada" + +#: lib/subpipe.c:173 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "ei leia abiprogrammi `%s'" + +#: lib/subpipe.c:175 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "abiprogramm `%s' ebaõnnestus" + +#: lib/subpipe.c:176 +#, c-format +msgid "subsidiary program `%s' failed (exit status %d)" +msgstr "abiprogramm `%s' ebaõnnestus (lõpetamise kood %d)" + +#: lib/timevar.c:475 +msgid "" +"\n" +"Execution times (seconds)\n" +msgstr "" +"\n" +"Täitmise ajad (sekundites)\n" + +#: lib/timevar.c:525 +msgid " TOTAL :" +msgstr " KOKKU :" + +#: lib/timevar.c:561 +#, c-format +msgid "time in %s: %ld.%06ld (%ld%%)\n" +msgstr "aeg %s: %ld.%06ld (%ld%%)\n" diff --git a/src/apps/bin/bison/po/fr.gmo b/src/apps/bin/bison/po/fr.gmo new file mode 100644 index 0000000000000000000000000000000000000000..51d44cb55ebcebbeb1b561b2e2c58591b7be2947 GIT binary patch literal 15131 zcmbW7Ym6jUb;mDYW7Fp87jJS6JDy##Jv+N#yv%xyXUDVNadu~xnOQ%;gsJJS?kR6~ zRlBNscL(zdu@FuaMNveM6Nv;!1i?f}2zd~Hh#^vlqY#k~36VmGQIO&`f_zC(EI`Tc ze{WTF_dIrON^|F5kNY_H-1EBU_P4LT?Bj;(A{WR~hqKa36Rp zI1kRlwc@g+Jum;`;z6?AF{tP$^S}*`L#7Dp>@Rtkx%i{Y0 z)VQ^m&uYW1c?^ik?*l=hke3>gQL$ zvwZ&qsP%jSOq&EP_zCa?D7u~mMeh|Xp6GfVsOQ5VtTU&I=XZnCJoiA6@hR|y;AcSf z|9MdDz6L_7`4-5~<_F+gz{^;yH-Lvh@$+s_?LGi%+}{MXK7R(PpYMW9)jR`U4!#)X z9RRNeA=w-QZwKE6s@`vdqW6m+EH{sX3~jzqJP$zr%rpEGUDqFl=1%a9U<+gl=3(%y;AcR|(Z7IN zj~|2TZx5YloOghd;}uYP@nO({4;Sx04~mc91jUaZf;WIS@^ThD0ji&00;j-Fg5v+z zLH^A15Oxb%P|vgAUT_VRygdwx-Y5d=Zpg`11n43X1NpgOZQ$6nF*9(s*@n9=r*BJNO_d zdHGXNeEbhk@_ZG_ApRc$#n(j;7MloE{f`#UUjn5^|5&{L5h#A`V{p1M_kiNd`-|t_ zEARH@oxo`oO}?3E#~u}==lQ35aw?|(e-^$<6TK-YIidT%gj2c z@gD-`!Owx>^AA9c_rKud;ENzm^7MD$XTkpi|A+xU%cP{I_dvwW&u2YB*_p2}dD*G| z2Co3GV(>?)e+{U0`zwS=?Y<3u8GIQJ2f-&mt^bce)w_n5>gNzBJzD_v{a#S>c>vVB ze+Rr0{4}WfKMFeg07|~T1zPZjAb;kS5D81o0;qlx@CNXcpamZX4};$U#lP1e)avIZ z@G@`-6hBsr_YZ^j@cfzL`NyE>y`D-}gExYj$J;?zYEFZalMBWBj~Dm_Q0wv6;5FcX zg6ii-;LYGwH~IO^fs)Jjf~bml1XO=t2F163F5dqS$Woc>-sa`+R#0-e0iFPV0~8sbrK1@>kw}8^WdqI}ed;&ZJeht(-UJtPh zVGe@t05?GK;d7wq`vxffKLbLtdF_m^|4vZr`7u!Se;33AnZF0c*QddkfIk7nr>l;5 zd066Jm+C@-yHsCmuS+zP*Q<-0xdNG*yTlJ&;+L+F@^Z>7<-?SKqU&zTt&~;DeU!T> zy5=b?o4a1hf9b7wr|VwIofNJ0==EUnptX^niZ@qLuA_*r;<2s|crfn;#s3c$&#eM~ zp+K#{1C$pO&w?u{w-?VjD7&QV8090BcTyxvx*`foVj7e+N=(uEEK?q$=+e5R?#{23 z*5NFrN0DynVtLHZQ5GnYgI}bar|3dejHSGv(x4+_fxK?NKRi#IY)Un`S~!6ZQAdIcA{y6xM}m`EN><3uQlayAH!X)0$*r?M9+d;=B zJ@=(vw-XH}r!VojpcBERZC{EvYZDEzx0!@lJek`-1W0;!kvh-Bi!o8DSFqAqxZ1})vUxI zKhYh(yZP|FZ`Y$d3-kAihmCB%1pr8)S=eI#J;J~TAe7%#lNZpvqvGcW{w3-o81s zOx4IRlHv0yavry*MyjRZ7&W7xR2%XtN~g>ni)Y|`h81atahNi(tkf+ODzztPPcH90 zxX-rJpxZ^~Am|Q%YZeYH6=rgwWdqwu;&!?0*+z1HOo(MwyV%2%5_gao4yb$H8 ze3vR?7Blr>ZPL$s{oIx>q8K8(et^+d@StAb3>pnTMCfJ8o?cp6xX0>!%`CZ|96?Rh z#u!I2t21_qC$^U+vdFB#21}2HmJo`zRPEBR2NRF3o>*ACW2J07)~*@mLDZ3Pb^H(d zc>>8vtS-(K(_2rnux#ux3%U%M*|lm2$yGS1R_kgdD(bxyvM(Gxy*z)MnOU3l!ba4B z{kC}J7SS_J4Kg)P)ZBCO=<$V<^TUBVVSrIDn4Bk8U)7?m7RYFCV_4VUjm<=yXtMUo(^=?>zK@fME}P95944RV>JBM zNV>?TtEi!S8aiebw=EKjhN)?mO9Zt}FE8NAapX4J?5-yrw^AL~M^f)>6U}BKk60QN zyY?nk!587)8uHApd0aFvCO1NS)lehnnuvG)BK)jcxxlUNz6_g1aii03N)!ACt*#63 zG)?@)veN|%w==E5E!@unIL3KOk-9g+OpQB&?9+CD=(xF3dVK= zn}tlnd4}^zisNtsG>%f+=p_II zV&FniAkPJ*2YleiY<)bPSw+lV4A*emWh0EAVc}P0w)s;u0ma_W9)W!Y*OPvV?UWg6;F_6^ zCfLNQCUJ(lS#>Uh_KQn3Jaihw`Q{Nv1wn7@+MSwTo;xwSxH@}m;pD>Vy_T+yFRU)k zudLYPOUriFo}OJ^U6?y_a(3CCKC_I0nMcf4(@h2Eh_Zajr0c2cR(I$#sCFhk8z<-S z`eUOK(Hu(bG|si`S%49%JCp?6ljRDhkCyIfRTc}($j#@tP8 zkTWBq=jDW$IcMXPvSlKy#S|>V{~&Ez6rt0>XG7VV!B2&~+*AQ=<%C6J#O3lD0)i z^F)rNW*~^o%jW2-u-nTwjr;F+Vw$|RdkPGz9oBxw2ljaZ7B-2ElNGy{8bjWNY>F`m z*kIa1&?xn`9KEaK=-B_qI;V} zbsGWONz6+($}-8wns!haa`{8ZcEVbHdyoxX>?dEoi&(xqYDLVHPx1&|Y;%aHR+N4YGzngr@ZP_HZqD8XO^Le+ZSU`)y(ZeSzVUKH8I-x5<8Ad zye2b|jef(bB2?a8x?S_IilWQDV~1#v+&EQZ(*?Oc??7fD+fWGE4bwJC-H)9RGRBO( zWg@%P-f+~RaXqw&0KD;>P=xNRyK|{-d|ziQt6Yd(B&3})Z%OgTZbk_AD$iJTy($cb^DnyGS=68*33pR_q!E9nhUFC=Rx)eBU! zzn(?SC_sJ)#kC|}Y8utf4Ht^&!diOUrE-f9{F0yTUTr&^QuRslH23Y=oy==Xdr32# zE)16E+)w=DwqB~^cNISCRV=>rxkwm!cQNdtkR;LRVn9DnznIQ<5%a_d0i1_Dsba-E zMefF`iw1UEZX@PuYwO~}sj)Va@~ta2A|tzeX3B1()HF&4N?Rm>6P@PN#Pr+PNblvA zY(mXANmHh*^d9R8`$Q~d)Q%z0CyuoKF0EFHH@zz-R@m4rvhAvhNy@YNU0>k_$C4jA znIyP^YaYv(Im1-G*HRb)5UFvASlQEQazDnrzR;}S7~{BoMasDQNJBgpRtFgr{7wizNvobpglM}bLegL>6@pg zsaRhQ&qdnvZmD;0+D;#ynVzN%^-cy^USGx3XQWILto13vh_IsoBhsD|TXIWU+~2ma zyfk&@6z&WPI#YAAx6(Xr_lb1st6|WcQKlp&3cLkeIs999;otuU?6$Bm>3r)TV8c$C*p zcltq$%#X$L#2#Bi7#@-5c9m?ZJIVYNob|pT>Akh8G4!TDnL`hssDp7ujg} z6Xt045OMkFo0_#)F)=)Ams;oO;+#pK~`jB6@^vE;4wo zM5uLh&<_NeCin2jd` zoTauDxHsjo84ev9xGeSdYP=b*)f}LfK2z=Zss8Q{x&a1bkPqC{A%t8YF_0D z4t11P91E+kA)GF-*VF!F%Qxi&h9Ai%7u}D&uHJ5|jqP!XZ46zAek)}Rr(}_W&L*$Y zOv!Eohnn!wJ}r^S$c{ybS3kyeb=P_0lie-(a>q1pcwiCjdTeh%x~MYEsNH~kcgW78 z%5)bgHbO-OVZ<<_A3Kx9XV!{zu3xPtVU1g{=42VD!8k^#YEx57?RE!07VAep(v>=L zIc4oNn9VNTJPIk#eo$&F>HTbJ99FML?SF3zsXNhlarUS$w!ldo_qWfxn9Y_tRU&&N z|J{k!2Ur1I)^p5&H?d+eEiQpwHD_AYC{-f-(p87~@ZIW8n)%YyA-X<8J_yU)_^P+_ z+Kj{l^qRarPC)T7Ql=nF8QT@5rO1&Jqbu&siqnAcg!%7V)az2|@nt2lyC2c1X9kC6#C;$$f(aq);m!f=S$c7YZ2Qs zsbnX?vW$GO&LBAR>Sl7U+ZXQM!SY?$c0G&9Ky9`gYmXIP4VZ_&SlD zP67KD_Im^7SGh37$uk_n!L**XOYFNagXWad@iKGX^vZ4Rl$^(YDx^p;I{{{^-W_x` zRq{()GxNimN+OX-Vc~-+QIA-%4JS<&cGPxDety8Vj4@oop2_Q|z~}0bT$1Zic!@N< z%g{rX%v>dhlVM!XpT;RM-e{(N?gR;t^?C z{Rjob5H2HFxry;UcFEn7g!fC~Xem;|^X1wPXN68Xj%ZfndHlH(3-ilGy00RKCGhpF zw=SH3Ex3wmzk61{YR{f9i?onFmFkoFEGEjhhyfNpkv2fAKf{@a&I`r18Yv~z zMmT+ffA{kNER5p4G4V!293wKKLU&$ZACnkd_IfEQRdC(wRg;9}J^AWrb8?a}n0)yn_yr>XR1159#MZmAQzzgh~)EU;)I8t$^#CkDhXV1)?S)6C1 z#(o#?#a_tya{|@@eY(A-bLtXnd1TpyxusJ&=vbINiF3lNdDFlA#ObBQ+n49<0;-@{|({vpFCU!ahknvOG>6Aq4SNcy=eko$u;TO-O$IMW~Cx==6D3{{< zt)5HGD!PFPm!6(ZV_k2XxAVp%y#bmD zm02H$-QrZFTz;SaL3222A+KdHX<>>#=}gLILkGt@Qt8z4(;3#7AIm6>rv)b1r42Jt zzb<_n+C7Ep%N2WV7z%T7*fN$zXkalKxpq0_SJ!uS@-qH98~8I9+{1vZ8^5@5Ta2-$ z1x;h`iXh$&di^LHa5%UT{DAdRI?C}LuWw_*MuJ2-=oPxFd&W^NXtbhFEB0kT zQ{}b?seTUXYL+VIOy9_MOW);UT|Nx~A30rR@8?nsMHUV(%rseqqDhPWN#T<@2y(xS zQu1f)7^v#GFkAbbpY)*(>DuBqqgAbue4f092CA%%R^EFlUOUI7I6|tzfOsF-n#b0G)1`^Rl(>{@h!Gp$S1Myu2z3zyp>l{eXFoppkOgAq<;rW# z$X3W5CRz3r%vS}iy2R0xi$a&Bq*w0>2KA6iRNPA{S$bNNGlj|Cm=GpnV@J9wnw8Xz zv}h#|>I8nL_9GJ<6OnDAJY>XJz2Wq|#u@@?1=dn9Y0VBtSMt@xrbRq;63K4SMVRN9 zXmN<;0*fL?%k+!=T7n1IC@p}Zc9n@EsDA&tK2UV@6LAYV&IiV)^CB8|8)LA juCrR%(TutK>MhLZYcqS-JU^LPS(!gIzqmU7gwy+fB{oop literal 0 HcmV?d00001 diff --git a/src/apps/bin/bison/po/fr.po b/src/apps/bin/bison/po/fr.po new file mode 100644 index 0000000000..cb77d09f12 --- /dev/null +++ b/src/apps/bin/bison/po/fr.po @@ -0,0 +1,1210 @@ +# Messages français pour Bison. +# Copyright © 2004 Free Software Foundation, Inc. +# Michel Robitaille , traducteur depuis/since 1996 +# Dominique Boucher a été le traducteur de 1996 à 2000 +# +msgid "" +msgstr "" +"Project-Id-Version: GNU bison 1.875a\n" +"Report-Msgid-Bugs-To: bug-bison@gnu.org\n" +"POT-Creation-Date: 2004-05-21 10:26-0700\n" +"PO-Revision-Date: 2004-05-10 08:00-0500\n" +"Last-Translator: Michel Robitaille \n" +"Language-Team: French \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8-bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: src/complain.c:51 src/complain.c:66 +msgid "warning: " +msgstr "AVERTISSEMENT: " + +#: src/complain.c:122 src/complain.c:138 +msgid "fatal error: " +msgstr "erreur fatale: " + +#: src/conflicts.c:76 +#, c-format +msgid " Conflict between rule %d and token %s resolved as shift" +msgstr "Conflit entre la règle %d et le jeton %s résolu par décalage" + +#: src/conflicts.c:84 +#, c-format +msgid " Conflict between rule %d and token %s resolved as reduce" +msgstr "Conflit entre la règle %d et le jeton %s résolu par réduction" + +#: src/conflicts.c:91 +#, c-format +msgid " Conflict between rule %d and token %s resolved as an error" +msgstr "Conflit entre la règle %d et le jeton %s résolu comme étant une erreur" + +#: src/conflicts.c:399 +#, c-format +msgid "conflicts: %d shift/reduce, %d reduce/reduce\n" +msgstr "conflits: %d décalage/réduction, %d réduction/réduction\n" + +#: src/conflicts.c:402 +#, c-format +msgid "conflicts: %d shift/reduce\n" +msgstr "conflits: %d décalage/réduction\n" + +#: src/conflicts.c:404 +#, c-format +msgid "conflicts: %d reduce/reduce\n" +msgstr "conflits: %d réduction/réduction\n" + +#: src/conflicts.c:422 +#, c-format +msgid "State %d " +msgstr "État %d" + +#: src/conflicts.c:487 +#, fuzzy, c-format +msgid "%%expect-rr applies only to GLR parsers" +msgstr "%%dprec affecte seulement les analyseurs GLR" + +#: src/conflicts.c:511 +#, c-format +msgid "expected %d shift/reduce conflict" +msgid_plural "expected %d shift/reduce conflicts" +msgstr[0] "attendait %d conflit par décalage/réduction" +msgstr[1] "attendait %d conflits par décalage/réduction" + +#: src/conflicts.c:515 +#, fuzzy, c-format +msgid "expected %d reduce/reduce conflict" +msgid_plural "expected %d reduce/reduce conflicts" +msgstr[0] "attendait 0 conflit par réduction/réduction" +msgstr[1] "attendait 0 conflit par réduction/réduction" + +#: src/files.c:100 +#, c-format +msgid "cannot open file `%s'" +msgstr "ne peut ouvrir le fichier « %s »" + +#: src/files.c:116 +msgid "I/O error" +msgstr "une erreur d'E/S" + +#: src/files.c:119 +msgid "cannot close file" +msgstr "ne peut fermer le fichier" + +#: src/files.c:337 +#, c-format +msgid "conflicting outputs to file %s" +msgstr "sorties en conflit vers le fichier %s" + +#: src/getargs.c:186 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "Pour en savoir davantage, faites: « %s --help ».\n" + +#: src/getargs.c:192 +msgid "GNU bison generates parsers for LALR(1) grammars.\n" +msgstr "GNU bison génère des analyseurs pour les grammaires de type LALR(1).\n" + +#: src/getargs.c:196 +#, c-format +msgid "Usage: %s [OPTION]... FILE\n" +msgstr "Usage: %s [OPTION]... FICHIER\n" + +#: src/getargs.c:200 +msgid "" +"If a long option shows an argument as mandatory, then it is mandatory\n" +"for the equivalent short option also. Similarly for optional arguments.\n" +msgstr "" +"Si une option de forme longue montre un arguement comme étant obligatoire,\n" +"il est alors obligatoire également pour une option de forme courte.\n" +"Il en est de même pour les arguments optionnels.\n" + +#: src/getargs.c:206 +msgid "" +"Operation modes:\n" +" -h, --help display this help and exit\n" +" -V, --version output version information and exit\n" +" -y, --yacc emulate POSIX yacc\n" +msgstr "" +"Modes d'utilisation:\n" +" -h, --help afficher l'aide-mémoire\n" +" -V, --version afficher le nom et la version du logiciel\n" +" -y, --yacc émuler yacc en mode POSIX\n" + +#: src/getargs.c:213 +msgid "" +"Parser:\n" +" -S, --skeleton=FILE specify the skeleton to use\n" +" -t, --debug instrument the parser for debugging\n" +" --locations enable locations computation\n" +" -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n" +" -l, --no-lines don't generate `#line' directives\n" +" -n, --no-parser generate the tables only\n" +" -k, --token-table include a table of token names\n" +msgstr "" +"Analyseur:\n" +" -S, --skeleton=FICHIER utiliser le FICHIER squelette\n" +" -t, --debug activer le mode de mise au point\n" +" de l'analyseur\n" +" --locations permettre le calcul des localisations\n" +" -p, --name-prefix=PREFIXE accoler le PREFIXE aux symboles externes\n" +" -l, --no-lines ne pas générer les directives « #line »\n" +" -n, --no-parser générer les tables seulement\n" +" -r, --raw compter les jetons à partir de 3\n" +" -k, --token-table inclure la table des noms de jetons\n" + +#: src/getargs.c:225 +msgid "" +"Output:\n" +" -d, --defines also produce a header file\n" +" -r, --report=THINGS also produce details on the automaton\n" +" -v, --verbose same as `--report=state'\n" +" -b, --file-prefix=PREFIX specify a PREFIX for output files\n" +" -o, --output=FILE leave output to FILE\n" +" -g, --graph also produce a VCG description of the " +"automaton\n" +msgstr "" +"Sortie:\n" +" -d, --defines produire un fichier d'en-tête\n" +" -r, --report=CHOSES générer les détails concernant l'automate\n" +" -v, --verbose produire une explication de l'automate\n" +" -b, --file-prefix=PREFIXE utiliser le PREFIXE pour le fichier de sortie\n" +" -o, --output=FICHIER produire la sortie dans le FICHIER\n" +" -g, --graph produire aussi la description du graphe VCG de " +"l'automate\n" + +#: src/getargs.c:236 +msgid "" +"THINGS is a list of comma separated words that can include:\n" +" `state' describe the states\n" +" `itemset' complete the core item sets with their closure\n" +" `lookahead' explicitly associate lookaheads to items\n" +" `solved' describe shift/reduce conflicts solving\n" +" `all' include all the above information\n" +" `none' disable the report\n" +msgstr "" +"CHOSES est une liste de mots séparés par des virgules par les suivants:\n" +" `state' description des états\n" +" `itemset' compléter le corps du jeu d'items avec leur fermeture\n" +" `lookahead' explicitement associé les lookahead aux items\n" +" `solved' décrirer la résolution des conflits décalage/réduction\n" +" `all' inclure toutes les informations ci-haut\n" +" `none' désactiver la génération de rapport\n" + +#: src/getargs.c:247 +msgid "Report bugs to .\n" +msgstr "Rapporter toutes anomalies à .\n" + +#: src/getargs.c:264 +#, c-format +msgid "bison (GNU Bison) %s" +msgstr "bison (GNU Bison) %s" + +#: src/getargs.c:266 +msgid "Written by Robert Corbett and Richard Stallman.\n" +msgstr "Écrit par Robert Corbett et Richard Stallman.\n" + +#: src/getargs.c:270 +#, c-format +msgid "Copyright (C) %d Free Software Foundation, Inc.\n" +msgstr "Copyright © %d Free Software Foundation, Inc.\n" + +#: src/getargs.c:272 +msgid "" +"This is free software; see the source for copying conditions. There is NO\n" +"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +msgstr "" +"Ce logiciel est libre; voir les sources pour les conditions de\n" +"reproduction. AUCUNE garantie n'est donnée; tant pour des raisons\n" +"COMMERCIALES que pour RÉPONDRE À UN BESOIN PARTICULIER.\n" + +#: src/getargs.c:438 +#, c-format +msgid "missing operand after `%s'" +msgstr "opérande manquante après « %s »" + +#: src/getargs.c:440 +#, c-format +msgid "extra operand `%s'" +msgstr "opérande superflue « %s »" + +#: src/gram.c:139 +msgid "empty" +msgstr "vide" + +#: src/gram.c:233 +msgid "Grammar" +msgstr "Grammaire" + +#: src/gram.c:321 src/reduce.c:394 +msgid "warning" +msgstr "AVERTISSEMENT" + +#: src/main.c:124 +msgid "rule never reduced because of conflicts" +msgstr "la règle n'a jamais fait de réduction en raison des conflits" + +#: src/parse-gram.y:363 +msgid "POSIX forbids declarations in the grammar" +msgstr "POSIX interdit les déclaration dans la grammaire" + +#: src/parse-gram.y:486 +msgid "missing identifier in parameter declaration" +msgstr "identificateur manquant dans la déclaration de paramètres" + +#: src/print.c:49 +#, c-format +msgid " type %d is %s\n" +msgstr " le type %d est %s\n" + +#: src/print.c:165 +#, c-format +msgid "shift, and go to state %d\n" +msgstr "décalage et aller à l'état %d\n" + +#: src/print.c:167 +#, c-format +msgid "go to state %d\n" +msgstr "aller à l'état %d\n" + +#: src/print.c:204 +msgid "error (nonassociative)\n" +msgstr "erreur (non-associative)\n" + +#: src/print.c:292 +#, c-format +msgid "reduce using rule %d (%s)" +msgstr "réduction par utilisation de la règle %d (%s)" + +#: src/print.c:294 +#, c-format +msgid "accept" +msgstr "accepter" + +#: src/print.c:325 src/print.c:391 +msgid "$default" +msgstr "$défaut" + +#: src/print.c:420 +#, c-format +msgid "state %d" +msgstr "état %d" + +#: src/print.c:456 +msgid "Terminals, with rules where they appear" +msgstr "Terminaux, suivis des règles où ils apparaissent" + +#: src/print.c:483 +msgid "Nonterminals, with rules where they appear" +msgstr "Non-terminaux, suivis des règles où ils apparaissent" + +#: src/print.c:512 +#, c-format +msgid " on left:" +msgstr " à gauche:" + +#: src/print.c:527 +#, c-format +msgid " on right:" +msgstr " à droite:" + +#: src/print.c:555 +msgid "Rules never reduced" +msgstr "Règles jamais réduites" + +#: src/reader.c:56 +#, c-format +msgid "multiple %s declarations" +msgstr "déclarations multiples de %s" + +#: src/reader.c:118 +#, c-format +msgid "result type clash on merge function %s: <%s> != <%s>" +msgstr "" +"conflit dans le type résultant de la fonction de fusion %s: <%s> != <%s>" + +#: src/reader.c:216 +#, c-format +msgid "rule given for %s, which is a token" +msgstr "la règle pour %s, qui est un terminal" + +#: src/reader.c:245 +#, c-format +msgid "type clash on default action: <%s> != <%s>" +msgstr "conflit de type pour l'action par défaut: <%s> != <%s>" + +#: src/reader.c:251 +msgid "empty rule for typed nonterminal, and no action" +msgstr "règle vide pour une catégorie typée et aucune action" + +#: src/reader.c:321 src/reader.c:335 src/reader.c:348 +#, c-format +msgid "only one %s allowed per rule" +msgstr "seul un %s est permis par règle" + +#: src/reader.c:331 src/reader.c:346 +#, c-format +msgid "%s affects only GLR parsers" +msgstr "%s affecte seulement les analyseurs GLR" + +#: src/reader.c:333 +#, c-format +msgid "%s must be followed by positive number" +msgstr "%s doit être suivi d'un nombre positif" + +#: src/reader.c:490 +msgid "no rules in the input grammar" +msgstr "la grammaire n'a pas de règles" + +#: src/reduce.c:242 +msgid "useless rule" +msgstr "règle inutilisable" + +#: src/reduce.c:303 +#, c-format +msgid "useless nonterminal: %s" +msgstr "non-terminal inutilisable: %s" + +#: src/reduce.c:351 +msgid "Useless nonterminals" +msgstr "Non-terminaux inutiles" + +#: src/reduce.c:364 +msgid "Terminals which are not used" +msgstr "Terminaux qui ne sont utilisés" + +#: src/reduce.c:373 +msgid "Useless rules" +msgstr "Règles inutiles" + +#: src/reduce.c:389 +#, c-format +msgid "%d rule never reduced\n" +msgid_plural "%d rules never reduced\n" +msgstr[0] "%d règle n'a jamais été réduite\n" +msgstr[1] "%d règles n'ont jamais été réduites\n" + +#: src/reduce.c:397 +#, c-format +msgid "%d useless nonterminal" +msgid_plural "%d useless nonterminals" +msgstr[0] "%d nonterminal inutilisable" +msgstr[1] "%d nonterminals inutilisables" + +#: src/reduce.c:403 +#, c-format +msgid " and " +msgstr " et " + +#: src/reduce.c:406 +#, c-format +msgid "%d useless rule" +msgid_plural "%d useless rules" +msgstr[0] "%d règle inutilisable" +msgstr[1] "%d règles inutilisables" + +#: src/reduce.c:436 +#, c-format +msgid "start symbol %s does not derive any sentence" +msgstr "" +"symbole de départ %s peut permettre la dérivation de n'importe quelle phrase" + +#: src/scan-gram.l:162 +msgid "stray `,' treated as white space" +msgstr "« , » errante traitée comme un blanc" + +#: src/scan-gram.l:225 +#, c-format +msgid "invalid directive: %s" +msgstr "directive invalide: %s" + +#: src/scan-gram.l:283 +#, c-format +msgid "invalid character: %s" +msgstr "caractère invalide: %s" + +#: src/scan-gram.l:402 +#, fuzzy +msgid "invalid null character" +msgstr "caractère invalide: %s" + +#: src/scan-gram.l:415 src/scan-gram.l:427 src/scan-gram.l:448 +#, c-format +msgid "invalid escape sequence: %s" +msgstr "séquence d'échappement invalide: %s" + +#: src/scan-gram.l:417 src/scan-gram.l:429 src/scan-gram.l:450 +#, fuzzy, c-format +msgid "invalid null character: %s" +msgstr "caractère invalide: %s" + +#: src/scan-gram.l:455 +#, c-format +msgid "unrecognized escape sequence: %s" +msgstr "séquence d'échappement non reconnue: %s" + +#: src/scan-gram.l:537 +#, c-format +msgid "missing `{' in `%s'" +msgstr "« { » manquante dans « %s »" + +#: src/scan-gram.l:782 +#, c-format +msgid "$$ of `%s' has no declared type" +msgstr "$$ de « %s » n'a pas son type déclaré" + +#: src/scan-gram.l:803 +#, c-format +msgid "$%d of `%s' has no declared type" +msgstr "$%d de « %s » n'a pas de type déclaré" + +#: src/scan-gram.l:812 src/scan-gram.l:881 src/scan-gram.l:932 +#, c-format +msgid "integer out of range: %s" +msgstr "entier hors limite: %s" + +#: src/scan-gram.l:848 src/scan-gram.l:916 +#, c-format +msgid "invalid value: %s" +msgstr "valeur invalide: %s" + +#: src/scan-gram.l:1036 +#, c-format +msgid "missing `%s' at end of file" +msgstr "chaîne de caractères « %s » manquante en fin de fichier" + +#: src/scan-gram.l:1047 +#, fuzzy, c-format +msgid "missing `%s' at end of line" +msgstr "chaîne de caractères « %s » manquante en fin de fichier" + +#: src/symlist.c:97 src/symlist.c:108 +msgid "invalid $ value" +msgstr "la valeur de symbole $ n'est pas valide" + +#: src/symtab.c:85 +#, c-format +msgid "type redeclaration for %s" +msgstr "redéclaration du type de %s" + +#: src/symtab.c:102 src/symtab.c:120 +#, c-format +msgid "%s redeclaration for %s" +msgstr "redéclaration de %s pour %s" + +#: src/symtab.c:139 +#, c-format +msgid "redefining precedence of %s" +msgstr "redéfinition du niveau de priorité de %s" + +#: src/symtab.c:157 +#, c-format +msgid "symbol %s redefined" +msgstr "symbole %s redéfini" + +#: src/symtab.c:180 +#, c-format +msgid "redefining user token number of %s" +msgstr "redéfinition du jeton usager numéro de %s" + +#: src/symtab.c:207 +#, c-format +msgid "symbol %s is used, but is not defined as a token and has no rules" +msgstr "" +"le symbole %s est utilisé mais ce n'est pas un terminal et il ne possède pas " +"de règle" + +#: src/symtab.c:232 +#, c-format +msgid "symbol `%s' used more than once as a literal string" +msgstr "symbole « %s » utilisé plus d'une fois dans une chaîne litérale" + +#: src/symtab.c:235 +#, c-format +msgid "symbol `%s' given more than one literal string" +msgstr "symbole « %s » présent dans plus d'une chaîne litérale" + +#: src/symtab.c:271 +#, c-format +msgid "conflicting precedences for %s and %s" +msgstr "les priorités pour %s et %s entrent en conflit" + +#: src/symtab.c:283 +#, c-format +msgid "conflicting associativities for %s (%s) and %s (%s)" +msgstr "conflits d'associativités pour %s (%s) et %s (%s)" + +#: src/symtab.c:368 +#, c-format +msgid "tokens %s and %s both assigned number %d" +msgstr "les jetons %s et %s se sont vus assigner le nombre %d" + +#: src/symtab.c:591 +#, c-format +msgid "the start symbol %s is undefined" +msgstr "le symbole de départ %s n'est pas défini" + +#: src/symtab.c:595 +#, c-format +msgid "the start symbol %s is a token" +msgstr "le symbole de départ %s est un terminal" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "argument invalide %s pour %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "argument ambiguë %s pour %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Arguments valides sont:" + +#: lib/bitset_stats.c:179 +#, c-format +msgid "%u bitset_allocs, %u freed (%.2f%%).\n" +msgstr "%u bitset_allocs, %u libérés (%.2f%%).\n" + +#: lib/bitset_stats.c:182 +#, c-format +msgid "%u bitset_sets, %u cached (%.2f%%)\n" +msgstr "%u bitset_sets, %u dans la cache (%.2f%%)\n" + +#: lib/bitset_stats.c:185 +#, c-format +msgid "%u bitset_resets, %u cached (%.2f%%)\n" +msgstr "%u bitset_resets, %u dans la cache (%.2f%%)\n" + +#: lib/bitset_stats.c:188 +#, c-format +msgid "%u bitset_tests, %u cached (%.2f%%)\n" +msgstr "%u bitset_tests, %u dans la cache (%.2f%%)\n" + +#: lib/bitset_stats.c:192 +#, c-format +msgid "%u bitset_lists\n" +msgstr "%u bitset_lists\n" + +#: lib/bitset_stats.c:194 +msgid "count log histogram\n" +msgstr "histogramme des compteurs\n" + +#: lib/bitset_stats.c:197 +msgid "size log histogram\n" +msgstr "taille de l'histogramme des compteurs\n" + +#: lib/bitset_stats.c:200 +msgid "density histogram\n" +msgstr "densité de l'histogramme\n" + +#: lib/bitset_stats.c:214 +#, c-format +msgid "" +"Bitset statistics:\n" +"\n" +msgstr "" +"Statistiques des bitset:\n" +"\n" + +#: lib/bitset_stats.c:217 +#, c-format +msgid "Accumulated runs = %u\n" +msgstr "Exécutions accumulées = %u\n" + +#: lib/bitset_stats.c:261 lib/bitset_stats.c:266 +msgid "Could not read stats file." +msgstr "Ne peut lire le fichier de stats." + +#: lib/bitset_stats.c:263 +#, c-format +msgid "Bad stats file size.\n" +msgstr "Taille erronée du fichier de stats.\n" + +#: lib/bitset_stats.c:289 lib/bitset_stats.c:291 +msgid "Could not write stats file." +msgstr "Ne peut écrire le fichier de stats." + +#: lib/bitset_stats.c:294 +msgid "Could not open stats file for writing." +msgstr "Ne ouvrir en écriture le fichier de stats." + +#: lib/error.c:127 +msgid "Unknown system error" +msgstr "Erreur système inconnue" + +#: lib/getopt.c:570 lib/getopt.c:589 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: l'option %s est ambigüe\n" + +#: lib/getopt.c:622 lib/getopt.c:626 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: l'option « --%s » n'admet pas d'argument\n" + +#: lib/getopt.c:635 lib/getopt.c:640 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: l'option « %c%s » n'admet pas d'argument\n" + +#: lib/getopt.c:686 lib/getopt.c:708 lib/getopt.c:1039 lib/getopt.c:1061 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: l'option « %s » requiert un argument\n" + +#: lib/getopt.c:746 lib/getopt.c:749 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: l'option « --%s » est inconnue\n" + +#: lib/getopt.c:757 lib/getopt.c:760 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: l'option « %c%s » est inconnue\n" + +#: lib/getopt.c:815 lib/getopt.c:818 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: option illégale -- %c\n" + +#: lib/getopt.c:824 lib/getopt.c:827 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: option non valide -- %c\n" + +#: lib/getopt.c:882 lib/getopt.c:901 lib/getopt.c:1114 lib/getopt.c:1135 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: l'option requiert un argument -- %c\n" + +#: lib/getopt.c:954 lib/getopt.c:973 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: l'option « -W %s » est ambiguë\n" + +#: lib/getopt.c:997 lib/getopt.c:1018 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: l'option « -W %s » n'admet pas d'argument\n" + +#: lib/obstack.c:417 lib/obstack.c:420 lib/xmalloc.c:53 +msgid "memory exhausted" +msgstr "mémoire épuisée" + +#: lib/quotearg.c:238 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:239 +msgid "'" +msgstr "'" + +#: lib/subpipe.c:171 +#, c-format +msgid "subsidiary program `%s' could not be invoked" +msgstr "programme subsidiaire « %s » n'a pu être invoqué" + +#: lib/subpipe.c:173 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "programme subsidiaire « %s » n'a pas été repéré" + +#: lib/subpipe.c:175 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "programme subsidiaire « %s » a échoué" + +#: lib/subpipe.c:176 +#, c-format +msgid "subsidiary program `%s' failed (exit status %d)" +msgstr "programme subsidiaire « %s » a échoué (statut d'exécution %d)" + +#: lib/timevar.c:475 +msgid "" +"\n" +"Execution times (seconds)\n" +msgstr "" +"\n" +"Temps d'exécution (secondes)\n" + +#: lib/timevar.c:525 +msgid " TOTAL :" +msgstr " TOTAL :" + +#: lib/timevar.c:561 +#, c-format +msgid "time in %s: %ld.%06ld (%ld%%)\n" +msgstr "temps dans %s: %ld.%06ld (%ld%%)\n" + +#~ msgid "%d shift/reduce conflict" +#~ msgid_plural "%d shift/reduce conflicts" +#~ msgstr[0] "%d conflit par décalage/réduction" +#~ msgstr[1] "%d conflits par décalage/réduction" + +#~ msgid "and" +#~ msgstr "et" + +#~ msgid "conflicts: " +#~ msgstr "conflits: " + +#~ msgid "State %d contains " +#~ msgstr "L'état %d contient " + +#~ msgid "too many gotos (max %d)" +#~ msgstr "nombre trop grand de « goto » (Max %d)" + +#~ msgid "too many symbols (tokens plus nonterminals); maximum %d" +#~ msgstr "trop de symboles (jeton plus non terminaux); maximum %d" + +#~ msgid ": unexpected end of file in a comment\n" +#~ msgstr ": fin de fichier inattendue dans un commentaire\n" + +#~ msgid ": unexpected end of file in a string\n" +#~ msgstr ": fin de fichier inattendue dans une chaîne\n" + +#~ msgid ": unexpected end of file in a character\n" +#~ msgstr ": fin de fichier inattendue dans un caractère\n" + +#~ msgid ": unexpected end of file in a braced code\n" +#~ msgstr ": fin de fichier inattendue dans du code entre accolades\n" + +#~ msgid ": unexpected end of file in a prologue\n" +#~ msgstr ": fin de fichier inattendue dans un prologue\n" + +#~ msgid "%s is invalid" +#~ msgstr "%s n'est pas valide" + +#~ msgid "too many states (max %d)" +#~ msgstr "nombre trop grand d'états (max %d)" + +#~ msgid "%s: no grammar file given\n" +#~ msgstr "%s: grammaire manquante\n" + +#~ msgid "%s: extra arguments ignored after `%s'\n" +#~ msgstr "%s: arguments supplémentaires ignorés après « %s »\n" + +#~ msgid "two @prec's in a row" +#~ msgstr "deux @prec de suite" + +#~ msgid "only one %%dprec allowed per rule" +#~ msgstr "seul un %%dprec est permis par règle" + +#~ msgid "state_list_append (state = %d, symbol = %d (%s))\n" +#~ msgstr "state_list_append (état = %d, symbole = %d (%s))\n" + +#~ msgid "Entering new_itemsets, state = %d\n" +#~ msgstr "Entrant dans new_itemsets, état = %d\n" + +#~ msgid "Entering get_state, symbol = %d (%s)\n" +#~ msgstr "Entrant dans get_state, symbole = %d (%s)\n" + +#~ msgid "Exiting get_state => %d\n" +#~ msgstr "Sortant de get_state => %d\n" + +#~ msgid "Entering append_states, state = %d\n" +#~ msgstr "Entrant dans append_states, état = %d\n" + +#~ msgid "Processing state %d (reached by %s)\n" +#~ msgstr "Traitement de l'état %d (atteint par %s)\n" + +#~ msgid "undefined associativity" +#~ msgstr "associativité indéfinie" + +#~ msgid "Closure: %s\n" +#~ msgstr "Fermeture: %s\n" + +#~ msgid " (rule %d)\n" +#~ msgstr " (règle %d)\n" + +#~ msgid "RTC: Firsts Input" +#~ msgstr "RTC: premières entrées" + +#~ msgid "RTC: Firsts Output" +#~ msgstr "RTC: premières sorties" + +#~ msgid "input" +#~ msgstr "entrée" + +#~ msgid "output" +#~ msgstr "sortie" + +#~ msgid "" +#~ "Variables\n" +#~ "---------\n" +#~ "\n" +#~ msgstr "" +#~ "Variables\n" +#~ "---------\n" +#~ "\n" + +#~ msgid "Value Sprec Sassoc Tag\n" +#~ msgstr "Valeur Sprec Sassoc Étiquette\n" + +#~ msgid "" +#~ "Rules\n" +#~ "-----\n" +#~ "\n" +#~ msgstr "" +#~ "Règles\n" +#~ "------\n" +#~ "\n" + +#~ msgid "" +#~ "Num (Prec, Assoc, Useful, Ritem Range) Lhs -> Rhs (Ritem range) [Num]\n" +#~ msgstr "" +#~ "Num (Prec, Assoc, Utile, Ritem étendue) Lhs -> Rhs (Ritem étendue) " +#~ "[Num]\n" + +#~ msgid "" +#~ "Rules interpreted\n" +#~ "-----------------\n" +#~ "\n" +#~ msgstr "" +#~ "Règles interprétées\n" +#~ "-------------------\n" +#~ "\n" + +#~ msgid "Lookaheads: BEGIN\n" +#~ msgstr "Lookaheads: DÉBUT\n" + +#~ msgid "State %d: %d lookaheads\n" +#~ msgstr "État %d: %d lookaheads\n" + +#~ msgid " on %d (%s) -> rule %d\n" +#~ msgstr " sur %d (%s) -> règle %d\n" + +#~ msgid "Lookaheads: END\n" +#~ msgstr "Lookaheads: FIN\n" + +#~ msgid "relation_transpose: input\n" +#~ msgstr "relation_transpose: entrée\n" + +#~ msgid "relation_transpose: output\n" +#~ msgstr "relation_transpose: sortie\n" + +#~ msgid "growing table and check from: %lu to %lu\n" +#~ msgstr "table en croissance et vérification depuis %lu à %lu\n" + +#~ msgid "base_t too small to hold %d\n" +#~ msgstr "base_t trop petite pour contenir %d\n" + +#~ msgid "reduce" +#~ msgstr "réduction" + +#~ msgid "shift" +#~ msgstr "décalage" + +#~ msgid "%s contains " +#~ msgstr "%s contient " + +#~ msgid "`%s' is no longer supported" +#~ msgstr "« %s » n'est plus supporté" + +#~ msgid "unexpected `/' found and ignored" +#~ msgstr "« / » inattendu et ignoré" + +#~ msgid "unterminated comment" +#~ msgstr "le commentaire ne se termine pas" + +#~ msgid "unescaped newline in constant" +#~ msgstr "retour de chariot sans échappement dans une constante" + +#~ msgid "octal value outside range 0...255: `\\%o'" +#~ msgstr "valeur octale à l'extérieur de l'intervalle 0...255: « \\%o »" + +#~ msgid "hexadecimal value above 255: `\\x%x'" +#~ msgstr "valeur hexadécimale supérieure à 255: « \\x%x »" + +#~ msgid "unknown escape sequence: `\\' followed by `%s'" +#~ msgstr "séquence d'échappement inconnue: « \\ » suivie de « %s »" + +#~ msgid "unterminated type name at end of file" +#~ msgstr "le nom de type ne se termine pas avant la fin de fichier" + +#~ msgid "unterminated type name" +#~ msgstr "le nom de type ne se termine pas" + +#~ msgid "use \"...\" for multi-character literal tokens" +#~ msgstr "" +#~ "utilisez \"...\" pour les terminaux litéraux de plusieurs caractères" + +#~ msgid "`%s' supports no argument: %s" +#~ msgstr "« %s » ne supporte aucun argument: %s" + +#~ msgid "`%s' requires an argument" +#~ msgstr "« %s »: requiert un argument" + +#~ msgid " %-4s\terror (nonassociative)\n" +#~ msgstr " %-4s\terreur (non-associatif)\n" + +#~ msgid "" +#~ " $default\treduce using rule %d (%s)\n" +#~ "\n" +#~ msgstr "" +#~ " $défaut\tréduction par la règle %d (%s)\n" +#~ "\n" + +#~ msgid " %-4s\t[reduce using rule %d (%s)]\n" +#~ msgstr " %-4s\t[réduction par la règle %d (%s)]\n" + +#~ msgid " %-4s\treduce using rule %d (%s)\n" +#~ msgstr " %-4s\tréduction par la règle %d (%s)\n" + +#~ msgid " $default\treduce using rule %d (%s)\n" +#~ msgstr " $défaut\tréduction par la règle %d (%s)\n" + +#~ msgid " $default\taccept\n" +#~ msgstr " $défaut\taccepter\n" + +#~ msgid " NO ACTIONS\n" +#~ msgstr " PAS D'ACTION\n" + +#~ msgid "Number, Line, Rule" +#~ msgstr "Nombre, ligne, règle" + +#~ msgid " %3d %3d %s ->" +#~ msgstr " %3d %3d %s ->" + +#~ msgid " Skipping to next \\n" +#~ msgstr " Saut jusqu'au prochain \\n" + +#~ msgid " Skipping to next %c" +#~ msgstr " Saut jusqu'au prochain %c" + +#~ msgid "unterminated string" +#~ msgstr "chaîne de caractère non terminée" + +#~ msgid "unterminated `%{' definition" +#~ msgstr "" +#~ "La section de définition « %{ » ne termine pas avant la fin du fichier" + +#~ msgid "Premature EOF after %s" +#~ msgstr "Fin de fichier prématutée après %s" + +#~ msgid "`%s' is invalid in %s" +#~ msgstr "« %s » n'est pas valide dans %s" + +#~ msgid "invalid %s declaration" +#~ msgstr "la déclaration %s n'est pas valide" + +#~ msgid "%type declaration has no " +#~ msgstr "la déclaration %type n'a pas de " + +#~ msgid "invalid %%type declaration due to item: %s" +#~ msgstr "la déclaration %%type n'est pas valide en raison de l'item: %s" + +#~ msgid "invalid text (%s) - number should be after identifier" +#~ msgstr "" +#~ "le texte n'est pas valide (%s) - le nombre devrait suivre l'identificateur" + +#~ msgid "unexpected item: %s" +#~ msgstr "item inattendu: %s" + +#~ msgid "unmatched %s" +#~ msgstr "non appariement de %s" + +#~ msgid "argument of %%expect is not an integer" +#~ msgstr "l'argument de %%expect n'est pas un entier" + +#~ msgid "unrecognized item %s, expected an identifier" +#~ msgstr "item %s non reconnu, un identificateur est attendu" + +#~ msgid "expected string constant instead of %s" +#~ msgstr "chaîne de caractères constante attendue plutôt que %s" + +#~ msgid "no input grammar" +#~ msgstr "aucune grammaire en entrée" + +#~ msgid "unknown character: %s" +#~ msgstr "caractère inconnu: %s" + +#~ msgid "ill-formed rule: initial symbol not followed by colon" +#~ msgstr "règle mal formée: le symbole initial n'est pas suivi de « : »" + +#~ msgid "grammar starts with vertical bar" +#~ msgstr "la grammaire débute par une barre verticale" + +#~ msgid "previous rule lacks an ending `;'" +#~ msgstr "règle précédente manque une terminaison « ; »" + +#~ msgid "%%guard present but %%semantic_parser not specified" +#~ msgstr "%%guard est présent mais %%semantic_parser n'est pas spécifié" + +#~ msgid "two actions at end of one rule" +#~ msgstr "deux actions à la fin d'une même règle" + +#~ msgid "maximum table size (%d) exceeded" +#~ msgstr "taille maximale de la table (%d) dépassée" + +#~ msgid " $ \tgo to state %d\n" +#~ msgstr " $ \taller à l'état %d\n" + +#~ msgid "unterminated %guard clause" +#~ msgstr "clause %guard non terminée" + +#~ msgid "%s: internal error: %s\n" +#~ msgstr "%s: erreur interne: %s\n" + +#~ msgid "DERIVES" +#~ msgstr "DÉRIVES" + +#~ msgid "%s derives" +#~ msgstr "%s dérive" + +#~ msgid "Entering set_nullable" +#~ msgstr "Entré dans set_nullable" + +#~ msgid "" +#~ "reduced %s defines %d terminal%s, %d nonterminal%s, and %d production%s.\n" +#~ msgstr "" +#~ "la réduction de %s définit %d terminal%s, %d catégorie%s et %d production%" +#~ "s.\n" + +#~ msgid " 1 shift/reduce conflict" +#~ msgstr " 1 conflit décalage/réduction" + +#~ msgid "%s contains" +#~ msgstr "%s contient" + +#~ msgid "\t\t/* empty */" +#~ msgstr "\t\t/* epsilon */" + +#~ msgid "multiple %%header_extension declarations" +#~ msgstr "multiples déclarations %%header_extension" + +#~ msgid "multiple %%source_extension declarations" +#~ msgstr "multiples déclarations %%source_extension" + +#~ msgid "vcg graph: no such color." +#~ msgstr "graphe vcg: pas de telle couleur" + +#~ msgid "vcg graph: no such text mode" +#~ msgstr "graphe vcg: pas de tel mode texte" + +#~ msgid "vcg graph: no such shape" +#~ msgstr "graphe vcg: pas de telle forme" + +#~ msgid "vcg graph: no such decision" +#~ msgstr "graphe vcg: pas de telle décision" + +#~ msgid "vcg graph: no such an orientation" +#~ msgstr "graphe vcg: pas de telle orientation" + +#~ msgid "vcg graph: no such an alignement" +#~ msgstr "graphe vcg: pas de tel alignement" + +#~ msgid "vcg graph: no such an arrow mode" +#~ msgstr "graphe vcg: pas de tel mode de flèche" + +#~ msgid "vcg graph: no such crossing_type" +#~ msgstr "graphe vcg: pas de tel type de croisement (crossing_type)" + +#~ msgid "vcg graph: no such view" +#~ msgstr "graphe vcg: pas de tel vue" + +#~ msgid "vcg graph: no such linestyle" +#~ msgstr "graphe vcg: pas de tel style de ligne" + +#~ msgid "vcg graph: no such an arrowstyle" +#~ msgstr "graphe vcg: pas de tel style de flèche" + +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "\n" +#~ "DERIVES\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "\n" +#~ "DERIVES\n" +#~ "\n" + +#~ msgid "unterminated comment at end of file" +#~ msgstr "le commentaire ne se termine pas avant la fin du fichier" + +#~ msgid "unmatched close-brace (`}')" +#~ msgstr "accolade fermante `}' non appariée" + +#~ msgid "@%s is invalid" +#~ msgstr "@%s n'est pas valide" + +#~ msgid "unmatched right brace (`}')" +#~ msgstr "accolade fermante `}' non appariée" + +#~ msgid "ill-formed %type declaration" +#~ msgstr "déclaration %type mal formée" + +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "\n" +#~ "FIRSTS\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "\n" +#~ "FIRSTS\n" +#~ "\n" + +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "%s firsts\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "%s firsts\n" +#~ "\n" + +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "%s derives\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "%s derives\n" +#~ "\n" + +#~ msgid "" +#~ "Usage: %s [-dhklntvyV] [-b file-prefix] [-o outfile] [-p name-prefix]\n" +#~ " [--debug] [--defines] [--fixed-output-files] [--no-lines]\n" +#~ " [--verbose] [--version] [--help] [--yacc]\n" +#~ " [--no-parser] [--token-table]\n" +#~ " [--file-prefix=prefix] [--name-prefix=prefix]\n" +#~ " [--output=outfile] grammar-file\n" +#~ msgstr "" +#~ "Usage: %s [-dhklntvyV] [-b préfixe-de-fichier] [-o sortie] [-p préfixe-de-" +#~ "nom]\n" +#~ " [--debug] [--defines] [--fixed-output-files] [--no-lines]\n" +#~ " [--verbose] [--version] [--help] [--yacc]\n" +#~ " [--no-parser] [--token-table]\n" +#~ " [--file-prefix=préfixe] [--name-prefix=préfixe]\n" +#~ " [--output=outfile] grammaire\n" + +#~ msgid "gotos" +#~ msgstr "gotos" + +#~ msgid "\"%s\", line %d: %s\n" +#~ msgstr "\"%s\", ligne %d: %s\n" + +#~ msgid "(\"%s\", line %d) error: %s\n" +#~ msgstr "(\"%s\", ligne %d) erreur: %s\n" + +#~ msgid "limit of %d exceeded, too many %s" +#~ msgstr "limite de %d dépassée, trop de %s" + +#~ msgid "unterminated comment in `%{' definition" +#~ msgstr "le commentaire ne se termine pas dans la section de définition (%{)" + +#~ msgid "invalid @-construct" +#~ msgstr "la construction «@» n'est pas valide" diff --git a/src/apps/bin/bison/po/hr.gmo b/src/apps/bin/bison/po/hr.gmo new file mode 100644 index 0000000000000000000000000000000000000000..60a28cbf4da8c35240a5191bd82b37f6f13cc9c8 GIT binary patch literal 6661 zcmb7|%X1t@9mfaa1hPCr0wjSz=nxs(M59Q`!_L|cQDiw$EK4eBZIVz_xwX^Uot@e4 zWgcrwRos(92nPZMH#ktdsvsALt5Uh}2k@xkKotd-R7wXPIYClD;PdO5)x)vkWXjs_ zZ1=CbfA9XT|9s1V7XqFpf1ly+ukQYW!9`{%i14jK5mrTi`g~Z@(c3J`2u)2f;Qd~g13UA|2T+g!3uaU_$2rd@EK72^=OnGd>vHaO&<+{!{8(+{(cIS zxaHtCG2rXq`}zJ+l#ub8K{@9Rkf~q{lz83;DsUB?1q<+D@Fj2@{1+(aj^PBsSy248 z2Hpie3yK{-t;c@@il6@pir??NrNUWI&g<6r42YV+kH9JLC!py0C-52YHEwwiQg>*Q@&4v3VZ_mJebtqzX6IJKL=;P%b=Y1Z*T&-4~F22_4r>vQZIND#BA>)iMQx9dK52WgT#Y$^83r#a^8ddiTx4_RQEPY zzRI4IN^pQbdBmpc{9BdR@+x^wn)zNKK9fgs_5uG^#YJqEK7yP5Be9UYm50y;_xrc% zL-J63dz3%QZu_~1H?dtF@d+;SH7xO!ht%7CBxjG+-^5Q6Yf{YT^h5Qyw%4@MPFzR5W;#?if8^PF^a_j2C!TgZw>Ref;BGXQFW+E>c zj3N4t0?cP+YLqoYlPT7fZ4)(udYB#GHeTi?HMyK+3zPL@t5Xrb%5c7WTu!<2I|6xA z#c66fI#q5^#Mm5$>R=lUWX2A48e_rRX6lg(2iszLUoEc>H+anC$!-3(K)q9uTSHr6*x7%B#%}m>MY`kf< zT~;}$GW4qR-kt_E_t@e&wHD_Dpku7bbb%KJI?GL#t96&Dg_(tw!&668C)52t;}ebG zvFbILUsqbC&UQw=%)9R59v>=lvrks*!etxds^}W4;zEM4J=%~%m{1Y|!cO!Q`((vv zQ=R5+LaEibACutehS#bJ9?3I`xahUGlbQLrx)>K-pX0f@*fp7vLpGEi42;f#rGc0# zY1em=$(s$O!tOX;?V5C;{1e6bAk`ZzLtQ^CIl;>Qyi|AmsaPWR5IQOmc8%2LaQR3CzM^`?8(#f3v<;nrSgGk z$Lpe-Q6m9WI4MR^u8@V1St~oE1tW}YUSz&R{Mste-lJZ;6Wb0O$PE!at+-Zzcithu12kQZ}^-;e>Goh8Je51eS z(p>gP{T?n%V@opbej+F3K1x(|;cgM34^X@9A|4vQ+}6u$<94mzUMMFQVn|N6O*iDw zL{=3pF*fuwJIi9*PRq!U>(vB()ypX{lV-AF29mCLJC_)o;3f1G^+?B-6E5pKOm4R7 zmU*qjY)Q89Z#^@F)~y#8Y3j#S&Nm-yS7vSF1J-tf4Z@|`&PK7Ma!!@Be5SL0ajC(| zOxt4PI4!$S^mFUiot;~meSBuIHS_5F!hGu~MfshcZ!ONPuBy{ZD{4k9&#biOXU{Fn ztf=L4E9B;!=$~!Kb%T$j6b|{F`i`pFmFkF{vx#*VEz!&i(^n?TTo#w>)WCNxzr zx|7BfO{z3O-(da*{h+H$Y>fhHxrhhU2Ip3naaBD5JIWTZ+}B~$m=R{2PJvBal7kpvnmOLoZ1s+5L5*urxSh}K{QTE`d%xZ^oL+C4VgTa zH22olYk!qOUPsFQ}O`l^nT2 zdAZQrjB3P^{k|8Z{>3k*XCmt`Y0HYqo=5LUZ0c^|L$%K?6^p*+VKsk#w{q{O*V|Rv z>m;EiVh@(@aY<#IHCLJ6k2{koHFY*>Q}1EU6kTGtAB8&0yAEa&ezTRG?Nbx|3Ng^) z3Qk%*=?!Rg5{7YVN7TpSIZVt%H#N~?#m1ooWxzAMLG zoiLwSWlyg5VLal?{2HMhK|X9RPv``BEPPqZ7W?yMLM=b)ywSVKaw23|mR^G^`-Qpg z!_{HSaoexipDC9K`LRXI^}+;`-{N}I;2OdF=CEh-g2a#ulT0JKn7=wGA<~O;XJ;B6 zXo97?LBO|kLd#dhFpDIDPR*|_FU+*&&o8aE=J~G-;18patemdo74y=^KzJO9Lt zr_!Tj-!X~OL|7&z;O{y)!zf)i|{Yao<@9PCCN>EP7iubP)!*z?sbqvOa9@&0$ei#12^Z2NhbI*k(U(&a&0f%gkw, 2002. +# This file is distributed under the same license as the bison package. +# Denis Lackovic , 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: bison 1.34a\n" +"Report-Msgid-Bugs-To: bug-bison@gnu.org\n" +"POT-Creation-Date: 2004-05-21 10:26-0700\n" +"PO-Revision-Date: 2002-04-10 22:20+01\n" +"Last-Translator: Denis Lackovic \n" +"Language-Team: Croatian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-2\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n==1 ? 0 : 1);\n" + +#: src/complain.c:51 src/complain.c:66 +msgid "warning: " +msgstr "upozorenje:" + +#: src/complain.c:122 src/complain.c:138 +msgid "fatal error: " +msgstr "fatalna gre¹ka:" + +#: src/conflicts.c:76 +#, fuzzy, c-format +msgid " Conflict between rule %d and token %s resolved as shift" +msgstr "Konflikt u stanju %d izmeðu pravila %d i znaka %s razrije¹en kao %s.\n" + +#: src/conflicts.c:84 +#, fuzzy, c-format +msgid " Conflict between rule %d and token %s resolved as reduce" +msgstr "Konflikt u stanju %d izmeðu pravila %d i znaka %s razrije¹en kao %s.\n" + +#: src/conflicts.c:91 +#, fuzzy, c-format +msgid " Conflict between rule %d and token %s resolved as an error" +msgstr "Konflikt u stanju %d izmeðu pravila %d i znaka %s razrije¹en kao %s.\n" + +#: src/conflicts.c:399 +#, c-format +msgid "conflicts: %d shift/reduce, %d reduce/reduce\n" +msgstr "" + +#: src/conflicts.c:402 +#, fuzzy, c-format +msgid "conflicts: %d shift/reduce\n" +msgstr " %d pomakni/reduciraj" + +#: src/conflicts.c:404 +#, fuzzy, c-format +msgid "conflicts: %d reduce/reduce\n" +msgstr " %d reduviraj/reduciraj" + +#: src/conflicts.c:422 +#, fuzzy, c-format +msgid "State %d " +msgstr "stanje %d" + +#: src/conflicts.c:487 +#, c-format +msgid "%%expect-rr applies only to GLR parsers" +msgstr "" + +#: src/conflicts.c:511 +#, fuzzy, c-format +msgid "expected %d shift/reduce conflict" +msgid_plural "expected %d shift/reduce conflicts" +msgstr[0] "oèekujem %d pomakni/reduciraj konflikt\n" +msgstr[1] "oèekujem %d pomakni/reduciraj konflikata\n" + +#: src/conflicts.c:515 +#, fuzzy, c-format +msgid "expected %d reduce/reduce conflict" +msgid_plural "expected %d reduce/reduce conflicts" +msgstr[0] "%d reduciraj/reduciraj konflikt" +msgstr[1] "%d reduciraj/reduciraj konflikata" + +#: src/files.c:100 +#, c-format +msgid "cannot open file `%s'" +msgstr "ne mogu otvoriti datoteku `%s'" + +#: src/files.c:116 +#, fuzzy +msgid "I/O error" +msgstr "gre¹ka" + +#: src/files.c:119 +msgid "cannot close file" +msgstr "ne mogu zatvoriti datoteku" + +#: src/files.c:337 +#, fuzzy, c-format +msgid "conflicting outputs to file %s" +msgstr "konfliktne asocijativne vrijednosti za %s i %s" + +#: src/getargs.c:186 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "Poku¹aj `%s --help' za vi¹e informacija.\n" + +#: src/getargs.c:192 +msgid "GNU bison generates parsers for LALR(1) grammars.\n" +msgstr "GNU bison generira parsere za LALR(1) gramatike.\n" + +#: src/getargs.c:196 +#, c-format +msgid "Usage: %s [OPTION]... FILE\n" +msgstr "Kori¹tenje: %s [OPCIJA]... DATOTEKA\n" + +#: src/getargs.c:200 +msgid "" +"If a long option shows an argument as mandatory, then it is mandatory\n" +"for the equivalent short option also. Similarly for optional arguments.\n" +msgstr "" +"Ako duga opcija ka¾e da je argument obavezan, tada je on obavezan\n" +"i za ekvivalentnu kratku opciju. Slièno je i za opcionalne argumente.\n" + +#: src/getargs.c:206 +msgid "" +"Operation modes:\n" +" -h, --help display this help and exit\n" +" -V, --version output version information and exit\n" +" -y, --yacc emulate POSIX yacc\n" +msgstr "" +"Naèini rada:\n" +" -h, --help prika¾i ovu pomoæ i izaði\n" +" -V, --version prika¾i verziju i izaði\n" +" -y, --yacc emuliraj POSIX yacc\n" + +#: src/getargs.c:213 +msgid "" +"Parser:\n" +" -S, --skeleton=FILE specify the skeleton to use\n" +" -t, --debug instrument the parser for debugging\n" +" --locations enable locations computation\n" +" -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n" +" -l, --no-lines don't generate `#line' directives\n" +" -n, --no-parser generate the tables only\n" +" -k, --token-table include a table of token names\n" +msgstr "" +"Parser:\n" +" -S, --skeleton=DATOTEKA specificiraj kostur za uporabu\n" +" -t, --debug pripremi parser za deugiranje\n" +" --locations omoguæi izraèunavanje lokacija\n" +" -p, --name-prefix=PREFIKS stavi PREFIX ispred vanjskih simbola\n" +" -l, --no-lines ne eneriraj `#line' direktive\n" +" -n, --no-parser generiraj samo tablice\n" +" -k, --token-table ukljuèi tablicu imena znakova\n" + +#: src/getargs.c:225 +#, fuzzy +msgid "" +"Output:\n" +" -d, --defines also produce a header file\n" +" -r, --report=THINGS also produce details on the automaton\n" +" -v, --verbose same as `--report=state'\n" +" -b, --file-prefix=PREFIX specify a PREFIX for output files\n" +" -o, --output=FILE leave output to FILE\n" +" -g, --graph also produce a VCG description of the " +"automaton\n" +msgstr "" +"Izlaz:\n" +" -d, --defines takoðer proizvedi header datoteku\n" +" -v, --verbose takoðer proizvedi obja¹njenje automata\n" +" -b, --file-prefix=PREFIKS specificiraj PREFIKS za izlazne datoteke\n" +" -o, --output=DATOTEKA ispi¹i izlaz u DATOTEKU\n" +" -g, --graph takoðer proizvedi VCG opis automata\n" + +#: src/getargs.c:236 +msgid "" +"THINGS is a list of comma separated words that can include:\n" +" `state' describe the states\n" +" `itemset' complete the core item sets with their closure\n" +" `lookahead' explicitly associate lookaheads to items\n" +" `solved' describe shift/reduce conflicts solving\n" +" `all' include all the above information\n" +" `none' disable the report\n" +msgstr "" + +#: src/getargs.c:247 +msgid "Report bugs to .\n" +msgstr "Izvjesti o bugovima na .\n" + +#: src/getargs.c:264 +#, c-format +msgid "bison (GNU Bison) %s" +msgstr "bison (GNU Bison) %s" + +#: src/getargs.c:266 +msgid "Written by Robert Corbett and Richard Stallman.\n" +msgstr "" + +#: src/getargs.c:270 +#, fuzzy, c-format +msgid "Copyright (C) %d Free Software Foundation, Inc.\n" +msgstr "" +"Copyright 1984, 1986, 1989, 1992, 2000, 2001, 2002\n" +"Free Software Foundation, Inc.\n" + +#: src/getargs.c:272 +msgid "" +"This is free software; see the source for copying conditions. There is NO\n" +"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +msgstr "" +"Ovo je slobodni softver; pogledajte kod kako biste doznali uvjete " +"kopiranja. NEMA\n" +"garancije; èak ni tvrdnje o ISPLATIVOSTI ili POGODNOSTI ZA NEKU SVRHU.\n" + +#: src/getargs.c:438 +#, c-format +msgid "missing operand after `%s'" +msgstr "" + +#: src/getargs.c:440 +#, c-format +msgid "extra operand `%s'" +msgstr "" + +#: src/gram.c:139 +msgid "empty" +msgstr "prazno" + +#: src/gram.c:233 +msgid "Grammar" +msgstr "Gramatika" + +#: src/gram.c:321 src/reduce.c:394 +#, fuzzy +msgid "warning" +msgstr "upozorenje:" + +#: src/main.c:124 +msgid "rule never reduced because of conflicts" +msgstr "" + +#: src/parse-gram.y:363 +msgid "POSIX forbids declarations in the grammar" +msgstr "" + +#: src/parse-gram.y:486 +msgid "missing identifier in parameter declaration" +msgstr "" + +#: src/print.c:49 +#, c-format +msgid " type %d is %s\n" +msgstr " tip %d je %s\n" + +#: src/print.c:165 +#, fuzzy, c-format +msgid "shift, and go to state %d\n" +msgstr " %-4s\tpomakni i idi u stanje %d\n" + +#: src/print.c:167 +#, fuzzy, c-format +msgid "go to state %d\n" +msgstr " $ \tidu u stanje %d\n" + +#: src/print.c:204 +#, fuzzy +msgid "error (nonassociative)\n" +msgstr "%-4s\tgre¹ka (nonassociative)" + +#: src/print.c:292 +#, fuzzy, c-format +msgid "reduce using rule %d (%s)" +msgstr "$default\treduciraj koristeæi pravilo %d (%s)" + +#: src/print.c:294 +#, c-format +msgid "accept" +msgstr "" + +#: src/print.c:325 src/print.c:391 +msgid "$default" +msgstr "" + +#: src/print.c:420 +#, c-format +msgid "state %d" +msgstr "stanje %d" + +#: src/print.c:456 +msgid "Terminals, with rules where they appear" +msgstr "Zavr¹ni znakovi, sa pravilima gdje se pojavljuju" + +#: src/print.c:483 +msgid "Nonterminals, with rules where they appear" +msgstr "Nezavr¹ni znakovi, sa pravilima gdje se pojavljuju" + +#: src/print.c:512 +#, c-format +msgid " on left:" +msgstr "s lijeva:" + +#: src/print.c:527 +#, c-format +msgid " on right:" +msgstr "s desna:" + +#: src/print.c:555 +#, fuzzy +msgid "Rules never reduced" +msgstr "%d pravilo nije nikad reducirano\n" + +#: src/reader.c:56 +#, c-format +msgid "multiple %s declarations" +msgstr "vi¹estruke %s deklaracije" + +#: src/reader.c:118 +#, c-format +msgid "result type clash on merge function %s: <%s> != <%s>" +msgstr "" + +#: src/reader.c:216 +#, c-format +msgid "rule given for %s, which is a token" +msgstr "pravilo dato za %s, a to je znak" + +#: src/reader.c:245 +#, fuzzy, c-format +msgid "type clash on default action: <%s> != <%s>" +msgstr "sudar tipova (`%s' `%s') na deaultnoj akciji" + +#: src/reader.c:251 +msgid "empty rule for typed nonterminal, and no action" +msgstr "prazno pravilo za nezavr¹ni znak, i nema akcije" + +#: src/reader.c:321 src/reader.c:335 src/reader.c:348 +#, c-format +msgid "only one %s allowed per rule" +msgstr "" + +#: src/reader.c:331 src/reader.c:346 +#, c-format +msgid "%s affects only GLR parsers" +msgstr "" + +#: src/reader.c:333 +#, c-format +msgid "%s must be followed by positive number" +msgstr "" + +#: src/reader.c:490 +msgid "no rules in the input grammar" +msgstr "nema pravila u ulaznoj gramatici" + +#: src/reduce.c:242 +#, fuzzy +msgid "useless rule" +msgstr "%d beskorisno pravilo" + +#: src/reduce.c:303 +#, fuzzy, c-format +msgid "useless nonterminal: %s" +msgstr "Beskorisni nezavr¹ni znakovi:" + +#: src/reduce.c:351 +#, fuzzy +msgid "Useless nonterminals" +msgstr "Beskorisni nezavr¹ni znakovi:" + +#: src/reduce.c:364 +#, fuzzy +msgid "Terminals which are not used" +msgstr "Zavr¹ni znakovi koji nisu kori¹teni:" + +#: src/reduce.c:373 +#, fuzzy +msgid "Useless rules" +msgstr "Beskorisna pravila:" + +#: src/reduce.c:389 +#, c-format +msgid "%d rule never reduced\n" +msgid_plural "%d rules never reduced\n" +msgstr[0] "%d pravilo nije nikad reducirano\n" +msgstr[1] "%d pravila nisu nikad reducirana\n" + +#: src/reduce.c:397 +#, c-format +msgid "%d useless nonterminal" +msgid_plural "%d useless nonterminals" +msgstr[0] "%d beskorisan nezavr¹ni znak" +msgstr[1] "%d beskorisnih nezavr¹nih znakova" + +#: src/reduce.c:403 +#, c-format +msgid " and " +msgstr " i" + +#: src/reduce.c:406 +#, c-format +msgid "%d useless rule" +msgid_plural "%d useless rules" +msgstr[0] "%d beskorisno pravilo" +msgstr[1] "%d beskorisnih pravila" + +#: src/reduce.c:436 +#, fuzzy, c-format +msgid "start symbol %s does not derive any sentence" +msgstr "Poèetni simbol %s ne daje niti jednu reèenicu" + +#: src/scan-gram.l:162 +msgid "stray `,' treated as white space" +msgstr "" + +#: src/scan-gram.l:225 +#, fuzzy, c-format +msgid "invalid directive: %s" +msgstr "nedozvoljeni ulaz: %s" + +#: src/scan-gram.l:283 +#, fuzzy, c-format +msgid "invalid character: %s" +msgstr "nepoznati znak: %s" + +#: src/scan-gram.l:402 +#, fuzzy +msgid "invalid null character" +msgstr "nedozvoljena %s deklaracija" + +#: src/scan-gram.l:415 src/scan-gram.l:427 src/scan-gram.l:448 +#, fuzzy, c-format +msgid "invalid escape sequence: %s" +msgstr "nedozvoljeni ulaz: %s" + +#: src/scan-gram.l:417 src/scan-gram.l:429 src/scan-gram.l:450 +#, fuzzy, c-format +msgid "invalid null character: %s" +msgstr "nedozvoljeni ulaz: %s" + +#: src/scan-gram.l:455 +#, fuzzy, c-format +msgid "unrecognized escape sequence: %s" +msgstr "neprepoznati: %s" + +#: src/scan-gram.l:537 +#, c-format +msgid "missing `{' in `%s'" +msgstr "" + +#: src/scan-gram.l:782 +#, c-format +msgid "$$ of `%s' has no declared type" +msgstr "$$ od `%s' nema deklarirani tip" + +#: src/scan-gram.l:803 +#, c-format +msgid "$%d of `%s' has no declared type" +msgstr "$%d od `%s' nema deklarirani tip" + +#: src/scan-gram.l:812 src/scan-gram.l:881 src/scan-gram.l:932 +#, c-format +msgid "integer out of range: %s" +msgstr "" + +#: src/scan-gram.l:848 src/scan-gram.l:916 +#, fuzzy, c-format +msgid "invalid value: %s" +msgstr "nedozvoljena $ vrijednost" + +#: src/scan-gram.l:1036 +#, fuzzy, c-format +msgid "missing `%s' at end of file" +msgstr "nezavr¹eni znakovni niz na kraju datoteke" + +#: src/scan-gram.l:1047 +#, fuzzy, c-format +msgid "missing `%s' at end of line" +msgstr "nezavr¹eni znakovni niz na kraju datoteke" + +#: src/symlist.c:97 src/symlist.c:108 +msgid "invalid $ value" +msgstr "nedozvoljena $ vrijednost" + +#: src/symtab.c:85 +#, c-format +msgid "type redeclaration for %s" +msgstr "ponovna deklaracija za %s" + +#: src/symtab.c:102 src/symtab.c:120 +#, fuzzy, c-format +msgid "%s redeclaration for %s" +msgstr "ponovna deklaracija za %s" + +#: src/symtab.c:139 +#, c-format +msgid "redefining precedence of %s" +msgstr "ponovno definiran prethodnik od %s" + +#: src/symtab.c:157 +#, c-format +msgid "symbol %s redefined" +msgstr "simbol %s ponovo definiran" + +#: src/symtab.c:180 +#, fuzzy, c-format +msgid "redefining user token number of %s" +msgstr "ponovno definiran prethodnik od %s" + +#: src/symtab.c:207 +#, c-format +msgid "symbol %s is used, but is not defined as a token and has no rules" +msgstr "simbol %s je kori¹ten, ali nije definiran kao znak i nema pravila" + +#: src/symtab.c:232 +#, c-format +msgid "symbol `%s' used more than once as a literal string" +msgstr "simbol `%s' kori¹ten vi¹e puta kao znakovni niz" + +#: src/symtab.c:235 +#, c-format +msgid "symbol `%s' given more than one literal string" +msgstr "simbolz `%s' dat vi¹e od jednog znakovnog niza" + +#: src/symtab.c:271 +#, c-format +msgid "conflicting precedences for %s and %s" +msgstr "konflikt u prethodnici za %s and %s" + +#: src/symtab.c:283 +#, fuzzy, c-format +msgid "conflicting associativities for %s (%s) and %s (%s)" +msgstr "konfliktne asocijativne vrijednosti za %s i %s" + +#: src/symtab.c:368 +#, c-format +msgid "tokens %s and %s both assigned number %d" +msgstr "objema znakovima %s i %s je pridru¾en broj %d" + +#: src/symtab.c:591 +#, c-format +msgid "the start symbol %s is undefined" +msgstr "poèetni simbol %s nije definiran" + +#: src/symtab.c:595 +#, c-format +msgid "the start symbol %s is a token" +msgstr "poèetni simbol %s je znak" + +#: lib/argmatch.c:133 +#, fuzzy, c-format +msgid "invalid argument %s for %s" +msgstr "nedozvoljeni ulaz: %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "" + +#: lib/bitset_stats.c:179 +#, c-format +msgid "%u bitset_allocs, %u freed (%.2f%%).\n" +msgstr "" + +#: lib/bitset_stats.c:182 +#, c-format +msgid "%u bitset_sets, %u cached (%.2f%%)\n" +msgstr "" + +#: lib/bitset_stats.c:185 +#, c-format +msgid "%u bitset_resets, %u cached (%.2f%%)\n" +msgstr "" + +#: lib/bitset_stats.c:188 +#, c-format +msgid "%u bitset_tests, %u cached (%.2f%%)\n" +msgstr "" + +#: lib/bitset_stats.c:192 +#, c-format +msgid "%u bitset_lists\n" +msgstr "" + +#: lib/bitset_stats.c:194 +msgid "count log histogram\n" +msgstr "" + +#: lib/bitset_stats.c:197 +msgid "size log histogram\n" +msgstr "" + +#: lib/bitset_stats.c:200 +msgid "density histogram\n" +msgstr "" + +#: lib/bitset_stats.c:214 +#, c-format +msgid "" +"Bitset statistics:\n" +"\n" +msgstr "" + +#: lib/bitset_stats.c:217 +#, c-format +msgid "Accumulated runs = %u\n" +msgstr "" + +#: lib/bitset_stats.c:261 lib/bitset_stats.c:266 +msgid "Could not read stats file." +msgstr "" + +#: lib/bitset_stats.c:263 +#, c-format +msgid "Bad stats file size.\n" +msgstr "" + +#: lib/bitset_stats.c:289 lib/bitset_stats.c:291 +msgid "Could not write stats file." +msgstr "" + +#: lib/bitset_stats.c:294 +msgid "Could not open stats file for writing." +msgstr "" + +#: lib/error.c:127 +msgid "Unknown system error" +msgstr "Nepoznata sistemska gre¹ka" + +#: lib/getopt.c:570 lib/getopt.c:589 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: opcija `%s' je nejednoznaèna\n" + +#: lib/getopt.c:622 lib/getopt.c:626 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: opcija `--%s' ne dopu¹ta argument\n" + +#: lib/getopt.c:635 lib/getopt.c:640 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: opcija `%c%s' ne dopu¹ta argument\n" + +#: lib/getopt.c:686 lib/getopt.c:708 lib/getopt.c:1039 lib/getopt.c:1061 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: opcija `%s' zahtijeva argument\n" + +#: lib/getopt.c:746 lib/getopt.c:749 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: neprepoznata opcija `--%s'\n" + +#: lib/getopt.c:757 lib/getopt.c:760 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: neprepoznata opcija `%c%s'\n" + +#: lib/getopt.c:815 lib/getopt.c:818 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: nedozvoljena opcija -- %c\n" + +#: lib/getopt.c:824 lib/getopt.c:827 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: nedozvoljena opcija -- %c\n" + +#: lib/getopt.c:882 lib/getopt.c:901 lib/getopt.c:1114 lib/getopt.c:1135 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: opcija zahtijeva argument -- %c\n" + +#: lib/getopt.c:954 lib/getopt.c:973 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: opcija `-W %s' je nejednoznaèna\n" + +#: lib/getopt.c:997 lib/getopt.c:1018 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: opcija `-W %s' ne dopu¹ta argument\n" + +#: lib/obstack.c:417 lib/obstack.c:420 lib/xmalloc.c:53 +msgid "memory exhausted" +msgstr "iscrpljeni memorijski resursi" + +#: lib/quotearg.c:238 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:239 +msgid "'" +msgstr "'" + +#: lib/subpipe.c:171 +#, c-format +msgid "subsidiary program `%s' could not be invoked" +msgstr "" + +#: lib/subpipe.c:173 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "" + +#: lib/subpipe.c:175 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "" + +#: lib/subpipe.c:176 +#, c-format +msgid "subsidiary program `%s' failed (exit status %d)" +msgstr "" + +#: lib/timevar.c:475 +msgid "" +"\n" +"Execution times (seconds)\n" +msgstr "" + +#: lib/timevar.c:525 +msgid " TOTAL :" +msgstr "" + +#: lib/timevar.c:561 +#, c-format +msgid "time in %s: %ld.%06ld (%ld%%)\n" +msgstr "" + +#~ msgid "too many states (max %d)" +#~ msgstr "previ¹e stanja (maks %d)" + +#~ msgid "reduce" +#~ msgstr "reduciraj" + +#~ msgid "shift" +#~ msgstr "pomakni" + +#~ msgid "%d shift/reduce conflict" +#~ msgid_plural "%d shift/reduce conflicts" +#~ msgstr[0] "%d pomakni/reduciraj konflikat" +#~ msgstr[1] "%d pomakni/reduciraj konflikata" + +#~ msgid "and" +#~ msgstr "i" + +#~ msgid "State %d contains " +#~ msgstr "Stanje %d sadr¾i" + +#~ msgid "conflicts: " +#~ msgstr "konflikt:" + +#~ msgid "%s contains " +#~ msgstr "%s sadr¾i" + +#~ msgid " %-4s\t[reduce using rule %d (%s)]\n" +#~ msgstr " %-4s\t[reduciraj koristeæi pravilo %d (%s)]\n" + +#~ msgid "" +#~ " $default\treduce using rule %d (%s)\n" +#~ "\n" +#~ msgstr "" +#~ " $default\treduciraj koristeæi pravilo %d (%s)\n" +#~ "\n" + +#~ msgid " %-4s\treduce using rule %d (%s)\n" +#~ msgstr " %-4s\treduciraj koristeæi pravilo %d (%s)\n" + +#~ msgid " $default\treduce using rule %d (%s)\n" +#~ msgstr " $default\treduciraj koristeæi pravilo %d (%s)\n" + +#~ msgid "`%s' is no longer supported" +#~ msgstr "`%s' vi¹e nije podr¾ano" + +#~ msgid "%s: no grammar file given\n" +#~ msgstr "%s: nije data datoteka sa gramatikom\n" + +#~ msgid "%s: extra arguments ignored after `%s'\n" +#~ msgstr "%s: dodatni argumenti se ignoriraju nakon `%s'\n" + +#~ msgid "too many gotos (max %d)" +#~ msgstr "previ¹e goto-a (maksimalno %d)" + +#~ msgid "unexpected `/' found and ignored" +#~ msgstr "neoèekivan `/' naðen i zanemaren" + +#~ msgid "unterminated comment" +#~ msgstr "nezavr¹eni komentar" + +#~ msgid "unexpected end of file" +#~ msgstr "neoèekivan kraj datoteke" + +#~ msgid "unescaped newline in constant" +#~ msgstr "neoèekivan znak za novu liniju u konstanti" + +#~ msgid "octal value outside range 0...255: `\\%o'" +#~ msgstr "oktalna vrijednost izvan dosega 0...255: `\\%o'" + +#~ msgid "hexadecimal value above 255: `\\x%x'" +#~ msgstr "heksadecimalna vrijednost vi¹a od 255: `\\x%x'" + +#~ msgid "unknown escape sequence: `\\' followed by `%s'" +#~ msgstr "nepoznata escape sekvenca: `\\' koju slijedi `%s'" + +#~ msgid "unterminated type name at end of file" +#~ msgstr "nezavr¹eno ime tipa pri kraju datoteke" + +#~ msgid "unterminated type name" +#~ msgstr "nezavr¹eno ime tipa" + +#~ msgid "use \"...\" for multi-character literal tokens" +#~ msgstr "koristi \"...\" za vi¹ebajtne znakove" + +#~ msgid "`%s' supports no argument: %s" +#~ msgstr "`%s' ne podr¾ava argument: %s" + +#~ msgid "`%s' requires an argument" +#~ msgstr "`%s' zahtijeva argument" + +#~ msgid "maximum table size (%d) exceeded" +#~ msgstr "maksimalna velièina tablice (%d) prekoraèena" + +#~ msgid " (rule %d)" +#~ msgstr " (pravilo %d)" + +#~ msgid " $default\taccept\n" +#~ msgstr " $default\tprihvati\n" + +#~ msgid " NO ACTIONS\n" +#~ msgstr " NEMA AKCIJA\n" + +#~ msgid " %-4s\terror (nonassociative)\n" +#~ msgstr " %-4s\tgre¹ka (nonassociative)\n" + +#~ msgid " %-4s\tgo to state %d\n" +#~ msgstr " %-4s\tidu u stanje %d\n" + +#~ msgid "Number, Line, Rule" +#~ msgstr "Broj, Linija, Pravilo" + +#~ msgid " %3d %3d %s ->" +#~ msgstr " %3d %3d %s ->" + +#~ msgid " Skipping to next \\n" +#~ msgstr " Preskaèem na slijedeæe \\n" + +#~ msgid " Skipping to next %c" +#~ msgstr " Preskaèem na slijedeæi %c" + +#~ msgid "unterminated string" +#~ msgstr "nezavr¹eni znakovni niz" + +#~ msgid "invalid @ value" +#~ msgstr "nedozvoljena @ vrijednost" + +#~ msgid "%s is invalid" +#~ msgstr "%s je nedozvoljeno" + +#~ msgid "unterminated `%{' definition" +#~ msgstr "nezavr¹ena `%{' definicija" + +#~ msgid "Premature EOF after %s" +#~ msgstr "Preuranjeni EOF nakon %s" + +#~ msgid "`%s' is invalid in %s" +#~ msgstr "`%s' je nedozvoljen u %s" + +#~ msgid "%type declaration has no " +#~ msgstr "%type deklaracija nema " + +#~ msgid "invalid %%type declaration due to item: %s" +#~ msgstr "nedozvoljena %%type deklaracija zbog: %s" + +#~ msgid "invalid text (%s) - number should be after identifier" +#~ msgstr "nedozvoljeno tekst (%s) - broj bi trebao biti nakon identifikatora" + +#~ msgid "unexpected item: %s" +#~ msgstr "neoèekivani: %s" + +#~ msgid "unmatched %s" +#~ msgstr "nije pronaðen %s" + +#~ msgid "argument of %%expect is not an integer" +#~ msgstr "argument od %%expect nije cijeli broj" + +#~ msgid "unrecognized item %s, expected an identifier" +#~ msgstr "neprepoznati %s, oèekivan nakon identifikatora" + +#~ msgid "expected string constant instead of %s" +#~ msgstr "oèekivana znakovna konstana umjesto %s" + +#~ msgid "no input grammar" +#~ msgstr "nema ulazne gramatike" + +#~ msgid "unterminated %guard clause" +#~ msgstr "nezavr¹ena %guard klauzula" + +#~ msgid "ill-formed rule: initial symbol not followed by colon" +#~ msgstr "lo¹e pravilo: zarez ne bi trebao slijediti poèetni simbol" + +#~ msgid "grammar starts with vertical bar" +#~ msgstr "gramatika poèinje sa okomitom crtom" + +#~ msgid "previous rule lacks an ending `;'" +#~ msgstr "prethodnom pravilu nedostaje zavr¹etak `;'" + +#~ msgid "two @prec's in a row" +#~ msgstr "dva @prec's u retku" + +#~ msgid "%%guard present but %%semantic_parser not specified" +#~ msgstr "%%guard prisutan ali %%semantic_parser nije specificiran" + +#~ msgid "two actions at end of one rule" +#~ msgstr "dvije akcije pri kraju jednog pravila" + +#~ msgid "too many symbols (tokens plus nonterminals); maximum %d" +#~ msgstr "previ¹e simbola (znakovi plus nezavr¹ni znakovi); maksimalno %d" diff --git a/src/apps/bin/bison/po/id.gmo b/src/apps/bin/bison/po/id.gmo new file mode 100644 index 0000000000000000000000000000000000000000..bc0b049e520001ed89ec21905b2911877530ceff GIT binary patch literal 14428 zcmdU#dyHIHeaBBqLSUeUgb*l&_Jnw`4W9MdArIDZ$lCE^6Teum6CgnL?#!Lpo0++H zxDT&4K%r?=2@nEQAp}Si%3md|C~ZZhs!}PHs47HNwJHR)LRFhTN*~aNgo@g#{d~_k zcV6ptobXS3<+I_zLhe_|sq<@crOEzJCgQ4fu6%4tzSiZ~T-oO}^g=S}+E+-YVY&G#$kyi1!uRii{4+n|kLbFIO@*%qwg0{R5#8?q zVZBMi`}c$5>u10>fL{W&&R>CA|A(OT?Ij#W=V|hXSLS~3wO|M22YC3t+$Isw9lJC>G63`cJTqwf*%a;zX*zt-v-5xAA+}lujAzscoNh)9|GsW&w}Fr zH$ncHYfyFzT2SAYz&+p^D1G}ND0+VfwBVnD;`a|gOwnA=OX=%PptEoA$!pjj6hHp_ z7H9zf5j+OI5hh4ZkAdp{15omO3e^1Xg7Oc44~p)82W1!6!z9ta2#OC0cofXRH-TRP zb^d<=EodG>#u^Gl%Uj{`md ziVt4^uLr*cO25Agegym{Q0IRP;e8JLA}Igx0M3D>%^xAmFY)~!K%Mi`97cTjIw-zB z4QBLzKfHez%;uwcFZfCD*Fdem#2?Z1ZqR}s1En8d21U;|K-tlEK%M6YAj=xdm*<18 z1;x+3pzQiSP<(hBD0*^G^nDD}y1x(J0)7j`G|Yd1n*Z_xULO`f?e_?%^(s*NdqvJ-vF1vr$O<19%kME9syqru7cVx0@eQ>(1ITYHUBpQ{s|~L{}$A~QXS+d`g|Ro z+UGSOqBpmJvWtg7$-51Tj~@oL|L=kv-TVb8{k)Dv9|Ye3>O7BwENwmqE`fguVtVEk zcY0h5_)buM;RB%7e-hNWzYXFN%)f$K?}od)JobaK=lekM=`1LHI7`!`vAlAR_#+zi zyxD{MtM&C9^hpgl;_bBv}l>-i~~_$%4y zc^mD1nq)KiyeE7)35pMr;frW5r=jZRFip?5+cq?vvMrm+-kq8`7ksdKPI9 z&}1Ws-uxnMlcopNG?w;WT1D&9>gN(4uBF{X!!*r1Y0?Yn!a7Zl^ynb%?X(SAK|4ju zXnI~rJK;VV^HxxLqUSMMoAxN}X4=bWub^F|JxsfS_AZ(p>HL6pj&_Ll6SVq~KhSd> zO}2H0wneKS>F4?IMLw)gyO(yF_ClJT_tS2n$@d(mT~BjQ^BKWUYAJuWxnIJJ4zkL_IBMrqrYS&uh!h0Wt4>tBp{ThL+SJkRpy zI6aTsRV#julZ%a{QyRN^c6I5LsGoWkjU(Dv&f1SVCExj!C*2KwEVqX4TuH%!8fMon zn|18kT(R43aHur1?YPyCpw5jnyI{eU2eji(RP{^4K*zH*z8L3lO2=zA>enp2?R{0m z{kYJkX&L8(B#rtSewo+B>n+3xs})09q@!zA7>+N9r)yHVd}L)X)6+PM~oQ%`y^ z>L+k%TTghiHrEn++gV(syGt910BKK@cdJ31mVTMhV1^=_Xt17itE@sq+GMgfkKbJ- zXyVRmG@H+2!{$Sr@v6xSqj#k6a>UsQZdGZH-F4ICF=Q}0l^Em?df9$=9{MZ0o|Hvg zJ|Z5rihY(hojhixJ#+I1J9Be;=O;(?lcE&=M$=$gT>5FPsI@UMZ*tVtj45N5cKdHz zXt!BvwW>kYk4iSktF*9(A+%wRL~UD?5enK#@GS)_fZQYQM6LsJlUA|VXqcnfaLXC2 z-E(xWoon0UoYJ1pI^`y&X^&@B+IA|s&n~AeRymqg{WgYF!c$z;#5U65%^W>XyYmyn z@_34x$u5nCyb-1I=ERu`aK6BcbmKJ6IapEK76z5uQ%k2-_8i!2yLmJiU~>?3!hbZ& z`_Be9x!kdl?PqDX7JIRgZB8k%yy^gd8Mzr!ftNF@R&`uY&0CkQEtu- zb!f$oLDr6ukhRT?eW>+D+#h=1+fIsMKiXm%3)Zhm-7`Iqx4QsQi99E^R zUnD6+4*Uj_v*1CqxfQiqev8=als$L${PJ6^-Z#uyw~`~MtxQvp%oU7x1RFxSdXQ`IB7>>7|6>&Y; zV-XG5vaoBTEu>fRZp~WPEK$)M=8%2q@VS*^$2pm`#V~Fq9oTQfDaxidSG&yS@mj0S2NJj;l_BZ|1@>d$Ub=V1Yxjf<%w4+0-$tmd}iZi z09orvy9goE39uj@xWT~|%sCf>oP^G6|Ds3GgKtwb*9X=v^#HOCg+dWtYGONHue!5@ zCuvdUE{eEKeZX@%?}m4=dKS>rY~nHliT;iI8>i7a&S>1%$_D7B8>p>^+B!vw+k}MB za5e2(L{RJO@)Dt(KyHhz!FtwrlIpuPvSxpqYPK^)#M-IYwOciWSVVYhDKfk1X_y`k zH$nVpqINEI5Fh+Scu%uj;?{IM<7r9S>Q`-9g71)YU4o}$5-(PqEm*i+NCtQFq3OKe zz1_5$&+_g)c#jp5keQsuoR@0LTbp1Ifjc2n^}(Plp9fLTVw-) zDk;jEw~?A+uZiR?PCK-R*s_L`9uTT_`(Y9rdgTYTG8~xt*^Y4Id>fOK+_w5zQRPyq zwSJcMBKZQhLVRgR`kRz^%%~``R-&VfhB!vJ4IOzd2M!wtLxDV(lz6(_vQYM9lKI?8b;tqpuU2_1nD z+i8zGpTWbg%5C#c*#s2(IC}{81+HgRj_;HkY7v?_jtjx3*AUVWQospHG5XO5jeZ;zi{u}k*c(#q=c(F>=R zR_wV8D>#^AsM%`1rQ{q{R!rILRvI|zj$;PHE~LFQ+a&I96_UEYms}{KZoEixXCFR$ zZgu(WnRm|5&wFQRE^JS|i_uFZ*oAq}WwoP-DZVb6hsX^|PDJ*+l94l)T%2;QOr*8A zf))55ImHJ32FSAlbmebF=79}k+1(t?^ATBRklds~zu-r24 zufK`u@Vf3PF&y2n_BlRq&x`P|S!$fF*gcFG^DgF6j6=W&GZ%s;skb$6o_R#UkTQ>y zl422UFRf05a(E40w5Chc$Xu=|$JsCmbarDhHqs+}CeyqM)8TJfyDV76qwlqTPAF47 zRJzC^<6Jf{nlOqjQ*R0O5%=PPv{I6u>T?^qH-i}4+ajymh`3JTUIs}~NJrLmgTj$3 z9zwQL)=}SkxX`8k@b$X{@s&v@;iPmaA`I}|`D7w7TD#_6)X@m-WJmXkc|1hf zW#!l*8l*SQ)VOp(uCF^#StvG?LJs1*i&0mpQ$qGww0F-H_t;wwJ2Y;EE*XG#o^#63 zop*O3)$Q-cOjQ-^dfY-XS<52$;?{in;uy@m-MMm-W)%yf zbPGK}PtgqKyk=1&Uw37(^Ar+TMyw4oWH7dcOg62N)blPgy&bM$U%xM<+E zEuWRxgpTac&5_+jsclpYl(k3$=lbpWxrIBpNblhz)r5v|nx;xw9X-}F?umHHq?oIAVPJSz1j za5V2j%NOmzg@rdZ7jADJJYWwjEFQe0xp3#g0t1^X@x?^f-SN2FnhOW$wg+xoJb3$w z)2nZALr+CT*<8iZ7Zgk~eD!MFPV7l+ZHp|5^c!1B9@)6JJGeBT#^pVYQ^bUd%%-^- zM}tM`A6z2hB0)*+#s=Lo+P0*(nY8b9MWFe@C2+908~asGFP}a(X2yZ}g~n0E$P`+L zn2WX~bnWLxpQMMZ0tt!q;R~zBn|F=JX|qn8H;<*QtPR5#?Ol|o8t3{II^8_Zl^&f+ zhwf`}_`o6SKOSB<)Oc(2gfFD%zz-aW*5kfin19p!9SzfXDC(7!jeAAh!<*VYT)dNB zs8T=RoLUcM#7RX&9JWGt+qMmOudI-eI5mlq9&d|yJ?ch@?ZrjZkFY$WWctTg$mcmf z?kdhHU!j7n0~t8jZ6C{MhnDU){8Bf?MtN_vSO zjxKePY2J=|GP)vhh3zZPnI0ZY+ANKD?)M>prclvNdXhyqX< zk}GxwiEo><(|fc5k#9v}2eb1IjwI-_exLl$fDWjYF@#l4!dl;pU%BAu9(H0jf*-bE* zk;AWR=E*+F=gdrS0%UCpvWb1P>P8K3%|VM)%Zq!|GESmp&RtTwjRG&~wX>l@delb_ zXC|+dTxYr>!TUx^5T3Dl%)SGX{HkwGQ#rS;kX|I0E1;LrV3_oEkaeP41#%g2agBm$ z73CCzX3OZ~DWPbD_PCn*%(TnZ(F+$GpLHo+d{f@*DRnC2%jqI-=SuqYG(~huUL+e5 zVRp5JbXPp2^B}QYU{)I^uMn0xRbwL*O1*$wIX4&J}g^c|CIRE64~o!*?R1(m|XgmZueVuBXc< zu<=MiRqTM8i*;pPvv)41kEZ#Qf$Dhd_S?CXPBFkcA2-%gK&Pm#;y}ZkiugrITo@&u zeA=Oy9&#!lUS|`k?Pc|l__e8sL^)|;8ARMphSY~01AF{9rLZ!HimG>+nmT^7+ZDSV ziS8B;Z)R%h{JMzx3=@iM{3b&3>1*oLsBlc)iS4D1-~2O{e8U{ zbtIF9W9}yeQq76tdYQmjr?(Ov$~vl^dkga78JW*?OdF!>GdU zO?}L+e!QM+*go;LDhYezkX(?3P;0Nb;?gs7PI`r^a8a==y1no|5jLk&|C#FhlK;;k zs&?{!OT5NEr}8^SkPISIM{tPp3F$bOzijb694lljLCxZFEWmg$0vb;QM+T{0=HjGvVbL1$v)rIEGBr=KZ>oknbPo zCZm$Qsd*X}qfSI7v*CF=9#2$e6;yk?WYCnUEC)AD!QS}zTQEY5bm>bw8C{T7viFlE zbyvtFe)v#JMC+4r$bK*%6)tDT@c)uvM4G{&P%)x-=zfF?+HXUORA=*OoU7xzvWrU* z>^iAyp7qF%I21+vE@8!2^tToA>r*CFI2?_&D(v&;Vp=tHQHMg6?)|>DAEtS3&1M9I z{G7}1NcWwMdz+fl-O8P4)_Oxm6>W0Q8L6q#PxQhu5f1V{TTE>Oe5gzNl<$=`3`cjY z$pU{})%Ue~Sh^;~^C$2(P4W}XPx?4G{|mtM*e->-EB5i9RxwP9H9bl$jCKBC?+&Yl zot13hqf-;k&5=hTe4jEl-M{^H7|qu&Kwg*Xx}mQsj{Oz3kafu zzYj=_LSW;^8?LUt-WJ&8t{~L)g3&m~PXW`}jvPNOwO7sjL@-%%b9Pr-jk%mV45c6M emB-ieAl6V?biGq%6*>&&MfF, 2002, 2003 +# +msgid "" +msgstr "" +"Project-Id-Version: bison 1.875\n" +"Report-Msgid-Bugs-To: bug-bison@gnu.org\n" +"POT-Creation-Date: 2004-05-21 10:26-0700\n" +"PO-Revision-Date: 2003-01-07 13:25GMT+0700\n" +"Last-Translator: Tedi Heriyanto \n" +"Language-Team: Indonesian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: KBabel 0.9.6\n" + +#: src/complain.c:51 src/complain.c:66 +msgid "warning: " +msgstr "peringatan: " + +#: src/complain.c:122 src/complain.c:138 +msgid "fatal error: " +msgstr "kesalahan fatal: " + +#: src/conflicts.c:76 +#, c-format +msgid " Conflict between rule %d and token %s resolved as shift" +msgstr " Konflik antara aturan %d dan token %s diselesaikan sebagai shift" + +#: src/conflicts.c:84 +#, c-format +msgid " Conflict between rule %d and token %s resolved as reduce" +msgstr " Konflik antara aturan %d dan token %s diselesaikan sebagai reduce" + +#: src/conflicts.c:91 +#, c-format +msgid " Conflict between rule %d and token %s resolved as an error" +msgstr "" +" Konflik antara aturan %d dan token %s diselesaikan sebagai kesalahan" + +#: src/conflicts.c:399 +#, c-format +msgid "conflicts: %d shift/reduce, %d reduce/reduce\n" +msgstr "konflik: %d geser/kurangi, %d kurangi/kurangi\n" + +#: src/conflicts.c:402 +#, c-format +msgid "conflicts: %d shift/reduce\n" +msgstr "konflik: %d geser/kurangi\n" + +#: src/conflicts.c:404 +#, c-format +msgid "conflicts: %d reduce/reduce\n" +msgstr "konflik: %d kurangi/kurangi\n" + +#: src/conflicts.c:422 +#, c-format +msgid "State %d " +msgstr "State %d " + +#: src/conflicts.c:487 +#, fuzzy, c-format +msgid "%%expect-rr applies only to GLR parsers" +msgstr "%s hanya mempengaruhi parser GLR" + +#: src/conflicts.c:511 +#, c-format +msgid "expected %d shift/reduce conflict" +msgid_plural "expected %d shift/reduce conflicts" +msgstr[0] "mengharapkan %d shift/reduce konflik" +msgstr[1] "mengharapkan %d shift/reduce konflik" + +#: src/conflicts.c:515 +#, fuzzy, c-format +msgid "expected %d reduce/reduce conflict" +msgid_plural "expected %d reduce/reduce conflicts" +msgstr[0] "diharapkan 0 kurangi/kurangi konflik" + +#: src/files.c:100 +#, c-format +msgid "cannot open file `%s'" +msgstr "tidak dapat membuka file `%s'" + +#: src/files.c:116 +msgid "I/O error" +msgstr "Kesalahan I/O" + +#: src/files.c:119 +msgid "cannot close file" +msgstr "tidak dapat menutup file" + +#: src/files.c:337 +#, c-format +msgid "conflicting outputs to file %s" +msgstr "output konflik ke file %s" + +#: src/getargs.c:186 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "Coba `%s --help' untuk informasi lebih lanjut.\n" + +#: src/getargs.c:192 +msgid "GNU bison generates parsers for LALR(1) grammars.\n" +msgstr "GNU bison generates parsers for LALR(1) grammars.\n" + +#: src/getargs.c:196 +#, c-format +msgid "Usage: %s [OPTION]... FILE\n" +msgstr "Penggunaan: %s [OPTION]... FILE\n" + +#: src/getargs.c:200 +msgid "" +"If a long option shows an argument as mandatory, then it is mandatory\n" +"for the equivalent short option also. Similarly for optional arguments.\n" +msgstr "" +"Jika option panjang menyatakan argumen sebagai mandatori, maka ia mandatori " +"juga\n" +"untuk option pendek. Hal yang sama untuk argumen opsional.\n" + +#: src/getargs.c:206 +msgid "" +"Operation modes:\n" +" -h, --help display this help and exit\n" +" -V, --version output version information and exit\n" +" -y, --yacc emulate POSIX yacc\n" +msgstr "" +"Mode Operasi:\n" +" -h, --help tampilkan bantuan ini dan keluar\n" +" -V, --version tampilkan informasi versi dan keluar\n" +" -y, --yacc emulasikan POSIX yacc\n" + +#: src/getargs.c:213 +msgid "" +"Parser:\n" +" -S, --skeleton=FILE specify the skeleton to use\n" +" -t, --debug instrument the parser for debugging\n" +" --locations enable locations computation\n" +" -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n" +" -l, --no-lines don't generate `#line' directives\n" +" -n, --no-parser generate the tables only\n" +" -k, --token-table include a table of token names\n" +msgstr "" +"Parser:\n" +" -S, --skeleton=FILE specifikasikan rangka yang akan digunakan\n" +" -t, --debug instrumen parser untuk debugging\n" +" --locations aktifkan lokasi perhitungan\n" +" -p, --name-prefix=PREFIX tambahkan PREFIX ke simbol eksternal\n" +" -l, --no-lines jangan hasilkan direktiv `#line'\n" +" -n, --no-parser hasilkan hanya tabel\n" +" -k, --token-table sertakan tabel nama token\n" + +#: src/getargs.c:225 +msgid "" +"Output:\n" +" -d, --defines also produce a header file\n" +" -r, --report=THINGS also produce details on the automaton\n" +" -v, --verbose same as `--report=state'\n" +" -b, --file-prefix=PREFIX specify a PREFIX for output files\n" +" -o, --output=FILE leave output to FILE\n" +" -g, --graph also produce a VCG description of the " +"automaton\n" +msgstr "" +"Output:\n" +" -d, --defines juga hasilkan file header\n" +" -r, --report=THINGS juga hasilkan detil tentang otomaton\n" +" -v, --verbose sama seperti `--report=state'\n" +" -b, --file-prefix=PREFIX spesifikasikan PREFIX untuk file output\n" +" -o, --output=FILE simpan output ke FILE\n" +" -g, --graph juga hasilkan deskripsi VCG automaton\n" + +#: src/getargs.c:236 +msgid "" +"THINGS is a list of comma separated words that can include:\n" +" `state' describe the states\n" +" `itemset' complete the core item sets with their closure\n" +" `lookahead' explicitly associate lookaheads to items\n" +" `solved' describe shift/reduce conflicts solving\n" +" `all' include all the above information\n" +" `none' disable the report\n" +msgstr "" +"THINGS adalah daftar kata yang dipisahkan koma termasuk:\n" +" `state' menggambarkan state\n" +" `itemset' lengkapi himpunan item inti dengan klosurnya\n" +" `lookahead' asosiasikan lookaheads ke items secara eksplisit\n" +" `solved' gambarkan penyelesaian konflik shift/reduce\n" +" `all' sertakan semua informasi di atas\n" +" `none' tiadakan laporan\n" + +#: src/getargs.c:247 +msgid "Report bugs to .\n" +msgstr "Laporkan kesalahan ke .\n" + +#: src/getargs.c:264 +#, c-format +msgid "bison (GNU Bison) %s" +msgstr "bison (GNU Bison) %s" + +#: src/getargs.c:266 +msgid "Written by Robert Corbett and Richard Stallman.\n" +msgstr "Written by Robert Corbett and Richard Stallman.\n" + +#: src/getargs.c:270 +#, c-format +msgid "Copyright (C) %d Free Software Foundation, Inc.\n" +msgstr "Copyright (C) %d Free Software Foundation, Inc.\n" + +#: src/getargs.c:272 +msgid "" +"This is free software; see the source for copying conditions. There is NO\n" +"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +msgstr "" +"This is free software; see the source for copying conditions. There is NO\n" +"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" + +#: src/getargs.c:438 +#, c-format +msgid "missing operand after `%s'" +msgstr "operand hilang setelah `%s'" + +#: src/getargs.c:440 +#, c-format +msgid "extra operand `%s'" +msgstr "operand ekstra `%s'" + +#: src/gram.c:139 +msgid "empty" +msgstr "kosong" + +#: src/gram.c:233 +msgid "Grammar" +msgstr "Grammar" + +#: src/gram.c:321 src/reduce.c:394 +msgid "warning" +msgstr "peringatan" + +#: src/main.c:124 +msgid "rule never reduced because of conflicts" +msgstr "aturan tidak pernah dikurangi karena konflik" + +#: src/parse-gram.y:363 +msgid "POSIX forbids declarations in the grammar" +msgstr "POSIX melarang deklarasi dalam grammar" + +#: src/parse-gram.y:486 +msgid "missing identifier in parameter declaration" +msgstr "identifier tidak ada dalam deklarasi parameter" + +#: src/print.c:49 +#, c-format +msgid " type %d is %s\n" +msgstr " tipe %d adalah %s\n" + +#: src/print.c:165 +#, c-format +msgid "shift, and go to state %d\n" +msgstr "geser, dan ke state %d\n" + +#: src/print.c:167 +#, c-format +msgid "go to state %d\n" +msgstr "ke state %d\n" + +#: src/print.c:204 +msgid "error (nonassociative)\n" +msgstr "kesalahan(nonasosiatif)\n" + +#: src/print.c:292 +#, c-format +msgid "reduce using rule %d (%s)" +msgstr "kurangi gunakan aturan %d (%s)" + +#: src/print.c:294 +#, c-format +msgid "accept" +msgstr "terima" + +#: src/print.c:325 src/print.c:391 +msgid "$default" +msgstr "$default" + +#: src/print.c:420 +#, c-format +msgid "state %d" +msgstr "state %d" + +#: src/print.c:456 +msgid "Terminals, with rules where they appear" +msgstr "Terminal, dengan aturan tempat mereka muncul" + +#: src/print.c:483 +msgid "Nonterminals, with rules where they appear" +msgstr "Nonterminal, dengan aturan tempat mereka muncul" + +#: src/print.c:512 +#, c-format +msgid " on left:" +msgstr " di kiri:" + +#: src/print.c:527 +#, c-format +msgid " on right:" +msgstr " di kanan:" + +#: src/print.c:555 +msgid "Rules never reduced" +msgstr "Aturan tidak pernah dikurangi" + +#: src/reader.c:56 +#, c-format +msgid "multiple %s declarations" +msgstr "deklarasi ganda %s" + +#: src/reader.c:118 +#, c-format +msgid "result type clash on merge function %s: <%s> != <%s>" +msgstr "tipe hasil bentrok pada fungsi merge %s: <%s> != <%s>" + +#: src/reader.c:216 +#, c-format +msgid "rule given for %s, which is a token" +msgstr "aturan diberikan untuk %s, yang merupakan sebuah token" + +#: src/reader.c:245 +#, c-format +msgid "type clash on default action: <%s> != <%s>" +msgstr "bentrokan tipe pada aksi baku: <%s> != <%s>" + +#: src/reader.c:251 +msgid "empty rule for typed nonterminal, and no action" +msgstr "aturan kosong untuk nonterminal typed, dan tidak ada aksi" + +#: src/reader.c:321 src/reader.c:335 src/reader.c:348 +#, c-format +msgid "only one %s allowed per rule" +msgstr "hanya satu %s yang dibolehkan per aturan" + +#: src/reader.c:331 src/reader.c:346 +#, c-format +msgid "%s affects only GLR parsers" +msgstr "%s hanya mempengaruhi parser GLR" + +#: src/reader.c:333 +#, c-format +msgid "%s must be followed by positive number" +msgstr "%s harus diikuti angka positif" + +#: src/reader.c:490 +msgid "no rules in the input grammar" +msgstr "tidak ada aturan dalam grammar input" + +#: src/reduce.c:242 +msgid "useless rule" +msgstr "aturan tidak berguna" + +#: src/reduce.c:303 +#, c-format +msgid "useless nonterminal: %s" +msgstr "nonterminal tidak berguna: %s" + +#: src/reduce.c:351 +msgid "Useless nonterminals" +msgstr "Nonterminal tidak berguna" + +#: src/reduce.c:364 +msgid "Terminals which are not used" +msgstr "Terminal yang tidak digunakan" + +#: src/reduce.c:373 +msgid "Useless rules" +msgstr "Useless rules" + +#: src/reduce.c:389 +#, c-format +msgid "%d rule never reduced\n" +msgid_plural "%d rules never reduced\n" +msgstr[0] "Aturan %d tidak pernah dikurangi\n" +msgstr[1] "Aturan %d tidak pernah dikurangi\n" + +#: src/reduce.c:397 +#, c-format +msgid "%d useless nonterminal" +msgid_plural "%d useless nonterminals" +msgstr[0] "nonterminal tidak berguna %d" +msgstr[1] "nonterminal tidak berguna %d" + +#: src/reduce.c:403 +#, c-format +msgid " and " +msgstr " dan " + +#: src/reduce.c:406 +#, c-format +msgid "%d useless rule" +msgid_plural "%d useless rules" +msgstr[0] "aturan tidak berguna %d" +msgstr[1] "aturan tidak berguna %d" + +#: src/reduce.c:436 +#, c-format +msgid "start symbol %s does not derive any sentence" +msgstr "simbol awal %s tidak melahirkan kalimat" + +#: src/scan-gram.l:162 +msgid "stray `,' treated as white space" +msgstr "stray `,' dianggap sebagai white space" + +#: src/scan-gram.l:225 +#, c-format +msgid "invalid directive: %s" +msgstr "direktif tidak valid: %s" + +#: src/scan-gram.l:283 +#, c-format +msgid "invalid character: %s" +msgstr "karakter tidak valid: %s" + +#: src/scan-gram.l:402 +#, fuzzy +msgid "invalid null character" +msgstr "karakter tidak valid: %s" + +#: src/scan-gram.l:415 src/scan-gram.l:427 src/scan-gram.l:448 +#, c-format +msgid "invalid escape sequence: %s" +msgstr "urutan escape tidak valid: %s" + +#: src/scan-gram.l:417 src/scan-gram.l:429 src/scan-gram.l:450 +#, fuzzy, c-format +msgid "invalid null character: %s" +msgstr "karakter tidak valid: %s" + +#: src/scan-gram.l:455 +#, c-format +msgid "unrecognized escape sequence: %s" +msgstr "urutan escape tidak dikenal: %s" + +#: src/scan-gram.l:537 +#, c-format +msgid "missing `{' in `%s'" +msgstr "hilang `{' dalam `%s'" + +#: src/scan-gram.l:782 +#, c-format +msgid "$$ of `%s' has no declared type" +msgstr "$$ dari `%s' tidak memiliki tipe yang terdeklarasi" + +#: src/scan-gram.l:803 +#, c-format +msgid "$%d of `%s' has no declared type" +msgstr "$%d dari `%s' tidak memiliki tipe terdeklarasi" + +#: src/scan-gram.l:812 src/scan-gram.l:881 src/scan-gram.l:932 +#, c-format +msgid "integer out of range: %s" +msgstr "integer ke luar batas: %s" + +#: src/scan-gram.l:848 src/scan-gram.l:916 +#, c-format +msgid "invalid value: %s" +msgstr "nilai tidak valid: %s" + +#: src/scan-gram.l:1036 +#, c-format +msgid "missing `%s' at end of file" +msgstr "`%s' hilang di akhir file" + +#: src/scan-gram.l:1047 +#, fuzzy, c-format +msgid "missing `%s' at end of line" +msgstr "`%s' hilang di akhir file" + +#: src/symlist.c:97 src/symlist.c:108 +msgid "invalid $ value" +msgstr "nilai $ tidak valid" + +#: src/symtab.c:85 +#, c-format +msgid "type redeclaration for %s" +msgstr "redeklarasi tipe untuk %s" + +#: src/symtab.c:102 src/symtab.c:120 +#, c-format +msgid "%s redeclaration for %s" +msgstr "%s redeklarasi untuk %s" + +#: src/symtab.c:139 +#, c-format +msgid "redefining precedence of %s" +msgstr "mendefinisikan kembali presedens %s" + +#: src/symtab.c:157 +#, c-format +msgid "symbol %s redefined" +msgstr "simbol %s didefinisikan ulang" + +#: src/symtab.c:180 +#, c-format +msgid "redefining user token number of %s" +msgstr "mendefinisikan ulang nomor token user %s" + +#: src/symtab.c:207 +#, c-format +msgid "symbol %s is used, but is not defined as a token and has no rules" +msgstr "" +"simbol %s digunakan, namun tidak didefinisikan sebagai token dan tidak " +"memiliki aturan" + +#: src/symtab.c:232 +#, c-format +msgid "symbol `%s' used more than once as a literal string" +msgstr "simbol `%s' digunakan lebih dari satu kali sebagai string literal" + +#: src/symtab.c:235 +#, c-format +msgid "symbol `%s' given more than one literal string" +msgstr "simbol `%s' diberikan lebih dari satu string literal" + +#: src/symtab.c:271 +#, c-format +msgid "conflicting precedences for %s and %s" +msgstr "presenden konflik untuk %s dan %s" + +#: src/symtab.c:283 +#, c-format +msgid "conflicting associativities for %s (%s) and %s (%s)" +msgstr "asosiatif konflik untuk %s (%s) dan %s (%s)" + +#: src/symtab.c:368 +#, c-format +msgid "tokens %s and %s both assigned number %d" +msgstr "token %s dan %s keduanya memiliki angka %d" + +#: src/symtab.c:591 +#, c-format +msgid "the start symbol %s is undefined" +msgstr "simbol awal %s tidak didefinisikan" + +#: src/symtab.c:595 +#, c-format +msgid "the start symbol %s is a token" +msgstr "simbol awal %s adalah sebuah token" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "argument %s tidak valid untuk %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "argumen %s ambigu untuk %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Argumen valid adalah:" + +#: lib/bitset_stats.c:179 +#, c-format +msgid "%u bitset_allocs, %u freed (%.2f%%).\n" +msgstr "%u bitset_allocs, %u freed (%.2f%%).\n" + +#: lib/bitset_stats.c:182 +#, c-format +msgid "%u bitset_sets, %u cached (%.2f%%)\n" +msgstr "%u bitset_sets, %u cached (%.2f%%)\n" + +#: lib/bitset_stats.c:185 +#, c-format +msgid "%u bitset_resets, %u cached (%.2f%%)\n" +msgstr "%u bitset_resets, %u cached (%.2f%%)\n" + +#: lib/bitset_stats.c:188 +#, c-format +msgid "%u bitset_tests, %u cached (%.2f%%)\n" +msgstr "%u bitset_tests, %u cached (%.2f%%)\n" + +#: lib/bitset_stats.c:192 +#, c-format +msgid "%u bitset_lists\n" +msgstr "%u bitset_lists\n" + +#: lib/bitset_stats.c:194 +msgid "count log histogram\n" +msgstr "hitung log histogram\n" + +#: lib/bitset_stats.c:197 +msgid "size log histogram\n" +msgstr "ukuran log histogram\n" + +#: lib/bitset_stats.c:200 +msgid "density histogram\n" +msgstr "kepadatan histogram\n" + +#: lib/bitset_stats.c:214 +#, c-format +msgid "" +"Bitset statistics:\n" +"\n" +msgstr "" +"Statistik bitset:\n" +"\n" + +#: lib/bitset_stats.c:217 +#, c-format +msgid "Accumulated runs = %u\n" +msgstr "Run terakumulasi = %u\n" + +#: lib/bitset_stats.c:261 lib/bitset_stats.c:266 +msgid "Could not read stats file." +msgstr "Tidak dapat membaca file stat." + +#: lib/bitset_stats.c:263 +#, c-format +msgid "Bad stats file size.\n" +msgstr "Ukuran file stat buruk.\n" + +#: lib/bitset_stats.c:289 lib/bitset_stats.c:291 +msgid "Could not write stats file." +msgstr "Tidak dapat menulis file stat." + +#: lib/bitset_stats.c:294 +msgid "Could not open stats file for writing." +msgstr "Tidak dapat membuka file stat untuk ditulisi." + +#: lib/error.c:127 +msgid "Unknown system error" +msgstr "Kesalahan sistem tidak dikenal" + +#: lib/getopt.c:570 lib/getopt.c:589 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: option `%s' ambigu\n" + +#: lib/getopt.c:622 lib/getopt.c:626 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: option `--%s' tidak membolehkan sebuah argumen\n" + +#: lib/getopt.c:635 lib/getopt.c:640 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: option `%c%s' tidak membolehkan sebuah argumen\n" + +#: lib/getopt.c:686 lib/getopt.c:708 lib/getopt.c:1039 lib/getopt.c:1061 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: option `%s' membutuhkan sebuah argumen\n" + +#: lib/getopt.c:746 lib/getopt.c:749 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: option tidak dikenal `--%s'\n" + +#: lib/getopt.c:757 lib/getopt.c:760 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: option tidak dikenal `%c%s'\n" + +#: lib/getopt.c:815 lib/getopt.c:818 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: option ilegal -- %c\n" + +#: lib/getopt.c:824 lib/getopt.c:827 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: option tidak valid -- %c\n" + +#: lib/getopt.c:882 lib/getopt.c:901 lib/getopt.c:1114 lib/getopt.c:1135 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: option membutuhkan sebuah argumen -- %c\n" + +#: lib/getopt.c:954 lib/getopt.c:973 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: option `-W %s' ambigu\n" + +#: lib/getopt.c:997 lib/getopt.c:1018 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: option `-W %s' tidak membolehkan sebuah argumen\n" + +#: lib/obstack.c:417 lib/obstack.c:420 lib/xmalloc.c:53 +msgid "memory exhausted" +msgstr "memori habis" + +#: lib/quotearg.c:238 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:239 +msgid "'" +msgstr "'" + +#: lib/subpipe.c:171 +#, c-format +msgid "subsidiary program `%s' could not be invoked" +msgstr "program subsider `%s' tidak dapat dipanggil" + +#: lib/subpipe.c:173 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "program subsider `%s' tidak ditemukan" + +#: lib/subpipe.c:175 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "program subsider `%s' gagal" + +#: lib/subpipe.c:176 +#, c-format +msgid "subsidiary program `%s' failed (exit status %d)" +msgstr "program subsider `%s' gagal (status kegagalan %d)" + +#: lib/timevar.c:475 +msgid "" +"\n" +"Execution times (seconds)\n" +msgstr "" +"\n" +"Waktu eksekusi (detik)\n" + +#: lib/timevar.c:525 +msgid " TOTAL :" +msgstr " TOTAL :" + +#: lib/timevar.c:561 +#, c-format +msgid "time in %s: %ld.%06ld (%ld%%)\n" +msgstr "waktu dalam %s: %ld.%06ld (%ld%%)\n" + +#~ msgid "%d shift/reduce conflict" +#~ msgid_plural "%d shift/reduce conflicts" +#~ msgstr[0] "%d geser/kurangi konflik" +#~ msgstr[1] "%d geser/kurangi konflik" + +#~ msgid "and" +#~ msgstr "dan" + +#~ msgid "conflicts: " +#~ msgstr "konflik: " + +#~ msgid "State %d contains " +#~ msgstr "State %d berisi " diff --git a/src/apps/bin/bison/po/insert-header.sin b/src/apps/bin/bison/po/insert-header.sin new file mode 100644 index 0000000000..b26de01f6c --- /dev/null +++ b/src/apps/bin/bison/po/insert-header.sin @@ -0,0 +1,23 @@ +# Sed script that inserts the file called HEADER before the header entry. +# +# At each occurrence of a line starting with "msgid ", we execute the following +# commands. At the first occurrence, insert the file. At the following +# occurrences, do nothing. The distinction between the first and the following +# occurrences is achieved by looking at the hold space. +/^msgid /{ +x +# Test if the hold space is empty. +s/m/m/ +ta +# Yes it was empty. First occurrence. Read the file. +r HEADER +# Output the file's contents by reading the next line. But don't lose the +# current line while doing this. +g +N +bb +:a +# The hold space was nonempty. Following occurrences. Do nothing. +x +:b +} diff --git a/src/apps/bin/bison/po/it.gmo b/src/apps/bin/bison/po/it.gmo new file mode 100644 index 0000000000000000000000000000000000000000..ead839dc97ea55711856f6fb67a2ca36c6911b1e GIT binary patch literal 12359 zcmbW7dyE~|UB^#ILdk8~q-o0|5PH&hvv%XV-gTZ`$4=JkwX?N(D#(frJ`Jser=g zd(O;#?88nn%JKKkne+Ia-~0SFe|Og{pEo?4w4b1T>}F$r0sM_0W?*Z?7r!iyT45g6BHfS?lR`R;Gcq*=zkTI zyv{Y^sB``cDAE5bsP$h5wa%R! z{ypFrNSApOd=NYbijU8O8g~tZH1iTDefV?m2>1#pdEUxDr@(ta(XkFnKYA7Z94P*M z7UbyWw?XOGOQ7Wa3aInE4t@~4gOAdWqoCw=78E~vpw{^{P<;Dc@G$ttp!DuPz!~s= ztM5;+i1cs;)VV$l{v`M!Xu(&i_cy?UyuY8t`DsposDyb2lzc-F6*pb*Q!w;0C_29j z(NBVR!_-;uIq(Vaiy$PJzXvfr^IxF&_dlTcc?X9U-w%MI?-5Y^3_+da^WYTt1#lkx z3s8Kx8{(xmCqTMPtHS5O2YCNt_5Ly_ef#IC|GgNA)_(%DUhO8;)Z*O+PWIH>PeK+$mx)cO7j z#N^FwF!L+m`@kmn2jGj~zk#2*$(S#3_!GQ8$mYM#dj@Kq2Ow5_eGYtq{siR6=5`LR z^F0859lQXFp1bH2-)2FbI{*=hc^-T>_yrKrn%@CM@3%mfHQxo_0e%nEd2fQ*lH)z# zz2H$$>#c&?rvSyLFN4y9mqGF6AHiF}?}OsYEhw-0p8(H*&w}FnZ-UzAtDyA!&p@5) z+o0@6Owu{t14?g?fZFdFa0dKYQ1tvE2n)@tpvK+Ip`=HLL7jUE6d${w^zH@l5%9M_ z`Gda&9|m6s9|sRHn5E1HXu;2c+UNH`>Dwz+|NnvS=H0@K26zO#9h?Tm&n4PBY4S<) zG{k03(==9gT0e935Ab8vZ^_}OX_7n3xktRyx!N@8iJm)Yo3!&Z(X8h&59WA9p)Xx-$IC^73(YH0G{^t+I&H#1>IE%F z^{}`chKbF}IJ9GJ8zgO8q?hO!%WW3sX}lHEoAbejS(avRb9xrG%U1X{C+C~dMq%vg z;_A#(v3%Taa;PM=?XVRG zQ0GRP1F+!w1KQz6P{xH}pyOE*ZiN|~((&4jx|^kU^_O`Vhq*RQiZJU&Nf2xJ9^LtH zzjoRA&Hzcr(;hf6Z=@L~q<`8*aU6Dn*rq-ArP;J&Ehy8MWGjdxj=1Yf)w4F%5^vgR zm?z_f4dOVxEYSy9r|gDF;g{(TW+;pey6aJ=OiTEyO@_Z_;U~)oHQIlTX7ep<*nFBZ zzG?ER(fd-k7jbroTV;}AG@T^6ihA@HT?e^cb(72gtwaRW82L&5s zWs=+D5ZW*&gSO3!pvdh;gk#8I0py-^CvqPkH)`e6jfR;`d)v<1?7`VXcC2krb4t6C zZWNcXD|(#%-*ifT#GGp>3qYm$RsdlFr1?uq+&*X84mvLtdZK z33F!QJe<#Q0i7@jGY*#9UXbNs##vbZ?9AEagHwlWCkwh=`XT6y|7qqoY+&Ow>D0o` zH`B`_sw+p>#YF~1nr$Dp#U}Jeg>0bT+t4O_u+n_24WqHFlj*e19D_JdC#+qGx)F{i z-gZ>^Z`f>YXrgOj;3$ya<*3+nE+@B_H$ynfCfhdX^}--Ci#;7x?!KG0L*!y@bMr9D zycxzl?=IU>-iw26ra`Xjmah-5M1=-l&|o}St~IPp%c55nw(f`$PSy1r49|iG&E|H{ zYWXcfuSs@kab^A)tNw;rbSpW6+8T}jj1pur@`xw4m!)!|$Y2wJ<5Z=3qAkG)*5ixR z>Z@jSGy~1-Z4SozUn3_C?1kAgM6SG*MP8|hS)*q*UIvi09<}o-$~gh%L;*LrvH-K> ztiwrYMf>NMh*R)wgy#Cd+NB;qqM+y{!V67ohwEi$C*e_&7nzG4Zc}fHPUqe54z|t$ zdYVlfWksUzasP%%u#O8Fd~2m$bkhyg);(>VAjMrmLTEUcb}b^P74_j2qA#)6=G)!% zGKOGME-6t+;H<68r~A*X3k7CQ)M9*@A`Jxn%G-Kbp?xJ=sahi8Sk+zIT!4hv4%tL z5|+mOFbNB7@`G9_ZcE?Uj?m&f8jOiD+lte?%%nDji z$OURIk~q|$e(kb$WhvVQyu`o?cwGGj?fad3ApF{MnghyL5gTw=#!vt!CTGqETQ)l5w|E z*GYE}DHwJ>xs;@riSgUHr0y>e=kuTwPLs&l=N6Y%=NA_~J~1)jU7$I?J4ep@oyvrB zbHQb>{WvMUPMfF60}4*GzHOJ&^^j;gi{}dqQdk_oGW-v+wp}TZG?5z0)(p`p>=mY; zy!Jz{C=*A?rhOuDP&vg(}a@bM8RVcutrHOG;vIiM4pgQEL~b?$WZ)HH+L{h7 zIrYASRU4+hpB%7cPG#7CucbXCnr?``ZR5>1gA(Ox8*+~#!q;fb(8VY>oXlwsChY7v zN|f5v(NDK1G7<@Cz;O9R_&oFttA%ym371_oY%oMQOPOl{Z6oeDQM#87A;R0)m{K_B z2%PtIOBpw2$1LCAX> z7lHzyTgEwcs5XP~P$(~Tm%BoLT*b%24c)}WKCqTrL|%8zgoTo+e% z-Q{t_Qnwm0gQYC}8BD7=-)>&;Dfo1Chnbpqc(UQcee+!2iQ3JR1pVe}%7C3gzp=Eq z+MMOGBr9&7B2Z4-qmz>lH76f#9-XpNlha2ZX-+;mImy80a<~;K*B^{K+MJqfPCaU; z9-4me(FZ1{7g(Bjb27^W2Mwm6{l2+P=t<&}~a-pKJ6ql$~^ECGs#G3TnYkvIbG3$RG zKbY8ikK3t3#~P-wijSle6j?6at@0{-3GG2N!WYe=k)m0lJTfDH3JCR`6u{!qACiTB z-HccfGmPYid{b4k;mX%rT_B6vo+P7m11?dyd#h^`z1HeablBhzGQ}k6Y3$*GONkdvkkM^|#@{ z*I(OL_x2@oPYU}t-9eBZlZ=jvr~M4-o=5)1Yz*} z=WwOA{=DH~II(;#hYO`fQ55)Mc}SNW?q;H{dnREiuHY&hb(0I*`48>`(rMyBsKByIv_*Kq<%W@HLhnt~Rk#@NF6CE|Y z(TNdzZRpi-;;e+}eBBN=rW>jAjnc}Jsl8r+dZgxD+GbkuDoZ#m-wO9C8+KDNv%r3` zL?gK(U{k3L33z$S6@GTq4Xe@BWm#S>vUwR3B&$*)S~-}!SNTwKSJ6PH*O^^de#-^L zel5{4x#SAqYl>XmuTxGOokcyd2*hk1VBD7zHGltF;^=$@#Jm^rr@cv8nNUz@qpIkU3Qm$W!ltZp+ z#Q`c+S!yRv*D*p(-@gW_0O|{gke{KIy2DkKNX@)a`H?@1s@g@#C|Fkr(40#*EIvwo z{RHK8q()t_j+9PWF1{x0;Fwg@QYon@Ifbqy6c+a>M|vmJp1Q%FXqfh9^mc~ zY)WLGHY+aaa-MQWIW*kA7)rD=bzVWF_kYwEojNZ!mpzN2(NNMSgQ>+iD1#192QE}|r*f5Y_~yK)*gR48$UwYp44-D|JW)OAE{T^L0G@>(ofkXUjtsy-yT zuDXQS7fxSon5{D9I_R<`d=4)GyYjcnT&}PR;!gI-@I}$7s=Mg=$|;otcjKx4S`lrf zln(-|ld#BDb8xyHw(ZAoRUC}jW&iaKu8K;L#9+PkUBJawUrg0T9EZFS%{?Gu{WUWk zlJB5XjIBiMimGG`VIGvE?SUB$;{6h9HN56c#WJb|80H|j%LrVt6*7G(`>G2i5<9$C z)m7J%`krj4q~R1a%U4pWAyQ)!j#9-T;)46jtIxmtQ)~MBj#6wMt7TvuO6?mhYBV8O&${A5bKc{<+7T} znj?L(>y817oC2i=CrdSo-S(;9*6PH$9e=4jb01JfiA`dZmD;I*tFl(D^16A{s@c~s VdEh|_NLEd>A-X!_^*^!7{|D6I;OPJW literal 0 HcmV?d00001 diff --git a/src/apps/bin/bison/po/it.po b/src/apps/bin/bison/po/it.po new file mode 100644 index 0000000000..111431b374 --- /dev/null +++ b/src/apps/bin/bison/po/it.po @@ -0,0 +1,787 @@ +# Italian translation for message of GNU bison. +# Copyright (C) 2002 Free Software Foundation, Inc. +# Paolo Bonzini , 2002. +# +msgid "" +msgstr "" +"Project-Id-Version: bison 1.50\n" +"Report-Msgid-Bugs-To: bug-bison@gnu.org\n" +"POT-Creation-Date: 2004-05-21 10:26-0700\n" +"PO-Revision-Date: 2002-10-17 14:37+0100\n" +"Last-Translator: Paolo Bonzini \n" +"Language-Team: Italian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8-bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: src/complain.c:51 src/complain.c:66 +msgid "warning: " +msgstr "attenzione: " + +#: src/complain.c:122 src/complain.c:138 +msgid "fatal error: " +msgstr "errore fatale: " + +#: src/conflicts.c:76 +#, c-format +msgid " Conflict between rule %d and token %s resolved as shift" +msgstr " Conflitto tra la regola %d e il token %s risolto come shift" + +#: src/conflicts.c:84 +#, c-format +msgid " Conflict between rule %d and token %s resolved as reduce" +msgstr " Conflitto tra la regola %d e il token %s risolto come riduzione" + +#: src/conflicts.c:91 +#, c-format +msgid " Conflict between rule %d and token %s resolved as an error" +msgstr " Conflitto tra la regola %d e il token %s risolto come errore" + +#: src/conflicts.c:399 +#, c-format +msgid "conflicts: %d shift/reduce, %d reduce/reduce\n" +msgstr "" + +#: src/conflicts.c:402 +#, fuzzy, c-format +msgid "conflicts: %d shift/reduce\n" +msgstr " %d shift/riduzione" + +#: src/conflicts.c:404 +#, fuzzy, c-format +msgid "conflicts: %d reduce/reduce\n" +msgstr " %d riduzione/riduzione" + +#: src/conflicts.c:422 +#, fuzzy, c-format +msgid "State %d " +msgstr "stato %d" + +#: src/conflicts.c:487 +#, fuzzy, c-format +msgid "%%expect-rr applies only to GLR parsers" +msgstr "%%dprec considerato solo nei parser GLR" + +#: src/conflicts.c:511 +#, c-format +msgid "expected %d shift/reduce conflict" +msgid_plural "expected %d shift/reduce conflicts" +msgstr[0] "atteso %d conflitto shift/riduzione" +msgstr[1] "attesi %d conflitti shift/riduzione" + +#: src/conflicts.c:515 +#, fuzzy, c-format +msgid "expected %d reduce/reduce conflict" +msgid_plural "expected %d reduce/reduce conflicts" +msgstr[0] "%d conflitto riduzione/riduzione" +msgstr[1] "%d conflitti riduzione/riduzione" + +#: src/files.c:100 +#, c-format +msgid "cannot open file `%s'" +msgstr "impossibile aprire il file `%s'" + +#: src/files.c:116 +msgid "I/O error" +msgstr "" + +#: src/files.c:119 +msgid "cannot close file" +msgstr "impossibile chiudere il file `%s'" + +#: src/files.c:337 +#, c-format +msgid "conflicting outputs to file %s" +msgstr "" + +#: src/getargs.c:186 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "Provare `%s --help' per ulteriori informazioni.\n" + +#: src/getargs.c:192 +msgid "GNU bison generates parsers for LALR(1) grammars.\n" +msgstr "GNU bison genera parser per grammatiche LALR(1).\n" + +#: src/getargs.c:196 +#, c-format +msgid "Usage: %s [OPTION]... FILE\n" +msgstr "Utilizzo: %s [OPZIONE]... FILE\n" + +#: src/getargs.c:200 +msgid "" +"If a long option shows an argument as mandatory, then it is mandatory\n" +"for the equivalent short option also. Similarly for optional arguments.\n" +msgstr "" +"Se un argomento è indicato come obbligatorio in un'opzione lunga, allora\n" +"è obbligatorio anche per l'equivalente opzione corta. Analogamente per\n" +"gli argomenti opzionali.\n" + +#: src/getargs.c:206 +msgid "" +"Operation modes:\n" +" -h, --help display this help and exit\n" +" -V, --version output version information and exit\n" +" -y, --yacc emulate POSIX yacc\n" +msgstr "" +"Modalità operative:\n" +" -h, --help mostra questo aiuto ed esce\n" +" -V, --version mostra informazioni sulla versione ed esce\n" +" -y, --yacc emula il comportamento di POSIX yacc\n" + +#: src/getargs.c:213 +msgid "" +"Parser:\n" +" -S, --skeleton=FILE specify the skeleton to use\n" +" -t, --debug instrument the parser for debugging\n" +" --locations enable locations computation\n" +" -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n" +" -l, --no-lines don't generate `#line' directives\n" +" -n, --no-parser generate the tables only\n" +" -k, --token-table include a table of token names\n" +msgstr "" +" -S, --skeleton=FILE specifica lo scheletro da usare\n" +" -t, --debug aggiunge informazioni di debug al parser\n" +" --locations abilita il calcolo delle locazioni (@N)\n" +" -p, --name-prefix=PREFIX prepone PREFIX ai simboli globali\n" +" -l, --no-lines non genera direttive `#line'\n" +" -n, --no-parser genera le sole tabelle\n" +" -k, --token-table include una tabella di nomi dei token\n" + +#: src/getargs.c:225 +msgid "" +"Output:\n" +" -d, --defines also produce a header file\n" +" -r, --report=THINGS also produce details on the automaton\n" +" -v, --verbose same as `--report=state'\n" +" -b, --file-prefix=PREFIX specify a PREFIX for output files\n" +" -o, --output=FILE leave output to FILE\n" +" -g, --graph also produce a VCG description of the " +"automaton\n" +msgstr "" +"Output:\n" +" -d, --defines produce anche uno header\n" +" -r, --report=THINGS produce anche dettagli sull'automa\n" +" -v, --verbose produce anche una spiegazione dell'automa\n" +" -b, --file-prefix=PREFIX specifica un prefisso per il file di output\n" +" -o, --output=FILE lascia l'output in FILE\n" +" -g, --graph produce anche una descrizione VCG dell'automa\n" + +#: src/getargs.c:236 +msgid "" +"THINGS is a list of comma separated words that can include:\n" +" `state' describe the states\n" +" `itemset' complete the core item sets with their closure\n" +" `lookahead' explicitly associate lookaheads to items\n" +" `solved' describe shift/reduce conflicts solving\n" +" `all' include all the above information\n" +" `none' disable the report\n" +msgstr "" +"THINGS è un elenco di parole separate da virgola scelte tra:\n" +" `state' descrive gli stati\n" +" `itemset' completa gli insiemi dei simboli con la loro chiusura " +"transitiva\n" +" `lookahead' associa i token di prospezione ai simboli\n" +" `solved' descrive la riduzione dei conflitti shift/riduzione\n" +" `all' include tutte queste informazioni\n" +" `none' disabilita la produzione del rapporto\n" + +#: src/getargs.c:247 +msgid "Report bugs to .\n" +msgstr "Segnalare eventuali bug a .\n" + +#: src/getargs.c:264 +#, c-format +msgid "bison (GNU Bison) %s" +msgstr "bison (GNU Bison) %s" + +#: src/getargs.c:266 +msgid "Written by Robert Corbett and Richard Stallman.\n" +msgstr "Scritto da Robert Corbett e Richard Stallman.\n" + +#: src/getargs.c:270 +#, c-format +msgid "Copyright (C) %d Free Software Foundation, Inc.\n" +msgstr "Copyright (C) %d Free Software Foundation, Inc.\n" + +#: src/getargs.c:272 +msgid "" +"This is free software; see the source for copying conditions. There is NO\n" +"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +msgstr "" +"Questo e' software libero; vedere il sorgente per le condizioni cui e'\n" +"sottoposta la copia. NON c'è ALCUNA garanzia, neanche di\n" +"COMMERCIABILITA` o di ADEGUATEZZA AD UN PARTICOLARE SCOPO.\n" + +#: src/getargs.c:438 +#, c-format +msgid "missing operand after `%s'" +msgstr "" + +#: src/getargs.c:440 +#, c-format +msgid "extra operand `%s'" +msgstr "" + +#: src/gram.c:139 +msgid "empty" +msgstr "vuoto" + +#: src/gram.c:233 +msgid "Grammar" +msgstr "Grammatica" + +#: src/gram.c:321 src/reduce.c:394 +msgid "warning" +msgstr "attenzione" + +#: src/main.c:124 +msgid "rule never reduced because of conflicts" +msgstr "regola mai ridotta a causa dei conflitti" + +#: src/parse-gram.y:363 +msgid "POSIX forbids declarations in the grammar" +msgstr "POSIX proibisce l'uso di dichiarazioni interne alla grammatica" + +#: src/parse-gram.y:486 +msgid "missing identifier in parameter declaration" +msgstr "" + +#: src/print.c:49 +#, c-format +msgid " type %d is %s\n" +msgstr " il tipo %d è %s\n" + +#: src/print.c:165 +#, c-format +msgid "shift, and go to state %d\n" +msgstr "shift e prosecuzione allo stato %d\n" + +#: src/print.c:167 +#, c-format +msgid "go to state %d\n" +msgstr "prosecuzione allo stato %d\n" + +#: src/print.c:204 +msgid "error (nonassociative)\n" +msgstr "errore (non associativo)\n" + +#: src/print.c:292 +#, c-format +msgid "reduce using rule %d (%s)" +msgstr "riduzione con la regola %d (%s)" + +#: src/print.c:294 +#, c-format +msgid "accept" +msgstr "accetta" + +#: src/print.c:325 src/print.c:391 +msgid "$default" +msgstr "$default" + +#: src/print.c:420 +#, c-format +msgid "state %d" +msgstr "stato %d" + +#: src/print.c:456 +msgid "Terminals, with rules where they appear" +msgstr "Simboli terminali e regole in cui appaiono" + +#: src/print.c:483 +msgid "Nonterminals, with rules where they appear" +msgstr "Simboli nonterminali e regole in cui appaiono" + +#: src/print.c:512 +#, c-format +msgid " on left:" +msgstr " nel primo membro:" + +#: src/print.c:527 +#, c-format +msgid " on right:" +msgstr " nel secondo membro:" + +#: src/print.c:555 +msgid "Rules never reduced" +msgstr "Regole mai ridotte" + +#: src/reader.c:56 +#, c-format +msgid "multiple %s declarations" +msgstr "dichiarazioni multiple per %s" + +#: src/reader.c:118 +#, fuzzy, c-format +msgid "result type clash on merge function %s: <%s> != <%s>" +msgstr "" +"conflitto nei tipi del risultato della funzione di merge %s: `%s' e `%s'" + +#: src/reader.c:216 +#, c-format +msgid "rule given for %s, which is a token" +msgstr "fornita una regola per il token %s" + +#: src/reader.c:245 +#, fuzzy, c-format +msgid "type clash on default action: <%s> != <%s>" +msgstr "conflitto di tipo (`%s' e `%s') nell'azione di default" + +#: src/reader.c:251 +msgid "empty rule for typed nonterminal, and no action" +msgstr "regola vuota e nessuna azione per un nonterminale con tipo" + +#: src/reader.c:321 src/reader.c:335 src/reader.c:348 +#, fuzzy, c-format +msgid "only one %s allowed per rule" +msgstr "solo un %%merge è permesso in una regola" + +#: src/reader.c:331 src/reader.c:346 +#, fuzzy, c-format +msgid "%s affects only GLR parsers" +msgstr "%%merge considerato solo nei parser GLR" + +#: src/reader.c:333 +#, fuzzy, c-format +msgid "%s must be followed by positive number" +msgstr "%%dprec deve essere seguito da un intero positivo" + +#: src/reader.c:490 +msgid "no rules in the input grammar" +msgstr "nessuna regola nella grammatica di input" + +#: src/reduce.c:242 +msgid "useless rule" +msgstr "regola inutile" + +#: src/reduce.c:303 +#, fuzzy, c-format +msgid "useless nonterminal: %s" +msgstr "simbolo nonterminale inutilizzato" + +#: src/reduce.c:351 +msgid "Useless nonterminals" +msgstr "Simboli nonterminali inutili" + +#: src/reduce.c:364 +msgid "Terminals which are not used" +msgstr "Simboli terminali inutilizzati" + +#: src/reduce.c:373 +msgid "Useless rules" +msgstr "Regole inutili" + +#: src/reduce.c:389 +#, c-format +msgid "%d rule never reduced\n" +msgid_plural "%d rules never reduced\n" +msgstr[0] "%d regola non applicata\n" +msgstr[1] "%d regole non applicate\n" + +#: src/reduce.c:397 +#, c-format +msgid "%d useless nonterminal" +msgid_plural "%d useless nonterminals" +msgstr[0] "%d simbolo nonterminale inutilizzato" +msgstr[1] "%d simboli nonterminali inutilizzati" + +#: src/reduce.c:403 +#, c-format +msgid " and " +msgstr " e " + +#: src/reduce.c:406 +#, c-format +msgid "%d useless rule" +msgid_plural "%d useless rules" +msgstr[0] "%d regola inutile" +msgstr[1] "%d regole inutili" + +#: src/reduce.c:436 +#, c-format +msgid "start symbol %s does not derive any sentence" +msgstr "dal simbolo iniziale %s non deriva alcuna frase" + +#: src/scan-gram.l:162 +msgid "stray `,' treated as white space" +msgstr "" + +#: src/scan-gram.l:225 +#, fuzzy, c-format +msgid "invalid directive: %s" +msgstr ": escape non valido: %s\n" + +#: src/scan-gram.l:283 +#, fuzzy, c-format +msgid "invalid character: %s" +msgstr ": carattere non valido: `%c'\n" + +#: src/scan-gram.l:402 +#, fuzzy +msgid "invalid null character" +msgstr ": carattere non valido: `%c'\n" + +#: src/scan-gram.l:415 src/scan-gram.l:427 src/scan-gram.l:448 +#, fuzzy, c-format +msgid "invalid escape sequence: %s" +msgstr ": escape non valido: %s\n" + +#: src/scan-gram.l:417 src/scan-gram.l:429 src/scan-gram.l:450 +#, fuzzy, c-format +msgid "invalid null character: %s" +msgstr ": carattere non valido: `%c'\n" + +#: src/scan-gram.l:455 +#, fuzzy, c-format +msgid "unrecognized escape sequence: %s" +msgstr ": escape non riconosciuto: %s\n" + +#: src/scan-gram.l:537 +#, c-format +msgid "missing `{' in `%s'" +msgstr "" + +#: src/scan-gram.l:782 +#, c-format +msgid "$$ of `%s' has no declared type" +msgstr "Manca una dichiarazione di tipo per $$ di `%s'" + +#: src/scan-gram.l:803 +#, c-format +msgid "$%d of `%s' has no declared type" +msgstr "Manca una dichiarazione di tipo per $%d di `%s'" + +#: src/scan-gram.l:812 src/scan-gram.l:881 src/scan-gram.l:932 +#, c-format +msgid "integer out of range: %s" +msgstr "" + +#: src/scan-gram.l:848 src/scan-gram.l:916 +#, fuzzy, c-format +msgid "invalid value: %s" +msgstr "valore non valido: %s%d" + +#: src/scan-gram.l:1036 +#, c-format +msgid "missing `%s' at end of file" +msgstr "" + +#: src/scan-gram.l:1047 +#, c-format +msgid "missing `%s' at end of line" +msgstr "" + +#: src/symlist.c:97 src/symlist.c:108 +msgid "invalid $ value" +msgstr "valore $ non valido" + +#: src/symtab.c:85 +#, c-format +msgid "type redeclaration for %s" +msgstr "tipo dichiarato due volte per %s" + +#: src/symtab.c:102 src/symtab.c:120 +#, c-format +msgid "%s redeclaration for %s" +msgstr "dichiarazione due volte di %s per %s" + +#: src/symtab.c:139 +#, c-format +msgid "redefining precedence of %s" +msgstr "precedenza di `%s' definita due volte" + +#: src/symtab.c:157 +#, c-format +msgid "symbol %s redefined" +msgstr "simbolo %s ridefinito" + +#: src/symtab.c:180 +#, c-format +msgid "redefining user token number of %s" +msgstr "numero di token definito dall'utente specificato due volte per %s" + +#: src/symtab.c:207 +#, c-format +msgid "symbol %s is used, but is not defined as a token and has no rules" +msgstr "usato il simbolo %s, ma non è un token e non ha regole" + +#: src/symtab.c:232 +#, c-format +msgid "symbol `%s' used more than once as a literal string" +msgstr "simbolo `%s' usato più di una volta in una stringa letterale" + +#: src/symtab.c:235 +#, c-format +msgid "symbol `%s' given more than one literal string" +msgstr "il simbolo `%s' dà pi` di una stringa letterale" + +#: src/symtab.c:271 +#, c-format +msgid "conflicting precedences for %s and %s" +msgstr "precedenze in conflitto per %s und %s" + +#: src/symtab.c:283 +#, c-format +msgid "conflicting associativities for %s (%s) and %s (%s)" +msgstr "associatività in conflitto per %s (%s) e %s (%s)" + +#: src/symtab.c:368 +#, c-format +msgid "tokens %s and %s both assigned number %d" +msgstr "i token %s e %s hanno lo stesso numero %d" + +#: src/symtab.c:591 +#, c-format +msgid "the start symbol %s is undefined" +msgstr "simbolo iniziale %s non definito" + +#: src/symtab.c:595 +#, c-format +msgid "the start symbol %s is a token" +msgstr "specificato il token %s come simbolo iniziale" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "argomento non valido %s per %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "argomento ambiguo %s per %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Gli argomenti validi sono:" + +#: lib/bitset_stats.c:179 +#, c-format +msgid "%u bitset_allocs, %u freed (%.2f%%).\n" +msgstr "%u bitset_alloc, %u liberati (%.2f%%).\n" + +#: lib/bitset_stats.c:182 +#, c-format +msgid "%u bitset_sets, %u cached (%.2f%%)\n" +msgstr "%u bitset_set, %u in cache (%.2f%%)\n" + +#: lib/bitset_stats.c:185 +#, c-format +msgid "%u bitset_resets, %u cached (%.2f%%)\n" +msgstr "%u bitset_reset, %u in cache (%.2f%%)\n" + +#: lib/bitset_stats.c:188 +#, c-format +msgid "%u bitset_tests, %u cached (%.2f%%)\n" +msgstr "%u bitset_test, %u in cache (%.2f%%)\n" + +#: lib/bitset_stats.c:192 +#, c-format +msgid "%u bitset_lists\n" +msgstr "%u bitset_list\n" + +#: lib/bitset_stats.c:194 +msgid "count log histogram\n" +msgstr "istogramma dei conteggi\n" + +#: lib/bitset_stats.c:197 +msgid "size log histogram\n" +msgstr "istogramma delle dimensioni\n" + +#: lib/bitset_stats.c:200 +msgid "density histogram\n" +msgstr "istogranna delle densità\n" + +#: lib/bitset_stats.c:214 +#, c-format +msgid "" +"Bitset statistics:\n" +"\n" +msgstr "" +"Statistiche dei bitset:\n" +"\n" + +#: lib/bitset_stats.c:217 +#, c-format +msgid "Accumulated runs = %u\n" +msgstr "Esecuzioni accumulate = %u\n" + +#: lib/bitset_stats.c:261 lib/bitset_stats.c:266 +msgid "Could not read stats file." +msgstr "Impossibile leggere il file delle statistiche." + +#: lib/bitset_stats.c:263 +#, c-format +msgid "Bad stats file size.\n" +msgstr "Dimensione errata del file delle statistiche.\n" + +#: lib/bitset_stats.c:289 lib/bitset_stats.c:291 +msgid "Could not write stats file." +msgstr "Impossibile scrivere il file delle statistiche." + +#: lib/bitset_stats.c:294 +msgid "Could not open stats file for writing." +msgstr "Impossibile aprire in scrittura il file delle statistiche." + +#: lib/error.c:127 +msgid "Unknown system error" +msgstr "Errore di sistema sconosciuto" + +#: lib/getopt.c:570 lib/getopt.c:589 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: l'opzione `%s' è ambigua\n" + +#: lib/getopt.c:622 lib/getopt.c:626 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: l'opzione `--%s' non ammette argomenti\n" + +#: lib/getopt.c:635 lib/getopt.c:640 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: l'opzione `%c%s' non ammette argomenti\n" + +#: lib/getopt.c:686 lib/getopt.c:708 lib/getopt.c:1039 lib/getopt.c:1061 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: l'opzione `%s' richiede un argomento\n" + +#: lib/getopt.c:746 lib/getopt.c:749 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: opzione sconosciuta `--%s'\n" + +#: lib/getopt.c:757 lib/getopt.c:760 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: opzione sconosciuta `%c%s'\n" + +#: lib/getopt.c:815 lib/getopt.c:818 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opzione non valida -- %c\n" + +#: lib/getopt.c:824 lib/getopt.c:827 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opzione non valida -- %c\n" + +#: lib/getopt.c:882 lib/getopt.c:901 lib/getopt.c:1114 lib/getopt.c:1135 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: l'opzione richiede un argomento -- %c\n" + +#: lib/getopt.c:954 lib/getopt.c:973 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: l'opzione `-W %s' è ambigua\n" + +#: lib/getopt.c:997 lib/getopt.c:1018 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: l'opzione `-W %s' non ammette un argomento\n" + +#: lib/obstack.c:417 lib/obstack.c:420 lib/xmalloc.c:53 +msgid "memory exhausted" +msgstr "memoria esaurita" + +#: lib/quotearg.c:238 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:239 +msgid "'" +msgstr "'" + +#: lib/subpipe.c:171 +#, c-format +msgid "subsidiary program `%s' could not be invoked" +msgstr "" + +#: lib/subpipe.c:173 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "" + +#: lib/subpipe.c:175 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "" + +#: lib/subpipe.c:176 +#, c-format +msgid "subsidiary program `%s' failed (exit status %d)" +msgstr "" + +#: lib/timevar.c:475 +msgid "" +"\n" +"Execution times (seconds)\n" +msgstr "" +"\n" +"Tempo di esecuzione (in secondi)\n" + +#: lib/timevar.c:525 +msgid " TOTAL :" +msgstr " TOTALE :" + +#: lib/timevar.c:561 +#, c-format +msgid "time in %s: %ld.%06ld (%ld%%)\n" +msgstr "tempo in %s: %ld.%06ld (%ld%%)\n" + +#~ msgid "%d shift/reduce conflict" +#~ msgid_plural "%d shift/reduce conflicts" +#~ msgstr[0] "%d conflitto shift/riduzione" +#~ msgstr[1] "%d conflitti shift/riduzione" + +#~ msgid "and" +#~ msgstr "e" + +#~ msgid "conflicts: " +#~ msgstr "conflitti: " + +#~ msgid "State %d contains " +#~ msgstr "Lo stato %d contiene" + +#~ msgid "%s: no grammar file given\n" +#~ msgstr "%s: nessun file grammatica specificato\n" + +#~ msgid "%s: extra arguments ignored after `%s'\n" +#~ msgstr "%s: ignorati gli argomenti successivi a `%s'\n" + +#~ msgid "too many gotos (max %d)" +#~ msgstr "troppi goto (max %d)" + +#~ msgid "two @prec's in a row" +#~ msgstr "due @prec di seguito" + +#~ msgid "only one %%dprec allowed per rule" +#~ msgstr "solo un %%dprec è permesso in una regola" + +#~ msgid "too many symbols (tokens plus nonterminals); maximum %d" +#~ msgstr "troppi simboli (token e nonterminali); il massimo è %d" + +#~ msgid ": unexpected end of file in a comment\n" +#~ msgstr ": fine del file inattesa in un commento\n" + +#~ msgid ": unexpected end of file in a string\n" +#~ msgstr ": fine del file inattesa in una stringa\n" + +#~ msgid ": unexpected end of file in a character\n" +#~ msgstr ": fine del file inattesa in un carattere\n" + +#~ msgid ": unexpected end of file in a braced code\n" +#~ msgstr ": fine del file inattesa in codice (tra parentesi graffe)\n" + +#~ msgid ": unexpected end of file in a prologue\n" +#~ msgstr ": fine del file inattesa nel prologo\n" + +#~ msgid "%s is invalid" +#~ msgstr "%s non è valido" + +#~ msgid "too many states (max %d)" +#~ msgstr "troppi stati (massimo %d)" diff --git a/src/apps/bin/bison/po/ja.gmo b/src/apps/bin/bison/po/ja.gmo new file mode 100644 index 0000000000000000000000000000000000000000..0cd515c354cc21fbf4427a726c88526321fd89de GIT binary patch literal 6792 zcmd53#ISdk~GkI%sRXsf(XH(1}C;0hldbS#=GO)A-gl%nb{;; z390;Rf3#IqXjM_Qa&jjGvuW%Y$Lsi+IDW0|b<*YmG=zr&3AQ1~21HYl_B(fGy&ESk z6~M*75Rle?2~>c)fgE@O z_(R~OU+~T=@v#aBky#A56lehP#~N|_4e)v3kAQbx#@HW$VPFdw&H@+Vy&1|Z0Uiea z0r&}!&Uxkv=mzWpehYXINawukub&2f1@D)9k+Exl*8)lY5+GD#wZNNzj{v^}`~{Hg z^?Tq|z-_?mfbBri{{WEAc@KC!FaRcq$V!1LfVTs`3QPgXzP|$A4D14a7x+Gq1F!rt zV>bYUK(hCvK=PXnd=d&g34|%xzaR|ZMG%JYa^SVVtAKR=5?~4NLEsO7n}J^kJ_{r{ zT7e|@kdJQxZ^Zk>Fbc(k0wlYx2GV*GNPhSWkoL>^-{1A|nyWqf6)8H|!!6}zdmL7@HqmxQ#d~ulTHeYN9*rG+;Y~bq` z+e>&{O=lU7 zX2o?wjS=|;mhIwoI%WPl2<&pM$6{JUjd3&K=+IeF_~H;GpfAQoHKs#@^S<~i>lcSe z^{}bg#uA6Cv6#6D*5j%bNyat9@wS;G1}W^O#_RP+(oDj9bV%`6OZ#b3w=~c!w1=X6 zh69y{`DdqIP{IodS8T1MVQC>VV(359=1k@p$W!!!-=#hQ>EQB`|G*^NA6sqr}0O9SkF?~zqDaFxeQBa*kJ9W^(dV?&PEj3cU5 z$Fx!<+=*%i*Bx@k+-iUh!3Rz*fZO3cj(sdAzo{Ct%~HTw+b9!p87Jm(>J@*XF- z))XSsF5#PWCn{sy=9{9LrO_cNt|k(iYO(4BsY+oNH^Z7;9^hPwmcXh}EtcT&3hQwqqSdFy36lg6`+Z&K}j%h4kRasTxv2kuEw2W1xDGDRe>=V)nBNgmOS2sWTgQDSCDYG8W{-d!`)dX$aAw~!f!=8}+(PSDYY z8rPJBr8VfAm)F!*tb%f!<2|9lg8l-em0sVBVuDh_?Nq$pjM=nDOzvSSG2K8g7GGhL z(mfxjeEs!Af;xcQ4LSNoO|lz4yRTdk{~RNo?2sZhs%9sFym1K_k&!$~be$#yvE zxgq&hSJbZj$%-{~EAFkVs;qmIBmGuY)~%^nyOyu2uH`Fu&5GK(%9ZP?R@CyEb+w4i z3X55-o#H04swmV!w$9jKn41iE({{8t*DTAl*g9K{Xyqu0{ITkqy2|P` zkC&E~;?Sy!09((z;&TJlp?j$g-3US!QVkM16fdlW`y8XDk?aSau2&{@r0A|?q1iEH3uCvT-?n{Bsp5Civ3K3HK-2aQmRnSS-vMN z;wVx{jm0&npF%x|s!8Y?X2@knParpNuGfsc>|xlEnjqY2NFVA3l?uO}GPGXgiE*w1 z)Vm?K?9dU!wdc9T6g*Kq6qVh~3qoci_h>R;UINkSa6bw`xC9|7Yb{w)9s+$)kP*ie z=2BaKc#!fH?cfUqt^8frQ$O=0kzRMA=#-{`LZBmmDSaIaDx5=3GN8Q5$}6c6xbpaU zJTk5w6)AL%3ci?ZfzL_9SBXh&Xe{#G&Ff86e$}@1h(R7s#_KWSz(R6{BGqV8@`|$; zCk&}V9)O!`Eb|G}5~VV%JmgjPa$abWWu-R<8vwOM}5%l;Ew((lTBaEMIz?61+Va1ff!^ZPclk6zG;JWkF@>ojh1p z9t?s9_du0uJ4zk0+D6|nt#W>!s@us88h=!ct9Dd(RDM?qkKudb^`(@Vo3#2;Lo0nE zaW{C4ND_&t)M;wGoIju@RFqeZ-}QugPfV9}DzLh8bwxq%veIB+CG}JThay|bxub1% zZbDbojb%I(rB3B6uUNNId7!31NYXWEmQrDa%&;`-9rfs$HL)b(L|KKth~djf$X9!L z*)r}uE)OmXFwrDViN7}}?ooJ_TklC_Cx(F?Mf&QC5vde0XfD$PUkTH}!XQ{%!s`ZNX^9+&|fxZEY4gx5+)~ zw!0_YSrpK@F?Zz9K)UZ0k-hNOqE&y~6%);8dOr{|Z686lyhJ$V97;0E#6Px!)=((;IXtjgfe2z}?pMiqD z3(@&H$>=E_d=XXoDL0!LZ4|kV?rdh)Oy9(dr^QTPrthzwks7xK7=35%yY8&pT#!Hv zjih^ziJY`*x@)_P7>cWDaiDR_V2jAeaLG{wG2aZpw9v4lzX|(YzVgJ%Eie6vRF6XJ;?WGH<{w47Oa%xZB;=+_&6m zB=fL5f)(uiDf905$KwZy#qDrg+$mTP$9KN8e=;xW!UJ#q2;|_9d%*2?o3T@_YqCEJ z4e457&TT*1+1Wm|YfKt;W_(BHj2O+Iw(yMW&$eQwwRz+NxO>(;=1z%WGHl&Pe*14-=eC$IiG^33J zO_?*f2{F-fFq;wSfi!}}EB_sj2aqn)V!}P_PQnV^z+rcr`<%Ol3J-B-xAt`-NcJP~ z2Su)Dru{UiyFuF_W->3pJniD7*aj0dPowJRvaj~MA}0J+h5kcZ^laNb+_yuV7&|u5 zG?4B%iRZZuC4Gl@r@%qhMq>k`H2yHN~l=56k<|Znxv4NcUy1pVyc>*zOPUCvxq*BZtKfudcaUAQ+Sw zKPa2^5Savpwt3HcBHgxA)=p~Z{YS@o2bw%hG1}$ZEyuu+>mO(C8}6I#Bnk;i;I1*z z3wg*#z37Epq_bOlKgjH#8yLJVgJ%&OAdziiR34t*KiRf-uHyTX1U4A;RqWj}C@Bym za$}!syjN_8FQ*%~h;A8He)_?Le(`5LAMQJXp@-$`h_p}|(w+u`Zyk|t+>*~+ug(;S z(}V-|G;Wb%(y+5P?-#!?c^mrjd0|fK&z-kkPFNFU3Dks1So|G#Dx2v%lbaRkyaK+> z<}=MBm$672?V9x!@C@4eLg&OBE7^TwP8%}V`Jao_%g=3j4yle8N4dQR(A3hyM>^hy g1>ua=6Jm1UBUlY4FY+>?N~F&-K>N!b?;~FR1M}t#UjP6A literal 0 HcmV?d00001 diff --git a/src/apps/bin/bison/po/ja.po b/src/apps/bin/bison/po/ja.po new file mode 100644 index 0000000000..bd9a959730 --- /dev/null +++ b/src/apps/bin/bison/po/ja.po @@ -0,0 +1,1080 @@ +# Japanese message for GNU bison 1.30f +# Copyright (C) 2001 Free Software Foundation, Inc. +# Daisuke Yamashita , 2001. +# +msgid "" +msgstr "" +"Project-Id-Version: GNU bison 1.30f\n" +"Report-Msgid-Bugs-To: bug-bison@gnu.org\n" +"POT-Creation-Date: 2004-05-21 10:26-0700\n" +"PO-Revision-Date: 2002-10-29 01:00-05:00\n" +"Last-Translator: Daisuke Yamashita \n" +"Language-Team: Japanese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=EUC-JP\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: src/complain.c:51 src/complain.c:66 +msgid "warning: " +msgstr "·Ù¹ð: " + +#: src/complain.c:122 src/complain.c:138 +msgid "fatal error: " +msgstr "Ã×̿Ū¥¨¥é¡¼: " + +#: src/conflicts.c:76 +#, fuzzy, c-format +msgid " Conflict between rule %d and token %s resolved as shift" +msgstr "¾õÂÖ %d ¤Îµ¬Â§ %d ¤È¥È¡¼¥¯¥ó %s ¤Î¶¥¹ç¤ò%s¤È¤·¤Æ²ò·è¡£\n" + +#: src/conflicts.c:84 +#, fuzzy, c-format +msgid " Conflict between rule %d and token %s resolved as reduce" +msgstr "¾õÂÖ %d ¤Îµ¬Â§ %d ¤È¥È¡¼¥¯¥ó %s ¤Î¶¥¹ç¤ò%s¤È¤·¤Æ²ò·è¡£\n" + +#: src/conflicts.c:91 +#, fuzzy, c-format +msgid " Conflict between rule %d and token %s resolved as an error" +msgstr "¾õÂÖ %d ¤Îµ¬Â§ %d ¤È¥È¡¼¥¯¥ó %s ¤Î¶¥¹ç¤ò%s¤È¤·¤Æ²ò·è¡£\n" + +#: src/conflicts.c:399 +#, c-format +msgid "conflicts: %d shift/reduce, %d reduce/reduce\n" +msgstr "" + +#: src/conflicts.c:402 +#, fuzzy, c-format +msgid "conflicts: %d shift/reduce\n" +msgstr " %d ¥·¥Õ¥È/´Ô¸µ" + +#: src/conflicts.c:404 +#, fuzzy, c-format +msgid "conflicts: %d reduce/reduce\n" +msgstr " %d ´Ô¸µ/´Ô¸µ" + +#: src/conflicts.c:422 +#, fuzzy, c-format +msgid "State %d " +msgstr "¾õÂÖ %d" + +#: src/conflicts.c:487 +#, c-format +msgid "%%expect-rr applies only to GLR parsers" +msgstr "" + +#: src/conflicts.c:511 +#, fuzzy, c-format +msgid "expected %d shift/reduce conflict" +msgid_plural "expected %d shift/reduce conflicts" +msgstr[0] "ËÜÍè %d ¸Ä¤Î¥·¥Õ¥È/´Ô¸µ¾×ÆÍ¤Ç¤¢¤ë¤Ï¤º¤Ç¤¹\n" + +#: src/conflicts.c:515 +#, fuzzy, c-format +msgid "expected %d reduce/reduce conflict" +msgid_plural "expected %d reduce/reduce conflicts" +msgstr[0] "%d ´Ô¸µ/´Ô¸µ¾×ÆÍ" + +#: src/files.c:100 +#, c-format +msgid "cannot open file `%s'" +msgstr "¥Õ¥¡¥¤¥ë `%s' ¤ò³«¤±¤Þ¤»¤ó" + +#: src/files.c:116 +#, fuzzy +msgid "I/O error" +msgstr "¥¨¥é¡¼" + +#: src/files.c:119 +msgid "cannot close file" +msgstr "¥Õ¥¡¥¤¥ë¤òÊĤ¸¤ë¤³¤È¤¬¤Ç¤­¤Þ¤»¤ó" + +#: src/files.c:337 +#, fuzzy, c-format +msgid "conflicting outputs to file %s" +msgstr "Èó·ë¹çÃÍ %s ¤È %s ¤Ç¶¥¹ç¤¬À¸¤¸¤Æ¤¤¤Þ¤¹" + +#: src/getargs.c:186 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "`%s --help' ¤Ç¾ÜºÙ¾ðÊó¤ò»²¾È¤·¤Æ¤¯¤À¤µ¤¤\n" + +#: src/getargs.c:192 +msgid "GNU bison generates parsers for LALR(1) grammars.\n" +msgstr "GNU bison ¤Ï LALR(1) ʸˡ¤Î¹½Ê¸²òÀÏ´ï¤òÀ¸À®¤·¤Þ¤¹¡£\n" + +#: src/getargs.c:196 +#, c-format +msgid "Usage: %s [OPTION]... FILE\n" +msgstr "»È¤¤Êý: %s [¥ª¥×¥·¥ç¥ó]... ¥Õ¥¡¥¤¥ë\n" + +#: src/getargs.c:200 +msgid "" +"If a long option shows an argument as mandatory, then it is mandatory\n" +"for the equivalent short option also. Similarly for optional arguments.\n" +msgstr "" +"¥í¥ó¥°¥ª¥×¥·¥ç¥ó¤Çɬ¿Ü¤Î°ú¿ô¤¬¼¨¤µ¤ì¤Æ¤¤¤ì¤Ð¡¢Æ±¤¸°ÕÌ£¤Î¥·¥ç¡¼¥È¥ª¥×¥·¥ç¥ó\n" +"¤Ç¤âƱÍͤËɬ¿Ü¤Î°ú¿ô¤È¤Ê¤ê¤Þ¤¹¡£É¬¿Ü¤Ç¤Ê¤¤ÁªÂòŪ°ú¿ô¤Ç¤âƱÍͤǤ¹¡£\n" + +#: src/getargs.c:206 +msgid "" +"Operation modes:\n" +" -h, --help display this help and exit\n" +" -V, --version output version information and exit\n" +" -y, --yacc emulate POSIX yacc\n" +msgstr "" +"Áàºî¥â¡¼¥É:\n" +" -h, --help ¤³¤Î»È¤¤Êý¤òɽ¼¨¤·¤Æ½ªÎ»¤¹¤ë\n" +" -V, --version ¥Ð¡¼¥¸¥ç¥ó¾ðÊó¤òɽ¼¨¤·¤Æ½ªÎ»¤¹¤ë\n" +" -y, --yacc POSIX yacc ¤ò¥¨¥ß¥å¥ì¥¤¥È¤¹¤ë\n" + +#: src/getargs.c:213 +msgid "" +"Parser:\n" +" -S, --skeleton=FILE specify the skeleton to use\n" +" -t, --debug instrument the parser for debugging\n" +" --locations enable locations computation\n" +" -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n" +" -l, --no-lines don't generate `#line' directives\n" +" -n, --no-parser generate the tables only\n" +" -k, --token-table include a table of token names\n" +msgstr "" +"¹½Ê¸²òÀÏ´ï:\n" +" -S, --skeleton=FILE ÍøÍѤ¹¤ë¥¹¥±¥ë¥È¥ó¤ò»ØÄꤹ¤ë\n" +" -t, --debug ¹½Ê¸²òÀϤΥǥХå°ÍѤμêÃÊ\n" +" --locations ·×»»·ë²Ì°ÌÃÖ¤òÍ­¸ú¤Ë¤¹¤ë\n" +" -p, --name-prefix=PREFIX PREFIX ¤ò³°Éô¥·¥ó¥Ü¥ë¤È¤·¤ÆÀèÆ¬¤ËÁÞÆþ¤¹¤ë\n" +" -l, --no-lines `#line' ¥Ç¥£¥ì¥¯¥Æ¥£¥Ö¤òÀ¸À®¤·¤Ê¤¤\n" +" -n, --no-parser ¥Æ¡¼¥Ö¥ë¤Î¤ß¤òÀ¸À®¤¹¤ë\n" +" -k, --token-table ¥È¡¼¥¯¥ó̾¤Î¥Æ¡¼¥Ö¥ë¤ò´Þ¤á¤ë\n" + +#: src/getargs.c:225 +#, fuzzy +msgid "" +"Output:\n" +" -d, --defines also produce a header file\n" +" -r, --report=THINGS also produce details on the automaton\n" +" -v, --verbose same as `--report=state'\n" +" -b, --file-prefix=PREFIX specify a PREFIX for output files\n" +" -o, --output=FILE leave output to FILE\n" +" -g, --graph also produce a VCG description of the " +"automaton\n" +msgstr "" +"½ÐÎÏ:\n" +" -d, --defines ¥Ø¥Ã¥À¥Õ¥¡¥¤¥ë¤âºîÀ®¤¹¤ë\n" +" -v, --verbose ¥ª¡¼¥È¥Þ¥È¥ó¤Î²òÀâ¤âºîÀ®¤¹¤ë\n" +" -b, --file-prefix=PREFIX ½ÐÎÏ¥Õ¥¡¥¤¥ë¤Î PREFIX(ÀÜÆ¬¼­) ¤ò»ØÄꤹ¤ë\n" +" -o, --output=FILE ½ÐÎÏÀè¤ò FILE ¤È¤¹¤ë\n" +" -g, --graph ¥ª¡¼¥È¥Þ¥È¥ó¤Î VCG µ­½Ò»Ò¤âºîÀ®¤¹¤ë\n" + +#: src/getargs.c:236 +msgid "" +"THINGS is a list of comma separated words that can include:\n" +" `state' describe the states\n" +" `itemset' complete the core item sets with their closure\n" +" `lookahead' explicitly associate lookaheads to items\n" +" `solved' describe shift/reduce conflicts solving\n" +" `all' include all the above information\n" +" `none' disable the report\n" +msgstr "" + +#: src/getargs.c:247 +msgid "Report bugs to .\n" +msgstr "¥Ð¥°¥ì¥Ý¡¼¥È¤Ï ¤Þ¤Ç¡£\n" + +#: src/getargs.c:264 +#, c-format +msgid "bison (GNU Bison) %s" +msgstr "bison (GNU Bison) %s" + +#: src/getargs.c:266 +msgid "Written by Robert Corbett and Richard Stallman.\n" +msgstr "" + +#: src/getargs.c:270 +#, fuzzy, c-format +msgid "Copyright (C) %d Free Software Foundation, Inc.\n" +msgstr "" +"Copyright 1984, 1986, 1989, 1992, 2000, 2001 Free Software Foundation, Inc.\n" + +#: src/getargs.c:272 +msgid "" +"This is free software; see the source for copying conditions. There is NO\n" +"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +msgstr "" +"This is free software; see the source for copying conditions. There is NO\n" +"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +"[»²¹ÍÌõ -- ˡŪ¸úÎϤϱÑʸ¤¬Å¬ÍѤµ¤ì¤Þ¤¹]\n" +"¤³¤ì¤Ï¥Õ¥ê¡¼¥½¥Õ¥È¥¦¥§¥¢¤Ç¤¹ -- Ê£À½¤Ë¤Ä¤¤¤Æ¤Î¾ò·ï¤Ï¥½¡¼¥¹¤ò¸«¤Þ¤·¤ç¤¦¡£\n" +"°ìÀÚ¤ÎÊݾڤϤ¢¤ê¤Þ¤»¤ó -- ¾¦¶ÈÀ­¤äÌÜŪŬ¹çÀ­¤Ë¤Ä¤¤¤Æ¤ÎÊݾڤ¹¤é¤¢¤ê¤Þ¤»¤ó¡£\n" + +#: src/getargs.c:438 +#, c-format +msgid "missing operand after `%s'" +msgstr "" + +#: src/getargs.c:440 +#, c-format +msgid "extra operand `%s'" +msgstr "" + +#: src/gram.c:139 +msgid "empty" +msgstr "¶õ" + +#: src/gram.c:233 +msgid "Grammar" +msgstr "ʸˡ" + +#: src/gram.c:321 src/reduce.c:394 +#, fuzzy +msgid "warning" +msgstr "·Ù¹ð: " + +#: src/main.c:124 +#, fuzzy +msgid "rule never reduced because of conflicts" +msgstr " 1 ´Ô¸µ/´Ô¸µ¾×ÆÍ" + +#: src/parse-gram.y:363 +msgid "POSIX forbids declarations in the grammar" +msgstr "" + +#: src/parse-gram.y:486 +msgid "missing identifier in parameter declaration" +msgstr "" + +#: src/print.c:49 +#, c-format +msgid " type %d is %s\n" +msgstr " ¥¿¥¤¥× %d ¤Ï %s ¤Ç¤¹\n" + +#: src/print.c:165 +#, fuzzy, c-format +msgid "shift, and go to state %d\n" +msgstr " %-4s\t¥·¥Õ¥È¡¢¤ª¤è¤Ó¾õÂÖ %d ¤Ø\n" + +#: src/print.c:167 +#, fuzzy, c-format +msgid "go to state %d\n" +msgstr " $ \t¾õÂÖ %d ¤Ø\n" + +#: src/print.c:204 +#, fuzzy +msgid "error (nonassociative)\n" +msgstr "%-4s\t¥¨¥é¡¼ (Èó·ë¹ç)" + +#: src/print.c:292 +#, fuzzy, c-format +msgid "reduce using rule %d (%s)" +msgstr "$default\tµ¬Â§ %d ¤òÍøÍѤ·¤Æ´Ô¸µ (%s)" + +#: src/print.c:294 +#, c-format +msgid "accept" +msgstr "" + +#: src/print.c:325 src/print.c:391 +msgid "$default" +msgstr "" + +#: src/print.c:420 +#, c-format +msgid "state %d" +msgstr "¾õÂÖ %d" + +#: src/print.c:456 +msgid "Terminals, with rules where they appear" +msgstr "½Ð¸½°ÌÃ֤ε¬Â§¤Ë¤è¤ë½ªÃ¼" + +#: src/print.c:483 +msgid "Nonterminals, with rules where they appear" +msgstr "½Ð¸½°ÌÃ֤ε¬Â§¤Ë¤è¤ëÈó½ªÃ¼" + +#: src/print.c:512 +#, c-format +msgid " on left:" +msgstr " º¸ÊÕ:" + +#: src/print.c:527 +#, c-format +msgid " on right:" +msgstr " ±¦ÊÕ:" + +#: src/print.c:555 +#, fuzzy +msgid "Rules never reduced" +msgstr "%d ¸Ä¤Îµ¬Â§¤Ï·è¤·¤Æ´Ô¸µ¤µ¤ì¤Þ¤»¤ó\n" + +#: src/reader.c:56 +#, c-format +msgid "multiple %s declarations" +msgstr "%s ¤¬Ê£¿ô¸ÄÀë¸À¤µ¤ì¤Þ¤·¤¿" + +#: src/reader.c:118 +#, c-format +msgid "result type clash on merge function %s: <%s> != <%s>" +msgstr "" + +#: src/reader.c:216 +#, c-format +msgid "rule given for %s, which is a token" +msgstr "%s ¤Ëµ¬Â§¤¬Í¿¤¨¤é¤ì¡¢¤½¤ì¤Ï¥È¡¼¥¯¥ó¤È¤Ê¤ê¤Þ¤¹" + +#: src/reader.c:245 +#, fuzzy, c-format +msgid "type clash on default action: <%s> != <%s>" +msgstr "½é´ü¾õÂÖ¤ÎÆ°ºî¤Ç¤Ï·¿ (`%s' `%s') ¤¬¾×ÆÍ¤·¤Þ¤¹" + +#: src/reader.c:251 +msgid "empty rule for typed nonterminal, and no action" +msgstr "¶õ¤Î·¿ÉÕ¤­Èó½ªÃ¼¥¢¥¤¥Æ¥àÍѵ¬Â§¤Ç¤¢¤ê¡¢Æ°ºî¤¬µ¯¤ê¤Þ¤»¤ó" + +#: src/reader.c:321 src/reader.c:335 src/reader.c:348 +#, c-format +msgid "only one %s allowed per rule" +msgstr "" + +#: src/reader.c:331 src/reader.c:346 +#, c-format +msgid "%s affects only GLR parsers" +msgstr "" + +#: src/reader.c:333 +#, c-format +msgid "%s must be followed by positive number" +msgstr "" + +#: src/reader.c:490 +msgid "no rules in the input grammar" +msgstr "ÆþÎϤ·¤¿Ê¸Ë¡¤Ëµ¬Â§¤¬ÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#: src/reduce.c:242 +#, fuzzy +msgid "useless rule" +msgstr "%d ¸Ä¤Î̵°ÕÌ£¤Êµ¬Â§" + +#: src/reduce.c:303 +#, fuzzy, c-format +msgid "useless nonterminal: %s" +msgstr "̵°ÕÌ£¤ÊÈó½ªÃ¼»Ò:" + +#: src/reduce.c:351 +#, fuzzy +msgid "Useless nonterminals" +msgstr "̵°ÕÌ£¤ÊÈó½ªÃ¼»Ò:" + +#: src/reduce.c:364 +#, fuzzy +msgid "Terminals which are not used" +msgstr "ÍøÍѤµ¤ì¤Ê¤¤½ªÃ¼»Ò:" + +#: src/reduce.c:373 +#, fuzzy +msgid "Useless rules" +msgstr "̵°ÕÌ£¤Êµ¬Â§:" + +#: src/reduce.c:389 +#, c-format +msgid "%d rule never reduced\n" +msgid_plural "%d rules never reduced\n" +msgstr[0] "%d ¸Ä¤Îµ¬Â§¤Ï·è¤·¤Æ´Ô¸µ¤µ¤ì¤Þ¤»¤ó\n" + +#: src/reduce.c:397 +#, c-format +msgid "%d useless nonterminal" +msgid_plural "%d useless nonterminals" +msgstr[0] "%d ¸Ä¤Î̵°ÕÌ£¤ÊÈó½ªÃ¼»Ò" + +#: src/reduce.c:403 +#, c-format +msgid " and " +msgstr "¤ª¤è¤Ó" + +#: src/reduce.c:406 +#, c-format +msgid "%d useless rule" +msgid_plural "%d useless rules" +msgstr[0] "%d ¸Ä¤Î̵°ÕÌ£¤Êµ¬Â§" + +#: src/reduce.c:436 +#, fuzzy, c-format +msgid "start symbol %s does not derive any sentence" +msgstr "³«»Ï¥·¥ó¥Ü¥ë %s ¤Ï¤É¤Îʸ¤Ë¤âͳÍ褷¤Þ¤»¤ó" + +#: src/scan-gram.l:162 +msgid "stray `,' treated as white space" +msgstr "" + +#: src/scan-gram.l:225 +#, fuzzy, c-format +msgid "invalid directive: %s" +msgstr "ÉÔŬÀÚ¤ÊÆþÎÏ: %s" + +#: src/scan-gram.l:283 +#, fuzzy, c-format +msgid "invalid character: %s" +msgstr "̤ÃΤÎʸ»ú: %s" + +#: src/scan-gram.l:402 +#, fuzzy +msgid "invalid null character" +msgstr "%s ¤ÎÀë¸À¤¬ÉÔŬÀڤǤ¹" + +#: src/scan-gram.l:415 src/scan-gram.l:427 src/scan-gram.l:448 +#, fuzzy, c-format +msgid "invalid escape sequence: %s" +msgstr "ÉÔŬÀÚ¤ÊÆþÎÏ: %s" + +#: src/scan-gram.l:417 src/scan-gram.l:429 src/scan-gram.l:450 +#, fuzzy, c-format +msgid "invalid null character: %s" +msgstr "ÉÔŬÀÚ¤ÊÆþÎÏ: %s" + +#: src/scan-gram.l:455 +#, fuzzy, c-format +msgid "unrecognized escape sequence: %s" +msgstr "ǧ¼±¤Ç¤­¤Ê¤¤: %s" + +#: src/scan-gram.l:537 +#, c-format +msgid "missing `{' in `%s'" +msgstr "" + +#: src/scan-gram.l:782 +#, c-format +msgid "$$ of `%s' has no declared type" +msgstr "`%s' ¤Î $$ ¤ËÀë¸À¤Î¤Ê¤¤·¿¤¬¤¢¤ê¤Þ¤¹" + +#: src/scan-gram.l:803 +#, c-format +msgid "$%d of `%s' has no declared type" +msgstr "$%d ¸Ä¤Î `%s' ¤¬Àë¸À¤µ¤ì¤¿·¿¤ò»ý¤Ã¤Æ¤¤¤Þ¤»¤ó" + +#: src/scan-gram.l:812 src/scan-gram.l:881 src/scan-gram.l:932 +#, c-format +msgid "integer out of range: %s" +msgstr "" + +#: src/scan-gram.l:848 src/scan-gram.l:916 +#, fuzzy, c-format +msgid "invalid value: %s" +msgstr "ÉÔŬÀÚ¤Ê $ ¤ÎÃÍ" + +#: src/scan-gram.l:1036 +#, fuzzy, c-format +msgid "missing `%s' at end of file" +msgstr "ÊĤ¸¤é¤ì¤Æ¤¤¤Ê¤¤Ê¸»úÎ󤬥ե¡¥¤¥ëËöÈø¤Ë¤¢¤ê¤Þ¤¹" + +#: src/scan-gram.l:1047 +#, fuzzy, c-format +msgid "missing `%s' at end of line" +msgstr "ÊĤ¸¤é¤ì¤Æ¤¤¤Ê¤¤Ê¸»úÎ󤬥ե¡¥¤¥ëËöÈø¤Ë¤¢¤ê¤Þ¤¹" + +#: src/symlist.c:97 src/symlist.c:108 +msgid "invalid $ value" +msgstr "ÉÔŬÀÚ¤Ê $ ¤ÎÃÍ" + +#: src/symtab.c:85 +#, c-format +msgid "type redeclaration for %s" +msgstr "%s ¤Î·¿¤¬ºÆÄêµÁ¤µ¤ì¤Þ¤·¤¿" + +#: src/symtab.c:102 src/symtab.c:120 +#, fuzzy, c-format +msgid "%s redeclaration for %s" +msgstr "%s ¤Î·¿¤¬ºÆÄêµÁ¤µ¤ì¤Þ¤·¤¿" + +#: src/symtab.c:139 +#, c-format +msgid "redefining precedence of %s" +msgstr "%s ¤ËÀè¹Ô¤·¤¿ºÆÄêµÁ¤Ç¤¹" + +#: src/symtab.c:157 +#, c-format +msgid "symbol %s redefined" +msgstr "¥·¥ó¥Ü¥ë %s ¤¬ºÆÄêµÁ¤µ¤ì¤Þ¤·¤¿" + +#: src/symtab.c:180 +#, fuzzy, c-format +msgid "redefining user token number of %s" +msgstr "%s ¤ËÀè¹Ô¤·¤¿ºÆÄêµÁ¤Ç¤¹" + +#: src/symtab.c:207 +#, c-format +msgid "symbol %s is used, but is not defined as a token and has no rules" +msgstr "" +"¥·¥ó¥Ü¥ë %s ¤¬»È¤ï¤ì¤Æ¤¤¤Þ¤¹¤¬¡¢¥È¡¼¥¯¥ó¤È¤·¤ÆÄêµÁ¤µ¤ì¤Æ¤ª¤é¤º¡¢µ¬Â§¤ò»ý¤Á¤Þ" +"¤»¤ó" + +#: src/symtab.c:232 +#, c-format +msgid "symbol `%s' used more than once as a literal string" +msgstr "¥·¥ó¥Ü¥ë `%s' ¤Ï¥ê¥Æ¥é¥ëʸ»úÎó¤È¤·¤ÆÊ£¿ô²ó»È¤ï¤ì¤Þ¤·¤¿" + +#: src/symtab.c:235 +#, c-format +msgid "symbol `%s' given more than one literal string" +msgstr "¥·¥ó¥Ü¥ë `%s' ¤ÏÊ£¿ô¤Î¥ê¥Æ¥é¥ëʸ»úÎó¤¬Í¿¤¨¤é¤ì¤Þ¤·¤¿" + +#: src/symtab.c:271 +#, c-format +msgid "conflicting precedences for %s and %s" +msgstr "Àè¹Ô¤·¤Æ¤¤¤ë %s ¤È %s ¤Ç¶¥¹ç¤¬À¸¤¸¤Æ¤¤¤Þ¤¹" + +#: src/symtab.c:283 +#, fuzzy, c-format +msgid "conflicting associativities for %s (%s) and %s (%s)" +msgstr "Èó·ë¹çÃÍ %s ¤È %s ¤Ç¶¥¹ç¤¬À¸¤¸¤Æ¤¤¤Þ¤¹" + +#: src/symtab.c:368 +#, c-format +msgid "tokens %s and %s both assigned number %d" +msgstr "¥È¡¼¥¯¥ó %s ¤È %s ¤ÎÁÐÊý¤¬ÈÖ¹æ %d ¤Ë³ä¤êÅö¤Æ¤é¤ì¤Þ¤·¤¿" + +#: src/symtab.c:591 +#, c-format +msgid "the start symbol %s is undefined" +msgstr "³«»Ï¥·¥ó¥Ü¥ë %s ¤ÏÄêµÁ¤µ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#: src/symtab.c:595 +#, c-format +msgid "the start symbol %s is a token" +msgstr "³«»Ï¥·¥ó¥Ü¥ë %s ¤Ï¥È¡¼¥¯¥ó¤Ç¤¹" + +#: lib/argmatch.c:133 +#, fuzzy, c-format +msgid "invalid argument %s for %s" +msgstr "ÉÔŬÀÚ¤ÊÆþÎÏ: %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "" + +#: lib/bitset_stats.c:179 +#, c-format +msgid "%u bitset_allocs, %u freed (%.2f%%).\n" +msgstr "" + +#: lib/bitset_stats.c:182 +#, c-format +msgid "%u bitset_sets, %u cached (%.2f%%)\n" +msgstr "" + +#: lib/bitset_stats.c:185 +#, c-format +msgid "%u bitset_resets, %u cached (%.2f%%)\n" +msgstr "" + +#: lib/bitset_stats.c:188 +#, c-format +msgid "%u bitset_tests, %u cached (%.2f%%)\n" +msgstr "" + +#: lib/bitset_stats.c:192 +#, c-format +msgid "%u bitset_lists\n" +msgstr "" + +#: lib/bitset_stats.c:194 +msgid "count log histogram\n" +msgstr "" + +#: lib/bitset_stats.c:197 +msgid "size log histogram\n" +msgstr "" + +#: lib/bitset_stats.c:200 +msgid "density histogram\n" +msgstr "" + +#: lib/bitset_stats.c:214 +#, c-format +msgid "" +"Bitset statistics:\n" +"\n" +msgstr "" + +#: lib/bitset_stats.c:217 +#, c-format +msgid "Accumulated runs = %u\n" +msgstr "" + +#: lib/bitset_stats.c:261 lib/bitset_stats.c:266 +msgid "Could not read stats file." +msgstr "" + +#: lib/bitset_stats.c:263 +#, c-format +msgid "Bad stats file size.\n" +msgstr "" + +#: lib/bitset_stats.c:289 lib/bitset_stats.c:291 +msgid "Could not write stats file." +msgstr "" + +#: lib/bitset_stats.c:294 +msgid "Could not open stats file for writing." +msgstr "" + +#: lib/error.c:127 +msgid "Unknown system error" +msgstr "ÉÔÌÀ¤Ê¥·¥¹¥Æ¥à¥¨¥é¡¼" + +#: lib/getopt.c:570 lib/getopt.c:589 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó `%s' ¤ÏÛ£Ëæ¤Ç¤¹\n" + +#: lib/getopt.c:622 lib/getopt.c:626 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó `--%s' ¤Ï°ú¿ô¤òµö¤·¤Þ¤»¤ó\n" + +#: lib/getopt.c:635 lib/getopt.c:640 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó `%c%s' ¤Ï°ú¿ô¤òµö¤·¤Þ¤»¤ó\n" + +#: lib/getopt.c:686 lib/getopt.c:708 lib/getopt.c:1039 lib/getopt.c:1061 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó `%s' ¤Ï°ú¿ô¤òÍ׵ᤷ¤Þ¤¹\n" + +#: lib/getopt.c:746 lib/getopt.c:749 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: ǧ¼±¤Ç¤­¤Ê¤¤¥ª¥×¥·¥ç¥ó `--%s' ¤Ç¤¹\n" + +#: lib/getopt.c:757 lib/getopt.c:760 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: ǧ¼±¤Ç¤­¤Ê¤¤¥ª¥×¥·¥ç¥ó `%c%s' ¤Ç¤¹\n" + +#: lib/getopt.c:815 lib/getopt.c:818 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: Äê³Ê³°¤Î¥ª¥×¥·¥ç¥ó -- %c\n" + +#: lib/getopt.c:824 lib/getopt.c:827 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ÉÔŬÀڤʥª¥×¥·¥ç¥ó -- %c\n" + +#: lib/getopt.c:882 lib/getopt.c:901 lib/getopt.c:1114 lib/getopt.c:1135 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó¤Ï°ú¿ô¤òÍ׵ᤷ¤Þ¤¹ -- %c\n" + +#: lib/getopt.c:954 lib/getopt.c:973 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó `-W %s' ¤ÏÛ£Ëæ¤Ç¤¹\n" + +#: lib/getopt.c:997 lib/getopt.c:1018 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: ¥ª¥×¥·¥ç¥ó `-W %s' ¤Ï°ú¿ô¤òµö¤·¤Þ¤»¤ó\n" + +#: lib/obstack.c:417 lib/obstack.c:420 lib/xmalloc.c:53 +msgid "memory exhausted" +msgstr "¥á¥â¥ê¤ò»È¤¤²Ì¤¿¤·¤Þ¤·¤¿" + +#: lib/quotearg.c:238 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:239 +msgid "'" +msgstr "'" + +#: lib/subpipe.c:171 +#, c-format +msgid "subsidiary program `%s' could not be invoked" +msgstr "" + +#: lib/subpipe.c:173 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "" + +#: lib/subpipe.c:175 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "" + +#: lib/subpipe.c:176 +#, c-format +msgid "subsidiary program `%s' failed (exit status %d)" +msgstr "" + +#: lib/timevar.c:475 +msgid "" +"\n" +"Execution times (seconds)\n" +msgstr "" + +#: lib/timevar.c:525 +msgid " TOTAL :" +msgstr "" + +#: lib/timevar.c:561 +#, c-format +msgid "time in %s: %ld.%06ld (%ld%%)\n" +msgstr "" + +#~ msgid "too many states (max %d)" +#~ msgstr "¾õÂÖ¤¬Â¿¤¹¤®¤Þ¤¹ (ºÇÂç %d)" + +#~ msgid "reduce" +#~ msgstr "´Ô¸µ" + +#~ msgid "shift" +#~ msgstr "¥·¥Õ¥È" + +#~ msgid "%d shift/reduce conflict" +#~ msgid_plural "%d shift/reduce conflicts" +#~ msgstr[0] "%d ¥·¥Õ¥È/´Ô¸µ¾×ÆÍ" + +#~ msgid "and" +#~ msgstr "¤ª¤è¤Ó" + +#~ msgid "State %d contains " +#~ msgstr "¾õÂÖ %d ¤¬´Þ¤à¤Î¤Ï " + +#~ msgid "conflicts: " +#~ msgstr "¾×ÆÍ: " + +#~ msgid "%s contains " +#~ msgstr "%s ¤ÎÃæ¿È¤Ï" + +#~ msgid " %-4s\t[reduce using rule %d (%s)]\n" +#~ msgstr " %-4s\t[µ¬Â§ %d ¤òÍøÍѤ·¤Æ´Ô¸µ (%s)]\n" + +#~ msgid "" +#~ " $default\treduce using rule %d (%s)\n" +#~ "\n" +#~ msgstr "" +#~ " $default\tµ¬Â§ %d ¤òÍøÍѤ·¤Æ´Ô¸µ (%s)\n" +#~ "\n" + +#~ msgid " %-4s\treduce using rule %d (%s)\n" +#~ msgstr " %-4s\tµ¬Â§ %d ¤òÍøÍѤ·¤Æ´Ô¸µ (%s)\n" + +#~ msgid " $default\treduce using rule %d (%s)\n" +#~ msgstr " $default\tµ¬Â§ %d ¤òÍøÍѤ·¤Æ´Ô¸µ (%s)\n" + +#~ msgid "`%s' is no longer supported" +#~ msgstr "`%s' ¤ÏºÇÁ᥵¥Ý¡¼¥È¤µ¤ì¤Þ¤»¤ó" + +#~ msgid "%s: no grammar file given\n" +#~ msgstr "%s: ʸˡ¥Õ¥¡¥¤¥ë¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó\n" + +#~ msgid "%s: extra arguments ignored after `%s'\n" +#~ msgstr "%s: `%s' ¤Î¸å¤í¤Î;ʬ¤Ê°ú¿ô¤Ï̵»ë¤µ¤ì¤Þ¤·¤¿\n" + +#~ msgid "too many gotos (max %d)" +#~ msgstr "goto ¤Î¿ô¤¬Â¿¤¹¤®¤Þ¤¹ (ºÇÂç %d)" + +#~ msgid "unexpected `/' found and ignored" +#~ msgstr "ͽ´ü¤·¤Ê¤¤ `/' ¤¬¸«¤Ä¤«¤ê¡¢Ìµ»ë¤µ¤ì¤Þ¤·¤¿" + +#~ msgid "unterminated comment" +#~ msgstr "ÊĤ¸¤Æ¤¤¤Ê¤¤¥³¥á¥ó¥È¤Ç¤¹" + +#~ msgid "unexpected end of file" +#~ msgstr "ͽ´ü¤·¤Ê¤¤¥Õ¥¡¥¤¥ë¤Î½ªÃ¼¤Ç¤¹" + +#~ msgid "unescaped newline in constant" +#~ msgstr "Äê¿ô¤ÎÃæ¤Ë¥¨¥¹¥±¡¼¥×¤µ¤ì¤Æ¤¤¤Ê¤¤²þ¹Ô¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "octal value outside range 0...255: `\\%o'" +#~ msgstr "8 ¿Ê¿ô¤ÎÃͤ¬ 0...255 ¤ÎÈϰϳ°¤Ç¤¹: `\\%o'" + +#~ msgid "hexadecimal value above 255: `\\x%x'" +#~ msgstr "16 ¿Ê¿ô¤ÎÃͤ¬ 255 ¤ò±Û¤¨¤Æ¤¤¤Þ¤¹: `\\x%x'" + +#~ msgid "unknown escape sequence: `\\' followed by `%s'" +#~ msgstr "̤ÃΤΥ¨¥¹¥±¡¼¥×¥·¡¼¥±¥ó¥¹: `\\' ¤Î¸å¤Ë `%s'" + +#~ msgid "unterminated type name at end of file" +#~ msgstr "ÊĤ¸¤é¤ì¤Æ¤¤¤Ê¤¤¥¿¥¤¥×̾¤¬¡¢¥Õ¥¡¥¤¥ëËöÈø¤Ë¤¢¤ê¤Þ¤¹" + +#~ msgid "unterminated type name" +#~ msgstr "ÊĤ¸¤é¤ì¤Æ¤¤¤Ê¤¤¥¿¥¤¥×̾¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "use \"...\" for multi-character literal tokens" +#~ msgstr "Ê£¿ôʸ»ú¤Î¥ê¥Æ¥é¥ë¥È¡¼¥¯¥ó¤Ë¤Ï \"...\" ¤ò»È¤¤¤Þ¤·¤ç¤¦" + +#~ msgid "`%s' supports no argument: %s" +#~ msgstr "`%s' ¤Ï°ú¿ô¤ò¼õ¤±ÉÕ¤±¤Þ¤»¤ó: %s" + +#~ msgid "`%s' requires an argument" +#~ msgstr "`%s' ¥ª¥×¥·¥ç¥ó¤Ï°ú¿ô¤òÍ׵ᤷ¤Þ¤¹" + +#~ msgid "maximum table size (%d) exceeded" +#~ msgstr "ºÇÂç¥Æ¡¼¥Ö¥ë¥µ¥¤¥º (%d) ¤òͤ¨¤Þ¤·¤¿" + +#~ msgid " (rule %d)" +#~ msgstr " (µ¬Â§ %d)" + +#~ msgid " $default\taccept\n" +#~ msgstr " $default\taccept\n" + +#~ msgid " NO ACTIONS\n" +#~ msgstr " ưºî̵¤·\n" + +#~ msgid " %-4s\terror (nonassociative)\n" +#~ msgstr " %-4s\t¥¨¥é¡¼ (Èó·ë¹ç)\n" + +#~ msgid " %-4s\tgo to state %d\n" +#~ msgstr " %-4s\t¾õÂÖ %d ¤Ø\n" + +#~ msgid "Number, Line, Rule" +#~ msgstr "ÈÖ¹æ, ¹Ô, µ¬Â§" + +#~ msgid " %3d %3d %s ->" +#~ msgstr " %3d %3d %s ->" + +#~ msgid " Skipping to next \\n" +#~ msgstr " ¼¡¤Î \\n ¤Ë¥¹¥­¥Ã¥×" + +#~ msgid " Skipping to next %c" +#~ msgstr " ¼¡¤Î %c ¤Ë¥¹¥­¥Ã¥×" + +#~ msgid "unterminated string" +#~ msgstr "ÊĤ¸¤é¤ì¤Æ¤¤¤Ê¤¤Ê¸»úÎó" + +#~ msgid "%s is invalid" +#~ msgstr "%s ¤ÏÉÔŬÀڤǤ¹" + +#~ msgid "unterminated `%{' definition" +#~ msgstr "`%{' ÄêµÁ ¤¬ÊĤ¸¤é¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "Premature EOF after %s" +#~ msgstr "%s ¤Î¸å¤í¤ËÁ᤯¤â EOF ¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "`%s' is invalid in %s" +#~ msgstr "`%s' ¤Ï %s Æâ¤Ç¤ÏÉÔŬÀڤǤ¹" + +#~ msgid "%type declaration has no " +#~ msgstr "%type Àë¸À¤Ë <¥¿¥¤¥×̾> ¤¬¤¢¤ê¤Þ¤»¤ó" + +#~ msgid "invalid %%type declaration due to item: %s" +#~ msgstr "¥¢¥¤¥Æ¥à¤Î°Ù¤Î %%type Àë¸À¤¬ÉÔŬÀڤǤ¹: %s" + +#~ msgid "invalid text (%s) - number should be after identifier" +#~ msgstr "ÉÔŬÀڤʥƥ­¥¹¥È (%s) - ¿ôÃͤϼ±Ê̻Ҥθå¤í¤Ë¤¢¤ë¤Ù¤­¤Ç¤¹" + +#~ msgid "unexpected item: %s" +#~ msgstr "ͽ´ü¤»¤Ì¥¢¥¤¥Æ¥à: %s" + +#~ msgid "unmatched %s" +#~ msgstr "Âбþ¤Î¤Ê¤¤ %s ¤Ç¤¹" + +#~ msgid "argument of %%expect is not an integer" +#~ msgstr "%%expect ¤Î°ú¿ô¤¬À°¿ôÃͤǤϤ¢¤ê¤Þ¤»¤ó" + +#~ msgid "unrecognized item %s, expected an identifier" +#~ msgstr "ǧ¼±¤Ç¤­¤Ê¤¤¥¢¥¤¥Æ¥à %s¡¢¤³¤³¤Ç¤Ï¼±Ê̻Ҥ¬´üÂÔ¤µ¤ì¤Þ¤¹" + +#~ msgid "expected string constant instead of %s" +#~ msgstr "¤³¤³¤Ç¤Ï %s ¤Ç¤Ï¤Ê¤¯Ê¸»úÎóÄê¿ô¤¬´üÂÔ¤µ¤ì¤Þ¤¹" + +#~ msgid "no input grammar" +#~ msgstr "ʸˡ¤ÎÆþÎϤ¬Ìµ¤¤" + +#~ msgid "unterminated %guard clause" +#~ msgstr "%guard À᤬ÊĤ¸¤é¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "ill-formed rule: initial symbol not followed by colon" +#~ msgstr "¼Ù°­¤Êµ¬Â§: ½é´ü²½¥·¥ó¥Ü¥ë¤Ë¥³¥í¥ó (:) ¤¬Â³¤¤¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "grammar starts with vertical bar" +#~ msgstr "ʸˡ¤Ï½ÄËÀ (|) ¤Ç»Ï¤á¤Þ¤¹" + +#~ msgid "two @prec's in a row" +#~ msgstr "@prec ¤Î¤â¤ÎÆó¤Ä¤¬Æ±Îó¤Ë¤Ê¤Ã¤Æ¤¤¤Þ¤¹" + +#~ msgid "%%guard present but %%semantic_parser not specified" +#~ msgstr "%%guard ¤¬¤¢¤ê¤Þ¤¹¤¬ %%semantic_parser ¤¬»ØÄꤵ¤ì¤Æ¤¤¤Þ¤»¤ó" + +#~ msgid "two actions at end of one rule" +#~ msgstr "°ì¤Ä¤Îµ¬Â§¤Î½ª¤ê¤ËÆó¤Ä¤Îưºî¤ò»ØÄꤷ¤Æ¤¤¤Þ¤¹" + +#~ msgid "too many symbols (tokens plus nonterminals); maximum %d" +#~ msgstr "¥·¥ó¥Ü¥ë¤¬Â¿¤¹¤®¤Þ¤¹ (¥È¡¼¥¯¥ó + Èó½ªÃ¼¥¢¥¤¥Æ¥à) -- ºÇÂç %d" + +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "\n" +#~ "FIRSTS\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "\n" +#~ "FIRSTS\n" +#~ "\n" + +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "%s firsts\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "%s firsts\n" +#~ "\n" + +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "\n" +#~ "FDERIVES\n" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "\n" +#~ "FDERIVES\n" + +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "%s derives\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "%s ¤Ï°Ê²¼¤«¤éÇÉÀ¸\n" +#~ "\n" + +#~ msgid " 1 shift/reduce conflict" +#~ msgstr " 1 ¥·¥Õ¥È/´Ô¸µ¾×ÆÍ" + +#~ msgid "%s contains" +#~ msgstr "%s ¤Ë¤Ï¡¢" + +#~ msgid "" +#~ "\n" +#~ "\n" +#~ "\n" +#~ "DERIVES\n" +#~ "\n" +#~ msgstr "" +#~ "\n" +#~ "\n" +#~ "\n" +#~ "DERIVES\n" +#~ "\n" + +#~ msgid "%s derives" +#~ msgstr "%s ¤Ï°Ê²¼¤«¤éÇÉÀ¸" + +#~ msgid "" +#~ "Usage: %s [-dhklntvyV] [-b file-prefix] [-o outfile] [-p name-prefix]\n" +#~ " [--debug] [--defines] [--fixed-output-files] [--no-lines]\n" +#~ " [--verbose] [--version] [--help] [--yacc]\n" +#~ " [--no-parser] [--token-table]\n" +#~ " [--file-prefix=prefix] [--name-prefix=prefix]\n" +#~ " [--output=outfile] grammar-file\n" +#~ "\n" +#~ "Report bugs to bug-bison@gnu.org\n" +#~ msgstr "" +#~ "»È¤¤Êý: %s [-dhklntvyV] [-b file-prefix] [-o outfile] [-p name-prefix]\n" +#~ " [--debug] [--defines] [--fixed-output-files] [--no-lines]\n" +#~ " [--verbose] [--version] [--help] [--yacc]\n" +#~ " [--no-parser] [--token-table]\n" +#~ " [--file-prefix=prefix] [--name-prefix=prefix]\n" +#~ " [--output=outfile] ʸˡ¥Õ¥¡¥¤¥ë\n" +#~ "\n" +#~ "¥Ð¥°¤ò¸«¤Ä¤±¤¿¤é bug-bison@gnu.org ¤Þ¤ÇÏ¢Íí¤ò¡£\n" + +#~ msgid "gotos" +#~ msgstr "goto" + +#~ msgid "%s:%d: fatal error: " +#~ msgstr "%s:%d: Ã×̿Ū¥¨¥é¡¼: " + +#~ msgid "%s: " +#~ msgstr "%s: " + +#~ msgid "%s:%d: " +#~ msgstr "%s:%d: " + +#~ msgid "%s: internal error: %s\n" +#~ msgstr "%s: ÆâÉô¥¨¥é¡¼: %s\n" + +#~ msgid "Entering set_nullable" +#~ msgstr "set_nullable ¤ËÆþ¤ê¤Þ¤¹" + +#~ msgid "\t\t/* empty */" +#~ msgstr "\t\t/* ¶õ */" + +#~ msgid "unterminated comment in `%{' definition" +#~ msgstr "`%{' ÄêµÁ ¤ËÊĤ¸¤é¤ì¤Æ¤¤¤Ê¤¤¥³¥á¥ó¥È¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "multiple %union declarations" +#~ msgstr "Ê£¿ô¤Î %union Àë¸À¤Ç¤¹" + +#~ msgid "unterminated comment at end of file" +#~ msgstr "¥Õ¥¡¥¤¥ëËöÈø¤ËÊĤ¸¤é¤ì¤Æ¤¤¤Ê¤¤¥³¥á¥ó¥È¤¬¤¢¤ê¤Þ¤¹" + +#~ msgid "unmatched close-brace (`}')" +#~ msgstr "Âбþ¤Î¤Ê¤¤ÊĤ¸¥Ö¥ì¡¼¥¹ (`}') ¤Ç¤¹" + +#~ msgid "unmatched right brace (`}')" +#~ msgstr "Âбþ¤Î¤Ê¤¤±¦¥Ö¥ì¡¼¥¹ (`}') ¤Ç¤¹" + +#~ msgid "$%s is invalid" +#~ msgstr "$%s ¤ÏÉÔŬÀڤǤ¹" + +#~ msgid "invalid @-construct" +#~ msgstr "ÉÔŬÀÚ¤Ê @-¥³¥ó¥¹¥È¥é¥¯¥È¤Ç¤¹" + +#~ msgid "ill-formed %type declaration" +#~ msgstr "¼Ù°­¤Ê %type Àë¸À¤Ç¤¹" + +#~ msgid "" +#~ "reduced %s defines %d terminal%s, %d nonterminal%s, and %d production%s.\n" +#~ msgstr "" +#~ "´Ô¸µ¥Õ¥¡¥¤¥ë %s ¤Ç %d ¸Ä¤Î½ªÃ¼»Ò%.0s, %d ¸Ä¤ÎÈó½ªÃ¼»Ò%.0s, %d ¸Ä¤Îµ¬Â§%.0s" +#~ "¤¬ÄêµÁ¤µ¤ì¤Þ¤·¤¿\n" + +#~ msgid "" +#~ "Variables\n" +#~ "---------\n" +#~ "\n" +#~ msgstr "" +#~ "ÊÑ¿ô\n" +#~ "---------\n" +#~ "\n" + +#~ msgid "Value Sprec Sassoc Tag\n" +#~ msgstr "ÃÍ Á°ÃÖ ·ë¹ç ¥¿¥°\n" + +#~ msgid "" +#~ "Rules\n" +#~ "-----\n" +#~ "\n" +#~ msgstr "" +#~ "µ¬Â§\n" +#~ "-----\n" +#~ "\n" + +#~ msgid "" +#~ "Rules interpreted\n" +#~ "-----------------\n" +#~ "\n" +#~ msgstr "" +#~ "²ò¼á¤µ¤ì¤¿µ¬Â§\n" +#~ "-----------------\n" +#~ "\n" diff --git a/src/apps/bin/bison/po/ms.gmo b/src/apps/bin/bison/po/ms.gmo new file mode 100644 index 0000000000000000000000000000000000000000..949d0f355ae8ed30d9f4e71493b456ff7418c370 GIT binary patch literal 14582 zcmbuFdyHgRUB}PLF3XlYcbAvD=vkO%W?-tfXZA_Y%(6YRJu^LT`>_ueq;FN-uDV^f z?k(P( z2z&xO2>vwu;9r0<;Fm$I^8zOO5%5k>`#A|7 z0N219!HCmRX#iW&_kbKL_?{ z|0t;Qd>%~O4O;M{;0aK4eH|3NH*$EQ>vmA@_k*y`oT=U)2WNO6f+FLS;Pb&xgPQ*{ zpvL_*2&v|4AWNHn2k!!}=dgYhydM-l9|1M)U7*(eMNsGS`=I9e2FO;;_rV*$7s9+d z!J9!yHb=mRz_)_at=HJYM!3~r@>zW#s4pY z{4>`f>=v}3-siwQ;3_D2dlD4AzXw|IZ$a_?`ObY0d;7Sr(Xqs0sJcX0TxX6dOiIfM1F$zy=+eOKE>vA zj{gCQ?>DjN1=?Q@imneLERvVc@aNaSuYfFN-V2f9-*13-fKOHL-vqUf8!!s8f3F5* z&t^cTHErfGNCYTc(m z&G%JM>pTq}0-pgj|6LHX0-grd?^B@U><_Broc(Qt+Li1wRPNj(ipr|Gof9pTAq-i|+RO*aJ#F&Vbr?4sulH!=MHK7!>_q10@fy zzQ@baaZv3EcnkO;P;&8UP;&84Rr@zVSZ8j!*Uvu->itm=Q8Q11=fU3rr5D$sOj_?Y z@Cf)QXu*$zqVrF{JHUShr5D%VkL?Ec^9R*2>!8{{1X}QOpy>O1Q0MV)p!D`T;C0|R ziXQEqD)-#XUyjQ?I@|gYeR__1aC)zwqF0ajqbH>3EaoWhp#&5?k5C?o^mTi^7S?fCdS#W7O3a7 z6x7MQh0>$sl+%=yqUTkVy%eeBu}rTT%bHok)HkpMUP~9K#@!z zr2G)2ek6Z-ZlK84pQUV2>PLFBRK2_ij42ON&QNZm=y^Bg4vKX780AKadm8hX!gg6i zX=00L5axDI9=6k@lkaU9%X2hM*5asL*j89v48z1`WgOb6jt!EIEz&+UQ@PE;JdH1e z)aEqUFw4^H2OOS-ow6PNfP?d1v{o3qd~SK}w5XqWW{o4-SoRu+YX$H8%A#&hKZ}i_ z+gFscp@!MD%cg5~bt>O&du%F6Z6|EU0o1vkW*02DdWTN97L;*e=;(NsgcrgLPHB6c zMqSO+SJanz7>BtQO^PrZL`e{<`!?12c)eEH`c4NDj zL7D4p?OGbg=|y(e+OWekkBaC*Xp?f#3NuXs*>3xRla#eIgGtoS+9;00ZV=ma=vtah zJJn`$YDq2xaRisHXsK#er`lp~Ck^vtcVPn&An6IRZaD~(!cQ~mOjph(7__2pnU)-p z78!5N!grJrlDP96&E|7hu=xmkyk_#M-aAsb9dUMyTV;}=cikkq%o&V!B?kG8Zrkqm zLwjjkQIUtm+r`6nzRyy#mW9l;XKMPu+SJtE>G581lo#UPXc$Zj3qPzKw0mRY#(P~$ zpCV*xxBe9q?KX4mb~z~HpkRTlOmce|LL25t(6MZkU7_8_R3mLZLEydhYb%p8b1mHwy*> zbPj@!`=4gv&U2NSTv)S#jnkxCAA8eSQfUfh!Th#_yxvC!GmUVBWSn%5}}tVd;Z+g!lPF84Rg-Ti8d&MGDDjqA4y^ z+iRtHSP%A?2LqPO?doU=$yK;pqgomzDw@L#vM(Jzzc_!4omra?!*;X=`)yU_4$(7B z19A;dHQaOZ@Uex{^P3CDVSrJum|Ub*ts2qQ2xN5F+wALqP3$zV4<9{_8_e5T|vZ&<6;9f&&Q3PpIK zft|2bcDE89C3%rKFX9&U4$sNF>)u7{nLtmoiOH-;^fm5pm;^11(Pmpa9Uz;oqm~|O z>4a0f;*dBrOiiagBB*tGc?nmJBe(g+pq0k%q+&Nm+KjId%}y$hSQ{0)`Z{&N7vbL8 z^2}~{QVp**H%9zupjIxl5%2s(cweJj;MR04o5P}{9hV(xf^X32x&Tkx#9u5rU9fOF z*BKn*N7Grq2fIl*oo3w!upWy9AzNY^vn0`$wKkO=$xB*!A%##db`aP+WE;*iTud`W zr|1QRZ4(VtR7p@)y^hordr2gAanhkR#FkZz^Z-}2+jrBkAy>XrJH>#ho#k*h&bBc) z%4|DM^D>iAt;T8E4`d764B@3A;crx6F@ro$+mW_1>f#vT7Ifsf7`R%vQWVH@LFt`7 z@ME_=p3bczW-o@Txb1orRFBRfj@{ORR*Kq=8AGi_Y=}VA4_4NRt2p6JR>Le;p`#3U z)b3&93FvTy=uT&|@mVbVvdlLB6iq;}_p=9KU&Zyb%&?s@Lv36$+tCI)c-1t?aW~7( zWibBixdt9O3zA~vpreAIH*w?6%r722F?V)(?#ROFh2_UAQyp7aK0Cj(WRIO&v~%|S z+~V@W(UsG4i}w7=A_it2Fc5WVaQSHcMim$Wg5n_Xa9T7b*ro_wz z7pIIX6Jaf;U=jWYS;wLXag5J~vQ>kh3WtRm1+*h4EXu@DB5WUA>`|O?L~#Z&Pj1i( zoufn+)?@bT8W-ZI!rfa;EowTIT6UugoDB-<=O;YO_c{t$Qokq0ct_zx+)b*bE9upg z*f}mTVbb25PJ12eMSPCZd%>^dzcHG^H;(JZ)!GOtx0$IV%8ApiMM#TOj-_EBh|9~y zcvUzU78}O>^*1qXUe`SZhNBzSKF0^{c>xwSO^lNjyN4c|ybHM$V-T>xjD?_a>TS)N zXYY~IrN{z>q-aFPpVnG{aCixwwWf>LNL{Qc!`Uzqbaq1`Ho_xpCd0f4)8KDeyDV6S zqxV`q$AqcwDp_QcVJ00I4H)^BiCUa}z`Zyptkg+Qw7CUc%^*bgHi+ta0oO^)%OJ{g z$;hg1P#ALgL&$c*I%<0-7rMl6zOIWnz9L$S*eOl&2m@?)HXcZf=B~LHtf_}qG6aG} zgt^zI$L_1S;aHvWYF63EC{dhQha&D?j6KybcMIioIT|;_=;ll8I4SYk%v3(!hE+wV zyt{O_=FKjOE=$J_(IB~Ts>Y=Ya(&)`%tGE%2ssF|E=pY{P6%0J)*hP5AFy{Ec4*uT zT_ON)Jf{?)JL~RTs$1XpnaC>GR@mlbi2dYlD+gqp^m?)1DsH-iZPhHCFJ{e$FOI?7 z+np&VXjZZyNH&lYRGn(s1pUq523h@ z#7j+kbaTUnBD%1a*>>o>MhO0_&32Ej9ZsoAl02QgJ5DF_x~99N+1xG+mgn3@{Nt`( z>f>(}KI>H-zVx|D7`Fx+_v0B z%=OmQ#fMW9VB!N?LXL@SpUM|vm_(?XQVVtBXQ&xMA zR?0mQOBr<&2=s{~oxe+~jl`STl@qIM>=xN}UBx8j+5D}qa)T4ekL^qnT){O@WXzml zs_S(Wh5$rrTq9QYe3q_b%$p0H=EMFHI$Pc6_fOw{-#tOYhrG=*c{l1bj}Z7ams7fI z4SXBt&n-8PO1|+N&4&>4S$kk+=I-XqJD+~LFufa2 zCt>kGq7G}-) zq@8wP|E#^AWL4vQTq5DkV_fi&uw>|7^TYcOTL1I#%)!Q^&Er0;A_kl~612kD&P=~) z`ksbqoC)#(BOM3*JV*lguqO|KqDoqyayG7yY+|#x*q8lsAiLY4pSRI+5Rns_AnH?_ zhpnI+L^xLXZ4_4j;B#>M>$16|8zleVnIe)t7zJZbuADhNcS3YcJmjslCxff(1hyY# z5jFldTuFFY4-?d$z0)BMdT6Z6ZFhn!^7f~QG}L$NL{Yv`L>weMaVhR=>Q`yCVHMBn zBI*Qv7~FSkU@p>#S8r>TIt474%XafALK6^2cgrNu*k@}WUw3TSw$%H=()669;@ro*n8Mu*%bqbz}G*@xHkn6<+w zhNZN*1K`RsN|Dzse!DrxvrS`_Cii{Fi+7{TQ6g^j%JrZJXUCRUb@7%z>3+~Evu&CQ z*1{}y{N8Q`pCiAv)vBcTbLw2l;WpH5C2Tup_@$66@-uN{ce_srlbhVqW%X)F@=nx3 z@pEzWIcLhTAJJeqHWD&M8TC=F{Hnb+v*p`#+ilK|nKx7eBQ`AKDrvqHM3=3?9v9DW zNvkxbC}VDyTr>-1&Cwy3Mpy3qM9^=Ow+pT{b-wJCI2htF>SW? z4%*|rx3;@MW3!E?(wTA{{H}vjf{_ELGwRVko5o>}Y*A^WpfRehD5*79nZB^kXjzcN zu9w|FS@tk1hZt4fYRlnQ@uze#SdUtw+;O-zdiyrJ%3XCL)(mtZ2-ynBQEW(oRX&sI z`w-z_9&MLzA97xqZQ=P!=;7Yt90bG5AR}+IHRJ9Z#EU`Dk4wcBF8jV^)Rv5U5oP5> zy8V=!ABUqQc22lEhH!jQtQDQ~`lP#tjpy6X&o7>uTb!$W-Q+OhZxVKJ4JME(i`Z;8 z8p}a5)m8KEF4stg2LE?0$@jTO=1$L@g%Vsw;iR&v@e1HJ;kk&LW9^Cb``p6VXXqA} z9PPXAUHhG5^wP+k)9{lFa2mlp%EoWmdzF75U^oCqJA89QxsOG;kEA0xpy~UJ?NCW zzcFk*Q2(8??&J-;SXE<4wv&KYBB5bU2Yh{E-;PVQxNM(yKjC6rZ(qg&FLR1Swpd0C zWooUeTrih)HWo2IVp*tDCmNDS?%6({u=tRM0KqMcpiESdm;G&$@FUUa`-Rx-mJB@K zB9WQu1X+oI90RTdjbkvUS{CJyc{FsCS$DbZs>?d!oZEg76%vC{mzp7t{>%;c{|lwg zi;rkyjSXE8gNX6{>T)m)i8Wn#eWxU=ir7WOWIEpMTnj6U%|8nif#V`lS8t9uz?z2x`$?^@@E%yy8 z_=Kd4{KDKrbB*;takdVebV4MncCd;doT>4HPt6}WcY6NBLvzRH&hn2uUQpUo^DF1) z9-HHJ;Sf+aXJf8^oR^apXvYO_|)$R@BI#FK=PAF*hvMovX zteiCu;pd5CywBf~!Ixv-HiM5^;G~Ur?Jl4dm42hd{@W(+t1VVhl@opE2+d@}Sh%H_ z-qb=XCD4h><*}B_-;2KLw;A~sU2ZBtuWX<5RFJh<&F9R4)V`+JIsMHZ@LYM&k!nn+ zNj*)~X$;n7CG#>Pq;39g*Et=@7DA$)(?qWPMyVl{SI5qeeFc zHKJs)vM4j;g#Xj$zXVJ+`b8(}`e83X^cmtl3q(dc;}l6&5sOeRgMZ2n;b^2E5$(1)RAT7ch7J zu3=yb=>m6IfQPy>;yArWVEmAaIAUiovN-ZATC0-){jgRr7P_LfN+tMoln9fd6G=X4 zBAe~1w2r3_ZFC=NGkm9+KI zEkT(%g`JyW3P!Hh2cr)QIgXuNJf5)IaGmWXLoN#pp06Jl8}wJNQYEN4DiagJH(KBuBi*fV|2ae;dsA#NF5QOf_O zl~;GU!kpVGiJ8$M>^Q~5xlah)&Vn(<1B0G&xpvo?t9_%8R8c#Qu8N2EfS literal 0 HcmV?d00001 diff --git a/src/apps/bin/bison/po/ms.po b/src/apps/bin/bison/po/ms.po new file mode 100644 index 0000000000..c54ed060c6 --- /dev/null +++ b/src/apps/bin/bison/po/ms.po @@ -0,0 +1,738 @@ +# Bison Bahasa Melayu (Malay) (ms). +# Copyright (C) 2003 Free Software Foundation, Inc. +# This file is distributed under the same license as the Bison package. +# Sharuzzaman Ahmat Raslan , 2003. +# +msgid "" +msgstr "" +"Project-Id-Version: bison 1.875a\n" +"Report-Msgid-Bugs-To: bug-bison@gnu.org\n" +"POT-Creation-Date: 2004-05-21 10:26-0700\n" +"PO-Revision-Date: 2003-02-26 22:43GMT+8\n" +"Last-Translator: Sharuzzaman Ahmat Raslan \n" +"Language-Team: Malay \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=UTF-8\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" +"X-Generator: KBabel 0.9.5\n" + +#: src/complain.c:51 src/complain.c:66 +msgid "warning: " +msgstr "amaran: " + +#: src/complain.c:122 src/complain.c:138 +msgid "fatal error: " +msgstr "ralat maut: " + +#: src/conflicts.c:76 +#, c-format +msgid " Conflict between rule %d and token %s resolved as shift" +msgstr " Konflik antara hukum %d dan token %s diselesaikan sebagai pindahan" + +#: src/conflicts.c:84 +#, c-format +msgid " Conflict between rule %d and token %s resolved as reduce" +msgstr "" +" Konflik antara hukum %d dan token %s diselesaikan sebagai pengurangan" + +#: src/conflicts.c:91 +#, c-format +msgid " Conflict between rule %d and token %s resolved as an error" +msgstr " Konflik antara hukum %d dan token %s diselesaikan sebagai ralat" + +#: src/conflicts.c:399 +#, c-format +msgid "conflicts: %d shift/reduce, %d reduce/reduce\n" +msgstr "konflik: %d pemindahan/pengurangan, %d pengurangan/pengurangan\n" + +#: src/conflicts.c:402 +#, c-format +msgid "conflicts: %d shift/reduce\n" +msgstr "konflik: %d pemindahan/pengurangan\n" + +#: src/conflicts.c:404 +#, c-format +msgid "conflicts: %d reduce/reduce\n" +msgstr "konflik: %d pengurangan/pengurangan\n" + +#: src/conflicts.c:422 +#, c-format +msgid "State %d " +msgstr "Keadaan %d " + +#: src/conflicts.c:487 +#, fuzzy, c-format +msgid "%%expect-rr applies only to GLR parsers" +msgstr "%s hanya berkesan kepada parser GLR" + +#: src/conflicts.c:511 +#, c-format +msgid "expected %d shift/reduce conflict" +msgid_plural "expected %d shift/reduce conflicts" +msgstr[0] "jangkaan %d konflik pemindahan/pengurangan" +msgstr[1] "jangkaan %d konflik pemindahan/pengurangan" + +#: src/conflicts.c:515 +#, fuzzy, c-format +msgid "expected %d reduce/reduce conflict" +msgid_plural "expected %d reduce/reduce conflicts" +msgstr[0] "jangkaan 0 konflik pengurangan/pengurangan" + +#: src/files.c:100 +#, c-format +msgid "cannot open file `%s'" +msgstr "tidak dapat membuka fail `%s'" + +#: src/files.c:116 +msgid "I/O error" +msgstr "Ralat I/O" + +#: src/files.c:119 +msgid "cannot close file" +msgstr "tidak dapat menutup fail" + +#: src/files.c:337 +#, c-format +msgid "conflicting outputs to file %s" +msgstr "keluaran berkonflik kepada fail %s" + +#: src/getargs.c:186 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "Cuba `%s --help' untuk lebih maklumat.\n" + +#: src/getargs.c:192 +msgid "GNU bison generates parsers for LALR(1) grammars.\n" +msgstr "GNU bison menjanakan penghurai untuk tatabahasa LALR(1).\n" + +#: src/getargs.c:196 +#, c-format +msgid "Usage: %s [OPTION]... FILE\n" +msgstr "Penggunaan: %s [PILIHAN]... FAIL\n" + +#: src/getargs.c:200 +msgid "" +"If a long option shows an argument as mandatory, then it is mandatory\n" +"for the equivalent short option also. Similarly for optional arguments.\n" +msgstr "" +"Jika satu pilihan panjang menunjukkan satu hujah sebagai mandatori, oleh itu " +"ia\n" +"mandatori untuk pilihan pendek sepadan juga. Serupa juga dengan hujah tidak " +"wajib.\n" + +#: src/getargs.c:206 +msgid "" +"Operation modes:\n" +" -h, --help display this help and exit\n" +" -V, --version output version information and exit\n" +" -y, --yacc emulate POSIX yacc\n" +msgstr "" +"Mod operasi:\n" +" -h, --help papar bantuan ini dan keluar\n" +" -V, --version keluarkan maklumat versi dan keluar\n" +" -y, --yacc tiru POSIX yacc\n" + +#: src/getargs.c:213 +msgid "" +"Parser:\n" +" -S, --skeleton=FILE specify the skeleton to use\n" +" -t, --debug instrument the parser for debugging\n" +" --locations enable locations computation\n" +" -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n" +" -l, --no-lines don't generate `#line' directives\n" +" -n, --no-parser generate the tables only\n" +" -k, --token-table include a table of token names\n" +msgstr "" +"Parser:\n" +" -S, --skeleton=FAIL nyatakan rangka untuk digunakan\n" +" -t, --debug peralatan parser untuk nyahpepijat\n" +" --locations hidupkan pengiraan lokasi\n" +" -p, --name-prefix=AWALAN tambah AWALAN kepada simbol luaran\n" +" -l, --no-lines jangan jana arahan `#line'\n" +" -n, --no-parser jana jadual sahaja\n" +" -k, --token-table sertakan jadual nama token\n" + +#: src/getargs.c:225 +msgid "" +"Output:\n" +" -d, --defines also produce a header file\n" +" -r, --report=THINGS also produce details on the automaton\n" +" -v, --verbose same as `--report=state'\n" +" -b, --file-prefix=PREFIX specify a PREFIX for output files\n" +" -o, --output=FILE leave output to FILE\n" +" -g, --graph also produce a VCG description of the " +"automaton\n" +msgstr "" +"Keluaran:\n" +" -d, --defines juga hasilkan fail header\n" +" -r, --report=PERKARA juga hasilkan butir terperinci bagi automaton\n" +" -v, --verbose sama seperti `--report=state'\n" +" -b, --file-prefix=AWALAN nyatakan AWALAN untuk fail keluaran\n" +" -o, --output=FAIL biarkan keluaran kepada FAIL\n" +" -g, --graph juga hasilkan huraian VCG bagi automaton\n" + +#: src/getargs.c:236 +msgid "" +"THINGS is a list of comma separated words that can include:\n" +" `state' describe the states\n" +" `itemset' complete the core item sets with their closure\n" +" `lookahead' explicitly associate lookaheads to items\n" +" `solved' describe shift/reduce conflicts solving\n" +" `all' include all the above information\n" +" `none' disable the report\n" +msgstr "" +"PERKARA adalah senarai perkataan dipisah koma yang boleh termasuk:\n" +" `state' nyatakan keadaan\n" +" `itemset' lengkapkan perkara asas dengan penutupnya\n" +" `lookahead' dengan jelas kaitkan lookahead kepada perkara\n" +" `solved' nyatakan penyelesaian konflik pemindahan/pengurangan\n" +" `all' masukkan semua maklumat diatas\n" +" `none' matikan laporan\n" + +#: src/getargs.c:247 +msgid "Report bugs to .\n" +msgstr "Lapor pepijat kepada .\n" + +#: src/getargs.c:264 +#, c-format +msgid "bison (GNU Bison) %s" +msgstr "bison (GNU Bison) %s" + +#: src/getargs.c:266 +msgid "Written by Robert Corbett and Richard Stallman.\n" +msgstr "Ditulis oleh Robert Corbett dan Richard Stallman.\n" + +#: src/getargs.c:270 +#, c-format +msgid "Copyright (C) %d Free Software Foundation, Inc.\n" +msgstr "Hakcipta (C) %d Free Software Foundation, Inc.\n" + +#: src/getargs.c:272 +msgid "" +"This is free software; see the source for copying conditions. There is NO\n" +"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +msgstr "" +"Ini adalah perisian bebas; lihat sumber untuk syarat menyalin. TIADA\n" +"jaminan disediakan; tidak juga untuk KEBOLEHDAGANGAN atau KEUPAYAAN UNTUK " +"SESUATU TUJUAN KHUSUS.\n" + +#: src/getargs.c:438 +#, c-format +msgid "missing operand after `%s'" +msgstr "operan hilang selepas `%s'" + +#: src/getargs.c:440 +#, c-format +msgid "extra operand `%s'" +msgstr "operan tambahan `%s'" + +#: src/gram.c:139 +msgid "empty" +msgstr "kosong" + +#: src/gram.c:233 +msgid "Grammar" +msgstr "Tatabahasa" + +#: src/gram.c:321 src/reduce.c:394 +msgid "warning" +msgstr "amaran" + +#: src/main.c:124 +msgid "rule never reduced because of conflicts" +msgstr "hukum tidak dikurangkan kerana konflik" + +#: src/parse-gram.y:363 +msgid "POSIX forbids declarations in the grammar" +msgstr "POSIX melarang pengisytiharan didalam tatabahasa" + +#: src/parse-gram.y:486 +msgid "missing identifier in parameter declaration" +msgstr "pengecam hilang dalam parameter pengisytiharan" + +#: src/print.c:49 +#, c-format +msgid " type %d is %s\n" +msgstr " jenis %d adalah %s\n" + +#: src/print.c:165 +#, c-format +msgid "shift, and go to state %d\n" +msgstr "pindah, dan pergi ke keadaan %d\n" + +#: src/print.c:167 +#, c-format +msgid "go to state %d\n" +msgstr "pergi ke keadaan %d\n" + +#: src/print.c:204 +msgid "error (nonassociative)\n" +msgstr "ralat (tidak bergabung)\n" + +#: src/print.c:292 +#, c-format +msgid "reduce using rule %d (%s)" +msgstr "kurang menggunakan hukum %d (%s)" + +#: src/print.c:294 +#, c-format +msgid "accept" +msgstr "terima" + +#: src/print.c:325 src/print.c:391 +msgid "$default" +msgstr "$default" + +#: src/print.c:420 +#, c-format +msgid "state %d" +msgstr "keadaan %d" + +#: src/print.c:456 +msgid "Terminals, with rules where they appear" +msgstr "Terminal, dengan hukum dimana mereka kelihatan" + +#: src/print.c:483 +msgid "Nonterminals, with rules where they appear" +msgstr "Tidak terminal, dengan hukum dimana mereka kelihatan" + +#: src/print.c:512 +#, c-format +msgid " on left:" +msgstr " pada kiri:" + +#: src/print.c:527 +#, c-format +msgid " on right:" +msgstr " pada kanan:" + +#: src/print.c:555 +msgid "Rules never reduced" +msgstr "Hukum tidak dikurangkan" + +#: src/reader.c:56 +#, c-format +msgid "multiple %s declarations" +msgstr "pelbagai pengisytiharan %s" + +#: src/reader.c:118 +#, c-format +msgid "result type clash on merge function %s: <%s> != <%s>" +msgstr "jenis hasil bertelingkah pada fungsi gabung %s: <%s> != <%s>" + +#: src/reader.c:216 +#, c-format +msgid "rule given for %s, which is a token" +msgstr "hukum diberi untuk %s, dimana ia adalah token" + +#: src/reader.c:245 +#, c-format +msgid "type clash on default action: <%s> != <%s>" +msgstr "pertelingkahan jenis pada tindakan default: <%s> != <%s>" + +#: src/reader.c:251 +msgid "empty rule for typed nonterminal, and no action" +msgstr "hukum kosong untuk bukan terminal ditaip, dan tiada tindakan" + +#: src/reader.c:321 src/reader.c:335 src/reader.c:348 +#, c-format +msgid "only one %s allowed per rule" +msgstr "hanya satu %s dibenarkan setiap hukum" + +#: src/reader.c:331 src/reader.c:346 +#, c-format +msgid "%s affects only GLR parsers" +msgstr "%s hanya berkesan kepada parser GLR" + +#: src/reader.c:333 +#, c-format +msgid "%s must be followed by positive number" +msgstr "%s mesti diikuti dengan nombor positif" + +#: src/reader.c:490 +msgid "no rules in the input grammar" +msgstr "tiada hukum dalam masukan tatabahasa" + +#: src/reduce.c:242 +msgid "useless rule" +msgstr "hukum tidak berguna" + +#: src/reduce.c:303 +#, c-format +msgid "useless nonterminal: %s" +msgstr "bukan terminal tidak berguna: %s" + +#: src/reduce.c:351 +msgid "Useless nonterminals" +msgstr "Bukan terminal tidak berguna" + +#: src/reduce.c:364 +msgid "Terminals which are not used" +msgstr "Terminal yang tidak digunakan" + +#: src/reduce.c:373 +msgid "Useless rules" +msgstr "Hukum tidak berguna" + +#: src/reduce.c:389 +#, c-format +msgid "%d rule never reduced\n" +msgid_plural "%d rules never reduced\n" +msgstr[0] "%d hukum tidak dikurangkan\n" +msgstr[1] "%d hukum tidak dikurangkan\n" + +#: src/reduce.c:397 +#, c-format +msgid "%d useless nonterminal" +msgid_plural "%d useless nonterminals" +msgstr[0] "%d bukan terminal tidak berguna" +msgstr[1] "%d bukan terminal tidak berguna" + +#: src/reduce.c:403 +#, c-format +msgid " and " +msgstr " dan " + +#: src/reduce.c:406 +#, c-format +msgid "%d useless rule" +msgid_plural "%d useless rules" +msgstr[0] "%d hukum tidak berguna" +msgstr[1] "%d hukum tidak berguna" + +#: src/reduce.c:436 +#, c-format +msgid "start symbol %s does not derive any sentence" +msgstr "simbol permulaan %s tidak menghasilkan sebarang perkataan" + +#: src/scan-gram.l:162 +msgid "stray `,' treated as white space" +msgstr "`,' sesat dianggap sebagai ruang" + +#: src/scan-gram.l:225 +#, c-format +msgid "invalid directive: %s" +msgstr "arahan tidak sah: %s" + +#: src/scan-gram.l:283 +#, c-format +msgid "invalid character: %s" +msgstr "aksara tidak sah: %s" + +#: src/scan-gram.l:402 +#, fuzzy +msgid "invalid null character" +msgstr "aksara tidak sah: %s" + +#: src/scan-gram.l:415 src/scan-gram.l:427 src/scan-gram.l:448 +#, c-format +msgid "invalid escape sequence: %s" +msgstr "turutan escape tidak sah: %s" + +#: src/scan-gram.l:417 src/scan-gram.l:429 src/scan-gram.l:450 +#, fuzzy, c-format +msgid "invalid null character: %s" +msgstr "aksara tidak sah: %s" + +#: src/scan-gram.l:455 +#, c-format +msgid "unrecognized escape sequence: %s" +msgstr "turutan escape tidak dikenali: %s" + +#: src/scan-gram.l:537 +#, c-format +msgid "missing `{' in `%s'" +msgstr "`(' hilang dalam `%s'" + +#: src/scan-gram.l:782 +#, c-format +msgid "$$ of `%s' has no declared type" +msgstr "$$ dari `%s' tiada jenis diisytiharkan" + +#: src/scan-gram.l:803 +#, c-format +msgid "$%d of `%s' has no declared type" +msgstr "$%d dari `%s' tiada jenis diisytiharkan" + +#: src/scan-gram.l:812 src/scan-gram.l:881 src/scan-gram.l:932 +#, c-format +msgid "integer out of range: %s" +msgstr "integer diluar julat: %s" + +#: src/scan-gram.l:848 src/scan-gram.l:916 +#, c-format +msgid "invalid value: %s" +msgstr "nilai tidak sah: %s" + +#: src/scan-gram.l:1036 +#, c-format +msgid "missing `%s' at end of file" +msgstr "`%s' hilang pada penghujung fail" + +#: src/scan-gram.l:1047 +#, fuzzy, c-format +msgid "missing `%s' at end of line" +msgstr "`%s' hilang pada penghujung fail" + +#: src/symlist.c:97 src/symlist.c:108 +msgid "invalid $ value" +msgstr "nilai $ tidak sah" + +#: src/symtab.c:85 +#, c-format +msgid "type redeclaration for %s" +msgstr "pengisytiharan semula jenis untuk %s" + +#: src/symtab.c:102 src/symtab.c:120 +#, c-format +msgid "%s redeclaration for %s" +msgstr "%s pengisytiharan semula untuk %s" + +#: src/symtab.c:139 +#, c-format +msgid "redefining precedence of %s" +msgstr "mentakrif semula keutamaan %s" + +#: src/symtab.c:157 +#, c-format +msgid "symbol %s redefined" +msgstr "simbol %s ditakrif semula" + +#: src/symtab.c:180 +#, c-format +msgid "redefining user token number of %s" +msgstr "mentakrif semula nombor token pengguna %s" + +#: src/symtab.c:207 +#, c-format +msgid "symbol %s is used, but is not defined as a token and has no rules" +msgstr "" +"simbol %s digunakan, tetapi tidak ditakrifkan sebagai token atau mempunyai " +"hukum" + +#: src/symtab.c:232 +#, c-format +msgid "symbol `%s' used more than once as a literal string" +msgstr "simbol `%s' digunakan lebih dari sekali sebagai rentetan perkataan" + +#: src/symtab.c:235 +#, c-format +msgid "symbol `%s' given more than one literal string" +msgstr "simbol `%s' diberikan lebih daripada satu rentetan perkataan" + +#: src/symtab.c:271 +#, c-format +msgid "conflicting precedences for %s and %s" +msgstr "konflik keutamaan untuk %s dan %s" + +#: src/symtab.c:283 +#, c-format +msgid "conflicting associativities for %s (%s) and %s (%s)" +msgstr "konflik kaitan bagi %s (%s) dan %s (%s)" + +#: src/symtab.c:368 +#, c-format +msgid "tokens %s and %s both assigned number %d" +msgstr "token %s dan %s kedua-dunya diberi nombor %d" + +#: src/symtab.c:591 +#, c-format +msgid "the start symbol %s is undefined" +msgstr "simbol permulaan %s tidak ditakrifkan" + +#: src/symtab.c:595 +#, c-format +msgid "the start symbol %s is a token" +msgstr "simbol permulaan %s adalah token" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "hujah tidak sah %s untuk %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "hujah kabur %s untuk %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Hujah yang sah adalah:" + +#: lib/bitset_stats.c:179 +#, c-format +msgid "%u bitset_allocs, %u freed (%.2f%%).\n" +msgstr "%u bitset_allocs, %u dibebaskan (%.2f%%).\n" + +#: lib/bitset_stats.c:182 +#, c-format +msgid "%u bitset_sets, %u cached (%.2f%%)\n" +msgstr "%u bitset_sets, %u disimpan (%.2f%%)\n" + +#: lib/bitset_stats.c:185 +#, c-format +msgid "%u bitset_resets, %u cached (%.2f%%)\n" +msgstr "%u bitset_resets, %u disimpan (%.2f%%)\n" + +#: lib/bitset_stats.c:188 +#, c-format +msgid "%u bitset_tests, %u cached (%.2f%%)\n" +msgstr "%u bitset_tests, %u disimpan (%.2f%%)\n" + +#: lib/bitset_stats.c:192 +#, c-format +msgid "%u bitset_lists\n" +msgstr "%u bitset_lists\n" + +#: lib/bitset_stats.c:194 +msgid "count log histogram\n" +msgstr "kira histogram log\n" + +#: lib/bitset_stats.c:197 +msgid "size log histogram\n" +msgstr "saiz histogram log\n" + +#: lib/bitset_stats.c:200 +msgid "density histogram\n" +msgstr "histogram kepadatan\n" + +#: lib/bitset_stats.c:214 +#, c-format +msgid "" +"Bitset statistics:\n" +"\n" +msgstr "" +"Statistik bitset:\n" +"\n" + +#: lib/bitset_stats.c:217 +#, c-format +msgid "Accumulated runs = %u\n" +msgstr "Pelaksanaan terkumpul = %u\n" + +#: lib/bitset_stats.c:261 lib/bitset_stats.c:266 +msgid "Could not read stats file." +msgstr "Tidak dapat membaca fail stats." + +#: lib/bitset_stats.c:263 +#, c-format +msgid "Bad stats file size.\n" +msgstr "Saiz fail stats tidak betul.\n" + +#: lib/bitset_stats.c:289 lib/bitset_stats.c:291 +msgid "Could not write stats file." +msgstr "Tidak dapat menulis fail stats." + +#: lib/bitset_stats.c:294 +msgid "Could not open stats file for writing." +msgstr "Tidak dapat membuka fail stats untuk menulis." + +#: lib/error.c:127 +msgid "Unknown system error" +msgstr "Ralat sistem tidak diketahui" + +#: lib/getopt.c:570 lib/getopt.c:589 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: pilihan `%s' adalah kabur\n" + +#: lib/getopt.c:622 lib/getopt.c:626 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: pilihan `--%s' tidak mengizinkan hujah\n" + +#: lib/getopt.c:635 lib/getopt.c:640 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: pilihan `%c%s' tidak mengizinkan hujah\n" + +#: lib/getopt.c:686 lib/getopt.c:708 lib/getopt.c:1039 lib/getopt.c:1061 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: pilihan `%s' memerlukan hujah\n" + +#: lib/getopt.c:746 lib/getopt.c:749 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: pilihan tidak dikenali `--%s'\n" + +#: lib/getopt.c:757 lib/getopt.c:760 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: pilihan tidak dikenali '%c%s'\n" + +#: lib/getopt.c:815 lib/getopt.c:818 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: pilihan salah -- %c\n" + +#: lib/getopt.c:824 lib/getopt.c:827 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: pilihan tidak sah -- %c\n" + +#: lib/getopt.c:882 lib/getopt.c:901 lib/getopt.c:1114 lib/getopt.c:1135 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: pilihan memerlukan hujah -- %c\n" + +#: lib/getopt.c:954 lib/getopt.c:973 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: pilihan `-W %s' adalah kabur\n" + +#: lib/getopt.c:997 lib/getopt.c:1018 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: pilihan `-W %s' tidak mengizinkan hujah\n" + +#: lib/obstack.c:417 lib/obstack.c:420 lib/xmalloc.c:53 +msgid "memory exhausted" +msgstr "kehabisan memori" + +#: lib/quotearg.c:238 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:239 +msgid "'" +msgstr "'" + +#: lib/subpipe.c:171 +#, c-format +msgid "subsidiary program `%s' could not be invoked" +msgstr "program subsidiari `%s' tidak dapat dilaksanakan" + +#: lib/subpipe.c:173 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "program subsidiari `%s' tidak dijumpai" + +#: lib/subpipe.c:175 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "program subsidiari `%s' gagal" + +#: lib/subpipe.c:176 +#, c-format +msgid "subsidiary program `%s' failed (exit status %d)" +msgstr "program subsidiari `%s' gagal (status keluar %d)" + +#: lib/timevar.c:475 +msgid "" +"\n" +"Execution times (seconds)\n" +msgstr "" +"\n" +"Masa pelaksanaan (saat)\n" + +#: lib/timevar.c:525 +msgid " TOTAL :" +msgstr " JUMLAH :" + +#: lib/timevar.c:561 +#, c-format +msgid "time in %s: %ld.%06ld (%ld%%)\n" +msgstr "masa dalam %s: %ld.%06ld (%ld%%)\n" diff --git a/src/apps/bin/bison/po/nl.gmo b/src/apps/bin/bison/po/nl.gmo new file mode 100644 index 0000000000000000000000000000000000000000..c3c144ba5f55cf0ff80ed293fedc28bea841fb74 GIT binary patch literal 14803 zcmcJVdyHIHeaBBAAuvD#NeHi$o`4tI;Mv%Q5VMYh*Y?`p#P+)DwF3mo-kCWwd%ZLF z4)@;idJQxQMXgfQQc5YJNUeaXssaV^C>3r0C~eg@2=yOODF_w%M^qJrS|L$Ush{sT z_s(MKLp+Zei(ca_-XKV@Grr=;5R_c^K1rt8F)9S z^*jLX2ixGy;7396>*L@Dz)yj%0S~^AZ(ti-(}cIO2f*dqjQJezp8!SA5|i`Otb-co z*T7Z2e+1NiJ`<+x1TFXx@FXa@z6*-po7p_kbtkCz10bw3r_1+;!M(iqL6Pxs@LAv| zL5=?esD6J7LaO;!kg3fNz}JB{vRSVH4}jw5L!kP-2h_a318RT11Zte`gDlnj1iT4+ z9?ZKNycL9Ga|ApFz7>KEVv6?1|@HggQE9~pas7Mir+s3QAKkzm6F%nL9gH7uiwD@;9b=J zF@Np{zfs~HFySEY=Rxu7gCM5GJOOH)&w^U#pMZYfK+*GcP;&kgQ1;_hFl`Q;2JZt4 zQ1bgZQ0=}6YQ4`u88pv6P<(x$LCB7WtRQ(*tKXZ{k+Rxu8 z@zbE>;O{`m$$x{|$D1IApQa9qu5AT>);0qZ<lSe^B!2C8SetZdh0r=0L`29Ul^!yam zy7%o1^6@%Q;~xTV2b-YUUj`9<^Fi=1_!$sZm>+`Lr#mo?cY%jN$!P=B_>X}a=S$$N z;6H*lg5LoTfZqc({+$T@dGH=k@9zhn5B@&*Lh$pTH8pCX`aPL$^Gj=?cV}u!7JcH;Kx9X|6ic= z^fs6#Tm&unK@d?gp9i(hZ-F!5|A5l3d)^qvZ-KY-{s^dczXjd`egS+I_*bCl`v>p_ zaDk#nJZ32Wi0^E-f8JE0;HBm7qa{MBf28+%v`#&aA{m^eJW7cudbCchX^HYS$_0v^ zISSk1AKbgQv)V&FZ=pOuk&cW%?4fp4N%W3 zDf=mJrL0hL$|*`p(eo0@3IEHOH-qvkdah7fl#7%*D3bRVQ!Y^+rbuspfucvYqDMJP zIY@a1rFtZPdTydfHqTJjDb-Ws$GP%FHla&7OgT+?4n@x+l)ES|qa3H)Oz}@`?y_qR zia1Sd5%*kfcjc~`CarvT%~+nJY0~b-&B8WZvF2Q2vq9I{sg{kBmMzj%YNm3VxjgM& za@6L0urABe>}ht-Tx-yDPqTBr61NLumll?0Pl@`8XU2Gk^UuIqA5niMYU#Yxmv^DV0L@p{d&@tp?jNW1NtMb2uw>-NN{Mca?E+-3e- zZ;)$mZ9DCD(=}GtShxK&kBj({v&o>>aG8dHY`^@-OG-P*4#rHsT_8#XH2qX1>Q#)6N_t?V6h2-=3PVplTnVQgKi5&D&Q%mYHS+G z@LGnPC!OiBW|^CyX8e;{L*9_mX>;Ptc{rbAMLI5V84JrR-9n)n7skS{|N!KQXSXQ-%y^V@ATi;`g6;=`#(uQGeP1Etg zN(az8)WL?P7@7r zsa#$o&0W^0DGPldaDI`~Jr+PKiOH|bR8Dw8Rbarv>I4iR@@4IH)hW)mz@|zf# zrVhEfr|KR!dFc53skza_T^C{0OC}eo)mQcCs0T9IUm3Lxza~~1*$YQc;0E(%76+li z0ZQgZYc^pIAgd9#^3rAc4b1TezHzAw=B)QYeuvI!{(Kdu2j3=Wt`@9Wss=Q3_2SLkCVK}ychA428ZWm-Z$@{^$eh=UdLpXB!(LQ*CkN{V>J5KOnbXvJ znmS<@H*FG|hN)>)TLiUUFE8WDapX2%?={k{->I%2BdvEgiDoO6N34vBU4E6C;EQl? zO?hVDJt@1FiyI?;*ikbVT1asIB79Z7eBf61Uq;>Hq}d&`qzU1JcGm}ZS|&`_J;Pd> zAv(oMRM;lbKuMJZWjW|bMRAZsVizwRnnP?^#z^;YRXam7Z5whG8Z}c4n7%U|?#A0T zI>(u9cGG;2NvM{)X}TK87Wfg|?ihRe9^suxrb_o3VMON$yQYCC2OH5aiV0#Q9!Sud{QL@-%3vs8wT zGTd=<1shL5ha*IHTBDEGu<%PV+x$~B0mZ@39)x`**V93U?UWg6;+k2G7TCh8rb&*w zS@JG}{%00yc<3xjiuHq@3WDCm_d7kec=Y7#nWfny^QY#Q-eMW*`25nDxpU|2@r6Y@ zYtPOuF3lf3e`SqeR_I27(;V@bLgE9D-~ep=7NuEhaOXWoiPs)8x*XF=y@?E zW-d55WgM9ZYcU0j@IT607DecG@!3$eZ17XAUzlM)J9NULOdKV`4#CAP#TiEwXAtw` z2CdLON@QU@X1}WOA&x5ixy4kXrd_FIH@?K)prB!V!oz&Gr;sW2d!kQp6kf#rpqjdr zUJZ$z;~?Xb=4d#rb*vTfIZ7V{zm)&laES16TsN-vjgWGSkp@IL-Lzv7(jt{(sTm03 z@UlK$<$C>M-T1%ZB&NmdxTnByc*5G_`M^0Z!osGB@v>rf(PG3q$DtU5fDNWE1dUT~ zE8bkYMNX3Q*9-lbDxY zoad5}Wu2ffl?zKhYxm)LPq;05(w~|~O%z=YJUc{#Yax8` z4CdVKO*uick_Az+j+`K;$cgcunx*n1Bl=(7v(pwFt)w?Zy^ySvR6kP7K_ib_afJL3 zifc=P)HH`DH(V&93u_r|o5pQI@N0gyyL9aEN;M$K)7ri5a5ArLoh8j^xiDCsa}V*4 zKYFQ6I8}tKSGoDp=Q3dw+{I{wQj$ccj{(Cv!)AKlMa+{R1aKbqWQrAw47rzxP6V*bx=GEtn==u z-RtUm_w�-9NMMjj!Fik9Mb`yr?f>=5x{|DVBOE?%4}$_{p@ZL+X9(&-5iCi535T zxR2bWSv1{n_tQ7&3mw*gM-UHWUrl`KRq{E{l4kF zwWD&13De^uXKaD5x|<_>oE)_B97N8C2u11#4&3v``o2+P(b{%deJ*LHEvA{V2S`fQ z&UOb#a{V|5c_b<6``7%?{)0CBJhUs3aoe~1V9nId$Hk=-Ym#)x_*}#n*jU8y_pR; z>CH)L63-B4(D-CE=Y^PRrO*$r3@i$roeJq_b~{*%6-V-#!yz3zrM5Unbg3>rFMXXY zF%RUFh)WIg1TO0ARbbRp>?Gla&s8%tS-`Rdwwor*ymgyoKordB2u+M#QFk#H39@ym zPhgi{aV?Wy$yRBC(PvN07F9lD4M$u;vVed`8_u~g#2RUTQ*JwTTE?Zc+i6vFw^D*X zu`VRJU7H5zg+XRGs|;fgC z+AuVOcsPq%gi)6jEU`KF_8TB=&i8 z1s22JX>-kfU3aBw=f@fLwF$OmyE!-I&RKUc%$<88CX?sf07N@S33R>s9J;sb4{;)9 z0Iw2V9gRu}8&?tU3E;5OIV<=DSdV^@L2O}0kZZE*wMw0=M2pV3wxsOPh%XZFSyC~i zLXy?A$2Kz2D(T^JI`SPC;9f0c)d@(3>Iq+EB@{4Taosk}ScOkrAVJ=2JY$Ecv&(}|IK+>;_J+lUVCa&^MbDSGx#vUd$ zV&^5ajJ`SCHDc6CvQ(awz0#fCE^j}+2G0r!8oJSOjcgF>KMI5ler5O4zSgpR3cnXc ztD3t^Z+Encc$M2BS*ZW_EdEtClYp31KF2G6iVK^$eJX#rCEoXM$mGk;hzr+9)XV~U^vX$fZu znbB>J7MQn1#pc*nVx~<2V;Pa@c7Vu;qhhJditn^gZ8P?+huKGl*nFq#5Rvjl44PuU zHCj+}(A!qo;yx*;>6qlXCjVGUMs-#NRc*8xE<6@s6U*^ zFxAXl72G3=VTTpBmfBuayF1?MdVJflaIvirk4+k0I9y?AqB=`;yey;h)wCa@8Z22i z4o(*ib0iLPdtz?xOszu_fn=gPi1X~W%dpxTj|+2)4=ya6Ju*AHcyez3n6hFg=FS~G zIsf32f4{K6#REgwBXehGXHOlg9b1??g*1~cXh;>8IV@Bc4}QR&YDd13rVGP()?Yoi zo{v*b1XHNgM7VpH^H&d*X*XxW@oCEg(&(Fy9ddJ`Ja<$<3%lS2pAWM4K05YFwBbU6 zc2~KNU?rv+QDpk{ftw=#t?wpQkw}Eq2eu&`>>@10EaM;G-_CH#2|=eBW!P!U|NBtT zBVDg1_tzA>Lx=wvLjRGd4=)vn%_PsIyA6)BB4;W$8qcTBM?;5Ew;wQJv&x$XWGUQY z@MCmWK|HP&lWKU4&wI8V^ZITy@B|&h|GO%q#K0%9d;G-h?TK;%dlb8Q@1v^?XC#VT zY)D&&jCXCaE1Q-vv?g{<2?ng!8fPc}U)mmF>^bWrgkLUn}AdRa0{WICKiCW@a zfAg`SGEC+xJwrQg#SP>Myahng6rwbcUb8G2Cz00Rv_Q}zKdEd8mTROTW|=FHQ5$@# zdKu15y~*m~MaU>WVXEtoQU4?g{Y48o!pU0@=WlvQu7yhvg>rCI{=hG!v?+Pl=b!A8 zPkLn|L4oI$lL+@A^5({;NpvHEELHxqQY`-tb2qh-+w#T;4paeQ#;?_s(_={6ku&D@ zqZ%RPo=|6dDUQnQ6!PhBPRKR;>y%*zPZudjjf7oM>qWMMYm|DpMiC!o?5C#kKU1Pn zX#8q%qg4{Y+nJC%EU#u*sP|x7B*SdlThsq~^puX-Ag>WY*EWgrR`)4Lb;!_{88XPU zvXXv3e1^+m(8=+%A%@te@~D-97#{@qtCfc1=AflWPNx?BTLS@iuW&{Oz~NEP3kMMu zxjU)8R-chQgTo=Ew^eKI<+_8_;wqoGR8bs2G*#ZIY%!;wPkA_KOu}tO+SPJHy0How z2oIDos635wn-VigvtO5@La)EFXJbjwN_In{QRAk4x((J~iyl;N1{KI{igicb9rN1;`ST{n+}Mr_{gGSUsVcH1;4 zc{jEWWyY`TW(F?7ixt;s@T;NdS@$y1F%)UEGHIb$nE1PzdL_|bkJ#6cB92zk_6=I( iQ`B20O-JdxF*91`ceh9mdxN?${R

NZgzN2l0Oe%%)ZV literal 0 HcmV?d00001 diff --git a/src/apps/bin/bison/po/nl.po b/src/apps/bin/bison/po/nl.po new file mode 100644 index 0000000000..5606008812 --- /dev/null +++ b/src/apps/bin/bison/po/nl.po @@ -0,0 +1,750 @@ +# Dutch messages for GNU bison. +# Copyright (C) 1996, 2002, 2003 Free Software Foundation, Inc. +# Tim Van Holder , 2002, 2003. +# Erick Branderhorst , 1996. +# +msgid "" +msgstr "" +"Project-Id-Version: bison 1.875a\n" +"Report-Msgid-Bugs-To: bug-bison@gnu.org\n" +"POT-Creation-Date: 2004-05-21 10:26-0700\n" +"PO-Revision-Date: 2003-02-02 02:19+0100\n" +"Last-Translator: Tim Van Holder \n" +"Language-Team: Dutch \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: src/complain.c:51 src/complain.c:66 +msgid "warning: " +msgstr "let op: " + +#: src/complain.c:122 src/complain.c:138 +msgid "fatal error: " +msgstr "fatale fout: " + +#: src/conflicts.c:76 +#, c-format +msgid " Conflict between rule %d and token %s resolved as shift" +msgstr " Conflict tussen regel %d en token %s opgelost als shift" + +#: src/conflicts.c:84 +#, c-format +msgid " Conflict between rule %d and token %s resolved as reduce" +msgstr " Conflict tussen regel %d en token %s opgelost als reductie" + +#: src/conflicts.c:91 +#, c-format +msgid " Conflict between rule %d and token %s resolved as an error" +msgstr " Conflict tussen regel %d en token %s opgelost als een fout" + +#: src/conflicts.c:399 +#, c-format +msgid "conflicts: %d shift/reduce, %d reduce/reduce\n" +msgstr "conflicten: %d shift/reductie, %d reductie/reductie\n" + +#: src/conflicts.c:402 +#, c-format +msgid "conflicts: %d shift/reduce\n" +msgstr "conflicten: %d shift/reductie\n" + +#: src/conflicts.c:404 +#, c-format +msgid "conflicts: %d reduce/reduce\n" +msgstr "conflicten: %d reductie/reductie\n" + +#: src/conflicts.c:422 +#, c-format +msgid "State %d " +msgstr "Staat %d" + +#: src/conflicts.c:487 +#, fuzzy, c-format +msgid "%%expect-rr applies only to GLR parsers" +msgstr "%s is enkel van toepassing op GLR parsers" + +#: src/conflicts.c:511 +#, c-format +msgid "expected %d shift/reduce conflict" +msgid_plural "expected %d shift/reduce conflicts" +msgstr[0] "%d shift/reductie conflict werd verwacht" +msgstr[1] "%d shift/reductie conflicten werden verwacht" + +#: src/conflicts.c:515 +#, fuzzy, c-format +msgid "expected %d reduce/reduce conflict" +msgid_plural "expected %d reduce/reduce conflicts" +msgstr[0] "er werden geen reductie/reductie conflicten verwacht" +msgstr[1] "er werden geen reductie/reductie conflicten verwacht" + +#: src/files.c:100 +#, c-format +msgid "cannot open file `%s'" +msgstr "kan bestand `%s' niet openen" + +#: src/files.c:116 +msgid "I/O error" +msgstr "I/O fout" + +#: src/files.c:119 +msgid "cannot close file" +msgstr "kan bestand niet sluiten" + +#: src/files.c:337 +#, c-format +msgid "conflicting outputs to file %s" +msgstr "conflicterende uitvoer naar bestand %s" + +#: src/getargs.c:186 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "Probeer `%s --help' voor meer informatie.\n" + +# Dank U, Akim :-) +#: src/getargs.c:192 +msgid "GNU bison generates parsers for LALR(1) grammars.\n" +msgstr "GNU bison genereert parsers voor LALR(1) grammatica's.\n" + +#: src/getargs.c:196 +#, c-format +msgid "Usage: %s [OPTION]... FILE\n" +msgstr "Gebruik: %s [OPTIE]... BESTAND\n" + +#: src/getargs.c:200 +msgid "" +"If a long option shows an argument as mandatory, then it is mandatory\n" +"for the equivalent short option also. Similarly for optional arguments.\n" +msgstr "" +"Wanneer een lange optie een argument als verplicht aanduidt, dan is dat\n" +"argument eveneens verplicht bij de overeenkomstige korte optie. Voor\n" +"optionele argumenten geldt dezelfde regel.\n" + +# Misschien beter 'een POSIX-compatibele yacc'? +#: src/getargs.c:206 +msgid "" +"Operation modes:\n" +" -h, --help display this help and exit\n" +" -V, --version output version information and exit\n" +" -y, --yacc emulate POSIX yacc\n" +msgstr "" +"Werkwijzes:\n" +" -h, --help toon deze hulptekst en beëindig het programma\n" +" -V, --version toon versie-informatie en beëindig het programma\n" +" -y, --yacc emuleer POSIX yacc\n" + +# Correcte vervoeging van 'voorvoegen'? +# Betere vertaling voor 'directives'? +#: src/getargs.c:213 +msgid "" +"Parser:\n" +" -S, --skeleton=FILE specify the skeleton to use\n" +" -t, --debug instrument the parser for debugging\n" +" --locations enable locations computation\n" +" -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n" +" -l, --no-lines don't generate `#line' directives\n" +" -n, --no-parser generate the tables only\n" +" -k, --token-table include a table of token names\n" +msgstr "" +"Parser:\n" +" -S, --skeleton=BESTAND geef het te gebruiken skeletbestand op\n" +" -t, --debug maak de parser geschikt voor debugging\n" +" --locations enable locations computation\n" +" -p, --name-prefix=PREFIX geef een PREFIX op voor de externe symbolen\n" +" -l, --no-lines genereer geen `#line' directieven\n" +" -n, --no-parser genereer alleen de tabellen\n" +" -k, --token-table genereer ook een tabel van tokennamen\n" + +#: src/getargs.c:225 +msgid "" +"Output:\n" +" -d, --defines also produce a header file\n" +" -r, --report=THINGS also produce details on the automaton\n" +" -v, --verbose same as `--report=state'\n" +" -b, --file-prefix=PREFIX specify a PREFIX for output files\n" +" -o, --output=FILE leave output to FILE\n" +" -g, --graph also produce a VCG description of the " +"automaton\n" +msgstr "" +"Uitvoer:\n" +" -d, --defines genereer ook een header-bestand\n" +" -r, --report=DINGEN genereer ook details over de automaat\n" +" -v, --verbose hetzelfde als `--report=state'\n" +" -b, --file-prefix=PREFIX geef een PREFIX op voor de uitvoerbestanden\n" +" -o, --output=BESTAND schrijf uitvoer naar BESTAND\n" +" -g, --graph genereer ook een VCG beschrijving van de " +"automaat\n" + +# Verschillende dingen die beter zouden moeten kunnen - zeker de 'itemset' tekst +#: src/getargs.c:236 +msgid "" +"THINGS is a list of comma separated words that can include:\n" +" `state' describe the states\n" +" `itemset' complete the core item sets with their closure\n" +" `lookahead' explicitly associate lookaheads to items\n" +" `solved' describe shift/reduce conflicts solving\n" +" `all' include all the above information\n" +" `none' disable the report\n" +msgstr "" +"DINGEN is een door komma's gescheiden lijst van woorden; geldige woorden " +"zijn:\n" +" `state' beschijft de staten van de automaat\n" +" `itemset' vervolledig de verzamelingen van core items met hun " +"closures\n" +" `lookahead' verbind lookaheads expliciet met items\n" +" `solved' beschijft het oplossen van shift/reductie conflicten\n" +" `all' bevat al de bovenstaande keuzes\n" +" `none' schakel de rapportering uit\n" + +#: src/getargs.c:247 +msgid "Report bugs to .\n" +msgstr "" +"Meld bugs aan .\n" +"Meld fouten in de vertaling aan .\n" + +#: src/getargs.c:264 +#, c-format +msgid "bison (GNU Bison) %s" +msgstr "bison (GNU Bison) %s" + +#: src/getargs.c:266 +msgid "Written by Robert Corbett and Richard Stallman.\n" +msgstr "Geschreven door Robert Corbett en Richard Stallman.\n" + +#: src/getargs.c:270 +#, c-format +msgid "Copyright (C) %d Free Software Foundation, Inc.\n" +msgstr "Copyright (C) %d Free Software Foundation, Inc.\n" + +#: src/getargs.c:272 +msgid "" +"This is free software; see the source for copying conditions. There is NO\n" +"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +msgstr "" +"Dit is vrije software; zie de broncode voor kopieercondities. Er is GEEN\n" +"garantie; zelfs niet voor VERKOOPBAARHEID of GESCHIKTHEID VOOR EEN BEPAALD\n" +"DOEL.\n" + +#: src/getargs.c:438 +#, c-format +msgid "missing operand after `%s'" +msgstr "operand ontbreekt na `%s'" + +#: src/getargs.c:440 +#, c-format +msgid "extra operand `%s'" +msgstr "overtollige operand `%s'" + +#: src/gram.c:139 +msgid "empty" +msgstr "leeg" + +#: src/gram.c:233 +msgid "Grammar" +msgstr "Grammatica" + +#: src/gram.c:321 src/reduce.c:394 +msgid "warning" +msgstr "let op" + +#: src/main.c:124 +msgid "rule never reduced because of conflicts" +msgstr "regel wordt nooit gereduceerd omwille van conflicten" + +#: src/parse-gram.y:363 +msgid "POSIX forbids declarations in the grammar" +msgstr "POSIX verbiedt declaraties binnen de grammatica" + +#: src/parse-gram.y:486 +msgid "missing identifier in parameter declaration" +msgstr "naam ontbreekt in parameterdeclaratie" + +#: src/print.c:49 +#, c-format +msgid " type %d is %s\n" +msgstr " type %d is %s\n" + +#: src/print.c:165 +#, c-format +msgid "shift, and go to state %d\n" +msgstr "shift, en ga naar staat %d\n" + +#: src/print.c:167 +#, c-format +msgid "go to state %d\n" +msgstr "ga naar staat %d\n" + +#: src/print.c:204 +msgid "error (nonassociative)\n" +msgstr "fout (niet associatief)\n" + +#: src/print.c:292 +#, c-format +msgid "reduce using rule %d (%s)" +msgstr "reduceren via regel %d (%s)" + +#: src/print.c:294 +#, c-format +msgid "accept" +msgstr "accepteer" + +#: src/print.c:325 src/print.c:391 +msgid "$default" +msgstr "$standaard" + +#: src/print.c:420 +#, c-format +msgid "state %d" +msgstr "staat %d" + +#: src/print.c:456 +msgid "Terminals, with rules where they appear" +msgstr "Eindsymbolen, met de regels waarin ze voorkomen" + +# Betere vertaling voor non-terminals? 'tussensymbolen'? +#: src/print.c:483 +msgid "Nonterminals, with rules where they appear" +msgstr "Niet-eindsymbolen, met de regels waarin ze voorkomen" + +#: src/print.c:512 +#, c-format +msgid " on left:" +msgstr " links:" + +#: src/print.c:527 +#, c-format +msgid " on right:" +msgstr " rechts:" + +#: src/print.c:555 +msgid "Rules never reduced" +msgstr "Regels die nooit gereduceerd worden" + +#: src/reader.c:56 +#, c-format +msgid "multiple %s declarations" +msgstr "meerdere %s declaraties" + +#: src/reader.c:118 +#, c-format +msgid "result type clash on merge function %s: <%s> != <%s>" +msgstr "botsing tussen resultaattypes bij merge-functie %s: «%s» != «%s»" + +#: src/reader.c:216 +#, c-format +msgid "rule given for %s, which is a token" +msgstr "regel opgegeven voor token (%s)" + +#: src/reader.c:245 +#, c-format +msgid "type clash on default action: <%s> != <%s>" +msgstr "type-conflict bij standaardaktie: «%s» != «%s»" + +#: src/reader.c:251 +msgid "empty rule for typed nonterminal, and no action" +msgstr "lege regel voor niet-eindsymbool met type, en geen actie" + +#: src/reader.c:321 src/reader.c:335 src/reader.c:348 +#, c-format +msgid "only one %s allowed per rule" +msgstr "slechts één %s toegestaan per regel" + +#: src/reader.c:331 src/reader.c:346 +#, c-format +msgid "%s affects only GLR parsers" +msgstr "%s is enkel van toepassing op GLR parsers" + +#: src/reader.c:333 +#, c-format +msgid "%s must be followed by positive number" +msgstr "%s moet gevolgd worden door een positief getal" + +#: src/reader.c:490 +msgid "no rules in the input grammar" +msgstr "invoergrammatica bevat geen regels" + +#: src/reduce.c:242 +msgid "useless rule" +msgstr "nutteloze regel" + +#: src/reduce.c:303 +#, c-format +msgid "useless nonterminal: %s" +msgstr "nutteloos niet-eindsymbool: %s" + +#: src/reduce.c:351 +msgid "Useless nonterminals" +msgstr "Nutteloze niet-eindsymbolen" + +#: src/reduce.c:364 +msgid "Terminals which are not used" +msgstr "Eindsymbolen die niet gebruikt worden" + +#: src/reduce.c:373 +msgid "Useless rules" +msgstr "Nutteloze regels" + +#: src/reduce.c:389 +#, c-format +msgid "%d rule never reduced\n" +msgid_plural "%d rules never reduced\n" +msgstr[0] "%d regel wordt nooit gereduceerd\n" +msgstr[1] "%d regels worden nooit gereduceerd\n" + +#: src/reduce.c:397 +#, c-format +msgid "%d useless nonterminal" +msgid_plural "%d useless nonterminals" +msgstr[0] "%d nutteloos niet-eindsymbool" +msgstr[1] "%d nutteloze niet-eindsymbolen" + +#: src/reduce.c:403 +#, c-format +msgid " and " +msgstr " en " + +#: src/reduce.c:406 +#, c-format +msgid "%d useless rule" +msgid_plural "%d useless rules" +msgstr[0] "%d nutteloze regel" +msgstr[1] "%d nutteloze regels" + +# Ik _denk_ dat dit correct weergeeft wat er bedoeld wordt (m.a.w. er is geen regel voor het startsymbool) +#: src/reduce.c:436 +#, c-format +msgid "start symbol %s does not derive any sentence" +msgstr "uit startsymbool %s kan geen enkele zin afgeleid worden" + +#: src/scan-gram.l:162 +msgid "stray `,' treated as white space" +msgstr "losse `,' behandeld als witruimte" + +#: src/scan-gram.l:225 +#, c-format +msgid "invalid directive: %s" +msgstr "ongeldig commando: %s" + +#: src/scan-gram.l:283 +#, c-format +msgid "invalid character: %s" +msgstr "ongeldig teken: %s" + +#: src/scan-gram.l:402 +#, fuzzy +msgid "invalid null character" +msgstr "ongeldig teken: %s" + +#: src/scan-gram.l:415 src/scan-gram.l:427 src/scan-gram.l:448 +#, c-format +msgid "invalid escape sequence: %s" +msgstr "ongeldige escape: %s" + +#: src/scan-gram.l:417 src/scan-gram.l:429 src/scan-gram.l:450 +#, fuzzy, c-format +msgid "invalid null character: %s" +msgstr "ongeldig teken: %s" + +#: src/scan-gram.l:455 +#, c-format +msgid "unrecognized escape sequence: %s" +msgstr "onbekende escape: %s" + +#: src/scan-gram.l:537 +#, c-format +msgid "missing `{' in `%s'" +msgstr "`{' ontbreekt in `%s'" + +#: src/scan-gram.l:782 +#, c-format +msgid "$$ of `%s' has no declared type" +msgstr "$$ van `%s' heeft geen gedeclareerd type" + +#: src/scan-gram.l:803 +#, c-format +msgid "$%d of `%s' has no declared type" +msgstr "$%d van `%s' heeft geen gedeclareerd type" + +# Hier zou wel het bereik bij vermeld mogen worden... +#: src/scan-gram.l:812 src/scan-gram.l:881 src/scan-gram.l:932 +#, c-format +msgid "integer out of range: %s" +msgstr "integer buiten bereik: %s" + +#: src/scan-gram.l:848 src/scan-gram.l:916 +#, c-format +msgid "invalid value: %s" +msgstr "ongeldige waarde: %s" + +#: src/scan-gram.l:1036 +#, c-format +msgid "missing `%s' at end of file" +msgstr "`%s' ontbreekt aan einde van bestand" + +#: src/scan-gram.l:1047 +#, fuzzy, c-format +msgid "missing `%s' at end of line" +msgstr "`%s' ontbreekt aan einde van bestand" + +#: src/symlist.c:97 src/symlist.c:108 +msgid "invalid $ value" +msgstr "ongeldige $-waarde" + +#: src/symtab.c:85 +#, c-format +msgid "type redeclaration for %s" +msgstr "type herdeclaratie voor %s" + +# Dit ziet er een potentieel slechte originele string uit - wat kan er in die eerste '%s' staan? +#: src/symtab.c:102 src/symtab.c:120 +#, c-format +msgid "%s redeclaration for %s" +msgstr "%s herdeclaratie voor %s" + +#: src/symtab.c:139 +#, c-format +msgid "redefining precedence of %s" +msgstr "herdefinitie van de voorrang van %s" + +#: src/symtab.c:157 +#, c-format +msgid "symbol %s redefined" +msgstr "symbool %s opnieuw gedefinieerd" + +#: src/symtab.c:180 +#, c-format +msgid "redefining user token number of %s" +msgstr "herdefinitie van het door de gebruiker gekozen tokennummer van %s" + +#: src/symtab.c:207 +#, c-format +msgid "symbol %s is used, but is not defined as a token and has no rules" +msgstr "" +"symbool %s wordt gebruikt, maar is niet gedefinieerd als een teken en heeft " +"geen regels" + +#: src/symtab.c:232 +#, c-format +msgid "symbol `%s' used more than once as a literal string" +msgstr "symbool `%s' meer dan eens gebruikt als een letterlijke string" + +#: src/symtab.c:235 +#, c-format +msgid "symbol `%s' given more than one literal string" +msgstr "symbool `%s' krijgt meer dan één letterlijke string toegewezen" + +#: src/symtab.c:271 +#, c-format +msgid "conflicting precedences for %s and %s" +msgstr "voorrangen voor %s en %s geven conflicten" + +#: src/symtab.c:283 +#, c-format +msgid "conflicting associativities for %s (%s) and %s (%s)" +msgstr "associativiteitswaarden voor %s (%s) en %s (%s) geven conflicten" + +#: src/symtab.c:368 +#, c-format +msgid "tokens %s and %s both assigned number %d" +msgstr "tokens %s en %s hebben beide nummer %d toegewezen gekregen" + +#: src/symtab.c:591 +#, c-format +msgid "the start symbol %s is undefined" +msgstr "het startsymbool %s is niet gedefinieerd" + +#: src/symtab.c:595 +#, c-format +msgid "the start symbol %s is a token" +msgstr "het startsymbool %s is een token" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "ongeldige argument %s voor %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "argument %s voor %s is niet eenduidig" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Geldige argumenten zijn:" + +#: lib/bitset_stats.c:179 +#, c-format +msgid "%u bitset_allocs, %u freed (%.2f%%).\n" +msgstr "%u bitset_allocs, %u vrijgegeven (%.2f%%).\n" + +#: lib/bitset_stats.c:182 +#, c-format +msgid "%u bitset_sets, %u cached (%.2f%%)\n" +msgstr "%u bitset_sets, %u gecached (%.2f%%)\n" + +#: lib/bitset_stats.c:185 +#, c-format +msgid "%u bitset_resets, %u cached (%.2f%%)\n" +msgstr "%u bitset_resets, %u gecached (%.2f%%)\n" + +#: lib/bitset_stats.c:188 +#, c-format +msgid "%u bitset_tests, %u cached (%.2f%%)\n" +msgstr "%u bitset_tests, %u gecached (%.2f%%)\n" + +#: lib/bitset_stats.c:192 +#, c-format +msgid "%u bitset_lists\n" +msgstr "%u bitset_lists\n" + +#: lib/bitset_stats.c:194 +msgid "count log histogram\n" +msgstr "count log histogram\n" + +#: lib/bitset_stats.c:197 +msgid "size log histogram\n" +msgstr "size log histogram\n" + +#: lib/bitset_stats.c:200 +msgid "density histogram\n" +msgstr "density histogram\n" + +#: lib/bitset_stats.c:214 +#, c-format +msgid "" +"Bitset statistics:\n" +"\n" +msgstr "" +"Bitset statistieken:\n" +"\n" + +#: lib/bitset_stats.c:217 +#, c-format +msgid "Accumulated runs = %u\n" +msgstr "Accumulated runs = %u\n" + +#: lib/bitset_stats.c:261 lib/bitset_stats.c:266 +msgid "Could not read stats file." +msgstr "Kon het statistiekenbestand niet lezen." + +#: lib/bitset_stats.c:263 +#, c-format +msgid "Bad stats file size.\n" +msgstr "Het statistiekenbestand heeft een verkeerde grootte.\n" + +#: lib/bitset_stats.c:289 lib/bitset_stats.c:291 +msgid "Could not write stats file." +msgstr "Kon niet schrijven naar het statistiekenbestand." + +#: lib/bitset_stats.c:294 +msgid "Could not open stats file for writing." +msgstr "Kon het statistiekenbestand niet openen voor schrijven." + +#: lib/error.c:127 +msgid "Unknown system error" +msgstr "Onbekende systeemfout" + +#: lib/getopt.c:570 lib/getopt.c:589 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: optie `%s' is niet eenduidig\n" + +#: lib/getopt.c:622 lib/getopt.c:626 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: optie `--%s' staat geen argument toe\n" + +#: lib/getopt.c:635 lib/getopt.c:640 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: optie `%c%s' staat geen argument toe\n" + +#: lib/getopt.c:686 lib/getopt.c:708 lib/getopt.c:1039 lib/getopt.c:1061 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: optie `%s' vereist een argument\n" + +#: lib/getopt.c:746 lib/getopt.c:749 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: onbekende optie `--%s'\n" + +#: lib/getopt.c:757 lib/getopt.c:760 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: onbekende optie `%c%s'\n" + +#: lib/getopt.c:815 lib/getopt.c:818 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: ongeldige optie -- %c\n" + +#: lib/getopt.c:824 lib/getopt.c:827 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ongeldige optie -- %c\n" + +#: lib/getopt.c:882 lib/getopt.c:901 lib/getopt.c:1114 lib/getopt.c:1135 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: optie vereist een argument -- %c\n" + +#: lib/getopt.c:954 lib/getopt.c:973 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: optie `-W %s' is niet eenduidig\n" + +#: lib/getopt.c:997 lib/getopt.c:1018 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: optie `--%s' staat geen argument toe\n" + +#: lib/obstack.c:417 lib/obstack.c:420 lib/xmalloc.c:53 +msgid "memory exhausted" +msgstr "geen geheugen meer beschikbaar" + +#: lib/quotearg.c:238 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:239 +msgid "'" +msgstr "'" + +#: lib/subpipe.c:171 +#, c-format +msgid "subsidiary program `%s' could not be invoked" +msgstr "hulpprogramma `%s' kon niet opgeroepen worden" + +#: lib/subpipe.c:173 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "hulpprogramma `%s' niet gevonden" + +#: lib/subpipe.c:175 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "hulpprogramma `%s' mislukt" + +#: lib/subpipe.c:176 +#, c-format +msgid "subsidiary program `%s' failed (exit status %d)" +msgstr "hulpprogramma `%s' mislukt (eindstatus %d)" + +#: lib/timevar.c:475 +msgid "" +"\n" +"Execution times (seconds)\n" +msgstr "" +"\n" +"Uitvoeringstijden (in seconden)\n" + +#: lib/timevar.c:525 +msgid " TOTAL :" +msgstr " TOTAAL :" + +#: lib/timevar.c:561 +#, c-format +msgid "time in %s: %ld.%06ld (%ld%%)\n" +msgstr "tijd in %s: %ld.%06ld (%ld%%)\n" diff --git a/src/apps/bin/bison/po/pt_BR.gmo b/src/apps/bin/bison/po/pt_BR.gmo new file mode 100644 index 0000000000000000000000000000000000000000..a37851ec81d8b0f80ade2bcf0cc67f2a2fe85664 GIT binary patch literal 14670 zcmbuF35*i#b!xXPGk_`h*%LRzyJ5D z`WVlw4Jpm*e;x1m-uJ%ieQ*Bt=Ih@da6Lk~jdJMvAovvchNttxwd)x{@Dgx0cn>%S z9s(Z$4}zZsUkLs$cmw$SX9mHKfwzG*@a5ohz(X-6p+y)z<`uRoh z9N#|xYCWF{({_Rm`~Y|#D7wA|iryPpJkfOZ`jr(h$*5?mF_49R*sRrK%ZvdYO z^Y(%_gOD5?1@8r42ddt0f}-~iKv*7p24v{qAIj%TAb-L4`4L^WGN|wspvFJKkLZ2_ z2gzJ3V&De#k^`uQhN{eKUXygi4>Xg+m*cop0az7%YMOd)tL_)74jpycSQ zpw{CDp!(ZECmQF~pyYT7lwQ08bl`i-_a6hr$FG3m$M?Y7!I$%L2D}ecKR*vng1-TZ z|DOl>3$8=h9q2$k&w#tY6;Sf_UQqOY8g$?nK=J#VAgUPL$V;G`IQns4NCvM3`$O7Kt?}6g;*Fo{=8{kL4CqT9Tbr$be!M_9F&wvd&;ZyK^nDLi9-;U5q zZvPXZlAXF4BGlh*@O^wg0BXLUqcf`q{;lf4EYb5XAR-#v2y?`@9ia5)2>5L9EGRxl zp!oZCQ1ku-cq8~pQ0@N+lwN-cR6mzM$;%DOWS9`GE7nS$3B|@5Ahf0(l>53>?iy6v0C?Q4HgB0;{ zneqn8S&FVX3T(Gava5M%&bnSpxu1d=8N1$EKHUe(zKA!{L-A1jK1|W|b`QauL9O@C zl+Uda-&x`r@GX?5md}ExQ|>LF3sCE>>nP=2lm{r{xvrQ3OM?bwg_2OT&Wn^sD7v&R zncaCAd=B^LC_ReSP}el&rz!IkL?n1OlJotP*HP9eIpqW;rRaJg<+$CUf1u<>*F{Q`@(|_ulv^m0t#!)lDK}BxMA0Ri z(50NFNPeF}sjjD$H+cl&*&`#Zj`%SdDKXgX1==?IIh_=X?5a8;Z~#Kd=w=v>vtkI(R5+bbVYiOHxs$b zqCD-aN4(AX;G!%`vmdc}7B%~g=tpdvuf?q*aLWtJGbcp-*fkv((Sc*Gov2mt%v~0@ z*K}KK^lV;n&V*{gjvX#-xs{20r(0uEN$Q$WqZ2}%)eLsPf+w%gj9Ov8Qv_5ro+Z(G zl)))YuUV^J)Abea`+3xfat)dkQPz!R!#QSL%cREo! z?6|aNU+Q%?(O`1=lB|cF7%pA$rF^q8(GYu^X_O~B3m1w2Nl%!y``suhd^dy2RAp_# z?rPlbr+t=4gN%O7qPO&8Bysyb>h&LD!1{yC@tVmiYi~>8R>ZjxZuOH4y=y1&Mb=<2 zD>2AVbj$BHAHMh9YFy+|@n-R`k?(Q5X=M>T?V6a}-~U=Mx)>Dcfx`JvVM}g!w^~vj)qN_7a;=Lim@#@EP&jj zHY580xp5<(uGNCsw6|dj>vqlVb`wo^j9I#+v{jr(HQlkapEONG_qh3_K`*muztcpK z3V4dC8W~11d_F_YllJ6DwJaK=X7rP4L*9VW$>8{@GjKk~inOC7%9vPQ=@tr=xf3%d z7I*F2?b=z`?V@uKbll$t^LrOcGdbUKq3fhcyIS^qEj>Rb#ImYg>}^=2*~T7MtTB_g zkTwk7)-)U+oOA%aLwy|mWSX}rX4uKoN#~a0Zj2Sf4yb|uhW1t}Ckjsutqv=BJ}%bG ze&z1`S_F?7WW$BMUKD1*LQj*H@93t@h!t|KzP1OkUW+aMg=Afyk~OV6+uHsMj~bM#B#gd6{yj7nbH<xj9uc1>t(4dGHbBL(qo||grY4|yDaL##KX(?&7V5HR5c!J*NloV?#Q?r z|HFQfLUNj@i}iAPt7#rpjXmaJmmzbvG8jT~741~3Rkaco^paGTK`k*7bK|GY#F@ z+2gpuyphFTsBnOix#64xzXp)C8aMOOW!eJf_yen4>OyeZe2}fslE%-^;q>6!7|qp$ zHA+>1s6(z$gcoYqj8^;Y&4kBEUS#G)Y*6p;Oy;e68?C1UUG+L9vn0{KvEL{OS20Gz zZ;iBzY+6MP-P6zst9ZpCv1pi@X0=36YkGMBSB@ih`9^m&?bu3ntdF$bxk5CXsXSt3 zRNTtTR0UszduzxuTl1uBUQTX=_(4OBTxcTR`HS##YGr|2-M$Q)#Yv;nZ%PyV2d%CJ zc$y~uV$pQL!R=gYaEP0_S-&Igq(7Nv?R&5uiv%H?Vwzw{qAhD3lzJpD>EwkJLc!Q> z=<(Bk=VtgLt}_7D;Vi6u4<>Rre#B}e5FQ; z0n>Me!`+x|qj8+MMkmetnS^SklcwiF*#he!y3iy1jSDPhnCEFD)>H;nj1e}Vk!LY* zIdG{ckY_>ZULW`|TOUv7P7$*g!xh|i)e5Qy>(J@g)WX#iwH+~r8jIKvfv7I5tcj~Q z;Z0U8SS~|H8Sc2ThK(nn!x5r8&EdzZSomd`ZT=KZK(Y6;2Vq~y^|YU1J7tC%xMrrK z2{!SnX_Dh^md$0*{?tMZ51oZcv2oC-Am~l3-O0Jd+52WrEzcaCKQX`jT1QvM=9f>+ zEiJiY3yW^Xot{}-o}WE)VrJ2uKC_5{nM2H$vke93h_ZajPV1>_t2^`=R6CQLOVacB z{f%6!?)N2U@~|CE6WqDiFPvVUUpV!~$;nA?41+UQhTi$$r2_0cIBQYuz+;N9)4_wp z1_d)BdR|P4nF}^f8Cxd8T1>$r{13CHLlHV1d^VJ=1o)|_R|JEAcHo3XnK(*>?SqS5 ziZhNX&LHN=1GGZxD3OKrnEmRFg*bX)`<9>*HLXe|yYV_}gM#}02@mt#Mj=D$eyojm z6ei-{nd zU2!jLsfI=h2n355bFWE{>{s)EWi{nhudNu!^F~zOh3zNN!Bk*mOaz&pVJ=$k!A?cB8C~Quh-RLdKYO zhbHoS-0g=A1M8tp1mKP5gd%ja?&eZ$d|ziQtKe3n1}j7CCwE&qpunWpi~VMC(;jTI zX5oA>Yd(B22D5KBQ%=yVWI>p0AScKvauS%QW~$s|ME@&$cDjPCmGp+F7m~G;>V>M= zU(MrY93nr2;#v|fHI2c}4Ht^&!diOUrgDoA{HmYbE^RwZsrn>&n!C5{PUf|xy<{+) zE)16E+(Z0hTQAk|y9%H6Di>e+TqcaXyBPLRN|NZb7|_qtFQ)k}Vx9ycfb*~?Q><8I z$lX|V(ZFuYHeyy=TNfWrjkS@KZ(gwx8QJDDQ?`v#Gf*;6+9C;@=rkuMrtV}Ty^CA2 z3AMl^O_{RFd#tAH6S0(WJApu-IMVuCT5TZS^sby(X=69ZwpA6AlxOq1zS0ejB|o+@ zNpJ<%JeDyt!&JT3QUnAbQsWA-vZu53A&hx_zF9x(H=)zzetzHN-FMwl^AT_TWZsUO z^`peS_2rZro8#Wv>4oL`ti&6~QNI@{pLYAFre0Z}x}&~-pW8Pzz5mYo)Lm0kRID#X z>#?@G!+HnmQ~T;uce<(l(+8&NQwOMbBFu~WGFCn(Tasd^XFAaZM2lrVMxri4^4v*M z4i{0uLt%?-S#z{>_1iX{0**$cTwEF})_2nq+PP?O7crot8h|Fm=wEcFUl#e^q zY4+-?*^$-oVwlk~vE9Y6kCXE!=Z2iwH#t?CmBUP+4fi?i3jEk!w)b&z(8;S1RUe*T zTBzTB_Z_dQ?;BRuL|Rc+pGz8PlO>pTce8USYNtDW#JqltT|Q!#^z1P|y#Ju{w}*En z?jE;q_rY3FTgHK>GV8b*GS-hjmMT@2D9fz( zmaQe>t$a7r+5A3Pf0T5$xWN|%cWP7SxU~jhvn#KcM9CTyRPkB5xjrj)Nm=g8Xzv!^ zaA5=pPtt+UaVw6!rt!+W^|cdNHrR$n&!g>#yn-jnc_(WmwJN@qHOfiAwecE*jP*#O zyA!kDV%fEW`5}|tXoaPz2Q6XvV2DAw`$=mJ6W&`?+ZovD+T-6vB1511ZX&5Z?Y$hb z6I?^wSgK4}Ta!HU=V5VK32!Q5pKM3KesON}Jre2@{^L3E-;w@bEh9cJGn!vskI4G2 zW~4s08{8DYl6^%u8H_aRpikSBkaF=Q$AG{%` zI&AbaEY2{=P8tMVz0@VwF^|G_bZ!;-CTU(9C^_l3UIV8e#+G3pnn6M`Ei!9eS~s#M zFiknMkeRc??gl4Q2{*58$AeYbD$kC}5hqJ}T=-DG35_lfV=_gXbL=HE%5;*6CS5D# zuGv?Owo0+H=$3T19B(aH3NPb?G{W{7cF!E2W54JZU?Ay@a5Z{7?5w5gVl>%4zdUzp zkZUjbTXmsqduI*qNNf7Vca&;Z`|UIBDSN6MH!sh$a_!mn1qU-N-Hs+QbDwZusFt>p zWm}hAoDdbGsrQ-12hPl&r5n3K&M_|Hrf>{a+hHxr8fv(G27WUKLj*wycsUpPu#Ef& zD*`CBV-WUIml254-`g@X`aq9@8F|Z#@|Ihq;44KH>0?|dbMTr4MxZZmEAp=;4=*MT z72ET%8TAMNnF^ig+9nsj7OoPyO0uOa%ED{*NUgH-nuVq(I<`s5vj}06Brf_lSjP~R z$}cMw&kbQL$$1o(KDJNF%SV!fVFgITlZ8iV%f!6eZJ&)V;}dI28ZqjVDM<`)I5SABbYoy zHjg{{z04LPcdL))al<|-UC)l4e_~i8AEa99Y>vrF1cV? zS~|4u)r0?^l`4xqpqYuM9ot|)3xwH*zzCy?M9yfigr*nWt@8IVizHvq->9h#8*x{r zVr5hQJ|chbWn3W-n?CuZK@J};VSzOQ$c~t>+B7e(viLEJa#b%v0D)(d4X)Doq#4$; z=peTLAt`6$+s&9fP)j>Jub#}k8CM=c`F%TjpLC~CSp1DTJT-UfzB4ChT$^Z_%w0%w zAFJdoF6O3u>tYUJE^~?^>*Zz_l=Gjrg#W!W_s)^jtN{<4nfcsbEV$1&ZcaRKW^R#` z{Hd7}^Hybe2!P|)4%9X`sE|+pTaeJjyN)tjQBxThrk}=nJNEK1(~wgAH<1Hqf;1Y_K;GWO{W3Tc4q+*%*ld5 zz#zK(CV+0royf>xfZf_*0GzGDIn$4k&@34F=0m+<2)3ehDG6NLEDaOfrfw$itR@;$ z4s8ibf&+-M)TOyFQ(Ec9NY&v0?40}o!G9&3nQc{9y{XG!pkk~>QvxFEgk}vi?8+Kj zD&n0da;|aC-IU5HZ2F%#bJ{@p>VY7I|TEJ5WHc3*)j} zy{#mQBP)LfVYyvxoJ|*l%C%PA_`W%Q_<_lhhD3#RBvJM_I(RjR(ZiVpHk3FxZ>Kn* zFtBO1!VdC^!(%%_R-YW}aQhY5N4LVc1U5|7gX%n@p+JerR*f}x%Tih(Vk-LYoK$3K z*~fslL^vr11hTEas+GJE@6dqm6Lw?~az?@WBNF94U^G~>S(DPzEXrU4*`o0!9aE51 zs4^SY7C|geESTDe4*CJdzLseaDDfv3-1PJQqqv@7Wl}sA>4|A088x#5Wl9N}b(8^* zDzOV4^tUP>iaUT=5WFej>oo>ZBJW5Bppp$AVVJ8b4>U}(#Gfi|G1ICe4HLqFtOuoH zu$w?YHp}j~0+$L-e63wLT3kkhnt7bytO$w-ml)K}H<*znZWI+^8k5IE6wanh=%nKf zR-&m%uuKv+X?yCVQ;if$Xa^g#_2(DH;gu>m*ZU4bDxOAui7wE=?dv0gYia+g6*%hf z#HnZPPEg+6Ptr=$R7#Jt8{EHa&VU^-!J>^l{Iglb51ohEVq5x@Ia_MgTQ#K`y$p|b zQOV>;$2R}c;F)Zh|CR{q-$Cr;qdEu~^ki*}9H>FBbc~_u>(NEe@GaVMjOye3@s;)R zRsDPIHkHH|IQb||{hWzCaJaG$NC$T2$xcR0zpDwtJ1nUWj7qgba4N|aX;LN_%q~Yp z#iw4cP?*Yqm{|IhZWSJEWhA}MFpAHynPKEz720$VIVEB3z1PMv-5L@yr-A+A2L2D; CiMv7o literal 0 HcmV?d00001 diff --git a/src/apps/bin/bison/po/pt_BR.po b/src/apps/bin/bison/po/pt_BR.po new file mode 100644 index 0000000000..fc7782f415 --- /dev/null +++ b/src/apps/bin/bison/po/pt_BR.po @@ -0,0 +1,736 @@ +# bison: translation to Brazilian Portuguese (pt_BR) +# Copyright (C) 2002 Free Software Foundation, Inc. +# Alexandre Folle de Menezes , 2002, 2003. +# +msgid "" +msgstr "" +"Project-Id-Version: bison 1.875\n" +"Report-Msgid-Bugs-To: bug-bison@gnu.org\n" +"POT-Creation-Date: 2004-05-21 10:26-0700\n" +"PO-Revision-Date: 2003-01-06 02:30-0300\n" +"Last-Translator: Alexandre Folle de Menezes \n" +"Language-Team: Brazilian Portuguese \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-1\n" +"Content-Transfer-Encoding: 8-bit\n" +"Plural-Forms: nplurals=2; plural=(n > 1);\n" + +#: src/complain.c:51 src/complain.c:66 +msgid "warning: " +msgstr "aviso: " + +#: src/complain.c:122 src/complain.c:138 +msgid "fatal error: " +msgstr "erro fatal: " + +#: src/conflicts.c:76 +#, c-format +msgid " Conflict between rule %d and token %s resolved as shift" +msgstr " Conflito entre a regra %d e a token %s resolvido como `shift`." + +#: src/conflicts.c:84 +#, c-format +msgid " Conflict between rule %d and token %s resolved as reduce" +msgstr " Conflito entre a regra %d e a token %s resolvido como `reduce`." + +#: src/conflicts.c:91 +#, c-format +msgid " Conflict between rule %d and token %s resolved as an error" +msgstr " Conflito entre a regra %d e a token %s resolvido como um erro." + +#: src/conflicts.c:399 +#, c-format +msgid "conflicts: %d shift/reduce, %d reduce/reduce\n" +msgstr "conflitos: %d de deslocamento/redução, %d de redução/redução\n" + +#: src/conflicts.c:402 +#, c-format +msgid "conflicts: %d shift/reduce\n" +msgstr "conflitos: %d de deslocamento/redução\n" + +#: src/conflicts.c:404 +#, c-format +msgid "conflicts: %d reduce/reduce\n" +msgstr "conflitos: %d de redução/redução\n" + +#: src/conflicts.c:422 +#, c-format +msgid "State %d " +msgstr "Estado %d" + +#: src/conflicts.c:487 +#, fuzzy, c-format +msgid "%%expect-rr applies only to GLR parsers" +msgstr "%s afeta apenas analisadores GLR" + +#: src/conflicts.c:511 +#, c-format +msgid "expected %d shift/reduce conflict" +msgid_plural "expected %d shift/reduce conflicts" +msgstr[0] "esperado: %d conflito de deslocamento/redução" +msgstr[1] "esperados: %d conflitos de deslocamento/redução" + +#: src/conflicts.c:515 +#, fuzzy, c-format +msgid "expected %d reduce/reduce conflict" +msgid_plural "expected %d reduce/reduce conflicts" +msgstr[0] "esperados 0 conflitos de redução/redução" +msgstr[1] "esperados 0 conflitos de redução/redução" + +#: src/files.c:100 +#, c-format +msgid "cannot open file `%s'" +msgstr "impossível abrir o arquivo `%s'" + +#: src/files.c:116 +msgid "I/O error" +msgstr "Erro de E/S" + +#: src/files.c:119 +msgid "cannot close file" +msgstr "impossível fechar o arquivo" + +#: src/files.c:337 +#, c-format +msgid "conflicting outputs to file %s" +msgstr "saídas conflitantes para o arquivo %s" + +#: src/getargs.c:186 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "tente `%s --help' para mais informações.\n" + +#: src/getargs.c:192 +msgid "GNU bison generates parsers for LALR(1) grammars.\n" +msgstr "GNU bison gera analisadores para gramáticas LALR(1).\n" + +#: src/getargs.c:196 +#, c-format +msgid "Usage: %s [OPTION]... FILE\n" +msgstr "Uso: %s [OPCAO]... ARQUIVO\n" + +#: src/getargs.c:200 +msgid "" +"If a long option shows an argument as mandatory, then it is mandatory\n" +"for the equivalent short option also. Similarly for optional arguments.\n" +msgstr "" +"Se uma opção longa mostra um argumento como obrigatório, então ele é\n" +"obrigatório para a opção curta equivalente também. Igualmente para os\n" +"argumentos opcionais.\n" + +#: src/getargs.c:206 +msgid "" +"Operation modes:\n" +" -h, --help display this help and exit\n" +" -V, --version output version information and exit\n" +" -y, --yacc emulate POSIX yacc\n" +msgstr "" +"Modos de operação:\n" +" -h, --help exibe esta ajuda e sai\n" +" -V, --version mostra informações de versão e sai\n" +" -y, --yacc emula o yacc POSIX\n" + +#: src/getargs.c:213 +msgid "" +"Parser:\n" +" -S, --skeleton=FILE specify the skeleton to use\n" +" -t, --debug instrument the parser for debugging\n" +" --locations enable locations computation\n" +" -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n" +" -l, --no-lines don't generate `#line' directives\n" +" -n, --no-parser generate the tables only\n" +" -k, --token-table include a table of token names\n" +msgstr "" +"Analizador:\n" +" -S, --skeleton=arquivo especifica o skeleto a ser usado\n" +" -t, --debug instrumenta o analisador para depuração\n" +" --locations habilita a computação de localizações\n" +" -p, --name-prefix=PREFIXO adiciona PREFIXO aos símbolos externos\n" +" -l, --no-lines não gera diretivas `#line'\n" +" -n, --no-parser apenas gera as tabelas\n" +" --k, --token-table inclui uma tabela de nomes de tokens\n" + +#: src/getargs.c:225 +msgid "" +"Output:\n" +" -d, --defines also produce a header file\n" +" -r, --report=THINGS also produce details on the automaton\n" +" -v, --verbose same as `--report=state'\n" +" -b, --file-prefix=PREFIX specify a PREFIX for output files\n" +" -o, --output=FILE leave output to FILE\n" +" -g, --graph also produce a VCG description of the " +"automaton\n" +msgstr "" +"Saída:\n" +" -d, --defines também produz um arquivo de cabeçalho\n" +" -r, --report=ITENS também produz detalhes do autômato\n" +" -v, --verbose o mesmo que `--report=state'\n" +" -b, --file-prefix=PREFIXO especifica o PREFIXO para os arquivos de saída\n" +" -o, --output=ARQUIVO armazena a saída em ARQUIVO\n" +" -g, --graph também produz uma descrição em VCG do autômato\n" + +#: src/getargs.c:236 +msgid "" +"THINGS is a list of comma separated words that can include:\n" +" `state' describe the states\n" +" `itemset' complete the core item sets with their closure\n" +" `lookahead' explicitly associate lookaheads to items\n" +" `solved' describe shift/reduce conflicts solving\n" +" `all' include all the above information\n" +" `none' disable the report\n" +msgstr "" +"ITENS é uma lista separada por vírgulas, que pode incluir:\n" +" `state' descreve os estados\n" +" `itemset' completa os conjuntos de ítens básicos com seus " +"fechamentos\n" +" `lookahead' associa explicitamente as previsões com os ítens\n" +" `solved' descreve a solução de conflitos de deslocamento/redução\n" +" `all' inclui todas as informações acima\n" +" `none' desabilita o relatório\n" + +#: src/getargs.c:247 +msgid "Report bugs to .\n" +msgstr "Informe os erros para .\n" + +#: src/getargs.c:264 +#, c-format +msgid "bison (GNU Bison) %s" +msgstr "bison (GNU bison) %s" + +#: src/getargs.c:266 +msgid "Written by Robert Corbett and Richard Stallman.\n" +msgstr "Escrito por Robert Corbett e Richard Stallman.\n" + +#: src/getargs.c:270 +#, c-format +msgid "Copyright (C) %d Free Software Foundation, Inc.\n" +msgstr "Copyright © %d Free Software Foundation, Inc.\n" + +#: src/getargs.c:272 +msgid "" +"This is free software; see the source for copying conditions. There is NO\n" +"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +msgstr "" +"Este é um software livre; veja o código fonte para condições de copyright. " +"Não\n" +"existe NENHUMA garantia; nem mesmo a garantia implícita de COMERCIABILIDADE " +"ou\n" +"ADEQUAÇÃO À QUALQUER FINALIDADE PARTICULAR.\n" + +#: src/getargs.c:438 +#, c-format +msgid "missing operand after `%s'" +msgstr "falta operando depois de `%s'" + +#: src/getargs.c:440 +#, c-format +msgid "extra operand `%s'" +msgstr "operando `%s' sobrando" + +#: src/gram.c:139 +msgid "empty" +msgstr "vazio" + +#: src/gram.c:233 +msgid "Grammar" +msgstr "Gramática" + +#: src/gram.c:321 src/reduce.c:394 +msgid "warning" +msgstr "aviso" + +#: src/main.c:124 +msgid "rule never reduced because of conflicts" +msgstr "regra não reduzida por causa de conflitos" + +#: src/parse-gram.y:363 +msgid "POSIX forbids declarations in the grammar" +msgstr "o POSIX proíbe declarações na gramática" + +#: src/parse-gram.y:486 +msgid "missing identifier in parameter declaration" +msgstr "identificador faltando na declaração do parâmetro" + +#: src/print.c:49 +#, c-format +msgid " type %d is %s\n" +msgstr " tipo %d é %s\n" + +#: src/print.c:165 +#, c-format +msgid "shift, and go to state %d\n" +msgstr "deslocar, e ir ao estado %d\n" + +#: src/print.c:167 +#, c-format +msgid "go to state %d\n" +msgstr "ir ao estado %d\n" + +#: src/print.c:204 +msgid "error (nonassociative)\n" +msgstr "erro (não associativo)\n" + +#: src/print.c:292 +#, c-format +msgid "reduce using rule %d (%s)" +msgstr "reduzir usando a regra %d (%s)" + +#: src/print.c:294 +#, c-format +msgid "accept" +msgstr "aceitar" + +#: src/print.c:325 src/print.c:391 +msgid "$default" +msgstr "$padrão" + +#: src/print.c:420 +#, c-format +msgid "state %d" +msgstr "estado %d" + +#: src/print.c:456 +msgid "Terminals, with rules where they appear" +msgstr "Terminais, com as regras onde eles aparecem" + +#: src/print.c:483 +msgid "Nonterminals, with rules where they appear" +msgstr "Não-terminais com as regras onde eles aparecem" + +#: src/print.c:512 +#, c-format +msgid " on left:" +msgstr " à esquerda:" + +#: src/print.c:527 +#, c-format +msgid " on right:" +msgstr " à direita:" + +#: src/print.c:555 +msgid "Rules never reduced" +msgstr "Regras nunca reduzidas" + +#: src/reader.c:56 +#, c-format +msgid "multiple %s declarations" +msgstr "declarações de %s múltiplas" + +#: src/reader.c:118 +#, c-format +msgid "result type clash on merge function %s: <%s> != <%s>" +msgstr "tipo de resultado conflita na fução de mescla %s: <%s> != <%s>" + +#: src/reader.c:216 +#, c-format +msgid "rule given for %s, which is a token" +msgstr "regra fornecida para %s, que é um token" + +#: src/reader.c:245 +#, c-format +msgid "type clash on default action: <%s> != <%s>" +msgstr "conflito de tipos na ação padrão: <%s> != <%s>" + +#: src/reader.c:251 +msgid "empty rule for typed nonterminal, and no action" +msgstr "regra vazia para um não-terminal com tipo, e não há ações" + +#: src/reader.c:321 src/reader.c:335 src/reader.c:348 +#, c-format +msgid "only one %s allowed per rule" +msgstr "apenas um %s é permitido por regra" + +#: src/reader.c:331 src/reader.c:346 +#, c-format +msgid "%s affects only GLR parsers" +msgstr "%s afeta apenas analisadores GLR" + +#: src/reader.c:333 +#, c-format +msgid "%s must be followed by positive number" +msgstr "%s deve ser seguido por um número positivo" + +#: src/reader.c:490 +msgid "no rules in the input grammar" +msgstr "não há regras na gramática de entrada" + +#: src/reduce.c:242 +msgid "useless rule" +msgstr "regra inútil" + +#: src/reduce.c:303 +#, c-format +msgid "useless nonterminal: %s" +msgstr "não-terminal inútil: %s" + +#: src/reduce.c:351 +msgid "Useless nonterminals" +msgstr "Não-terminais inúteis" + +#: src/reduce.c:364 +msgid "Terminals which are not used" +msgstr "Terminais que não foram usados" + +#: src/reduce.c:373 +msgid "Useless rules" +msgstr "Regras inúteis" + +#: src/reduce.c:389 +#, c-format +msgid "%d rule never reduced\n" +msgid_plural "%d rules never reduced\n" +msgstr[0] "%d regra que nunca foi reduzida\n" +msgstr[1] "%d regras que nunca foram reduzidas\n" + +#: src/reduce.c:397 +#, c-format +msgid "%d useless nonterminal" +msgid_plural "%d useless nonterminals" +msgstr[0] "%d não-terminal inútil" +msgstr[1] "%d não-terminal inútil" + +#: src/reduce.c:403 +#, c-format +msgid " and " +msgstr " e " + +#: src/reduce.c:406 +#, c-format +msgid "%d useless rule" +msgid_plural "%d useless rules" +msgstr[0] "%d regra inútil" +msgstr[1] "%d regras inúteis" + +#: src/reduce.c:436 +#, c-format +msgid "start symbol %s does not derive any sentence" +msgstr "símbolo de início %s não deriva nenhuma sentença" + +#: src/scan-gram.l:162 +msgid "stray `,' treated as white space" +msgstr "`,' perdida tratada como branco" + +#: src/scan-gram.l:225 +#, c-format +msgid "invalid directive: %s" +msgstr "diretiva inválida: %s" + +#: src/scan-gram.l:283 +#, c-format +msgid "invalid character: %s" +msgstr "caractere inválido: %s" + +#: src/scan-gram.l:402 +#, fuzzy +msgid "invalid null character" +msgstr "caractere inválido: %s" + +#: src/scan-gram.l:415 src/scan-gram.l:427 src/scan-gram.l:448 +#, c-format +msgid "invalid escape sequence: %s" +msgstr "seqüência de escape inválida: %s" + +#: src/scan-gram.l:417 src/scan-gram.l:429 src/scan-gram.l:450 +#, fuzzy, c-format +msgid "invalid null character: %s" +msgstr "caractere inválido: %s" + +#: src/scan-gram.l:455 +#, c-format +msgid "unrecognized escape sequence: %s" +msgstr "seqüência de escape não reconhecida: %s" + +#: src/scan-gram.l:537 +#, c-format +msgid "missing `{' in `%s'" +msgstr "falta `{' em `%s'" + +#: src/scan-gram.l:782 +#, c-format +msgid "$$ of `%s' has no declared type" +msgstr "$$ de `%s' não tem tipo declarado" + +#: src/scan-gram.l:803 +#, c-format +msgid "$%d of `%s' has no declared type" +msgstr "$%d de `%s' não tem tipo declarado" + +#: src/scan-gram.l:812 src/scan-gram.l:881 src/scan-gram.l:932 +#, c-format +msgid "integer out of range: %s" +msgstr "inteiro fora de faixa: %s" + +#: src/scan-gram.l:848 src/scan-gram.l:916 +#, c-format +msgid "invalid value: %s" +msgstr "valor inválido: %s" + +#: src/scan-gram.l:1036 +#, c-format +msgid "missing `%s' at end of file" +msgstr "`%s' faltando no final do arquivo" + +#: src/scan-gram.l:1047 +#, fuzzy, c-format +msgid "missing `%s' at end of line" +msgstr "`%s' faltando no final do arquivo" + +#: src/symlist.c:97 src/symlist.c:108 +msgid "invalid $ value" +msgstr "valor $ inválido" + +#: src/symtab.c:85 +#, c-format +msgid "type redeclaration for %s" +msgstr "redeclaração de tipo para %s" + +#: src/symtab.c:102 src/symtab.c:120 +#, c-format +msgid "%s redeclaration for %s" +msgstr "redeclaração de %s para %s" + +#: src/symtab.c:139 +#, c-format +msgid "redefining precedence of %s" +msgstr "redefinindo precedência de %s" + +#: src/symtab.c:157 +#, c-format +msgid "symbol %s redefined" +msgstr "símbolo %s redefinido" + +#: src/symtab.c:180 +#, c-format +msgid "redefining user token number of %s" +msgstr "redefinindo número de token de usuário de %s" + +#: src/symtab.c:207 +#, c-format +msgid "symbol %s is used, but is not defined as a token and has no rules" +msgstr "símbolo %s usado, mas não definido como uma token e não tem regras" + +#: src/symtab.c:232 +#, c-format +msgid "symbol `%s' used more than once as a literal string" +msgstr "símbolo `%s' usado mais the uma vez como uma string literal" + +#: src/symtab.c:235 +#, c-format +msgid "symbol `%s' given more than one literal string" +msgstr "símbolo `%s' associado a mais de uma string literal" + +#: src/symtab.c:271 +#, c-format +msgid "conflicting precedences for %s and %s" +msgstr "precedências conflitantes para %s e %s" + +#: src/symtab.c:283 +#, c-format +msgid "conflicting associativities for %s (%s) and %s (%s)" +msgstr "valores associativos conflitantes para %s (%s) e %s (%s)" + +#: src/symtab.c:368 +#, c-format +msgid "tokens %s and %s both assigned number %d" +msgstr "tokens %s e %s associadas ao mesmo número %d" + +#: src/symtab.c:591 +#, c-format +msgid "the start symbol %s is undefined" +msgstr "o símbolo de início %s não está definido" + +#: src/symtab.c:595 +#, c-format +msgid "the start symbol %s is a token" +msgstr "o símbolo de início %s é um terminal" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "argumento %s inválido para %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "argumento %s ambíguo para %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Argumentos válidos são:" + +#: lib/bitset_stats.c:179 +#, c-format +msgid "%u bitset_allocs, %u freed (%.2f%%).\n" +msgstr "%u bitset_allocs, %u liberados (%.2f%%).\n" + +#: lib/bitset_stats.c:182 +#, c-format +msgid "%u bitset_sets, %u cached (%.2f%%)\n" +msgstr "%u bitset_sets, %u em cache (%.2f%%)\n" + +#: lib/bitset_stats.c:185 +#, c-format +msgid "%u bitset_resets, %u cached (%.2f%%)\n" +msgstr "%u bitset_resets, %u em cache (%.2f%%)\n" + +#: lib/bitset_stats.c:188 +#, c-format +msgid "%u bitset_tests, %u cached (%.2f%%)\n" +msgstr "%u bitset_tests, %u em cache (%.2f%%)\n" + +#: lib/bitset_stats.c:192 +#, c-format +msgid "%u bitset_lists\n" +msgstr "%u bitset_lists\n" + +#: lib/bitset_stats.c:194 +msgid "count log histogram\n" +msgstr "histograma de log de contagens\n" + +#: lib/bitset_stats.c:197 +msgid "size log histogram\n" +msgstr "histograma de log de tamanhos\n" + +#: lib/bitset_stats.c:200 +msgid "density histogram\n" +msgstr "histograma de densidades\n" + +#: lib/bitset_stats.c:214 +#, c-format +msgid "" +"Bitset statistics:\n" +"\n" +msgstr "" +"Estatísticas de bitset:\n" +"\n" + +#: lib/bitset_stats.c:217 +#, c-format +msgid "Accumulated runs = %u\n" +msgstr "Execuções acumuladas = %u\n" + +#: lib/bitset_stats.c:261 lib/bitset_stats.c:266 +msgid "Could not read stats file." +msgstr "Impossível ler o arquivo de estatísticas." + +#: lib/bitset_stats.c:263 +#, c-format +msgid "Bad stats file size.\n" +msgstr "Tamanho do arquivo de estatísticas com erro.\n" + +#: lib/bitset_stats.c:289 lib/bitset_stats.c:291 +msgid "Could not write stats file." +msgstr "Impossível de escrever no arquivo de estatísticas." + +#: lib/bitset_stats.c:294 +msgid "Could not open stats file for writing." +msgstr "Impossível abrir arquivo de estatísticas para escrita." + +#: lib/error.c:127 +msgid "Unknown system error" +msgstr "Erro de sistema desconhecido" + +#: lib/getopt.c:570 lib/getopt.c:589 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: a opção `%s' é ambígua\n" + +#: lib/getopt.c:622 lib/getopt.c:626 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: a opção `--%s' no admite nenhum argumento\n" + +#: lib/getopt.c:635 lib/getopt.c:640 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: a opção `%c%s' não admite nenhum argumento\n" + +#: lib/getopt.c:686 lib/getopt.c:708 lib/getopt.c:1039 lib/getopt.c:1061 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: a opção `%s' exige um argumento\n" + +#: lib/getopt.c:746 lib/getopt.c:749 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: opção `--%s' não reconhecida\n" + +#: lib/getopt.c:757 lib/getopt.c:760 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: opção `%c%s' não reconhecida\n" + +#: lib/getopt.c:815 lib/getopt.c:818 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opção -- %c ilegal\n" + +#: lib/getopt.c:824 lib/getopt.c:827 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opção -- %c inválida\n" + +#: lib/getopt.c:882 lib/getopt.c:901 lib/getopt.c:1114 lib/getopt.c:1135 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: a opção -- %c exige um argumento\n" + +#: lib/getopt.c:954 lib/getopt.c:973 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: a opção `-W %s' é ambígua\n" + +#: lib/getopt.c:997 lib/getopt.c:1018 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: a opção `-W %s' não admite nenhum argumento\n" + +#: lib/obstack.c:417 lib/obstack.c:420 lib/xmalloc.c:53 +msgid "memory exhausted" +msgstr "memória esgotada" + +#: lib/quotearg.c:238 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:239 +msgid "'" +msgstr "'" + +#: lib/subpipe.c:171 +#, c-format +msgid "subsidiary program `%s' could not be invoked" +msgstr "programa subsidiário `%s' não pôde ser invocado" + +#: lib/subpipe.c:173 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "programa subsidiário `%s' não foi encontrado" + +#: lib/subpipe.c:175 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "programa subsidiário `%s' falhou" + +#: lib/subpipe.c:176 +#, c-format +msgid "subsidiary program `%s' failed (exit status %d)" +msgstr "programa subsidiário `%s' falhou (estado de saída %d)" + +#: lib/timevar.c:475 +msgid "" +"\n" +"Execution times (seconds)\n" +msgstr "" +"\n" +"Tempos de execução (segundos)\n" + +#: lib/timevar.c:525 +msgid " TOTAL :" +msgstr " TOTAL :" + +#: lib/timevar.c:561 +#, c-format +msgid "time in %s: %ld.%06ld (%ld%%)\n" +msgstr "tempo em %s: %ld.%06ld (%ld%%)\n" diff --git a/src/apps/bin/bison/po/quot.sed b/src/apps/bin/bison/po/quot.sed new file mode 100644 index 0000000000..0122c46318 --- /dev/null +++ b/src/apps/bin/bison/po/quot.sed @@ -0,0 +1,6 @@ +s/"\([^"]*\)"/“\1â€/g +s/`\([^`']*\)'/‘\1’/g +s/ '\([^`']*\)' / ‘\1’ /g +s/ '\([^`']*\)'$/ ‘\1’/g +s/^'\([^`']*\)' /‘\1’ /g +s/“â€/""/g diff --git a/src/apps/bin/bison/po/remove-potcdate.sin b/src/apps/bin/bison/po/remove-potcdate.sin new file mode 100644 index 0000000000..2436c49e78 --- /dev/null +++ b/src/apps/bin/bison/po/remove-potcdate.sin @@ -0,0 +1,19 @@ +# Sed script that remove the POT-Creation-Date line in the header entry +# from a POT file. +# +# The distinction between the first and the following occurrences of the +# pattern is achieved by looking at the hold space. +/^"POT-Creation-Date: .*"$/{ +x +# Test if the hold space is empty. +s/P/P/ +ta +# Yes it was empty. First occurrence. Remove the line. +g +d +bb +:a +# The hold space was nonempty. Following occurrences. Do nothing. +x +:b +} diff --git a/src/apps/bin/bison/po/ro.gmo b/src/apps/bin/bison/po/ro.gmo new file mode 100644 index 0000000000000000000000000000000000000000..cd0e00b55a8ba93d718aea409d993720f4c1ff09 GIT binary patch literal 14732 zcmbuFdyHIHea8K?-gSVGvUg|h%-(qB z-r+vhUQ-A!RZ1g-DufWNT15GyElt%ztG2SLwp6H{6%Y0S@q z`@jdlS@3@F6W|f>tKb{JpMoy~U-v3wUID%lY=Cb8Zv+p5Zvv-53kIO3_!u||K3(Fa zvi|#^=54&1F~GNguLnU_!{sQh}QdV@Xg>O;BGJmUjlv_d>!~1@U`GG;H}`_f(O9oK+SVKgWV3^ z1!_HyfQP^ixC{IoD1Lnb{1o^H;9J2XH&F+6!1J2$X7&KMaEmct=KXg-(X+(l{4^V& z#`z?8j{47n+RvB5v^}5&KMOt#imrbJMei;)PjtNz)cau&)|pe~`(xk%-Upz__yYKH z@Qa|v{}QNve-A>c`4-63=6Ue#;B{=)9pGV5{CpHtzYl?$_cuW8&!2%B=X)SaH9rPl z2EGdB-38tZLb5pqJ_NoORJ+fEqW3ExEH{4xGPU`~^8NcD|ICm1PjubNq{6p?n*Txm z6W#9vVZDjV?@xl_>u-W@1OEurIR64_{2zgmw;NfE*3;xaKAA_rUj#cKOE6D?cY|L9 zB}e}ZYCrx5)OfoYMDx58lpLP{r57IoE%;RV{Y#+u_#7yH{0O`gdc#N0!rSV0!8nif);!h6u0|0K1yD11)Y9_UwjGk zgDl1T!=1*Q0ROGTyI{g`-p_;L*I$8{7V{j4sW9IHHSWKI+Q%P)lJDzblIS@EYM#fz z`@k-E2>d)K{(TeFI{q6}``b_k&GQf_zCK>!1yK9`1>FtYW^71x}OClPn)3l{1fmV@Q#Ci{3Q_9m~~L|{uU^Gx&&(c ze*z_+*C7Pb-#frv;N9S1@P1J33-A%}*FovSx4;{~AC&L^3rcQoK{;*)4}qd{78IQ= zQ0u$^ijGf}-=6_r!~0i3(f>{GCh&)#_I(#hF8R9`RR0A~``G~z8S^wKet#L91-}7` zj@QG46X3ldLzxeQ;{R7b(e?cjckvMxm&LuPlFo&&q3+SbD-qmMqZY| z`@mbkPl89mFMw0vcR=m`?J!aFo&ZHx4-}nGgETSU0L712yrZ-`p!VZoP<&YhUkPU5 ztH38g$-@FgkJiEv?h)U$7CrCu;Qqg@{5?~m=GAk*2PX&m8B#RoH02|dfTHJ7$^(=o z%KIp1DSEUH*zF$4g4V0G>Uj@E@`4!|dp=mcJq(J^sF_>eYe7`P@enW{(tkYfr%X^j ztQVe+2lLSqwFe)dytI55XdfRc-*Zs*Mb9zH$0+Zji067D3M@4($_gc>AR1FX)$l*cGHQGS`C zM>e8QIZZi2`8i7U$nNNQ8AUQYPuZYUPlF$4%9mGzJ<5ZWQP+r3tLIt&h|Bo<(Wz1PA_WZb~Vh;hhc2fq8HkUwhiL8&69I{ znaFG!W=U^7eN zl}6n){meH8Ze3Bvf*NM`Zku%M%0#xuuCb^%vF)(c3!u)mG`nHJl^e9fPEho6Lqo^2 zI9v}?IHl#a8`WoqzU+IEg}pG-q;Vdm{U{E4YQD|qZ1lTk+4@cccBIn@TY1K6dmHw| z$wfN|(kx6}UBAe*x3-h?ddYcKx4K~mNfzbNdT8UKzZ#|*09U&g%gRJc>}@Au7VpVzAOa*kLE0_)VVwJ6>c%u> zZ-V}6)Gd;NEz%^TwQ2Z)B0>^(9;4a(876E#${Mekyt4I<6mCbH9pP3Hr|4ZbjxMqX z^{T`mztC;#-Fm1m>}r%}Vg7#cu$Aq%eCebiBki4-Jk*((*f%-asuyLs_*Zv>X<_cW zwSv~#NWalm*U}~r8QRT%*+6^DbgNbLi(Zg3L0ZI_Jqn=>b1Z1vEDsRSPK0gAU;*SF zb1QNckQ=qKsYb)hB!dm7uy*gvK0DF2$62L4lXUX)sHQ!h6mi>$=zcpFw-{w6DSB-b zDTk++s*!0V!{<}vJnl}8G)u!VYDTNn8uDsNC(ViZWjLQ@erYtP0bPI(_?aAqr zi+d05v)wf4_t7~BI^lnsxw{rhGdb6>f$b%6x7zk>Ejd3X#ImY=>}`-I>BfGWud$LS zmp0U28=8&^D;+@ZP#?=Usn+cjGw5Z>q_t#@)hLeZA0Um6Zz;?bpt=jKnGsXCAKYlnFd^<-Qf z|AQh=AUTOO#Co~B)g%k6&K|R%&y<;6si%-!g?rR%RlP(-bC5#zg`=kzXOFWoYqLSv ziaN00mY>`vdZwvErtXQldrlrbK6i3Vi4#e309rGnzj;htq>^V>DL_ z)+|*6q7J!25uU4KJ6tWgTM3WiEKi*mag%z7=VabB@1pe#pr_fyWR@iQFYf;^4puQn z!@5?|M>btUO+C=mF}rx#Cb4Olns&8CQ0w&a0QgWb58Ow#THSdT@5kS#HdIU~`QwKk<5$xB*!A%##d zwjbCmWEsvgoKI3jCtnM4+aek$sgj_qcpa%I_L4~K;-o`!h%GA^={~M%k8h@JL#}+I zR)PUjJ=5WCoNc3Xl-gD=$%<4$wbDzHbAfDu8zHL!j6ZbC<% zi-F6DOGSY^7nI)R13y;l?^sR6e+e-W~ha0 zW;t458?Tzg8SZAuxeWTxFEsGbX%OcdM;sLdy|L?eYIbqv;pzFM>0@&z=a$}M8S41l z(){e1GxqqxqMf#ad_Dn{S@{G`G#@-`;(X!uj8Hq!}^4^-|>NSUVw#7V&i1R?xn?$cOi#j z3<5Toz7RA@y{&k2^%faT@-$FLibk~kZgm2L!%OItHC?<$;$lr1&W4Ggvl|kz5guVP z>E=b43V+JlZNVa}-z)hX5vHoCWRXRNsdS+3Q2Um#uQ>aFb8$vkshu9Ha}&BR{Se*T zAgWsnI8I_-`caliMpkr!!jQ`!Lbemuy6%G<=wiS4>RZJ2k$N?pWG2$^Hb z-anB&VDCKY(6|x0L;&7+PAEcm*4?>OH@|N)mQ}E;VT+w1_LI9U9guO->&1SnxakbG zRkLuum^B~1I0kcWccz@6S;>MR-at-}Q{==rPt8*KkrMr{?B8Q^j#kneqFzYWNoo+N zWwDw??I=Kg2*tG}UTRwP$qg5Z=)zh?+o5rX5d5mucCU^dPN@o#Jnelu4kz>4(OJ?A zmkWdCIrkI)xTBZa_)~??dX<|meJ&G5-dzkwC?!dBx){)}({HBpUBo;wLICGsPpVik zPm#N^=AwbqmOF^K);hZQaB8fNqf}1mYOq?Z#+lyA;f&j9y)N~?&g7enuiYBg9oM#-P=5H-+==( zY%YfDk~(j^I&`eZ&XToO*$Ee`2%!~y9KY!r7-AE5snaWL~4#Ey5Tf;PF*ui9(1Xo$;^duFuNQ2 zF;2~$njNy_;N*eEj67uwP58|zo8!Rl;#?oaN37fl;q=kDGYiebhwphu^U$!dX6%G% zb2e@zZFoOr50j~CobDBfck?)>d&DaqxYz9Hp(ED+Ji0fQ#XGp~NW(OiqW%C)!@H2E zejy57hFXHUHADS;jEN!K=#pZRmAw>Mq(Yg*qG$IyiBVW*EW~XzSgGfh&vP+rgHq=v@v5QWT-az&@Qq~5{G47w6!jDbt9pd z?QEv>OEQ-%AF03-j@Fb@UH&Z^ZHGxxx;qRmLRHZZqB12HD)nvHf23r!K#sCa0uo%a zQcMys8Y{syNG`hUx2a7LAL+)So|FQ=7(vL98<27iV#s4YR1+fjd35N|K5j|s*Jd^fK&j!%DI+ni-S`)6u=1sb;_Z#$lm zMMcZwB;!tMv*gm)a=9)UYjLF%c-V_LieZiMTR&qOobv=pAv*dr_P%-qh^f=&bwd1_ zS`Sm>S7^RR36#w=!b6s+@-j*O5dN5xjYO^!T~dJDDqJYzlH(DsTFH%8zRB5=V`g4{ z_V)rWDs?`OvFKakWa1sATGj~8%egT!{8o%tPE+cJGJ|Z-q#5l?@&x^KG;i%U-q7`~ zRyQ2{vNXHXY@hT(TfJ5)ZiE`_TA6c)4JXQPn`YKoc}vdSJQTDxZBnamuZX*wD4q=0 zhz62*LeS8tfGlv36OPN5cqJ^qH!#KJL^b`pf7N5T_-$4_ZkK=z&7`zg}a$O)g_L5L&-X`!vz_W-^- zcDb&cF0$YW`9(rSt`#@cV@nFY?osBOUWhbD#$n&5m2&b!dVNk_%f=?KL`7G!42UTXNJL*t zT7E={>0h#~O%gaJ9%B$aJEZ27pjmhQTS2eI3VR$?TLG)-C8_4WLT+B->u*)69b@;i zNGW-=iTxt5B~R~e7j{n1;}w01eVCE2a`c-2Dv5bVx{pjqw8KGv-*olFJYwcL$T}!k z5!>mk2$z^@G0;^NY;flj*#?%jLy}%GvR2DN0KcOucLXp4D&1$O<90)e8$P{`uH> zBkTn`uPtAxGx9Dc9=Jq3<5byunw3fYOkAm%Mo<5TD^)7J)Fim!&Ip>JN|=O9HJ0(y zyxV8)^F;onwxEG{)DDBJ7^H!E5#o*}@57-)a|x$SWZq!{AD(MZ*sDwl&r;Dsvs5Pd zugP6Z%XhGH9So{GKATE>bOgiR4iOuUXs8m`AOyyxLbCRDG~xnC@;e9Lz`>JDVJ}^9 zk3;R^Lt{>7WcTHT*`FY-MwwYql7DXcDPq-v#~i-<_sZ_l8;-j z0q|;9yagynEC0Sl$Bc@595}YU20$L9Y^5&L5tflo?;N+m$~^}C2y~OB+kj2@ixa4% zd^oGiQpy`cic45J|1{p1j&)=Qoz<1V3*in!y3tHEmv&*BtiC^n`^wP_`|y6?^1AKr z2QZO3J=T{4fqkOT6>N1$p!mM7RD^jwRsSTJT#c4~xd>F?UgD-<(wc|dB&9S^Ii z-6g{2lu;Vl?G!pM8>TA+m)7WNV}cIK%HLg~Gm!!WmnuVw9re4FY?VZBnkrVUzKjbc zM#J~xP&yV6h^EZX0tY5$&`}>5k%4+7ZkM2r=(|I^3qKjBlBf-UB4KPk} z*`4pEmm-B8mHZWvS>Z;(w_uS@(5w3d&T??7uB+pppt@rqLC63uk{-5f7XzI^QJA`e z(}wDr!Ib-73JjB0p%f7%qUH(5Yb*I*=t2+eBJdVKH#vEv#djX6j!U4p8wZSQY3xuf zC(JCjbX_91&T07z3YWv+FFAXfmeneKp^J-rWE7vKDqRSfYB#w{mN^ag`6GNEIa*FV znuA5vvWn#EX5xj&IW%t8SNYRKMGIsj#&0Qn4$h^6>LqZfQDf(U;7PfVY7t)RICbGz zi3u13vDPv6h;kmn4wonslAvvPbe{ z?k|Lt6T-O}r%sBF&Xy66E;iE5e3L`&CW$5P@IX!y+-+bJEGC7Wb+;PqT~J(Lckqjn zDNQvXPLL!>S(IRfT`uO@en*M#AI}Gh2uB z`)wPVtBt9IibZbOLT3?2GK}20IZIlOsxfPstY@lHlh1R&*1jV%{8byfscQn(G1MMT zkZ3UL;_zG3={V^+mSK_lRQ)*`69q%)wp~ZJeJ7!;=NWChg%i3e8Awm02HRYfkhF85 zV-<7~cKc*BSMRXIJ6Jxt;0`0~@=l!Bdx1QRe3%5TRzfII-nLY$()9$kO37|sri!KQ rD#c>h6{E7%ERW^ZoZ%jIe0AQ{)s#lB{%H8yvXp#~0, 2003. +# +# +# +msgid "" +msgstr "" +"Project-Id-Version: bison 1.875a\n" +"Report-Msgid-Bugs-To: bug-bison@gnu.org\n" +"POT-Creation-Date: 2004-05-21 10:26-0700\n" +"PO-Revision-Date: 2003-03-01 21:43-0500\n" +"Last-Translator: Laurentiu Buzdugan \n" +"Language-Team: Romanian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-2\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: src/complain.c:51 src/complain.c:66 +msgid "warning: " +msgstr "avertisment:" + +#: src/complain.c:122 src/complain.c:138 +msgid "fatal error: " +msgstr "eroare fatalã:" + +#: src/conflicts.c:76 +#, c-format +msgid " Conflict between rule %d and token %s resolved as shift" +msgstr " Conflict între regula %d ºi elementul (token) %s rezolvat ca shift" + +#: src/conflicts.c:84 +#, c-format +msgid " Conflict between rule %d and token %s resolved as reduce" +msgstr "" +" Conflict între regula %d ºi elementul (token) %s rezolvat ca reduce" + +#: src/conflicts.c:91 +#, c-format +msgid " Conflict between rule %d and token %s resolved as an error" +msgstr "" +" Conflict între regula %d ºi elementul (token) %s rezolvat ca eroare" + +#: src/conflicts.c:399 +#, c-format +msgid "conflicts: %d shift/reduce, %d reduce/reduce\n" +msgstr "conflicte: %d shift/reduce, %d reduce/reduce\n" + +#: src/conflicts.c:402 +#, c-format +msgid "conflicts: %d shift/reduce\n" +msgstr "conflicte: %d shift/reduce\n" + +#: src/conflicts.c:404 +#, c-format +msgid "conflicts: %d reduce/reduce\n" +msgstr "conflicte: %d reduce/reduce\n" + +#: src/conflicts.c:422 +#, c-format +msgid "State %d " +msgstr "Stare %d" + +#: src/conflicts.c:487 +#, fuzzy, c-format +msgid "%%expect-rr applies only to GLR parsers" +msgstr "%s afecteazã numai parsere GLR" + +#: src/conflicts.c:511 +#, c-format +msgid "expected %d shift/reduce conflict" +msgid_plural "expected %d shift/reduce conflicts" +msgstr[0] "am aºteptat %d conflict shift/reduce" +msgstr[1] "am aºteptat %d conflicte shift/reduce" + +#: src/conflicts.c:515 +#, fuzzy, c-format +msgid "expected %d reduce/reduce conflict" +msgid_plural "expected %d reduce/reduce conflicts" +msgstr[0] "am aºteptat 0 conflicte reduce/reduce" +msgstr[1] "am aºteptat 0 conflicte reduce/reduce" + +#: src/files.c:100 +#, c-format +msgid "cannot open file `%s'" +msgstr "nu am putut deschide fiºierul `%s'" + +#: src/files.c:116 +msgid "I/O error" +msgstr "Eroare I/O" + +#: src/files.c:119 +msgid "cannot close file" +msgstr "nu pot închide fiºierul" + +#: src/files.c:337 +#, c-format +msgid "conflicting outputs to file %s" +msgstr "ieºiri în conflict în fiºierul %s" + +#: src/getargs.c:186 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "Încercaþi `%s --help' pentru informaþii suplimentare.\n" + +#: src/getargs.c:192 +msgid "GNU bison generates parsers for LALR(1) grammars.\n" +msgstr "GNU bison genereazã parsere pentru gramatici LALR(1).\n" + +#: src/getargs.c:196 +#, c-format +msgid "Usage: %s [OPTION]... FILE\n" +msgstr "Folosire: %s [OPÞIUNE]... FIªIER\n" + +#: src/getargs.c:200 +msgid "" +"If a long option shows an argument as mandatory, then it is mandatory\n" +"for the equivalent short option also. Similarly for optional arguments.\n" +msgstr "" +"Dacã o opþiune lungã aratã un argument ca necesar, atunci el este necesar\n" +"ºi pentru opþiunea scurtã echivalentã. Similar pentru argumentele " +"opþionale.\n" + +#: src/getargs.c:206 +msgid "" +"Operation modes:\n" +" -h, --help display this help and exit\n" +" -V, --version output version information and exit\n" +" -y, --yacc emulate POSIX yacc\n" +msgstr "" +"Moduri de operare:\n" +" -h, --help afiºeazã acest mesaj ºi terminã\n" +" -V, --version afiºeazã informaþii despre versiune ºi terminã\n" +" -y, --yacc emuleazã POSIX yacc\n" + +#: src/getargs.c:213 +msgid "" +"Parser:\n" +" -S, --skeleton=FILE specify the skeleton to use\n" +" -t, --debug instrument the parser for debugging\n" +" --locations enable locations computation\n" +" -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n" +" -l, --no-lines don't generate `#line' directives\n" +" -n, --no-parser generate the tables only\n" +" -k, --token-table include a table of token names\n" +msgstr "" +"Parser:\n" +" -S, --skeleton=FIªIER specificã scheletul de folosit\n" +" -t, --debug instrumenteazã parserul pentru depanare\n" +" --locations activeazã calculul locaþiilor\n" +" -p, --name-prefix=PREFIX pune prefix PREFIX la simbolurile externe\n" +" -l, --no-lines nu genera directive `#line'\n" +" -n, --no-parser genereazã numai tabelele\n" +" -k, --token-table include un tabel cu nume de elemente\n" + +#: src/getargs.c:225 +msgid "" +"Output:\n" +" -d, --defines also produce a header file\n" +" -r, --report=THINGS also produce details on the automaton\n" +" -v, --verbose same as `--report=state'\n" +" -b, --file-prefix=PREFIX specify a PREFIX for output files\n" +" -o, --output=FILE leave output to FILE\n" +" -g, --graph also produce a VCG description of the " +"automaton\n" +msgstr "" +"Ieºire:\n" +" -d, --defines creazã ºi un fiºier header\n" +" -r, --report=LUCRURI creazã ºi detalii despre automaton\n" +" -v, --verbose la fel ca `--report=state'\n" +" -b, --file-prefix=PREFIX specificã un PREFIX pentru fiºierele ieºire\n" +" -o, --output=FIªIER creazã ieºire în FIªIER\n" +" -g, --graph creazã ºi o descriere VCG a automaton-ului\n" + +#: src/getargs.c:236 +msgid "" +"THINGS is a list of comma separated words that can include:\n" +" `state' describe the states\n" +" `itemset' complete the core item sets with their closure\n" +" `lookahead' explicitly associate lookaheads to items\n" +" `solved' describe shift/reduce conflicts solving\n" +" `all' include all the above information\n" +" `none' disable the report\n" +msgstr "" +"LUCRURI este o listã de cuvinte separate de virgulã ce pot fi:\n" +" `state' descrie stãrile\n" +" `itemset' completeazã seturile de elemente nucleu cu închiderea lor\n" +" `lookahead' asociazã explicit lookaheads la elemente\n" +" `solved' descrie rezolvarea conflictelor shift/reduce\n" +" `all' include toatã informaþia de deasupra\n" +" `none' deactiveazã raportarea\n" + +#: src/getargs.c:247 +msgid "Report bugs to .\n" +msgstr "Raportaþi bug-uri la .\n" + +#: src/getargs.c:264 +#, c-format +msgid "bison (GNU Bison) %s" +msgstr "bison (GNU Bison) %s" + +#: src/getargs.c:266 +msgid "Written by Robert Corbett and Richard Stallman.\n" +msgstr "Scris de Robert Corbett ºi Richard Stallman.\n" + +#: src/getargs.c:270 +#, c-format +msgid "Copyright (C) %d Free Software Foundation, Inc.\n" +msgstr "Copyright (C) %d Free Software Foundation, Inc.\n" + +#: src/getargs.c:272 +msgid "" +"This is free software; see the source for copying conditions. There is NO\n" +"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +msgstr "" +"Acesta este software liber; vedeþi codul sursã pentru condiþii despre " +"copiere.\n" +"Nu existã nici o garanþie; nici chiar pentru COMERCIALIZARE sau de " +"POTRIVIRE\n" +"PENTRU UN SCOP ANUME.\n" + +#: src/getargs.c:438 +#, c-format +msgid "missing operand after `%s'" +msgstr "operator lipsã dupã `%s'" + +#: src/getargs.c:440 +#, c-format +msgid "extra operand `%s'" +msgstr "extra operator `%s'" + +#: src/gram.c:139 +msgid "empty" +msgstr "goleºte" + +#: src/gram.c:233 +msgid "Grammar" +msgstr "Gramaticã" + +#: src/gram.c:321 src/reduce.c:394 +msgid "warning" +msgstr "avertisment" + +#: src/main.c:124 +msgid "rule never reduced because of conflicts" +msgstr "regula nu este redusã niciodatã din cauza conflictelor" + +#: src/parse-gram.y:363 +msgid "POSIX forbids declarations in the grammar" +msgstr "POSIX interzice declaraþii în gramaticã" + +#: src/parse-gram.y:486 +msgid "missing identifier in parameter declaration" +msgstr "identificator lipsã în declaraþia parametrului" + +#: src/print.c:49 +#, c-format +msgid " type %d is %s\n" +msgstr " tipul %d este %s\n" + +#: src/print.c:165 +#, c-format +msgid "shift, and go to state %d\n" +msgstr "shift, ºi mergi în starea %d\n" + +#: src/print.c:167 +#, c-format +msgid "go to state %d\n" +msgstr "mergi în starea %d\n" + +#: src/print.c:204 +msgid "error (nonassociative)\n" +msgstr "eroare (ne-asociativitate)\n" + +#: src/print.c:292 +#, c-format +msgid "reduce using rule %d (%s)" +msgstr "reduce folosind regula %d (%s)" + +#: src/print.c:294 +#, c-format +msgid "accept" +msgstr "accept" + +#: src/print.c:325 src/print.c:391 +msgid "$default" +msgstr "$implicit" + +#: src/print.c:420 +#, c-format +msgid "state %d" +msgstr "stare %d" + +#: src/print.c:456 +msgid "Terminals, with rules where they appear" +msgstr "Terminale, cu reguli acolo unde acestea apar" + +#: src/print.c:483 +msgid "Nonterminals, with rules where they appear" +msgstr "Non-terminale, cu reguli acolo unde acestea apar" + +#: src/print.c:512 +#, c-format +msgid " on left:" +msgstr " pe stânga:" + +#: src/print.c:527 +#, c-format +msgid " on right:" +msgstr " pe dreapta:" + +#: src/print.c:555 +msgid "Rules never reduced" +msgstr "Regulile nu au fost reduse" + +#: src/reader.c:56 +#, c-format +msgid "multiple %s declarations" +msgstr "declaraþii %s multiple" + +#: src/reader.c:118 +#, c-format +msgid "result type clash on merge function %s: <%s> != <%s>" +msgstr "" +"tipul rezultatului în conflict cu funcþia de combinare %s: <%s> != <%s>" + +#: src/reader.c:216 +#, c-format +msgid "rule given for %s, which is a token" +msgstr "regula datã pentru %s, care este un element (token)" + +#: src/reader.c:245 +#, c-format +msgid "type clash on default action: <%s> != <%s>" +msgstr "conflict de tip pentru acþiunea implicitã: <%s> != <%s>" + +#: src/reader.c:251 +msgid "empty rule for typed nonterminal, and no action" +msgstr "regulã vidã pentru nonterminal cu tip, ºi nici o acþiune" + +#: src/reader.c:321 src/reader.c:335 src/reader.c:348 +#, c-format +msgid "only one %s allowed per rule" +msgstr "un singur %s permis pe fiecare regulã" + +#: src/reader.c:331 src/reader.c:346 +#, c-format +msgid "%s affects only GLR parsers" +msgstr "%s afecteazã numai parsere GLR" + +#: src/reader.c:333 +#, c-format +msgid "%s must be followed by positive number" +msgstr "%s trebuie sã fie urmat de numere pozitive" + +#: src/reader.c:490 +msgid "no rules in the input grammar" +msgstr "nici o regulã în gramatica furnizatã" + +#: src/reduce.c:242 +msgid "useless rule" +msgstr "regulã fãrã rost" + +#: src/reduce.c:303 +#, c-format +msgid "useless nonterminal: %s" +msgstr "nonterminal fãrã rost: %s" + +#: src/reduce.c:351 +msgid "Useless nonterminals" +msgstr "Nonterminale fãrã rost" + +#: src/reduce.c:364 +msgid "Terminals which are not used" +msgstr "Terminale care nu sunt folosite" + +#: src/reduce.c:373 +msgid "Useless rules" +msgstr "Reguli fãrã rost" + +#: src/reduce.c:389 +#, c-format +msgid "%d rule never reduced\n" +msgid_plural "%d rules never reduced\n" +msgstr[0] "%d regulã niciodatã redusã\n" +msgstr[1] "%d reguli niciodatã reduse\n" + +#: src/reduce.c:397 +#, c-format +msgid "%d useless nonterminal" +msgid_plural "%d useless nonterminals" +msgstr[0] "%d nonterminal fãrã rost" +msgstr[1] "%d nonterminale fãrã rost" + +#: src/reduce.c:403 +#, c-format +msgid " and " +msgstr " ºi " + +#: src/reduce.c:406 +#, c-format +msgid "%d useless rule" +msgid_plural "%d useless rules" +msgstr[0] "%d regulã fãrã rost" +msgstr[1] "%d reguli fãrã rost" + +#: src/reduce.c:436 +#, c-format +msgid "start symbol %s does not derive any sentence" +msgstr "simbol de start %s nu deriveazã nici o propoziþie" + +#: src/scan-gram.l:162 +msgid "stray `,' treated as white space" +msgstr "Virgulã `,' rãtãcitã tratatã ca spaþiu gol" + +#: src/scan-gram.l:225 +#, c-format +msgid "invalid directive: %s" +msgstr "directivã invalidã: %s" + +#: src/scan-gram.l:283 +#, c-format +msgid "invalid character: %s" +msgstr "caracter invalid: %s" + +#: src/scan-gram.l:402 +#, fuzzy +msgid "invalid null character" +msgstr "caracter invalid: %s" + +#: src/scan-gram.l:415 src/scan-gram.l:427 src/scan-gram.l:448 +#, c-format +msgid "invalid escape sequence: %s" +msgstr "secvenþã escape invalidã: %s" + +#: src/scan-gram.l:417 src/scan-gram.l:429 src/scan-gram.l:450 +#, fuzzy, c-format +msgid "invalid null character: %s" +msgstr "caracter invalid: %s" + +#: src/scan-gram.l:455 +#, c-format +msgid "unrecognized escape sequence: %s" +msgstr "secvenþã escape nerecunoscutã: %s" + +#: src/scan-gram.l:537 +#, c-format +msgid "missing `{' in `%s'" +msgstr "`{' lipsã în `%s'" + +#: src/scan-gram.l:782 +#, c-format +msgid "$$ of `%s' has no declared type" +msgstr "$$ a lui `%s' nu are nici un tip declarat" + +#: src/scan-gram.l:803 +#, c-format +msgid "$%d of `%s' has no declared type" +msgstr "$%d a lui `%s' nu are nici un tip declarat" + +#: src/scan-gram.l:812 src/scan-gram.l:881 src/scan-gram.l:932 +#, c-format +msgid "integer out of range: %s" +msgstr "întreg în afara domeniului: %s" + +#: src/scan-gram.l:848 src/scan-gram.l:916 +#, c-format +msgid "invalid value: %s" +msgstr "valoare invalidã: %s" + +#: src/scan-gram.l:1036 +#, c-format +msgid "missing `%s' at end of file" +msgstr "`%s' lipsã la sfârºitul fiºierului" + +#: src/scan-gram.l:1047 +#, fuzzy, c-format +msgid "missing `%s' at end of line" +msgstr "`%s' lipsã la sfârºitul fiºierului" + +#: src/symlist.c:97 src/symlist.c:108 +msgid "invalid $ value" +msgstr "valoare $ invalidã" + +#: src/symtab.c:85 +#, c-format +msgid "type redeclaration for %s" +msgstr "redeclarare de tip pentru %s" + +#: src/symtab.c:102 src/symtab.c:120 +#, c-format +msgid "%s redeclaration for %s" +msgstr "redeclarare %s pentru %s" + +#: src/symtab.c:139 +#, c-format +msgid "redefining precedence of %s" +msgstr "precedenþã redefinitã pentru %s" + +#: src/symtab.c:157 +#, c-format +msgid "symbol %s redefined" +msgstr "simbol %s redefinit" + +#: src/symtab.c:180 +#, c-format +msgid "redefining user token number of %s" +msgstr "numãrul elementului (token) definit de utilizator redefinit pentru %s" + +#: src/symtab.c:207 +#, c-format +msgid "symbol %s is used, but is not defined as a token and has no rules" +msgstr "" +"simbolul %s e folosit, dar nu este definit ca element (token) ºi nu are nici " +"o regulã" + +#: src/symtab.c:232 +#, c-format +msgid "symbol `%s' used more than once as a literal string" +msgstr "simbolul `%s' este folosit de mai multe ori ca ºir literar" + +#: src/symtab.c:235 +#, c-format +msgid "symbol `%s' given more than one literal string" +msgstr "simbolului `%s' îi este dat mai mult de un singur ºir literar" + +#: src/symtab.c:271 +#, c-format +msgid "conflicting precedences for %s and %s" +msgstr "precedenþe în conflict pentru %s ºi %s" + +#: src/symtab.c:283 +#, c-format +msgid "conflicting associativities for %s (%s) and %s (%s)" +msgstr "asoaciativitãþi în conflict pentru %s (%s) ºi %s (%s)" + +#: src/symtab.c:368 +#, c-format +msgid "tokens %s and %s both assigned number %d" +msgstr "ambelor elementele (tokens) %s ºi %s le sunt alocate acelaºi numãr %d" + +#: src/symtab.c:591 +#, c-format +msgid "the start symbol %s is undefined" +msgstr "simbolul de start %s nu este definit" + +#: src/symtab.c:595 +#, c-format +msgid "the start symbol %s is a token" +msgstr "simbolul de start %s este un element (token)" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "argument invalid %s pentru %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "argument ambiguu %s pentru %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Argumente valide sunt:" + +#: lib/bitset_stats.c:179 +#, c-format +msgid "%u bitset_allocs, %u freed (%.2f%%).\n" +msgstr "%u bitset_allocs, %u eliberate (%.2f%%).\n" + +#: lib/bitset_stats.c:182 +#, c-format +msgid "%u bitset_sets, %u cached (%.2f%%)\n" +msgstr "%u bitset_sets, %u stocate (cached) (%.2f%%)\n" + +#: lib/bitset_stats.c:185 +#, c-format +msgid "%u bitset_resets, %u cached (%.2f%%)\n" +msgstr "%u bitset_resets, %u stocate (cached) (%.2f%%)\n" + +#: lib/bitset_stats.c:188 +#, c-format +msgid "%u bitset_tests, %u cached (%.2f%%)\n" +msgstr "%u bitset_tests, %u stocate (cached) (%.2f%%)\n" + +#: lib/bitset_stats.c:192 +#, c-format +msgid "%u bitset_lists\n" +msgstr "%u bitset_lists\n" + +#: lib/bitset_stats.c:194 +msgid "count log histogram\n" +msgstr "numãrã histograma jurnal\n" + +#: lib/bitset_stats.c:197 +msgid "size log histogram\n" +msgstr "dimensiune histogramã jurnal\n" + +#: lib/bitset_stats.c:200 +msgid "density histogram\n" +msgstr "densitate histogramã\n" + +#: lib/bitset_stats.c:214 +#, c-format +msgid "" +"Bitset statistics:\n" +"\n" +msgstr "" +"Statistici bitset:\n" +"\n" + +#: lib/bitset_stats.c:217 +#, c-format +msgid "Accumulated runs = %u\n" +msgstr "Rulãri acumulate = %u\n" + +#: lib/bitset_stats.c:261 lib/bitset_stats.c:266 +msgid "Could not read stats file." +msgstr "Nu am putut citi fiºierul de statistici." + +#: lib/bitset_stats.c:263 +#, c-format +msgid "Bad stats file size.\n" +msgstr "Dimensiune fiºier cu statistici incorectã.\n" + +#: lib/bitset_stats.c:289 lib/bitset_stats.c:291 +msgid "Could not write stats file." +msgstr "Nu am putut scrie fiºier statistici." + +#: lib/bitset_stats.c:294 +msgid "Could not open stats file for writing." +msgstr "Nu am putut deschide fiºierul de statistici pentru scriere." + +#: lib/error.c:127 +msgid "Unknown system error" +msgstr "Eroare de sistem necunoscutã" + +#: lib/getopt.c:570 lib/getopt.c:589 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: opþiunea `%s' este ambiguã\n" + +#: lib/getopt.c:622 lib/getopt.c:626 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: opþiunea `--%s' nu permite un argument\n" + +#: lib/getopt.c:635 lib/getopt.c:640 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: opþiunea `%c%s' nu permite un argument\n" + +#: lib/getopt.c:686 lib/getopt.c:708 lib/getopt.c:1039 lib/getopt.c:1061 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: opþiunea `%s' necesitã un argument\n" + +#: lib/getopt.c:746 lib/getopt.c:749 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: opþiune nerecunoscutã `--%s'\n" + +#: lib/getopt.c:757 lib/getopt.c:760 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: opþiune nerecunoscutã `%c%s'\n" + +#: lib/getopt.c:815 lib/getopt.c:818 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: opþiune ilegalã -- %c\n" + +#: lib/getopt.c:824 lib/getopt.c:827 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: opþiune ilegalã -- %c\n" + +#: lib/getopt.c:882 lib/getopt.c:901 lib/getopt.c:1114 lib/getopt.c:1135 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: opþiunea necesitã un argument -- %c\n" + +#: lib/getopt.c:954 lib/getopt.c:973 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: opþiunea `-W %s' este ambiguã\n" + +#: lib/getopt.c:997 lib/getopt.c:1018 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: opþiunea `-W %s' nu permite un argument\n" + +#: lib/obstack.c:417 lib/obstack.c:420 lib/xmalloc.c:53 +msgid "memory exhausted" +msgstr "memorie epuizatã" + +#: lib/quotearg.c:238 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:239 +msgid "'" +msgstr "'" + +#: lib/subpipe.c:171 +#, c-format +msgid "subsidiary program `%s' could not be invoked" +msgstr "programul auxiliar `%s' nu poate fi invocat" + +#: lib/subpipe.c:173 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "programul auxiliar `%s' nu a fost gãsit" + +#: lib/subpipe.c:175 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "programul auxiliar `%s' a eºuat" + +#: lib/subpipe.c:176 +#, c-format +msgid "subsidiary program `%s' failed (exit status %d)" +msgstr "programul auxiliar `%s' a eºuat (stare de terminare %d)" + +#: lib/timevar.c:475 +msgid "" +"\n" +"Execution times (seconds)\n" +msgstr "" +"\n" +"Timp de execuþie (secunde)\n" + +#: lib/timevar.c:525 +msgid " TOTAL :" +msgstr " TOTAL :" + +#: lib/timevar.c:561 +#, c-format +msgid "time in %s: %ld.%06ld (%ld%%)\n" +msgstr "timp în %s: %ld.%06ld (%ld%%)\n" diff --git a/src/apps/bin/bison/po/ru.gmo b/src/apps/bin/bison/po/ru.gmo new file mode 100644 index 0000000000000000000000000000000000000000..9ddea8c11255f60882c1ebb361b307902d624d98 GIT binary patch literal 12402 zcmbW5dvIJ=eaBB)0%Uc`YSzn>K-(xOPZj(&^An zKfiPD-G?j@*LU{p_uljTo!|SMi|=^DA1R(Zbe8SpBFv<6=Zw=Sm3Ces=fI`RbM)NVQ@Qm1bh?t2cYcpOW+s5KLu0Tg;tbbc53c~I#2>*)JwkfqgP^nDSOeY^_F zzBVyP=DiD)@q74tJNP*G3*e{0d%@oUg@4}$rT;1@>%0ag!FSSG(53Y7KApwRba5LT(LMfKkX*^*iW z?*?B0WuDt1Lgv346g_wtlzAq=_ko`SMQ^?ez8`!V6#o7TDC6J6;6Ctupy=ZvP=k+0 z^|Rm|e19F3eS6@Y;7`Ea;JcYz==uaG{c@lNzW{CpzX6I~oCo=-n^;tX?*Sn}?F3OZ zH4chiS)k}c20VL{QV#ea-#ZY>F!)r2-vu#E^{ci$A-}Zyj zFAMGg%it*Zo#;CO@j~Z8kg3#cgntaORrM|KKClwi--Hnj@_h#=^`qeZ;O~L_)YJTJ z2cH3DzFT#OcY|z8JpziJeiRh@|12o__fMec`y%)N_!^i12ks2{yaW6jz7K&r!I#0W zgGn~~cQ>Jbpv?CfHvKKW{}GgRo?ueZ&p!l3KfemXTJ=qE2%HDM1>THud8PWi z@Z|(3^Zo;PJ9r92#Hs;GzgIw^=N61a?CJqf`j3N>;q+gV<4qOT!e=r6qAijhzvhP5!={D!Muzg1&rN^ZlF3UOA$RvQRETb z75$S(cDkIhZ*Z_PotZ2tLz~ityw2K_r6KcH z%uG$oYiV}Ike_j&JE1mh(uGNVbhEQXPeXgYpwo6LYe9tRsW!3GpWPvCPg><{Nzu`; zCT}0Ni!elXkxs>Ba7xsb}^U9TUqJ8PPNlrFRQHmrh}t%Wk3NAyI-K~tveyj`?P2xZ19I(Cso znE$};17lkUx9O>(mCI2NLHom3HFD3P$P3t&UYuC_LD) zIHyma$dsmy?K=9zv<;70WL8@AAbvonB zWUX0-L9VG5-)KLXDM{zYq%$tTkvX(3luI+^l8!4fd3Kcx7w8@Z50c4QE0r=UXggQV z!g@V==fi8GcIkHtW4GshbsKH%B2D%7xFU2@o0M!1;>sDhv-;2`a1e(dkIlZdy9;k zkWoTKa;6B`PY#cc?cK-Dw036fRAv(P>!?bk9x+V@I5NB-!^6tqeIp0ne7_U<{vF!k z%jij=T*RKmG*W~MBn{@%c=|%#!3B;RH^%sbhZ01MqLnYr?l4r4goH8w(Y<4P9@%|x zeD^~m2S&y}p_yvm$oRp%hY#z0hsN}7J-T~rd}Pm&1G~rc=#ep$elJ@eFV0G`1bfBL zZ7~$&3hc1UkJ0T&{#d?nf><=`lwu;}lXE zOzAj6L0iK4_14YKHbWXq%6rcktcsM;&Zj#4Wfww0G&5NeDi-FJ_k@sG(`Yi_>uBp+ zXC^y0Q<_!gKg?x?YDt(Sy=dpCeP#n>$`*E7$SafV>#g+YY}($IQ1+9!@)Bbqxtl5- z@86gm5zomhux&X zvfciUHL6Ps;;y1SY|<`@*0u+CV=c3I%4v&a9fy$1 zIF9JcQOQrOk`}KD*+$FSZJ#Aw&WD?i>oVv`DKnX2r!?Un@m~1xB(p*NvlHOG!l7fD0P zX2-IOsD?2E^D%|jj}IjHN8>&5Vfbp9N|`=ArzkyPr{E*;ezL7pjxxFyD(PC~AOXQe zgyG3-o%4!uizG#INV4*?NDvJ|g34qoP{>P>?Cxma7F{BB7L6vWfjr5SXDsPio^Ueh zjD=)LwS-xrJX7t=oKqP}#Wt92gU*wrSg+fxw@O-R)V<6BHoa}b>BM7A%2`2mwhJ>Q z3iT1+OlmEC!mKeoxJNP*ON$P}Mi;tfh=dHCCJe1%XP2-xXoen>r7~V*DrfN69ZnR; z!to%PsXQDGkE_Ccb71F4?o3Pm$#6MsN4{rB@7(O{(svFU47&=6a)LK$OzhWtj$G@R zDtsZx^qj?w!N&E%2t_Cr-H#FPGg>Ts8Yh<=Nhco*Q~aUmv^3cNz=!Tng!x4BQD-WX zPCi6dksL43V{KNE7(Fze+#||`Lrp%6jt%MU0|WOZ2kuX9AJl^bL)$-?9Qe?{03DNK z_VJ7yCOZA@O%4q5W603G_uoBmFZ~W!PANH#_j5Qm6mVb<=Q1Vq^Kd`sqvKYJ^VKo( z8!Bh52UFJZjMYCg(_bv_Vq|`*Or%bZ+g5H!kChP#C;6Sl@`KroNr4iNjy$@zv){q~ zfy5pO4|!H3SPbbBUi%)7M49{!Ek4w-OT)(snFo@^PDdea(k>?V=2L|kZF|? zquFxN$|m=5Dk9qDXUwNFeD4k&z7B8AZyp>N9v;+p-KFJq;LhQ}LH!Xupy|%{uHo%* z)6U`h7N;1Tkg4&siztGfG@BG}dUaY$--rxkSl~ynpRBv!}W3J_&mC?Rdy5?5A zR=@>U%@xY!t?4fc@k_1BlGki3LAtr`YK6|J=4rp`c}*QG`VF^M3(f{I!ZlZ3{_5*> ziVRV)K*TA{jE$Bz=hXu4IpS(}{pz)~r@Y2uQ1Mo4EAuopy?WJWM>0*PbyKz&{ z>S+tSn82Rum2*+`H8X|VQLC=VdM>D(uLZhM@#cb-+q|HmGC1!yy~>3eGhg%@l|U^9 zt!7Y{?~s?iXNFdU4qnkCM1C8^A zOBYrRDM<8`x2oOx+2yKNYr5g(Qq2qIYQbvFz1W`eX#3_Vnvqmv{rMX0*@9{~T{t4V zY+HZKIy6Ls!b`X79u z48yO=0xKL{e;nxZ9@8~KZlV;OA?FgYvIi~bztZ*-tcdUNtF552q8qVcSN%TtwGaps z&OwZi@d_m;afa#@?>yG1&n(v#PW!agv8kHBwBG$5{6L3%{cLktH^e(EEaP%pEAvfX zZX4EI@Ws9Tn&H`L|D+By7T)mv?on$l_@1pUR}2lvxcidtHHi?fbH~>RR_8=F46j4| zSar|hr&}k|IxB%N+Tp9|qEaNx6<3q^jy*_;r^sn!t@8wrs{Qjkv zUe$Ve!9`mx=(s}cqqTAl?}f0$ctYB{ulm0K{0}b^sH0~wsESyaqVBCOS1w>g&@Fw0 z=8Z4>Hrn$-d(TYM^5;CwJU`>%rZ9vM&qWp*%5~$5LDGoGk%bX= z&aZn5O~17g-w_H88($3ejBOGv7szX1oqu{o25x*e*xr2D8yhFAMu}fSU6nk~*Nq@J z^_)B3B&i6rJ6HD_%NyJhzHIWxuJmU`y&AyEC1EOg4eqNG&1>So;;d&y{W!{hZoseo z6jN-pf>YQLZky;5>fH{#Os3MpwCgTD3_|K|XzGn>(5#ctprU>wGQTF-Zqq&2pSW`A zrRQI|^dI`HOZTQPxfyek&4`%8w6agnxp?fThp%70dillwzH;@|A79cw0p#UZF8$!@ z3+6lV!sQ?7t0=|`FJ6A}%9X1>)c^kCCENmrNY2Pl2?vOYIm0FZ=&Fi*T z^-TbXA~-v35N5rq>^aKFqe+ch_v9?6Kl#$-fBoM}=GM`83H5L7q|@t4EmwN#!)(x1 zFT@F)*A99sL+W`+{8onaE5RwR-sA{TKZW`G`W648Tc6XfqJJn6q#jkh=}jESgf7`8 ziQ>9?f`ksUX_H9wf7kdfn-bJj&(~=AtukJP)!D*i?pjAVFVM@aK z=2FrZO3Yo%n$e4OKM?(BhKU5dq^nwpPD^YaWe!t@dqPO8X*A~)_j(%5rR18qByT3g zmj8ApZ&=1*#a|8MwmH0Xjt!*d9A?6N!0m%xn)IAE-)Le0ajvtq=5_JIUE;=)#D31L z$Vn+p+7O)vd#I1P1dR*beO!GVor2byUKJmwI8TW1u&p_B-co1Wrc3_R)?%(0X!bBm z%(KzuJ`&2rN-|0bEH#{)p7Y&Bca;dCPkR*@VD2x%!v&n%6sv)U?sT0-)=|Ws_K=HR zb3t3|k=>{|o{pwx7lfMn^2z7;SPbHGlQ}Lmnitj#fUZb6jfJX3x4J~^@EaGs`XT{L z1Aamve0BYWiTJ_^tWQ z-9UW5f$sZX%V-^V2M|=wt8k+s4CKDGXVWSdD zI8TdrQr+sU#5k6gCgBT7u&9RINgi2K;6I?y>$U=4QDf6S8i!vXC8P{bLUY?S9KT` zWe2E!W2sLgJbJa&$Q-yrp}EGvMVC3D_)zK2jf6R@8O4h{qPXw%B-B2owUuGLUc|BR z{O8pa((tR1n!4PSg|Pw7`lKLOk zkUJ_8C%K`DO@PBLxs2R(m?P@-xSq~sQg_5RUa8&G2{TGIy3F5sMB{sFKJm@}2T_1z Ai~s-t literal 0 HcmV?d00001 diff --git a/src/apps/bin/bison/po/ru.po b/src/apps/bin/bison/po/ru.po new file mode 100644 index 0000000000..ae57307bc6 --- /dev/null +++ b/src/apps/bin/bison/po/ru.po @@ -0,0 +1,989 @@ +# ðÅÒÅ×ÏÄ ÓÏÏÂÝÅÎÉÊ bison. +# Copyright (C) 1999 Free Software Foundation, Inc. +# Dmitry S. Sivachenko , 1999,2000,2001,2002. +# +msgid "" +msgstr "" +"Project-Id-Version: bison 1.875\n" +"Report-Msgid-Bugs-To: bug-bison@gnu.org\n" +"POT-Creation-Date: 2004-05-21 10:26-0700\n" +"PO-Revision-Date: 2003-01-01 20:35+0300\n" +"Last-Translator: Dmitry S. Sivachenko \n" +"Language-Team: Russian \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=koi8-r\n" +"Content-Transfer-Encoding: 8-bit\n" +"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n%" +"10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n" + +#: src/complain.c:51 src/complain.c:66 +msgid "warning: " +msgstr "ÐÒÅÄÕÐÒÅÖÄÅÎÉÅ: " + +#: src/complain.c:122 src/complain.c:138 +msgid "fatal error: " +msgstr "ÆÁÔÁÌØÎÁÑ ÏÛÉÂËÁ: " + +#: src/conflicts.c:76 +#, c-format +msgid " Conflict between rule %d and token %s resolved as shift" +msgstr " ëÏÎÆÌÉËÔ ÍÅÖÄÕ ÐÒÁ×ÉÌÏÍ %d É ÌÅËÓÅÍÏÊ %s ÒÁÚÒÅÛÅÎ ÓÄ×ÉÇÏÍ" + +#: src/conflicts.c:84 +#, c-format +msgid " Conflict between rule %d and token %s resolved as reduce" +msgstr " ëÏÎÆÌÉËÔ ÍÅÖÄÕ ÐÒÁ×ÉÌÏÍ %d É ÌÅËÓÅÍÏÊ %s ÒÁÚÒÅÛÅÎ ×Ù×ÏÄÏÍ" + +#: src/conflicts.c:91 +#, c-format +msgid " Conflict between rule %d and token %s resolved as an error" +msgstr " ëÏÎÆÌÉËÔ ÍÅÖÄÕ ÐÒÁ×ÉÌÏÍ %d É ÌÅËÓÅÍÏÊ %s ÒÁÚÒÅÛÅÎ ËÁË ÏÛÉÂËÁ" + +#: src/conflicts.c:399 +#, c-format +msgid "conflicts: %d shift/reduce, %d reduce/reduce\n" +msgstr "ËÏÎÆÌÉËÔÙ: %d ÓÄ×ÉÇÁ/×Ù×ÏÄÁ, %d ×Ù×ÏÄÁ/×Ù×ÏÄÁ\n" + +#: src/conflicts.c:402 +#, c-format +msgid "conflicts: %d shift/reduce\n" +msgstr "ËÏÎÆÌÉËÔÙ: %d ÓÄ×ÉÇÁ/×Ù×ÏÄÁ\n" + +#: src/conflicts.c:404 +#, c-format +msgid "conflicts: %d reduce/reduce\n" +msgstr "ËÏÎÆÌÉËÔÙ: %d ×Ù×ÏÄÁ/×Ù×ÏÄÁ\n" + +#: src/conflicts.c:422 +#, c-format +msgid "State %d " +msgstr "óÏÓÔÏÑÎÉÅ %d " + +#: src/conflicts.c:487 +#, c-format +msgid "%%expect-rr applies only to GLR parsers" +msgstr "" + +#: src/conflicts.c:511 +#, c-format +msgid "expected %d shift/reduce conflict" +msgid_plural "expected %d shift/reduce conflicts" +msgstr[0] "ÏÖÉÄÁÌÓÑ %d ËÏÎÆÌÉËÔ ÓÄ×ÉÇÁ/×Ù×ÏÄÁ" +msgstr[1] "ÏÖÉÄÁÌÏÓØ %d ËÏÎÆÌÉËÔÁ ÓÄ×ÉÇÁ/×Ù×ÏÄÁ" +msgstr[2] "ÏÖÉÄÁÌÏÓØ %d ËÏÎÆÌÉËÔÏ× ÓÄ×ÉÇÁ/×Ù×ÏÄÁ" + +#: src/conflicts.c:515 +#, fuzzy, c-format +msgid "expected %d reduce/reduce conflict" +msgid_plural "expected %d reduce/reduce conflicts" +msgstr[0] "ÏÖÉÄÁÌÏÓØ 0 ËÏÎÆÌÉËÔÏ× ×Ù×ÏÄÁ/×Ù×ÏÄÁ" +msgstr[1] "ÏÖÉÄÁÌÏÓØ 0 ËÏÎÆÌÉËÔÏ× ×Ù×ÏÄÁ/×Ù×ÏÄÁ" +msgstr[2] "ÏÖÉÄÁÌÏÓØ 0 ËÏÎÆÌÉËÔÏ× ×Ù×ÏÄÁ/×Ù×ÏÄÁ" + +#: src/files.c:100 +#, c-format +msgid "cannot open file `%s'" +msgstr "ÎÅ ÕÄÁÅÔÓÑ ÏÔËÒÙÔØ ÆÁÊÌ `%s'" + +#: src/files.c:116 +msgid "I/O error" +msgstr "ÏÛÉÂËÁ ××ÏÄÁ-×Ù×ÏÄÁ" + +#: src/files.c:119 +msgid "cannot close file" +msgstr "ÎÅ ÕÄÁÅÔÓÑ ÚÁËÒÙÔØ ÆÁÊÌ" + +#: src/files.c:337 +#, fuzzy, c-format +msgid "conflicting outputs to file %s" +msgstr "ÐÒÏÔÉ×ÏÒÅÞÉ×ÙÅ ÚÎÁÞÅÎÉÑ ÁÓÓÏÃÉÁÔÉ×ÎÏÓÔÉ ÄÌÑ %s É %s" + +#: src/getargs.c:186 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "éÓÐÏÌØÚÕÊÔÅ `%s --help' ÄÌÑ ÄÏÐÏÌÎÉÔÅÌØÎÏÊ ÉÎÆÏÒÍÁÃÉÉ.\n" + +#: src/getargs.c:192 +msgid "GNU bison generates parsers for LALR(1) grammars.\n" +msgstr "GNU bison ÇÅÎÅÒÉÒÕÅÔ ÁÎÁÌÉÚÁÔÏÒÙ ÄÌÑ ÇÒÁÍÍÁÔÉË LALR(1).\n" + +#: src/getargs.c:196 +#, c-format +msgid "Usage: %s [OPTION]... FILE\n" +msgstr "éÓÐÏÌØÚÏ×ÁÎÉÅ: %s [ëìàþé]... æáêì\n" + +#: src/getargs.c:200 +msgid "" +"If a long option shows an argument as mandatory, then it is mandatory\n" +"for the equivalent short option also. Similarly for optional arguments.\n" +msgstr "" +"åÓÌÉ ÄÌÉÎÎÁÑ ÆÏÒÍÁ ËÌÀÞÁ ÏÐÒÅÄÅÌÑÅÔ ÁÒÇÕÍÅÎÔ ËÁË ÏÂÑÚÁÔÅÌØÎÙÊ, ÔÏ ÏÎ ÔÁËÖÅ\n" +"Ñ×ÌÑÅÔÓÑ ÏÂÑÚÁÔÅÌØÎÙÍ ÄÌÑ ËÏÒÏÔËÏÊ ÆÏÒÍÙ. ôÏ ÖÅ ËÁÓÁÅÔÓÑ ÎÅÏÂÑÚÁÔÅÌØÎÙÈ\n" +"ÁÒÇÕÍÅÎÔÏ×.\n" + +#: src/getargs.c:206 +msgid "" +"Operation modes:\n" +" -h, --help display this help and exit\n" +" -V, --version output version information and exit\n" +" -y, --yacc emulate POSIX yacc\n" +msgstr "" +"òÅÖÉÍÙ ÆÕÎËÃÉÏÎÉÒÏ×ÁÎÉÑ:\n" +" -h, --help ×Ù×ÅÓÔÉ ÜÔÕ ÓÐÒÁ×ËÕ É ×ÙÊÔÉ\n" +" -V, --version ×Ù×ÅÓÔÉ ÉÎÆÏÒÍÁÃÉÀ Ï ×ÅÒÓÉÉ É ×ÙÊÔÉ\n" +" -y, --yacc ÜÍÕÌÉÒÏ×ÁÔØ POSIX yacc\n" + +#: src/getargs.c:213 +msgid "" +"Parser:\n" +" -S, --skeleton=FILE specify the skeleton to use\n" +" -t, --debug instrument the parser for debugging\n" +" --locations enable locations computation\n" +" -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n" +" -l, --no-lines don't generate `#line' directives\n" +" -n, --no-parser generate the tables only\n" +" -k, --token-table include a table of token names\n" +msgstr "" +"áÎÁÌÉÚÁÔÏÒ:\n" +" -S, --skeleton=æáêì ÕËÁÚÁÔØ ÆÁÊÌ ÛÁÂÌÏÎÁ\n" +" -t, --debug ÎÁÓÔÒÏÉÔØ ÁÎÁÌÉÚÁÔÏÒ ÄÌÑ ÏÔÌÁÄËÉ\n" +" --locations ×ËÌÀÞÉÔØ ×ÙÞÉÓÌÅÎÉÅ ÍÅÓÔÏÐÏÌÏÖÅÎÉÊ\n" +" -p, --name-prefix=ðòåæéëó ÐÏÄÓÔÁ×ÉÔØ ðòåæéëó ÄÌÑ ×ÎÅÛÎÉÈ ÓÉÍ×ÏÌÏ×\n" +" -l, --no-lines ÎÅ ÇÅÎÅÒÉÒÏ×ÁÔØ ÄÉÒÅËÔÉ×Ù `#line'\n" +" -n, --no-parser ÇÅÎÅÒÉÒÏ×ÁÔØ ÔÏÌØËÏ ÔÁÂÌÉÃÙ\n" +" -k, --token-table ×ËÌÀÞÉÔØ ÔÁÂÌÉÃÕ ÉÍÅÎ ÌÅËÓÅÍ\n" + +#: src/getargs.c:225 +msgid "" +"Output:\n" +" -d, --defines also produce a header file\n" +" -r, --report=THINGS also produce details on the automaton\n" +" -v, --verbose same as `--report=state'\n" +" -b, --file-prefix=PREFIX specify a PREFIX for output files\n" +" -o, --output=FILE leave output to FILE\n" +" -g, --graph also produce a VCG description of the " +"automaton\n" +msgstr "" +"÷Ù×ÏÄ:\n" +" -d, --defines ÓÏÚÄÁÔØ ÔÁËÖÅ ÆÁÊÌ ÚÁÇÏÌÏ×ËÏ×\n" +" -r, --report=THINGS ÓÏÚÄÁÔØ ÔÁËÖÅ ÐÏÑÓÎÅÎÉÑ × Á×ÔÏÍÁÔÕ\n" +" -v, --verbose ÔÏ ÖÅ, ÞÔÏ É `--report=state'\n" +" -b, --file-prefix=ðòåæéëó ÕËÁÚÁÔØ ðòåæéëó ÄÌÑ ×ÙÈÏÄÎÙÈ ÆÁÊÌÏ×\n" +" -o, --output=æáêì ÐÏÍÅÓÔÉÔØ ÒÅÚÕÌØÔÁÔ × æáêì\n" +" -g, --graph ÓÏÚÄÁÔØ ÔÁËÖÅ ÐÏÑÓÎÅÎÉÑ Ë Á×ÔÏÍÁÔÕ × ×ÉÄÅ \n" +" VCG-ÇÒÁÆÁ\n" + +#: src/getargs.c:236 +msgid "" +"THINGS is a list of comma separated words that can include:\n" +" `state' describe the states\n" +" `itemset' complete the core item sets with their closure\n" +" `lookahead' explicitly associate lookaheads to items\n" +" `solved' describe shift/reduce conflicts solving\n" +" `all' include all the above information\n" +" `none' disable the report\n" +msgstr "" + +#: src/getargs.c:247 +msgid "Report bugs to .\n" +msgstr "ïÛÉÂËÉ ÓÏÏÂÝÁÊÔÅ ÐÏ ÁÄÒÅÓÕ .\n" + +#: src/getargs.c:264 +#, c-format +msgid "bison (GNU Bison) %s" +msgstr "bison (GNU Bison) %s" + +#: src/getargs.c:266 +msgid "Written by Robert Corbett and Richard Stallman.\n" +msgstr "á×ÔÏÒÙ: òÏÂÅÒÔ ëÏÒÂÅÔ É òÉÞÁÒÄ óÔÏÌÍÅÎ.\n" + +#: src/getargs.c:270 +#, c-format +msgid "Copyright (C) %d Free Software Foundation, Inc.\n" +msgstr "Copyright (C) %d Free Software Foundation, Inc.\n" + +#: src/getargs.c:272 +msgid "" +"This is free software; see the source for copying conditions. There is NO\n" +"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +msgstr "" +"üÔÏ Ó×ÏÂÏÄÎÁÑ ÐÒÏÇÒÁÍÍÁ; ÕÓÌÏ×ÉÑ ÒÁÓÐÒÏÓÔÒÁÎÅÎÉÑ ÓÍÏÔÒÉÔÅ × ÉÓÈÏÄÎÙÈ " +"ÔÅËÓÔÁÈ.\n" +"îéëáëéè ÇÁÒÁÎÔÉÊ ÎÅ ÐÒÅÄÏÓÔÁ×ÌÑÅÔÓÑ, ÄÁÖÅ ÇÁÒÁÎÔÉÉ ðïìåúîïóôé ÉÌÉ " +"ðòéçïäîïóôé\n" +"äìñ ïðòåäåìåîîïê ãåìé.\n" + +#: src/getargs.c:438 +#, c-format +msgid "missing operand after `%s'" +msgstr "ÐÏÓÌÅ `%s' ÐÒÏÐÕÝÅÎ ÏÐÅÒÁÎÄ" + +#: src/getargs.c:440 +#, c-format +msgid "extra operand `%s'" +msgstr "ÌÉÛÎÉÊ ÏÐÅÒÁÎÄ `%s'" + +#: src/gram.c:139 +msgid "empty" +msgstr "ÐÕÓÔÏ" + +#: src/gram.c:233 +msgid "Grammar" +msgstr "çÒÁÍÍÁÔÉËÁ" + +#: src/gram.c:321 src/reduce.c:394 +msgid "warning" +msgstr "ÐÒÅÄÕÐÒÅÖÄÅÎÉÅ" + +#: src/main.c:124 +msgid "rule never reduced because of conflicts" +msgstr "ÐÒÁ×ÉÌÏ ÎÅ Ó×ÅÄÅÎÏ ÉÚ-ÚÁ ËÏÎÆÌÉËÔÏ×" + +#: src/parse-gram.y:363 +msgid "POSIX forbids declarations in the grammar" +msgstr "POSIX ÚÁÐÒÅÝÁÅÔ ÐÏÍÅÝÁÔØ ÏÐÉÓÁÎÉÑ × ÇÒÁÍÍÁÔÉËÅ" + +#: src/parse-gram.y:486 +msgid "missing identifier in parameter declaration" +msgstr "× ÏÐÉÓÁÎÉÉ ÐÁÒÁÍÅÔÒÁ ÏÔÓÕÔÓÔ×ÕÅÔ ÉÄÅÎÔÉÆÉËÁÔÏÒ" + +#: src/print.c:49 +#, c-format +msgid " type %d is %s\n" +msgstr " ÔÉÐ %d Ñ×ÌÑÅÔÓÑ %s\n" + +#: src/print.c:165 +#, c-format +msgid "shift, and go to state %d\n" +msgstr "ÓÄ×ÉÇ, É ÐÅÒÅÈÏÄ × ÓÏÓÔÏÑÎÉÅ %d\n" + +#: src/print.c:167 +#, c-format +msgid "go to state %d\n" +msgstr "ÐÅÒÅÈÏÄ × ÓÏÓÔÏÑÎÉÅ %d\n" + +#: src/print.c:204 +msgid "error (nonassociative)\n" +msgstr "ÏÛÉÂËÁ (ÎÅÁÓÓÏÃÉÁÔÉ×ÎÁÑ)\n" + +#: src/print.c:292 +#, c-format +msgid "reduce using rule %d (%s)" +msgstr "×Ù×ÏÄ Ó ÉÓÐÏÌØÚÏ×ÁÎÉÅÍ ÐÒÁ×ÉÌÁ %d (%s)" + +#: src/print.c:294 +#, c-format +msgid "accept" +msgstr "" + +#: src/print.c:325 src/print.c:391 +msgid "$default" +msgstr "$default" + +#: src/print.c:420 +#, c-format +msgid "state %d" +msgstr "ÓÏÓÔÏÑÎÉÅ %d" + +#: src/print.c:456 +msgid "Terminals, with rules where they appear" +msgstr "ôÅÒÍÉÎÁÌØÎÙÅ ÓÉÍ×ÏÌÙ Ó ÐÒÁ×ÉÌÁÍÉ, × ËÏÔÏÒÙÈ ÏÎÉ ÐÏÑ×ÌÑÀÔÓÑ" + +#: src/print.c:483 +msgid "Nonterminals, with rules where they appear" +msgstr "îÅÔÅÒÍÉÎÁÌØÎÙÅ ÓÉÍ×ÏÌÙ Ó ÐÒÁ×ÉÌÁÍÉ, × ËÏÔÏÒÙÈ ÏÎÉ ÐÏÑ×ÌÑÀÔÓÑ" + +#: src/print.c:512 +#, c-format +msgid " on left:" +msgstr " ÎÁÌÅ×Ï:" + +#: src/print.c:527 +#, c-format +msgid " on right:" +msgstr " ÎÁÐÒÁ×Ï:" + +#: src/print.c:555 +msgid "Rules never reduced" +msgstr "ðÒÁ×ÉÌÁ ÎÅ Ó×ÅÄÅÎÙ" + +#: src/reader.c:56 +#, c-format +msgid "multiple %s declarations" +msgstr "ÍÎÏÖÅÓÔ×ÅÎÎÏÅ ÏÐÉÓÁÎÉÅ %s" + +#: src/reader.c:118 +#, c-format +msgid "result type clash on merge function %s: <%s> != <%s>" +msgstr "" + +#: src/reader.c:216 +#, c-format +msgid "rule given for %s, which is a token" +msgstr "ÐÒÁ×ÉÌÏ ÚÁÄÁÎÏ ÄÌÑ %s, ËÏÔÏÒÙÊ Ñ×ÌÑÅÔÓÑ ÌÅËÓÅÍÏÊ" + +#: src/reader.c:245 +#, c-format +msgid "type clash on default action: <%s> != <%s>" +msgstr "ËÏÎÆÌÉËÔ ÔÉÐÏ× ÎÁ ÄÅÊÓÔ×ÉÉ ÐÏ ÕÍÏÌÞÁÎÉÀ: <%s> != <%s>" + +#: src/reader.c:251 +msgid "empty rule for typed nonterminal, and no action" +msgstr "" +"ÐÕÓÔÏÅ ÐÒÁ×ÉÌÏ ÄÌÑ ÔÉÐÉÚÉÒÏ×ÁÎÎÏÇÏ ÎÅÔÅÒÍÉÎÁÌØÎÏÇÏ ÓÉÍ×ÏÌÁ, É ÎÅÔ ÄÅÊÓÔ×ÉÑ" + +#: src/reader.c:321 src/reader.c:335 src/reader.c:348 +#, c-format +msgid "only one %s allowed per rule" +msgstr "" + +#: src/reader.c:331 src/reader.c:346 +#, c-format +msgid "%s affects only GLR parsers" +msgstr "" + +#: src/reader.c:333 +#, c-format +msgid "%s must be followed by positive number" +msgstr "ÚÁ %s ÄÏÌÖÎÏ ÓÌÅÄÏ×ÁÔØ ÐÏÌÏÖÉÔÅÌØÎÏÅ ÞÉÓÌÏ" + +#: src/reader.c:490 +msgid "no rules in the input grammar" +msgstr "ÏÔÓÕÔÓÔ×ÕÀÔ ÐÒÁ×ÉÌÁ ×Ï ×ÈÏÄÎÏÊ ÇÒÁÍÍÁÔÉËÅ" + +#: src/reduce.c:242 +msgid "useless rule" +msgstr "ÂÅÓÐÏÌÅÚÎÏÅ ÐÒÁ×ÉÌÏ" + +#: src/reduce.c:303 +#, c-format +msgid "useless nonterminal: %s" +msgstr "ÂÅÓÐÏÌÅÚÎÙÅ ÎÅÔÅÒÍÉÎÁÌ: %s" + +#: src/reduce.c:351 +msgid "Useless nonterminals" +msgstr "âÅÓÐÏÌÅÚÎÙÅ ÎÅÔÅÒÍÉÎÁÌÙ" + +#: src/reduce.c:364 +msgid "Terminals which are not used" +msgstr "îÅÉÓÐÏÌØÚÏ×ÁÎÎÙÅ ÔÅÒÍÉÎÁÌÙ" + +#: src/reduce.c:373 +msgid "Useless rules" +msgstr "âÅÓÐÏÌÅÚÎÙÅ ÐÒÁ×ÉÌÁ" + +#: src/reduce.c:389 +#, c-format +msgid "%d rule never reduced\n" +msgid_plural "%d rules never reduced\n" +msgstr[0] "%d ÐÒÁ×ÉÌÏ ÎÅ Ó×ÅÄÅÎÏ\n" +msgstr[1] "%d ÐÒÁ×ÉÌÁ ÎÅ Ó×ÅÄÅÎÏ\n" +msgstr[2] "%d ÐÒÁ×ÉÌ ÎÅ Ó×ÅÄÅÎÏ\n" + +#: src/reduce.c:397 +#, c-format +msgid "%d useless nonterminal" +msgid_plural "%d useless nonterminals" +msgstr[0] "%d ÂÅÓÐÏÌÅÚÎÙÊ ÎÅÔÅÒÍÉÎÁÌ" +msgstr[1] "%d ÂÅÓÐÏÌÅÚÎÙÈ ÎÅÔÅÒÍÉÎÁÌÁ" +msgstr[2] "%d ÂÅÓÐÏÌÅÚÎÙÈ ÎÅÔÅÒÍÉÎÁÌÏ×" + +#: src/reduce.c:403 +#, c-format +msgid " and " +msgstr " É " + +#: src/reduce.c:406 +#, c-format +msgid "%d useless rule" +msgid_plural "%d useless rules" +msgstr[0] "%d ÂÅÓÐÏÌÅÚÎÏÅ ÐÒÁ×ÉÌÏ" +msgstr[1] "%d ÂÅÓÐÏÌÅÚÎÙÈ ÐÒÁ×ÉÌÁ" +msgstr[2] "%d ÂÅÓÐÏÌÅÚÎÙÈ ÐÒÁ×ÉÌ" + +#: src/reduce.c:436 +#, c-format +msgid "start symbol %s does not derive any sentence" +msgstr "ÎÁÞÁÌØÎÙÊ ÓÉÍ×ÏÌ %s ÎÅ ×Ù×ÏÄÉÔ ÎÉ ÏÄÎÏÇÏ ÐÒÅÄÌÏÖÅÎÉÑ" + +#: src/scan-gram.l:162 +msgid "stray `,' treated as white space" +msgstr "ÌÉÛÎÑÑ `,', ÓÞÉÔÁÅÔÓÑ ÐÒÏÂÅÌÏÍ" + +#: src/scan-gram.l:225 +#, c-format +msgid "invalid directive: %s" +msgstr "ÎÅ×ÅÒÎÁÑ ÄÉÒÅËÔÉ×Á: %s" + +#: src/scan-gram.l:283 +#, c-format +msgid "invalid character: %s" +msgstr "ÎÅÄÏÐÕÓÔÉÍÙÊ ÓÉÍ×ÏÌ: %s" + +#: src/scan-gram.l:402 +#, fuzzy +msgid "invalid null character" +msgstr "ÎÅÄÏÐÕÓÔÉÍÙÊ ÓÉÍ×ÏÌ: %s" + +#: src/scan-gram.l:415 src/scan-gram.l:427 src/scan-gram.l:448 +#, c-format +msgid "invalid escape sequence: %s" +msgstr "ÎÅÄÏÐÕÓÔÉÍÁÑ ÜËÒÁÎÉÒÕÀÝÁÑ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ: %s" + +#: src/scan-gram.l:417 src/scan-gram.l:429 src/scan-gram.l:450 +#, fuzzy, c-format +msgid "invalid null character: %s" +msgstr "ÎÅÄÏÐÕÓÔÉÍÙÊ ÓÉÍ×ÏÌ: %s" + +#: src/scan-gram.l:455 +#, c-format +msgid "unrecognized escape sequence: %s" +msgstr "ÎÅÒÁÓÐÏÚÎÁÎÎÁÑ ÜËÒÁÎÉÒÕÀÝÁÑ ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ: %s" + +#: src/scan-gram.l:537 +#, c-format +msgid "missing `{' in `%s'" +msgstr "× `%s' ÏÔÓÕÔÓÔ×ÕÅÔ `{'" + +#: src/scan-gram.l:782 +#, c-format +msgid "$$ of `%s' has no declared type" +msgstr "$$ × `%s' ÎÅ ÉÍÅÅÔ ÏÐÉÓÁÎÎÏÇÏ ÔÉÐÁ" + +#: src/scan-gram.l:803 +#, c-format +msgid "$%d of `%s' has no declared type" +msgstr "$%d ÉÚ `%s' ÎÅ ÉÍÅÅÔ ÏÐÉÓÁÎÎÏÇÏ ÔÉÐÁ" + +#: src/scan-gram.l:812 src/scan-gram.l:881 src/scan-gram.l:932 +#, c-format +msgid "integer out of range: %s" +msgstr "×ÙÈÏÄ ÚÁ ÇÒÁÎÉÃÙ ÄÉÁÐÁÚÏÎÁ ÃÅÌÏÇÏ: %s" + +#: src/scan-gram.l:848 src/scan-gram.l:916 +#, c-format +msgid "invalid value: %s" +msgstr "ÎÅÄÏÐÕÓÔÉÍÏÅ ÚÎÁÞÅÎÉÅ: %s" + +#: src/scan-gram.l:1036 +#, c-format +msgid "missing `%s' at end of file" +msgstr "ÏÔÓÕÔÓÔ×ÕÅÔ `%s' × ËÏÎÃÅ ÆÁÊÌÁ" + +#: src/scan-gram.l:1047 +#, fuzzy, c-format +msgid "missing `%s' at end of line" +msgstr "ÏÔÓÕÔÓÔ×ÕÅÔ `%s' × ËÏÎÃÅ ÆÁÊÌÁ" + +#: src/symlist.c:97 src/symlist.c:108 +msgid "invalid $ value" +msgstr "ÎÅ×ÅÒÎÏÅ $ ÚÎÁÞÅÎÉÅ" + +#: src/symtab.c:85 +#, c-format +msgid "type redeclaration for %s" +msgstr "ÐÏ×ÔÏÒÎÏÅ ÏÐÉÓÁÎÉÅ ÔÉÐÁ ÄÌÑ %s" + +#: src/symtab.c:102 src/symtab.c:120 +#, c-format +msgid "%s redeclaration for %s" +msgstr "ÐÏ×ÔÏÒÎÏÅ ÏÐÉÓÁÎÉÅ %s ÄÌÑ %s" + +#: src/symtab.c:139 +#, c-format +msgid "redefining precedence of %s" +msgstr "ÐÅÒÅÏÐÒÅÄÅÌÅÎÉÅ ÐÒÉÏÒÉÔÅÔÁ ÄÌÑ %s" + +#: src/symtab.c:157 +#, c-format +msgid "symbol %s redefined" +msgstr "ÐÏ×ÔÏÒÎÏÅ ÏÐÒÅÄÅÌÅÎÉÅ ÓÉÍ×ÏÌÁ %s" + +#: src/symtab.c:180 +#, c-format +msgid "redefining user token number of %s" +msgstr "ÐÅÒÅÏÐÒÅÄÅÌÅÎÉÅ ÎÏÍÅÒÁ ÌÅËÓÅÍÙ ÐÏÌØÚÏ×ÁÔÅÌÑ ÄÌÑ %s" + +#: src/symtab.c:207 +#, c-format +msgid "symbol %s is used, but is not defined as a token and has no rules" +msgstr "ÓÉÍ×ÏÌ %s ÉÓÐÏÌØÚÕÅÔÓÑ, ÎÏ ÎÅ ÏÐÒÅÄÅÌÅÎ ËÁË ÌÅËÓÅÍÁ É ÎÅ ÉÍÅÅÔ ÐÒÁ×ÉÌ" + +#: src/symtab.c:232 +#, c-format +msgid "symbol `%s' used more than once as a literal string" +msgstr "" + +#: src/symtab.c:235 +#, c-format +msgid "symbol `%s' given more than one literal string" +msgstr "" + +#: src/symtab.c:271 +#, c-format +msgid "conflicting precedences for %s and %s" +msgstr "ÐÒÏÔÉ×ÏÒÅÞÉ×ÙÅ ÐÒÉÏÒÉÔÅÔÙ ÄÌÑ %s É %s" + +#: src/symtab.c:283 +#, c-format +msgid "conflicting associativities for %s (%s) and %s (%s)" +msgstr "ÐÒÏÔÉ×ÏÒÅÞÉ×ÙÅ ÚÎÁÞÅÎÉÑ ÁÓÓÏÃÉÁÔÉ×ÎÏÓÔÉ ÄÌÑ %s (%s) É %s (%s)" + +#: src/symtab.c:368 +#, c-format +msgid "tokens %s and %s both assigned number %d" +msgstr "ÏÂÅÉÍ ÌÅËÓÅÍÁÍ %s É %s ÐÒÉÓ×ÏÅÎ ÎÏÍÅÒ %d" + +#: src/symtab.c:591 +#, c-format +msgid "the start symbol %s is undefined" +msgstr "ÎÁÞÁÌØÎÙÊ ÓÉÍ×ÏÌ %s ÎÅÏÐÒÅÄÅÌÅÎ" + +#: src/symtab.c:595 +#, c-format +msgid "the start symbol %s is a token" +msgstr "ÎÁÞÁÌØÎÙÊ ÓÉÍ×ÏÌ %s Ñ×ÌÑÅÔÓÑ ÌÅËÓÅÍÏÊ" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "ÎÅÄÏÐÕÓÔÉÍÙÊ ÁÒÇÕÍÅÎÔ %s ÄÌÑ %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "ÎÅÏÄÎÏÚÎÁÞÎÙÊ ÁÒÇÕÍÅÎÔ %s ÄÌÑ %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "äÏÐÕÓÔÉÍÙÅ ÁÒÇÕÍÅÎÔÙ:" + +#: lib/bitset_stats.c:179 +#, c-format +msgid "%u bitset_allocs, %u freed (%.2f%%).\n" +msgstr "" + +#: lib/bitset_stats.c:182 +#, c-format +msgid "%u bitset_sets, %u cached (%.2f%%)\n" +msgstr "" + +#: lib/bitset_stats.c:185 +#, c-format +msgid "%u bitset_resets, %u cached (%.2f%%)\n" +msgstr "" + +#: lib/bitset_stats.c:188 +#, c-format +msgid "%u bitset_tests, %u cached (%.2f%%)\n" +msgstr "" + +#: lib/bitset_stats.c:192 +#, c-format +msgid "%u bitset_lists\n" +msgstr "" + +#: lib/bitset_stats.c:194 +msgid "count log histogram\n" +msgstr "" + +#: lib/bitset_stats.c:197 +msgid "size log histogram\n" +msgstr "" + +#: lib/bitset_stats.c:200 +msgid "density histogram\n" +msgstr "" + +#: lib/bitset_stats.c:214 +#, c-format +msgid "" +"Bitset statistics:\n" +"\n" +msgstr "" + +#: lib/bitset_stats.c:217 +#, c-format +msgid "Accumulated runs = %u\n" +msgstr "" + +#: lib/bitset_stats.c:261 lib/bitset_stats.c:266 +msgid "Could not read stats file." +msgstr "îÅ ÕÄÁÅÔÓÑ ÐÒÏÞÉÔÁÔØ ÆÁÊÌ ÓÔÁÔÉÓÔÉËÉ." + +#: lib/bitset_stats.c:263 +#, c-format +msgid "Bad stats file size.\n" +msgstr "" + +#: lib/bitset_stats.c:289 lib/bitset_stats.c:291 +msgid "Could not write stats file." +msgstr "îÅ ÕÄÁÅÔÓÑ ÚÁÐÉÓÁÔØ × ÆÁÊÌ ÓÔÁÔÉÓÔÉËÉ." + +#: lib/bitset_stats.c:294 +msgid "Could not open stats file for writing." +msgstr "îÅ ÕÄÁÅÔÓÑ ÏÔËÒÙÔØ ÆÁÊÌ ÓÔÁÔÉÓÔÉËÉ ÄÌÑ ÚÁÐÉÓÉ." + +#: lib/error.c:127 +msgid "Unknown system error" +msgstr "îÅÉÚ×ÅÓÔÎÁÑ ÓÉÓÔÅÍÎÁÑ ÏÛÉÂËÁ" + +#: lib/getopt.c:570 lib/getopt.c:589 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: ÎÅÏÄÎÏÚÎÁÞÎÙÊ ËÌÀÞ `%s'\n" + +#: lib/getopt.c:622 lib/getopt.c:626 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: ËÌÀÞ `--%s' ÄÏÌÖÅÎ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÂÅÚ ÁÒÇÕÍÅÎÔÁ\n" + +#: lib/getopt.c:635 lib/getopt.c:640 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: ËÌÀÞ `%c%s' ÄÏÌÖÅÎ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÂÅÚ ÁÒÇÕÍÅÎÔÁ\n" + +#: lib/getopt.c:686 lib/getopt.c:708 lib/getopt.c:1039 lib/getopt.c:1061 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: ËÌÀÞ `%s' ÄÏÌÖÅÎ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ Ó ÁÒÇÕÍÅÎÔÏÍ\n" + +#: lib/getopt.c:746 lib/getopt.c:749 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: ÎÅÉÚ×ÅÓÔÎÙÊ ËÌÀÞ `--%s'\n" + +#: lib/getopt.c:757 lib/getopt.c:760 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: ÎÅÉÚ×ÅÓÔÎÙÊ ËÌÀÞ `%c%s'\n" + +#: lib/getopt.c:815 lib/getopt.c:818 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: ÎÅÄÏÐÕÓÔÉÍÙÊ ËÌÀÞ -- %c\n" + +#: lib/getopt.c:824 lib/getopt.c:827 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ÎÅ×ÅÒÎÙÊ ËÌÀÞ -- %c\n" + +#: lib/getopt.c:882 lib/getopt.c:901 lib/getopt.c:1114 lib/getopt.c:1135 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: ËÌÀÞ ÄÏÌÖÅÎ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ Ó ÁÒÇÕÍÅÎÔÏÍ -- %c\n" + +#: lib/getopt.c:954 lib/getopt.c:973 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: ÎÅÏÄÎÏÚÎÁÞÎÙÊ ËÌÀÞ `-W %s'\n" + +#: lib/getopt.c:997 lib/getopt.c:1018 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: ËÌÀÞ `-W %s' ÄÏÌÖÅÎ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ ÂÅÚ ÁÒÇÕÍÅÎÔÁ\n" + +#: lib/obstack.c:417 lib/obstack.c:420 lib/xmalloc.c:53 +msgid "memory exhausted" +msgstr "ÐÁÍÑÔØ ÉÓÞÅÒÐÁÎÁ" + +#: lib/quotearg.c:238 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:239 +msgid "'" +msgstr "'" + +#: lib/subpipe.c:171 +#, c-format +msgid "subsidiary program `%s' could not be invoked" +msgstr "ÎÅ ÕÄÁÅÔÓÑ ×ÙÐÏÌÎÉÔØ ×ÓÐÏÍÏÇÁÔÅÌØÎÕÀ ÐÒÏÇÒÁÍÍÕ `%s'" + +#: lib/subpipe.c:173 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "×ÓÐÏÍÏÇÁÔÅÌØÎÁÑ ÐÒÏÇÒÁÍÍÁ `%s' ÎÅ ÎÁÊÄÅÎÁ" + +#: lib/subpipe.c:175 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "×ÓÐÏÍÏÇÁÔÅÌØÎÁÑ ÐÒÏÇÒÁÍÍÁ `%s' ÚÁ×ÅÒÛÉÌÁÓØ ÎÅÕÄÁÞÎÏ" + +#: lib/subpipe.c:176 +#, c-format +msgid "subsidiary program `%s' failed (exit status %d)" +msgstr "" +"×ÓÐÏÍÏÇÁÔÅÌØÎÁÑ ÐÒÏÇÒÁÍÍÁ `%s' ÚÁ×ÅÒÛÉÌÁÓØ ÎÅÕÄÁÞÎÏ (ËÏÄ ÚÁ×ÅÒÛÅÎÉÑ %d)" + +#: lib/timevar.c:475 +msgid "" +"\n" +"Execution times (seconds)\n" +msgstr "" + +#: lib/timevar.c:525 +msgid " TOTAL :" +msgstr "" + +#: lib/timevar.c:561 +#, c-format +msgid "time in %s: %ld.%06ld (%ld%%)\n" +msgstr "" + +#~ msgid "too many states (max %d)" +#~ msgstr "ÓÌÉÛËÏÍ ÍÎÏÇÏ ÓÏÓÔÏÑÎÉÊ (ÍÁËÓÉÍÁÌØÎÏ %d)" + +#~ msgid "reduce" +#~ msgstr "×Ù×ÏÄ" + +#~ msgid "shift" +#~ msgstr "ÓÄ×ÉÇ" + +#~ msgid "%d shift/reduce conflict" +#~ msgid_plural "%d shift/reduce conflicts" +#~ msgstr[0] "%d ËÏÎÆÌÉËÔ ÓÄ×ÉÇÁ/×Ù×ÏÄÁ" +#~ msgstr[1] "%d ËÏÎÆÌÉËÔÁ ÓÄ×ÉÇÁ/×Ù×ÏÄÁ" +#~ msgstr[2] "%d ËÏÎÆÌÉËÔÏ× ÓÄ×ÉÇÁ/×Ù×ÏÄÁ" + +#~ msgid "and" +#~ msgstr "É" + +#~ msgid "State %d contains " +#~ msgstr "óÏÓÔÏÑÎÉÅ %d ÓÏÄÅÒÖÉÔ " + +#~ msgid "conflicts: " +#~ msgstr "ËÏÎÆÌÉËÔÙ: " + +#~ msgid "%s contains " +#~ msgstr "%s ÓÏÄÅÒÖÉÔ " + +#~ msgid "`%s' is no longer supported" +#~ msgstr "`%s' ÂÏÌØÛÅ ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔÓÑ" + +#~ msgid "%s: no grammar file given\n" +#~ msgstr "%s: ÎÅ ÚÁÄÁÎ ÆÁÊÌ Ó ÇÒÁÍÍÁÔÉËÏÊ\n" + +#~ msgid "%s: extra arguments ignored after `%s'\n" +#~ msgstr "%s: ÌÉÛÎÉÅ ÁÒÇÕÍÅÎÔÙ ÐÏÓÌÅ `%s' ÉÇÎÏÒÉÒÏ×ÁÎÙ\n" + +#~ msgid "too many gotos (max %d)" +#~ msgstr "ÓÌÉÛËÏÍ ÍÎÏÇÏ goto (ÍÁËÓÉÍÁÌØÎÏ %d)" + +#~ msgid "unexpected `/' found and ignored" +#~ msgstr "×ÓÔÒÅÞÅÎ É ÐÒÏÉÇÎÏÒÉÒÏ×ÁÎ ÎÅÏÖÉÄÁÎÎÙÊ ÓÉÍ×ÏÌ `/'" + +#~ msgid "unterminated comment" +#~ msgstr "ÎÅÚÁËÏÎÞÅÎÎÙÊ ËÏÍÍÅÎÔÁÒÉÊ" + +#~ msgid "unexpected end of file" +#~ msgstr "ÎÅÏÖÉÄÁÎÎÙÊ ËÏÎÅà ÆÁÊÌÁ" + +#~ msgid "unescaped newline in constant" +#~ msgstr "ÎÅÜËÒÁÎÉÒÏ×ÁÎÎÙÊ ÐÅÒÅ×ÏÄ ÓÔÒÏËÉ × ËÏÎÓÔÁÎÔÅ" + +#~ msgid "octal value outside range 0...255: `\\%o'" +#~ msgstr "×ÏÓØÍÅÒÉÞÎÁÑ ×ÅÌÉÞÉÎÁ ÚÁ ÐÒÅÄÅÌÁÍÉ ÄÉÁÐÁÚÏÎÁ 0...255: `\\%o'" + +#~ msgid "hexadecimal value above 255: `\\x%x'" +#~ msgstr "ÛÅÓÔÎÁÄÃÁÔÅÒÉÞÎÁÑ ×ÅÌÉÞÉÎÁ ÐÒÅ×ÙÛÁÅÔ 255: `\\x%x'" + +#~ msgid "unknown escape sequence: `\\' followed by `%s'" +#~ msgstr "ÎÅÉÚ×ÅÓÔÎÁÑ escape-ÐÏÓÌÅÄÏ×ÁÔÅÌØÎÏÓÔØ: `%s' ÐÏÓÌÅ `\\'" + +#~ msgid "unterminated type name at end of file" +#~ msgstr "ÎÅÚÁËÏÎÞÅÎÎÏÅ ÉÍÑ ÔÉÐÁ × ËÏÎÃÅ ÆÁÊÌÁ" + +#~ msgid "unterminated type name" +#~ msgstr "ÎÅÚÁËÏÎÞÅÎÎÏÅ ÉÍÑ ÔÉÐÁ" + +#~ msgid "use \"...\" for multi-character literal tokens" +#~ msgstr "ÉÓÐÏÌØÚÕÊÔÅ \"...\" ÄÌÑ ÍÎÏÇÏÓÉÍ×ÏÌØÎÙÈ ÌÉÔÅÒÁÌØÎÙÈ ÌÅËÓÅÍ" + +#~ msgid "`%s' supports no argument: %s" +#~ msgstr "`%s' ÎÅ ÐÏÄÄÅÒÖÉ×ÁÅÔ ÁÒÇÕÍÅÎÔÁ %s" + +#~ msgid "`%s' requires an argument" +#~ msgstr "ËÌÀÞ `%s' ÄÏÌÖÅÎ ÉÓÐÏÌØÚÏ×ÁÔØÓÑ Ó ÁÒÇÕÍÅÎÔÏÍ" + +#~ msgid " (rule %d)" +#~ msgstr " (ÐÒÁ×ÉÌÏ %d)" + +#~ msgid " %-4s\terror (nonassociative)\n" +#~ msgstr " %-4s\tÏÛÉÂËÁ (ÎÅÁÓÓÏÃÉÁÔÉ×ÎÁÑ)\n" + +#~ msgid "" +#~ " $default\treduce using rule %d (%s)\n" +#~ "\n" +#~ msgstr "" +#~ " $default\t×Ù×ÏÄ Ó ÉÓÐÏÌØÚÏ×ÁÎÉÅÍ ÐÒÁ×ÉÌÁ %d (%s)\n" +#~ "\n" + +#~ msgid " %-4s\t[reduce using rule %d (%s)]\n" +#~ msgstr " %-4s\t[×Ù×ÏÄ Ó ÉÓÐÏÌØÚÏ×ÁÎÉÅÍ ÐÒÁ×ÉÌÁ %d (%s)]\n" + +#~ msgid " %-4s\treduce using rule %d (%s)\n" +#~ msgstr " %-4s\t×Ù×ÏÄ Ó ÉÓÐÏÌØÚÏ×ÁÎÉÅÍ ÐÒÁ×ÉÌÁ %d (%s)\n" + +#~ msgid " $default\treduce using rule %d (%s)\n" +#~ msgstr " $default\t×Ù×ÏÄ Ó ÉÓÐÏÌØÚÏ×ÁÎÉÅÍ ÐÒÁ×ÉÌÁ %d (%s)\n" + +#~ msgid " $default\taccept\n" +#~ msgstr " $default\tÐÒÉÎÑÔÉÅ\n" + +#~ msgid " NO ACTIONS\n" +#~ msgstr " îåô äåêóô÷éê\n" + +#~ msgid "Number, Line, Rule" +#~ msgstr "îÏÍÅÒ, óÔÒÏËÁ, ðÒÁ×ÉÌÏ" + +#~ msgid " %3d %3d %s ->" +#~ msgstr " %3d %3d %s ->" + +#~ msgid " Skipping to next \\n" +#~ msgstr " ðÒÏÐÕÓË ÄÏ ÓÌÅÄÕÀÝÅÇÏ \\n" + +#~ msgid " Skipping to next %c" +#~ msgstr " ðÒÏÐÕÓË ÄÏ ÓÌÅÄÕÀÝÅÇÏ %c" + +#~ msgid "unterminated string" +#~ msgstr "ÎÅÚÁËÏÎÞÅÎÎÁÑ ÓÔÒÏËÁ" + +#~ msgid "%s is invalid" +#~ msgstr "ÎÅ×ÅÒÎÙÊ ÚÎÁË %s" + +#~ msgid "unterminated `%{' definition" +#~ msgstr "ÎÅÚÁËÏÎÞÅÎÎÏÅ ÏÐÒÅÄÅÌÅÎÉÅ `%{'" + +#~ msgid "Premature EOF after %s" +#~ msgstr "ðÒÅÖÄÅ×ÒÅÍÅÎÎÙÊ ËÏÎÅà ÆÁÊÌÁ ÐÏÓÌÅ %s" + +#~ msgid "`%s' is invalid in %s" +#~ msgstr "`%s' ÎÅ×ÅÒÎÏ × %s" + +#~ msgid "invalid %s declaration" +#~ msgstr "ÎÅ×ÅÒÎÏÅ ÏÐÉÓÁÎÉÅ %s" + +#~ msgid "%type declaration has no " +#~ msgstr "ÏÐÉÓÁÎÉÅ %type ÎÅ ÉÍÅÅÔ <ÉÍÑ_ÔÉÐÁ>" + +#~ msgid "invalid %%type declaration due to item: %s" +#~ msgstr "ÎÅ×ÅÒÎÏÅ ÏÐÉÓÁÎÉÅ %%type ÉÚ-ÚÁ ÜÌÅÍÅÎÔÁ: %s" + +#~ msgid "invalid text (%s) - number should be after identifier" +#~ msgstr "ÎÅ×ÅÒÎÙÊ ÔÅËÓÔ (%s) - ÞÉÓÌÏ ÄÏÌÖÎÏ ÓÌÅÄÏ×ÁÔØ ÚÁ ÉÄÅÎÔÉÆÉËÁÔÏÒÏÍ" + +#~ msgid "unexpected item: %s" +#~ msgstr "ÎÅÏÖÉÄÁÎÎÙÊ ÜÌÅÍÅÎÔ: %s" + +#~ msgid "unmatched %s" +#~ msgstr "ÎÅÐÁÒÎÁÑ %s" + +#~ msgid "argument of %%expect is not an integer" +#~ msgstr "ÁÒÇÕÍÅÎÔ %%expect ÎÅ Ñ×ÌÑÅÔÓÑ ÃÅÌÙÍ ÞÉÓÌÏÍ" + +#~ msgid "unrecognized item %s, expected an identifier" +#~ msgstr "ÎÅÒÁÓÐÏÚÎÁÎÎÙÊ ÜÌÅÍÅÎÔ %s, ÏÖÉÄÁÌÓÑ ÉÄÅÎÔÉÆÉËÁÔÏÒ" + +#~ msgid "expected string constant instead of %s" +#~ msgstr "×ÍÅÓÔÏ %s ÏÖÉÄÁÌÁÓØ ÓÔÒÏËÏ×ÁÑ ÐÏÓÔÏÑÎÎÁÑ" + +#~ msgid "no input grammar" +#~ msgstr "ÎÅÔ ×ÈÏÄÎÏÊ ÇÒÁÍÍÁÔÉËÉ" + +#~ msgid "ill-formed rule: initial symbol not followed by colon" +#~ msgstr "ÎÅ×ÅÒÎÏÅ ÐÒÁ×ÉÌÏ: Ä×ÏÅÔÏÞÉÅ ÎÅ ÓÌÅÄÕÅÔ ÚÁ ÎÁÞÁÌØÎÙÍ ÓÉÍ×ÏÌÏÍ" + +#~ msgid "grammar starts with vertical bar" +#~ msgstr "ÇÒÁÍÍÁÔÉËÁ ÎÁÞÉÎÁÅÔÓÑ Ó ×ÅÒÔÉËÁÌØÎÏÊ ÞÅÒÔÙ" + +#~ msgid "previous rule lacks an ending `;'" +#~ msgstr "× ÐÒÅÄÙÄÕÝÅÍ ÐÒÁ×ÉÌÅ ÏÔÓÕÔÓÔ×ÕÅÔ ÚÁ×ÅÒÛÁÀÝÁÑ `;'" + +#~ msgid "two @prec's in a row" +#~ msgstr "Ä×Á @prec ÐÏÄÒÑÄ" + +#~ msgid "%%guard present but %%semantic_parser not specified" +#~ msgstr "%%guard ÐÒÉÓÕÔÓÔ×ÕÅÔ, Á %%semantic_parser ÎÅ ÚÁÄÁÎ" + +#~ msgid "two actions at end of one rule" +#~ msgstr "Ä×Á ÄÅÊÓÔ×ÉÑ × ËÏÎÃÅ ÏÄÎÏÇÏ ÐÒÁ×ÉÌÁ" + +#~ msgid "too many symbols (tokens plus nonterminals); maximum %d" +#~ msgstr "ÓÌÉÛËÏÍ ÍÎÏÇÏ ÓÉÍ×ÏÌÏ× (ÌÅËÓÅÍÙ ÐÌÀÓ ÎÅÔÅÒÍÉÎÁÌÙ); ÍÁËÓÉÍÁÌØÎÏ %d" + +#~ msgid "maximum table size (%d) exceeded" +#~ msgstr "ÐÒÅ×ÙÛÅÎ ÍÁËÓÉÍÁÌØÎÙÊ ÒÁÚÍÅÒ ÔÁÂÌÉÃÙ (%d)" + +#~ msgid " $ \tgo to state %d\n" +#~ msgstr " $ \tÐÅÒÅÈÏÄ × ÓÏÓÔÏÑÎÉÅ %d\n" + +#~ msgid "unterminated %guard clause" +#~ msgstr "ÎÅÚÁËÏÎÞÅÎÎÙÊ ÏÐÅÒÁÔÏÒ %guard" + +#~ msgid " 1 shift/reduce conflict" +#~ msgstr " 1 ËÏÎÆÌÉËÔ ÓÄ×ÉÇÁ/×Ù×ÏÄÁ" + +#~ msgid "%s contains" +#~ msgstr "%s ÓÏÄÅÒÖÉÔ" + +#~ msgid "DERIVES" +#~ msgstr "DERIVES" + +#~ msgid "%s derives" +#~ msgstr "%s ×Ù×ÏÄÉÔ" + +#~ msgid "%s: internal error: %s\n" +#~ msgstr "%s: ×ÎÕÔÒÅÎÎÑÑ ÏÛÉÂËÁ: %s\n" + +#~ msgid "Entering set_nullable" +#~ msgstr "÷ÈÏÄ × set_nullable" + +#~ msgid "\t\t/* empty */" +#~ msgstr "\t\t/* ÐÕÓÔÏ */" + +#~ msgid "multiple %%header_extension declarations" +#~ msgstr "ÍÎÏÖÅÓÔ×ÅÎÎÙÅ ÏÐÉÓÁÎÉÑ %%header_extension" + +#~ msgid "multiple %%source_extension declarations" +#~ msgstr "ÍÎÏÖÅÓÔ×ÅÎÎÙÅ ÏÐÉÓÁÎÉÑ %%source_extension" + +#~ msgid "" +#~ "Variables\n" +#~ "---------\n" +#~ "\n" +#~ msgstr "" +#~ "ðÅÒÅÍÅÎÎÙÅ\n" +#~ "----------\n" +#~ "\n" + +#~ msgid "Value Sprec Sassoc Tag\n" +#~ msgstr "úÎÁÞ ðÒÉÏÒ áÓÓÏà ôÅÇ\n" + +#~ msgid "" +#~ "Rules\n" +#~ "-----\n" +#~ "\n" +#~ msgstr "" +#~ "ðÒÁ×ÉÌÁ\n" +#~ "-------\n" +#~ "\n" + +#~ msgid "" +#~ "Rules interpreted\n" +#~ "-----------------\n" +#~ "\n" +#~ msgstr "" +#~ "éÎÔÅÒÐÒÅÔÉÒÏ×ÁÎÎÙÅ ÐÒÁ×ÉÌÁ\n" +#~ "--------------------------\n" +#~ "\n" + +#~ msgid "" +#~ "reduced %s defines %d terminal%s, %d nonterminal%s, and %d production%s.\n" +#~ msgstr "" +#~ "×Ù×ÅÄÅÎÎÙÊ %s ÏÐÒÅÄÅÌÑÅÔ %d ÔÅÒÍÉÎÁÌÏ×%s, %d ÎÅÔÅÒÍÉÎÁÌÏ×%s, É %d ÐÒÁ×ÉÌ " +#~ "×Ù×ÏÄÁ%s.\n" + +#~ msgid "@%s is invalid" +#~ msgstr "ÎÅ×ÅÒÎÙÊ ÚÎÁË @%s" diff --git a/src/apps/bin/bison/po/stamp-po b/src/apps/bin/bison/po/stamp-po new file mode 100644 index 0000000000..9788f70238 --- /dev/null +++ b/src/apps/bin/bison/po/stamp-po @@ -0,0 +1 @@ +timestamp diff --git a/src/apps/bin/bison/po/sv.gmo b/src/apps/bin/bison/po/sv.gmo new file mode 100644 index 0000000000000000000000000000000000000000..9bcc62a62fa2a149f350d25dd9566563d844eadc GIT binary patch literal 14296 zcmbW7TWlm*dB@Mf!jcZKu)ADB2%I%zW(KCco>_Kx@XRdhneohc*K@)4>;enHMTE^Z3Vg;1`YgW$+;Q zAUFpe2R{HF1HS>j9Q+yh9Pp*jH|7_>SAsS0wczdGVer-9ENH<1)DrIlr@#-F`1SJr z4?(S4djWHRuLWNQo(F#k3`=|xJjDGc!CwKt1x|vS<@4GLjj4100BFGw)O^1Iik>f& z_-#<*{u6u=cqc^bejoT6@L_Ntn1Hu{9|d0uehhpG_<8Uy@SET?_&reTJdep<0p0^@ zKM#XPz!rEL_(@Rw`V9EH;Gcr81CPC!cVG*=ss-;r2EesDjrnu#{}2>C%Ph`EvjJ+J zkANNCe;kxNpAFOYgBJWacn%a@{|<`Y+Yp}UdL^j)qads^=ga%Y!D;S$pvd?P_+0R_ zpyvM^sBwP>LaO;^kfqI!z0%5uNYmlYQKa}@B1o<;R<)7%fi$#U61GWA`{1e@8 z2VuQQ%I8ml;_L5&uLu7O)I2``HUBm!eY>5_Xg_uS@yI+3PJk_tEtn62Zva0FN{_w| zN*@0UYQB9;qIKQ`N{^R7*~L?!1wU9m{~Rbjeh(Bsw!yo>*Ya={JO^r?4}nwQr$F)l z+aQ1D7L?tB7S#PLcmP}hrEebuMekQY3w{R_zkdv3ism*RN?-2+oqdDvy@mBbNHKqW zxAzZ!1HOs-XTgNy;7L&YdJ>d8KLKK5=2M{N{X%*Fbx`{J_n`FTN1)cZ3#Q!D?F0`)`2a<4-`1dj*TZ7IP9r#O5?8dIC^-_a0F4`6wuPe-jj4KL%m7 zc>$B$2i8IDzX9F`cEL}8eNf|G$fAD$9s?s5{5~i>J&7>C#(e@dxZh7_?c>9s?BtKY zCwc!RP;?!E7}0+L)O=S#UYWbttn6tP6kTryrLXS-wg2A+Wv`zG88- z`}zr}ez(&}`neC3o*e~c7mFaQGrtLnjxT_BgWmg$IB1^L_$Uzt4l(?>Ecm{{j-?%uhh+ z+0Q_Ye+fn=``Hg_UyGpPLJW$(?+2x)p9U@XS0Jip{teXpx59*3@YNtHU;1d4xu30?&M36vfj#F!x6oCHsReNg?r zT;e~1;?IA9(x(?a;O*@=sQtA-&GQtf{e2P?fByoMo_-6I{J#U<0%~nt(uJe$la~wP zao3wl6li{3r#u*@aM$q?#TQ*6O>2s8PtgLJuE%H((w1p&r#(v3HAjPO?s_5rrQec) zuD8-2rr|cmt|!X7bD-oa-b?;3p`p@_cYt}1{&BsNCOv+yZn#<=%&(Vt8GIK_I$K@O zzN3+ON_2v^K4}uJPek+Fi71+B;~{59!V-O_%ghy7e~N8ZDCIX9$(Xl*(qmokrZs6-XfLJRNqZS>o%T3QcJ`|@U9yob?Go)6?OC+ydT#mQ zIiPIe0&SywCaBSt%KI09G3_DRd75-q*ORonX|l~TH0iXvYIE1ZM!$&C#1>IE%r|Sw;;2#B)v&l4hKbGkacC!-Hb|PbNIN{4%xxCtX}litH0Om4vnUs2A6YG&U) zo3`xAWWL|7v8g1r&9D&%Q0ICQNSin4&eldK1E z1edORQ$AUlY>2(hG|ZFzg$+c2v?s{g{ce~PewsmNx+0sPyBf9oX&(`3kKf(ylL{v-g{EG8*z4oTm2-%?%GN8Ze%dnl^EnVy6bzlAKv%vYETX{)%3Y1%VsKWRD@J!I#T2D6+>`*9OPD&Q%uYGfJd@YM`GPuf!> z-Li0un$cJ44S54fr_9+4m*ISl7iot{n6a_EvMmfMvkS8eiw6!LwCybDcCk4KI_p20 z`Fk#wZgRe50~@DFyApf8mR=oGVtLgr{x&GmY~zqE*4Rl@$QlMuYg&#MRyKg$VLq05 zGVR+LW)SD;l(kDyH^PhI2QFAOqs zv8PQdc68Hbh=i=IuN^|I*TT5xeQz_$dvUPAFvxX}6*$6cQK8O{sxxje*BsWS{i4?| zZ1o^YAhPQh7##%<>h+DF(eO)zUZ?D(i%auwv3g!J7u`&bpr(4`jH3kUj9uc1?PaMv zGBQ|0^mu3~p=irAE(?1w@x=1E`3q;4s=;I9nqd({v7D>pf6y;dNKO+?v0iR(HO<3n zu*W>;vSe;o21`hR zo|7le%rDFh7mmXKr(QC-NUh##L|Y@!(capyum3c*)4)D@>MUU}Z)A~IDk7wGZn$UT zWdK>LQ8O; zBs@y;B6Cs1E$RcF(|Omujny-Ou6iApS(50Vxc^}itm2G@?;2?r-E1I=j3^C?}BHe51RX#!gbPn&&cp=!VHCb6MczEdN`f$2TV5pJAsV{nw&Mx5sT zOiHy9r)ejUFK{!2*LtMCQGv${@;q%s+RC7dV}x7Kk>_&Ya^ccYAkQVG_xQw*-THhw zx5}8k8muEp3cghVl2+eFq8*CC)(3ooCoc2hUCsZ ze(}=s{KX6Jn3|gM&d^-GKK0HA50zl&=24f`4kD)bI%6IqHz?Q<+4Evb&RlSC$~ZES z*5V2l;eU`dErt-s#B3;AF~q5`SC~OUI|#y}OdKV{_Q}Noq4mI?{{$9HaM&U+RBtFol0PY8yZA9Vz85Gxf=G;VLJ(mR|A1;P7l$s4oWH7dcOY62N)blPOm$GW2e&yJ+CFE#E1z5gpm%HCuKErKV9aP}U+1oQ#`OlhgNekUqdistGmYG)JOna<$3<_)X@j-tNDz#em-wU&H735-uiM%kDYmM?b5~N z`YEY5funvJEuXPRrl;RfpT4ht)~65iXOG-F zGkx#trw`L_A;^pRGG0EXT9V?Z&u(*LFE=^8kZ9ZE?Np)Tp?>*bs@I#!!v`6cwEJW? z_2n?=&e$aidJ&H0c)tEn9Jv&|c7Fc++;F#tr>1MC6a*92BP7n)g4lEqNA@T=W)&&O zluwX))Q=v$?~V1t!_FeE6=wChq>(mZ>x?~05vq16?xVT&GaTH}oTTS&^AksoS^x3G zfke*i@WEp>quO(a!#<;_@aXJK@wp=%%*yKXBhFcM3jAUm!+?w+7|VmEB(#WJWkM-o zyiM3qN==SO&eaNIqty5r4ENbe7Ch7Od1qLGUKS0bmnzN>PO+J?sa@aXkV+ITZ`Za7 z@V*eO9d0TCbam*~c4j9g^9lTl!Xk$|98X8J=!{wwR^y7%H_;1!KoKcx8m9N0tahuo z*QBsUxzD|d75!YLI+Jr5zDt7yvYV@-q|s4q9+antuY$36Aq8XvHXP`d9)A{y9u_so zvbTjwbXb6-0W(m+x~?N`7P!~lEtqCo+wm1qw(jIz7OV-Ts+8yTwCfpEIuZCsuy*BQ zF@8&ldMggv?SS*cpkAG}BeI9~@J&_7_FWTXKsk1THM|t?Vq=BsVK+JX9T*!zS6N5j_Rsr+}%vt zP32P^XW{_`HCLC8&_X0|U1{3&S5+X*#->1CSzc_)0WfY*T&7qzm}9KJn^DKVx}$QntSq#hZ5KR{y)Rmy-ipx`r8%ljcgSo-cN}&&+fll9G~|QV>?GqD`5R&hchG-goS+8?*EMjxshI&RiK= zsD;Whwn~JQYS?XI0#RpgH+Rwui&7Fr)6af4B-nSG)L}8x z;2j0+0marLq;}ccMylYb``*>;(JjIks@e6`a9~9WCd18EmF(?o^$JB%DWgKJizwVh z<>67rkeKB(?(AO49uVvH=}Xv!c1BGKUO^FwfDestn9Z8mVa~RIB+S z3#X!PaM7n_yVkWwI_4V`50VapNLAdN`DRgw{aQ(h-AKBP^O<$o(;%I~kCnO3GJW%6 zi?~WSFy0#RM$Doh7&tE_pA@*-I5aYp+PG7k4#{woB;nc?VNt3#q3{q+RGcgI+R@|I zaP~XlO4VUec4KnY#@+Tin^}^sUO^&d_{6`-P2#U`bYxq8fkvoD{IYBHL(m z@afV>!opU8gKsE@bNul0IwD<#yrQxqlI&gVqdO+(66l~T7iK}HJOMZzo4{JC!R$0j zDjCa)(sfQG#TI&^usLwDT2{sK;kaOZUZelESIS)VwGh&RrQ9MkG#7<>^KcK z0|hi9P*u)Q^g2Xk#CAwwI($#+trp%<=3?9VI(k58Ba|_`My-i&#`(H&?t+CSRLrA8 zo*F8f&fb@vUU>NA?Bcn(WsX3Yf?as}{H2BYvwCpmyNh;idAYW9Y3|hg+`_`Lefq-b z+4Fz9fFhpR&hQgXsvIXUIF-&P+?2$PDxos_H5ymWN&@^K+V^F(8Dh9-a-2rM9!j4r98}`;jX9*sMX4 zrM;X=d;7XdJE_vhGrs$#G}M)c!<~vN98Wo*jx5s98Y^7qw&Gibi9VK@s(rvy$M4tM#1`1Sl-|`wG@l>9 zBgtd{vSXmUNxQK7>g((!H03#RcSRh$EJC)MxG4tDs)#uH)PLvC_wcHeBr3*@uIW~E z&p3uBAqGndYVx3yP;_@SgLQs^g`y3gH|@j|6XY+B17*D(1EQelhVgCRuhjkY;+=+y@Bkmi{&A6r!5lvv%*)EJx{B&$(1S;$-Uz-qnd39JgAjUJt)f|)t98& zXpT0r%5l46TrsYy%R7Z~^*Lt*Iui%^E?x9(PE108<=*Hu6+bjqxl37+zkWf!E07P+ z4@ioztcCkcmf=}3IT7Ps%=Vh&xU6lA2*dfEvW8Y^=Gc6dR%!6?h1<1;wYCtf^lOt} zxbjtR+JWwMUk1pCAUlSX)Qya2>tyVR+I93!8SYS}>txJ(vI*IVBbW**cD6^ozSKw0 zw=zO$Ppex^0-rWk+Kw;TS32oTiG^L+&^zn0Xs>UjTydXoEXrz|<9TU&zATjM_e$fw bYorc18Wg, 2001, 2002, 2003. +# $Revision: 1.1 $ +# +msgid "" +msgstr "" +"Project-Id-Version: bison 1.875\n" +"Report-Msgid-Bugs-To: bug-bison@gnu.org\n" +"POT-Creation-Date: 2004-05-21 10:26-0700\n" +"PO-Revision-Date: 2003-01-01 23:03+0100\n" +"Last-Translator: Göran Uddeborg \n" +"Language-Team: Swedish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=iso-8859-1\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=2; plural=(n != 1);\n" + +#: src/complain.c:51 src/complain.c:66 +msgid "warning: " +msgstr "varning: " + +#: src/complain.c:122 src/complain.c:138 +msgid "fatal error: " +msgstr "ödesdigert fel: " + +#: src/conflicts.c:76 +#, c-format +msgid " Conflict between rule %d and token %s resolved as shift" +msgstr " Konflikt mellan regel %d och element %s löstes som skift" + +#: src/conflicts.c:84 +#, c-format +msgid " Conflict between rule %d and token %s resolved as reduce" +msgstr " Konflikt mellan regel %d och element %s löstes som reducera" + +#: src/conflicts.c:91 +#, c-format +msgid " Conflict between rule %d and token %s resolved as an error" +msgstr " Konflikt mellan regel %d och element %s löstes som ett fel" + +#: src/conflicts.c:399 +#, c-format +msgid "conflicts: %d shift/reduce, %d reduce/reduce\n" +msgstr "konflikter: %d skifta/reducera, %d reducera/reducera\n" + +#: src/conflicts.c:402 +#, c-format +msgid "conflicts: %d shift/reduce\n" +msgstr "konflikter: %d skifta/reducera\n" + +#: src/conflicts.c:404 +#, c-format +msgid "conflicts: %d reduce/reduce\n" +msgstr "konflikter: %d reducera/reducera\n" + +#: src/conflicts.c:422 +#, c-format +msgid "State %d " +msgstr "Tillstånd %d " + +#: src/conflicts.c:487 +#, fuzzy, c-format +msgid "%%expect-rr applies only to GLR parsers" +msgstr "%s påverkar endast GLR-parsrar" + +#: src/conflicts.c:511 +#, c-format +msgid "expected %d shift/reduce conflict" +msgid_plural "expected %d shift/reduce conflicts" +msgstr[0] "förväntade %d skifta/reducerakonflikt" +msgstr[1] "förväntade %d skifta/reducerakonflikter" + +#: src/conflicts.c:515 +#, fuzzy, c-format +msgid "expected %d reduce/reduce conflict" +msgid_plural "expected %d reduce/reduce conflicts" +msgstr[0] "förväntade 0 reducera/reducerakonflikter" +msgstr[1] "förväntade 0 reducera/reducerakonflikter" + +#: src/files.c:100 +#, c-format +msgid "cannot open file `%s'" +msgstr "kan inte öppna filen \"%s\"" + +#: src/files.c:116 +msgid "I/O error" +msgstr "I/O-fel" + +#: src/files.c:119 +msgid "cannot close file" +msgstr "kan inte stänga fil" + +#: src/files.c:337 +#, c-format +msgid "conflicting outputs to file %s" +msgstr "motstridiga utmatningar till filen %s" + +#: src/getargs.c:186 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "Försök med \"%s --help\" för mer information.\n" + +#: src/getargs.c:192 +msgid "GNU bison generates parsers for LALR(1) grammars.\n" +msgstr "GNU bison genererar parsrar för LALR(1)-grammatiker.\n" + +#: src/getargs.c:196 +#, c-format +msgid "Usage: %s [OPTION]... FILE\n" +msgstr "Användning: %s [FLAGGA]... FIL\n" + +#: src/getargs.c:200 +msgid "" +"If a long option shows an argument as mandatory, then it is mandatory\n" +"for the equivalent short option also. Similarly for optional arguments.\n" +msgstr "" +"Om en lång flagga visar ett argument som obligatoriskt är det\n" +"obligatoriskt för den motsvarande korta flaggan också. Motsvarande\n" +"för valfria argument.\n" + +#: src/getargs.c:206 +msgid "" +"Operation modes:\n" +" -h, --help display this help and exit\n" +" -V, --version output version information and exit\n" +" -y, --yacc emulate POSIX yacc\n" +msgstr "" +"Arbetslägen:\n" +" -h, --help visa denna hjälptext och avsluta\n" +" -V, --version visa versionsinformation och avsluta\n" +" -y, --yacc emulera POSIX-yacc\n" + +#: src/getargs.c:213 +msgid "" +"Parser:\n" +" -S, --skeleton=FILE specify the skeleton to use\n" +" -t, --debug instrument the parser for debugging\n" +" --locations enable locations computation\n" +" -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n" +" -l, --no-lines don't generate `#line' directives\n" +" -n, --no-parser generate the tables only\n" +" -k, --token-table include a table of token names\n" +msgstr "" +"Tolk:\n" +" -S, --skeleton=FIL ange skelettfilen som skall användas\n" +" -t, --debug instrumentera tolken för felsökning\n" +" --locations aktivera lägesberäkning\n" +" -p, --name-prefix=PREFIX lägg till PREFIX före externa symboler\n" +" -l, --no-lines generera inte \"#line\"-direktiv\n" +" -n, --no-parser generera endast tabellerna\n" +" -k, --token-table inkludera en tabell över elementnamn\n" + +#: src/getargs.c:225 +msgid "" +"Output:\n" +" -d, --defines also produce a header file\n" +" -r, --report=THINGS also produce details on the automaton\n" +" -v, --verbose same as `--report=state'\n" +" -b, --file-prefix=PREFIX specify a PREFIX for output files\n" +" -o, --output=FILE leave output to FILE\n" +" -g, --graph also produce a VCG description of the " +"automaton\n" +msgstr "" +"Utdata:\n" +" -d, --defines skapa också en huvudfil\n" +" -r, --report=SAKER skapa också detaljer om automaten\n" +" -v, --verbose samma som \"--report=state\"\n" +" -b, --file-prefix=PREFIX ange ett PREFIX för utdatafiler\n" +" -o, --output=FIL lägg utdata i FIL\n" +" -g, --graph skapa också en VCG-beskrivning av automaten\n" + +#: src/getargs.c:236 +msgid "" +"THINGS is a list of comma separated words that can include:\n" +" `state' describe the states\n" +" `itemset' complete the core item sets with their closure\n" +" `lookahead' explicitly associate lookaheads to items\n" +" `solved' describe shift/reduce conflicts solving\n" +" `all' include all the above information\n" +" `none' disable the report\n" +msgstr "" +"SAKER är en lista med kommaseparerade ord som kan innehålla:\n" +" \"state\" beskriv tillstånden\n" +" \"itemset\" komplettera kärnobjektmängderna med sina höljen\n" +" \"lookahead\" koppla uttryckligen framåtblickar till objekt\n" +" \"solved\" beskriv lösningar av skifta/reducerakonflikter\n" +" \"all\" inkludera all ovanstående information\n" +" \"none\" avaktivera rapporten\n" + +#: src/getargs.c:247 +msgid "Report bugs to .\n" +msgstr "" +"Rapportera fel till .\n" +"Rapportera synpunkter på översättningen till .\n" + +#: src/getargs.c:264 +#, c-format +msgid "bison (GNU Bison) %s" +msgstr "bison (GNU Bison) %s" + +#: src/getargs.c:266 +msgid "Written by Robert Corbett and Richard Stallman.\n" +msgstr "Skriven av Robert Corbett och Richard Stallman.\n" + +#: src/getargs.c:270 +#, c-format +msgid "Copyright (C) %d Free Software Foundation, Inc.\n" +msgstr "Copyright © %d Free Software Foundation, Inc.\n" + +#: src/getargs.c:272 +msgid "" +"This is free software; see the source for copying conditions. There is NO\n" +"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +msgstr "" +"Detta är fri programvara, se källkoden för kopieringsvillkor. Det\n" +"finns INGEN garanti, inte ens för SÄLJBARHET eller LÄMPLIGHET FÖR ETT\n" +"SPECIELLT ÄNDAMÅL.\n" + +#: src/getargs.c:438 +#, c-format +msgid "missing operand after `%s'" +msgstr "saknad operand efter \"%s\"" + +#: src/getargs.c:440 +#, c-format +msgid "extra operand `%s'" +msgstr "extra operand \"%s\"" + +#: src/gram.c:139 +msgid "empty" +msgstr "tom" + +#: src/gram.c:233 +msgid "Grammar" +msgstr "Grammatik" + +#: src/gram.c:321 src/reduce.c:394 +msgid "warning" +msgstr "varning" + +#: src/main.c:124 +msgid "rule never reduced because of conflicts" +msgstr "regel aldrig reducerad på grund av konflikter" + +#: src/parse-gram.y:363 +msgid "POSIX forbids declarations in the grammar" +msgstr "POSIX förbjuder deklarationer i grammatiken" + +#: src/parse-gram.y:486 +msgid "missing identifier in parameter declaration" +msgstr "identiferare saknas i parameterdeklaration" + +#: src/print.c:49 +#, c-format +msgid " type %d is %s\n" +msgstr " typ %d är %s\n" + +#: src/print.c:165 +#, c-format +msgid "shift, and go to state %d\n" +msgstr "skifta, och gå till tillstånd %d\n" + +#: src/print.c:167 +#, c-format +msgid "go to state %d\n" +msgstr "gå till tillstånd %d\n" + +#: src/print.c:204 +msgid "error (nonassociative)\n" +msgstr "fel (ickeassociativ)\n" + +#: src/print.c:292 +#, c-format +msgid "reduce using rule %d (%s)" +msgstr "reducera med regel %d (%s)" + +#: src/print.c:294 +#, c-format +msgid "accept" +msgstr "acceptera" + +#: src/print.c:325 src/print.c:391 +msgid "$default" +msgstr "$standard" + +#: src/print.c:420 +#, c-format +msgid "state %d" +msgstr "tillstånd %d" + +#: src/print.c:456 +msgid "Terminals, with rules where they appear" +msgstr "Terminaler, med regler där de förekommer" + +#: src/print.c:483 +msgid "Nonterminals, with rules where they appear" +msgstr "Icketerminaler, med regler där de förekommer" + +#: src/print.c:512 +#, c-format +msgid " on left:" +msgstr " till vänster:" + +#: src/print.c:527 +#, c-format +msgid " on right:" +msgstr " till höger:" + +#: src/print.c:555 +msgid "Rules never reduced" +msgstr "Aldrig reducerade regler" + +#: src/reader.c:56 +#, c-format +msgid "multiple %s declarations" +msgstr "flera %s-deklarationer" + +#: src/reader.c:118 +#, c-format +msgid "result type clash on merge function %s: <%s> != <%s>" +msgstr "resultattypskonflikt vid sammanslagningsfunktion %s: <%s> != <%s>" + +#: src/reader.c:216 +#, c-format +msgid "rule given for %s, which is a token" +msgstr "regel given för %s, som är ett element" + +#: src/reader.c:245 +#, c-format +msgid "type clash on default action: <%s> != <%s>" +msgstr "typkonflikt för standardåtgärd: <%s> <%s>" + +#: src/reader.c:251 +msgid "empty rule for typed nonterminal, and no action" +msgstr "tom regel för typad icketerminal, och ingen åtgärd" + +#: src/reader.c:321 src/reader.c:335 src/reader.c:348 +#, c-format +msgid "only one %s allowed per rule" +msgstr "endast en %s tillåts per regel" + +#: src/reader.c:331 src/reader.c:346 +#, c-format +msgid "%s affects only GLR parsers" +msgstr "%s påverkar endast GLR-parsrar" + +#: src/reader.c:333 +#, c-format +msgid "%s must be followed by positive number" +msgstr "%s måste följas av ett positivt tal" + +#: src/reader.c:490 +msgid "no rules in the input grammar" +msgstr "inga regler i ingrammatiken" + +#: src/reduce.c:242 +msgid "useless rule" +msgstr "oanvändbar regel" + +#: src/reduce.c:303 +#, c-format +msgid "useless nonterminal: %s" +msgstr "oanvändbar icketerminal: %s" + +#: src/reduce.c:351 +msgid "Useless nonterminals" +msgstr "Oanvändbara icketerminaler" + +#: src/reduce.c:364 +msgid "Terminals which are not used" +msgstr "Terminaler som inte används" + +#: src/reduce.c:373 +msgid "Useless rules" +msgstr "Oanvändbara regler" + +#: src/reduce.c:389 +#, c-format +msgid "%d rule never reduced\n" +msgid_plural "%d rules never reduced\n" +msgstr[0] "%d regel reduceras aldrig\n" +msgstr[1] "%d regler reduceras aldrig\n" + +#: src/reduce.c:397 +#, c-format +msgid "%d useless nonterminal" +msgid_plural "%d useless nonterminals" +msgstr[0] "%d oanvändbar icketerminal" +msgstr[1] "%d oanvändbara icketerminaler" + +#: src/reduce.c:403 +#, c-format +msgid " and " +msgstr " och " + +#: src/reduce.c:406 +#, c-format +msgid "%d useless rule" +msgid_plural "%d useless rules" +msgstr[0] "%d oanvändbar regel" +msgstr[1] "%d oanvändbara regler" + +#: src/reduce.c:436 +#, c-format +msgid "start symbol %s does not derive any sentence" +msgstr "startsymbolen %s genererar inga meningar" + +#: src/scan-gram.l:162 +msgid "stray `,' treated as white space" +msgstr "vilsekommet \",\" hanterat som blank" + +#: src/scan-gram.l:225 +#, c-format +msgid "invalid directive: %s" +msgstr "ogiltigt direktiv: %s" + +#: src/scan-gram.l:283 +#, c-format +msgid "invalid character: %s" +msgstr "ogiltigt tecken: %s" + +#: src/scan-gram.l:402 +#, fuzzy +msgid "invalid null character" +msgstr "ogiltigt tecken: %s" + +#: src/scan-gram.l:415 src/scan-gram.l:427 src/scan-gram.l:448 +#, c-format +msgid "invalid escape sequence: %s" +msgstr "ogiltig specialsekvens: %s" + +#: src/scan-gram.l:417 src/scan-gram.l:429 src/scan-gram.l:450 +#, fuzzy, c-format +msgid "invalid null character: %s" +msgstr "ogiltigt tecken: %s" + +#: src/scan-gram.l:455 +#, c-format +msgid "unrecognized escape sequence: %s" +msgstr "okänd specialsekvens: %s" + +#: src/scan-gram.l:537 +#, c-format +msgid "missing `{' in `%s'" +msgstr "saknad \"{\" i \"%s\"" + +#: src/scan-gram.l:782 +#, c-format +msgid "$$ of `%s' has no declared type" +msgstr "$$ för \"%s\" har ingen deklarerad typ" + +#: src/scan-gram.l:803 +#, c-format +msgid "$%d of `%s' has no declared type" +msgstr "$%d för \"%s\" har ingen deklarerad typ" + +#: src/scan-gram.l:812 src/scan-gram.l:881 src/scan-gram.l:932 +#, c-format +msgid "integer out of range: %s" +msgstr "heltal utanför intervall: %s" + +#: src/scan-gram.l:848 src/scan-gram.l:916 +#, c-format +msgid "invalid value: %s" +msgstr "felaktigt värde: %s" + +#: src/scan-gram.l:1036 +#, c-format +msgid "missing `%s' at end of file" +msgstr "saknat \"%s\" vid filslut" + +#: src/scan-gram.l:1047 +#, fuzzy, c-format +msgid "missing `%s' at end of line" +msgstr "saknat \"%s\" vid filslut" + +#: src/symlist.c:97 src/symlist.c:108 +msgid "invalid $ value" +msgstr "felaktigt $-värde" + +#: src/symtab.c:85 +#, c-format +msgid "type redeclaration for %s" +msgstr "typen omdeklarerad för %s" + +#: src/symtab.c:102 src/symtab.c:120 +#, c-format +msgid "%s redeclaration for %s" +msgstr "%s-omdeklaration för %s" + +#: src/symtab.c:139 +#, c-format +msgid "redefining precedence of %s" +msgstr "omdefinition av precedens för %s" + +#: src/symtab.c:157 +#, c-format +msgid "symbol %s redefined" +msgstr "symbolen %s omdefinierad" + +#: src/symtab.c:180 +#, c-format +msgid "redefining user token number of %s" +msgstr "omdefinition av elementnummer för %s" + +#: src/symtab.c:207 +#, c-format +msgid "symbol %s is used, but is not defined as a token and has no rules" +msgstr "" +"symbolen %s används, men är inte definierad som ett element och har inga " +"regler" + +#: src/symtab.c:232 +#, c-format +msgid "symbol `%s' used more than once as a literal string" +msgstr "symbolen \"%s\" används mer än en gång som en bokstavlig sträng" + +#: src/symtab.c:235 +#, c-format +msgid "symbol `%s' given more than one literal string" +msgstr "symbolen \"%s\" har fått mer än en bokstavlig sträng" + +#: src/symtab.c:271 +#, c-format +msgid "conflicting precedences for %s and %s" +msgstr "motstridiga precedenser mellan %s och %s" + +#: src/symtab.c:283 +#, c-format +msgid "conflicting associativities for %s (%s) and %s (%s)" +msgstr "motstridiga associativiteter för %s (%s) och %s (%s)" + +#: src/symtab.c:368 +#, c-format +msgid "tokens %s and %s both assigned number %d" +msgstr "elementen %s och %s har båda fått nummer %d" + +#: src/symtab.c:591 +#, c-format +msgid "the start symbol %s is undefined" +msgstr "startsymbolen %s är odefinierad" + +#: src/symtab.c:595 +#, c-format +msgid "the start symbol %s is a token" +msgstr "startsymbolen %s är ett element" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "ogiltigt argument %s till %s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "tvetydigt argument %s till %s" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Giltiga argument är:" + +#: lib/bitset_stats.c:179 +#, c-format +msgid "%u bitset_allocs, %u freed (%.2f%%).\n" +msgstr "%u bitmängdallokeringar, %u frianden (%.2f%%).\n" + +#: lib/bitset_stats.c:182 +#, c-format +msgid "%u bitset_sets, %u cached (%.2f%%)\n" +msgstr "%u bitmängdmängder, %u cachade (%.2f%%)\n" + +#: lib/bitset_stats.c:185 +#, c-format +msgid "%u bitset_resets, %u cached (%.2f%%)\n" +msgstr "%u bitmängdåterställanden, %u cachade (%.2f%%)\n" + +#: lib/bitset_stats.c:188 +#, c-format +msgid "%u bitset_tests, %u cached (%.2f%%)\n" +msgstr "%u bitmängdtester, %u cachade (%.2f%%)\n" + +#: lib/bitset_stats.c:192 +#, c-format +msgid "%u bitset_lists\n" +msgstr "%u bitmängdlistor\n" + +#: lib/bitset_stats.c:194 +msgid "count log histogram\n" +msgstr "anropslogghistogram\n" + +#: lib/bitset_stats.c:197 +msgid "size log histogram\n" +msgstr "storlekslogghistogram\n" + +#: lib/bitset_stats.c:200 +msgid "density histogram\n" +msgstr "densitetshistogram\n" + +#: lib/bitset_stats.c:214 +#, c-format +msgid "" +"Bitset statistics:\n" +"\n" +msgstr "" +"Bitmängdsstatistik:\n" +"\n" + +#: lib/bitset_stats.c:217 +#, c-format +msgid "Accumulated runs = %u\n" +msgstr "Ackumulerade körningar = %u\n" + +#: lib/bitset_stats.c:261 lib/bitset_stats.c:266 +msgid "Could not read stats file." +msgstr "Kunde inte läsa statistikfil." + +#: lib/bitset_stats.c:263 +#, c-format +msgid "Bad stats file size.\n" +msgstr "Dålig statistikfilstorlek.\n" + +#: lib/bitset_stats.c:289 lib/bitset_stats.c:291 +msgid "Could not write stats file." +msgstr "Kunde inte skriva statistikfil." + +#: lib/bitset_stats.c:294 +msgid "Could not open stats file for writing." +msgstr "Kunde inte öppna statistikfil för skrivning." + +#: lib/error.c:127 +msgid "Unknown system error" +msgstr "Okänt systemfel" + +#: lib/getopt.c:570 lib/getopt.c:589 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: flaggan \"%s\" är tvetydig\n" + +#: lib/getopt.c:622 lib/getopt.c:626 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: flaggan \"--%s\" tar inget argument\n" + +#: lib/getopt.c:635 lib/getopt.c:640 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: flaggan \"%c%s\" tar inget argument\n" + +#: lib/getopt.c:686 lib/getopt.c:708 lib/getopt.c:1039 lib/getopt.c:1061 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: flaggan \"%s\" behöver ett argument\n" + +#: lib/getopt.c:746 lib/getopt.c:749 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: okänd flagga \"--%s\"\n" + +#: lib/getopt.c:757 lib/getopt.c:760 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: okänd flagga \"%c%s\"\n" + +#: lib/getopt.c:815 lib/getopt.c:818 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: otillåten flagga -- %c\n" + +#: lib/getopt.c:824 lib/getopt.c:827 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: ogiltig flagga --%c\n" + +#: lib/getopt.c:882 lib/getopt.c:901 lib/getopt.c:1114 lib/getopt.c:1135 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: flaggan behöver ett argument -- %c\n" + +#: lib/getopt.c:954 lib/getopt.c:973 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: flaggan \"-W %s\" är tvetydig\n" + +#: lib/getopt.c:997 lib/getopt.c:1018 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: flaggan \"-W %s\" tar inget argument\n" + +#: lib/obstack.c:417 lib/obstack.c:420 lib/xmalloc.c:53 +msgid "memory exhausted" +msgstr "minnet slut" + +# När vi går över till Unicode mer allmänt kanske vi bör översätta båda dessa +# med U+201D (RIGHT DOUBLE QUOTATION MARK) på svenska. Eller? +# +#: lib/quotearg.c:238 +msgid "`" +msgstr "\"" + +#: lib/quotearg.c:239 +msgid "'" +msgstr "\"" + +#: lib/subpipe.c:171 +#, c-format +msgid "subsidiary program `%s' could not be invoked" +msgstr "underprogram \"%s\" kunde inte köras" + +#: lib/subpipe.c:173 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "underprogram \"%s\" hittades inte" + +#: lib/subpipe.c:175 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "underprogram \"%s\" misslyckades" + +#: lib/subpipe.c:176 +#, c-format +msgid "subsidiary program `%s' failed (exit status %d)" +msgstr "underprogram \"%s\" misslyckades (slutstatus %d)" + +#: lib/timevar.c:475 +msgid "" +"\n" +"Execution times (seconds)\n" +msgstr "" +"\n" +"Exekveringstider (sekunder)\n" + +#: lib/timevar.c:525 +msgid " TOTAL :" +msgstr " TOTALT :" + +#: lib/timevar.c:561 +#, c-format +msgid "time in %s: %ld.%06ld (%ld%%)\n" +msgstr "tid i %s: %ld.%06ld (%ld%%)\n" diff --git a/src/apps/bin/bison/po/tr.gmo b/src/apps/bin/bison/po/tr.gmo new file mode 100644 index 0000000000000000000000000000000000000000..ce722313fb603baeef0e7330a3fa1add13f7f133 GIT binary patch literal 14479 zcmd6teT*DueaD|bAY^$7gz(zXJ}GxO8@%T`gA;SML(cZuzT|x8-klRdc)7XV*}Y+B zXO@{++k2D}D5452Y9$JkRB)+MTpxHyiVp;Co)eAFh2bHRhMV z{osAz40sIuICvENJMi^j7km-;+Lsw~D|jbZ0`CTI11G^>0jEI=dZ3p07&s38c7cCW zy#Fz%bxSX24)AX9b>KPh4WM7(N5BKze;#}j_#`+A{-}6fdWA7%?(YRH=!2T?6QJn% zT7gf28uwq|E5TPowC+d1H-is=BVYvH1b!NPE%+JmHQ-->cYxmpC&2H4TIVH9_D1j^ zsQo+u9s+CNE#T)t@#~A=?}A?i-vSnRCVcqu>PhEl^~95qvTD zB~bH!1=P4JAf%dq16kVq1biEKGl%ud;1N*#d>GWY4})6w4?&&JH$lzwBap3{pMx&~ zUk39Ig13W^Y)*iuz;}b{_a~s}eFB8#=35|3o9`6&KL+_{e$F4!bq9+I-vVm=`}rff z-vh#W6BW-t0*bGH1ilsgI;eU671aFKLCM=~Y)1Pj^M^;~0q|GB8psyRWboeEc3Leq0Cd0`KPGGB<2UjubcPZap=0>2ANKK=ugoWBHS$$lIH4}-@GOhNvc zFY`zJp8~a?{{bP@+>TPf8gmHLd7K9|Us&9K7Swq@0czhrEbeb*GR<=s)ca*n^F3DJ zpMsOze+!hH{H(ZtAp?`Ja2`?qZB3GROau5kZFgi3Pu0+j4l z@J--Hc|Qgsg67Kzi}?E__}AbDD7wDMrbO>Epap*pYMwW;N$JaBQ1W&Ll)OC(GOhU} zD7t?K)V@9qO0T~Gs{fOq;LYLO& zk-NlCj?Z21EKuP12c9gRv820>6^O{X%jd7oa+>xS&7Hl>5}{$qP?58 zMoVdPw3w#r^)$(%u6NPoS9Gn@s>TCS5vBlPtTdG;`Unw6h?NY!)>A z)b30DN*q{qcEx|5gVVL3mKnReusl5{>W8i=g9<|oY{@WDW0s1R>aG6_!yXi++K25(fT{#=Cxf;~lahoI3B7<)e z|AXxSN!)vma`_inu>3H4ykYW+-g{EG8*z4kTkR-8@9I&o&KdM~B?jdi-SxfO5AWM{ zHONvwd%t*CNe@__)DoYW_Kl7os*R5BA0O-$25Bb#^@qVUKg)+zyvo|ZxWQgG(kJto z+O5B1qA@dFskEEz(92jLX-BC&4xuG;!mHXe^AONlfNe=(0py-=J8~}|H>jjjrII-r zw>nN??Y@)y?P%4WW|wv;u4R`{O?x_SM^z`H2kdNAVV09|JFKEe89c>Q4J;!WzLX&6 zQGI-%TjCESLKF(Y~ExdSM!mTe}oA1FRT!Km+o3Xm3yDMB)6F)!`&B1=*UjU#Y#c=EGwa=~%DT z^1Z|?w6tmYj%Hl-IU#GyYX=bPH9u_SwznFjtWo=THHWov zJ8QKw+j|g15ZTNZ7#sx;%H@t%spL!exlGyf3rn-_vU*-J3vMPyP*uG##zDmC3|-=h zZ6&cRGH0;H(PN<{grY6cxWsS4#N*3nXXno>^#%`(tNNK2gfgy<|6V(bAvumT#l>QK zt8wc02IrW1O_ogUN`DE-l|QCYs~ROL%B=*lFCRa@ICGkvS(~=}N>GFSws_qp)y#%SwZC2k^{uA`Q2 zY3Ybl+;K=88m6Y&J0hrcdU+XFjw82er@0!3?xaFDM_dkfh-NjGN9-9DyYgmr!587) zD)P*3cvK88Ha9?gf1p;*w2|ETi|~dvw-WYLCZB{XVS6B0C-KClacaFpe9ZY=N7>zuY4H4KggIm!@$g&{q0g93$L^6_5Q>%zM7sD0Yc5f6^_s<~=-PXL-7_}WRhFXi*5P|4jSXn2o;zVw;N@lqT z9c8$K${IGFfDT89?o_v4K8J;0mf7Z?q6sL@{p?ZLS8zRUC)iGzp$e{8!hbKRS`;A+@!3$eV(?RbD>MCow(o>RnK(*>od*~D6la`JoI%W! z8ni;^D3OKrnEl=p7vkuF%UeuO)O0F6*$pmoHYjL5KjC4z-%-et`aLuzcN9*<-K1K& zkX}uRog@}`QEdD3#OD z;|`6Rp-u#l8_!Wi=+3%3m+IEf`wUeT?5bbkWQhIbZVLxwob={mzg^svgKgI=oG)fA z4__RE$=jVNCuml&z>7M_337^@80V?kDnAmU|CIw{HY2r?-VpUdvNEZbr=IQAG^hq1 z@G`+wq__KNp!jxFyCi>n9g?*^F#;%oQFM$V#O>$?uNRH z2C^-eh`HWMUGi{hXpE$M`-u(6$R4lRvP+bzM#VsBizIL~td5UP+(RP0kDpW%O2$c= zDrG(Iu^N*nVkv`q1c7D=tOnJorPj!%?M$}dJxfR~)I8Sd&JS$q&3wQ?Q=&&Ow%7RpDC9DYan9b276Zp}~1 zGf^e3!s#h{gt}DeeAq^q%csfZ5vHi+ZqwtFM{WM|_{7nYDP8fx?xqrf4Gd#I8QP12 zjvTIHTx@2wO+MEyB+jdJ375RIOHrf|*sFdRY=YzrcvVSH!(P3+Bn(ejXbpqTPyhs?+fivr&-$Xo&7?JND4N5%1>q#CI zJZthE+01uc?QVAQWLJ@b1_?&Lpk3z?m8$jK-u1c{HEp7=4dVQ?yUv_p2w%f4XQnlD zZp94O0=o)nnse88?4g(_^mfjZ7qjz)nd#YtZtz7U?O@yN>PBay5pG=Dpr{!!fV8ow ziqo&?jN}KZj4vZdHG9@;G}zIN)y8*OvE!{bv7OGGcvqpW=~cVqW|y9EqfJ?8kGGKr z#q0gyTV?XWg1DbRd$H7zN?SZY79{NUjN<>qoH=;KnfA16X09 zS1aQ*UboU9HjH!@6tPD3|TWxnY-zlO3G9VmsmZH06;(xHaXMPlpM zNwN}ojjP>;x^63@<3cx@GHrDNjVMq(eW3HU>iJgH++OcAHX=%W*!e5nM%I0f^0~Oa z>TQPIEs3pq?(js@VEKG$=E}_c%!6|?i}HN2tB~WVWyzxq)0orB;S^ib_`PfA`S`9J z9!3ZjNK6R@x^`gs9YyqifdJ=s8IaLcI_CUG;X4!SdN^~Z^#{x7rxunTneIDnHvz82 zJ?%JA*MPmN=tBgnhEA4KL(g}my%73Ba0qI8E=t{P4^vP z?@D?Rcc>t)xU$<9@4d_DWPl!F6Om88PA;czhO`~EIanVDcvj^eO}I-Leat&hx=NOS zu@Ilt4OZPiB#&g|(t_+2QV zkDp*OEyUC}aGdBY&R6ku9JV(zCJH_I?PRz5yq0l$%mtkT{(n=Pzn&olP5+>xTcS;J z-6DtRotaA?HlmF}Nku!6$X3POcG?Zj#WBoT+Cr$ZjiyG`W0`0t)GNcKdOowoNxLU} z=D{L7Y3LRJ!{zMPw-q1zjECipE`#$L4KJaM;4PIA;XDAFTOq*;x4Q!68Y&i;|K zL>y{^Z=tBwD&bYsT^}zYM4GD3iBp#&EhDGk(2q(kG2lzn%d>OSC!U^rdU5XQ?>vo@ z!8H7E`s~uv_Q4BtbJO#)=Vs?;-#uNr@W`19^K%!zb0J?1hGFXSN#&i$S$tMAr@S@K z*1UD+8u4CvZzAS?onM<#`TT^7C4Gr?N-#uiUz$RIQ1Fusm{E@w^6d)z&Ri2y?4F}= zd|R*jnsP=V|B&OKGLLxcL}MN~`L;?w{&?3yKNaLo=o#oKBIYjD>>?NGMb~E6O22bb zw&ArryrkFc5<0uQuOA_zSiR@W=&Jcp(fjF6*2y(&;vBKFN`>S%T<|55idd6F?{#$U zO=g0(`D8=$T&KK8&?0_qsSMn%_AG1T&Gm4jS=k^bhlDBPsv#^k)6ir}HQe#Aj@cuvrruIvy;m%46jQ$%tFij>`}xr4)-us*D% z>W!%vX%$uMv|2_A=qd$$K{rk#s`yBKOF*Zk=0&N`3+tG{sM<9iwdJ9&2m^_>lGU9Z z2qbZW6l$L3mEGs`Ud|C2=DWd;Wmel^kq#SI@fws1XHRNggU?`n)+>POi9{2_zA1y# z^EzEuxq~-uD%iA5Ht1fgvVyRY;v&27EH@drceKeVA*KOaA$vB|eV|8=fkQL&p_ z$O2Un*DqKWrg~#tas5sW5SR1;O$a@?$oF`Pvh)l=fDvWcJQCZ(p6y!SENorz&K;v^ MldO01zf^et52Ic&EC2ui literal 0 HcmV?d00001 diff --git a/src/apps/bin/bison/po/tr.po b/src/apps/bin/bison/po/tr.po new file mode 100644 index 0000000000..02bf31c3bf --- /dev/null +++ b/src/apps/bin/bison/po/tr.po @@ -0,0 +1,928 @@ +# Turkish translations for GNU Bison messages. +# Copyright (C) 2001 Free Software Foundation, Inc. +# Altuð Bayram , 2001. +# Çaðrý Çöltekin , 2003 +# +msgid "" +msgstr "" +"Project-Id-Version: bison 1.875a\n" +"Report-Msgid-Bugs-To: bug-bison@gnu.org\n" +"POT-Creation-Date: 2004-05-21 10:26-0700\n" +"PO-Revision-Date: 2003-11-08 22:00+0100\n" +"Last-Translator: Çaðrý Çöltekin \n" +"Language-Team: Turkish \n" +"MIME-Version: 1.0\n" +"Content-Type: text/plain; charset=ISO-8859-9\n" +"Content-Transfer-Encoding: 8bit\n" +"Plural-Forms: nplurals=1; plural=0;\n" + +#: src/complain.c:51 src/complain.c:66 +msgid "warning: " +msgstr "uyarý: " + +#: src/complain.c:122 src/complain.c:138 +msgid "fatal error: " +msgstr "ölümcül hata:" + +#: src/conflicts.c:76 +#, c-format +msgid " Conflict between rule %d and token %s resolved as shift" +msgstr " %d durumu %s andacý arasýndaki çeliþki kaydýrýlarak çözümlendi" + +#: src/conflicts.c:84 +#, c-format +msgid " Conflict between rule %d and token %s resolved as reduce" +msgstr " %d durumu %s andacý arasýndaki çeliþki indirgenerek çözümlendi" + +#: src/conflicts.c:91 +#, c-format +msgid " Conflict between rule %d and token %s resolved as an error" +msgstr " %d durumu %s andacý arasýndaki çeliþki hata olarak çözümlendi" + +#: src/conflicts.c:399 +#, c-format +msgid "conflicts: %d shift/reduce, %d reduce/reduce\n" +msgstr "çeliþkiler: %d öteleme/indirgeme, %d indirgeme/indirgeme\n" + +#: src/conflicts.c:402 +#, c-format +msgid "conflicts: %d shift/reduce\n" +msgstr "çeliþkiler: %d öteleme/indirgeme\n" + +#: src/conflicts.c:404 +#, c-format +msgid "conflicts: %d reduce/reduce\n" +msgstr "çeliþkiler: %d indirgeme/indirgeme\n" + +#: src/conflicts.c:422 +#, c-format +msgid "State %d " +msgstr "Durum %d " + +#: src/conflicts.c:487 +#, fuzzy, c-format +msgid "%%expect-rr applies only to GLR parsers" +msgstr "%s sadece GLR ayrýþtýrýcýlarý etkiler" + +#: src/conflicts.c:511 +#, c-format +msgid "expected %d shift/reduce conflict" +msgid_plural "expected %d shift/reduce conflicts" +msgstr[0] "beklenen %d öteleme/indirgeme çeliþkisi" +msgstr[1] "beklenen %d öteleme/indirgeme çeliþkisi" + +#: src/conflicts.c:515 +#, fuzzy, c-format +msgid "expected %d reduce/reduce conflict" +msgid_plural "expected %d reduce/reduce conflicts" +msgstr[0] "0 indirgeme/indirgeme çeliþkisi bekleniyor" + +#: src/files.c:100 +#, c-format +msgid "cannot open file `%s'" +msgstr "`%s' dosyasý açýlamýyor" + +#: src/files.c:116 +msgid "I/O error" +msgstr "G/Ç hatasý" + +#: src/files.c:119 +msgid "cannot close file" +msgstr "dosya kapatýlamýyor" + +#: src/files.c:337 +#, c-format +msgid "conflicting outputs to file %s" +msgstr "%s dosyasýna çeliþen çýktýlar" + +#: src/getargs.c:186 +#, c-format +msgid "Try `%s --help' for more information.\n" +msgstr "Daha fazla bilgi için `%s --help' yazýn.\n" + +#: src/getargs.c:192 +msgid "GNU bison generates parsers for LALR(1) grammars.\n" +msgstr "GNU bison LALR(1) gramerler için ayrýþtýrýcýlar üretir.\n" + +#: src/getargs.c:196 +#, c-format +msgid "Usage: %s [OPTION]... FILE\n" +msgstr "Kullaným: %s [SEÇENEK]... DOSYA\n" + +#: src/getargs.c:200 +msgid "" +"If a long option shows an argument as mandatory, then it is mandatory\n" +"for the equivalent short option also. Similarly for optional arguments.\n" +msgstr "" +"Eðer bir uzun seçenek bir argümaný gerektirirse, bu gereklilik, denk olan " +"kýsa\n" +"seçenek için de geçerlidir. Bu durum, seçimli argümanlar için de " +"geçerlidir.\n" + +#: src/getargs.c:206 +msgid "" +"Operation modes:\n" +" -h, --help display this help and exit\n" +" -V, --version output version information and exit\n" +" -y, --yacc emulate POSIX yacc\n" +msgstr "" +"Çalýþma kipleri:\n" +" -h, --help bu yardýmý göster ve çýk\n" +" -V, --version sürüm bilgisini ver ve çýk\n" +" -y, --yacc POSIX yacc öykünmesi\n" + +#: src/getargs.c:213 +msgid "" +"Parser:\n" +" -S, --skeleton=FILE specify the skeleton to use\n" +" -t, --debug instrument the parser for debugging\n" +" --locations enable locations computation\n" +" -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n" +" -l, --no-lines don't generate `#line' directives\n" +" -n, --no-parser generate the tables only\n" +" -k, --token-table include a table of token names\n" +msgstr "" +"Ayrýþtýrýcý:\n" +" -S, --skeleton=FILE kullanýlacak iskeleti belirt\n" +" -t, --debug ayrýþtýrýcýya hata ayýklayýcý ekle\n" +" --locations konum hesaplamalarýný etkinleþtir\n" +" -p, --name-prefix=ÖNEK dýþ simgelerin baþýna ÖNEK ekle\n" +" -l, --no-lines `#line' yönergelerini üretme\n" +" -n, --no-parser sadece tablolarý üret\n" +" -k, --token-table andaç isimlerinin bir tablosunu içer\n" + +#: src/getargs.c:225 +msgid "" +"Output:\n" +" -d, --defines also produce a header file\n" +" -r, --report=THINGS also produce details on the automaton\n" +" -v, --verbose same as `--report=state'\n" +" -b, --file-prefix=PREFIX specify a PREFIX for output files\n" +" -o, --output=FILE leave output to FILE\n" +" -g, --graph also produce a VCG description of the " +"automaton\n" +msgstr "" +"Çýktý:\n" +" -d, --defines bir baþlýk dosyasý da üret\n" +" -r, --report=SEÇENEKLER otomatta ayrýntýlý bilgi de göster\n" +" -v, --verbose otomatýn bir açýklamasýný da üret\n" +" -b, --file-prefix=ÖNEK çýktý dosyalarý için bir ÖNEK belir\n" +" -o, --output=DOSYA çýktýyý DOSYAya yaz\n" +" -g, --graph otomatýn bir VCG grafik açýklamasýný da üret\n" + +# DUZELT: cevrilmemis iki mesaj var +#: src/getargs.c:236 +msgid "" +"THINGS is a list of comma separated words that can include:\n" +" `state' describe the states\n" +" `itemset' complete the core item sets with their closure\n" +" `lookahead' explicitly associate lookaheads to items\n" +" `solved' describe shift/reduce conflicts solving\n" +" `all' include all the above information\n" +" `none' disable the report\n" +msgstr "" +"SEÇENEKLER aþaðýdaki anhtar sözcüklerden virgülle ayýrarak oluþturulabilir:\n" +" `state' durumlarý açýkla\n" +" `itemset' complete the core item sets with their closure\n" +" `lookahead' explicitly associate lookaheads to items\n" +" `solved' öteleme/indigerme çeliþkilerinin çözümünü açýkla\n" +" `all' yukarýdaki bilgilerini tümünü gosterir\n" +" `none' raporu üretme\n" + +#: src/getargs.c:247 +msgid "Report bugs to .\n" +msgstr "" +"Hatalarý 'a,\n" +"çeviri hatalarýný 'e bildir.\n" + +#: src/getargs.c:264 +#, c-format +msgid "bison (GNU Bison) %s" +msgstr "bison (GNU Bison) %s" + +#: src/getargs.c:266 +msgid "Written by Robert Corbett and Richard Stallman.\n" +msgstr "Yazanlar: Robert Corbett ve Richard Stallman.\n" + +#: src/getargs.c:270 +#, c-format +msgid "Copyright (C) %d Free Software Foundation, Inc.\n" +msgstr "Telif Hakký (C) %d Free Software Foundation, Inc.\n" + +#: src/getargs.c:272 +msgid "" +"This is free software; see the source for copying conditions. There is NO\n" +"warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n" +msgstr "" +"Bu bir serbest yazýlýmdýr; kopyalama koþullarý için kaynak koduna bakýnýz.\n" +"Hiçbir garantisi yoktur; hatta SATILABÝLÝRLÝÐÝ veya ÞAHSÝ KULLANIMINIZA\n" +"UYGUNLUÐU için bile garanti verilmez.\n" + +#: src/getargs.c:438 +#, c-format +msgid "missing operand after `%s'" +msgstr "`%s'ten sonra eksik iþleç" + +#: src/getargs.c:440 +#, c-format +msgid "extra operand `%s'" +msgstr "fazla iþleç: `%s'" + +#: src/gram.c:139 +msgid "empty" +msgstr "boþ" + +#: src/gram.c:233 +msgid "Grammar" +msgstr "Gramer" + +#: src/gram.c:321 src/reduce.c:394 +msgid "warning" +msgstr "uyarý" + +#: src/main.c:124 +msgid "rule never reduced because of conflicts" +msgstr "çeliskiler yüzünden kural indirgenemedi" + +#: src/parse-gram.y:363 +msgid "POSIX forbids declarations in the grammar" +msgstr "Gramer içindeki bildirimler POSIX'e uygun deðildir" + +#: src/parse-gram.y:486 +msgid "missing identifier in parameter declaration" +msgstr "parametre bildiriminde eksik tanýtýcý" + +#: src/print.c:49 +#, c-format +msgid " type %d is %s\n" +msgstr " tip %d %s'dir\n" + +#: src/print.c:165 +#, c-format +msgid "shift, and go to state %d\n" +msgstr "ötele, ve durum %d'ye git\n" + +#: src/print.c:167 +#, c-format +msgid "go to state %d\n" +msgstr "durum %d'ye git\n" + +#: src/print.c:204 +msgid "error (nonassociative)\n" +msgstr "hata (birleþmeli deðil)\n" + +#: src/print.c:292 +#, c-format +msgid "reduce using rule %d (%s)" +msgstr "kural %d (%s) ile indirgeme" + +#: src/print.c:294 +#, c-format +msgid "accept" +msgstr "onayla" + +#: src/print.c:325 src/print.c:391 +msgid "$default" +msgstr "$öntanýmlý" + +#: src/print.c:420 +#, c-format +msgid "state %d" +msgstr "durum %d" + +#: src/print.c:456 +msgid "Terminals, with rules where they appear" +msgstr "Sabit simgeler, içinde geçtikleri kurallarla birlikte" + +#: src/print.c:483 +msgid "Nonterminals, with rules where they appear" +msgstr "Deðiþken simgeler, içinde geçtikleri kurallarla birlikte" + +#: src/print.c:512 +#, c-format +msgid " on left:" +msgstr " (sol tarafta):" + +#: src/print.c:527 +#, c-format +msgid " on right:" +msgstr " (sað tarafta):" + +#: src/print.c:555 +msgid "Rules never reduced" +msgstr "Hiç indirgenmeyen kurallar" + +#: src/reader.c:56 +#, c-format +msgid "multiple %s declarations" +msgstr "çoklu %s bildirimleri" + +#: src/reader.c:118 +#, c-format +msgid "result type clash on merge function %s: <%s> != <%s>" +msgstr "birleþtirme iþlevi `%s'de tip çatýþmasý: <%s> != <%s>" + +#: src/reader.c:216 +#, c-format +msgid "rule given for %s, which is a token" +msgstr "bir andaç olan %s için kural verilmiþ" + +#: src/reader.c:245 +#, c-format +msgid "type clash on default action: <%s> != <%s>" +msgstr "öntanýmlý eylem üzerinde tip çatýþmasý: `%s' != `%s'" + +#: src/reader.c:251 +msgid "empty rule for typed nonterminal, and no action" +msgstr "" +"Tipli deðiþken simge için boþ kural tanýmlanmýþ, ve eylem belirtilmemiþ" + +#: src/reader.c:321 src/reader.c:335 src/reader.c:348 +#, c-format +msgid "only one %s allowed per rule" +msgstr "her kural icin sadece bir %s kullanýlabilir" + +#: src/reader.c:331 src/reader.c:346 +#, c-format +msgid "%s affects only GLR parsers" +msgstr "%s sadece GLR ayrýþtýrýcýlarý etkiler" + +#: src/reader.c:333 +#, c-format +msgid "%s must be followed by positive number" +msgstr "%s'i pozitif bir sayý izlemeli" + +#: src/reader.c:490 +msgid "no rules in the input grammar" +msgstr "girdi gramer içinde kural yok" + +#: src/reduce.c:242 +msgid "useless rule" +msgstr "gereksiz kural" + +#: src/reduce.c:303 +#, c-format +msgid "useless nonterminal: %s" +msgstr "gereksiz deðiþken simge: %s" + +#: src/reduce.c:351 +msgid "Useless nonterminals" +msgstr "Gereksiz deðiþken simgeler" + +#: src/reduce.c:364 +msgid "Terminals which are not used" +msgstr "Kullanýlmayan sabit simgeler" + +#: src/reduce.c:373 +msgid "Useless rules" +msgstr "Gereksiz kurallar" + +#: src/reduce.c:389 +#, c-format +msgid "%d rule never reduced\n" +msgid_plural "%d rules never reduced\n" +msgstr[0] "%d kural hiç indirgenmedi\n" +msgstr[1] "%d kural hiç indirgenmedi\n" + +#: src/reduce.c:397 +#, c-format +msgid "%d useless nonterminal" +msgid_plural "%d useless nonterminals" +msgstr[0] "%d gereksiz deðiþken simge" +msgstr[1] "%d gereksiz deðiþken simge" + +#: src/reduce.c:403 +#, c-format +msgid " and " +msgstr " ve " + +#: src/reduce.c:406 +#, c-format +msgid "%d useless rule" +msgid_plural "%d useless rules" +msgstr[0] "%d gereksiz kural" +msgstr[1] "%d gereksiz kural" + +#: src/reduce.c:436 +#, c-format +msgid "start symbol %s does not derive any sentence" +msgstr "baþlangýç simgesi %s herhangi bir cümleden türemiyor" + +#: src/scan-gram.l:162 +msgid "stray `,' treated as white space" +msgstr "fazladan `,' boþluk olarak algýlandý" + +#: src/scan-gram.l:225 +#, c-format +msgid "invalid directive: %s" +msgstr "geçersiz yönerge: %s" + +#: src/scan-gram.l:283 +#, c-format +msgid "invalid character: %s" +msgstr "geçersiz karakter: %s" + +#: src/scan-gram.l:402 +#, fuzzy +msgid "invalid null character" +msgstr "geçersiz karakter: %s" + +#: src/scan-gram.l:415 src/scan-gram.l:427 src/scan-gram.l:448 +#, c-format +msgid "invalid escape sequence: %s" +msgstr "geçersiz önceleme dizgesi: %s" + +#: src/scan-gram.l:417 src/scan-gram.l:429 src/scan-gram.l:450 +#, fuzzy, c-format +msgid "invalid null character: %s" +msgstr "geçersiz karakter: %s" + +#: src/scan-gram.l:455 +#, c-format +msgid "unrecognized escape sequence: %s" +msgstr "tanýnmayan önceleme dizgesi: %s" + +#: src/scan-gram.l:537 +#, c-format +msgid "missing `{' in `%s'" +msgstr "`%s' içinde eksik `{'" + +#: src/scan-gram.l:782 +#, c-format +msgid "$$ of `%s' has no declared type" +msgstr "`%s''in $$'ý için bildirilmiþ tip yok" + +#: src/scan-gram.l:803 +#, c-format +msgid "$%d of `%s' has no declared type" +msgstr "`%2$s''in %1$d'i için bildirilmiþ tip yok" + +#: src/scan-gram.l:812 src/scan-gram.l:881 src/scan-gram.l:932 +#, c-format +msgid "integer out of range: %s" +msgstr "tam sayý kapsam dýþý: %s" + +#: src/scan-gram.l:848 src/scan-gram.l:916 +#, c-format +msgid "invalid value: %s" +msgstr "geçersiz deðer: %s" + +#: src/scan-gram.l:1036 +#, c-format +msgid "missing `%s' at end of file" +msgstr "dosyanýn sonunda eksik `%s'" + +#: src/scan-gram.l:1047 +#, fuzzy, c-format +msgid "missing `%s' at end of line" +msgstr "dosyanýn sonunda eksik `%s'" + +#: src/symlist.c:97 src/symlist.c:108 +msgid "invalid $ value" +msgstr "geçersiz $ deðeri" + +#: src/symtab.c:85 +#, c-format +msgid "type redeclaration for %s" +msgstr "%s için tekrar tip bildirimi" + +#: src/symtab.c:102 src/symtab.c:120 +#, c-format +msgid "%s redeclaration for %s" +msgstr "%2$s için tekrar %1$s bildirimi" + +#: src/symtab.c:139 +#, c-format +msgid "redefining precedence of %s" +msgstr "%s'in önceliði tekrar tanýmlanýyor" + +#: src/symtab.c:157 +#, c-format +msgid "symbol %s redefined" +msgstr "%s simgesi tekrar tanýmlanmýþ" + +#: src/symtab.c:180 +#, c-format +msgid "redefining user token number of %s" +msgstr "kullanýcý andacý %s tekrar tanýmlanýyor" + +#: src/symtab.c:207 +#, c-format +msgid "symbol %s is used, but is not defined as a token and has no rules" +msgstr "" +"simge %s kullanýlmýþ, fakat andaç olarak tanýmlanmamýþ ve kurallarý yok" + +#: src/symtab.c:232 +#, c-format +msgid "symbol `%s' used more than once as a literal string" +msgstr "simge `%s', yalýn dizge olarak birden fazla kullanýlmýþ" + +#: src/symtab.c:235 +#, c-format +msgid "symbol `%s' given more than one literal string" +msgstr "simge `%s', birden fazla yalýn dizgeye atanmýþ" + +#: src/symtab.c:271 +#, c-format +msgid "conflicting precedences for %s and %s" +msgstr "%s ve %s için çeliþen öncelikler" + +#: src/symtab.c:283 +#, c-format +msgid "conflicting associativities for %s (%s) and %s (%s)" +msgstr "%s (%s) ve %s (%s) için çeliþen birleþmeli deðerler" + +#: src/symtab.c:368 +#, c-format +msgid "tokens %s and %s both assigned number %d" +msgstr "%s ve %s andaçlarýnýn her ikisi %d sayýsýna atandmýþ" + +#: src/symtab.c:591 +#, c-format +msgid "the start symbol %s is undefined" +msgstr "baþlangýç simgesi %s tanýmlanmamýþ" + +#: src/symtab.c:595 +#, c-format +msgid "the start symbol %s is a token" +msgstr "baþlangýç simgesi %s bir andaç" + +#: lib/argmatch.c:133 +#, c-format +msgid "invalid argument %s for %s" +msgstr "geçersiz argüman: %2$s için %1$s" + +#: lib/argmatch.c:134 +#, c-format +msgid "ambiguous argument %s for %s" +msgstr "%s argümaný, %s için belirsiz" + +#: lib/argmatch.c:153 +#, c-format +msgid "Valid arguments are:" +msgstr "Geçerli argümanlar:" + +#: lib/bitset_stats.c:179 +#, c-format +msgid "%u bitset_allocs, %u freed (%.2f%%).\n" +msgstr "%u bitset_allocs, %u serbest býrakýlan (%.2f%%).\n" + +#: lib/bitset_stats.c:182 +#, c-format +msgid "%u bitset_sets, %u cached (%.2f%%)\n" +msgstr "%u bitset_sets, %u önbellek kullanýmý (%.2f%%)\n" + +#: lib/bitset_stats.c:185 +#, c-format +msgid "%u bitset_resets, %u cached (%.2f%%)\n" +msgstr "%u bitset_resets, %u önbellek kullanýmý (%.2f%%)\n" + +#: lib/bitset_stats.c:188 +#, c-format +msgid "%u bitset_tests, %u cached (%.2f%%)\n" +msgstr "%u bitset_tests, %u önbellek kullanýmý (%.2f%%)\n" + +#: lib/bitset_stats.c:192 +#, c-format +msgid "%u bitset_lists\n" +msgstr "%u bitset_lists\n" + +#: lib/bitset_stats.c:194 +msgid "count log histogram\n" +msgstr "sayý histogramý\n" + +#: lib/bitset_stats.c:197 +msgid "size log histogram\n" +msgstr "büyükük histogramý\n" + +#: lib/bitset_stats.c:200 +msgid "density histogram\n" +msgstr "yogunluk histogramý\n" + +#: lib/bitset_stats.c:214 +#, c-format +msgid "" +"Bitset statistics:\n" +"\n" +msgstr "" +"Bitset istatistikleri:\n" +"\n" + +#: lib/bitset_stats.c:217 +#, c-format +msgid "Accumulated runs = %u\n" +msgstr "Toplam çalýþtýrýlan = %u\n" + +#: lib/bitset_stats.c:261 lib/bitset_stats.c:266 +msgid "Could not read stats file." +msgstr "Ýstatistik dosyasý okunamadý." + +#: lib/bitset_stats.c:263 +#, c-format +msgid "Bad stats file size.\n" +msgstr "Ýstatistik dosyasý büyüklüðü yanlýþ.\n" + +#: lib/bitset_stats.c:289 lib/bitset_stats.c:291 +msgid "Could not write stats file." +msgstr "Ýstatistik dosyasýna yazýlamadý." + +#: lib/bitset_stats.c:294 +msgid "Could not open stats file for writing." +msgstr "Ýstatistik dosyasý yazmak için açýlamadý." + +#: lib/error.c:127 +msgid "Unknown system error" +msgstr "Bilinmeyen sistem hatasý" + +#: lib/getopt.c:570 lib/getopt.c:589 +#, c-format +msgid "%s: option `%s' is ambiguous\n" +msgstr "%s: `%s' seçeneði belirsiz\n" + +#: lib/getopt.c:622 lib/getopt.c:626 +#, c-format +msgid "%s: option `--%s' doesn't allow an argument\n" +msgstr "%s: `--%s' seçeneði argümansýz kullanýlýr\n" + +#: lib/getopt.c:635 lib/getopt.c:640 +#, c-format +msgid "%s: option `%c%s' doesn't allow an argument\n" +msgstr "%s: seçenek `%c%s' argümansýz kullanýlýr\n" + +#: lib/getopt.c:686 lib/getopt.c:708 lib/getopt.c:1039 lib/getopt.c:1061 +#, c-format +msgid "%s: option `%s' requires an argument\n" +msgstr "%s: `%s' seçeneði bir argümanla kullanýlýr\n" + +#: lib/getopt.c:746 lib/getopt.c:749 +#, c-format +msgid "%s: unrecognized option `--%s'\n" +msgstr "%s: `--%s' seçeneði bilinmiyor\n" + +#: lib/getopt.c:757 lib/getopt.c:760 +#, c-format +msgid "%s: unrecognized option `%c%s'\n" +msgstr "%s: `%c%s' seçeneði bilinmiyor\n" + +#: lib/getopt.c:815 lib/getopt.c:818 +#, c-format +msgid "%s: illegal option -- %c\n" +msgstr "%s: kural dýþý seçenek -- %c\n" + +#: lib/getopt.c:824 lib/getopt.c:827 +#, c-format +msgid "%s: invalid option -- %c\n" +msgstr "%s: geçersiz seçenek -- %c\n" + +#: lib/getopt.c:882 lib/getopt.c:901 lib/getopt.c:1114 lib/getopt.c:1135 +#, c-format +msgid "%s: option requires an argument -- %c\n" +msgstr "%s: seçenek bir argümanla kullanýlýr -- %c\n" + +#: lib/getopt.c:954 lib/getopt.c:973 +#, c-format +msgid "%s: option `-W %s' is ambiguous\n" +msgstr "%s: `-W %s' seçeneði belirsiz\n" + +#: lib/getopt.c:997 lib/getopt.c:1018 +#, c-format +msgid "%s: option `-W %s' doesn't allow an argument\n" +msgstr "%s: `-W %s' seçeneði argümansýz kullanýlýr\n" + +#: lib/obstack.c:417 lib/obstack.c:420 lib/xmalloc.c:53 +msgid "memory exhausted" +msgstr "bellek tükendi" + +#: lib/quotearg.c:238 +msgid "`" +msgstr "`" + +#: lib/quotearg.c:239 +msgid "'" +msgstr "'" + +#: lib/subpipe.c:171 +#, c-format +msgid "subsidiary program `%s' could not be invoked" +msgstr "alt program `%s' çalýþtýrýlamadý" + +#: lib/subpipe.c:173 +#, c-format +msgid "subsidiary program `%s' not found" +msgstr "alt program `%s' bulunamadý" + +#: lib/subpipe.c:175 +#, c-format +msgid "subsidiary program `%s' failed" +msgstr "alt program `%s' baþarýsýz" + +#: lib/subpipe.c:176 +#, c-format +msgid "subsidiary program `%s' failed (exit status %d)" +msgstr "alt program `%s' baþarýsýz (hata kodu: %d)" + +#: lib/timevar.c:475 +msgid "" +"\n" +"Execution times (seconds)\n" +msgstr "" +"\n" +"Çalýþma süresi (saniye)\n" + +#: lib/timevar.c:525 +msgid " TOTAL :" +msgstr " TOPLAM : " + +#: lib/timevar.c:561 +#, c-format +msgid "time in %s: %ld.%06ld (%ld%%)\n" +msgstr "%s'te geçen zaman: %ld.%06ld (%ld%%)\n" + +#~ msgid "too many states (max %d)" +#~ msgstr "çok fazla durum (en fazla %d)" + +#~ msgid "reduce" +#~ msgstr "indirgeme" + +#~ msgid "shift" +#~ msgstr "shift" + +#~ msgid "%d shift/reduce conflict" +#~ msgid_plural "%d shift/reduce conflicts" +#~ msgstr[0] "%d öteleme/indirgeme çeliþkisi" +#~ msgstr[1] "%d öteleme/indirgeme çeliþkisi" + +#~ msgid "and" +#~ msgstr "ve" + +#~ msgid "State %d contains " +#~ msgstr "%d durumu içerir" + +#~ msgid "conflicts: " +#~ msgstr "çeliþkiler: " + +#~ msgid "%s contains " +#~ msgstr "%s içerir" + +#~ msgid "`%s' is no longer supported" +#~ msgstr "`%s' artýk desteklenmeyecek" + +#~ msgid "%s: no grammar file given\n" +#~ msgstr "%s: gramer dosyasý verilmemiþ\n" + +#~ msgid "%s: extra arguments ignored after `%s'\n" +#~ msgstr "%s: '%s' den sonraki argümanlar yoksayýldý\n" + +#~ msgid "too many gotos (max %d)" +#~ msgstr "gotos çok fazla (en fazla %d)" + +#~ msgid "unexpected `/' found and ignored" +#~ msgstr "beklenmeyen `/' bulundu ve yoksayýldý" + +#~ msgid "unterminated comment" +#~ msgstr "sonlandýrýlmamýþ açýklama" + +#~ msgid "unexpected end of file" +#~ msgstr "beklenmeyen dosya sonu" + +#~ msgid "unescaped newline in constant" +#~ msgstr "sabit içinde kaçamayan yeni satýr" + +#~ msgid "octal value outside range 0...255: `\\%o'" +#~ msgstr "sekizli deðer 0...255'in dýþýnda: `\\%o'" + +#~ msgid "hexadecimal value above 255: `\\x%x'" +#~ msgstr "onaltýlýk deðer 255'in üstünde: `\\x%x'" + +#~ msgid "unknown escape sequence: `\\' followed by `%s'" +#~ msgstr "bilinmeyen kaçýþ sýrasý: `\\' `%s' tarafýndan takip edildi" + +#~ msgid "unterminated type name at end of file" +#~ msgstr "dosya sonunda sonlandýrýlmamýþ tip adý" + +#~ msgid "unterminated type name" +#~ msgstr "sonlandýrýlmamýþ tip ismi" + +#~ msgid "use \"...\" for multi-character literal tokens" +#~ msgstr "çok-karakterli yazýn andaçlarý için \"...\" kullan" + +#~ msgid "`%s' supports no argument: %s" +#~ msgstr "`%s' argüman %s'i desteklemez" + +#~ msgid "`%s' requires an argument" +#~ msgstr "`%s' bir argüman gerektirir" + +#~ msgid " (rule %d)" +#~ msgstr " (kural %d)" + +#~ msgid " %-4s\terror (nonassociative)\n" +#~ msgstr " %-4s\thata (birleþmeli deðil)\n" + +#~ msgid "" +#~ " $default\treduce using rule %d (%s)\n" +#~ "\n" +#~ msgstr "" +#~ " $default\tindirgeme kural %d (%s)'i kullanýyor\n" +#~ "\n" + +#~ msgid " %-4s\t[reduce using rule %d (%s)]\n" +#~ msgstr " %-4s\t[indirgeme kural %d (%s)'i kullanýyor]\n" + +#~ msgid " %-4s\treduce using rule %d (%s)\n" +#~ msgstr " %-4s\tindirgeme kural %d (%s)'i kullanýyor\n" + +#~ msgid " $default\treduce using rule %d (%s)\n" +#~ msgstr " $default\tindirgeme kural %d (%s)'i kullanýyor\n" + +#~ msgid " $default\taccept\n" +#~ msgstr " $default\tonayla\n" + +#~ msgid " NO ACTIONS\n" +#~ msgstr " EYLEM YOK\n" + +#~ msgid "Number, Line, Rule" +#~ msgstr "Sayý, Satýr, Kural" + +#~ msgid " %3d %3d %s ->" +#~ msgstr " %3d %3d %s ->" + +#~ msgid " Skipping to next \\n" +#~ msgstr " Sonrakine atlanýyor \\n" + +#~ msgid " Skipping to next %c" +#~ msgstr " Sonraki %c'ye atlanýyor" + +#~ msgid "unterminated string" +#~ msgstr "sonlandýrýlmamýþ dizge" + +#~ msgid "%s is invalid" +#~ msgstr "%s geçersizdir" + +#~ msgid "unterminated `%{' definition" +#~ msgstr "`%{' tanýmlamasý sonlandýrýlmamýþ" + +#~ msgid "Premature EOF after %s" +#~ msgstr "%s'den sonra erken EOF" + +#~ msgid "`%s' is invalid in %s" +#~ msgstr "`%s' %s içinde geçersizdir" + +#~ msgid "invalid %s declaration" +#~ msgstr "geçersiz %s bildirimi" + +#~ msgid "%type declaration has no " +#~ msgstr "%type bildirimi 'na sahip deðil" + +#~ msgid "invalid %%type declaration due to item: %s" +#~ msgstr "geçersiz %%type bildirimine neden olan öðe: `%s'" + +#~ msgid "invalid text (%s) - number should be after identifier" +#~ msgstr "geçersiz metin (%s) - sayý tanýtýcýdan sonra olmalýdýr" + +#~ msgid "unexpected item: %s" +#~ msgstr "beklenmeyen öðe: %s" + +#~ msgid "unmatched %s" +#~ msgstr "eþlenemeyen %s" + +#~ msgid "argument of %%expect is not an integer" +#~ msgstr "%%expect'in argümaný bir tamsayý deðildir" + +#~ msgid "unrecognized item %s, expected an identifier" +#~ msgstr "%s öðesi tanýnmadý, beklenen bir tanýtýcýdýr" + +#~ msgid "expected string constant instead of %s" +#~ msgstr "%s'in yerine sabit dizge beklendi" + +#~ msgid "no input grammar" +#~ msgstr "girdi grameri yok" + +#~ msgid "ill-formed rule: initial symbol not followed by colon" +#~ msgstr "kötü-biçemli kural: baþlangýç simgesini takip eden \":\" yok" + +#~ msgid "grammar starts with vertical bar" +#~ msgstr "gramer düþey çubuk ile baþlýyor" + +#~ msgid "previous rule lacks an ending `;'" +#~ msgstr "önceki kuralda bir bitiþ `;' eksik" + +#~ msgid "two @prec's in a row" +#~ msgstr "bir satýrda iki @prec" + +#~ msgid "%%guard present but %%semantic_parser not specified" +#~ msgstr "%%guard sunulmuþ fakat %%semantic_parser belirlenmemiþ" + +#~ msgid "two actions at end of one rule" +#~ msgstr "bir kuralýn sonunda iki eylem" + +#~ msgid "too many symbols (tokens plus nonterminals); maximum %d" +#~ msgstr "çok fazla simge var (andaçlar ve deðiþken simgeler); en fazla %d" + +#~ msgid "maximum table size (%d) exceeded" +#~ msgstr "en büyük tablo uzunluðu (%d) aþýldý" + +#~ msgid " $ \tgo to state %d\n" +#~ msgstr " $ \tdurum %d'ye git\n" + +#~ msgid "unterminated %guard clause" +#~ msgstr "sonlandýrýlmamýþ %guard yantümcesi" diff --git a/src/apps/bin/bison/src/Jamfile b/src/apps/bin/bison/src/Jamfile new file mode 100644 index 0000000000..67355a5b2f --- /dev/null +++ b/src/apps/bin/bison/src/Jamfile @@ -0,0 +1,41 @@ +SubDir OBOS_TOP src apps bin bison src ; + +SubDirCcFlags -DHAVE_CONFIG_H -DPKGDATADIR=\'\"/share\"\' -DLOCALEDIR=\'\"/share/locale\"\' ; + +SubDirHdrs [ FDirName $(SUBDIR) $(DOTDOT) lib ] ; +SubDirHdrs [ FDirName $(SUBDIR) $(DOTDOT) ] ; + +BinCommand bison : + LR0.c + assoc.c + closure.c + complain.c + conflicts.c + derives.c + files.c + getargs.c + gram.c + lalr.c + location.c + main.c + muscle_tab.c + nullable.c + output.c +# parse-gram.y + parse-gram.c + print.c + print_graph.c + reader.c + reduce.c + relation.c + scan-gram.l + scan-skel.l + state.c + symlist.c + symtab.c + tables.c + uniqstr.c + vcg.c + : libbison.a + : bison.rdef ; + diff --git a/src/apps/bin/bison/src/LR0.c b/src/apps/bin/bison/src/LR0.c new file mode 100644 index 0000000000..2a75193e81 --- /dev/null +++ b/src/apps/bin/bison/src/LR0.c @@ -0,0 +1,380 @@ +/* Generate the nondeterministic finite state machine for Bison. + + Copyright (C) 1984, 1986, 1989, 2000, 2001, 2002, 2004 Free + Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + +/* See comments in state.h for the data structures that represent it. + The entry point is generate_states. */ + +#include "system.h" + +#include +#include + +#include "LR0.h" +#include "closure.h" +#include "complain.h" +#include "getargs.h" +#include "gram.h" +#include "gram.h" +#include "lalr.h" +#include "reader.h" +#include "reduce.h" +#include "state.h" +#include "symtab.h" + +typedef struct state_list +{ + struct state_list *next; + state *state; +} state_list; + +static state_list *first_state = NULL; +static state_list *last_state = NULL; + + +/*------------------------------------------------------------------. +| A state was just discovered from another state. Queue it for | +| later examination, in order to find its transitions. Return it. | +`------------------------------------------------------------------*/ + +static state * +state_list_append (symbol_number sym, size_t core_size, item_number *core) +{ + state_list *node = MALLOC (node, 1); + state *s = state_new (sym, core_size, core); + + if (trace_flag & trace_automaton) + fprintf (stderr, "state_list_append (state = %d, symbol = %d (%s))\n", + nstates, sym, symbols[sym]->tag); + + /* If this is the endtoken, and this is not the initial state, then + this is the final state. */ + if (sym == 0 && first_state) + final_state = s; + + node->next = NULL; + node->state = s; + + if (!first_state) + first_state = node; + if (last_state) + last_state->next = node; + last_state = node; + + return s; +} + +static int nshifts; +static symbol_number *shift_symbol = NULL; + +static rule **redset = NULL; +static state **shiftset = NULL; + +static item_number **kernel_base = NULL; +static int *kernel_size = NULL; +static item_number *kernel_items = NULL; + + +static void +allocate_itemsets (void) +{ + symbol_number i; + rule_number r; + item_number *rhsp; + + /* Count the number of occurrences of all the symbols in RITEMS. + Note that useless productions (hence useless nonterminals) are + browsed too, hence we need to allocate room for _all_ the + symbols. */ + int count = 0; + short int *symbol_count = CALLOC (symbol_count, + nsyms + nuseless_nonterminals); + + for (r = 0; r < nrules; ++r) + for (rhsp = rules[r].rhs; *rhsp >= 0; ++rhsp) + { + count++; + symbol_count[*rhsp]++; + } + + /* See comments before new_itemsets. All the vectors of items + live inside KERNEL_ITEMS. The number of active items after + some symbol S cannot be more than the number of times that S + appears as an item, which is SYMBOL_COUNT[S]. + We allocate that much space for each symbol. */ + + CALLOC (kernel_base, nsyms); + if (count) + CALLOC (kernel_items, count); + + count = 0; + for (i = 0; i < nsyms; i++) + { + kernel_base[i] = kernel_items + count; + count += symbol_count[i]; + } + + free (symbol_count); + CALLOC (kernel_size, nsyms); +} + + +static void +allocate_storage (void) +{ + allocate_itemsets (); + + CALLOC (shiftset, nsyms); + CALLOC (redset, nrules); + state_hash_new (); + CALLOC (shift_symbol, nsyms); +} + + +static void +free_storage (void) +{ + free (shift_symbol); + free (redset); + free (shiftset); + free (kernel_base); + free (kernel_size); + XFREE (kernel_items); + state_hash_free (); +} + + + + +/*---------------------------------------------------------------. +| Find which symbols can be shifted in S, and for each one | +| record which items would be active after that shift. Uses the | +| contents of itemset. | +| | +| shift_symbol is set to a vector of the symbols that can be | +| shifted. For each symbol in the grammar, kernel_base[symbol] | +| points to a vector of item numbers activated if that symbol is | +| shifted, and kernel_size[symbol] is their numbers. | +`---------------------------------------------------------------*/ + +static void +new_itemsets (state *s) +{ + int i; + + if (trace_flag & trace_automaton) + fprintf (stderr, "Entering new_itemsets, state = %d\n", s->number); + + for (i = 0; i < nsyms; i++) + kernel_size[i] = 0; + + nshifts = 0; + + for (i = 0; i < nritemset; ++i) + if (ritem[itemset[i]] >= 0) + { + symbol_number sym = item_number_as_symbol_number (ritem[itemset[i]]); + if (!kernel_size[sym]) + { + shift_symbol[nshifts] = sym; + nshifts++; + } + + kernel_base[sym][kernel_size[sym]] = itemset[i] + 1; + kernel_size[sym]++; + } +} + + + +/*--------------------------------------------------------------. +| Find the state we would get to (from the current state) by | +| shifting SYM. Create a new state if no equivalent one exists | +| already. Used by append_states. | +`--------------------------------------------------------------*/ + +static state * +get_state (symbol_number sym, size_t core_size, item_number *core) +{ + state *sp; + + if (trace_flag & trace_automaton) + fprintf (stderr, "Entering get_state, symbol = %d (%s)\n", + sym, symbols[sym]->tag); + + sp = state_hash_lookup (core_size, core); + if (!sp) + sp = state_list_append (sym, core_size, core); + + if (trace_flag & trace_automaton) + fprintf (stderr, "Exiting get_state => %d\n", sp->number); + + return sp; +} + +/*---------------------------------------------------------------. +| Use the information computed by new_itemsets to find the state | +| numbers reached by each shift transition from S. | +| | +| SHIFTSET is set up as a vector of those states. | +`---------------------------------------------------------------*/ + +static void +append_states (state *s) +{ + int i; + + if (trace_flag & trace_automaton) + fprintf (stderr, "Entering append_states, state = %d\n", s->number); + + /* First sort shift_symbol into increasing order. */ + + for (i = 1; i < nshifts; i++) + { + symbol_number sym = shift_symbol[i]; + int j; + for (j = i; 0 < j && sym < shift_symbol [j - 1]; j--) + shift_symbol[j] = shift_symbol[j - 1]; + shift_symbol[j] = sym; + } + + for (i = 0; i < nshifts; i++) + { + symbol_number sym = shift_symbol[i]; + shiftset[i] = get_state (sym, kernel_size[sym], kernel_base[sym]); + } +} + + +/*----------------------------------------------------------------. +| Find which rules can be used for reduction transitions from the | +| current state and make a reductions structure for the state to | +| record their rule numbers. | +`----------------------------------------------------------------*/ + +static void +save_reductions (state *s) +{ + int count = 0; + int i; + + /* Find and count the active items that represent ends of rules. */ + for (i = 0; i < nritemset; ++i) + { + int item = ritem[itemset[i]]; + if (item < 0) + redset[count++] = &rules[item_number_as_rule_number (item)]; + } + + /* Make a reductions structure and copy the data into it. */ + state_reductions_set (s, count, redset); +} + + +/*---------------. +| Build STATES. | +`---------------*/ + +static void +set_states (void) +{ + CALLOC (states, nstates); + + while (first_state) + { + state_list *this = first_state; + + /* Pessimization, but simplification of the code: make sure all + the states have valid transitions and reductions members, + even if reduced to 0. It is too soon for errs, which are + computed later, but set_conflicts. */ + state *s = this->state; + if (!s->transitions) + state_transitions_set (s, 0, 0); + if (!s->reductions) + state_reductions_set (s, 0, 0); + + states[s->number] = s; + + first_state = this->next; + free (this); + } + first_state = NULL; + last_state = NULL; +} + + +/*-------------------------------------------------------------------. +| Compute the nondeterministic finite state machine (see state.h for | +| details) from the grammar. | +`-------------------------------------------------------------------*/ + +void +generate_states (void) +{ + state_list *list = NULL; + allocate_storage (); + new_closure (nritems); + + /* Create the initial state. The 0 at the lhs is the index of the + item of this initial rule. */ + kernel_base[0][0] = 0; + kernel_size[0] = 1; + state_list_append (0, kernel_size[0], kernel_base[0]); + + list = first_state; + + while (list) + { + state *s = list->state; + if (trace_flag & trace_automaton) + fprintf (stderr, "Processing state %d (reached by %s)\n", + s->number, + symbols[s->accessing_symbol]->tag); + /* Set up ruleset and itemset for the transitions out of this + state. ruleset gets a 1 bit for each rule that could reduce + now. itemset gets a vector of all the items that could be + accepted next. */ + closure (s->items, s->nitems); + /* Record the reductions allowed out of this state. */ + save_reductions (s); + /* Find the itemsets of the states that shifts can reach. */ + new_itemsets (s); + /* Find or create the core structures for those states. */ + append_states (s); + + /* Create the shifts structures for the shifts to those states, + now that the state numbers transitioning to are known. */ + state_transitions_set (s, nshifts, shiftset); + + /* states are queued when they are created; process them all. + */ + list = list->next; + } + + /* discard various storage */ + free_closure (); + free_storage (); + + /* Set up STATES. */ + set_states (); +} diff --git a/src/apps/bin/bison/src/LR0.h b/src/apps/bin/bison/src/LR0.h new file mode 100644 index 0000000000..be8cdaa1c1 --- /dev/null +++ b/src/apps/bin/bison/src/LR0.h @@ -0,0 +1,28 @@ +/* Generate the nondeterministic finite state machine for bison, + Copyright 1984, 1986, 1989, 2000, 2001, 2002 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef LR0_H_ +# define LR0_H_ + +# include "state.h" + +void generate_states (void); + +#endif /* !LR0_H_ */ diff --git a/src/apps/bin/bison/src/Makefile.am b/src/apps/bin/bison/src/Makefile.am new file mode 100644 index 0000000000..8f34832968 --- /dev/null +++ b/src/apps/bin/bison/src/Makefile.am @@ -0,0 +1,79 @@ +## Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2 of the License, or +## (at your option) any later version. + +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA +## 02111-1307 USA + +DEFS = @DEFS@ \ + -DPKGDATADIR=\"$(pkgdatadir)\" \ + -DLOCALEDIR=\"$(datadir)/locale\" + +AM_CFLAGS = $(WARNING_CFLAGS) $(WERROR_CFLAGS) +AM_CPPFLAGS = -I$(top_srcdir)/lib -I../lib +AM_YFLAGS = "-dv" + +LDADD = ../lib/libbison.a $(LIBINTL) + +# Use our own Bison to build the parser. Of course, you ought to +# keep a sane version of Bison nearby... +YACC = ../tests/bison -y + +bin_PROGRAMS = bison +bin_SCRIPTS = $(YACC_SCRIPT) +EXTRA_SCRIPTS = yacc + +bison_SOURCES = \ + LR0.c LR0.h \ + assoc.c assoc.h \ + closure.c closure.h \ + complain.c complain.h \ + conflicts.c conflicts.h \ + derives.c derives.h \ + files.c files.h \ + getargs.c getargs.h \ + gram.c gram.h \ + lalr.h lalr.c \ + location.c location.h \ + main.c \ + muscle_tab.c muscle_tab.h \ + nullable.c nullable.h \ + output.c output.h \ + parse-gram.h parse-gram.y \ + print.c print.h \ + print_graph.c print_graph.h \ + reader.c reader.h \ + reduce.c reduce.h \ + relation.c relation.h \ + scan-gram.l \ + scan-skel.l \ + state.c state.h \ + symlist.c symlist.h \ + symtab.c symtab.h \ + system.h \ + tables.h tables.c \ + uniqstr.c uniqstr.h \ + vcg.c vcg.h \ + vcg_defaults.h + +BUILT_SOURCES = scan-skel.c scan-gram.c parse-gram.c parse-gram.h + +MOSTLYCLEANFILES = yacc + +yacc: + echo '#! /bin/sh' >$@ + echo 'exec $(bindir)/bison -y "$$@"' >>$@ + chmod a+x $@ + +echo: + echo $(bison_SOURCES) $(noinst_HEADERS) diff --git a/src/apps/bin/bison/src/Makefile.in b/src/apps/bin/bison/src/Makefile.in new file mode 100644 index 0000000000..878396fe52 --- /dev/null +++ b/src/apps/bin/bison/src/Makefile.in @@ -0,0 +1,623 @@ +# Makefile.in generated by automake 1.8.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ + + +SOURCES = $(bison_SOURCES) + +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +bin_PROGRAMS = bison$(EXEEXT) +subdir = src +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in parse-gram.c \ + scan-gram.c scan-skel.c +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/alloca.m4 \ + $(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dmalloc.m4 \ + $(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/error.m4 \ + $(top_srcdir)/m4/exitfail.m4 $(top_srcdir)/m4/extensions.m4 \ + $(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gnulib.m4 $(top_srcdir)/m4/hard-locale.m4 \ + $(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/m4.m4 \ + $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbstate_t.m4 \ + $(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/obstack.m4 $(top_srcdir)/m4/onceonly.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \ + $(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stpcpy.m4 \ + $(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \ + $(top_srcdir)/m4/subpipe.m4 $(top_srcdir)/m4/timevar.m4 \ + $(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/warning.m4 \ + $(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xstrndup.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = +am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)" +binPROGRAMS_INSTALL = $(INSTALL_PROGRAM) +PROGRAMS = $(bin_PROGRAMS) +am_bison_OBJECTS = LR0.$(OBJEXT) assoc.$(OBJEXT) closure.$(OBJEXT) \ + complain.$(OBJEXT) conflicts.$(OBJEXT) derives.$(OBJEXT) \ + files.$(OBJEXT) getargs.$(OBJEXT) gram.$(OBJEXT) \ + lalr.$(OBJEXT) location.$(OBJEXT) main.$(OBJEXT) \ + muscle_tab.$(OBJEXT) nullable.$(OBJEXT) output.$(OBJEXT) \ + parse-gram.$(OBJEXT) print.$(OBJEXT) print_graph.$(OBJEXT) \ + reader.$(OBJEXT) reduce.$(OBJEXT) relation.$(OBJEXT) \ + scan-gram.$(OBJEXT) scan-skel.$(OBJEXT) state.$(OBJEXT) \ + symlist.$(OBJEXT) symtab.$(OBJEXT) tables.$(OBJEXT) \ + uniqstr.$(OBJEXT) vcg.$(OBJEXT) +bison_OBJECTS = $(am_bison_OBJECTS) +bison_LDADD = $(LDADD) +am__DEPENDENCIES_1 = +bison_DEPENDENCIES = ../lib/libbison.a $(am__DEPENDENCIES_1) +binSCRIPT_INSTALL = $(INSTALL_SCRIPT) +SCRIPTS = $(bin_SCRIPTS) +DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir) +depcomp = $(SHELL) $(top_srcdir)/config/depcomp +am__depfiles_maybe = depfiles +@AMDEP_TRUE@DEP_FILES = ./$(DEPDIR)/LR0.Po ./$(DEPDIR)/assoc.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/closure.Po ./$(DEPDIR)/complain.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/conflicts.Po ./$(DEPDIR)/derives.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/files.Po ./$(DEPDIR)/getargs.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/gram.Po ./$(DEPDIR)/lalr.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/location.Po ./$(DEPDIR)/main.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/muscle_tab.Po ./$(DEPDIR)/nullable.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/output.Po ./$(DEPDIR)/parse-gram.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/print.Po ./$(DEPDIR)/print_graph.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/reader.Po ./$(DEPDIR)/reduce.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/relation.Po ./$(DEPDIR)/scan-gram.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/scan-skel.Po ./$(DEPDIR)/state.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/symlist.Po ./$(DEPDIR)/symtab.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/tables.Po ./$(DEPDIR)/uniqstr.Po \ +@AMDEP_TRUE@ ./$(DEPDIR)/vcg.Po +COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ + $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) +CCLD = $(CC) +LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ +LEXCOMPILE = $(LEX) $(LFLAGS) $(AM_LFLAGS) +YLWRAP = $(top_srcdir)/config/ylwrap +YACCCOMPILE = $(YACC) $(YFLAGS) $(AM_YFLAGS) +SOURCES = $(bison_SOURCES) +DIST_SOURCES = $(bison_SOURCES) +ETAGS = etags +CTAGS = ctags +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALLOCA_H = @ALLOCA_H@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOM4TE = @AUTOM4TE@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ \ + -DPKGDATADIR=\"$(pkgdatadir)\" \ + -DLOCALEDIR=\"$(datadir)/locale\" + +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GCC = @GCC@ +GMSGFMT = @GMSGFMT@ +HAVE__BOOL = @HAVE__BOOL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +O0CFLAGS = @O0CFLAGS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STDBOOL_H = @STDBOOL_H@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VALGRIND = @VALGRIND@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WERROR_CFLAGS = @WERROR_CFLAGS@ +XGETTEXT = @XGETTEXT@ + +# Use our own Bison to build the parser. Of course, you ought to +# keep a sane version of Bison nearby... +YACC = ../tests/bison -y +YACC_LIBRARY = @YACC_LIBRARY@ +YACC_SCRIPT = @YACC_SCRIPT@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +AM_CFLAGS = $(WARNING_CFLAGS) $(WERROR_CFLAGS) +AM_CPPFLAGS = -I$(top_srcdir)/lib -I../lib +AM_YFLAGS = "-dv" +LDADD = ../lib/libbison.a $(LIBINTL) +bin_SCRIPTS = $(YACC_SCRIPT) +EXTRA_SCRIPTS = yacc +bison_SOURCES = \ + LR0.c LR0.h \ + assoc.c assoc.h \ + closure.c closure.h \ + complain.c complain.h \ + conflicts.c conflicts.h \ + derives.c derives.h \ + files.c files.h \ + getargs.c getargs.h \ + gram.c gram.h \ + lalr.h lalr.c \ + location.c location.h \ + main.c \ + muscle_tab.c muscle_tab.h \ + nullable.c nullable.h \ + output.c output.h \ + parse-gram.h parse-gram.y \ + print.c print.h \ + print_graph.c print_graph.h \ + reader.c reader.h \ + reduce.c reduce.h \ + relation.c relation.h \ + scan-gram.l \ + scan-skel.l \ + state.c state.h \ + symlist.c symlist.h \ + symtab.c symtab.h \ + system.h \ + tables.h tables.c \ + uniqstr.c uniqstr.h \ + vcg.c vcg.h \ + vcg_defaults.h + +BUILT_SOURCES = scan-skel.c scan-gram.c parse-gram.c parse-gram.h +MOSTLYCLEANFILES = yacc +all: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) all-am + +.SUFFIXES: +.SUFFIXES: .c .l .o .obj .y +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu src/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +install-binPROGRAMS: $(bin_PROGRAMS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + p1=`echo $$p|sed 's/$(EXEEXT)$$//'`; \ + if test -f $$p \ + ; then \ + f=`echo "$$p1" | sed 's,^.*/,,;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) '$$p' '$(DESTDIR)$(bindir)/$$f'"; \ + $(INSTALL_PROGRAM_ENV) $(binPROGRAMS_INSTALL) "$$p" "$(DESTDIR)$(bindir)/$$f" || exit 1; \ + else :; fi; \ + done + +uninstall-binPROGRAMS: + @$(NORMAL_UNINSTALL) + @list='$(bin_PROGRAMS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's,^.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/'`; \ + echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ + rm -f "$(DESTDIR)$(bindir)/$$f"; \ + done + +clean-binPROGRAMS: + -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) +bison$(EXEEXT): $(bison_OBJECTS) $(bison_DEPENDENCIES) + @rm -f bison$(EXEEXT) + $(LINK) $(bison_LDFLAGS) $(bison_OBJECTS) $(bison_LDADD) $(LIBS) +install-binSCRIPTS: $(bin_SCRIPTS) + @$(NORMAL_INSTALL) + test -z "$(bindir)" || $(mkdir_p) "$(DESTDIR)$(bindir)" + @list='$(bin_SCRIPTS)'; for p in $$list; do \ + if test -f "$$p"; then d=; else d="$(srcdir)/"; fi; \ + if test -f $$d$$p; then \ + f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ + echo " $(binSCRIPT_INSTALL) '$$d$$p' '$(DESTDIR)$(bindir)/$$f'"; \ + $(binSCRIPT_INSTALL) "$$d$$p" "$(DESTDIR)$(bindir)/$$f"; \ + else :; fi; \ + done + +uninstall-binSCRIPTS: + @$(NORMAL_UNINSTALL) + @list='$(bin_SCRIPTS)'; for p in $$list; do \ + f=`echo "$$p" | sed 's|^.*/||;$(transform)'`; \ + echo " rm -f '$(DESTDIR)$(bindir)/$$f'"; \ + rm -f "$(DESTDIR)$(bindir)/$$f"; \ + done + +mostlyclean-compile: + -rm -f *.$(OBJEXT) + +distclean-compile: + -rm -f *.tab.c + +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/LR0.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/assoc.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/closure.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/complain.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/conflicts.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/derives.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/files.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/getargs.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/gram.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/lalr.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/location.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/muscle_tab.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/nullable.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/output.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/parse-gram.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/print_graph.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reader.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/reduce.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/relation.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scan-gram.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/scan-skel.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/state.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symlist.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/symtab.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tables.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uniqstr.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vcg.Po@am__quote@ + +.c.o: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ $<; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c $< + +.c.obj: +@am__fastdepCC_TRUE@ if $(COMPILE) -MT $@ -MD -MP -MF "$(DEPDIR)/$*.Tpo" -c -o $@ `$(CYGPATH_W) '$<'`; \ +@am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/$*.Tpo" "$(DEPDIR)/$*.Po"; else rm -f "$(DEPDIR)/$*.Tpo"; exit 1; fi +@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ depfile='$(DEPDIR)/$*.Po' tmpdepfile='$(DEPDIR)/$*.TPo' @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(COMPILE) -c `$(CYGPATH_W) '$<'` + +.l.c: + $(SHELL) $(YLWRAP) $< $(LEX_OUTPUT_ROOT).c $@ -- $(LEXCOMPILE) + +.y.c: + $(YACCCOMPILE) $< + if test -f y.tab.h; then \ + to=`echo "$*_H" | sed \ + -e 'y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' \ + -e 's/[^ABCDEFGHIJKLMNOPQRSTUVWXYZ]/_/g'`; \ + sed "/^#/ s/Y_TAB_H/$$to/g" y.tab.h >$*.ht; \ + rm -f y.tab.h; \ + if cmp -s $*.ht $*.h; then \ + rm -f $*.ht ;\ + else \ + mv $*.ht $*.h; \ + fi; \ + fi + if test -f y.output; then \ + mv y.output $*.output; \ + fi + sed '/^#/ s|y\.tab\.c|$@|' y.tab.c >$@t && mv $@t $@ + rm -f y.tab.c +uninstall-info-am: + +ID: $(HEADERS) $(SOURCES) $(LISP) $(TAGS_FILES) + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + mkid -fID $$unique +tags: TAGS + +TAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + if test -z "$(ETAGS_ARGS)$$tags$$unique"; then :; else \ + test -n "$$unique" || unique=$$empty_fix; \ + $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ + $$tags $$unique; \ + fi +ctags: CTAGS +CTAGS: $(HEADERS) $(SOURCES) $(TAGS_DEPENDENCIES) \ + $(TAGS_FILES) $(LISP) + tags=; \ + here=`pwd`; \ + list='$(SOURCES) $(HEADERS) $(LISP) $(TAGS_FILES)'; \ + unique=`for i in $$list; do \ + if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ + done | \ + $(AWK) ' { files[$$0] = 1; } \ + END { for (i in files) print i; }'`; \ + test -z "$(CTAGS_ARGS)$$tags$$unique" \ + || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ + $$tags $$unique + +GTAGS: + here=`$(am__cd) $(top_builddir) && pwd` \ + && cd $(top_srcdir) \ + && gtags -i $(GTAGS_ARGS) $$here + +distclean-tags: + -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am +check: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) check-am +all-am: Makefile $(PROGRAMS) $(SCRIPTS) +installdirs: + for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(bindir)"; do \ + test -z "$$dir" || $(mkdir_p) "$$dir"; \ + done +install: $(BUILT_SOURCES) + $(MAKE) $(AM_MAKEFLAGS) install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + -test -z "$(MOSTLYCLEANFILES)" || rm -f $(MOSTLYCLEANFILES) + +clean-generic: + +distclean-generic: + -rm -f $(CONFIG_CLEAN_FILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -rm -f scan-gram.c + -test -z "$(BUILT_SOURCES)" || rm -f $(BUILT_SOURCES) + -rm -f scan-skel.c + -rm -f parse-gram.c +clean: clean-am + +clean-am: clean-binPROGRAMS clean-generic mostlyclean-am + +distclean: distclean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +distclean-am: clean-am distclean-compile distclean-generic \ + distclean-tags + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: install-binPROGRAMS install-binSCRIPTS + +install-info: install-info-am + +install-man: + +installcheck-am: + +maintainer-clean: maintainer-clean-am + -rm -rf ./$(DEPDIR) + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-compile mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-binPROGRAMS uninstall-binSCRIPTS \ + uninstall-info-am + +.PHONY: CTAGS GTAGS all all-am check check-am clean clean-binPROGRAMS \ + clean-generic ctags distclean distclean-compile \ + distclean-generic distclean-tags distdir dvi dvi-am html \ + html-am info info-am install install-am install-binPROGRAMS \ + install-binSCRIPTS install-data install-data-am install-exec \ + install-exec-am install-info install-info-am install-man \ + install-strip installcheck installcheck-am installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-compile mostlyclean-generic pdf pdf-am ps ps-am \ + tags uninstall uninstall-am uninstall-binPROGRAMS \ + uninstall-binSCRIPTS uninstall-info-am + + +yacc: + echo '#! /bin/sh' >$@ + echo 'exec $(bindir)/bison -y "$$@"' >>$@ + chmod a+x $@ + +echo: + echo $(bison_SOURCES) $(noinst_HEADERS) +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/apps/bin/bison/src/assoc.c b/src/apps/bin/bison/src/assoc.c new file mode 100644 index 0000000000..a63fc191fc --- /dev/null +++ b/src/apps/bin/bison/src/assoc.c @@ -0,0 +1,44 @@ +/* Associativity information. + Copyright (C) 2002 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include "system.h" + +#include "assoc.h" + + +const char * +assoc_to_string (assoc a) +{ + switch (a) + { + case undef_assoc: + return "undefined associativity"; + + case right_assoc: + return "%right"; + + case left_assoc: + return "%left"; + + case non_assoc: + return "%nonassoc"; + } + return NULL; +} diff --git a/src/apps/bin/bison/src/assoc.h b/src/apps/bin/bison/src/assoc.h new file mode 100644 index 0000000000..97a6b28bcc --- /dev/null +++ b/src/apps/bin/bison/src/assoc.h @@ -0,0 +1,35 @@ +/* Associativity information. + Copyright (C) 2002 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef ASSOC_H_ +# define ASSOC_H_ + +/* Associativity values for tokens and rules. */ +typedef enum +{ + undef_assoc, + right_assoc, + left_assoc, + non_assoc +} assoc; + +char const *assoc_to_string (assoc); + +#endif /* !ASSOC_H_ */ diff --git a/src/apps/bin/bison/src/bison.rdef b/src/apps/bin/bison/src/bison.rdef new file mode 100644 index 0000000000..be216d9102 --- /dev/null +++ b/src/apps/bin/bison/src/bison.rdef @@ -0,0 +1,11 @@ +resource app_version +{ + major = 1, + middle = 8, + minor = 75, + variety = 5, + internal = 0, + short_info = "1.875d", + long_info = "1.875d ©2004 The Free Software Foundation" +}; + diff --git a/src/apps/bin/bison/src/closure.c b/src/apps/bin/bison/src/closure.c new file mode 100644 index 0000000000..228056f7bb --- /dev/null +++ b/src/apps/bin/bison/src/closure.c @@ -0,0 +1,247 @@ +/* Closures for Bison + + Copyright (C) 1984, 1989, 2000, 2001, 2002 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + +#include "system.h" + +#include +#include +#include +#include + +#include "closure.h" +#include "derives.h" +#include "getargs.h" +#include "gram.h" +#include "reader.h" +#include "symtab.h" + +/* NITEMSET is the size of the array ITEMSET. */ +item_number *itemset; +int nritemset; + +static bitset ruleset; + +/* internal data. See comments before set_fderives and set_firsts. */ +static bitsetv fderives = NULL; +static bitsetv firsts = NULL; + +/* Retrieve the FDERIVES/FIRSTS sets of the nonterminals numbered Var. */ +#define FDERIVES(Var) fderives[(Var) - ntokens] +#define FIRSTS(Var) firsts[(Var) - ntokens] + + +/*-----------------. +| Debugging code. | +`-----------------*/ + +static void +print_closure (char const *title, item_number *array, size_t size) +{ + size_t i; + fprintf (stderr, "Closure: %s\n", title); + for (i = 0; i < size; ++i) + { + item_number *rp; + fprintf (stderr, " %2d: .", array[i]); + for (rp = &ritem[array[i]]; *rp >= 0; ++rp) + fprintf (stderr, " %s", symbols[*rp]->tag); + fprintf (stderr, " (rule %d)\n", -*rp - 1); + } + fputs ("\n\n", stderr); +} + + +static void +print_firsts (void) +{ + symbol_number i, j; + + fprintf (stderr, "FIRSTS\n"); + for (i = ntokens; i < nsyms; i++) + { + bitset_iterator iter; + fprintf (stderr, "\t%s firsts\n", symbols[i]->tag); + BITSET_FOR_EACH (iter, FIRSTS (i), j, 0) + { + fprintf (stderr, "\t\t%s\n", + symbols[j + ntokens]->tag); + } + } + fprintf (stderr, "\n\n"); +} + + +static void +print_fderives (void) +{ + int i; + rule_number r; + + fprintf (stderr, "FDERIVES\n"); + for (i = ntokens; i < nsyms; i++) + { + bitset_iterator iter; + fprintf (stderr, "\t%s derives\n", symbols[i]->tag); + BITSET_FOR_EACH (iter, FDERIVES (i), r, 0) + { + fprintf (stderr, "\t\t%3d ", r); + rule_rhs_print (&rules[r], stderr); + } + } + fprintf (stderr, "\n\n"); +} + +/*------------------------------------------------------------------. +| Set FIRSTS to be an NVARS array of NVARS bitsets indicating which | +| items can represent the beginning of the input corresponding to | +| which other items. | +| | +| For example, if some rule expands symbol 5 into the sequence of | +| symbols 8 3 20, the symbol 8 can be the beginning of the data for | +| symbol 5, so the bit [8 - ntokens] in first[5 - ntokens] (= FIRST | +| (5)) is set. | +`------------------------------------------------------------------*/ + +static void +set_firsts (void) +{ + symbol_number i, j; + + firsts = bitsetv_create (nvars, nvars, BITSET_FIXED); + + for (i = ntokens; i < nsyms; i++) + for (j = 0; derives[i - ntokens][j]; ++j) + { + item_number sym = derives[i - ntokens][j]->rhs[0]; + if (ISVAR (sym)) + bitset_set (FIRSTS (i), sym - ntokens); + } + + if (trace_flag & trace_sets) + bitsetv_matrix_dump (stderr, "RTC: Firsts Input", firsts); + bitsetv_reflexive_transitive_closure (firsts); + if (trace_flag & trace_sets) + bitsetv_matrix_dump (stderr, "RTC: Firsts Output", firsts); + + if (trace_flag & trace_sets) + print_firsts (); +} + +/*-------------------------------------------------------------------. +| Set FDERIVES to an NVARS by NRULES matrix of bits indicating which | +| rules can help derive the beginning of the data for each | +| nonterminal. | +| | +| For example, if symbol 5 can be derived as the sequence of symbols | +| 8 3 20, and one of the rules for deriving symbol 8 is rule 4, then | +| the [5 - NTOKENS, 4] bit in FDERIVES is set. | +`-------------------------------------------------------------------*/ + +static void +set_fderives (void) +{ + symbol_number i, j; + rule_number k; + + fderives = bitsetv_create (nvars, nrules, BITSET_FIXED); + + set_firsts (); + + for (i = ntokens; i < nsyms; ++i) + for (j = ntokens; j < nsyms; ++j) + if (bitset_test (FIRSTS (i), j - ntokens)) + for (k = 0; derives[j - ntokens][k]; ++k) + bitset_set (FDERIVES (i), derives[j - ntokens][k]->number); + + if (trace_flag & trace_sets) + print_fderives (); + + bitsetv_free (firsts); +} + + + +void +new_closure (int n) +{ + CALLOC (itemset, n); + + ruleset = bitset_create (nrules, BITSET_FIXED); + + set_fderives (); +} + + + +void +closure (item_number *core, int n) +{ + /* Index over CORE. */ + int c; + + /* A bit index over RULESET. */ + rule_number ruleno; + + bitset_iterator iter; + + if (trace_flag & trace_sets) + print_closure ("input", core, n); + + bitset_zero (ruleset); + + for (c = 0; c < n; ++c) + if (ISVAR (ritem[core[c]])) + bitset_or (ruleset, ruleset, FDERIVES (ritem[core[c]])); + + nritemset = 0; + c = 0; + BITSET_FOR_EACH (iter, ruleset, ruleno, 0) + { + item_number itemno = rules[ruleno].rhs - ritem; + while (c < n && core[c] < itemno) + { + itemset[nritemset] = core[c]; + nritemset++; + c++; + } + itemset[nritemset] = itemno; + nritemset++; + }; + + while (c < n) + { + itemset[nritemset] = core[c]; + nritemset++; + c++; + } + + if (trace_flag & trace_sets) + print_closure ("output", itemset, nritemset); +} + + +void +free_closure (void) +{ + XFREE (itemset); + bitset_free (ruleset); + bitsetv_free (fderives); +} diff --git a/src/apps/bin/bison/src/closure.h b/src/apps/bin/bison/src/closure.h new file mode 100644 index 0000000000..8cc4feb251 --- /dev/null +++ b/src/apps/bin/bison/src/closure.h @@ -0,0 +1,59 @@ +/* Subroutines for bison + + Copyright (C) 1984, 1989, 2000, 2001, 2002 Free Software + Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + +#ifndef CLOSURE_H_ +# define CLOSURE_H_ + +# include "gram.h" + +/* Allocates the itemset and ruleset vectors, and precomputes useful + data so that closure can be called. n is the number of elements to + allocate for itemset. */ + +void new_closure (int n); + + +/* Given the kernel (aka core) of a state (a vector of item numbers + ITEMS, of length N), set up RULESET and ITEMSET to indicate what + rules could be run and which items could be accepted when those + items are the active ones. + + RULESET contains a bit for each rule. CLOSURE sets the bits for + all rules which could potentially describe the next input to be + read. + + ITEMSET is a vector of item numbers; NITEMSET is its size + (actually, points to just beyond the end of the part of it that is + significant). CLOSURE places there the indices of all items which + represent units of input that could arrive next. */ + +void closure (item_number *items, int n); + + +/* Frees ITEMSET, RULESET and internal data. */ + +void free_closure (void); + +extern item_number *itemset; +extern int nritemset; + +#endif /* !CLOSURE_H_ */ diff --git a/src/apps/bin/bison/src/complain.c b/src/apps/bin/bison/src/complain.c new file mode 100644 index 0000000000..8a192bd26c --- /dev/null +++ b/src/apps/bin/bison/src/complain.c @@ -0,0 +1,145 @@ +/* Declaration for error-reporting function for Bison. + Copyright (C) 2000, 2001, 2002, 2004 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +/* Based on error.c and error.h, + written by David MacKenzie . */ + +#include "system.h" + +#include + +#include "complain.h" +#include "files.h" + +/* The calling program should define program_name and set it to the + name of the executing program. */ +extern char *program_name; + +/* This variable is set each time `warn' is called. */ +bool warning_issued; + +/* This variable is set each time `complain' is called. */ +bool complaint_issued; + + +/*--------------------------------. +| Report a warning, and proceed. | +`--------------------------------*/ + +void +warn_at (location loc, const char *message, ...) +{ + va_list args; + + location_print (stderr, loc); + fputs (": ", stderr); + fputs (_("warning: "), stderr); + + va_start (args, message); + vfprintf (stderr, message, args); + va_end (args); + + warning_issued = true; + putc ('\n', stderr); +} + +void +warn (const char *message, ...) +{ + va_list args; + + fprintf (stderr, "%s: %s", current_file ? current_file : program_name, _("warning: ")); + + va_start (args, message); + vfprintf (stderr, message, args); + va_end (args); + + warning_issued = true; + putc ('\n', stderr); +} + +/*-----------------------------------------------------------. +| An error has occurred, but we can proceed, and die later. | +`-----------------------------------------------------------*/ + +void +complain_at (location loc, const char *message, ...) +{ + va_list args; + + location_print (stderr, loc); + fputs (": ", stderr); + + va_start (args, message); + vfprintf (stderr, message, args); + va_end (args); + + complaint_issued = true; + putc ('\n', stderr); +} + +void +complain (const char *message, ...) +{ + va_list args; + + fprintf (stderr, "%s: ", current_file ? current_file : program_name); + + va_start (args, message); + vfprintf (stderr, message, args); + va_end (args); + + complaint_issued = true; + putc ('\n', stderr); +} + +/*-------------------------------------------------. +| A severe error has occurred, we cannot proceed. | +`-------------------------------------------------*/ + +void +fatal_at (location loc, const char *message, ...) +{ + va_list args; + + location_print (stderr, loc); + fputs (": ", stderr); + fputs (_("fatal error: "), stderr); + + va_start (args, message); + vfprintf (stderr, message, args); + va_end (args); + putc ('\n', stderr); + exit (EXIT_FAILURE); +} + +void +fatal (const char *message, ...) +{ + va_list args; + + fprintf (stderr, "%s: ", current_file ? current_file : program_name); + + fputs (_("fatal error: "), stderr); + + va_start (args, message); + vfprintf (stderr, message, args); + va_end (args); + putc ('\n', stderr); + exit (EXIT_FAILURE); +} diff --git a/src/apps/bin/bison/src/complain.h b/src/apps/bin/bison/src/complain.h new file mode 100644 index 0000000000..b9b00c6661 --- /dev/null +++ b/src/apps/bin/bison/src/complain.h @@ -0,0 +1,62 @@ +/* Declaration for error-reporting function for Bison. + Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by the + Free Software Foundation; either version 2, or (at your option) any + later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, + USA. */ + +#ifndef COMPLAIN_H_ +# define COMPLAIN_H_ 1 + +# include "location.h" + +# ifdef __cplusplus +extern "C" { +# endif + +/* Informative messages, but we proceed. */ + +void warn (char const *format, ...) + __attribute__ ((__format__ (__printf__, 1, 2))); + +void warn_at (location loc, char const *format, ...) + __attribute__ ((__format__ (__printf__, 2, 3))); + +/* Something bad happened, but let's continue and die later. */ + +void complain (char const *format, ...) + __attribute__ ((__format__ (__printf__, 1, 2))); + +void complain_at (location loc, char const *format, ...) + __attribute__ ((__format__ (__printf__, 2, 3))); + +/* Something bad happened, and let's die now. */ + +void fatal (char const *format, ...) + __attribute__ ((__noreturn__, __format__ (__printf__, 1, 2))); + +void fatal_at (location loc, char const *format, ...) + __attribute__ ((__noreturn__, __format__ (__printf__, 2, 3))); + +/* This variable is set each time `warn' is called. */ +extern bool warning_issued; + +/* This variable is set each time `complain' is called. */ +extern bool complaint_issued; + +# ifdef __cplusplus +} +# endif + +#endif /* !COMPLAIN_H_ */ diff --git a/src/apps/bin/bison/src/conflicts.c b/src/apps/bin/bison/src/conflicts.c new file mode 100644 index 0000000000..2edd1e8b3b --- /dev/null +++ b/src/apps/bin/bison/src/conflicts.c @@ -0,0 +1,529 @@ +/* Find and resolve or report look-ahead conflicts for bison, + + Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002, 2003, 2004 + Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + +#include "system.h" + +#include + +#include "LR0.h" +#include "complain.h" +#include "conflicts.h" +#include "files.h" +#include "getargs.h" +#include "gram.h" +#include "lalr.h" +#include "reader.h" +#include "state.h" +#include "symtab.h" + +/* -1 stands for not specified. */ +int expected_sr_conflicts = -1; +int expected_rr_conflicts = -1; +static char *conflicts = NULL; +struct obstack solved_conflicts_obstack; + +static bitset shiftset; +static bitset lookaheadset; + + + +enum conflict_resolution + { + shift_resolution, + reduce_resolution, + left_resolution, + right_resolution, + nonassoc_resolution + }; + + +/*----------------------------------------------------------------. +| Explain how an SR conflict between TOKEN and RULE was resolved: | +| RESOLUTION. | +`----------------------------------------------------------------*/ + +static inline void +log_resolution (rule *r, symbol_number token, + enum conflict_resolution resolution) +{ + if (report_flag & report_solved_conflicts) + { + /* The description of the resolution. */ + switch (resolution) + { + case shift_resolution: + case right_resolution: + obstack_fgrow2 (&solved_conflicts_obstack, + _("\ + Conflict between rule %d and token %s resolved as shift"), + r->number, + symbols[token]->tag); + break; + case reduce_resolution: + case left_resolution: + obstack_fgrow2 (&solved_conflicts_obstack, + _("\ + Conflict between rule %d and token %s resolved as reduce"), + r->number, + symbols[token]->tag); + break; + case nonassoc_resolution: + obstack_fgrow2 (&solved_conflicts_obstack, + _("\ + Conflict between rule %d and token %s resolved as an error"), + r->number, + symbols[token]->tag); + break; + } + + /* The reason. */ + switch (resolution) + { + case shift_resolution: + obstack_fgrow2 (&solved_conflicts_obstack, + " (%s < %s)", + r->prec->tag, + symbols[token]->tag); + break; + + case reduce_resolution: + obstack_fgrow2 (&solved_conflicts_obstack, + " (%s < %s)", + symbols[token]->tag, + r->prec->tag); + break; + + case left_resolution: + obstack_fgrow1 (&solved_conflicts_obstack, + " (%%left %s)", + symbols[token]->tag); + break; + + case right_resolution: + obstack_fgrow1 (&solved_conflicts_obstack, + " (%%right %s)", + symbols[token]->tag); + break; + case nonassoc_resolution: + obstack_fgrow1 (&solved_conflicts_obstack, + " (%%nonassoc %s)", + symbols[token]->tag); + break; + } + obstack_sgrow (&solved_conflicts_obstack, ".\n"); + } +} + + +/*------------------------------------------------------------------. +| Turn off the shift recorded for the specified token in the | +| specified state. Used when we resolve a shift-reduce conflict in | +| favor of the reduction. | +`------------------------------------------------------------------*/ + +static void +flush_shift (state *s, int token) +{ + transitions *trans = s->transitions; + int i; + + bitset_reset (lookaheadset, token); + for (i = 0; i < trans->num; i++) + if (!TRANSITION_IS_DISABLED (trans, i) + && TRANSITION_SYMBOL (trans, i) == token) + TRANSITION_DISABLE (trans, i); +} + + +/*-------------------------------------------------------------------. +| Turn off the reduce recorded for the specified token for the | +| specified lookahead. Used when we resolve a shift-reduce conflict | +| in favor of the shift. | +`-------------------------------------------------------------------*/ + +static void +flush_reduce (bitset lookaheads, int token) +{ + bitset_reset (lookaheads, token); +} + + +/*------------------------------------------------------------------. +| Attempt to resolve shift-reduce conflict for one rule by means of | +| precedence declarations. It has already been checked that the | +| rule has a precedence. A conflict is resolved by modifying the | +| shift or reduce tables so that there is no longer a conflict. | +| | +| LOOKAHEAD is the number of the lookahead bitset to consider. | +| | +| ERRORS can be used to store discovered explicit errors. | +`------------------------------------------------------------------*/ + +static void +resolve_sr_conflict (state *s, int ruleno, symbol **errors) +{ + symbol_number i; + reductions *reds = s->reductions; + /* Find the rule to reduce by to get precedence of reduction. */ + rule *redrule = reds->rules[ruleno]; + int redprec = redrule->prec->prec; + bitset lookaheads = reds->lookaheads[ruleno]; + int nerrs = 0; + + for (i = 0; i < ntokens; i++) + if (bitset_test (lookaheads, i) + && bitset_test (lookaheadset, i) + && symbols[i]->prec) + { + /* Shift-reduce conflict occurs for token number i + and it has a precedence. + The precedence of shifting is that of token i. */ + if (symbols[i]->prec < redprec) + { + log_resolution (redrule, i, reduce_resolution); + flush_shift (s, i); + } + else if (symbols[i]->prec > redprec) + { + log_resolution (redrule, i, shift_resolution); + flush_reduce (lookaheads, i); + } + else + /* Matching precedence levels. + For left association, keep only the reduction. + For right association, keep only the shift. + For nonassociation, keep neither. */ + + switch (symbols[i]->assoc) + { + case right_assoc: + log_resolution (redrule, i, right_resolution); + flush_reduce (lookaheads, i); + break; + + case left_assoc: + log_resolution (redrule, i, left_resolution); + flush_shift (s, i); + break; + + case non_assoc: + log_resolution (redrule, i, nonassoc_resolution); + flush_shift (s, i); + flush_reduce (lookaheads, i); + /* Record an explicit error for this token. */ + errors[nerrs++] = symbols[i]; + break; + + case undef_assoc: + abort (); + } + } + + if (nerrs) + { + /* Some tokens have been explicitly made errors. Allocate a + permanent errs structure for this state, to record them. */ + state_errs_set (s, nerrs, errors); + } + + if (obstack_object_size (&solved_conflicts_obstack)) + { + obstack_1grow (&solved_conflicts_obstack, '\0'); + s->solved_conflicts = obstack_finish (&solved_conflicts_obstack); + } +} + + +/*-------------------------------------------------------------------. +| Solve the S/R conflicts of state S using the | +| precedence/associativity, and flag it inconsistent if it still has | +| conflicts. ERRORS can be used as storage to compute the list of | +| lookaheads on which S raises a syntax error (%nonassoc). | +`-------------------------------------------------------------------*/ + +static void +set_conflicts (state *s, symbol **errors) +{ + int i; + transitions *trans = s->transitions; + reductions *reds = s->reductions; + + if (s->consistent) + return; + + bitset_zero (lookaheadset); + + FOR_EACH_SHIFT (trans, i) + bitset_set (lookaheadset, TRANSITION_SYMBOL (trans, i)); + + /* Loop over all rules which require lookahead in this state. First + check for shift-reduce conflict, and try to resolve using + precedence. */ + for (i = 0; i < reds->num; ++i) + if (reds->rules[i]->prec && reds->rules[i]->prec->prec + && !bitset_disjoint_p (reds->lookaheads[i], lookaheadset)) + resolve_sr_conflict (s, i, errors); + + /* Loop over all rules which require lookahead in this state. Check + for conflicts not resolved above. */ + for (i = 0; i < reds->num; ++i) + { + if (!bitset_disjoint_p (reds->lookaheads[i], lookaheadset)) + conflicts[s->number] = 1; + + bitset_or (lookaheadset, lookaheadset, reds->lookaheads[i]); + } +} + + +/*----------------------------------------------------------------. +| Solve all the S/R conflicts using the precedence/associativity, | +| and flag as inconsistent the states that still have conflicts. | +`----------------------------------------------------------------*/ + +void +conflicts_solve (void) +{ + state_number i; + /* List of lookaheads on which we explicitly raise a syntax error. */ + symbol **errors = MALLOC (errors, ntokens + 1); + + CALLOC (conflicts, nstates); + shiftset = bitset_create (ntokens, BITSET_FIXED); + lookaheadset = bitset_create (ntokens, BITSET_FIXED); + obstack_init (&solved_conflicts_obstack); + + for (i = 0; i < nstates; i++) + { + set_conflicts (states[i], errors); + + /* For uniformity of the code, make sure all the states have a valid + `errs' member. */ + if (!states[i]->errs) + states[i]->errs = errs_new (0, 0); + } + + free (errors); +} + + +/*---------------------------------------------. +| Count the number of shift/reduce conflicts. | +`---------------------------------------------*/ + +static int +count_sr_conflicts (state *s) +{ + int i; + int src_count = 0; + transitions *trans = s->transitions; + reductions *reds = s->reductions; + + if (!trans) + return 0; + + bitset_zero (lookaheadset); + bitset_zero (shiftset); + + FOR_EACH_SHIFT (trans, i) + bitset_set (shiftset, TRANSITION_SYMBOL (trans, i)); + + for (i = 0; i < reds->num; ++i) + bitset_or (lookaheadset, lookaheadset, reds->lookaheads[i]); + + bitset_and (lookaheadset, lookaheadset, shiftset); + + src_count = bitset_count (lookaheadset); + + return src_count; +} + + +/*----------------------------------------------------------------. +| Count the number of reduce/reduce conflicts. If ONE_PER_TOKEN, | +| count one conflict for each token that has any reduce/reduce | +| conflicts. Otherwise, count one conflict for each pair of | +| conflicting reductions. | ++`----------------------------------------------------------------*/ + +static int +count_rr_conflicts (state *s, bool one_per_token) +{ + int i; + reductions *reds = s->reductions; + int rrc_count = 0; + + for (i = 0; i < ntokens; i++) + { + int count = 0; + int j; + for (j = 0; j < reds->num; ++j) + if (bitset_test (reds->lookaheads[j], i)) + count++; + + if (count >= 2) + rrc_count += one_per_token ? 1 : count-1; + } + + return rrc_count; +} + + +/*--------------------------------------------------------. +| Report the number of conflicts, using the Yacc format. | +`--------------------------------------------------------*/ + +static void +conflict_report (FILE *out, int src_num, int rrc_num) +{ + if (src_num && rrc_num) + fprintf (out, _("conflicts: %d shift/reduce, %d reduce/reduce\n"), + src_num, rrc_num); + else if (src_num) + fprintf (out, _("conflicts: %d shift/reduce\n"), src_num); + else if (rrc_num) + fprintf (out, _("conflicts: %d reduce/reduce\n"), rrc_num); +} + + +/*-----------------------------------------------------------. +| Output the detailed description of states with conflicts. | +`-----------------------------------------------------------*/ + +void +conflicts_output (FILE *out) +{ + bool printed_sth = false; + state_number i; + for (i = 0; i < nstates; i++) + { + state *s = states[i]; + if (conflicts[i]) + { + fprintf (out, _("State %d "), i); + conflict_report (out, count_sr_conflicts (s), + count_rr_conflicts (s, true)); + printed_sth = true; + } + } + if (printed_sth) + fputs ("\n\n", out); +} + +/*--------------------------------------------------------. +| Total the number of S/R and R/R conflicts. Unlike the | +| code in conflicts_output, however, count EACH pair of | +| reductions for the same state and lookahead as one | +| conflict. | +`--------------------------------------------------------*/ + +int +conflicts_total_count (void) +{ + state_number i; + int count; + + /* Conflicts by state. */ + count = 0; + for (i = 0; i < nstates; i++) + if (conflicts[i]) + { + count += count_sr_conflicts (states[i]); + count += count_rr_conflicts (states[i], false); + } + return count; +} + + +/*------------------------------------------. +| Reporting the total number of conflicts. | +`------------------------------------------*/ + +void +conflicts_print (void) +{ + /* Is the number of SR conflicts OK? Either EXPECTED_CONFLICTS is + not set, and then we want 0 SR, or else it is specified, in which + case we want equality. */ + bool src_ok = false; + bool rrc_ok = false; + + int src_total = 0; + int rrc_total = 0; + + /* Conflicts by state. */ + { + state_number i; + + for (i = 0; i < nstates; i++) + if (conflicts[i]) + { + src_total += count_sr_conflicts (states[i]); + rrc_total += count_rr_conflicts (states[i], true); + } + } + + if (! glr_parser && rrc_total > 0 && expected_rr_conflicts != -1) + { + warn (_("%%expect-rr applies only to GLR parsers")); + expected_rr_conflicts = -1; + } + + src_ok = + src_total == (expected_sr_conflicts == -1 ? 0 : expected_sr_conflicts); + rrc_ok = + rrc_total == (expected_rr_conflicts == -1 ? 0 : expected_rr_conflicts); + + /* If there are as many RR conflicts and SR conflicts as + expected, then there is nothing to report. */ + if (rrc_ok && src_ok) + return; + + /* Report the total number of conflicts on STDERR. */ + if (! yacc_flag) + fprintf (stderr, "%s: ", current_file); + conflict_report (stderr, src_total, rrc_total); + + if (expected_sr_conflicts != -1 || expected_rr_conflicts != -1) + { + int sr = expected_sr_conflicts == -1 ? 0 : expected_sr_conflicts; + int rr = expected_rr_conflicts == -1 ? 0 : expected_rr_conflicts; + if (! src_ok) + warn (ngettext ("expected %d shift/reduce conflict", + "expected %d shift/reduce conflicts", + sr), sr); + if (! rrc_ok) + warn (ngettext ("expected %d reduce/reduce conflict", + "expected %d reduce/reduce conflicts", + rr), rr); + } +} + + +void +conflicts_free (void) +{ + XFREE (conflicts); + bitset_free (shiftset); + bitset_free (lookaheadset); + obstack_free (&solved_conflicts_obstack, NULL); +} diff --git a/src/apps/bin/bison/src/conflicts.h b/src/apps/bin/bison/src/conflicts.h new file mode 100644 index 0000000000..fdf8389302 --- /dev/null +++ b/src/apps/bin/bison/src/conflicts.h @@ -0,0 +1,34 @@ +/* Find and resolve or report look-ahead conflicts for bison, + Copyright (C) 2000, 2001, 2002, 2004 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + +#ifndef CONFLICTS_H_ +# define CONFLICTS_H_ +# include "state.h" + +void conflicts_solve (void); +void conflicts_print (void); +int conflicts_total_count (void); +void conflicts_output (FILE *out); +void conflicts_free (void); + +/* Were there conflicts? */ +extern int expected_sr_conflicts; +extern int expected_rr_conflicts; +#endif /* !CONFLICTS_H_ */ diff --git a/src/apps/bin/bison/src/derives.c b/src/apps/bin/bison/src/derives.c new file mode 100644 index 0000000000..7e20fe5a29 --- /dev/null +++ b/src/apps/bin/bison/src/derives.c @@ -0,0 +1,121 @@ +/* Match rules with nonterminals for bison, + + Copyright (C) 1984, 1989, 2000, 2001, 2002, 2003 Free Software + Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + +#include "system.h" + +#include "getargs.h" + +#include "derives.h" +#include "gram.h" +#include "reader.h" +#include "symtab.h" + +/* Linked list of rule numbers. */ +typedef struct rule_list +{ + struct rule_list *next; + rule *value; +} rule_list; + +rule ***derives = NULL; + +static void +print_derives (void) +{ + int i; + + fputs ("DERIVES\n", stderr); + + for (i = ntokens; i < nsyms; i++) + { + rule **rp; + fprintf (stderr, "\t%s derives\n", symbols[i]->tag); + for (rp = derives[i - ntokens]; *rp; ++rp) + { + fprintf (stderr, "\t\t%3d ", (*rp)->user_number); + rule_rhs_print (*rp, stderr); + } + } + + fputs ("\n\n", stderr); +} + + +void +derives_compute (void) +{ + symbol_number i; + rule_number r; + rule **q; + + /* DSET[NTERM - NTOKENS] -- A linked list of the numbers of the rules + whose LHS is NTERM. */ + rule_list **dset = CALLOC (dset, nvars); + + /* DELTS[RULE] -- There are NRULES rule number to attach to nterms. + Instead of performing NRULES allocations for each, have an array + indexed by rule numbers. */ + rule_list *delts = CALLOC (delts, nrules); + + for (r = nrules - 1; r >= 0; --r) + { + symbol_number lhs = rules[r].lhs->number; + rule_list *p = &delts[r]; + /* A new LHS is found. */ + p->next = dset[lhs - ntokens]; + p->value = &rules[r]; + dset[lhs - ntokens] = p; + } + + /* DSET contains what we need under the form of a linked list. Make + it a single array. */ + + CALLOC (derives, nvars); + CALLOC (q, nvars + nrules); + + for (i = ntokens; i < nsyms; i++) + { + rule_list *p = dset[i - ntokens]; + derives[i - ntokens] = q; + while (p) + { + *q++ = p->value; + p = p->next; + } + *q++ = NULL; + } + + if (trace_flag & trace_sets) + print_derives (); + + free (dset); + free (delts); +} + + +void +derives_free (void) +{ + XFREE (derives[0]); + XFREE (derives); +} diff --git a/src/apps/bin/bison/src/derives.h b/src/apps/bin/bison/src/derives.h new file mode 100644 index 0000000000..df6dde8ae2 --- /dev/null +++ b/src/apps/bin/bison/src/derives.h @@ -0,0 +1,37 @@ +/* Match rules with nonterminals for bison, + + Copyright (C) 1984, 1989, 2000, 2001, 2002 Free Software + Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef DERIVES_H_ +# define DERIVES_H_ + +# include "gram.h" + +/* DERIVES[SYMBOL - NTOKENS] points to a vector of the rules that + SYMBOL derives, terminated with NULL. */ +extern rule ***derives; + +/* Compute DERIVES. */ + +void derives_compute (void); +void derives_free (void); + +#endif /* !DERIVES_H_ */ diff --git a/src/apps/bin/bison/src/files.c b/src/apps/bin/bison/src/files.c new file mode 100644 index 0000000000..32a3e729c9 --- /dev/null +++ b/src/apps/bin/bison/src/files.c @@ -0,0 +1,338 @@ +/* Open and close files for Bison. + + Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004 + Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + + +#include "system.h" + +#include +#include +#include +#include + +#include "complain.h" +#include "files.h" +#include "getargs.h" +#include "gram.h" + +/* From basename.c. Almost a lie, as it returns a char *. */ +const char *base_name (char const *name); + +FILE *finput = NULL; + +struct obstack pre_prologue_obstack; +struct obstack post_prologue_obstack; + +/* Initializing some values below (such SPEC_NAME_PREFIX to `yy') is + tempting, but don't do that: for the time being our handling of the + %directive vs --option leaves precedence to the options by deciding + that if a %directive sets a variable which is really set (i.e., not + NULL), then the %directive is ignored. As a result, %name-prefix, + for instance, will not be honored. */ + +char *spec_outfile = NULL; /* for -o. */ +char *spec_file_prefix = NULL; /* for -b. */ +const char *spec_name_prefix = NULL; /* for -p. */ +char *spec_verbose_file = NULL; /* for --verbose. */ +char *spec_graph_file = NULL; /* for -g. */ +char *spec_defines_file = NULL; /* for --defines. */ +char *parser_file_name = NULL; + +uniqstr grammar_file = NULL; +uniqstr current_file = NULL; + +static char *full_base_name = NULL; + +/* Prefix used to generate output file names. */ +char *short_base_name = NULL; + +/* C source file extension (the parser source). */ +const char *src_extension = NULL; +/* Header file extension (if option ``-d'' is specified). */ +const char *header_extension = NULL; + +/*-----------------------------------------------------------------. +| Return a newly allocated string composed of the concatenation of | +| STR1, and STR2. | +`-----------------------------------------------------------------*/ + +static char * +concat2 (char const *str1, char const *str2) +{ + size_t len = strlen (str1) + strlen (str2); + char *res = xmalloc (len + 1); + char *cp; + cp = stpcpy (res, str1); + cp = stpcpy (cp, str2); + return res; +} + +/*-----------------------------------------------------------------. +| Try to open file NAME with mode MODE, and print an error message | +| if fails. | +`-----------------------------------------------------------------*/ + +FILE * +xfopen (const char *name, const char *mode) +{ + FILE *ptr; + + ptr = fopen (name, mode); + if (!ptr) + error (EXIT_FAILURE, get_errno (), _("cannot open file `%s'"), name); + + return ptr; +} + +/*-------------------------------------------------------------. +| Try to close file PTR, and print an error message if fails. | +`-------------------------------------------------------------*/ + +void +xfclose (FILE *ptr) +{ + if (ptr == NULL) + return; + + if (ferror (ptr)) + error (EXIT_FAILURE, 0, _("I/O error")); + + if (fclose (ptr) != 0) + error (EXIT_FAILURE, get_errno (), _("cannot close file")); +} + + +/*---------------------------------------------------------------------. +| Compute FULL_BASE_NAME, SHORT_BASE_NAME and output files extensions. | +`---------------------------------------------------------------------*/ + +/* Replace all characters FROM by TO in the string IN. + and returns a new allocated string. */ +static char * +tr (const char *in, char from, char to) +{ + char *temp; + char *out = xmalloc (strlen (in) + 1); + + for (temp = out; *in; in++, out++) + if (*in == from) + *out = to; + else + *out = *in; + *out = 0; + return (temp); +} + +/* Compute extensions from the grammar file extension. */ +static void +compute_exts_from_gf (const char *ext) +{ + src_extension = tr (ext, 'y', 'c'); + src_extension = tr (src_extension, 'Y', 'C'); + header_extension = tr (ext, 'y', 'h'); + header_extension = tr (header_extension, 'Y', 'H'); +} + +/* Compute extensions from the given c source file extension. */ +static void +compute_exts_from_src (const char *ext) +{ + /* We use this function when the user specifies `-o' or `--output', + so the extenions must be computed unconditionally from the file name + given by this option. */ + src_extension = xstrdup (ext); + header_extension = tr (ext, 'c', 'h'); + header_extension = tr (header_extension, 'C', 'H'); +} + + +/* Decompose FILENAME in four parts: *BASE, *TAB, and *EXT, the fourth + part, (the directory) is ranging from FILENAME to the char before + *BASE, so we don't need an additional parameter. + + *EXT points to the last period in the basename, or NULL if none. + + If there is no *EXT, *TAB is NULL. Otherwise, *TAB points to + `.tab' or `_tab' if present right before *EXT, or is NULL. *TAB + cannot be equal to *BASE. + + None are allocated, they are simply pointers to parts of FILENAME. + Examples: + + '/tmp/foo.tab.c' -> *BASE = 'foo.tab.c', *TAB = '.tab.c', *EXT = + '.c' + + 'foo.c' -> *BASE = 'foo.c', *TAB = NULL, *EXT = '.c' + + 'tab.c' -> *BASE = 'tab.c', *TAB = NULL, *EXT = '.c' + + '.tab.c' -> *BASE = '.tab.c', *TAB = NULL, *EXT = '.c' + + 'foo.tab' -> *BASE = 'foo.tab', *TAB = NULL, *EXT = '.tab' + + 'foo_tab' -> *BASE = 'foo_tab', *TAB = NULL, *EXT = NULL + + 'foo' -> *BASE = 'foo', *TAB = NULL, *EXT = NULL. */ + +static void +filename_split (const char *filename, + const char **base, const char **tab, const char **ext) +{ + *base = base_name (filename); + + /* Look for the extension, i.e., look for the last dot. */ + *ext = strrchr (*base, '.'); + *tab = NULL; + + /* If there is an extension, check if there is a `.tab' part right + before. */ + if (*ext) + { + size_t baselen = *ext - *base; + size_t dottablen = 4; + if (dottablen < baselen + && (strncmp (*ext - dottablen, ".tab", dottablen) == 0 + || strncmp (*ext - dottablen, "_tab", dottablen) == 0)) + *tab = *ext - dottablen; + } +} + + +/* FIXME: Should use xstrndup. */ + +static void +compute_base_names (void) +{ + const char *base, *tab, *ext; + + /* If --output=foo.c was specified (SPEC_OUTFILE == foo.c), + FULL_BASE_NAME and SHORT_BASE_NAME are `foo'. + + If --output=foo.tab.c was specified, FULL_BASE_NAME is `foo.tab' + and SHORT_BASE_NAME is `foo'. + + The precise -o name will be used for FTABLE. For other output + files, remove the ".c" or ".tab.c" suffix. */ + if (spec_outfile) + { + filename_split (spec_outfile, &base, &tab, &ext); + + /* The full base name goes up the EXT, excluding it. */ + full_base_name = + xstrndup (spec_outfile, + (strlen (spec_outfile) - (ext ? strlen (ext) : 0))); + + /* The short base name goes up to TAB, excluding it. */ + short_base_name = + xstrndup (spec_outfile, + (strlen (spec_outfile) + - (tab ? strlen (tab) : (ext ? strlen (ext) : 0)))); + + if (ext) + compute_exts_from_src (ext); + } + + /* If --file-prefix=foo was specified, FULL_BASE_NAME = `foo.tab' + and SHORT_BASE_NAME = `foo'. + + Construct names from it. */ + else + { + if (spec_file_prefix) + { + /* If --file-prefix=foo was specified, SHORT_BASE_NAME = + `foo'. */ + short_base_name = xstrdup (spec_file_prefix); + } + else if (yacc_flag) + { + /* If --yacc, then the output is `y.tab.c'. */ + short_base_name = xstrdup ("y"); + } + else + { + /* Otherwise, the short base name is computed from the input + grammar: `foo/bar.yy' => `bar'. */ + filename_split (grammar_file, &base, &tab, &ext); + short_base_name = + xstrndup (base, + (strlen (base) - (ext ? strlen (ext) : 0))); + } + + full_base_name = xmalloc (strlen (short_base_name) + + strlen (TAB_EXT) + 1); + stpcpy (stpcpy (full_base_name, short_base_name), TAB_EXT); + + /* Compute the extensions from the grammar file name. */ + filename_split (grammar_file, &base, &tab, &ext); + if (ext && !yacc_flag) + compute_exts_from_gf (ext); + } +} + + +/* Compute the output file names. Warn if we detect conflicting + outputs to the same file. */ + +void +compute_output_file_names (void) +{ + char const *name[4]; + int i; + int j; + int names = 0; + + compute_base_names (); + + /* If not yet done. */ + if (!src_extension) + src_extension = ".c"; + if (!header_extension) + header_extension = ".h"; + + name[names++] = parser_file_name = + spec_outfile ? spec_outfile : concat2 (full_base_name, src_extension); + + if (defines_flag) + { + if (! spec_defines_file) + spec_defines_file = concat2 (full_base_name, header_extension); + name[names++] = spec_defines_file; + } + + if (graph_flag) + { + if (! spec_graph_file) + spec_graph_file = concat2 (short_base_name, ".vcg"); + name[names++] = spec_graph_file; + } + + if (report_flag) + { + spec_verbose_file = concat2 (short_base_name, OUTPUT_EXT); + name[names++] = spec_verbose_file; + } + + for (j = 0; j < names; j++) + for (i = 0; i < j; i++) + if (strcmp (name[i], name[j]) == 0) + warn (_("conflicting outputs to file %s"), quote (name[i])); +} diff --git a/src/apps/bin/bison/src/files.h b/src/apps/bin/bison/src/files.h new file mode 100644 index 0000000000..bf7e2c7733 --- /dev/null +++ b/src/apps/bin/bison/src/files.h @@ -0,0 +1,71 @@ +/* File names and variables for bison, + Copyright (C) 1984, 1989, 2000, 2001, 2002 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef FILES_H_ +# define FILES_H_ + +# include "uniqstr.h" + +/* File name specified with -o for the output file, or 0 if no -o. */ +extern char *spec_outfile; + +/* File name for the parser (i.e., the one above, or its default.) */ +extern char *parser_file_name; + +/* Symbol prefix specified with -p, or 0 if no -p. */ +extern const char *spec_name_prefix; + +/* File name prefix specified with -b, or 0 if no -b. */ +extern char *spec_file_prefix; + +/* --verbose. */ +extern char *spec_verbose_file; + +/* File name specified for the output VCG graph. */ +extern char *spec_graph_file; + +/* File name specified with --defines. */ +extern char *spec_defines_file; + +/* Read grammar specifications. */ +extern FILE *finput; + + +/* If semantic parser, output a .h file that defines YYSTYPE... */ +extern struct obstack pre_prologue_obstack; +extern struct obstack post_prologue_obstack; + +/* The file name as given on the command line. + Not named "input_file" because Flex uses this name for an argument, + and therefore GCC warns about a name clash. */ +extern uniqstr grammar_file; + +/* The current file name. Might change with %include, or with #line. */ +extern uniqstr current_file; + +void compute_output_file_names (void); + +FILE *xfopen (const char *name, const char *mode); +void xfclose (FILE *ptr); + +/* Prefix used to generate output file names. */ +extern char *short_base_name; + +#endif /* !FILES_H_ */ diff --git a/src/apps/bin/bison/src/getargs.c b/src/apps/bin/bison/src/getargs.c new file mode 100644 index 0000000000..ba7627efbe --- /dev/null +++ b/src/apps/bin/bison/src/getargs.c @@ -0,0 +1,445 @@ +/* Parse command line arguments for Bison. + + Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004 + Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + +#include "system.h" + +#include +#include + +/* Hack to get to declare getopt with a prototype. */ +#if lint && ! defined __GNU_LIBRARY__ +# define __GNU_LIBRARY__ +# define HACK_FOR___GNU_LIBRARY___PROTOTYPE 1 +#endif + +#include + +#ifdef HACK_FOR___GNU_LIBRARY___PROTOTYPE +# undef __GNU_LIBRARY__ +# undef HACK_FOR___GNU_LIBRARY___PROTOTYPE +#endif + +#include "complain.h" +#include "files.h" +#include "getargs.h" +#include "uniqstr.h" + +bool debug_flag; +bool defines_flag; +bool locations_flag; +bool no_lines_flag; +bool no_parser_flag; +int report_flag = report_none; +bool token_table_flag; +bool yacc_flag; /* for -y */ +bool graph_flag; +int trace_flag = trace_none; + +bool nondeterministic_parser = false; +bool glr_parser = false; +bool pure_parser = false; + +const char *skeleton = NULL; +const char *include = NULL; + +extern char *program_name; + + +/*---------------------. +| --trace's handling. | +`---------------------*/ + +static const char * const trace_args[] = +{ + /* In a series of synonyms, present the most meaningful first, so + that argmatch_valid be more readable. */ + "none - no report", + "scan - grammar scanner traces", + "parse - grammar parser traces", + "automaton - contruction of the automaton", + "bitsets - use of bitsets", + "grammar - reading, reducing of the grammar", + "resource - memory consumption (where available)", + "sets - grammar sets: firsts, nullable etc.", + "tools - m4 invocation and preserve the temporary file", + "skeleton - skeleton postprocessing", + "time - time consumption", + "all - all of the above", + 0 +}; + +static const int trace_types[] = +{ + trace_none, + trace_scan, + trace_parse, + trace_automaton, + trace_bitsets, + trace_grammar, + trace_resource, + trace_sets, + trace_tools, + trace_skeleton, + trace_time, + trace_all +}; + + +static void +trace_argmatch (char *args) +{ + verify (trace_constraint, ARGMATCH_CONSTRAINT (trace_args, trace_types)); + if (args) + { + args = strtok (args, ","); + do + { + int trace = XARGMATCH ("--trace", args, + trace_args, trace_types); + if (trace == trace_none) + trace_flag = trace_none; + else + trace_flag |= trace; + } + while ((args = strtok (NULL, ","))); + } + else + trace_flag = trace_all; +} + + +/*----------------------. +| --report's handling. | +`----------------------*/ + +static const char * const report_args[] = +{ + /* In a series of synonyms, present the most meaningful first, so + that argmatch_valid be more readable. */ + "none", + "state", "states", + "itemset", "itemsets", + "lookahead", "lookaheads", + "solved", + "all", + 0 +}; + +static const int report_types[] = +{ + report_none, + report_states, report_states, + report_states | report_itemsets, report_states | report_itemsets, + report_states | report_lookaheads, report_states | report_lookaheads, + report_states | report_solved_conflicts, + report_all +}; + + +static void +report_argmatch (char *args) +{ + verify (report_constraint, ARGMATCH_CONSTRAINT (report_args, report_types)); + args = strtok (args, ","); + do + { + int report = XARGMATCH ("--report", args, + report_args, report_types); + if (report == report_none) + report_flag = report_none; + else + report_flag |= report; + } + while ((args = strtok (NULL, ","))); +} + + +/*-------------------------------------------. +| Display the help message and exit STATUS. | +`-------------------------------------------*/ + +static void usage (int) ATTRIBUTE_NORETURN; + +static void +usage (int status) +{ + if (status != 0) + fprintf (stderr, _("Try `%s --help' for more information.\n"), + program_name); + else + { + /* Some efforts were made to ease the translators' task, please + continue. */ + fputs (_("\ +GNU bison generates parsers for LALR(1) grammars.\n"), stdout); + putc ('\n', stdout); + + fprintf (stdout, _("\ +Usage: %s [OPTION]... FILE\n"), program_name); + putc ('\n', stdout); + + fputs (_("\ +If a long option shows an argument as mandatory, then it is mandatory\n\ +for the equivalent short option also. Similarly for optional arguments.\n"), + stdout); + putc ('\n', stdout); + + fputs (_("\ +Operation modes:\n\ + -h, --help display this help and exit\n\ + -V, --version output version information and exit\n\ + -y, --yacc emulate POSIX yacc\n"), stdout); + putc ('\n', stdout); + + fputs (_("\ +Parser:\n\ + -S, --skeleton=FILE specify the skeleton to use\n\ + -t, --debug instrument the parser for debugging\n\ + --locations enable locations computation\n\ + -p, --name-prefix=PREFIX prepend PREFIX to the external symbols\n\ + -l, --no-lines don't generate `#line' directives\n\ + -n, --no-parser generate the tables only\n\ + -k, --token-table include a table of token names\n\ +"), stdout); + putc ('\n', stdout); + + fputs (_("\ +Output:\n\ + -d, --defines also produce a header file\n\ + -r, --report=THINGS also produce details on the automaton\n\ + -v, --verbose same as `--report=state'\n\ + -b, --file-prefix=PREFIX specify a PREFIX for output files\n\ + -o, --output=FILE leave output to FILE\n\ + -g, --graph also produce a VCG description of the automaton\n\ +"), stdout); + putc ('\n', stdout); + + fputs (_("\ +THINGS is a list of comma separated words that can include:\n\ + `state' describe the states\n\ + `itemset' complete the core item sets with their closure\n\ + `lookahead' explicitly associate lookaheads to items\n\ + `solved' describe shift/reduce conflicts solving\n\ + `all' include all the above information\n\ + `none' disable the report\n\ +"), stdout); + putc ('\n', stdout); + + fputs (_("\ +Report bugs to .\n"), stdout); + } + + exit (status); +} + + +/*------------------------------. +| Display the version message. | +`------------------------------*/ + +static void +version (void) +{ + /* Some efforts were made to ease the translators' task, please + continue. */ + printf (_("bison (GNU Bison) %s"), VERSION); + putc ('\n', stdout); + fputs (_("Written by Robert Corbett and Richard Stallman.\n"), stdout); + putc ('\n', stdout); + + fprintf (stdout, + _("Copyright (C) %d Free Software Foundation, Inc.\n"), 2004); + + fputs (_("\ +This is free software; see the source for copying conditions. There is NO\n\ +warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.\n\ +"), + stdout); +} + + +/*----------------------. +| Process the options. | +`----------------------*/ + +/* Shorts options. */ +const char *short_options = "yvegdhr:ltknVo:b:p:S:T::"; + +/* Values for long options that do not have single-letter equivalents. */ +enum +{ + LOCATIONS_OPTION = CHAR_MAX + 1 +}; + +static struct option const long_options[] = +{ + /* Operation modes. */ + { "help", no_argument, 0, 'h' }, + { "version", no_argument, 0, 'V' }, + + /* Parser. */ + { "name-prefix", required_argument, 0, 'p' }, + { "include", required_argument, 0, 'I' }, + + /* Output. */ + { "file-prefix", required_argument, 0, 'b' }, + { "output", required_argument, 0, 'o' }, + { "output-file", required_argument, 0, 'o' }, + { "graph", optional_argument, 0, 'g' }, + { "report", required_argument, 0, 'r' }, + { "verbose", no_argument, 0, 'v' }, + + /* Hidden. */ + { "trace", optional_argument, 0, 'T' }, + + /* Output. */ + { "defines", optional_argument, 0, 'd' }, + + /* Operation modes. */ + { "fixed-output-files", no_argument, 0, 'y' }, + { "yacc", no_argument, 0, 'y' }, + + /* Parser. */ + { "debug", no_argument, 0, 't' }, + { "locations", no_argument, 0, LOCATIONS_OPTION }, + { "no-lines", no_argument, 0, 'l' }, + { "no-parser", no_argument, 0, 'n' }, + { "raw", no_argument, 0, 0 }, + { "skeleton", required_argument, 0, 'S' }, + { "token-table", no_argument, 0, 'k' }, + + {0, 0, 0, 0} +}; + +/* Under DOS, there is no difference on the case. This can be + troublesome when looking for `.tab' etc. */ +#ifdef MSDOS +# define AS_FILE_NAME(File) (strlwr (File), (File)) +#else +# define AS_FILE_NAME(File) (File) +#endif + +void +getargs (int argc, char *argv[]) +{ + int c; + + while ((c = getopt_long (argc, argv, short_options, long_options, NULL)) + != -1) + switch (c) + { + case 0: + /* Certain long options cause getopt_long to return 0. */ + break; + + case 'y': + yacc_flag = true; + break; + + case 'h': + usage (EXIT_SUCCESS); + + case 'V': + version (); + exit (EXIT_SUCCESS); + + case 'g': + /* Here, the -g and --graph=FILE options are differentiated. */ + graph_flag = true; + if (optarg) + spec_graph_file = AS_FILE_NAME (optarg); + break; + + case 'v': + report_flag |= report_states; + break; + + case 'S': + skeleton = AS_FILE_NAME (optarg); + break; + + case 'I': + include = AS_FILE_NAME (optarg); + break; + + case 'd': + /* Here, the -d and --defines options are differentiated. */ + defines_flag = true; + if (optarg) + spec_defines_file = AS_FILE_NAME (optarg); + break; + + case 'l': + no_lines_flag = true; + break; + + case LOCATIONS_OPTION: + locations_flag = true; + break; + + case 'k': + token_table_flag = true; + break; + + case 'n': + no_parser_flag = true; + break; + + case 't': + debug_flag = true; + break; + + case 'o': + spec_outfile = AS_FILE_NAME (optarg); + break; + + case 'b': + spec_file_prefix = AS_FILE_NAME (optarg); + break; + + case 'p': + spec_name_prefix = optarg; + break; + + case 'r': + report_argmatch (optarg); + break; + + case 'T': + trace_argmatch (optarg); + break; + + default: + usage (EXIT_FAILURE); + } + + if (argc - optind != 1) + { + if (argc - optind < 1) + error (0, 0, _("missing operand after `%s'"), argv[argc - 1]); + else + error (0, 0, _("extra operand `%s'"), argv[optind + 1]); + usage (EXIT_FAILURE); + } + + current_file = grammar_file = uniqstr_new (argv[optind]); +} diff --git a/src/apps/bin/bison/src/getargs.h b/src/apps/bin/bison/src/getargs.h new file mode 100644 index 0000000000..630e8ced28 --- /dev/null +++ b/src/apps/bin/bison/src/getargs.h @@ -0,0 +1,87 @@ +/* Parse command line arguments for bison. + Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003 + Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + +#ifndef GETARGS_H_ +# define GETARGS_H_ + +/* flags set by % directives */ +extern const char *skeleton; /* for -S */ +extern const char *include; /* for -I */ + +extern bool debug_flag; /* for -t */ +extern bool defines_flag; /* for -d */ +extern bool locations_flag; +extern bool no_lines_flag; /* for -l */ +extern bool no_parser_flag; /* for -n */ +extern bool token_table_flag; /* for -k */ +extern bool graph_flag; /* for -g */ +extern bool yacc_flag; /* for -y */ + +/* GLR_PARSER is true if the input file says to use the GLR + (Generalized LR) parser, and to output some additional information + used by the GLR algorithm. */ + +extern bool glr_parser; + +/* PURE_PARSER is true if should generate a parser that is all pure + and reentrant. */ + +extern bool pure_parser; + +/* NONDETERMINISTIC_PARSER is true iff conflicts are accepted. This + is used by the GLR parser, and might be used in BackTracking + parsers too. */ + +extern bool nondeterministic_parser; + +/* --trace. */ +enum trace + { + trace_none = 0, + trace_scan = 1 << 0, + trace_parse = 1 << 1, + trace_resource = 1 << 2, + trace_sets = 1 << 3, + trace_bitsets = 1 << 4, + trace_tools = 1 << 5, + trace_automaton = 1 << 6, + trace_grammar = 1 << 7, + trace_time = 1 << 8, + trace_skeleton = 1 << 9, + trace_all = ~0 + }; +extern int trace_flag; + +/* --report. */ +enum report + { + report_none = 0, + report_states = 1 << 0, + report_itemsets = 1 << 1, + report_lookaheads = 1 << 2, + report_solved_conflicts = 1 << 3, + report_all = ~0 + }; +extern int report_flag; + +void getargs (int argc, char *argv[]); + +#endif /* !GETARGS_H_ */ diff --git a/src/apps/bin/bison/src/gram.c b/src/apps/bin/bison/src/gram.c new file mode 100644 index 0000000000..223b736d47 --- /dev/null +++ b/src/apps/bin/bison/src/gram.c @@ -0,0 +1,335 @@ +/* Allocate input grammar variables for Bison. + + Copyright (C) 1984, 1986, 1989, 2001, 2002, 2003 Free Software + Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + +#include "system.h" + +#include + +#include "gram.h" +#include "reader.h" +#include "reduce.h" +#include "symtab.h" + +/* Comments for these variables are in gram.h. */ + +item_number *ritem = NULL; +unsigned int nritems = 0; + +rule *rules = NULL; +rule_number nrules = 0; + +symbol **symbols = NULL; +int nsyms = 0; +int ntokens = 1; +int nvars = 0; + +symbol_number *token_translations = NULL; + +int max_user_token_number = 256; + +/*--------------------------------------------------------------. +| Return true IFF the rule has a `number' smaller than NRULES. | +`--------------------------------------------------------------*/ + +bool +rule_useful_p (rule *r) +{ + return r->number < nrules; +} + + +/*-------------------------------------------------------------. +| Return true IFF the rule has a `number' higher than NRULES. | +`-------------------------------------------------------------*/ + +bool +rule_useless_p (rule *r) +{ + return r->number >= nrules; +} + + +/*--------------------------------------------------------------------. +| Return true IFF the rule is not flagged as useful *and* is useful. | +| In other words, it was discarded because of conflicts. | +`--------------------------------------------------------------------*/ + +bool +rule_never_reduced_p (rule *r) +{ + return !r->useful && r->number < nrules; +} + + +/*----------------------------------------------------------------. +| Print this RULE's number and lhs on OUT. If a PREVIOUS_LHS was | +| already displayed (by a previous call for another rule), avoid | +| useless repetitions. | +`----------------------------------------------------------------*/ + +void +rule_lhs_print (rule *r, symbol *previous_lhs, FILE *out) +{ + fprintf (out, " %3d ", r->number); + if (previous_lhs != r->lhs) + { + fprintf (out, "%s:", r->lhs->tag); + } + else + { + int n; + for (n = strlen (previous_lhs->tag); n > 0; --n) + fputc (' ', out); + fputc ('|', out); + } +} + + +/*--------------------------------------. +| Return the number of symbols in RHS. | +`--------------------------------------*/ + +int +rule_rhs_length (rule *r) +{ + int res = 0; + item_number *rhsp; + for (rhsp = r->rhs; *rhsp >= 0; ++rhsp) + ++res; + return res; +} + + +/*-------------------------------. +| Print this rule's RHS on OUT. | +`-------------------------------*/ + +void +rule_rhs_print (rule *r, FILE *out) +{ + if (*r->rhs >= 0) + { + item_number *rp; + for (rp = r->rhs; *rp >= 0; rp++) + fprintf (out, " %s", symbols[*rp]->tag); + fputc ('\n', out); + } + else + { + fprintf (out, " /* %s */\n", _("empty")); + } +} + + +/*-------------------------. +| Print this rule on OUT. | +`-------------------------*/ + +void +rule_print (rule *r, FILE *out) +{ + fprintf (out, "%s:", r->lhs->tag); + rule_rhs_print (r, out); +} + + +/*------------------------. +| Dump RITEM for traces. | +`------------------------*/ + +void +ritem_print (FILE *out) +{ + unsigned int i; + fputs ("RITEM\n", out); + for (i = 0; i < nritems; ++i) + if (ritem[i] >= 0) + fprintf (out, " %s", symbols[ritem[i]]->tag); + else + fprintf (out, " (rule %d)\n", item_number_as_rule_number (ritem[i])); + fputs ("\n\n", out); +} + + +/*------------------------------------------. +| Return the size of the longest rule RHS. | +`------------------------------------------*/ + +size_t +ritem_longest_rhs (void) +{ + int max = 0; + rule_number r; + + for (r = 0; r < nrules; ++r) + { + int length = rule_rhs_length (&rules[r]); + if (length > max) + max = length; + } + + return max; +} + + +/*-----------------------------------------------------------------. +| Print the grammar's rules that match FILTER on OUT under TITLE. | +`-----------------------------------------------------------------*/ + +void +grammar_rules_partial_print (FILE *out, const char *title, + rule_filter filter) +{ + rule_number r; + bool first = true; + symbol *previous_lhs = NULL; + + /* rule # : LHS -> RHS */ + for (r = 0; r < nrules + nuseless_productions; r++) + { + if (filter && !filter (&rules[r])) + continue; + if (first) + fprintf (out, "%s\n\n", title); + else if (previous_lhs && previous_lhs != rules[r].lhs) + fputc ('\n', out); + first = false; + rule_lhs_print (&rules[r], previous_lhs, out); + rule_rhs_print (&rules[r], out); + previous_lhs = rules[r].lhs; + } + if (!first) + fputs ("\n\n", out); +} + + +/*------------------------------------------. +| Print the grammar's useful rules on OUT. | +`------------------------------------------*/ + +void +grammar_rules_print (FILE *out) +{ + grammar_rules_partial_print (out, _("Grammar"), rule_useful_p); +} + + +/*-------------------. +| Dump the grammar. | +`-------------------*/ + +void +grammar_dump (FILE *out, const char *title) +{ + fprintf (out, "%s\n\n", title); + fprintf (out, + "ntokens = %d, nvars = %d, nsyms = %d, nrules = %d, nritems = %d\n\n", + ntokens, nvars, nsyms, nrules, nritems); + + + fprintf (out, "Variables\n---------\n\n"); + { + symbol_number i; + fprintf (out, "Value Sprec Sassoc Tag\n"); + + for (i = ntokens; i < nsyms; i++) + fprintf (out, "%5d %5d %5d %s\n", + i, + symbols[i]->prec, symbols[i]->assoc, + symbols[i]->tag); + fprintf (out, "\n\n"); + } + + fprintf (out, "Rules\n-----\n\n"); + { + rule_number i; + fprintf (out, "Num (Prec, Assoc, Useful, Ritem Range) Lhs -> Rhs (Ritem range) [Num]\n"); + for (i = 0; i < nrules + nuseless_productions; i++) + { + rule *rule_i = &rules[i]; + item_number *rp = NULL; + unsigned int rhs_itemno = rule_i->rhs - ritem; + unsigned int rhs_count = 0; + /* Find the last RHS index in ritems. */ + for (rp = rule_i->rhs; *rp >= 0; ++rp) + ++rhs_count; + fprintf (out, "%3d (%2d, %2d, %2d, %2u-%2u) %2d ->", + i, + rule_i->prec ? rule_i->prec->prec : 0, + rule_i->prec ? rule_i->prec->assoc : 0, + rule_i->useful, + rhs_itemno, + rhs_itemno + rhs_count - 1, + rule_i->lhs->number); + /* Dumped the RHS. */ + for (rp = rule_i->rhs; *rp >= 0; rp++) + fprintf (out, " %3d", *rp); + fprintf (out, " [%d]\n", item_number_as_rule_number (*rp)); + } + } + fprintf (out, "\n\n"); + + fprintf (out, "Rules interpreted\n-----------------\n\n"); + { + rule_number r; + for (r = 0; r < nrules + nuseless_productions; r++) + { + fprintf (out, "%-5d ", r); + rule_print (&rules[r], out); + } + } + fprintf (out, "\n\n"); +} + + +/*------------------------------------------------------------------. +| Report on STDERR the rules that are not flagged USEFUL, using the | +| MESSAGE (which can be `useless rule' when invoked after grammar | +| reduction, or `never reduced' after conflicts were taken into | +| account). | +`------------------------------------------------------------------*/ + +void +grammar_rules_never_reduced_report (const char *message) +{ + rule_number r; + for (r = 0; r < nrules ; ++r) + if (!rules[r].useful) + { + location_print (stderr, rules[r].location); + fprintf (stderr, ": %s: %s: ", + _("warning"), message); + rule_print (&rules[r], stderr); + } +} + +void +grammar_free (void) +{ + XFREE (ritem); + free (rules); + XFREE (token_translations); + /* Free the symbol table data structure. */ + symbols_free (); + free_merger_functions (); +} diff --git a/src/apps/bin/bison/src/gram.h b/src/apps/bin/bison/src/gram.h new file mode 100644 index 0000000000..caae4847b9 --- /dev/null +++ b/src/apps/bin/bison/src/gram.h @@ -0,0 +1,260 @@ +/* Data definitions for internal representation of Bison's input. + + Copyright (C) 1984, 1986, 1989, 1992, 2001, 2002, 2003, 2004 + Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef GRAM_H_ +# define GRAM_H_ + +/* Representation of the grammar rules: + + NTOKENS is the number of tokens, and NVARS is the number of + variables (nonterminals). NSYMS is the total number, ntokens + + nvars. + + Each symbol (either token or variable) receives a symbol number. + Numbers 0 to NTOKENS - 1 are for tokens, and NTOKENS to NSYMS - 1 + are for variables. Symbol number zero is the end-of-input token. + This token is counted in ntokens. The true number of token values + assigned is NTOKENS reduced by one for each alias declaration. + + The rules receive rule numbers 1 to NRULES in the order they are + written. More precisely Bison augments the grammar with the + initial rule, `$accept: START-SYMBOL $end', which is numbered 1, + all the user rules are 2, 3 etc. Each time a rule number is + presented to the user, we subtract 1, so *displayed* rule numbers + are 0, 1, 2... + + Internally, we cannot use the number 0 for a rule because for + instance RITEM stores both symbol (the RHS) and rule numbers: the + symbols are shorts >= 0, and rule number are stored negative. + Therefore 0 cannot be used, since it would be both the rule number + 0, and the token $end). + + Actions are accessed via the rule number. + + The rules themselves are described by several arrays: amongst which + RITEM, and RULES. + + RULES is an array of rules, whose members are: + + RULES[R].lhs -- the symbol of the left hand side of rule R. + + RULES[R].rhs -- the index in RITEM of the beginning of the portion + for rule R. + + RULES[R].prec -- the symbol providing the precedence level of R. + + RULES[R].precsym -- the symbol attached (via %prec) to give its + precedence to R. Of course, if set, it is equal to `prec', but we + need to distinguish one from the other when reducing: a symbol used + in a %prec is not useless. + + RULES[R].assoc -- the associativity of R. + + RULES[R].dprec -- the dynamic precedence level of R (for GLR + parsing). + + RULES[R].merger -- index of merging function for R (for GLR + parsing). + + RULES[R].line -- the line where R was defined. + + RULES[R].useful -- true iff the rule is used (i.e., false if thrown + away by reduce). + + The right hand side is stored as symbol numbers in a portion of + RITEM. + + The length of the portion is one greater than the number of symbols + in the rule's right hand side. The last element in the portion + contains minus R, which identifies it as the end of a portion and + says which rule it is for. + + The portions of RITEM come in order of increasing rule number. + NRITEMS is the total length of RITEM. Each element of RITEM is + called an "item" and its index in RITEM is an item number. + + Item numbers are used in the finite state machine to represent + places that parsing can get to. + + SYMBOLS[I]->prec records the precedence level of each symbol. + + Precedence levels are assigned in increasing order starting with 1 + so that numerically higher precedence values mean tighter binding + as they ought to. Zero as a symbol or rule's precedence means none + is assigned. + + Associativities are recorded similarly in SYMBOLS[I]->assoc. */ + +# include "location.h" +# include "symtab.h" + +# define ISTOKEN(i) ((i) < ntokens) +# define ISVAR(i) ((i) >= ntokens) + +extern int nsyms; +extern int ntokens; +extern int nvars; + +typedef int item_number; +extern item_number *ritem; +extern unsigned int nritems; + +/* There is weird relationship between OT1H item_number and OTOH + symbol_number and rule_number: we store the latter in + item_number. symbol_number values are stored as-is, while + the negation of (rule_number + 1) is stored. + + Therefore, a symbol_number must be a valid item_number, and we + sometimes have to perform the converse transformation. */ + +static inline item_number +symbol_number_as_item_number (symbol_number sym) +{ + return sym; +} + +static inline symbol_number +item_number_as_symbol_number (item_number i) +{ + return i; +} + +/* Rule numbers. */ +typedef short int rule_number; +extern rule_number nrules; + +static inline item_number +rule_number_as_item_number (rule_number r) +{ + return -1 - r; +} + +static inline rule_number +item_number_as_rule_number (item_number i) +{ + return -1 - i; +} + + +/*--------. +| Rules. | +`--------*/ + +typedef struct +{ + /* The number of the rule in the source. It is usually the index in + RULES too, except if there are useless rules. */ + rule_number user_number; + + /* The index in RULES. Usually the rule number in the source, + except if some rules are useless. */ + rule_number number; + + symbol *lhs; + item_number *rhs; + + /* This symbol provides both the associativity, and the precedence. */ + symbol *prec; + + short int dprec; + short int merger; + + /* This symbol was attached to the rule via %prec. */ + symbol *precsym; + + location location; + bool useful; + + const char *action; + location action_location; +} rule; + +extern rule *rules; + +/* A function that selects a rule. */ +typedef bool (*rule_filter) (rule *); + +/* Return true IFF the rule has a `number' smaller than NRULES. */ +bool rule_useful_p (rule *r); + +/* Return true IFF the rule has a `number' higher than NRULES. */ +bool rule_useless_p (rule *r); + +/* Return true IFF the rule is not flagged as useful *and* is useful. + In other words, it was discarded because of conflicts. */ +bool rule_never_reduced_p (rule *r); + +/* Print this rule's number and lhs on OUT. If a PREVIOUS_LHS was + already displayed (by a previous call for another rule), avoid + useless repetitions. */ +void rule_lhs_print (rule *r, symbol *previous_lhs, FILE *out); + +/* Return the length of the RHS. */ +int rule_rhs_length (rule *r); + +/* Print this rule's RHS on OUT. */ +void rule_rhs_print (rule *r, FILE *out); + +/* Print this rule on OUT. */ +void rule_print (rule *r, FILE *out); + + + + +/* Table of the symbols, indexed by the symbol number. */ +extern symbol **symbols; + +/* TOKEN_TRANSLATION -- a table indexed by a token number as returned + by the user's yylex routine, it yields the internal token number + used by the parser and throughout bison. */ +extern symbol_number *token_translations; +extern int max_user_token_number; + + + +/* Dump RITEM for traces. */ +void ritem_print (FILE *out); + +/* Return the size of the longest rule RHS. */ +size_t ritem_longest_rhs (void); + +/* Print the grammar's rules numbers from BEGIN (inclusive) to END + (exclusive) on OUT under TITLE. */ +void grammar_rules_partial_print (FILE *out, const char *title, + rule_filter filter); + +/* Print the grammar's rules on OUT. */ +void grammar_rules_print (FILE *out); + +/* Dump the grammar. */ +void grammar_dump (FILE *out, const char *title); + +/* Report on STDERR the rules that are not flagged USEFUL, using the + MESSAGE (which can be `useless rule' when invoked after grammar + reduction, or `never reduced' after conflicts were taken into + account). */ +void grammar_rules_never_reduced_report (const char *message); + +/* Free the packed grammar. */ +void grammar_free (void); + +#endif /* !GRAM_H_ */ diff --git a/src/apps/bin/bison/src/lalr.c b/src/apps/bin/bison/src/lalr.c new file mode 100644 index 0000000000..7273805ac0 --- /dev/null +++ b/src/apps/bin/bison/src/lalr.c @@ -0,0 +1,455 @@ +/* Compute look-ahead criteria for Bison. + + Copyright (C) 1984, 1986, 1989, 2000, 2001, 2002, 2003 + Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + +/* Compute how to make the finite state machine deterministic; find + which rules need lookahead in each state, and which lookahead + tokens they accept. */ + +#include "system.h" + +#include +#include +#include + +#include "LR0.h" +#include "complain.h" +#include "derives.h" +#include "getargs.h" +#include "gram.h" +#include "lalr.h" +#include "nullable.h" +#include "reader.h" +#include "relation.h" +#include "symtab.h" + +goto_number *goto_map = NULL; +static goto_number ngotos = 0; +state_number *from_state = NULL; +state_number *to_state = NULL; + +/* Linked list of goto numbers. */ +typedef struct goto_list +{ + struct goto_list *next; + goto_number value; +} goto_list; + + +/* LA is a LR by NTOKENS matrix of bits. LA[l, i] is 1 if the rule + LArule[l] is applicable in the appropriate state when the next + token is symbol i. If LA[l, i] and LA[l, j] are both 1 for i != j, + it is a conflict. */ + +static bitsetv LA = NULL; +size_t nLA; + + +/* And for the famous F variable, which name is so descriptive that a + comment is hardly needed. . */ +static bitsetv F = NULL; + +static goto_number **includes; +static goto_list **lookback; + + + + +static void +set_goto_map (void) +{ + state_number s; + goto_number *temp_map; + + CALLOC (goto_map, nvars + 1); + CALLOC (temp_map, nvars + 1); + + ngotos = 0; + for (s = 0; s < nstates; ++s) + { + transitions *sp = states[s]->transitions; + int i; + for (i = sp->num - 1; i >= 0 && TRANSITION_IS_GOTO (sp, i); --i) + { + if (ngotos >= GOTO_NUMBER_MAXIMUM) + abort (); + ngotos++; + goto_map[TRANSITION_SYMBOL (sp, i) - ntokens]++; + } + } + + { + int k = 0; + int i; + for (i = ntokens; i < nsyms; i++) + { + temp_map[i - ntokens] = k; + k += goto_map[i - ntokens]; + } + + for (i = ntokens; i < nsyms; i++) + goto_map[i - ntokens] = temp_map[i - ntokens]; + + goto_map[nsyms - ntokens] = ngotos; + temp_map[nsyms - ntokens] = ngotos; + } + + CALLOC (from_state, ngotos); + CALLOC (to_state, ngotos); + + for (s = 0; s < nstates; ++s) + { + transitions *sp = states[s]->transitions; + int i; + for (i = sp->num - 1; i >= 0 && TRANSITION_IS_GOTO (sp, i); --i) + { + int k = temp_map[TRANSITION_SYMBOL (sp, i) - ntokens]++; + from_state[k] = s; + to_state[k] = sp->states[i]->number; + } + } + + XFREE (temp_map); +} + + + +/*----------------------------------------------------------. +| Map a state/symbol pair into its numeric representation. | +`----------------------------------------------------------*/ + +static int +map_goto (state_number s0, symbol_number sym) +{ + int high; + int low; + int middle; + state_number s; + + low = goto_map[sym - ntokens]; + high = goto_map[sym - ntokens + 1] - 1; + + for (;;) + { + if (high < low) + abort (); + middle = (low + high) / 2; + s = from_state[middle]; + if (s == s0) + return middle; + else if (s < s0) + low = middle + 1; + else + high = middle - 1; + } +} + + +static void +initialize_F (void) +{ + goto_number **reads = CALLOC (reads, ngotos); + goto_number *edge = CALLOC (edge, ngotos + 1); + int nedges = 0; + + int i; + + F = bitsetv_create (ngotos, ntokens, BITSET_FIXED); + + for (i = 0; i < ngotos; i++) + { + state_number stateno = to_state[i]; + transitions *sp = states[stateno]->transitions; + + int j; + FOR_EACH_SHIFT (sp, j) + bitset_set (F[i], TRANSITION_SYMBOL (sp, j)); + + for (; j < sp->num; j++) + { + symbol_number sym = TRANSITION_SYMBOL (sp, j); + if (nullable[sym - ntokens]) + edge[nedges++] = map_goto (stateno, sym); + } + + if (nedges) + { + CALLOC (reads[i], nedges + 1); + memcpy (reads[i], edge, nedges * sizeof (edge[0])); + reads[i][nedges] = -1; + nedges = 0; + } + } + + relation_digraph (reads, ngotos, &F); + + for (i = 0; i < ngotos; i++) + XFREE (reads[i]); + + XFREE (reads); + XFREE (edge); +} + + +static void +add_lookback_edge (state *s, rule *r, int gotono) +{ + int ri = state_reduction_find (s, r); + goto_list *sp = MALLOC (sp, 1); + sp->next = lookback[(s->reductions->lookaheads - LA) + ri]; + sp->value = gotono; + lookback[(s->reductions->lookaheads - LA) + ri] = sp; +} + + + +static void +build_relations (void) +{ + goto_number *edge = CALLOC (edge, ngotos + 1); + state_number *states1 = CALLOC (states1, ritem_longest_rhs () + 1); + int i; + + CALLOC (includes, ngotos); + + for (i = 0; i < ngotos; i++) + { + int nedges = 0; + symbol_number symbol1 = states[to_state[i]]->accessing_symbol; + rule **rulep; + + for (rulep = derives[symbol1 - ntokens]; *rulep; rulep++) + { + bool done; + int length = 1; + item_number *rp; + state *s = states[from_state[i]]; + states1[0] = s->number; + + for (rp = (*rulep)->rhs; *rp >= 0; rp++) + { + s = transitions_to (s->transitions, + item_number_as_symbol_number (*rp)); + states1[length++] = s->number; + } + + if (!s->consistent) + add_lookback_edge (s, *rulep, i); + + length--; + done = false; + while (!done) + { + done = true; + rp--; + /* JF added rp>=ritem && I hope to god its right! */ + if (rp >= ritem && ISVAR (*rp)) + { + /* Downcasting from item_number to symbol_number. */ + edge[nedges++] = map_goto (states1[--length], + item_number_as_symbol_number (*rp)); + if (nullable[*rp - ntokens]) + done = false; + } + } + } + + if (nedges) + { + int j; + CALLOC (includes[i], nedges + 1); + for (j = 0; j < nedges; j++) + includes[i][j] = edge[j]; + includes[i][nedges] = -1; + } + } + + XFREE (edge); + XFREE (states1); + + relation_transpose (&includes, ngotos); +} + + + +static void +compute_FOLLOWS (void) +{ + int i; + + relation_digraph (includes, ngotos, &F); + + for (i = 0; i < ngotos; i++) + XFREE (includes[i]); + + XFREE (includes); +} + + +static void +compute_lookaheads (void) +{ + size_t i; + goto_list *sp; + + for (i = 0; i < nLA; i++) + for (sp = lookback[i]; sp; sp = sp->next) + bitset_or (LA[i], LA[i], F[sp->value]); + + /* Free LOOKBACK. */ + for (i = 0; i < nLA; i++) + LIST_FREE (goto_list, lookback[i]); + + XFREE (lookback); + bitsetv_free (F); +} + + +/*-----------------------------------------------------------. +| Count the number of lookaheads required for S (NLOOKAHEADS | +| member). | +`-----------------------------------------------------------*/ + +static int +state_lookaheads_count (state *s) +{ + int k; + int nlookaheads = 0; + reductions *rp = s->reductions; + transitions *sp = s->transitions; + + /* We need a lookahead either to distinguish different + reductions (i.e., there are two or more), or to distinguish a + reduction from a shift. Otherwise, it is straightforward, + and the state is `consistent'. */ + if (rp->num > 1 + || (rp->num == 1 && sp->num && + !TRANSITION_IS_DISABLED (sp, 0) && TRANSITION_IS_SHIFT (sp, 0))) + nlookaheads += rp->num; + else + s->consistent = 1; + + for (k = 0; k < sp->num; k++) + if (!TRANSITION_IS_DISABLED (sp, k) && TRANSITION_IS_ERROR (sp, k)) + { + s->consistent = 0; + break; + } + + return nlookaheads; +} + + +/*----------------------------------------------. +| Compute LA, NLA, and the lookaheads members. | +`----------------------------------------------*/ + +static void +initialize_LA (void) +{ + state_number i; + bitsetv pLA; + + /* Compute the total number of reductions requiring a lookahead. */ + nLA = 0; + for (i = 0; i < nstates; i++) + nLA += state_lookaheads_count (states[i]); + /* Avoid having to special case 0. */ + if (!nLA) + nLA = 1; + + pLA = LA = bitsetv_create (nLA, ntokens, BITSET_FIXED); + CALLOC (lookback, nLA); + + /* Initialize the members LOOKAHEADS for each state which reductions + require lookaheads. */ + for (i = 0; i < nstates; i++) + { + int count = state_lookaheads_count (states[i]); + if (count) + { + states[i]->reductions->lookaheads = pLA; + pLA += count; + } + } +} + + +/*---------------------------------------. +| Output the lookaheads for each state. | +`---------------------------------------*/ + +static void +lookaheads_print (FILE *out) +{ + state_number i; + int j, k; + fprintf (out, "Lookaheads: BEGIN\n"); + for (i = 0; i < nstates; ++i) + { + reductions *reds = states[i]->reductions; + bitset_iterator iter; + int nlookaheads = 0; + + if (reds->lookaheads) + for (k = 0; k < reds->num; ++k) + if (reds->lookaheads[k]) + ++nlookaheads; + + fprintf (out, "State %d: %d lookaheads\n", + i, nlookaheads); + + if (reds->lookaheads) + for (j = 0; j < reds->num; ++j) + BITSET_FOR_EACH (iter, reds->lookaheads[j], k, 0) + { + fprintf (out, " on %d (%s) -> rule %d\n", + k, symbols[k]->tag, + reds->rules[j]->number); + }; + } + fprintf (out, "Lookaheads: END\n"); +} + +void +lalr (void) +{ + initialize_LA (); + set_goto_map (); + initialize_F (); + build_relations (); + compute_FOLLOWS (); + compute_lookaheads (); + + if (trace_flag & trace_sets) + lookaheads_print (stderr); +} + + +void +lalr_free (void) +{ + state_number s; + for (s = 0; s < nstates; ++s) + states[s]->reductions->lookaheads = NULL; + bitsetv_free (LA); +} diff --git a/src/apps/bin/bison/src/lalr.h b/src/apps/bin/bison/src/lalr.h new file mode 100644 index 0000000000..ce10edd019 --- /dev/null +++ b/src/apps/bin/bison/src/lalr.h @@ -0,0 +1,67 @@ +/* Compute look-ahead criteria for bison, + + Copyright (C) 1984, 1986, 1989, 2000, 2002, 2004 Free Software + Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef LALR_H_ +# define LALR_H_ + +# include +# include + +/* Import the definition of RULE_T. */ +# include "gram.h" + +/* Import the definition of CORE, TRANSITIONS and REDUCTIONS. */ +# include "state.h" + +/* Compute how to make the finite state machine deterministic; find + which rules need lookahead in each state, and which lookahead + tokens they accept. */ + +void lalr (void); + +/* Release the information related to lookaheads. Can be performed + once the action tables are computed. */ + +void lalr_free (void); + + +/* lalr() builds these data structures. */ + +/* GOTO_MAP, FROM_STATE and TO_STATE -- record each shift transition + which accepts a variable (a nonterminal). + + FROM_STATE[T] -- state number which a transition leads from. + TO_STATE[T] -- state number it leads to. + + All the transitions that accept a particular variable are grouped + together and GOTO_MAP[I - NTOKENS] is the index in FROM_STATE and + TO_STATE of the first of them. */ + +typedef short int goto_number; +# define GOTO_NUMBER_MAXIMUM SHRT_MAX + +extern goto_number *goto_map; +extern state_number *from_state; +extern state_number *to_state; + + +#endif /* !LALR_H_ */ diff --git a/src/apps/bin/bison/src/location.c b/src/apps/bin/bison/src/location.c new file mode 100644 index 0000000000..9ba9378577 --- /dev/null +++ b/src/apps/bin/bison/src/location.c @@ -0,0 +1,46 @@ +/* Locations for Bison + Copyright (C) 2002 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include "system.h" + +#include + +#include "location.h" + +location const empty_location; + +/* Output to OUT the location LOC. + Warning: it uses quotearg's slot 3. */ +void +location_print (FILE *out, location loc) +{ + fprintf (out, "%s:%d.%d", + quotearg_n_style (3, escape_quoting_style, loc.start.file), + loc.start.line, loc.start.column); + + if (loc.start.file != loc.end.file) + fprintf (out, "-%s:%d.%d", + quotearg_n_style (3, escape_quoting_style, loc.end.file), + loc.end.line, loc.end.column - 1); + else if (loc.start.line < loc.end.line) + fprintf (out, "-%d.%d", loc.end.line, loc.end.column - 1); + else if (loc.start.column < loc.end.column - 1) + fprintf (out, "-%d", loc.end.column - 1); +} diff --git a/src/apps/bin/bison/src/location.h b/src/apps/bin/bison/src/location.h new file mode 100644 index 0000000000..f4fbb2f805 --- /dev/null +++ b/src/apps/bin/bison/src/location.h @@ -0,0 +1,65 @@ +/* Locations for Bison + Copyright (C) 2002 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef LOCATION_H_ +# define LOCATION_H_ + +/* A boundary between two characters. */ +typedef struct +{ + /* The name of the file that contains the boundary. */ + char const *file; + + /* The (origin-1) line that contains the boundary. */ + int line; + + /* The (origin-1) column just after the boundary. This is neither a + byte count, nor a character count; it is a column count. */ + int column; + +} boundary; + +/* Return nonzero if A and B are equal boundaries. */ +static inline bool +equal_boundaries (boundary a, boundary b) +{ + return (a.column == b.column + && a.line == b.line + && a.file == b.file); +} + +/* A location, that is, a region of source code. */ +typedef struct +{ + /* Boundary just before the location starts. */ + boundary start; + + /* Boundary just after the location ends. */ + boundary end; + +} location; + +#define YYLTYPE location + +extern location const empty_location; + +void location_print (FILE *, location); + +#endif /* ! defined LOCATION_H_ */ diff --git a/src/apps/bin/bison/src/main.c b/src/apps/bin/bison/src/main.c new file mode 100644 index 0000000000..87ecbaba43 --- /dev/null +++ b/src/apps/bin/bison/src/main.c @@ -0,0 +1,194 @@ +/* Top level entry point of Bison. + + Copyright (C) 1984, 1986, 1989, 1992, 1995, 2000, 2001, 2002 + Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + +#include "system.h" + +#include +#include +#include + +#include "LR0.h" +#include "complain.h" +#include "conflicts.h" +#include "derives.h" +#include "files.h" +#include "getargs.h" +#include "gram.h" +#include "lalr.h" +#include "muscle_tab.h" +#include "nullable.h" +#include "output.h" +#include "print.h" +#include "print_graph.h" +#include "reader.h" +#include "reduce.h" +#include "symtab.h" +#include "tables.h" +#include "uniqstr.h" + +/* The name this program was run with, for messages. */ +char *program_name; + + + +int +main (int argc, char *argv[]) +{ + program_name = argv[0]; + setlocale (LC_ALL, ""); + (void) bindtextdomain (PACKAGE, LOCALEDIR); + (void) textdomain (PACKAGE); + + uniqstrs_new (); + + getargs (argc, argv); + + timevar_report = trace_flag & trace_time; + init_timevar (); + timevar_start (TV_TOTAL); + + if (trace_flag & trace_bitsets) + bitset_stats_enable (); + + muscle_init (); + + /* Read the input. Copy some parts of it to FGUARD, FACTION, FTABLE + and FATTRS. In file reader.c. The other parts are recorded in + the grammar; see gram.h. */ + + timevar_push (TV_READER); + reader (); + timevar_pop (TV_READER); + + if (complaint_issued) + goto finish; + + /* Find useless nonterminals and productions and reduce the grammar. */ + timevar_push (TV_REDUCE); + reduce_grammar (); + timevar_pop (TV_REDUCE); + + /* Record other info about the grammar. In files derives and + nullable. */ + timevar_push (TV_SETS); + derives_compute (); + nullable_compute (); + timevar_pop (TV_SETS); + + /* Convert to nondeterministic finite state machine. In file LR0. + See state.h for more info. */ + timevar_push (TV_LR0); + generate_states (); + timevar_pop (TV_LR0); + + /* make it deterministic. In file lalr. */ + timevar_push (TV_LALR); + lalr (); + timevar_pop (TV_LALR); + + /* Find and record any conflicts: places where one token of + lookahead is not enough to disambiguate the parsing. In file + conflicts. Also resolve s/r conflicts based on precedence + declarations. */ + timevar_push (TV_CONFLICTS); + conflicts_solve (); + conflicts_print (); + timevar_pop (TV_CONFLICTS); + + /* Compute the parser tables. */ + timevar_push (TV_ACTIONS); + tables_generate (); + timevar_pop (TV_ACTIONS); + + grammar_rules_never_reduced_report + (_("rule never reduced because of conflicts")); + + /* Output file names. */ + compute_output_file_names (); + + /* Output the detailed report on the grammar. */ + if (report_flag) + { + timevar_push (TV_REPORT); + print_results (); + timevar_pop (TV_REPORT); + } + + /* Output the VCG graph. */ + if (graph_flag) + { + timevar_push (TV_GRAPH); + print_graph (); + timevar_pop (TV_GRAPH); + } + + /* Stop if there were errors, to avoid trashing previous output + files. */ + if (complaint_issued) + goto finish; + + /* Lookaheads are no longer needed. */ + timevar_push (TV_FREE); + lalr_free (); + timevar_pop (TV_FREE); + + /* Output the tables and the parser to ftable. In file output. */ + timevar_push (TV_PARSER); + output (); + timevar_pop (TV_PARSER); + + timevar_push (TV_FREE); + nullable_free (); + derives_free (); + tables_free (); + states_free (); + reduce_free (); + conflicts_free (); + grammar_free (); + + /* The scanner memory cannot be released right after parsing, as it + contains things such as user actions, prologue, epilogue etc. */ + scanner_free (); + muscle_free (); + uniqstrs_free (); + /* If using alloca.c, flush the alloca'ed memory for the benefit of + people running Bison as a library in IDEs. */ +#if C_ALLOCA + { + extern void *alloca (size_t); + alloca (0); + } +#endif + timevar_pop (TV_FREE); + + if (trace_flag & trace_bitsets) + bitset_stats_dump (stderr); + + finish: + + /* Stop timing and print the times. */ + timevar_stop (TV_TOTAL); + timevar_print (stderr); + + return complaint_issued ? EXIT_FAILURE : EXIT_SUCCESS; +} diff --git a/src/apps/bin/bison/src/muscle_tab.c b/src/apps/bin/bison/src/muscle_tab.c new file mode 100644 index 0000000000..bf5c4dd346 --- /dev/null +++ b/src/apps/bin/bison/src/muscle_tab.c @@ -0,0 +1,239 @@ +/* Muscle table manager for Bison. + + Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include "system.h" + +#include +#include + +#include "files.h" +#include "muscle_tab.h" +#include "getargs.h" + +typedef struct +{ + const char *key; + char *value; +} muscle_entry; + +/* An obstack used to create some entries. */ +struct obstack muscle_obstack; + +/* Initial capacity of muscles hash table. */ +#define HT_INITIAL_CAPACITY 257 + +struct hash_table *muscle_table = NULL; + +static bool +hash_compare_muscles (void const *x, void const *y) +{ + muscle_entry const *m1 = x; + muscle_entry const *m2 = y; + return strcmp (m1->key, m2->key) == 0; +} + +static size_t +hash_muscle (const void *x, size_t tablesize) +{ + muscle_entry const *m = x; + return hash_string (m->key, tablesize); +} + +/*-----------------------------------------------------------------. +| Create the MUSCLE_TABLE, and initialize it with default values. | +| Also set up the MUSCLE_OBSTACK. | +`-----------------------------------------------------------------*/ + +void +muscle_init (void) +{ + /* Initialize the muscle obstack. */ + obstack_init (&muscle_obstack); + + muscle_table = hash_initialize (HT_INITIAL_CAPACITY, NULL, hash_muscle, + hash_compare_muscles, free); + + /* Version and input file. */ + MUSCLE_INSERT_STRING ("version", VERSION); + MUSCLE_INSERT_C_STRING ("filename", grammar_file); +} + + +/*------------------------------------------------------------. +| Free all the memory consumed by the muscle machinery only. | +`------------------------------------------------------------*/ + +void +muscle_free (void) +{ + hash_free (muscle_table); + obstack_free (&muscle_obstack, NULL); +} + + + +/*------------------------------------------------------------. +| Insert (KEY, VALUE). If KEY already existed, overwrite the | +| previous value. | +`------------------------------------------------------------*/ + +void +muscle_insert (const char *key, char *value) +{ + muscle_entry probe; + muscle_entry *entry = NULL; + + probe.key = key; + entry = hash_lookup (muscle_table, &probe); + + if (!entry) + { + /* First insertion in the hash. */ + MALLOC (entry, 1); + entry->key = key; + hash_insert (muscle_table, entry); + } + entry->value = value; +} + + +/*-------------------------------------------------------------------. +| Insert (KEY, VALUE). If KEY already existed, overwrite the | +| previous value. Uses MUSCLE_OBSTACK. De-allocates the previously | +| associated value. VALUE and SEPARATOR are copied. | +`-------------------------------------------------------------------*/ + +void +muscle_grow (const char *key, const char *val, const char *separator) +{ + muscle_entry probe; + muscle_entry *entry = NULL; + + probe.key = key; + entry = hash_lookup (muscle_table, &probe); + + if (!entry) + { + /* First insertion in the hash. */ + MALLOC (entry, 1); + entry->key = key; + hash_insert (muscle_table, entry); + entry->value = xstrdup (val); + } + else + { + /* Grow the current value. */ + char *new_val; + obstack_sgrow (&muscle_obstack, entry->value); + free (entry->value); + obstack_sgrow (&muscle_obstack, separator); + obstack_sgrow (&muscle_obstack, val); + obstack_1grow (&muscle_obstack, 0); + new_val = obstack_finish (&muscle_obstack); + entry->value = xstrdup (new_val); + obstack_free (&muscle_obstack, new_val); + } +} + + +/*------------------------------------------------------------------. +| Append VALUE to the current value of KEY, using muscle_grow. But | +| in addition, issue a synchronization line for the location LOC. | +`------------------------------------------------------------------*/ + +void +muscle_code_grow (const char *key, const char *val, location loc) +{ + char *extension = NULL; + obstack_fgrow1 (&muscle_obstack, "]b4_syncline([[%d]], [[", loc.start.line); + MUSCLE_OBSTACK_SGROW (&muscle_obstack, + quotearg_style (c_quoting_style, loc.start.file)); + obstack_sgrow (&muscle_obstack, "]])[\n"); + obstack_sgrow (&muscle_obstack, val); + obstack_1grow (&muscle_obstack, 0); + extension = obstack_finish (&muscle_obstack); + muscle_grow (key, extension, ""); +} + + +/*-------------------------------------------------------------------. +| MUSCLE is an M4 list of pairs. Create or extend it with the pair | +| (A1, A2). Note that because the muscle values are output *double* | +| quoted, one needs to strip the first level of quotes to reach the | +| list itself. | +`-------------------------------------------------------------------*/ + +void muscle_pair_list_grow (const char *muscle, + const char *a1, const char *a2) +{ + char *pair; + obstack_fgrow2 (&muscle_obstack, "[[[%s]], [[%s]]]", a1, a2); + obstack_1grow (&muscle_obstack, 0); + pair = obstack_finish (&muscle_obstack); + muscle_grow (muscle, pair, ",\n"); + obstack_free (&muscle_obstack, pair); +} + +/*-------------------------------. +| Find the value of muscle KEY. | +`-------------------------------*/ + +char* +muscle_find (const char *key) +{ + muscle_entry probe; + muscle_entry *result = NULL; + + probe.key = key; + result = hash_lookup (muscle_table, &probe); + return result ? result->value : NULL; +} + + +/*------------------------------------------------. +| Output the definition of ENTRY as a m4_define. | +`------------------------------------------------*/ + +static inline bool +muscle_m4_output (muscle_entry *entry, FILE *out) +{ + fprintf (out, "m4_define([b4_%s],\n", entry->key); + fprintf (out, "[[%s]])\n\n\n", entry->value); + return true; +} + +static bool +muscle_m4_output_processor (void *entry, void *out) +{ + return muscle_m4_output (entry, out); +} + + +/*----------------------------------------------------------------. +| Output the definition of all the current muscles into a list of | +| m4_defines. | +`----------------------------------------------------------------*/ + +void +muscles_m4_output (FILE *out) +{ + hash_do_for_each (muscle_table, muscle_m4_output_processor, out); +} diff --git a/src/apps/bin/bison/src/muscle_tab.h b/src/apps/bin/bison/src/muscle_tab.h new file mode 100644 index 0000000000..d4cd4b54bb --- /dev/null +++ b/src/apps/bin/bison/src/muscle_tab.h @@ -0,0 +1,108 @@ +/* Muscle table manager for Bison, + Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef MUSCLE_TAB_H_ +# define MUSCLE_TAB_H_ + +# include "location.h" + +void muscle_init (void); +void muscle_insert (const char *key, char *value); +char *muscle_find (const char *key); +void muscle_free (void); + + +/* An obstack dedicated to receive muscle keys and values. */ +extern struct obstack muscle_obstack; + +#define MUSCLE_INSERT_BOOL(Key, Value) \ +{ \ + int v = Value; \ + MUSCLE_INSERT_INT (Key, v); \ +} + +#define MUSCLE_INSERT_INT(Key, Value) \ +{ \ + obstack_fgrow1 (&muscle_obstack, "%d", Value); \ + obstack_1grow (&muscle_obstack, 0); \ + muscle_insert (Key, obstack_finish (&muscle_obstack)); \ +} + +#define MUSCLE_INSERT_LONG_INT(Key, Value) \ +{ \ + obstack_fgrow1 (&muscle_obstack, "%ld", Value); \ + obstack_1grow (&muscle_obstack, 0); \ + muscle_insert (Key, obstack_finish (&muscle_obstack)); \ +} + +#define MUSCLE_INSERT_STRING(Key, Value) \ +{ \ + obstack_sgrow (&muscle_obstack, Value); \ + obstack_1grow (&muscle_obstack, 0); \ + muscle_insert (Key, obstack_finish (&muscle_obstack)); \ +} + +#define MUSCLE_OBSTACK_SGROW(Obstack, Value) \ +{ \ + char const *p; \ + for (p = Value; *p; p++) \ + switch (*p) \ + { \ + case '$': obstack_sgrow (Obstack, "$]["); break; \ + case '@': obstack_sgrow (Obstack, "@@" ); break; \ + case '[': obstack_sgrow (Obstack, "@{" ); break; \ + case ']': obstack_sgrow (Obstack, "@}" ); break; \ + default: obstack_1grow (Obstack, *p); break; \ + } \ +} + +#define MUSCLE_INSERT_C_STRING(Key, Value) \ +{ \ + MUSCLE_OBSTACK_SGROW (&muscle_obstack, \ + quotearg_style (c_quoting_style, \ + Value)); \ + obstack_1grow (&muscle_obstack, 0); \ + muscle_insert (Key, obstack_finish (&muscle_obstack)); \ +} + +/* Insert (KEY, VALUE). If KEY already existed, overwrite the + previous value. Uses MUSCLE_OBSTACK. De-allocates the previously + associated value. VALUE and SEPARATOR are copied. */ + +void muscle_grow (const char *key, const char *value, const char *separator); + + +/* Append VALUE to the current value of KEY, using muscle_grow. But + in addition, issue a synchronization line for the location LOC. */ + +void muscle_code_grow (const char *key, const char *value, location loc); + + +/* MUSCLE is an M4 list of pairs. Create or extend it with the pair + (A1, A2). Note that because the muscle values are output *double* + quoted, one needs to strip the first level of quotes to reach the + list itself. */ + +void muscle_pair_list_grow (const char *muscle, + const char *a1, const char *a2); + +void muscles_m4_output (FILE *out); + +#endif /* not MUSCLE_TAB_H_ */ diff --git a/src/apps/bin/bison/src/nullable.c b/src/apps/bin/bison/src/nullable.c new file mode 100644 index 0000000000..d65c4f2b43 --- /dev/null +++ b/src/apps/bin/bison/src/nullable.c @@ -0,0 +1,143 @@ +/* Calculate which nonterminals can expand into the null string for Bison. + + Copyright (C) 1984, 1989, 2000, 2001, 2002, 2003, 2004 Free + Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + +/* Set up NULLABLE, a vector saying which nonterminals can expand into + the null string. NULLABLE[I - NTOKENS] is nonzero if symbol I can + do so. */ + +#include "system.h" + +#include "getargs.h" +#include "gram.h" +#include "nullable.h" +#include "reduce.h" +#include "symtab.h" + +/* Linked list of rules. */ +typedef struct rule_list +{ + struct rule_list *next; + rule *value; +} rule_list; + +bool *nullable = NULL; + +static void +nullable_print (FILE *out) +{ + int i; + fputs ("NULLABLE\n", out); + for (i = ntokens; i < nsyms; i++) + fprintf (out, "\t%s: %s\n", symbols[i]->tag, + nullable[i - ntokens] ? "yes" : "no"); + fputs ("\n\n", out); +} + +void +nullable_compute (void) +{ + rule_number ruleno; + symbol_number *s1; + symbol_number *s2; + rule_list *p; + + symbol_number *squeue = CALLOC (squeue, nvars); + short int *rcount = CALLOC (rcount, nrules); + /* RITEM contains all the rules, including useless productions. + Hence we must allocate room for useless nonterminals too. */ + rule_list **rsets = CALLOC (rsets, nvars); + /* This is said to be more elements than we actually use. + Supposedly NRITEMS - NRULES is enough. But why take the risk? */ + rule_list *relts = CALLOC (relts, nritems + nvars + 1); + + CALLOC (nullable, nvars); + + s1 = s2 = squeue; + p = relts; + + for (ruleno = 0; ruleno < nrules; ++ruleno) + if (rules[ruleno].useful) + { + rule *rules_ruleno = &rules[ruleno]; + if (rules_ruleno->rhs[0] >= 0) + { + /* This rule has a non empty RHS. */ + item_number *rp = NULL; + bool any_tokens = false; + for (rp = rules_ruleno->rhs; *rp >= 0; ++rp) + if (ISTOKEN (*rp)) + any_tokens = true; + + /* This rule has only nonterminals: schedule it for the second + pass. */ + if (!any_tokens) + for (rp = rules_ruleno->rhs; *rp >= 0; ++rp) + { + rcount[ruleno]++; + p->next = rsets[*rp - ntokens]; + p->value = rules_ruleno; + rsets[*rp - ntokens] = p; + p++; + } + } + else + { + /* This rule has an empty RHS. */ + if (item_number_as_rule_number (rules_ruleno->rhs[0]) != ruleno) + abort (); + if (rules_ruleno->useful + && ! nullable[rules_ruleno->lhs->number - ntokens]) + { + nullable[rules_ruleno->lhs->number - ntokens] = true; + *s2++ = rules_ruleno->lhs->number; + } + } + } + + while (s1 < s2) + for (p = rsets[*s1++ - ntokens]; p; p = p->next) + { + rule *r = p->value; + if (--rcount[r->number] == 0) + if (r->useful && ! nullable[r->lhs->number - ntokens]) + { + nullable[r->lhs->number - ntokens] = true; + *s2++ = r->lhs->number; + } + } + + XFREE (squeue); + XFREE (rcount); + XFREE (rsets); + XFREE (relts); + + if (trace_flag & trace_sets) + nullable_print (stderr); +} + + +void +nullable_free (void) +{ + XFREE (nullable); +} diff --git a/src/apps/bin/bison/src/nullable.h b/src/apps/bin/bison/src/nullable.h new file mode 100644 index 0000000000..dbef4905b2 --- /dev/null +++ b/src/apps/bin/bison/src/nullable.h @@ -0,0 +1,33 @@ +/* Part of the bison parser generator, + Copyright (C) 2000, 2002 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef NULLABLE_H_ +# define NULLABLE_H_ + +/* A vector saying which nonterminals can expand into the null string. + NULLABLE[I - NTOKENS] is nonzero if symbol I can do so. */ +extern bool *nullable; + +/* Set up NULLABLE. */ +extern void nullable_compute (void); + +/* Free NULLABLE. */ +extern void nullable_free (void); +#endif /* !NULLABLE_H_ */ diff --git a/src/apps/bin/bison/src/output.c b/src/apps/bin/bison/src/output.c new file mode 100644 index 0000000000..68dd2dffbd --- /dev/null +++ b/src/apps/bin/bison/src/output.c @@ -0,0 +1,646 @@ +/* Output the generated parsing program for Bison. + + Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004 + Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + + +#include "system.h" + +#include +#include +#include +#include +#include + +#include "complain.h" +#include "files.h" +#include "getargs.h" +#include "gram.h" +#include "muscle_tab.h" +#include "output.h" +#include "reader.h" +#include "symtab.h" +#include "tables.h" + +/* From src/scan-skel.l. */ +void scan_skel (FILE *); + + +static struct obstack format_obstack; + +bool error_verbose = false; + + + +/*-------------------------------------------------------------------. +| Create a function NAME which associates to the muscle NAME the | +| result of formatting the FIRST and then TABLE_DATA[BEGIN..END[ (of | +| TYPE), and to the muscle NAME_max, the max value of the | +| TABLE_DATA. | +`-------------------------------------------------------------------*/ + + +#define GENERATE_MUSCLE_INSERT_TABLE(Name, Type) \ + \ +static void \ +Name (const char *name, \ + Type *table_data, \ + Type first, \ + int begin, \ + int end) \ +{ \ + Type min = first; \ + Type max = first; \ + long int lmin; \ + long int lmax; \ + int i; \ + int j = 1; \ + \ + obstack_fgrow1 (&format_obstack, "%6d", first); \ + for (i = begin; i < end; ++i) \ + { \ + obstack_1grow (&format_obstack, ','); \ + if (j >= 10) \ + { \ + obstack_sgrow (&format_obstack, "\n "); \ + j = 1; \ + } \ + else \ + ++j; \ + obstack_fgrow1 (&format_obstack, "%6d", table_data[i]); \ + if (table_data[i] < min) \ + min = table_data[i]; \ + if (max < table_data[i]) \ + max = table_data[i]; \ + } \ + obstack_1grow (&format_obstack, 0); \ + muscle_insert (name, obstack_finish (&format_obstack)); \ + \ + lmin = min; \ + lmax = max; \ + /* Build `NAME_min' and `NAME_max' in the obstack. */ \ + obstack_fgrow1 (&format_obstack, "%s_min", name); \ + obstack_1grow (&format_obstack, 0); \ + MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), lmin); \ + obstack_fgrow1 (&format_obstack, "%s_max", name); \ + obstack_1grow (&format_obstack, 0); \ + MUSCLE_INSERT_LONG_INT (obstack_finish (&format_obstack), lmax); \ +} + +GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_unsigned_int_table, unsigned int) +GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_int_table, int) +GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_short_int_table, short int) +GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_base_table, base_number) +GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_rule_number_table, rule_number) +GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_symbol_number_table, symbol_number) +GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_item_number_table, item_number) +GENERATE_MUSCLE_INSERT_TABLE(muscle_insert_state_number_table, state_number) + + +/*----------------------------------------------------------------------. +| Print to OUT a representation of FILENAME escaped both for C and M4. | +`----------------------------------------------------------------------*/ + +static void +escaped_file_name_output (FILE *out, char const *filename) +{ + char const *p; + fprintf (out, "[["); + + for (p = quotearg_style (c_quoting_style, filename); *p; p++) + switch (*p) + { + case '$': fputs ("$][", out); break; + case '@': fputs ("@@", out); break; + case '[': fputs ("@{", out); break; + case ']': fputs ("@}", out); break; + default: fputc (*p, out); break; + } + + fprintf (out, "]]"); +} + + +/*------------------------------------------------------------------. +| Prepare the muscles related to the symbols: translate, tname, and | +| toknum. | +`------------------------------------------------------------------*/ + +static void +prepare_symbols (void) +{ + MUSCLE_INSERT_INT ("tokens_number", ntokens); + MUSCLE_INSERT_INT ("nterms_number", nvars); + MUSCLE_INSERT_INT ("undef_token_number", undeftoken->number); + MUSCLE_INSERT_INT ("user_token_number_max", max_user_token_number); + + muscle_insert_symbol_number_table ("translate", + token_translations, + token_translations[0], + 1, max_user_token_number + 1); + + /* tname -- token names. */ + { + int i; + /* We assume that the table will be output starting at column 2. */ + int j = 2; + for (i = 0; i < nsyms; i++) + { + const char *cp = quotearg_style (c_quoting_style, symbols[i]->tag); + /* Width of the next token, including the two quotes, the + comma and the space. */ + int width = strlen (cp) + 2; + + if (j + width > 75) + { + obstack_sgrow (&format_obstack, "\n "); + j = 1; + } + + if (i) + obstack_1grow (&format_obstack, ' '); + MUSCLE_OBSTACK_SGROW (&format_obstack, cp); + obstack_1grow (&format_obstack, ','); + j += width; + } + /* Add a NULL entry to list of tokens (well, 0, as NULL might not be + defined). */ + obstack_sgrow (&format_obstack, " 0"); + + /* Finish table and store. */ + obstack_1grow (&format_obstack, 0); + muscle_insert ("tname", obstack_finish (&format_obstack)); + } + + /* Output YYTOKNUM. */ + { + int i; + int *values = MALLOC (values, ntokens); + for (i = 0; i < ntokens; ++i) + values[i] = symbols[i]->user_token_number; + muscle_insert_int_table ("toknum", values, + values[0], 1, ntokens); + free (values); + } +} + + +/*-------------------------------------------------------------. +| Prepare the muscles related to the rules: rhs, prhs, r1, r2, | +| rline, dprec, merger. | +`-------------------------------------------------------------*/ + +static void +prepare_rules (void) +{ + rule_number r; + unsigned int i = 0; + item_number *rhs = MALLOC (rhs, nritems); + unsigned int *prhs = MALLOC (prhs, nrules); + unsigned int *rline = MALLOC (rline, nrules); + symbol_number *r1 = MALLOC (r1, nrules); + unsigned int *r2 = MALLOC (r2, nrules); + short int *dprec = MALLOC (dprec, nrules); + short int *merger = MALLOC (merger, nrules); + + for (r = 0; r < nrules; ++r) + { + item_number *rhsp = NULL; + /* Index of rule R in RHS. */ + prhs[r] = i; + /* RHS of the rule R. */ + for (rhsp = rules[r].rhs; *rhsp >= 0; ++rhsp) + rhs[i++] = *rhsp; + /* LHS of the rule R. */ + r1[r] = rules[r].lhs->number; + /* Length of rule R's RHS. */ + r2[r] = i - prhs[r]; + /* Separator in RHS. */ + rhs[i++] = -1; + /* Line where rule was defined. */ + rline[r] = rules[r].location.start.line; + /* Dynamic precedence (GLR). */ + dprec[r] = rules[r].dprec; + /* Merger-function index (GLR). */ + merger[r] = rules[r].merger; + } + if (i != nritems) + abort (); + + muscle_insert_item_number_table ("rhs", rhs, ritem[0], 1, nritems); + muscle_insert_unsigned_int_table ("prhs", prhs, 0, 0, nrules); + muscle_insert_unsigned_int_table ("rline", rline, 0, 0, nrules); + muscle_insert_symbol_number_table ("r1", r1, 0, 0, nrules); + muscle_insert_unsigned_int_table ("r2", r2, 0, 0, nrules); + muscle_insert_short_int_table ("dprec", dprec, 0, 0, nrules); + muscle_insert_short_int_table ("merger", merger, 0, 0, nrules); + + MUSCLE_INSERT_INT ("rules_number", nrules); + MUSCLE_INSERT_INT ("max_left_semantic_context", max_left_semantic_context); + + free (rhs); + free (prhs); + free (rline); + free (r1); + free (r2); + free (dprec); + free (merger); +} + +/*--------------------------------------------. +| Prepare the muscles related to the states. | +`--------------------------------------------*/ + +static void +prepare_states (void) +{ + state_number i; + symbol_number *values = MALLOC (values, nstates); + for (i = 0; i < nstates; ++i) + values[i] = states[i]->accessing_symbol; + muscle_insert_symbol_number_table ("stos", values, + 0, 1, nstates); + free (values); + + MUSCLE_INSERT_INT ("last", high); + MUSCLE_INSERT_INT ("final_state_number", final_state->number); + MUSCLE_INSERT_INT ("states_number", nstates); +} + + + +/*---------------------------------. +| Output the user actions to OUT. | +`---------------------------------*/ + +static void +user_actions_output (FILE *out) +{ + rule_number r; + + fputs ("m4_define([b4_actions], \n[[", out); + for (r = 0; r < nrules; ++r) + if (rules[r].action) + { + fprintf (out, " case %d:\n", r + 1); + + fprintf (out, "]b4_syncline([[%d]], ", + rules[r].action_location.start.line); + escaped_file_name_output (out, rules[r].action_location.start.file); + fprintf (out, ")[\n"); + fprintf (out, " %s\n break;\n\n", + rules[r].action); + } + fputs ("]])\n\n", out); +} + +/*--------------------------------------. +| Output the merge functions to OUT. | +`--------------------------------------*/ + +static void +merger_output (FILE *out) +{ + int n; + merger_list* p; + + fputs ("m4_define([b4_mergers], \n[[", out); + for (n = 1, p = merge_functions; p != NULL; n += 1, p = p->next) + { + if (p->type[0] == '\0') + fprintf (out, " case %d: *yy0 = %s (*yy0, *yy1); break;\n", + n, p->name); + else + fprintf (out, " case %d: yy0->%s = %s (*yy0, *yy1); break;\n", + n, p->type, p->name); + } + fputs ("]])\n\n", out); +} + +/*--------------------------------------. +| Output the tokens definition to OUT. | +`--------------------------------------*/ + +static void +token_definitions_output (FILE *out) +{ + int i; + char const *sep = ""; + + fputs ("m4_define([b4_tokens], \n[", out); + for (i = 0; i < ntokens; ++i) + { + symbol *sym = symbols[i]; + int number = sym->user_token_number; + + /* At this stage, if there are literal aliases, they are part of + SYMBOLS, so we should not find symbols which are the aliases + here. */ + if (number == USER_NUMBER_ALIAS) + abort (); + + /* Skip error token. */ + if (sym == errtoken) + continue; + + /* If this string has an alias, then it is necessarily the alias + which is to be output. */ + if (sym->alias) + sym = sym->alias; + + /* Don't output literal chars or strings (when defined only as a + string). Note that must be done after the alias resolution: + think about `%token 'f' "f"'. */ + if (sym->tag[0] == '\'' || sym->tag[0] == '\"') + continue; + + /* Don't #define nonliteral tokens whose names contain periods + or '$' (as does the default value of the EOF token). */ + if (strchr (sym->tag, '.') || strchr (sym->tag, '$')) + continue; + + fprintf (out, "%s[[[%s]], [%d]]", + sep, sym->tag, number); + sep = ",\n"; + } + fputs ("])\n\n", out); +} + + +/*---------------------------------------. +| Output the symbol destructors to OUT. | +`---------------------------------------*/ + +static void +symbol_destructors_output (FILE *out) +{ + int i; + char const *sep = ""; + + fputs ("m4_define([b4_symbol_destructors], \n[", out); + for (i = 0; i < nsyms; ++i) + if (symbols[i]->destructor) + { + symbol *sym = symbols[i]; + + /* Filename, lineno, + Symbol-name, Symbol-number, + destructor, typename. */ + fprintf (out, "%s[", sep); + sep = ",\n"; + escaped_file_name_output (out, sym->destructor_location.start.file); + fprintf (out, ", [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]", + sym->destructor_location.start.line, + sym->tag, + sym->number, + sym->destructor, + sym->type_name); + } + fputs ("])\n\n", out); +} + + +/*------------------------------------. +| Output the symbol printers to OUT. | +`------------------------------------*/ + +static void +symbol_printers_output (FILE *out) +{ + int i; + char const *sep = ""; + + fputs ("m4_define([b4_symbol_printers], \n[", out); + for (i = 0; i < nsyms; ++i) + if (symbols[i]->printer) + { + symbol *sym = symbols[i]; + + /* Filename, lineno, + Symbol-name, Symbol-number, + printer, typename. */ + fprintf (out, "%s[", sep); + sep = ",\n"; + escaped_file_name_output (out, sym->printer_location.start.file); + fprintf (out, ", [[%d]], [[%s]], [[%d]], [[%s]], [[%s]]]", + sym->printer_location.start.line, + sym->tag, + sym->number, + sym->printer, + sym->type_name); + } + fputs ("])\n\n", out); +} + + +static void +prepare_actions (void) +{ + /* Figure out the actions for the specified state, indexed by + lookahead token type. */ + + muscle_insert_rule_number_table ("defact", yydefact, + yydefact[0], 1, nstates); + + /* Figure out what to do after reducing with each rule, depending on + the saved state from before the beginning of parsing the data + that matched this rule. */ + muscle_insert_state_number_table ("defgoto", yydefgoto, + yydefgoto[0], 1, nsyms - ntokens); + + + /* Output PACT. */ + muscle_insert_base_table ("pact", base, + base[0], 1, nstates); + MUSCLE_INSERT_INT ("pact_ninf", base_ninf); + + /* Output PGOTO. */ + muscle_insert_base_table ("pgoto", base, + base[nstates], nstates + 1, nvectors); + + muscle_insert_base_table ("table", table, + table[0], 1, high + 1); + MUSCLE_INSERT_INT ("table_ninf", table_ninf); + + muscle_insert_base_table ("check", check, + check[0], 1, high + 1); + + /* GLR parsing slightly modifies YYTABLE and YYCHECK (and thus + YYPACT) so that in states with unresolved conflicts, the default + reduction is not used in the conflicted entries, so that there is + a place to put a conflict pointer. + + This means that YYCONFLP and YYCONFL are nonsense for a non-GLR + parser, so we could avoid accidents by not writing them out in + that case. Nevertheless, it seems even better to be able to use + the GLR skeletons even without the non-deterministic tables. */ + muscle_insert_unsigned_int_table ("conflict_list_heads", conflict_table, + conflict_table[0], 1, high + 1); + muscle_insert_unsigned_int_table ("conflicting_rules", conflict_list, + conflict_list[0], 1, conflict_list_cnt); +} + + +/*---------------------------. +| Call the skeleton parser. | +`---------------------------*/ + +static void +output_skeleton (void) +{ + FILE *in; + FILE *out; + int filter_fd[2]; + char const *argv[6]; + pid_t pid; + + /* Compute the names of the package data dir and skeleton file. + Test whether m4sugar.m4 is readable, to check for proper + installation. A faulty installation can cause deadlock, so a + cheap sanity check is worthwhile. */ + char const m4sugar[] = "m4sugar/m4sugar.m4"; + char *full_m4sugar; + char *full_cm4; + char *full_skeleton; + char const *p; + char const *m4 = (p = getenv ("M4")) ? p : M4; + char const *pkgdatadir = (p = getenv ("BISON_PKGDATADIR")) ? p : PKGDATADIR; + size_t skeleton_size = strlen (skeleton) + 1; + size_t pkgdatadirlen = strlen (pkgdatadir); + while (pkgdatadirlen && pkgdatadir[pkgdatadirlen - 1] == '/') + pkgdatadirlen--; + full_skeleton = xmalloc (pkgdatadirlen + 1 + + (skeleton_size < sizeof m4sugar + ? sizeof m4sugar : skeleton_size)); + strcpy (full_skeleton, pkgdatadir); + full_skeleton[pkgdatadirlen] = '/'; + strcpy (full_skeleton + pkgdatadirlen + 1, m4sugar); + full_m4sugar = xstrdup (full_skeleton); + strcpy (full_skeleton + pkgdatadirlen + 1, "c.m4"); + full_cm4 = xstrdup (full_skeleton); + strcpy (full_skeleton + pkgdatadirlen + 1, skeleton); + xfclose (xfopen (full_m4sugar, "r")); + + /* Create an m4 subprocess connected to us via two pipes. */ + + if (trace_flag & trace_tools) + fprintf (stderr, "running: %s %s - %s %s\n", + m4, full_m4sugar, full_cm4, full_skeleton); + + argv[0] = m4; + argv[1] = full_m4sugar; + argv[2] = "-"; + argv[3] = full_cm4; + argv[4] = full_skeleton; + argv[5] = NULL; + + init_subpipe (); + pid = create_subpipe (argv, filter_fd); + free (full_m4sugar); + free (full_cm4); + free (full_skeleton); + + out = fdopen (filter_fd[0], "w"); + if (! out) + error (EXIT_FAILURE, get_errno (), "fdopen"); + + /* Output the definitions of all the muscles. */ + fputs ("m4_init()\n", out); + + user_actions_output (out); + merger_output (out); + token_definitions_output (out); + symbol_destructors_output (out); + symbol_printers_output (out); + + muscles_m4_output (out); + + fputs ("m4_wrap([m4_divert_pop(0)])\n", out); + fputs ("m4_divert_push(0)dnl\n", out); + xfclose (out); + + /* Read and process m4's output. */ + timevar_push (TV_M4); + in = fdopen (filter_fd[1], "r"); + if (! in) + error (EXIT_FAILURE, get_errno (), "fdopen"); + scan_skel (in); + xfclose (in); + reap_subpipe (pid, m4); + timevar_pop (TV_M4); +} + +static void +prepare (void) +{ + /* Flags. */ + MUSCLE_INSERT_BOOL ("debug", debug_flag); + MUSCLE_INSERT_BOOL ("defines_flag", defines_flag); + MUSCLE_INSERT_BOOL ("error_verbose", error_verbose); + MUSCLE_INSERT_BOOL ("locations_flag", locations_flag); + MUSCLE_INSERT_BOOL ("pure", pure_parser); + MUSCLE_INSERT_BOOL ("synclines_flag", !no_lines_flag); + + /* File names. */ + MUSCLE_INSERT_STRING ("prefix", spec_name_prefix ? spec_name_prefix : "yy"); + + /* User Code. */ + obstack_1grow (&pre_prologue_obstack, 0); + obstack_1grow (&post_prologue_obstack, 0); + muscle_insert ("pre_prologue", obstack_finish (&pre_prologue_obstack)); + muscle_insert ("post_prologue", obstack_finish (&post_prologue_obstack)); + + /* Find the right skeleton file. */ + if (!skeleton) + { + if (glr_parser || nondeterministic_parser) + skeleton = "glr.c"; + else + skeleton = "yacc.c"; + } + + /* Parse the skeleton file and output the needed parsers. */ + MUSCLE_INSERT_C_STRING ("skeleton", skeleton); +} + + +/*----------------------------------------------------------. +| Output the parsing tables and the parser code to ftable. | +`----------------------------------------------------------*/ + +void +output (void) +{ + obstack_init (&format_obstack); + + prepare_symbols (); + prepare_rules (); + prepare_states (); + prepare_actions (); + + prepare (); + + /* Process the selected skeleton file. */ + output_skeleton (); + + obstack_free (&format_obstack, NULL); + obstack_free (&pre_prologue_obstack, NULL); + obstack_free (&post_prologue_obstack, NULL); +} diff --git a/src/apps/bin/bison/src/output.h b/src/apps/bin/bison/src/output.h new file mode 100644 index 0000000000..de69e6afb2 --- /dev/null +++ b/src/apps/bin/bison/src/output.h @@ -0,0 +1,29 @@ +/* Output the generated parsing program for bison, + Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + +#ifndef OUTPUT_H_ +# define OUTPUT_H_ + +extern bool error_verbose; + +/* Output the parsing tables and the parser code to FTABLE. */ +void output (void); + +#endif /* !OUTPUT_H_ */ diff --git a/src/apps/bin/bison/src/parse-gram.c b/src/apps/bin/bison/src/parse-gram.c new file mode 100644 index 0000000000..5597ab162c --- /dev/null +++ b/src/apps/bin/bison/src/parse-gram.c @@ -0,0 +1,2059 @@ +/* A Bison parser, made by GNU Bison 1.875d. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Written by Richard Stallman by simplifying the original so called + ``semantic'' parser. */ + +/* All symbols defined below should begin with yy or YY, to avoid + infringing on user name space. This should be done even for local + variables, as they might otherwise be expanded by user macros. + There are some unavoidable exceptions within include files to + define necessary library symbols; they are noted "INFRINGES ON + USER NAME SPACE" below. */ + +/* Identify Bison output. */ +#define YYBISON 1 + +/* Skeleton name. */ +#define YYSKELETON_NAME "yacc.c" + +/* Pure parsers. */ +#define YYPURE 1 + +/* Using locations. */ +#define YYLSP_NEEDED 1 + +/* If NAME_PREFIX is specified substitute the variables and functions + names. */ +#define yyparse gram_parse +#define yylex gram_lex +#define yyerror gram_error +#define yylval gram_lval +#define yychar gram_char +#define yydebug gram_debug +#define yynerrs gram_nerrs +#define yylloc gram_lloc + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + GRAM_EOF = 0, + STRING = 258, + INT = 259, + PERCENT_TOKEN = 260, + PERCENT_NTERM = 261, + PERCENT_TYPE = 262, + PERCENT_DESTRUCTOR = 263, + PERCENT_PRINTER = 264, + PERCENT_UNION = 265, + PERCENT_LEFT = 266, + PERCENT_RIGHT = 267, + PERCENT_NONASSOC = 268, + PERCENT_PREC = 269, + PERCENT_DPREC = 270, + PERCENT_MERGE = 271, + PERCENT_DEBUG = 272, + PERCENT_DEFAULT_PREC = 273, + PERCENT_DEFINE = 274, + PERCENT_DEFINES = 275, + PERCENT_ERROR_VERBOSE = 276, + PERCENT_EXPECT = 277, + PERCENT_EXPECT_RR = 278, + PERCENT_FILE_PREFIX = 279, + PERCENT_GLR_PARSER = 280, + PERCENT_INITIAL_ACTION = 281, + PERCENT_LEX_PARAM = 282, + PERCENT_LOCATIONS = 283, + PERCENT_NAME_PREFIX = 284, + PERCENT_NO_DEFAULT_PREC = 285, + PERCENT_NO_LINES = 286, + PERCENT_NONDETERMINISTIC_PARSER = 287, + PERCENT_OUTPUT = 288, + PERCENT_PARSE_PARAM = 289, + PERCENT_PURE_PARSER = 290, + PERCENT_SKELETON = 291, + PERCENT_START = 292, + PERCENT_TOKEN_TABLE = 293, + PERCENT_VERBOSE = 294, + PERCENT_YACC = 295, + TYPE = 296, + EQUAL = 297, + SEMICOLON = 298, + PIPE = 299, + ID = 300, + ID_COLON = 301, + PERCENT_PERCENT = 302, + PROLOGUE = 303, + EPILOGUE = 304, + BRACED_CODE = 305 + }; +#endif +#define GRAM_EOF 0 +#define STRING 258 +#define INT 259 +#define PERCENT_TOKEN 260 +#define PERCENT_NTERM 261 +#define PERCENT_TYPE 262 +#define PERCENT_DESTRUCTOR 263 +#define PERCENT_PRINTER 264 +#define PERCENT_UNION 265 +#define PERCENT_LEFT 266 +#define PERCENT_RIGHT 267 +#define PERCENT_NONASSOC 268 +#define PERCENT_PREC 269 +#define PERCENT_DPREC 270 +#define PERCENT_MERGE 271 +#define PERCENT_DEBUG 272 +#define PERCENT_DEFAULT_PREC 273 +#define PERCENT_DEFINE 274 +#define PERCENT_DEFINES 275 +#define PERCENT_ERROR_VERBOSE 276 +#define PERCENT_EXPECT 277 +#define PERCENT_EXPECT_RR 278 +#define PERCENT_FILE_PREFIX 279 +#define PERCENT_GLR_PARSER 280 +#define PERCENT_INITIAL_ACTION 281 +#define PERCENT_LEX_PARAM 282 +#define PERCENT_LOCATIONS 283 +#define PERCENT_NAME_PREFIX 284 +#define PERCENT_NO_DEFAULT_PREC 285 +#define PERCENT_NO_LINES 286 +#define PERCENT_NONDETERMINISTIC_PARSER 287 +#define PERCENT_OUTPUT 288 +#define PERCENT_PARSE_PARAM 289 +#define PERCENT_PURE_PARSER 290 +#define PERCENT_SKELETON 291 +#define PERCENT_START 292 +#define PERCENT_TOKEN_TABLE 293 +#define PERCENT_VERBOSE 294 +#define PERCENT_YACC 295 +#define TYPE 296 +#define EQUAL 297 +#define SEMICOLON 298 +#define PIPE 299 +#define ID 300 +#define ID_COLON 301 +#define PERCENT_PERCENT 302 +#define PROLOGUE 303 +#define EPILOGUE 304 +#define BRACED_CODE 305 + + + + +/* Copy the first part of user declarations. */ +#line 1 "parse-gram.y" +/* Bison Grammar Parser -*- C -*- + + Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA +*/ + +#include "system.h" + +#include "complain.h" +#include "conflicts.h" +#include "files.h" +#include "getargs.h" +#include "gram.h" +#include "muscle_tab.h" +#include "output.h" +#include "reader.h" +#include "symlist.h" + +#define YYLLOC_DEFAULT(Current, Rhs, N) (Current) = lloc_default (Rhs, N) +static YYLTYPE lloc_default (YYLTYPE const *, int); + +/* Request detailed syntax error messages, and pass them to GRAM_ERROR. + FIXME: depends on the undocumented availability of YYLLOC. */ +#undef yyerror +#define yyerror(Msg) \ + gram_error (&yylloc, Msg) +static void gram_error (location const *, char const *); + +#define YYPRINT(File, Type, Value) \ + print_token_value (File, Type, &Value) +static void print_token_value (FILE *, int, YYSTYPE const *); + +static void add_param (char const *, char *, location); + +symbol_class current_class = unknown_sym; +uniqstr current_type = 0; +symbol *current_lhs; +location current_lhs_location; +assoc current_assoc; +int current_prec = 0; + + +/* Enabling traces. */ +#ifndef YYDEBUG +# define YYDEBUG 1 +#endif + +/* Enabling verbose error messages. */ +#ifdef YYERROR_VERBOSE +# undef YYERROR_VERBOSE +# define YYERROR_VERBOSE 1 +#else +# define YYERROR_VERBOSE 1 +#endif + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 78 "parse-gram.y" +typedef union YYSTYPE { + symbol *symbol; + symbol_list *list; + int integer; + char *chars; + assoc assoc; + uniqstr uniqstr; +} YYSTYPE; +/* Line 191 of yacc.c. */ +#line 254 "parse-gram.c" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + +#if ! defined (YYLTYPE) && ! defined (YYLTYPE_IS_DECLARED) +typedef struct YYLTYPE +{ + int first_line; + int first_column; + int last_line; + int last_column; +} YYLTYPE; +# define yyltype YYLTYPE /* obsolescent; will be withdrawn */ +# define YYLTYPE_IS_DECLARED 1 +# define YYLTYPE_IS_TRIVIAL 1 +#endif + + +/* Copy the second part of user declarations. */ + + +/* Line 214 of yacc.c. */ +#line 278 "parse-gram.c" + +#if ! defined (yyoverflow) || YYERROR_VERBOSE + +# ifndef YYFREE +# define YYFREE free +# endif +# ifndef YYMALLOC +# define YYMALLOC malloc +# endif + +/* The parser invokes alloca or malloc; define the necessary symbols. */ + +# ifdef YYSTACK_USE_ALLOCA +# if YYSTACK_USE_ALLOCA +# define YYSTACK_ALLOC alloca +# endif +# else +# if defined (alloca) || defined (_ALLOCA_H) +# define YYSTACK_ALLOC alloca +# else +# ifdef __GNUC__ +# define YYSTACK_ALLOC __builtin_alloca +# endif +# endif +# endif + +# ifdef YYSTACK_ALLOC + /* Pacify GCC's `empty if-body' warning. */ +# define YYSTACK_FREE(Ptr) do { /* empty */; } while (0) +# else +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +# define YYSTACK_ALLOC YYMALLOC +# define YYSTACK_FREE YYFREE +# endif +#endif /* ! defined (yyoverflow) || YYERROR_VERBOSE */ + + +#if (! defined (yyoverflow) \ + && (! defined (__cplusplus) \ + || (defined (YYLTYPE_IS_TRIVIAL) && YYLTYPE_IS_TRIVIAL \ + && defined (YYSTYPE_IS_TRIVIAL) && YYSTYPE_IS_TRIVIAL))) + +/* A type that is properly aligned for any stack member. */ +union yyalloc +{ + short int yyss; + YYSTYPE yyvs; + YYLTYPE yyls; +}; + +/* The size of the maximum gap between one aligned stack and the next. */ +# define YYSTACK_GAP_MAXIMUM (sizeof (union yyalloc) - 1) + +/* The size of an array large to enough to hold all stacks, each with + N elements. */ +# define YYSTACK_BYTES(N) \ + ((N) * (sizeof (short int) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \ + + 2 * YYSTACK_GAP_MAXIMUM) + +/* Copy COUNT objects from FROM to TO. The source and destination do + not overlap. */ +# ifndef YYCOPY +# if defined (__GNUC__) && 1 < __GNUC__ +# define YYCOPY(To, From, Count) \ + __builtin_memcpy (To, From, (Count) * sizeof (*(From))) +# else +# define YYCOPY(To, From, Count) \ + do \ + { \ + register YYSIZE_T yyi; \ + for (yyi = 0; yyi < (Count); yyi++) \ + (To)[yyi] = (From)[yyi]; \ + } \ + while (0) +# endif +# endif + +/* Relocate STACK from its old location to the new one. The + local variables YYSIZE and YYSTACKSIZE give the old and new number of + elements in the stack, and YYPTR gives the new location of the + stack. Advance YYPTR to a properly aligned location for the next + stack. */ +# define YYSTACK_RELOCATE(Stack) \ + do \ + { \ + YYSIZE_T yynewbytes; \ + YYCOPY (&yyptr->Stack, Stack, yysize); \ + Stack = &yyptr->Stack; \ + yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \ + yyptr += yynewbytes / sizeof (*yyptr); \ + } \ + while (0) + +#endif + +#if defined (__STDC__) || defined (__cplusplus) + typedef signed char yysigned_char; +#else + typedef short int yysigned_char; +#endif + +/* YYFINAL -- State number of the termination state. */ +#define YYFINAL 3 +/* YYLAST -- Last index in YYTABLE. */ +#define YYLAST 158 + +/* YYNTOKENS -- Number of terminals. */ +#define YYNTOKENS 51 +/* YYNNTS -- Number of nonterminals. */ +#define YYNNTS 25 +/* YYNRULES -- Number of rules. */ +#define YYNRULES 79 +/* YYNRULES -- Number of states. */ +#define YYNSTATES 108 + +/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */ +#define YYUNDEFTOK 2 +#define YYMAXUTOK 305 + +#define YYTRANSLATE(YYX) \ + ((unsigned int) (YYX) <= YYMAXUTOK ? yytranslate[YYX] : YYUNDEFTOK) + +/* YYTRANSLATE[YYLEX] -- Bison symbol number corresponding to YYLEX. */ +static const unsigned char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 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, 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 +}; + +#if YYDEBUG +/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in + YYRHS. */ +static const unsigned char yyprhs[] = +{ + 0, 0, 3, 8, 9, 12, 14, 16, 18, 22, + 24, 26, 29, 32, 36, 38, 40, 42, 44, 48, + 50, 52, 56, 58, 60, 63, 65, 67, 69, 71, + 73, 75, 78, 80, 83, 86, 88, 90, 91, 95, + 96, 100, 104, 108, 110, 112, 114, 115, 117, 119, + 122, 124, 126, 129, 132, 136, 138, 141, 143, 146, + 148, 151, 154, 155, 159, 161, 165, 168, 169, 172, + 175, 179, 183, 187, 189, 191, 193, 195, 197, 198 +}; + +/* YYRHS -- A `-1'-separated list of the rules' RHS. */ +static const yysigned_char yyrhs[] = +{ + 52, 0, -1, 53, 47, 65, 75, -1, -1, 53, + 54, -1, 55, -1, 48, -1, 17, -1, 19, 74, + 74, -1, 20, -1, 21, -1, 22, 4, -1, 23, + 4, -1, 24, 42, 74, -1, 25, -1, 26, -1, + 27, -1, 28, -1, 29, 42, 74, -1, 31, -1, + 32, -1, 33, 42, 74, -1, 34, -1, 35, -1, + 36, 74, -1, 38, -1, 39, -1, 40, -1, 43, + -1, 59, -1, 56, -1, 37, 71, -1, 10, -1, + 8, 62, -1, 9, 62, -1, 18, -1, 30, -1, + -1, 6, 57, 64, -1, -1, 5, 58, 64, -1, + 7, 41, 62, -1, 60, 61, 62, -1, 11, -1, + 12, -1, 13, -1, -1, 41, -1, 71, -1, 62, + 71, -1, 41, -1, 45, -1, 45, 4, -1, 45, + 73, -1, 45, 4, 73, -1, 63, -1, 64, 63, + -1, 66, -1, 65, 66, -1, 67, -1, 55, 43, + -1, 1, 43, -1, -1, 46, 68, 69, -1, 70, + -1, 69, 44, 70, -1, 69, 43, -1, -1, 70, + 71, -1, 70, 72, -1, 70, 14, 71, -1, 70, + 15, 4, -1, 70, 16, 41, -1, 45, -1, 73, + -1, 50, -1, 3, -1, 3, -1, -1, 47, 49, + -1 +}; + +/* YYRLINE[YYN] -- source line where rule number YYN was defined. */ +static const unsigned short int yyrline[] = +{ + 0, 171, 171, 179, 181, 185, 186, 187, 188, 189, + 190, 191, 192, 193, 194, 199, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 214, 215, 219, + 220, 221, 225, 231, 238, 245, 249, 256, 256, 261, + 261, 266, 276, 291, 292, 293, 297, 298, 304, 305, + 310, 314, 319, 325, 331, 342, 343, 352, 353, 359, + 360, 365, 372, 372, 376, 377, 378, 383, 384, 386, + 388, 390, 392, 397, 398, 402, 408, 417, 424, 426 +}; +#endif + +#if YYDEBUG || YYERROR_VERBOSE +/* YYTNME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM. + First, the terminals, then, starting at YYNTOKENS, nonterminals. */ +static const char *const yytname[] = +{ + "\"end of file\"", "error", "$undefined", "\"string\"", "\"integer\"", + "\"%token\"", "\"%nterm\"", "\"%type\"", "\"%destructor {...}\"", + "\"%printer {...}\"", "\"%union {...}\"", "\"%left\"", "\"%right\"", + "\"%nonassoc\"", "\"%prec\"", "\"%dprec\"", "\"%merge\"", "\"%debug\"", + "\"%default-prec\"", "\"%define\"", "\"%defines\"", "\"%error-verbose\"", + "\"%expect\"", "\"%expect-rr\"", "\"%file-prefix\"", "\"%glr-parser\"", + "\"%initial-action {...}\"", "\"%lex-param {...}\"", "\"%locations\"", + "\"%name-prefix\"", "\"%no-default-prec\"", "\"%no-lines\"", + "\"%nondeterministic-parser\"", "\"%output\"", "\"%parse-param {...}\"", + "\"%pure-parser\"", "\"%skeleton\"", "\"%start\"", "\"%token-table\"", + "\"%verbose\"", "\"%yacc\"", "\"type\"", "\"=\"", "\";\"", "\"|\"", + "\"identifier\"", "\"identifier:\"", "\"%%\"", "\"%{...%}\"", + "\"epilogue\"", "\"{...}\"", "$accept", "input", "declarations", + "declaration", "grammar_declaration", "symbol_declaration", "@1", "@2", + "precedence_declaration", "precedence_declarator", "type.opt", + "symbols.1", "symbol_def", "symbol_defs.1", "grammar", + "rules_or_grammar_declaration", "rules", "@3", "rhses.1", "rhs", + "symbol", "action", "string_as_id", "string_content", "epilogue.opt", 0 +}; +#endif + +# ifdef YYPRINT +/* YYTOKNUM[YYLEX-NUM] -- Internal token number corresponding to + token YYLEX-NUM. */ +static const unsigned short int yytoknum[] = +{ + 0, 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 +}; +# endif + +/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */ +static const unsigned char yyr1[] = +{ + 0, 51, 52, 53, 53, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, 54, 55, + 55, 55, 55, 55, 55, 55, 55, 57, 56, 58, + 56, 56, 59, 60, 60, 60, 61, 61, 62, 62, + 63, 63, 63, 63, 63, 64, 64, 65, 65, 66, + 66, 66, 68, 67, 69, 69, 69, 70, 70, 70, + 70, 70, 70, 71, 71, 72, 73, 74, 75, 75 +}; + +/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */ +static const unsigned char yyr2[] = +{ + 0, 2, 4, 0, 2, 1, 1, 1, 3, 1, + 1, 2, 2, 3, 1, 1, 1, 1, 3, 1, + 1, 3, 1, 1, 2, 1, 1, 1, 1, 1, + 1, 2, 1, 2, 2, 1, 1, 0, 3, 0, + 3, 3, 3, 1, 1, 1, 0, 1, 1, 2, + 1, 1, 2, 2, 3, 1, 2, 1, 2, 1, + 2, 2, 0, 3, 1, 3, 2, 0, 2, 2, + 3, 3, 3, 1, 1, 1, 1, 1, 0, 2 +}; + +/* YYDEFACT[STATE-NAME] -- Default rule to reduce with in state + STATE-NUM when YYTABLE doesn't specify something else to do. Zero + means the default is an error. */ +static const unsigned char yydefact[] = +{ + 3, 0, 0, 1, 39, 37, 0, 0, 0, 32, + 43, 44, 45, 7, 35, 0, 9, 10, 0, 0, + 0, 14, 15, 16, 17, 0, 36, 19, 20, 0, + 22, 23, 0, 0, 25, 26, 27, 28, 0, 6, + 4, 5, 30, 29, 46, 0, 0, 0, 76, 73, + 33, 48, 74, 34, 77, 0, 11, 12, 0, 0, + 0, 24, 31, 0, 62, 0, 0, 57, 59, 47, + 0, 50, 51, 55, 40, 38, 41, 49, 8, 13, + 18, 21, 61, 67, 60, 0, 58, 2, 42, 52, + 53, 56, 63, 64, 79, 54, 66, 67, 0, 0, + 0, 75, 68, 69, 65, 70, 71, 72 +}; + +/* YYDEFGOTO[NTERM-NUM]. */ +static const yysigned_char yydefgoto[] = +{ + -1, 1, 2, 40, 65, 42, 46, 45, 43, 44, + 70, 50, 73, 74, 66, 67, 68, 83, 92, 93, + 51, 103, 52, 55, 87 +}; + +/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing + STATE-NUM. */ +#define YYPACT_NINF -67 +static const yysigned_char yypact[] = +{ + -67, 5, 110, -67, -67, -67, -34, 0, 0, -67, + -67, -67, -67, -67, -67, 13, -67, -67, 20, 31, + -17, -67, -67, -67, -67, -6, -67, -67, -67, -5, + -67, -67, 13, 0, -67, -67, -67, -67, 68, -67, + -67, -67, -67, -67, -3, -37, -37, 0, -67, -67, + 0, -67, -67, 0, -67, 13, -67, -67, 13, 13, + 13, -67, -67, -2, -67, 3, 21, -67, -67, -67, + 0, -67, 6, -67, -37, -37, 0, -67, -67, -67, + -67, -67, -67, -67, -67, 1, -67, -67, 0, 39, + -67, -67, -32, -1, -67, -67, -67, -67, 0, 43, + 7, -67, -67, -67, -1, -67, -67, -67 +}; + +/* YYPGOTO[NTERM-NUM]. */ +static const yysigned_char yypgoto[] = +{ + -67, -67, -67, -67, 50, -67, -67, -67, -67, -67, + -67, -7, -56, 8, -67, -13, -67, -67, -67, -41, + -33, -67, -66, 29, -67 +}; + +/* YYTABLE[YYPACT[STATE-NUM]]. What to do in state STATE-NUM. If + positive, shift that token. If negative, reduce the rule which + number is the opposite. If zero, do what YYDEFACT says. + If YYTABLE_NINF, syntax error. */ +#define YYTABLE_NINF -79 +static const yysigned_char yytable[] = +{ + 62, 53, 48, 48, 71, 3, 90, 47, 72, 48, + 89, 96, 97, 98, 99, 100, 54, 77, 91, 91, + 77, -78, 63, 95, 56, 58, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 57, 59, 60, 69, 14, + 76, 82, 48, 77, 49, 49, 84, 106, 107, 101, + 94, 26, 41, 86, 75, 77, 104, 0, 33, 0, + 102, 61, 0, 88, 0, 105, 0, 64, 85, 63, + 0, 102, 0, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 0, 0, 78, 0, 14, 79, 80, 81, + 0, 0, 0, 0, 0, 0, 0, 0, 26, 0, + 0, 0, 0, 0, 0, 33, 0, 0, 0, 0, + 0, 0, 0, 0, 64, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 0, 0, 0, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, + 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, + 36, 0, 0, 37, 0, 0, 0, 38, 39 +}; + +static const yysigned_char yycheck[] = +{ + 33, 8, 3, 3, 41, 0, 72, 41, 45, 3, + 4, 43, 44, 14, 15, 16, 3, 50, 74, 75, + 53, 0, 1, 89, 4, 42, 5, 6, 7, 8, + 9, 10, 11, 12, 13, 4, 42, 42, 41, 18, + 47, 43, 3, 76, 45, 45, 43, 4, 41, 50, + 49, 30, 2, 66, 46, 88, 97, -1, 37, -1, + 93, 32, -1, 70, -1, 98, -1, 46, 47, 1, + -1, 104, -1, 5, 6, 7, 8, 9, 10, 11, + 12, 13, -1, -1, 55, -1, 18, 58, 59, 60, + -1, -1, -1, -1, -1, -1, -1, -1, 30, -1, + -1, -1, -1, -1, -1, 37, -1, -1, -1, -1, + -1, -1, -1, -1, 46, 5, 6, 7, 8, 9, + 10, 11, 12, 13, -1, -1, -1, 17, 18, 19, + 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, + 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, -1, -1, 43, -1, -1, -1, 47, 48 +}; + +/* YYSTOS[STATE-NUM] -- The (internal number of the) accessing + symbol of state STATE-NUM. */ +static const unsigned char yystos[] = +{ + 0, 52, 53, 0, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 43, 47, 48, + 54, 55, 56, 59, 60, 58, 57, 41, 3, 45, + 62, 71, 73, 62, 3, 74, 4, 4, 42, 42, + 42, 74, 71, 1, 46, 55, 65, 66, 67, 41, + 61, 41, 45, 63, 64, 64, 62, 71, 74, 74, + 74, 74, 43, 68, 43, 47, 66, 75, 62, 4, + 73, 63, 69, 70, 49, 73, 43, 44, 14, 15, + 16, 50, 71, 72, 70, 71, 4, 41 +}; + +#if ! defined (YYSIZE_T) && defined (__SIZE_TYPE__) +# define YYSIZE_T __SIZE_TYPE__ +#endif +#if ! defined (YYSIZE_T) && defined (size_t) +# define YYSIZE_T size_t +#endif +#if ! defined (YYSIZE_T) +# if defined (__STDC__) || defined (__cplusplus) +# include /* INFRINGES ON USER NAME SPACE */ +# define YYSIZE_T size_t +# endif +#endif +#if ! defined (YYSIZE_T) +# define YYSIZE_T unsigned int +#endif + +#define yyerrok (yyerrstatus = 0) +#define yyclearin (yychar = YYEMPTY) +#define YYEMPTY (-2) +#define YYEOF 0 + +#define YYACCEPT goto yyacceptlab +#define YYABORT goto yyabortlab +#define YYERROR goto yyerrorlab + + +/* Like YYERROR except do call yyerror. This remains here temporarily + to ease the transition to the new meaning of YYERROR, for GCC. + Once GCC version 2 has supplanted version 1, this can go. */ + +#define YYFAIL goto yyerrlab + +#define YYRECOVERING() (!!yyerrstatus) + +#define YYBACKUP(Token, Value) \ +do \ + if (yychar == YYEMPTY && yylen == 1) \ + { \ + yychar = (Token); \ + yylval = (Value); \ + yytoken = YYTRANSLATE (yychar); \ + YYPOPSTACK; \ + goto yybackup; \ + } \ + else \ + { \ + yyerror ("syntax error: cannot back up");\ + YYERROR; \ + } \ +while (0) + +#define YYTERROR 1 +#define YYERRCODE 256 + +/* YYLLOC_DEFAULT -- Compute the default location (before the actions + are run). */ + +#ifndef YYLLOC_DEFAULT +# define YYLLOC_DEFAULT(Current, Rhs, N) \ + ((Current).first_line = (Rhs)[1].first_line, \ + (Current).first_column = (Rhs)[1].first_column, \ + (Current).last_line = (Rhs)[N].last_line, \ + (Current).last_column = (Rhs)[N].last_column) +#endif + +/* YYLEX -- calling `yylex' with the right arguments. */ + +#ifdef YYLEX_PARAM +# define YYLEX yylex (&yylval, &yylloc, YYLEX_PARAM) +#else +# define YYLEX yylex (&yylval, &yylloc) +#endif + +/* Enable debugging if requested. */ +#if YYDEBUG + +# ifndef YYFPRINTF +# include /* INFRINGES ON USER NAME SPACE */ +# define YYFPRINTF fprintf +# endif + +# define YYDPRINTF(Args) \ +do { \ + if (yydebug) \ + YYFPRINTF Args; \ +} while (0) + +# define YYDSYMPRINT(Args) \ +do { \ + if (yydebug) \ + yysymprint Args; \ +} while (0) + +# define YYDSYMPRINTF(Title, Token, Value, Location) \ +do { \ + if (yydebug) \ + { \ + YYFPRINTF (stderr, "%s ", Title); \ + yysymprint (stderr, \ + Token, Value, Location); \ + YYFPRINTF (stderr, "\n"); \ + } \ +} while (0) + +/*------------------------------------------------------------------. +| yy_stack_print -- Print the state stack from its BOTTOM up to its | +| TOP (included). | +`------------------------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_stack_print (short int *bottom, short int *top) +#else +static void +yy_stack_print (bottom, top) + short int *bottom; + short int *top; +#endif +{ + YYFPRINTF (stderr, "Stack now"); + for (/* Nothing. */; bottom <= top; ++bottom) + YYFPRINTF (stderr, " %d", *bottom); + YYFPRINTF (stderr, "\n"); +} + +# define YY_STACK_PRINT(Bottom, Top) \ +do { \ + if (yydebug) \ + yy_stack_print ((Bottom), (Top)); \ +} while (0) + + +/*------------------------------------------------. +| Report that the YYRULE is going to be reduced. | +`------------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yy_reduce_print (int yyrule) +#else +static void +yy_reduce_print (yyrule) + int yyrule; +#endif +{ + int yyi; + unsigned int yylno = yyrline[yyrule]; + YYFPRINTF (stderr, "Reducing stack by rule %d (line %u), ", + yyrule - 1, yylno); + /* Print the symbols being reduced, and their result. */ + for (yyi = yyprhs[yyrule]; 0 <= yyrhs[yyi]; yyi++) + YYFPRINTF (stderr, "%s ", yytname [yyrhs[yyi]]); + YYFPRINTF (stderr, "-> %s\n", yytname [yyr1[yyrule]]); +} + +# define YY_REDUCE_PRINT(Rule) \ +do { \ + if (yydebug) \ + yy_reduce_print (Rule); \ +} while (0) + +/* Nonzero means print parse trace. It is left uninitialized so that + multiple parsers can coexist. */ +int yydebug; +#else /* !YYDEBUG */ +# define YYDPRINTF(Args) +# define YYDSYMPRINT(Args) +# define YYDSYMPRINTF(Title, Token, Value, Location) +# define YY_STACK_PRINT(Bottom, Top) +# define YY_REDUCE_PRINT(Rule) +#endif /* !YYDEBUG */ + + +/* YYINITDEPTH -- initial size of the parser's stacks. */ +#ifndef YYINITDEPTH +# define YYINITDEPTH 200 +#endif + +/* YYMAXDEPTH -- maximum size the stacks can grow to (effective only + if the built-in stack extension method is used). + + Do not make this value too large; the results are undefined if + SIZE_MAX < YYSTACK_BYTES (YYMAXDEPTH) + evaluated with infinite-precision integer arithmetic. */ + +#if defined (YYMAXDEPTH) && YYMAXDEPTH == 0 +# undef YYMAXDEPTH +#endif + +#ifndef YYMAXDEPTH +# define YYMAXDEPTH 10000 +#endif + + + +#if YYERROR_VERBOSE + +# ifndef yystrlen +# if defined (__GLIBC__) && defined (_STRING_H) +# define yystrlen strlen +# else +/* Return the length of YYSTR. */ +static YYSIZE_T +# if defined (__STDC__) || defined (__cplusplus) +yystrlen (const char *yystr) +# else +yystrlen (yystr) + const char *yystr; +# endif +{ + register const char *yys = yystr; + + while (*yys++ != '\0') + continue; + + return yys - yystr - 1; +} +# endif +# endif + +# ifndef yystpcpy +# if defined (__GLIBC__) && defined (_STRING_H) && defined (_GNU_SOURCE) +# define yystpcpy stpcpy +# else +/* Copy YYSRC to YYDEST, returning the address of the terminating '\0' in + YYDEST. */ +static char * +# if defined (__STDC__) || defined (__cplusplus) +yystpcpy (char *yydest, const char *yysrc) +# else +yystpcpy (yydest, yysrc) + char *yydest; + const char *yysrc; +# endif +{ + register char *yyd = yydest; + register const char *yys = yysrc; + + while ((*yyd++ = *yys++) != '\0') + continue; + + return yyd - 1; +} +# endif +# endif + +#endif /* !YYERROR_VERBOSE */ + + + +#if YYDEBUG +/*--------------------------------. +| Print this symbol on YYOUTPUT. | +`--------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yysymprint (FILE *yyoutput, int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp) +#else +static void +yysymprint (yyoutput, yytype, yyvaluep, yylocationp) + FILE *yyoutput; + int yytype; + YYSTYPE *yyvaluep; + YYLTYPE *yylocationp; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + (void) yylocationp; + + if (yytype < YYNTOKENS) + { + YYFPRINTF (yyoutput, "token %s (", yytname[yytype]); +# ifdef YYPRINT + YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep); +# endif + } + else + YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]); + + switch (yytype) + { + default: + break; + } + YYFPRINTF (yyoutput, ")"); +} + +#endif /* ! YYDEBUG */ +/*-----------------------------------------------. +| Release the memory associated to this symbol. | +`-----------------------------------------------*/ + +#if defined (__STDC__) || defined (__cplusplus) +static void +yydestruct (int yytype, YYSTYPE *yyvaluep, YYLTYPE *yylocationp) +#else +static void +yydestruct (yytype, yyvaluep, yylocationp) + int yytype; + YYSTYPE *yyvaluep; + YYLTYPE *yylocationp; +#endif +{ + /* Pacify ``unused variable'' warnings. */ + (void) yyvaluep; + (void) yylocationp; + + switch (yytype) + { + + default: + break; + } +} + + +/* Prevent warnings from -Wmissing-prototypes. */ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM); +# else +int yyparse (); +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int yyparse (void); +#else +int yyparse (); +#endif +#endif /* ! YYPARSE_PARAM */ + + + + + + +/*----------. +| yyparse. | +`----------*/ + +#ifdef YYPARSE_PARAM +# if defined (__STDC__) || defined (__cplusplus) +int yyparse (void *YYPARSE_PARAM) +# else +int yyparse (YYPARSE_PARAM) + void *YYPARSE_PARAM; +# endif +#else /* ! YYPARSE_PARAM */ +#if defined (__STDC__) || defined (__cplusplus) +int +yyparse (void) +#else +int +yyparse () + +#endif +#endif +{ + /* The lookahead symbol. */ +int yychar; + +/* The semantic value of the lookahead symbol. */ +YYSTYPE yylval; + +/* Number of syntax errors so far. */ +int yynerrs; +/* Location data for the lookahead symbol. */ +YYLTYPE yylloc; + + register int yystate; + register int yyn; + int yyresult; + /* Number of tokens to shift before error messages enabled. */ + int yyerrstatus; + /* Lookahead token as an internal (translated) token number. */ + int yytoken = 0; + + /* Three stacks and their tools: + `yyss': related to states, + `yyvs': related to semantic values, + `yyls': related to locations. + + Refer to the stacks thru separate pointers, to allow yyoverflow + to reallocate them elsewhere. */ + + /* The state stack. */ + short int yyssa[YYINITDEPTH]; + short int *yyss = yyssa; + register short int *yyssp; + + /* The semantic value stack. */ + YYSTYPE yyvsa[YYINITDEPTH]; + YYSTYPE *yyvs = yyvsa; + register YYSTYPE *yyvsp; + + /* The location stack. */ + YYLTYPE yylsa[YYINITDEPTH]; + YYLTYPE *yyls = yylsa; + YYLTYPE *yylsp; + YYLTYPE *yylerrsp; + +#define YYPOPSTACK (yyvsp--, yyssp--, yylsp--) + + YYSIZE_T yystacksize = YYINITDEPTH; + + /* The variables used to return semantic value and location from the + action routines. */ + YYSTYPE yyval; + YYLTYPE yyloc; + + /* When reducing, the number of symbols on the RHS of the reduced + rule. */ + int yylen; + + YYDPRINTF ((stderr, "Starting parse\n")); + + yystate = 0; + yyerrstatus = 0; + yynerrs = 0; + yychar = YYEMPTY; /* Cause a token to be read. */ + + /* Initialize stack pointers. + Waste one element of value and location stack + so that they stay on the same level as the state stack. + The wasted elements are never initialized. */ + + yyssp = yyss; + yyvsp = yyvs; + yylsp = yyls; + + /* User initialization code. */ + #line 68 "parse-gram.y" +{ + /* Bison's grammar can initial empty locations, hence a default + location is needed. */ + (*yylsp).start.file = (*yylsp).end.file = current_file; + (*yylsp).start.line = (*yylsp).end.line = 1; + (*yylsp).start.column = (*yylsp).end.column = 0; +} +/* Line 818 of yacc.c. */ +#line 1118 "parse-gram.c" + goto yysetstate; + +/*------------------------------------------------------------. +| yynewstate -- Push a new state, which is found in yystate. | +`------------------------------------------------------------*/ + yynewstate: + /* In all cases, when you get here, the value and location stacks + have just been pushed. so pushing a state here evens the stacks. + */ + yyssp++; + + yysetstate: + *yyssp = yystate; + + if (yyss + yystacksize - 1 <= yyssp) + { + /* Get the current used size of the three stacks, in elements. */ + YYSIZE_T yysize = yyssp - yyss + 1; + +#ifdef yyoverflow + { + /* Give user a chance to reallocate the stack. Use copies of + these so that the &'s don't force the real ones into + memory. */ + YYSTYPE *yyvs1 = yyvs; + short int *yyss1 = yyss; + YYLTYPE *yyls1 = yyls; + + /* Each stack pointer address is followed by the size of the + data in use in that stack, in bytes. This used to be a + conditional around just the two extra args, but that might + be undefined if yyoverflow is a macro. */ + yyoverflow ("parser stack overflow", + &yyss1, yysize * sizeof (*yyssp), + &yyvs1, yysize * sizeof (*yyvsp), + &yyls1, yysize * sizeof (*yylsp), + &yystacksize); + yyls = yyls1; + yyss = yyss1; + yyvs = yyvs1; + } +#else /* no yyoverflow */ +# ifndef YYSTACK_RELOCATE + goto yyoverflowlab; +# else + /* Extend the stack our own way. */ + if (YYMAXDEPTH <= yystacksize) + goto yyoverflowlab; + yystacksize *= 2; + if (YYMAXDEPTH < yystacksize) + yystacksize = YYMAXDEPTH; + + { + short int *yyss1 = yyss; + union yyalloc *yyptr = + (union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize)); + if (! yyptr) + goto yyoverflowlab; + YYSTACK_RELOCATE (yyss); + YYSTACK_RELOCATE (yyvs); + YYSTACK_RELOCATE (yyls); +# undef YYSTACK_RELOCATE + if (yyss1 != yyssa) + YYSTACK_FREE (yyss1); + } +# endif +#endif /* no yyoverflow */ + + yyssp = yyss + yysize - 1; + yyvsp = yyvs + yysize - 1; + yylsp = yyls + yysize - 1; + + YYDPRINTF ((stderr, "Stack size increased to %lu\n", + (unsigned long int) yystacksize)); + + if (yyss + yystacksize - 1 <= yyssp) + YYABORT; + } + + YYDPRINTF ((stderr, "Entering state %d\n", yystate)); + + goto yybackup; + +/*-----------. +| yybackup. | +`-----------*/ +yybackup: + +/* Do appropriate processing given the current state. */ +/* Read a lookahead token if we need one and don't already have one. */ +/* yyresume: */ + + /* First try to decide what to do without reference to lookahead token. */ + + yyn = yypact[yystate]; + if (yyn == YYPACT_NINF) + goto yydefault; + + /* Not known => get a lookahead token if don't already have one. */ + + /* YYCHAR is either YYEMPTY or YYEOF or a valid lookahead symbol. */ + if (yychar == YYEMPTY) + { + YYDPRINTF ((stderr, "Reading a token: ")); + yychar = YYLEX; + } + + if (yychar <= YYEOF) + { + yychar = yytoken = YYEOF; + YYDPRINTF ((stderr, "Now at end of input.\n")); + } + else + { + yytoken = YYTRANSLATE (yychar); + YYDSYMPRINTF ("Next token is", yytoken, &yylval, &yylloc); + } + + /* If the proper action on seeing token YYTOKEN is to reduce or to + detect an error, take that action. */ + yyn += yytoken; + if (yyn < 0 || YYLAST < yyn || yycheck[yyn] != yytoken) + goto yydefault; + yyn = yytable[yyn]; + if (yyn <= 0) + { + if (yyn == 0 || yyn == YYTABLE_NINF) + goto yyerrlab; + yyn = -yyn; + goto yyreduce; + } + + if (yyn == YYFINAL) + YYACCEPT; + + /* Shift the lookahead token. */ + YYDPRINTF ((stderr, "Shifting token %s, ", yytname[yytoken])); + + /* Discard the token being shifted unless it is eof. */ + if (yychar != YYEOF) + yychar = YYEMPTY; + + *++yyvsp = yylval; + *++yylsp = yylloc; + + /* Count tokens shifted since error; after three, turn off error + status. */ + if (yyerrstatus) + yyerrstatus--; + + yystate = yyn; + goto yynewstate; + + +/*-----------------------------------------------------------. +| yydefault -- do the default action for the current state. | +`-----------------------------------------------------------*/ +yydefault: + yyn = yydefact[yystate]; + if (yyn == 0) + goto yyerrlab; + goto yyreduce; + + +/*-----------------------------. +| yyreduce -- Do a reduction. | +`-----------------------------*/ +yyreduce: + /* yyn is the number of a rule to reduce with. */ + yylen = yyr2[yyn]; + + /* If YYLEN is nonzero, implement the default value of the action: + `$$ = $1'. + + Otherwise, the following line sets YYVAL to garbage. + This behavior is undocumented and Bison + users should not rely upon it. Assigning to YYVAL + unconditionally makes the parser a bit smaller, and it avoids a + GCC warning that YYVAL may be used uninitialized. */ + yyval = yyvsp[1-yylen]; + + /* Default location. */ + YYLLOC_DEFAULT (yyloc, yylsp - yylen, yylen); + YY_REDUCE_PRINT (yyn); + switch (yyn) + { + case 6: +#line 186 "parse-gram.y" + { prologue_augment (yyvsp[0].chars, yylsp[0]); } + break; + + case 7: +#line 187 "parse-gram.y" + { debug_flag = true; } + break; + + case 8: +#line 188 "parse-gram.y" + { muscle_insert (yyvsp[-1].chars, yyvsp[0].chars); } + break; + + case 9: +#line 189 "parse-gram.y" + { defines_flag = true; } + break; + + case 10: +#line 190 "parse-gram.y" + { error_verbose = true; } + break; + + case 11: +#line 191 "parse-gram.y" + { expected_sr_conflicts = yyvsp[0].integer; } + break; + + case 12: +#line 192 "parse-gram.y" + { expected_rr_conflicts = yyvsp[0].integer; } + break; + + case 13: +#line 193 "parse-gram.y" + { spec_file_prefix = yyvsp[0].chars; } + break; + + case 14: +#line 195 "parse-gram.y" + { + nondeterministic_parser = true; + glr_parser = true; + } + break; + + case 15: +#line 200 "parse-gram.y" + { + muscle_code_grow ("initial_action", yyvsp[0].chars, yylsp[0]); + } + break; + + case 16: +#line 203 "parse-gram.y" + { add_param ("lex_param", yyvsp[0].chars, yylsp[0]); } + break; + + case 17: +#line 204 "parse-gram.y" + { locations_flag = true; } + break; + + case 18: +#line 205 "parse-gram.y" + { spec_name_prefix = yyvsp[0].chars; } + break; + + case 19: +#line 206 "parse-gram.y" + { no_lines_flag = true; } + break; + + case 20: +#line 207 "parse-gram.y" + { nondeterministic_parser = true; } + break; + + case 21: +#line 208 "parse-gram.y" + { spec_outfile = yyvsp[0].chars; } + break; + + case 22: +#line 209 "parse-gram.y" + { add_param ("parse_param", yyvsp[0].chars, yylsp[0]); } + break; + + case 23: +#line 210 "parse-gram.y" + { pure_parser = true; } + break; + + case 24: +#line 211 "parse-gram.y" + { skeleton = yyvsp[0].chars; } + break; + + case 25: +#line 212 "parse-gram.y" + { token_table_flag = true; } + break; + + case 26: +#line 213 "parse-gram.y" + { report_flag = report_states; } + break; + + case 27: +#line 214 "parse-gram.y" + { yacc_flag = true; } + break; + + case 31: +#line 222 "parse-gram.y" + { + grammar_start_symbol_set (yyvsp[0].symbol, yylsp[0]); + } + break; + + case 32: +#line 226 "parse-gram.y" + { + typed = true; + MUSCLE_INSERT_INT ("stype_line", yylsp[0].start.line); + muscle_insert ("stype", yyvsp[0].chars); + } + break; + + case 33: +#line 232 "parse-gram.y" + { + symbol_list *list; + for (list = yyvsp[0].list; list; list = list->next) + symbol_destructor_set (list->sym, yyvsp[-1].chars, yylsp[-1]); + symbol_list_free (yyvsp[0].list); + } + break; + + case 34: +#line 239 "parse-gram.y" + { + symbol_list *list; + for (list = yyvsp[0].list; list; list = list->next) + symbol_printer_set (list->sym, yyvsp[-1].chars, list->location); + symbol_list_free (yyvsp[0].list); + } + break; + + case 35: +#line 246 "parse-gram.y" + { + default_prec = true; + } + break; + + case 36: +#line 250 "parse-gram.y" + { + default_prec = false; + } + break; + + case 37: +#line 256 "parse-gram.y" + { current_class = nterm_sym; } + break; + + case 38: +#line 257 "parse-gram.y" + { + current_class = unknown_sym; + current_type = NULL; + } + break; + + case 39: +#line 261 "parse-gram.y" + { current_class = token_sym; } + break; + + case 40: +#line 262 "parse-gram.y" + { + current_class = unknown_sym; + current_type = NULL; + } + break; + + case 41: +#line 267 "parse-gram.y" + { + symbol_list *list; + for (list = yyvsp[0].list; list; list = list->next) + symbol_type_set (list->sym, yyvsp[-1].uniqstr, yylsp[-1]); + symbol_list_free (yyvsp[0].list); + } + break; + + case 42: +#line 277 "parse-gram.y" + { + symbol_list *list; + ++current_prec; + for (list = yyvsp[0].list; list; list = list->next) + { + symbol_type_set (list->sym, current_type, yylsp[-1]); + symbol_precedence_set (list->sym, current_prec, yyvsp[-2].assoc, yylsp[-2]); + } + symbol_list_free (yyvsp[0].list); + current_type = NULL; + } + break; + + case 43: +#line 291 "parse-gram.y" + { yyval.assoc = left_assoc; } + break; + + case 44: +#line 292 "parse-gram.y" + { yyval.assoc = right_assoc; } + break; + + case 45: +#line 293 "parse-gram.y" + { yyval.assoc = non_assoc; } + break; + + case 46: +#line 297 "parse-gram.y" + { current_type = NULL; } + break; + + case 47: +#line 298 "parse-gram.y" + { current_type = yyvsp[0].uniqstr; } + break; + + case 48: +#line 304 "parse-gram.y" + { yyval.list = symbol_list_new (yyvsp[0].symbol, yylsp[0]); } + break; + + case 49: +#line 305 "parse-gram.y" + { yyval.list = symbol_list_prepend (yyvsp[-1].list, yyvsp[0].symbol, yylsp[0]); } + break; + + case 50: +#line 311 "parse-gram.y" + { + current_type = yyvsp[0].uniqstr; + } + break; + + case 51: +#line 315 "parse-gram.y" + { + symbol_class_set (yyvsp[0].symbol, current_class, yylsp[0]); + symbol_type_set (yyvsp[0].symbol, current_type, yylsp[0]); + } + break; + + case 52: +#line 320 "parse-gram.y" + { + symbol_class_set (yyvsp[-1].symbol, current_class, yylsp[-1]); + symbol_type_set (yyvsp[-1].symbol, current_type, yylsp[-1]); + symbol_user_token_number_set (yyvsp[-1].symbol, yyvsp[0].integer, yylsp[0]); + } + break; + + case 53: +#line 326 "parse-gram.y" + { + symbol_class_set (yyvsp[-1].symbol, current_class, yylsp[-1]); + symbol_type_set (yyvsp[-1].symbol, current_type, yylsp[-1]); + symbol_make_alias (yyvsp[-1].symbol, yyvsp[0].symbol, yyloc); + } + break; + + case 54: +#line 332 "parse-gram.y" + { + symbol_class_set (yyvsp[-2].symbol, current_class, yylsp[-2]); + symbol_type_set (yyvsp[-2].symbol, current_type, yylsp[-2]); + symbol_user_token_number_set (yyvsp[-2].symbol, yyvsp[-1].integer, yylsp[-1]); + symbol_make_alias (yyvsp[-2].symbol, yyvsp[0].symbol, yyloc); + } + break; + + case 60: +#line 361 "parse-gram.y" + { + if (yacc_flag) + complain_at (yyloc, _("POSIX forbids declarations in the grammar")); + } + break; + + case 61: +#line 366 "parse-gram.y" + { + yyerrok; + } + break; + + case 62: +#line 372 "parse-gram.y" + { current_lhs = yyvsp[0].symbol; current_lhs_location = yylsp[0]; } + break; + + case 64: +#line 376 "parse-gram.y" + { grammar_rule_end (yylsp[0]); } + break; + + case 65: +#line 377 "parse-gram.y" + { grammar_rule_end (yylsp[0]); } + break; + + case 67: +#line 383 "parse-gram.y" + { grammar_rule_begin (current_lhs, current_lhs_location); } + break; + + case 68: +#line 385 "parse-gram.y" + { grammar_current_rule_symbol_append (yyvsp[0].symbol, yylsp[0]); } + break; + + case 69: +#line 387 "parse-gram.y" + { grammar_current_rule_action_append (yyvsp[0].chars, yylsp[0]); } + break; + + case 70: +#line 389 "parse-gram.y" + { grammar_current_rule_prec_set (yyvsp[0].symbol, yylsp[0]); } + break; + + case 71: +#line 391 "parse-gram.y" + { grammar_current_rule_dprec_set (yyvsp[0].integer, yylsp[0]); } + break; + + case 72: +#line 393 "parse-gram.y" + { grammar_current_rule_merge_set (yyvsp[0].uniqstr, yylsp[0]); } + break; + + case 73: +#line 397 "parse-gram.y" + { yyval.symbol = yyvsp[0].symbol; } + break; + + case 74: +#line 398 "parse-gram.y" + { yyval.symbol = yyvsp[0].symbol; } + break; + + case 75: +#line 403 "parse-gram.y" + { yyval.chars = yyvsp[0].chars; } + break; + + case 76: +#line 409 "parse-gram.y" + { + yyval.symbol = symbol_get (yyvsp[0].chars, yylsp[0]); + symbol_class_set (yyval.symbol, token_sym, yylsp[0]); + } + break; + + case 77: +#line 418 "parse-gram.y" + { + yyval.chars = yyvsp[0].chars + 1; + yyval.chars[strlen (yyval.chars) - 1] = '\0'; + } + break; + + case 79: +#line 427 "parse-gram.y" + { + muscle_code_grow ("epilogue", yyvsp[0].chars, yylsp[0]); + scanner_last_string_free (); + } + break; + + + } + +/* Line 1010 of yacc.c. */ +#line 1702 "parse-gram.c" + + yyvsp -= yylen; + yyssp -= yylen; + yylsp -= yylen; + + YY_STACK_PRINT (yyss, yyssp); + + *++yyvsp = yyval; + *++yylsp = yyloc; + + /* Now `shift' the result of the reduction. Determine what state + that goes to, based on the state we popped back to and the rule + number reduced by. */ + + yyn = yyr1[yyn]; + + yystate = yypgoto[yyn - YYNTOKENS] + *yyssp; + if (0 <= yystate && yystate <= YYLAST && yycheck[yystate] == *yyssp) + yystate = yytable[yystate]; + else + yystate = yydefgoto[yyn - YYNTOKENS]; + + goto yynewstate; + + +/*------------------------------------. +| yyerrlab -- here on detecting error | +`------------------------------------*/ +yyerrlab: + /* If not already recovering from an error, report this error. */ + if (!yyerrstatus) + { + ++yynerrs; +#if YYERROR_VERBOSE + yyn = yypact[yystate]; + + if (YYPACT_NINF < yyn && yyn < YYLAST) + { + YYSIZE_T yysize = 0; + int yytype = YYTRANSLATE (yychar); + const char* yyprefix; + char *yymsg; + int yyx; + + /* Start YYX at -YYN if negative to avoid negative indexes in + YYCHECK. */ + int yyxbegin = yyn < 0 ? -yyn : 0; + + /* Stay within bounds of both yycheck and yytname. */ + int yychecklim = YYLAST - yyn; + int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS; + int yycount = 0; + + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + yysize += yystrlen (yyprefix) + yystrlen (yytname [yyx]); + yycount += 1; + if (yycount == 5) + { + yysize = 0; + break; + } + } + yysize += (sizeof ("syntax error, unexpected ") + + yystrlen (yytname[yytype])); + yymsg = (char *) YYSTACK_ALLOC (yysize); + if (yymsg != 0) + { + char *yyp = yystpcpy (yymsg, "syntax error, unexpected "); + yyp = yystpcpy (yyp, yytname[yytype]); + + if (yycount < 5) + { + yyprefix = ", expecting "; + for (yyx = yyxbegin; yyx < yyxend; ++yyx) + if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR) + { + yyp = yystpcpy (yyp, yyprefix); + yyp = yystpcpy (yyp, yytname[yyx]); + yyprefix = " or "; + } + } + yyerror (yymsg); + YYSTACK_FREE (yymsg); + } + else + yyerror ("syntax error; also virtual memory exhausted"); + } + else +#endif /* YYERROR_VERBOSE */ + yyerror ("syntax error"); + } + + yylerrsp = yylsp; + + if (yyerrstatus == 3) + { + /* If just tried and failed to reuse lookahead token after an + error, discard it. */ + + if (yychar <= YYEOF) + { + /* If at end of input, pop the error token, + then the rest of the stack, then return failure. */ + if (yychar == YYEOF) + for (;;) + { + YYPOPSTACK; + if (yyssp == yyss) + YYABORT; + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[*yyssp], yyvsp, yylsp); + } + } + else + { + YYDSYMPRINTF ("Error: discarding", yytoken, &yylval, &yylloc); + yydestruct (yytoken, &yylval, &yylloc); + yychar = YYEMPTY; + *++yylerrsp = yylloc; + } + } + + /* Else will try to reuse lookahead token after shifting the error + token. */ + goto yyerrlab1; + + +/*---------------------------------------------------. +| yyerrorlab -- error raised explicitly by YYERROR. | +`---------------------------------------------------*/ +yyerrorlab: + +#ifdef __GNUC__ + /* Pacify GCC when the user code never invokes YYERROR and the label + yyerrorlab therefore never appears in user code. */ + if (0) + goto yyerrorlab; +#endif + + yyvsp -= yylen; + yyssp -= yylen; + yystate = *yyssp; + yylerrsp = yylsp; + *++yylerrsp = yyloc; + yylsp -= yylen; + goto yyerrlab1; + + +/*-------------------------------------------------------------. +| yyerrlab1 -- common code for both syntax error and YYERROR. | +`-------------------------------------------------------------*/ +yyerrlab1: + yyerrstatus = 3; /* Each real token shifted decrements this. */ + + for (;;) + { + yyn = yypact[yystate]; + if (yyn != YYPACT_NINF) + { + yyn += YYTERROR; + if (0 <= yyn && yyn <= YYLAST && yycheck[yyn] == YYTERROR) + { + yyn = yytable[yyn]; + if (0 < yyn) + break; + } + } + + /* Pop the current state because it cannot handle the error token. */ + if (yyssp == yyss) + YYABORT; + + YYDSYMPRINTF ("Error: popping", yystos[*yyssp], yyvsp, yylsp); + yydestruct (yystos[yystate], yyvsp, yylsp); + YYPOPSTACK; + yystate = *yyssp; + YY_STACK_PRINT (yyss, yyssp); + } + + if (yyn == YYFINAL) + YYACCEPT; + + YYDPRINTF ((stderr, "Shifting error token, ")); + + *++yyvsp = yylval; + YYLLOC_DEFAULT (yyloc, yylsp, yylerrsp - yylsp); + *++yylsp = yyloc; + + yystate = yyn; + goto yynewstate; + + +/*-------------------------------------. +| yyacceptlab -- YYACCEPT comes here. | +`-------------------------------------*/ +yyacceptlab: + yyresult = 0; + goto yyreturn; + +/*-----------------------------------. +| yyabortlab -- YYABORT comes here. | +`-----------------------------------*/ +yyabortlab: + yyresult = 1; + goto yyreturn; + +#ifndef yyoverflow +/*----------------------------------------------. +| yyoverflowlab -- parser overflow comes here. | +`----------------------------------------------*/ +yyoverflowlab: + yyerror ("parser stack overflow"); + yyresult = 2; + /* Fall through. */ +#endif + +yyreturn: +#ifndef yyoverflow + if (yyss != yyssa) + YYSTACK_FREE (yyss); +#endif + return yyresult; +} + + +#line 433 "parse-gram.y" + + + +/* Return the location of the left-hand side of a rule whose + right-hand side is RHS[1] ... RHS[N]. Ignore empty nonterminals in + the right-hand side, and return an empty location equal to the end + boundary of RHS[0] if the right-hand side is empty. */ + +static YYLTYPE +lloc_default (YYLTYPE const *rhs, int n) +{ + int i; + YYLTYPE loc; + loc.start = loc.end = rhs[n].end; + + /* Ignore empty nonterminals the start of the the right-hand side. + Do not bother to ignore them at the end of the right-hand side, + since empty nonterminals have the same end as their predecessors. */ + for (i = 1; i <= n; i++) + if (! equal_boundaries (rhs[i].start, rhs[i].end)) + { + loc.start = rhs[i].start; + break; + } + + return loc; +} + + +/* Add a lex-param or a parse-param (depending on TYPE) with + declaration DECL and location LOC. */ + +static void +add_param (char const *type, char *decl, location loc) +{ + static char const alphanum[] = + "0123456789" + "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "_"; + char const *alpha = alphanum + 10; + char const *name_start = NULL; + char *p; + + for (p = decl; *p; p++) + if ((p == decl || ! strchr (alphanum, p[-1])) && strchr (alpha, p[0])) + name_start = p; + + /* Strip the surrounding '{' and '}'. */ + decl++; + p[-1] = '\0'; + + if (! name_start) + complain_at (loc, _("missing identifier in parameter declaration")); + else + { + char *name; + size_t name_len; + + for (name_len = 1; + name_start[name_len] && strchr (alphanum, name_start[name_len]); + name_len++) + continue; + + name = xmalloc (name_len + 1); + memcpy (name, name_start, name_len); + name[name_len] = '\0'; + muscle_pair_list_grow (type, decl, name); + free (name); + } + + scanner_last_string_free (); +} + +/*----------------------------------------------------. +| When debugging the parser, display tokens' values. | +`----------------------------------------------------*/ + +static void +print_token_value (FILE *file, int type, YYSTYPE const *value) +{ + fputc (' ', file); + switch (type) + { + case ID: + fprintf (file, " = %s", value->symbol->tag); + break; + + case INT: + fprintf (file, " = %d", value->integer); + break; + + case STRING: + fprintf (file, " = \"%s\"", value->chars); + break; + + case TYPE: + fprintf (file, " = <%s>", value->uniqstr); + break; + + case BRACED_CODE: + case PERCENT_DESTRUCTOR: + case PERCENT_LEX_PARAM: + case PERCENT_PARSE_PARAM: + case PERCENT_PRINTER: + case PERCENT_UNION: + case PROLOGUE: + case EPILOGUE: + fprintf (file, " = {{ %s }}", value->chars); + break; + + default: + fprintf (file, "unknown token type"); + break; + } +} + +static void +gram_error (location const *loc, char const *msg) +{ + complain_at (*loc, "%s", msg); +} + +char const * +token_name (int type) +{ + return yytname[type]; +} + diff --git a/src/apps/bin/bison/src/parse-gram.h b/src/apps/bin/bison/src/parse-gram.h new file mode 100644 index 0000000000..b6cb75c621 --- /dev/null +++ b/src/apps/bin/bison/src/parse-gram.h @@ -0,0 +1,170 @@ +/* A Bison parser, made by GNU Bison 1.875d. */ + +/* Skeleton parser for Yacc-like parsing with Bison, + Copyright (C) 1984, 1989, 1990, 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +/* As a special exception, when this file is copied by Bison into a + Bison output file, you may use that output file without restriction. + This special exception was added by the Free Software Foundation + in version 1.24 of Bison. */ + +/* Tokens. */ +#ifndef YYTOKENTYPE +# define YYTOKENTYPE + /* Put the tokens into the symbol table, so that GDB and other debuggers + know about them. */ + enum yytokentype { + GRAM_EOF = 0, + STRING = 258, + INT = 259, + PERCENT_TOKEN = 260, + PERCENT_NTERM = 261, + PERCENT_TYPE = 262, + PERCENT_DESTRUCTOR = 263, + PERCENT_PRINTER = 264, + PERCENT_UNION = 265, + PERCENT_LEFT = 266, + PERCENT_RIGHT = 267, + PERCENT_NONASSOC = 268, + PERCENT_PREC = 269, + PERCENT_DPREC = 270, + PERCENT_MERGE = 271, + PERCENT_DEBUG = 272, + PERCENT_DEFAULT_PREC = 273, + PERCENT_DEFINE = 274, + PERCENT_DEFINES = 275, + PERCENT_ERROR_VERBOSE = 276, + PERCENT_EXPECT = 277, + PERCENT_EXPECT_RR = 278, + PERCENT_FILE_PREFIX = 279, + PERCENT_GLR_PARSER = 280, + PERCENT_INITIAL_ACTION = 281, + PERCENT_LEX_PARAM = 282, + PERCENT_LOCATIONS = 283, + PERCENT_NAME_PREFIX = 284, + PERCENT_NO_DEFAULT_PREC = 285, + PERCENT_NO_LINES = 286, + PERCENT_NONDETERMINISTIC_PARSER = 287, + PERCENT_OUTPUT = 288, + PERCENT_PARSE_PARAM = 289, + PERCENT_PURE_PARSER = 290, + PERCENT_SKELETON = 291, + PERCENT_START = 292, + PERCENT_TOKEN_TABLE = 293, + PERCENT_VERBOSE = 294, + PERCENT_YACC = 295, + TYPE = 296, + EQUAL = 297, + SEMICOLON = 298, + PIPE = 299, + ID = 300, + ID_COLON = 301, + PERCENT_PERCENT = 302, + PROLOGUE = 303, + EPILOGUE = 304, + BRACED_CODE = 305 + }; +#endif +#define GRAM_EOF 0 +#define STRING 258 +#define INT 259 +#define PERCENT_TOKEN 260 +#define PERCENT_NTERM 261 +#define PERCENT_TYPE 262 +#define PERCENT_DESTRUCTOR 263 +#define PERCENT_PRINTER 264 +#define PERCENT_UNION 265 +#define PERCENT_LEFT 266 +#define PERCENT_RIGHT 267 +#define PERCENT_NONASSOC 268 +#define PERCENT_PREC 269 +#define PERCENT_DPREC 270 +#define PERCENT_MERGE 271 +#define PERCENT_DEBUG 272 +#define PERCENT_DEFAULT_PREC 273 +#define PERCENT_DEFINE 274 +#define PERCENT_DEFINES 275 +#define PERCENT_ERROR_VERBOSE 276 +#define PERCENT_EXPECT 277 +#define PERCENT_EXPECT_RR 278 +#define PERCENT_FILE_PREFIX 279 +#define PERCENT_GLR_PARSER 280 +#define PERCENT_INITIAL_ACTION 281 +#define PERCENT_LEX_PARAM 282 +#define PERCENT_LOCATIONS 283 +#define PERCENT_NAME_PREFIX 284 +#define PERCENT_NO_DEFAULT_PREC 285 +#define PERCENT_NO_LINES 286 +#define PERCENT_NONDETERMINISTIC_PARSER 287 +#define PERCENT_OUTPUT 288 +#define PERCENT_PARSE_PARAM 289 +#define PERCENT_PURE_PARSER 290 +#define PERCENT_SKELETON 291 +#define PERCENT_START 292 +#define PERCENT_TOKEN_TABLE 293 +#define PERCENT_VERBOSE 294 +#define PERCENT_YACC 295 +#define TYPE 296 +#define EQUAL 297 +#define SEMICOLON 298 +#define PIPE 299 +#define ID 300 +#define ID_COLON 301 +#define PERCENT_PERCENT 302 +#define PROLOGUE 303 +#define EPILOGUE 304 +#define BRACED_CODE 305 + + + + +#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED) +#line 78 "parse-gram.y" +typedef union YYSTYPE { + symbol *symbol; + symbol_list *list; + int integer; + char *chars; + assoc assoc; + uniqstr uniqstr; +} YYSTYPE; +/* Line 1285 of yacc.c. */ +#line 148 "y.tab.h" +# define yystype YYSTYPE /* obsolescent; will be withdrawn */ +# define YYSTYPE_IS_DECLARED 1 +# define YYSTYPE_IS_TRIVIAL 1 +#endif + + + +#if ! defined (YYLTYPE) && ! defined (YYLTYPE_IS_DECLARED) +typedef struct YYLTYPE +{ + int first_line; + int first_column; + int last_line; + int last_column; +} YYLTYPE; +# define yyltype YYLTYPE /* obsolescent; will be withdrawn */ +# define YYLTYPE_IS_DECLARED 1 +# define YYLTYPE_IS_TRIVIAL 1 +#endif + + + + diff --git a/src/apps/bin/bison/src/parse-gram.y b/src/apps/bin/bison/src/parse-gram.y new file mode 100644 index 0000000000..fa35eb6410 --- /dev/null +++ b/src/apps/bin/bison/src/parse-gram.y @@ -0,0 +1,560 @@ +%{/* Bison Grammar Parser -*- C -*- + + Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA +*/ + +#include "system.h" + +#include "complain.h" +#include "conflicts.h" +#include "files.h" +#include "getargs.h" +#include "gram.h" +#include "muscle_tab.h" +#include "output.h" +#include "reader.h" +#include "symlist.h" + +#define YYLLOC_DEFAULT(Current, Rhs, N) (Current) = lloc_default (Rhs, N) +static YYLTYPE lloc_default (YYLTYPE const *, int); + +/* Request detailed syntax error messages, and pass them to GRAM_ERROR. + FIXME: depends on the undocumented availability of YYLLOC. */ +#undef yyerror +#define yyerror(Msg) \ + gram_error (&yylloc, Msg) +static void gram_error (location const *, char const *); + +#define YYPRINT(File, Type, Value) \ + print_token_value (File, Type, &Value) +static void print_token_value (FILE *, int, YYSTYPE const *); + +static void add_param (char const *, char *, location); + +symbol_class current_class = unknown_sym; +uniqstr current_type = 0; +symbol *current_lhs; +location current_lhs_location; +assoc current_assoc; +int current_prec = 0; +%} + +%debug +%defines +%locations +%pure-parser +%error-verbose +%defines +%name-prefix="gram_" + +%initial-action +{ + /* Bison's grammar can initial empty locations, hence a default + location is needed. */ + @$.start.file = @$.end.file = current_file; + @$.start.line = @$.end.line = 1; + @$.start.column = @$.end.column = 0; +} + +/* Only NUMBERS have a value. */ +%union +{ + symbol *symbol; + symbol_list *list; + int integer; + char *chars; + assoc assoc; + uniqstr uniqstr; +}; + +/* Define the tokens together with their human representation. */ +%token GRAM_EOF 0 "end of file" +%token STRING "string" +%token INT "integer" + +%token PERCENT_TOKEN "%token" +%token PERCENT_NTERM "%nterm" + +%token PERCENT_TYPE "%type" +%token PERCENT_DESTRUCTOR "%destructor {...}" +%token PERCENT_PRINTER "%printer {...}" + +%token PERCENT_UNION "%union {...}" + +%token PERCENT_LEFT "%left" +%token PERCENT_RIGHT "%right" +%token PERCENT_NONASSOC "%nonassoc" + +%token PERCENT_PREC "%prec" +%token PERCENT_DPREC "%dprec" +%token PERCENT_MERGE "%merge" + + +/*----------------------. +| Global Declarations. | +`----------------------*/ + +%token + PERCENT_DEBUG "%debug" + PERCENT_DEFAULT_PREC "%default-prec" + PERCENT_DEFINE "%define" + PERCENT_DEFINES "%defines" + PERCENT_ERROR_VERBOSE "%error-verbose" + PERCENT_EXPECT "%expect" + PERCENT_EXPECT_RR "%expect-rr" + PERCENT_FILE_PREFIX "%file-prefix" + PERCENT_GLR_PARSER "%glr-parser" + PERCENT_INITIAL_ACTION "%initial-action {...}" + PERCENT_LEX_PARAM "%lex-param {...}" + PERCENT_LOCATIONS "%locations" + PERCENT_NAME_PREFIX "%name-prefix" + PERCENT_NO_DEFAULT_PREC "%no-default-prec" + PERCENT_NO_LINES "%no-lines" + PERCENT_NONDETERMINISTIC_PARSER + "%nondeterministic-parser" + PERCENT_OUTPUT "%output" + PERCENT_PARSE_PARAM "%parse-param {...}" + PERCENT_PURE_PARSER "%pure-parser" + PERCENT_SKELETON "%skeleton" + PERCENT_START "%start" + PERCENT_TOKEN_TABLE "%token-table" + PERCENT_VERBOSE "%verbose" + PERCENT_YACC "%yacc" +; + +%token TYPE "type" +%token EQUAL "=" +%token SEMICOLON ";" +%token PIPE "|" +%token ID "identifier" +%token ID_COLON "identifier:" +%token PERCENT_PERCENT "%%" +%token PROLOGUE "%{...%}" +%token EPILOGUE "epilogue" +%token BRACED_CODE "{...}" + + +%type STRING string_content + "%destructor {...}" + "%initial-action {...}" + "%lex-param {...}" + "%parse-param {...}" + "%printer {...}" + "%union {...}" + BRACED_CODE action + PROLOGUE EPILOGUE +%type TYPE +%type INT +%type ID ID_COLON symbol string_as_id +%type precedence_declarator +%type symbols.1 +%% + +input: + declarations "%%" grammar epilogue.opt +; + + + /*------------------------------------. + | Declarations: before the first %%. | + `------------------------------------*/ + +declarations: + /* Nothing */ +| declarations declaration +; + +declaration: + grammar_declaration +| PROLOGUE { prologue_augment ($1, @1); } +| "%debug" { debug_flag = true; } +| "%define" string_content string_content { muscle_insert ($2, $3); } +| "%defines" { defines_flag = true; } +| "%error-verbose" { error_verbose = true; } +| "%expect" INT { expected_sr_conflicts = $2; } +| "%expect-rr" INT { expected_rr_conflicts = $2; } +| "%file-prefix" "=" string_content { spec_file_prefix = $3; } +| "%glr-parser" + { + nondeterministic_parser = true; + glr_parser = true; + } +| "%initial-action {...}" + { + muscle_code_grow ("initial_action", $1, @1); + } +| "%lex-param {...}" { add_param ("lex_param", $1, @1); } +| "%locations" { locations_flag = true; } +| "%name-prefix" "=" string_content { spec_name_prefix = $3; } +| "%no-lines" { no_lines_flag = true; } +| "%nondeterministic-parser" { nondeterministic_parser = true; } +| "%output" "=" string_content { spec_outfile = $3; } +| "%parse-param {...}" { add_param ("parse_param", $1, @1); } +| "%pure-parser" { pure_parser = true; } +| "%skeleton" string_content { skeleton = $2; } +| "%token-table" { token_table_flag = true; } +| "%verbose" { report_flag = report_states; } +| "%yacc" { yacc_flag = true; } +| /*FIXME: Err? What is this horror doing here? */ ";" +; + +grammar_declaration: + precedence_declaration +| symbol_declaration +| "%start" symbol + { + grammar_start_symbol_set ($2, @2); + } +| "%union {...}" + { + typed = true; + MUSCLE_INSERT_INT ("stype_line", @1.start.line); + muscle_insert ("stype", $1); + } +| "%destructor {...}" symbols.1 + { + symbol_list *list; + for (list = $2; list; list = list->next) + symbol_destructor_set (list->sym, $1, @1); + symbol_list_free ($2); + } +| "%printer {...}" symbols.1 + { + symbol_list *list; + for (list = $2; list; list = list->next) + symbol_printer_set (list->sym, $1, list->location); + symbol_list_free ($2); + } +| "%default-prec" + { + default_prec = true; + } +| "%no-default-prec" + { + default_prec = false; + } +; + +symbol_declaration: + "%nterm" { current_class = nterm_sym; } symbol_defs.1 + { + current_class = unknown_sym; + current_type = NULL; + } +| "%token" { current_class = token_sym; } symbol_defs.1 + { + current_class = unknown_sym; + current_type = NULL; + } +| "%type" TYPE symbols.1 + { + symbol_list *list; + for (list = $3; list; list = list->next) + symbol_type_set (list->sym, $2, @2); + symbol_list_free ($3); + } +; + +precedence_declaration: + precedence_declarator type.opt symbols.1 + { + symbol_list *list; + ++current_prec; + for (list = $3; list; list = list->next) + { + symbol_type_set (list->sym, current_type, @2); + symbol_precedence_set (list->sym, current_prec, $1, @1); + } + symbol_list_free ($3); + current_type = NULL; + } +; + +precedence_declarator: + "%left" { $$ = left_assoc; } +| "%right" { $$ = right_assoc; } +| "%nonassoc" { $$ = non_assoc; } +; + +type.opt: + /* Nothing. */ { current_type = NULL; } +| TYPE { current_type = $1; } +; + +/* One or more nonterminals to be %typed. */ + +symbols.1: + symbol { $$ = symbol_list_new ($1, @1); } +| symbols.1 symbol { $$ = symbol_list_prepend ($1, $2, @2); } +; + +/* One token definition. */ +symbol_def: + TYPE + { + current_type = $1; + } +| ID + { + symbol_class_set ($1, current_class, @1); + symbol_type_set ($1, current_type, @1); + } +| ID INT + { + symbol_class_set ($1, current_class, @1); + symbol_type_set ($1, current_type, @1); + symbol_user_token_number_set ($1, $2, @2); + } +| ID string_as_id + { + symbol_class_set ($1, current_class, @1); + symbol_type_set ($1, current_type, @1); + symbol_make_alias ($1, $2, @$); + } +| ID INT string_as_id + { + symbol_class_set ($1, current_class, @1); + symbol_type_set ($1, current_type, @1); + symbol_user_token_number_set ($1, $2, @2); + symbol_make_alias ($1, $3, @$); + } +; + +/* One or more symbol definitions. */ +symbol_defs.1: + symbol_def +| symbol_defs.1 symbol_def +; + + + /*------------------------------------------. + | The grammar section: between the two %%. | + `------------------------------------------*/ + +grammar: + rules_or_grammar_declaration +| grammar rules_or_grammar_declaration +; + +/* As a Bison extension, one can use the grammar declarations in the + body of the grammar. */ +rules_or_grammar_declaration: + rules +| grammar_declaration ";" + { + if (yacc_flag) + complain_at (@$, _("POSIX forbids declarations in the grammar")); + } +| error ";" + { + yyerrok; + } +; + +rules: + ID_COLON { current_lhs = $1; current_lhs_location = @1; } rhses.1 +; + +rhses.1: + rhs { grammar_rule_end (@1); } +| rhses.1 "|" rhs { grammar_rule_end (@3); } +| rhses.1 ";" +; + +rhs: + /* Nothing. */ + { grammar_rule_begin (current_lhs, current_lhs_location); } +| rhs symbol + { grammar_current_rule_symbol_append ($2, @2); } +| rhs action + { grammar_current_rule_action_append ($2, @2); } +| rhs "%prec" symbol + { grammar_current_rule_prec_set ($3, @3); } +| rhs "%dprec" INT + { grammar_current_rule_dprec_set ($3, @3); } +| rhs "%merge" TYPE + { grammar_current_rule_merge_set ($3, @3); } +; + +symbol: + ID { $$ = $1; } +| string_as_id { $$ = $1; } +; + +action: + BRACED_CODE + { $$ = $1; } +; + +/* A string used as an ID: we have to keep the quotes. */ +string_as_id: + STRING + { + $$ = symbol_get ($1, @1); + symbol_class_set ($$, token_sym, @1); + } +; + +/* A string used for its contents. Strip the quotes. */ +string_content: + STRING + { + $$ = $1 + 1; + $$[strlen ($$) - 1] = '\0'; + }; + + +epilogue.opt: + /* Nothing. */ +| "%%" EPILOGUE + { + muscle_code_grow ("epilogue", $2, @2); + scanner_last_string_free (); + } +; + +%% + + +/* Return the location of the left-hand side of a rule whose + right-hand side is RHS[1] ... RHS[N]. Ignore empty nonterminals in + the right-hand side, and return an empty location equal to the end + boundary of RHS[0] if the right-hand side is empty. */ + +static YYLTYPE +lloc_default (YYLTYPE const *rhs, int n) +{ + int i; + YYLTYPE loc; + loc.start = loc.end = rhs[n].end; + + /* Ignore empty nonterminals the start of the the right-hand side. + Do not bother to ignore them at the end of the right-hand side, + since empty nonterminals have the same end as their predecessors. */ + for (i = 1; i <= n; i++) + if (! equal_boundaries (rhs[i].start, rhs[i].end)) + { + loc.start = rhs[i].start; + break; + } + + return loc; +} + + +/* Add a lex-param or a parse-param (depending on TYPE) with + declaration DECL and location LOC. */ + +static void +add_param (char const *type, char *decl, location loc) +{ + static char const alphanum[] = + "0123456789" + "abcdefghijklmnopqrstuvwxyz" + "ABCDEFGHIJKLMNOPQRSTUVWXYZ" + "_"; + char const *alpha = alphanum + 10; + char const *name_start = NULL; + char *p; + + for (p = decl; *p; p++) + if ((p == decl || ! strchr (alphanum, p[-1])) && strchr (alpha, p[0])) + name_start = p; + + /* Strip the surrounding '{' and '}'. */ + decl++; + p[-1] = '\0'; + + if (! name_start) + complain_at (loc, _("missing identifier in parameter declaration")); + else + { + char *name; + size_t name_len; + + for (name_len = 1; + name_start[name_len] && strchr (alphanum, name_start[name_len]); + name_len++) + continue; + + name = xmalloc (name_len + 1); + memcpy (name, name_start, name_len); + name[name_len] = '\0'; + muscle_pair_list_grow (type, decl, name); + free (name); + } + + scanner_last_string_free (); +} + +/*----------------------------------------------------. +| When debugging the parser, display tokens' values. | +`----------------------------------------------------*/ + +static void +print_token_value (FILE *file, int type, YYSTYPE const *value) +{ + fputc (' ', file); + switch (type) + { + case ID: + fprintf (file, " = %s", value->symbol->tag); + break; + + case INT: + fprintf (file, " = %d", value->integer); + break; + + case STRING: + fprintf (file, " = \"%s\"", value->chars); + break; + + case TYPE: + fprintf (file, " = <%s>", value->uniqstr); + break; + + case BRACED_CODE: + case PERCENT_DESTRUCTOR: + case PERCENT_LEX_PARAM: + case PERCENT_PARSE_PARAM: + case PERCENT_PRINTER: + case PERCENT_UNION: + case PROLOGUE: + case EPILOGUE: + fprintf (file, " = {{ %s }}", value->chars); + break; + + default: + fprintf (file, "unknown token type"); + break; + } +} + +static void +gram_error (location const *loc, char const *msg) +{ + complain_at (*loc, "%s", msg); +} + +char const * +token_name (int type) +{ + return yytname[type]; +} diff --git a/src/apps/bin/bison/src/print.c b/src/apps/bin/bison/src/print.c new file mode 100644 index 0000000000..4f85524431 --- /dev/null +++ b/src/apps/bin/bison/src/print.c @@ -0,0 +1,575 @@ +/* Print information on generated parser, for bison, + + Copyright (C) 1984, 1986, 1989, 2000, 2001, 2002, 2003 + Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + +#include "system.h" + +#include +#include + +#include "LR0.h" +#include "closure.h" +#include "conflicts.h" +#include "files.h" +#include "getargs.h" +#include "gram.h" +#include "lalr.h" +#include "print.h" +#include "reader.h" +#include "reduce.h" +#include "state.h" +#include "symtab.h" + +static bitset shiftset; +static bitset lookaheadset; + +#if 0 +static void +print_token (int extnum, int token) +{ + fprintf (out, _(" type %d is %s\n"), extnum, tags[token]); +} +#endif + + + +/*---------------------------------------. +| *WIDTH := max (*WIDTH, strlen (STR)). | +`---------------------------------------*/ + +static void +max_length (size_t *width, const char *str) +{ + size_t len = strlen (str); + if (len > *width) + *width = len; +} + +/*--------------------------------. +| Report information on a state. | +`--------------------------------*/ + +static void +print_core (FILE *out, state *s) +{ + int i; + item_number *sitems = s->items; + int snritems = s->nitems; + symbol *previous_lhs = NULL; + + /* Output all the items of a state, not only its kernel. */ + if (report_flag & report_itemsets) + { + closure (sitems, snritems); + sitems = itemset; + snritems = nritemset; + } + + if (!snritems) + return; + + fputc ('\n', out); + + for (i = 0; i < snritems; i++) + { + item_number *sp; + item_number *sp1; + rule_number r; + + sp1 = sp = ritem + sitems[i]; + + while (*sp >= 0) + sp++; + + r = item_number_as_rule_number (*sp); + + rule_lhs_print (&rules[r], previous_lhs, out); + previous_lhs = rules[r].lhs; + + for (sp = rules[r].rhs; sp < sp1; sp++) + fprintf (out, " %s", symbols[*sp]->tag); + fputs (" .", out); + for (/* Nothing */; *sp >= 0; ++sp) + fprintf (out, " %s", symbols[*sp]->tag); + + /* Display the lookaheads? */ + if (report_flag & report_lookaheads) + state_rule_lookaheads_print (s, &rules[r], out); + + fputc ('\n', out); + } +} + + +/*------------------------------------------------------------. +| Report the shifts iff DISPLAY_SHIFTS_P or the gotos of S on | +| OUT. | +`------------------------------------------------------------*/ + +static void +print_transitions (state *s, FILE *out, bool display_transitions_p) +{ + transitions *trans = s->transitions; + size_t width = 0; + int i; + + /* Compute the width of the lookaheads column. */ + for (i = 0; i < trans->num; i++) + if (!TRANSITION_IS_DISABLED (trans, i) + && TRANSITION_IS_SHIFT (trans, i) == display_transitions_p) + { + symbol *sym = symbols[TRANSITION_SYMBOL (trans, i)]; + max_length (&width, sym->tag); + } + + /* Nothing to report. */ + if (!width) + return; + + fputc ('\n', out); + width += 2; + + /* Report lookaheads and shifts. */ + for (i = 0; i < trans->num; i++) + if (!TRANSITION_IS_DISABLED (trans, i) + && TRANSITION_IS_SHIFT (trans, i) == display_transitions_p) + { + symbol *sym = symbols[TRANSITION_SYMBOL (trans, i)]; + const char *tag = sym->tag; + state *s1 = trans->states[i]; + int j; + + fprintf (out, " %s", tag); + for (j = width - strlen (tag); j > 0; --j) + fputc (' ', out); + if (display_transitions_p) + fprintf (out, _("shift, and go to state %d\n"), s1->number); + else + fprintf (out, _("go to state %d\n"), s1->number); + } +} + + +/*--------------------------------------------------------. +| Report the explicit errors of S raised from %nonassoc. | +`--------------------------------------------------------*/ + +static void +print_errs (FILE *out, state *s) +{ + errs *errp = s->errs; + size_t width = 0; + int i; + + /* Compute the width of the lookaheads column. */ + for (i = 0; i < errp->num; ++i) + if (errp->symbols[i]) + max_length (&width, errp->symbols[i]->tag); + + /* Nothing to report. */ + if (!width) + return; + + fputc ('\n', out); + width += 2; + + /* Report lookaheads and errors. */ + for (i = 0; i < errp->num; ++i) + if (errp->symbols[i]) + { + const char *tag = errp->symbols[i]->tag; + int j; + fprintf (out, " %s", tag); + for (j = width - strlen (tag); j > 0; --j) + fputc (' ', out); + fputs (_("error (nonassociative)\n"), out); + } +} + + +/*-------------------------------------------------------------. +| Return the default rule of S if it has one, NULL otherwise. | +`-------------------------------------------------------------*/ + +static rule * +state_default_rule (state *s) +{ + reductions *reds = s->reductions; + rule *default_rule = NULL; + int cmax = 0; + int i; + + /* No need for a lookahead. */ + if (s->consistent) + return reds->rules[0]; + + /* 1. Each reduction is possibly masked by the lookaheads on which + we shift (S/R conflicts)... */ + bitset_zero (shiftset); + { + transitions *trans = s->transitions; + FOR_EACH_SHIFT (trans, i) + { + /* If this state has a shift for the error token, don't use a + default rule. */ + if (TRANSITION_IS_ERROR (trans, i)) + return NULL; + bitset_set (shiftset, TRANSITION_SYMBOL (trans, i)); + } + } + + /* 2. Each reduction is possibly masked by the lookaheads on which + we raise an error (due to %nonassoc). */ + { + errs *errp = s->errs; + for (i = 0; i < errp->num; i++) + if (errp->symbols[i]) + bitset_set (shiftset, errp->symbols[i]->number); + } + + for (i = 0; i < reds->num; ++i) + { + int count = 0; + + /* How many non-masked lookaheads are there for this reduction? + */ + bitset_andn (lookaheadset, reds->lookaheads[i], shiftset); + count = bitset_count (lookaheadset); + + if (count > cmax) + { + cmax = count; + default_rule = reds->rules[i]; + } + + /* 3. And finally, each reduction is possibly masked by previous + reductions (in R/R conflicts, we keep the first reductions). + */ + bitset_or (shiftset, shiftset, reds->lookaheads[i]); + } + + return default_rule; +} + + +/*--------------------------------------------------------------------. +| Report a reduction of RULE on LOOKAHEADS (which can be `default'). | +| If not ENABLED, the rule is masked by a shift or a reduce (S/R and | +| R/R conflicts). | +`--------------------------------------------------------------------*/ + +static void +print_reduction (FILE *out, size_t width, + const char *lookahead, + rule *r, bool enabled) +{ + int j; + fprintf (out, " %s", lookahead); + for (j = width - strlen (lookahead); j > 0; --j) + fputc (' ', out); + if (!enabled) + fputc ('[', out); + if (r->number) + fprintf (out, _("reduce using rule %d (%s)"), r->number, r->lhs->tag); + else + fprintf (out, _("accept")); + if (!enabled) + fputc (']', out); + fputc ('\n', out); +} + + +/*-------------------------------------------. +| Report on OUT the reduction actions of S. | +`-------------------------------------------*/ + +static void +print_reductions (FILE *out, state *s) +{ + transitions *trans = s->transitions; + reductions *reds = s->reductions; + rule *default_rule = NULL; + size_t width = 0; + int i, j; + + if (reds->num == 0) + return; + + default_rule = state_default_rule (s); + + bitset_zero (shiftset); + FOR_EACH_SHIFT (trans, i) + bitset_set (shiftset, TRANSITION_SYMBOL (trans, i)); + + /* Compute the width of the lookaheads column. */ + if (default_rule) + width = strlen (_("$default")); + + if (reds->lookaheads) + for (i = 0; i < ntokens; i++) + { + bool count = bitset_test (shiftset, i); + + for (j = 0; j < reds->num; ++j) + if (bitset_test (reds->lookaheads[j], i)) + { + if (! count) + { + if (reds->rules[j] != default_rule) + max_length (&width, symbols[i]->tag); + count = true; + } + else + { + max_length (&width, symbols[i]->tag); + } + } + } + + /* Nothing to report. */ + if (!width) + return; + + fputc ('\n', out); + width += 2; + + /* Report lookaheads (or $default) and reductions. */ + if (reds->lookaheads) + for (i = 0; i < ntokens; i++) + { + bool defaulted = false; + bool count = bitset_test (shiftset, i); + + for (j = 0; j < reds->num; ++j) + if (bitset_test (reds->lookaheads[j], i)) + { + if (! count) + { + if (reds->rules[j] != default_rule) + print_reduction (out, width, + symbols[i]->tag, + reds->rules[j], true); + else + defaulted = true; + count = true; + } + else + { + if (defaulted) + print_reduction (out, width, + symbols[i]->tag, + default_rule, true); + defaulted = false; + print_reduction (out, width, + symbols[i]->tag, + reds->rules[j], false); + } + } + } + + if (default_rule) + print_reduction (out, width, + _("$default"), default_rule, true); +} + + +/*--------------------------------------------------------------. +| Report on OUT all the actions (shifts, gotos, reductions, and | +| explicit erros from %nonassoc) of S. | +`--------------------------------------------------------------*/ + +static void +print_actions (FILE *out, state *s) +{ + /* Print shifts. */ + print_transitions (s, out, true); + print_errs (out, s); + print_reductions (out, s); + /* Print gotos. */ + print_transitions (s, out, false); +} + + +/*----------------------------------. +| Report all the data on S on OUT. | +`----------------------------------*/ + +static void +print_state (FILE *out, state *s) +{ + fputs ("\n\n", out); + fprintf (out, _("state %d"), s->number); + fputc ('\n', out); + print_core (out, s); + print_actions (out, s); + if ((report_flag & report_solved_conflicts) && s->solved_conflicts) + { + fputc ('\n', out); + fputs (s->solved_conflicts, out); + } +} + +/*-----------------------------------------. +| Print information on the whole grammar. | +`-----------------------------------------*/ + +#define END_TEST(End) \ +do { \ + if (column + strlen(buffer) > (End)) \ + { \ + fprintf (out, "%s\n ", buffer); \ + column = 3; \ + buffer[0] = 0; \ + } \ +} while (0) + + +static void +print_grammar (FILE *out) +{ + symbol_number i; + char buffer[90]; + int column = 0; + + grammar_rules_print (out); + + /* TERMINAL (type #) : rule #s terminal is on RHS */ + fprintf (out, "%s\n\n", _("Terminals, with rules where they appear")); + for (i = 0; i < max_user_token_number + 1; i++) + if (token_translations[i] != undeftoken->number) + { + const char *tag = symbols[token_translations[i]]->tag; + rule_number r; + item_number *rhsp; + + buffer[0] = 0; + column = strlen (tag); + fputs (tag, out); + END_TEST (50); + sprintf (buffer, " (%d)", i); + + for (r = 0; r < nrules; r++) + for (rhsp = rules[r].rhs; *rhsp >= 0; rhsp++) + if (item_number_as_symbol_number (*rhsp) == token_translations[i]) + { + END_TEST (65); + sprintf (buffer + strlen (buffer), " %d", r); + break; + } + fprintf (out, "%s\n", buffer); + } + fputs ("\n\n", out); + + + fprintf (out, "%s\n\n", _("Nonterminals, with rules where they appear")); + for (i = ntokens; i < nsyms; i++) + { + int left_count = 0, right_count = 0; + rule_number r; + const char *tag = symbols[i]->tag; + + for (r = 0; r < nrules; r++) + { + item_number *rhsp; + if (rules[r].lhs->number == i) + left_count++; + for (rhsp = rules[r].rhs; *rhsp >= 0; rhsp++) + if (item_number_as_symbol_number (*rhsp) == i) + { + right_count++; + break; + } + } + + buffer[0] = 0; + fputs (tag, out); + column = strlen (tag); + sprintf (buffer, " (%d)", i); + END_TEST (0); + + if (left_count > 0) + { + END_TEST (50); + sprintf (buffer + strlen (buffer), _(" on left:")); + + for (r = 0; r < nrules; r++) + { + END_TEST (65); + if (rules[r].lhs->number == i) + sprintf (buffer + strlen (buffer), " %d", r); + } + } + + if (right_count > 0) + { + if (left_count > 0) + sprintf (buffer + strlen (buffer), ","); + END_TEST (50); + sprintf (buffer + strlen (buffer), _(" on right:")); + for (r = 0; r < nrules; r++) + { + item_number *rhsp; + for (rhsp = rules[r].rhs; *rhsp >= 0; rhsp++) + if (item_number_as_symbol_number (*rhsp) == i) + { + END_TEST (65); + sprintf (buffer + strlen (buffer), " %d", r); + break; + } + } + } + fprintf (out, "%s\n", buffer); + } +} + +void +print_results (void) +{ + state_number i; + + /* We used to use just .out if SPEC_NAME_PREFIX (-p) was used, but + that conflicts with Posix. */ + FILE *out = xfopen (spec_verbose_file, "w"); + + reduce_output (out); + grammar_rules_partial_print (out, + _("Rules never reduced"), rule_never_reduced_p); + conflicts_output (out); + + print_grammar (out); + + /* If the whole state item sets, not only the kernels, are wanted, + `closure' will be run, which needs memory allocation/deallocation. */ + if (report_flag & report_itemsets) + new_closure (nritems); + /* Storage for print_reductions. */ + shiftset = bitset_create (ntokens, BITSET_FIXED); + lookaheadset = bitset_create (ntokens, BITSET_FIXED); + for (i = 0; i < nstates; i++) + print_state (out, states[i]); + bitset_free (shiftset); + bitset_free (lookaheadset); + if (report_flag & report_itemsets) + free_closure (); + + xfclose (out); +} diff --git a/src/apps/bin/bison/src/print.h b/src/apps/bin/bison/src/print.h new file mode 100644 index 0000000000..bdddafbea9 --- /dev/null +++ b/src/apps/bin/bison/src/print.h @@ -0,0 +1,26 @@ +/* Print information on generated parser, for bison, + Copyright 2000 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef PRINT_H_ +# define PRINT_H_ + +void print_results (void); + +#endif /* !PRINT_H_ */ diff --git a/src/apps/bin/bison/src/print_graph.c b/src/apps/bin/bison/src/print_graph.c new file mode 100644 index 0000000000..80b0d3b1c6 --- /dev/null +++ b/src/apps/bin/bison/src/print_graph.c @@ -0,0 +1,233 @@ +/* Output a VCG description on generated parser, for Bison, + + Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include "system.h" + +#include +#include + +#include "LR0.h" +#include "closure.h" +#include "complain.h" +#include "conflicts.h" +#include "files.h" +#include "getargs.h" +#include "gram.h" +#include "lalr.h" +#include "print_graph.h" +#include "reader.h" +#include "state.h" +#include "symtab.h" +#include "vcg.h" + +static graph static_graph; +static FILE *fgraph = NULL; + + +/*----------------------------. +| Construct the node labels. | +`----------------------------*/ + +static void +print_core (struct obstack *oout, state *s) +{ + int i; + item_number *sitems = s->items; + int snritems = s->nitems; + + /* Output all the items of a state, not only its kernel. */ + if (report_flag & report_itemsets) + { + closure (sitems, snritems); + sitems = itemset; + snritems = nritemset; + } + + obstack_fgrow1 (oout, "state %2d\n", s->number); + for (i = 0; i < snritems; i++) + { + item_number *sp; + item_number *sp1; + rule_number r; + + sp1 = sp = ritem + sitems[i]; + + while (*sp >= 0) + sp++; + + r = item_number_as_rule_number (*sp); + + if (i) + obstack_1grow (oout, '\n'); + obstack_fgrow1 (oout, " %s -> ", + rules[r].lhs->tag); + + for (sp = rules[r].rhs; sp < sp1; sp++) + obstack_fgrow1 (oout, "%s ", symbols[*sp]->tag); + + obstack_1grow (oout, '.'); + + for (/* Nothing */; *sp >= 0; ++sp) + obstack_fgrow1 (oout, " %s", symbols[*sp]->tag); + + /* Experimental feature: display the lookaheads. */ + if (report_flag & report_lookaheads) + { + /* Find the reduction we are handling. */ + reductions *reds = s->reductions; + int redno = state_reduction_find (s, &rules[r]); + + /* Print them if there are. */ + if (reds->lookaheads && redno != -1) + { + bitset_iterator biter; + int k; + char const *sep = ""; + obstack_sgrow (oout, "["); + BITSET_FOR_EACH (biter, reds->lookaheads[redno], k, 0) + { + obstack_fgrow2 (oout, "%s%s", sep, symbols[k]->tag); + sep = ", "; + } + obstack_sgrow (oout, "]"); + } + } + } +} + + +/*---------------------------------------------------------------. +| Output in graph_obstack edges specifications in incidence with | +| current node. | +`---------------------------------------------------------------*/ + +static void +print_actions (state *s, const char *node_name) +{ + int i; + + transitions *trans = s->transitions; + reductions *reds = s->reductions; + + static char buff[10]; + edge e; + + if (!trans->num && !reds) + return; + + for (i = 0; i < trans->num; i++) + if (!TRANSITION_IS_DISABLED (trans, i)) + { + state *s1 = trans->states[i]; + symbol_number sym = s1->accessing_symbol; + + new_edge (&e); + + if (s->number > s1->number) + e.type = back_edge; + open_edge (&e, fgraph); + /* The edge source is the current node. */ + e.sourcename = node_name; + sprintf (buff, "%d", s1->number); + e.targetname = buff; + /* Shifts are blue, gotos are green, and error is red. */ + if (TRANSITION_IS_ERROR (trans, i)) + e.color = red; + else + e.color = TRANSITION_IS_SHIFT (trans, i) ? blue : green; + e.label = symbols[sym]->tag; + output_edge (&e, fgraph); + close_edge (fgraph); + } +} + + +/*-------------------------------------------------------------. +| Output in FGRAPH the current node specifications and exiting | +| edges. | +`-------------------------------------------------------------*/ + +static void +print_state (state *s) +{ + static char name[10]; + struct obstack node_obstack; + node n; + + /* The labels of the nodes are their the items. */ + obstack_init (&node_obstack); + new_node (&n); + sprintf (name, "%d", s->number); + n.title = name; + print_core (&node_obstack, s); + obstack_1grow (&node_obstack, '\0'); + n.label = obstack_finish (&node_obstack); + + open_node (fgraph); + output_node (&n, fgraph); + close_node (fgraph); + + /* Output the edges. */ + print_actions (s, name); + + obstack_free (&node_obstack, 0); +} + + +void +print_graph (void) +{ + state_number i; + + /* Output file. */ + fgraph = xfopen (spec_graph_file, "w"); + + new_graph (&static_graph); + +#if 0 + static_graph.smanhattan_edges = yes; + static_graph.manhattan_edges = yes; +#endif + + static_graph.display_edge_labels = yes; + static_graph.layoutalgorithm = normal; + + static_graph.port_sharing = no; + static_graph.finetuning = yes; + static_graph.priority_phase = yes; + static_graph.splines = yes; + + static_graph.crossing_weight = median; + + /* Output graph options. */ + open_graph (fgraph); + output_graph (&static_graph, fgraph); + + /* Output nodes and edges. */ + new_closure (nritems); + for (i = 0; i < nstates; i++) + print_state (states[i]); + free_closure (); + + /* Close graph. */ + close_graph (&static_graph, fgraph); + xfclose (fgraph); +} diff --git a/src/apps/bin/bison/src/print_graph.h b/src/apps/bin/bison/src/print_graph.h new file mode 100644 index 0000000000..7be8a52dba --- /dev/null +++ b/src/apps/bin/bison/src/print_graph.h @@ -0,0 +1,26 @@ +/* Output a VCG description on generated parser, for bison, + Copyright 2000 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef PRINT_GRAPH_H_ +# define PRINT_GRAPH_H_ + +void print_graph (void); + +#endif /* !PRINT_GRAPH_H_ */ diff --git a/src/apps/bin/bison/src/reader.c b/src/apps/bin/bison/src/reader.c new file mode 100644 index 0000000000..1cd035cce2 --- /dev/null +++ b/src/apps/bin/bison/src/reader.c @@ -0,0 +1,535 @@ +/* Input parser for Bison + + Copyright (C) 1984, 1986, 1989, 1992, 1998, 2000, 2001, 2002, 2003 + Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include "system.h" + +#include + +#include "complain.h" +#include "conflicts.h" +#include "files.h" +#include "getargs.h" +#include "gram.h" +#include "muscle_tab.h" +#include "output.h" +#include "reader.h" +#include "symlist.h" +#include "symtab.h" + +static symbol_list *grammar = NULL; +static bool start_flag = false; +merger_list *merge_functions; + +/* Has %union been seen? */ +bool typed = false; + +/* Should rules have a default precedence? */ +bool default_prec = true; + +/*-----------------------. +| Set the start symbol. | +`-----------------------*/ + +void +grammar_start_symbol_set (symbol *sym, location loc) +{ + if (start_flag) + complain_at (loc, _("multiple %s declarations"), "%start"); + else + { + start_flag = true; + startsymbol = sym; + startsymbol_location = loc; + } +} + + +/*----------------------------------------------------------------. +| There are two prologues: one before %union, one after. Augment | +| the current one. | +`----------------------------------------------------------------*/ + +void +prologue_augment (const char *prologue, location loc) +{ + struct obstack *oout = + !typed ? &pre_prologue_obstack : &post_prologue_obstack; + + obstack_fgrow1 (oout, "]b4_syncline([[%d]], [[", loc.start.line); + MUSCLE_OBSTACK_SGROW (oout, + quotearg_style (c_quoting_style, loc.start.file)); + obstack_sgrow (oout, "]])[\n"); + obstack_sgrow (oout, prologue); +} + + + +/*-------------------------------------------------------------------. +| Return the merger index for a merging function named NAME, whose | +| arguments have type TYPE. Records the function, if new, in | +| MERGER_LIST. | +`-------------------------------------------------------------------*/ + +static int +get_merge_function (uniqstr name, uniqstr type, location loc) +{ + merger_list *syms; + merger_list head; + int n; + + if (! glr_parser) + return 0; + + if (type == NULL) + type = uniqstr_new (""); + + head.next = merge_functions; + for (syms = &head, n = 1; syms->next != NULL; syms = syms->next, n += 1) + if (UNIQSTR_EQ (name, syms->next->name)) + break; + if (syms->next == NULL) + { + MALLOC (syms->next, 1); + syms->next->name = uniqstr_new (name); + syms->next->type = uniqstr_new (type); + syms->next->next = NULL; + merge_functions = head.next; + } + else if (!UNIQSTR_EQ (type, syms->next->type)) + warn_at (loc, _("result type clash on merge function %s: <%s> != <%s>"), + name, type, syms->next->type); + return n; +} + +/*--------------------------------------. +| Free all merge-function definitions. | +`--------------------------------------*/ + +void +free_merger_functions (void) +{ + merger_list *L0; + if (! glr_parser) + return; + L0 = merge_functions; + while (L0 != NULL) + { + merger_list *L1 = L0->next; + free (L0); + L0 = L1; + } +} + + +/*-------------------------------------------------------------------. +| Parse the input grammar into a one symbol_list structure. Each | +| rule is represented by a sequence of symbols: the left hand side | +| followed by the contents of the right hand side, followed by a | +| null pointer instead of a symbol to terminate the rule. The next | +| symbol is the lhs of the following rule. | +| | +| All actions are copied out, labelled by the rule number they apply | +| to. | +| | +| Bison used to allow some %directives in the rules sections, but | +| this is no longer consider appropriate: (i) the documented grammar | +| doesn't claim it, (ii), it would promote bad style, (iii), error | +| recovery for %directives consists in skipping the junk until a `%' | +| is seen and helrp synchronizing. This scheme is definitely wrong | +| in the rules section. | +`-------------------------------------------------------------------*/ + +/* The (currently) last symbol of GRAMMAR. */ +symbol_list *grammar_end = NULL; + +/* Append SYM to the grammar. */ +void +grammar_symbol_append (symbol *sym, location loc) +{ + symbol_list *p = symbol_list_new (sym, loc); + + if (grammar_end) + grammar_end->next = p; + else + grammar = p; + + grammar_end = p; +} + +/* The rule currently being defined, and the previous rule. + CURRENT_RULE points to the first LHS of the current rule, while + PREVIOUS_RULE_END points to the *end* of the previous rule (NULL). */ +symbol_list *current_rule = NULL; +symbol_list *previous_rule_end = NULL; + + +/*----------------------------------------------. +| Create a new rule for LHS in to the GRAMMAR. | +`----------------------------------------------*/ + +void +grammar_rule_begin (symbol *lhs, location loc) +{ + if (!start_flag) + { + startsymbol = lhs; + startsymbol_location = loc; + start_flag = true; + } + + /* Start a new rule and record its lhs. */ + ++nrules; + ++nritems; + + previous_rule_end = grammar_end; + grammar_symbol_append (lhs, loc); + current_rule = grammar_end; + + /* Mark the rule's lhs as a nonterminal if not already so. */ + + if (lhs->class == unknown_sym) + { + lhs->class = nterm_sym; + lhs->number = nvars; + ++nvars; + } + else if (lhs->class == token_sym) + complain_at (loc, _("rule given for %s, which is a token"), lhs->tag); +} + +/* Check that the last rule (CURRENT_RULE) is properly defined. For + instance, there should be no type clash on the default action. */ + +static void +grammar_current_rule_check (void) +{ + symbol *lhs = current_rule->sym; + char const *lhs_type = lhs->type_name; + symbol *first_rhs = current_rule->next->sym; + + /* If there is an action, then there is nothing we can do: the user + is allowed to shoot herself in the foot. */ + if (current_rule->action) + return; + + /* Don't worry about the default action if $$ is untyped, since $$'s + value can't be used. */ + if (! lhs_type) + return; + + /* If $$ is being set in default way, report if any type mismatch. */ + if (first_rhs) + { + const char *rhs_type = first_rhs->type_name ? first_rhs->type_name : ""; + if (!UNIQSTR_EQ (lhs_type, rhs_type)) + warn_at (current_rule->location, + _("type clash on default action: <%s> != <%s>"), + lhs_type, rhs_type); + } + /* Warn if there is no default for $$ but we need one. */ + else + warn_at (current_rule->location, + _("empty rule for typed nonterminal, and no action")); +} + + +/*-------------------------------------. +| End the currently being grown rule. | +`-------------------------------------*/ + +void +grammar_rule_end (location loc) +{ + /* Put an empty link in the list to mark the end of this rule */ + grammar_symbol_append (NULL, grammar_end->location); + current_rule->location = loc; + grammar_current_rule_check (); +} + + +/*-------------------------------------------------------------------. +| The previous action turns out the be a mid-rule action. Attach it | +| to the current rule, i.e., create a dummy symbol, attach it this | +| mid-rule action, and append this dummy nonterminal to the current | +| rule. | +`-------------------------------------------------------------------*/ + +void +grammar_midrule_action (void) +{ + /* Since the action was written out with this rule's number, we must + give the new rule this number by inserting the new rule before + it. */ + + /* Make a DUMMY nonterminal, whose location is that of the midrule + action. Create the MIDRULE. */ + location dummy_location = current_rule->action_location; + symbol *dummy = dummy_symbol_get (dummy_location); + symbol_list *midrule = symbol_list_new (dummy, dummy_location); + + /* Make a new rule, whose body is empty, before the current one, so + that the action just read can belong to it. */ + ++nrules; + ++nritems; + /* Attach its location and actions to that of the DUMMY. */ + midrule->location = dummy_location; + midrule->action = current_rule->action; + midrule->action_location = dummy_location; + current_rule->action = NULL; + + if (previous_rule_end) + previous_rule_end->next = midrule; + else + grammar = midrule; + + /* End the dummy's rule. */ + previous_rule_end = symbol_list_new (NULL, dummy_location); + previous_rule_end->next = current_rule; + + midrule->next = previous_rule_end; + + /* Insert the dummy nonterminal replacing the midrule action into + the current rule. */ + grammar_current_rule_symbol_append (dummy, dummy_location); +} + +/* Set the precedence symbol of the current rule to PRECSYM. */ + +void +grammar_current_rule_prec_set (symbol *precsym, location loc) +{ + if (current_rule->ruleprec) + complain_at (loc, _("only one %s allowed per rule"), "%prec"); + current_rule->ruleprec = precsym; +} + +/* Attach dynamic precedence DPREC to the current rule. */ + +void +grammar_current_rule_dprec_set (int dprec, location loc) +{ + if (! glr_parser) + warn_at (loc, _("%s affects only GLR parsers"), "%dprec"); + if (dprec <= 0) + complain_at (loc, _("%s must be followed by positive number"), "%dprec"); + else if (current_rule->dprec != 0) + complain_at (loc, _("only one %s allowed per rule"), "%dprec"); + current_rule->dprec = dprec; +} + +/* Attach a merge function NAME with argument type TYPE to current + rule. */ + +void +grammar_current_rule_merge_set (uniqstr name, location loc) +{ + if (! glr_parser) + warn_at (loc, _("%s affects only GLR parsers"), "%merge"); + if (current_rule->merger != 0) + complain_at (loc, _("only one %s allowed per rule"), "%merge"); + current_rule->merger = + get_merge_function (name, current_rule->sym->type_name, loc); +} + +/* Attach SYM to the current rule. If needed, move the previous + action as a mid-rule action. */ + +void +grammar_current_rule_symbol_append (symbol *sym, location loc) +{ + if (current_rule->action) + grammar_midrule_action (); + ++nritems; + grammar_symbol_append (sym, loc); +} + +/* Attach an ACTION to the current rule. If needed, move the previous + action as a mid-rule action. */ + +void +grammar_current_rule_action_append (const char *action, location loc) +{ + if (current_rule->action) + grammar_midrule_action (); + current_rule->action = action; + current_rule->action_location = loc; +} + + +/*---------------------------------------------------------------. +| Convert the rules into the representation using RRHS, RLHS and | +| RITEM. | +`---------------------------------------------------------------*/ + +static void +packgram (void) +{ + unsigned int itemno = 0; + rule_number ruleno = 0; + symbol_list *p = grammar; + + CALLOC (ritem, nritems); + CALLOC (rules, nrules); + + while (p) + { + symbol *ruleprec = p->ruleprec; + rules[ruleno].user_number = ruleno; + rules[ruleno].number = ruleno; + rules[ruleno].lhs = p->sym; + rules[ruleno].rhs = ritem + itemno; + rules[ruleno].location = p->location; + rules[ruleno].useful = true; + rules[ruleno].action = p->action; + rules[ruleno].action_location = p->action_location; + rules[ruleno].dprec = p->dprec; + rules[ruleno].merger = p->merger; + + p = p->next; + while (p && p->sym) + { + /* item_number = symbol_number. + But the former needs to contain more: negative rule numbers. */ + ritem[itemno++] = symbol_number_as_item_number (p->sym->number); + /* A rule gets by default the precedence and associativity + of the last token in it. */ + if (p->sym->class == token_sym && default_prec) + rules[ruleno].prec = p->sym; + if (p) + p = p->next; + } + + /* If this rule has a %prec, + the specified symbol's precedence replaces the default. */ + if (ruleprec) + { + rules[ruleno].precsym = ruleprec; + rules[ruleno].prec = ruleprec; + } + ritem[itemno++] = rule_number_as_item_number (ruleno); + ++ruleno; + + if (p) + p = p->next; + } + + if (itemno != nritems) + abort (); + + if (trace_flag & trace_sets) + ritem_print (stderr); +} + +/*------------------------------------------------------------------. +| Read in the grammar specification and record it in the format | +| described in gram.h. All actions are copied into ACTION_OBSTACK, | +| in each case forming the body of a C function (YYACTION) which | +| contains a switch statement to decide which action to execute. | +`------------------------------------------------------------------*/ + +void +reader (void) +{ + /* Initialize the symbol table. */ + symbols_new (); + + /* Construct the accept symbol. */ + accept = symbol_get ("$accept", empty_location); + accept->class = nterm_sym; + accept->number = nvars++; + + /* Construct the error token */ + errtoken = symbol_get ("error", empty_location); + errtoken->class = token_sym; + errtoken->number = ntokens++; + + /* Construct a token that represents all undefined literal tokens. + It is always token number 2. */ + undeftoken = symbol_get ("$undefined", empty_location); + undeftoken->class = token_sym; + undeftoken->number = ntokens++; + + /* Initialize the obstacks. */ + obstack_init (&pre_prologue_obstack); + obstack_init (&post_prologue_obstack); + + finput = xfopen (grammar_file, "r"); + gram_in = finput; + + gram__flex_debug = trace_flag & trace_scan; + gram_debug = trace_flag & trace_parse; + scanner_initialize (); + gram_parse (); + + /* If something went wrong during the parsing, don't try to + continue. */ + if (complaint_issued) + return; + + /* Grammar has been read. Do some checking */ + if (nrules == 0) + fatal (_("no rules in the input grammar")); + + /* Report any undefined symbols and consider them nonterminals. */ + symbols_check_defined (); + + /* If the user did not define her ENDTOKEN, do it now. */ + if (!endtoken) + { + endtoken = symbol_get ("$end", empty_location); + endtoken->class = token_sym; + endtoken->number = 0; + /* Value specified by POSIX. */ + endtoken->user_token_number = 0; + } + + /* Insert the initial rule, which line is that of the first rule + (not that of the start symbol): + + accept: %start EOF. */ + { + symbol_list *p = symbol_list_new (accept, empty_location); + p->location = grammar->location; + p->next = symbol_list_new (startsymbol, empty_location); + p->next->next = symbol_list_new (endtoken, empty_location); + p->next->next->next = symbol_list_new (NULL, empty_location); + p->next->next->next->next = grammar; + nrules += 1; + nritems += 3; + grammar = p; + } + + if (! (nsyms <= SYMBOL_NUMBER_MAXIMUM && nsyms == ntokens + nvars)) + abort (); + + xfclose (finput); + + /* Assign the symbols their symbol numbers. Write #defines for the + token symbols into FDEFINES if requested. */ + symbols_pack (); + + /* Convert the grammar into the format described in gram.h. */ + packgram (); + + /* The grammar as a symbol_list is no longer needed. */ + LIST_FREE (symbol_list, grammar); +} diff --git a/src/apps/bin/bison/src/reader.h b/src/apps/bin/bison/src/reader.h new file mode 100644 index 0000000000..fc6ee7d6af --- /dev/null +++ b/src/apps/bin/bison/src/reader.h @@ -0,0 +1,78 @@ +/* Input parser for Bison + + Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef READER_H_ +# define READER_H_ + +# include "location.h" +# include "symlist.h" + +# include "parse-gram.h" + +typedef struct merger_list +{ + struct merger_list* next; + uniqstr name; + uniqstr type; +} merger_list; + +/* From the scanner. */ +extern FILE *gram_in; +extern int gram__flex_debug; +extern boundary scanner_cursor; +extern int max_left_semantic_context; +void scanner_initialize (void); +void scanner_free (void); +void scanner_last_string_free (void); + +# define YY_DECL int gram_lex (YYSTYPE *val, location *loc) +YY_DECL; + + +/* From the parser. */ +extern int gram_debug; +int gram_parse (void); +char const *token_name (int); + + +/* From reader.c. */ +void grammar_start_symbol_set (symbol *sym, location loc); +void prologue_augment (const char *prologue, location loc); +void grammar_symbol_append (symbol *sym, location loc); +void grammar_rule_begin (symbol *lhs, location loc); +void grammar_rule_end (location loc); +void grammar_midrule_action (void); +void grammar_current_rule_prec_set (symbol *precsym, location loc); +void grammar_current_rule_dprec_set (int dprec, location loc); +void grammar_current_rule_merge_set (uniqstr name, location loc); + +void grammar_current_rule_symbol_append (symbol *sym, location loc); +void grammar_current_rule_action_append (const char *action, location loc); +extern symbol_list *current_rule; +void reader (void); +void free_merger_functions (void); + +extern merger_list *merge_functions; + +extern bool typed; +extern bool default_prec; + +#endif /* !READER_H_ */ diff --git a/src/apps/bin/bison/src/reduce.c b/src/apps/bin/bison/src/reduce.c new file mode 100644 index 0000000000..b9b6a3dde4 --- /dev/null +++ b/src/apps/bin/bison/src/reduce.c @@ -0,0 +1,469 @@ +/* Grammar reduction for Bison. + + Copyright (C) 1988, 1989, 2000, 2001, 2002, 2003 Free Software + Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + +/* Reduce the grammar: Find and eliminate unreachable terminals, + nonterminals, and productions. David S. Bakin. */ + +/* Don't eliminate unreachable terminals: They may be used by the + user's parser. */ + +#include "system.h" + +#include +#include + +#include "complain.h" +#include "files.h" +#include "getargs.h" +#include "gram.h" +#include "reader.h" +#include "reduce.h" +#include "symtab.h" + +/* Set of all nonterminals which are not useless. */ +static bitset N; + +/* Set of all rules which have no useless nonterminals in their RHS. */ +static bitset P; + +/* Set of all accessible symbols. */ +static bitset V; + +/* Set of symbols used to define rule precedence (so they are + `useless', but no warning should be issued). */ +static bitset V1; + +static rule_number nuseful_productions; +rule_number nuseless_productions; +static int nuseful_nonterminals; +symbol_number nuseless_nonterminals; + +/*-------------------------------------------------------------------. +| Another way to do this would be with a set for each production and | +| then do subset tests against N0, but even for the C grammar the | +| whole reducing process takes only 2 seconds on my 8Mhz AT. | +`-------------------------------------------------------------------*/ + +static bool +useful_production (rule_number r, bitset N0) +{ + item_number *rhsp; + + /* A production is useful if all of the nonterminals in its appear + in the set of useful nonterminals. */ + + for (rhsp = rules[r].rhs; *rhsp >= 0; ++rhsp) + if (ISVAR (*rhsp) && !bitset_test (N0, *rhsp - ntokens)) + return false; + return true; +} + + +/*---------------------------------------------------------. +| Remember that rules are 1-origin, symbols are 0-origin. | +`---------------------------------------------------------*/ + +static void +useless_nonterminals (void) +{ + bitset Np, Ns; + rule_number r; + + /* N is set as built. Np is set being built this iteration. P is + set of all productions which have a RHS all in N. */ + + Np = bitset_create (nvars, BITSET_FIXED); + + + /* The set being computed is a set of nonterminals which can derive + the empty string or strings consisting of all terminals. At each + iteration a nonterminal is added to the set if there is a + production with that nonterminal as its LHS for which all the + nonterminals in its RHS are already in the set. Iterate until + the set being computed remains unchanged. Any nonterminals not + in the set at that point are useless in that they will never be + used in deriving a sentence of the language. + + This iteration doesn't use any special traversal over the + productions. A set is kept of all productions for which all the + nonterminals in the RHS are in useful. Only productions not in + this set are scanned on each iteration. At the end, this set is + saved to be used when finding useful productions: only + productions in this set will appear in the final grammar. */ + + while (1) + { + bitset_copy (Np, N); + for (r = 0; r < nrules; r++) + if (!bitset_test (P, r) + && useful_production (r, N)) + { + bitset_set (Np, rules[r].lhs->number - ntokens); + bitset_set (P, r); + } + if (bitset_equal_p (N, Np)) + break; + Ns = Np; + Np = N; + N = Ns; + } + bitset_free (N); + N = Np; +} + + +static void +inaccessable_symbols (void) +{ + bitset Vp, Vs, Pp; + + /* Find out which productions are reachable and which symbols are + used. Starting with an empty set of productions and a set of + symbols which only has the start symbol in it, iterate over all + productions until the set of productions remains unchanged for an + iteration. For each production which has a LHS in the set of + reachable symbols, add the production to the set of reachable + productions, and add all of the nonterminals in the RHS of the + production to the set of reachable symbols. + + Consider only the (partially) reduced grammar which has only + nonterminals in N and productions in P. + + The result is the set P of productions in the reduced grammar, + and the set V of symbols in the reduced grammar. + + Although this algorithm also computes the set of terminals which + are reachable, no terminal will be deleted from the grammar. Some + terminals might not be in the grammar but might be generated by + semantic routines, and so the user might want them available with + specified numbers. (Is this true?) However, the nonreachable + terminals are printed (if running in verbose mode) so that the + user can know. */ + + Vp = bitset_create (nsyms, BITSET_FIXED); + Pp = bitset_create (nrules, BITSET_FIXED); + + /* If the start symbol isn't useful, then nothing will be useful. */ + if (bitset_test (N, accept->number - ntokens)) + { + bitset_set (V, accept->number); + + while (1) + { + rule_number r; + bitset_copy (Vp, V); + for (r = 0; r < nrules; r++) + { + if (!bitset_test (Pp, r) + && bitset_test (P, r) + && bitset_test (V, rules[r].lhs->number)) + { + item_number *rhsp; + for (rhsp = rules[r].rhs; *rhsp >= 0; rhsp++) + if (ISTOKEN (*rhsp) || bitset_test (N, *rhsp - ntokens)) + bitset_set (Vp, *rhsp); + bitset_set (Pp, r); + } + } + if (bitset_equal_p (V, Vp)) + break; + Vs = Vp; + Vp = V; + V = Vs; + } + } + + bitset_free (V); + V = Vp; + + /* Tokens 0, 1, and 2 are internal to Bison. Consider them useful. */ + bitset_set (V, endtoken->number); /* end-of-input token */ + bitset_set (V, errtoken->number); /* error token */ + bitset_set (V, undeftoken->number); /* some undefined token */ + + bitset_free (P); + P = Pp; + + nuseful_productions = bitset_count (P); + nuseless_productions = nrules - nuseful_productions; + + nuseful_nonterminals = 0; + { + symbol_number i; + for (i = ntokens; i < nsyms; i++) + if (bitset_test (V, i)) + nuseful_nonterminals++; + } + nuseless_nonterminals = nvars - nuseful_nonterminals; + + /* A token that was used in %prec should not be warned about. */ + { + rule_number r; + for (r = 0; r < nrules; ++r) + if (rules[r].precsym != 0) + bitset_set (V1, rules[r].precsym->number); + } +} + + +/*-------------------------------------------------------------------. +| Put the useless productions at the end of RULES, and adjust NRULES | +| accordingly. | +`-------------------------------------------------------------------*/ + +static void +reduce_grammar_tables (void) +{ + /* Report and flag useless productions. */ + { + rule_number r; + for (r = 0; r < nrules; r++) + rules[r].useful = bitset_test (P, r); + grammar_rules_never_reduced_report (_("useless rule")); + } + + /* Map the nonterminals to their new index: useful first, useless + afterwards. Kept for later report. */ + { + int useful = 0; + int useless = nrules - nuseless_productions; + rule *rules_sorted = MALLOC (rules_sorted, nrules); + rule_number r; + for (r = 0; r < nrules; ++r) + rules_sorted[rules[r].useful ? useful++ : useless++] = rules[r]; + free (rules); + rules = rules_sorted; + + /* Renumber the rules markers in RITEMS. */ + for (r = 0; r < nrules; ++r) + { + item_number *rhsp = rules[r].rhs; + for (/* Nothing. */; *rhsp >= 0; ++rhsp) + /* Nothing. */; + *rhsp = rule_number_as_item_number (r); + rules[r].number = r; + } + nrules -= nuseless_productions; + } + + /* Adjust NRITEMS. */ + { + rule_number r; + int length; + for (r = nrules; r < nrules + nuseless_productions; ++r) + { + length = rule_rhs_length (&rules[r]); + nritems -= length + 1; + } + } +} + + +/*------------------------------. +| Remove useless nonterminals. | +`------------------------------*/ + +static void +nonterminals_reduce (void) +{ + symbol_number i, n; + + /* Map the nonterminals to their new index: useful first, useless + afterwards. Kept for later report. */ + + symbol_number *nontermmap = CALLOC (nontermmap, nvars); + n = ntokens; + for (i = ntokens; i < nsyms; i++) + if (bitset_test (V, i)) + nontermmap[i - ntokens] = n++; + for (i = ntokens; i < nsyms; i++) + if (!bitset_test (V, i)) + { + nontermmap[i - ntokens] = n++; + warn_at (symbols[i]->location, _("useless nonterminal: %s"), + symbols[i]->tag); + } + + + /* Shuffle elements of tables indexed by symbol number. */ + { + symbol **symbols_sorted = MALLOC (symbols_sorted, nvars); + + for (i = ntokens; i < nsyms; i++) + symbols[i]->number = nontermmap[i - ntokens]; + for (i = ntokens; i < nsyms; i++) + symbols_sorted[nontermmap[i - ntokens] - ntokens] = symbols[i]; + for (i = ntokens; i < nsyms; i++) + symbols[i] = symbols_sorted[i - ntokens]; + free (symbols_sorted); + } + + { + rule_number r; + for (r = 0; r < nrules; ++r) + { + item_number *rhsp; + for (rhsp = rules[r].rhs; *rhsp >= 0; ++rhsp) + if (ISVAR (*rhsp)) + *rhsp = symbol_number_as_item_number (nontermmap[*rhsp + - ntokens]); + } + accept->number = nontermmap[accept->number - ntokens]; + } + + nsyms -= nuseless_nonterminals; + nvars -= nuseless_nonterminals; + + free (nontermmap); +} + + +/*------------------------------------------------------------------. +| Output the detailed results of the reductions. For FILE.output. | +`------------------------------------------------------------------*/ + +void +reduce_output (FILE *out) +{ + if (nuseless_nonterminals > 0) + { + int i; + fprintf (out, "%s\n\n", _("Useless nonterminals")); + for (i = 0; i < nuseless_nonterminals; ++i) + fprintf (out, " %s\n", symbols[nsyms + i]->tag); + fputs ("\n\n", out); + } + + { + bool b = false; + int i; + for (i = 0; i < ntokens; i++) + if (!bitset_test (V, i) && !bitset_test (V1, i)) + { + if (!b) + fprintf (out, "%s\n\n", _("Terminals which are not used")); + b = true; + fprintf (out, " %s\n", symbols[i]->tag); + } + if (b) + fputs ("\n\n", out); + } + + if (nuseless_productions > 0) + grammar_rules_partial_print (out, _("Useless rules"), + rule_useless_p); +} + + + + + +/*-------------------------------. +| Report the results to STDERR. | +`-------------------------------*/ + +static void +reduce_print (void) +{ + if (yacc_flag && nuseless_productions) + fprintf (stderr, ngettext ("%d rule never reduced\n", + "%d rules never reduced\n", + nuseless_productions), + nuseless_productions); + + fprintf (stderr, "%s: %s: ", grammar_file, _("warning")); + + if (nuseless_nonterminals > 0) + fprintf (stderr, ngettext ("%d useless nonterminal", + "%d useless nonterminals", + nuseless_nonterminals), + nuseless_nonterminals); + + if (nuseless_nonterminals > 0 && nuseless_productions > 0) + fprintf (stderr, _(" and ")); + + if (nuseless_productions > 0) + fprintf (stderr, ngettext ("%d useless rule", + "%d useless rules", + nuseless_productions), + nuseless_productions); + fprintf (stderr, "\n"); +} + +void +reduce_grammar (void) +{ + bool reduced; + + /* Allocate the global sets used to compute the reduced grammar */ + + N = bitset_create (nvars, BITSET_FIXED); + P = bitset_create (nrules, BITSET_FIXED); + V = bitset_create (nsyms, BITSET_FIXED); + V1 = bitset_create (nsyms, BITSET_FIXED); + + useless_nonterminals (); + inaccessable_symbols (); + + reduced = (bool) (nuseless_nonterminals + nuseless_productions > 0); + if (!reduced) + return; + + reduce_print (); + + if (!bitset_test (N, accept->number - ntokens)) + fatal_at (startsymbol_location, + _("start symbol %s does not derive any sentence"), + startsymbol->tag); + + /* First reduce the nonterminals, as they renumber themselves in the + whole grammar. If you change the order, nonterms would be + renumbered only in the reduced grammar. */ + if (nuseless_nonterminals > 0) + nonterminals_reduce (); + if (nuseless_productions > 0) + reduce_grammar_tables (); + + if (trace_flag & trace_grammar) + { + grammar_dump (stderr, "Reduced Grammar"); + + fprintf (stderr, "reduced %s defines %d terminals, %d nonterminals\ +, and %d productions.\n", + grammar_file, ntokens, nvars, nrules); + } +} + + +/*-----------------------------------------------------------. +| Free the global sets used to compute the reduced grammar. | +`-----------------------------------------------------------*/ + +void +reduce_free (void) +{ + bitset_free (N); + bitset_free (V); + bitset_free (V1); + bitset_free (P); +} diff --git a/src/apps/bin/bison/src/reduce.h b/src/apps/bin/bison/src/reduce.h new file mode 100644 index 0000000000..f66d4f38e7 --- /dev/null +++ b/src/apps/bin/bison/src/reduce.h @@ -0,0 +1,31 @@ +/* Grammar reduction for Bison. + + Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef REDUCE_H_ +# define REDUCE_H_ + +void reduce_grammar (void); +void reduce_output (FILE *out); +void reduce_free (void); + +extern symbol_number nuseless_nonterminals; +extern rule_number nuseless_productions; +#endif /* !REDUCE_H_ */ diff --git a/src/apps/bin/bison/src/relation.c b/src/apps/bin/bison/src/relation.c new file mode 100644 index 0000000000..8f97fa9903 --- /dev/null +++ b/src/apps/bin/bison/src/relation.c @@ -0,0 +1,183 @@ +/* Binary relations. + Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include "system.h" + +#include + +#include "getargs.h" +#include "relation.h" + +void +relation_print (relation r, size_t size, FILE *out) +{ + unsigned int i; + unsigned int j; + + for (i = 0; i < size; ++i) + { + fprintf (out, "%3d: ", i); + if (r[i]) + for (j = 0; r[i][j] != -1; ++j) + fprintf (out, "%3d ", r[i][j]); + fputc ('\n', out); + } + fputc ('\n', out); +} + + +/*---------------------------------------------------------------. +| digraph & traverse. | +| | +| The following variables are used as common storage between the | +| two. | +`---------------------------------------------------------------*/ + +static relation R; +static relation_nodes INDEX; +static relation_nodes VERTICES; +static int top; +static int infinity; +static bitsetv F; + +static void +traverse (int i) +{ + int j; + int height; + + VERTICES[++top] = i; + INDEX[i] = height = top; + + if (R[i]) + for (j = 0; R[i][j] >= 0; ++j) + { + if (INDEX[R[i][j]] == 0) + traverse (R[i][j]); + + if (INDEX[i] > INDEX[R[i][j]]) + INDEX[i] = INDEX[R[i][j]]; + + bitset_or (F[i], F[i], F[R[i][j]]); + } + + if (INDEX[i] == height) + for (;;) + { + j = VERTICES[top--]; + INDEX[j] = infinity; + + if (i == j) + break; + + bitset_copy (F[j], F[i]); + } +} + + +void +relation_digraph (relation r, size_t size, bitsetv *function) +{ + unsigned int i; + + infinity = size + 2; + CALLOC (INDEX, size + 1); + CALLOC (VERTICES, size + 1); + top = 0; + + R = r; + F = *function; + + for (i = 0; i < size; i++) + INDEX[i] = 0; + + for (i = 0; i < size; i++) + if (INDEX[i] == 0 && R[i]) + traverse (i); + + XFREE (INDEX); + XFREE (VERTICES); + + *function = F; +} + + +/*-------------------------------------------. +| Destructively transpose R_ARG, of size N. | +`-------------------------------------------*/ + +void +relation_transpose (relation *R_arg, int n) +{ + /* The result. */ + relation new_R = CALLOC (new_R, n); + /* END_R[I] -- next entry of NEW_R[I]. */ + relation end_R = CALLOC (end_R, n); + /* NEDGES[I] -- total size of NEW_R[I]. */ + int *nedges = CALLOC (nedges, n); + int i, j; + + if (trace_flag & trace_sets) + { + fputs ("relation_transpose: input\n", stderr); + relation_print (*R_arg, n, stderr); + } + + /* Count. */ + for (i = 0; i < n; i++) + if ((*R_arg)[i]) + for (j = 0; (*R_arg)[i][j] >= 0; ++j) + ++nedges[(*R_arg)[i][j]]; + + /* Allocate. */ + for (i = 0; i < n; i++) + if (nedges[i] > 0) + { + relation_node *sp = CALLOC (sp, nedges[i] + 1); + sp[nedges[i]] = -1; + new_R[i] = sp; + end_R[i] = sp; + } + + /* Store. */ + for (i = 0; i < n; i++) + if ((*R_arg)[i]) + for (j = 0; (*R_arg)[i][j] >= 0; ++j) + { + *end_R[(*R_arg)[i][j]] = i; + ++end_R[(*R_arg)[i][j]]; + } + + free (nedges); + free (end_R); + + /* Free the input: it is replaced with the result. */ + for (i = 0; i < n; i++) + XFREE ((*R_arg)[i]); + free (*R_arg); + + if (trace_flag & trace_sets) + { + fputs ("relation_transpose: output\n", stderr); + relation_print (new_R, n, stderr); + } + + *R_arg = new_R; +} diff --git a/src/apps/bin/bison/src/relation.h b/src/apps/bin/bison/src/relation.h new file mode 100644 index 0000000000..f79174c248 --- /dev/null +++ b/src/apps/bin/bison/src/relation.h @@ -0,0 +1,48 @@ +/* Binary relations. + Copyright (C) 2002, 2004 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + +#ifndef RELATION_H_ +# define RELATION_H_ + +/* Performing operations on graphs coded as list of adjacency. + + If GRAPH is a relation, then GRAPH[Node] is a list of adjacent + nodes, ended with -1. */ + +typedef short int relation_node; +typedef relation_node *relation_nodes; +typedef relation_nodes *relation; + + +/* Report a relation R that has SIZE vertices. */ +void relation_print (relation r, size_t size, FILE *out); + +/* Compute the transitive closure of the FUNCTION on the relation R + with SIZE vertices. + + If R (NODE-1, NODE-2) then on exit FUNCTION[NODE - 1] was extended + (unioned) with FUNCTION[NODE - 2]. */ +void relation_digraph (relation r, size_t size, bitsetv *function); + +/* Destructively transpose *R_ARG, of size N. */ +void relation_transpose (relation *R_arg, int n); + +#endif /* ! RELATION_H_ */ diff --git a/src/apps/bin/bison/src/scan-gram.c b/src/apps/bin/bison/src/scan-gram.c new file mode 100644 index 0000000000..72aa905c70 --- /dev/null +++ b/src/apps/bin/bison/src/scan-gram.c @@ -0,0 +1,3353 @@ +#define yy_create_buffer gram__create_buffer +#define yy_delete_buffer gram__delete_buffer +#define yy_scan_buffer gram__scan_buffer +#define yy_scan_string gram__scan_string +#define yy_scan_bytes gram__scan_bytes +#define yy_flex_debug gram__flex_debug +#define yy_init_buffer gram__init_buffer +#define yy_flush_buffer gram__flush_buffer +#define yy_load_buffer_state gram__load_buffer_state +#define yy_switch_to_buffer gram__switch_to_buffer +#define yyin gram_in +#define yyleng gram_leng +#define yylex gram_lex +#define yyout gram_out +#define yyrestart gram_restart +#define yytext gram_text + +#line 19 "scan-gram.c" +/* A lexical scanner generated by flex */ + +/* Scanner skeleton version: + * $Header: /tmp/bonefish/open-beos/current/src/apps/bin/bison/src/scan-gram.c,v 1.1 2004/06/01 09:52:40 korli Exp $ + */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 + +#include +#include + +/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ +#ifdef c_plusplus +#ifndef __cplusplus +#define __cplusplus +#endif +#endif + + +#ifdef __cplusplus + +#include +#ifndef _WIN32 +#include +#else +#ifndef YY_ALWAYS_INTERACTIVE +#ifndef YY_NEVER_INTERACTIVE +extern int isatty YY_PROTO(( int )); +#endif +#endif +#endif + +/* Use prototypes in function declarations. */ +#define YY_USE_PROTOS + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_PROTOS +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef __TURBOC__ + #pragma warn -rch + #pragma warn -use +#include +#include +#define YY_USE_CONST +#define YY_USE_PROTOS +#endif + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + + +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#define YY_BUF_SIZE 16384 + +typedef struct yy_buffer_state *YY_BUFFER_STATE; + +extern int yyleng; +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + +/* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * Prior to using the do-while the compiler would get upset at the + * "else" because it interpreted the "if" statement as being all + * done when it reached the ';' after the yyless() call. + */ + +/* Return all but the first 'n' matched characters back to the input stream. */ + +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + *yy_cp = yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yytext_ptr ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ +typedef unsigned int yy_size_t; + + +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + }; + +static YY_BUFFER_STATE yy_current_buffer = 0; + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + */ +#define YY_CURRENT_BUFFER yy_current_buffer + + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; + +static int yy_n_chars; /* number of characters read into yy_ch_buf */ + + +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart YY_PROTO(( FILE *input_file )); + +void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); +void yy_load_buffer_state YY_PROTO(( void )); +YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); +void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); +void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); +void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); +#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) + +YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); +YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); +YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); + +static void *yy_flex_alloc YY_PROTO(( yy_size_t )); +static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); +static void yy_flex_free YY_PROTO(( void * )); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) + + +#define yywrap() 1 +#define YY_SKIP_YYWRAP + +#define FLEX_DEBUG +typedef unsigned char YY_CHAR; +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +typedef int yy_state_type; + +#define FLEX_DEBUG +extern char *yytext; +#define yytext_ptr yytext + +static yy_state_type yy_get_previous_state YY_PROTO(( void )); +static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); +static int yy_get_next_buffer YY_PROTO(( void )); +static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 106 +#define YY_END_OF_BUFFER 107 +static yyconst short int yy_accept[455] = + { 0, + 0, 0, 0, 0, 65, 65, 0, 0, 83, 83, + 83, 83, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 107, 58, 2, 2, + 53, 58, 52, 1, 49, 58, 50, 50, 48, 58, + 46, 55, 47, 58, 104, 105, 100, 104, 101, 102, + 103, 64, 104, 62, 62, 87, 86, 104, 85, 84, + 60, 2, 1, 60, 59, 60, 67, 66, 104, 70, + 69, 68, 92, 2, 1, 92, 92, 89, 100, 104, + 88, 104, 104, 101, 93, 95, 104, 57, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + + 45, 45, 45, 45, 45, 45, 54, 49, 4, 3, + 50, 0, 0, 0, 63, 0, 0, 65, 61, 83, + 83, 83, 83, 82, 80, 71, 82, 73, 74, 75, + 76, 77, 78, 82, 79, 82, 97, 0, 97, 0, + 94, 0, 90, 91, 0, 93, 96, 0, 98, 0, + 98, 99, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 3, 51, 56, 0, 0, 0, 0, 0, 0, 0, + 0, 71, 0, 0, 72, 0, 0, 0, 0, 0, + + 0, 0, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 0, 71, 0, 0, 0, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 20, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 32, 45, 45, 45, 45, 45, + 38, 45, 41, 45, 45, 44, 0, 0, 0, 45, + 7, 45, 45, 45, 12, 45, 45, 45, 45, 45, + 45, 45, 45, 23, 45, 45, 45, 45, 45, 29, + + 45, 45, 45, 45, 35, 45, 37, 39, 42, 45, + 0, 0, 81, 6, 45, 9, 45, 45, 14, 45, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 30, 45, 45, 45, 45, 45, 45, 0, 45, 10, + 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 45, 33, 45, 45, 45, 43, + 0, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 26, 27, 45, 45, 45, 36, 45, + 0, 45, 45, 45, 15, 45, 45, 45, 45, 21, + 22, 45, 45, 45, 45, 45, 45, 0, 0, 45, + + 11, 45, 45, 45, 19, 45, 45, 45, 45, 45, + 45, 45, 5, 45, 45, 16, 45, 45, 24, 45, + 45, 31, 34, 40, 8, 45, 45, 45, 45, 45, + 13, 45, 45, 45, 45, 45, 18, 45, 45, 45, + 25, 45, 45, 45, 45, 45, 17, 45, 45, 45, + 45, 45, 28, 0 + } ; + +static yyconst int yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, + 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 4, 1, 5, 6, 7, 8, 1, 9, 1, + 1, 10, 1, 11, 12, 13, 14, 15, 16, 16, + 16, 16, 16, 16, 16, 17, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 25, 25, 25, 25, 25, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 26, 13, 13, 27, 13, 13, + 28, 29, 30, 1, 31, 1, 32, 33, 34, 35, + + 36, 37, 38, 39, 40, 13, 41, 42, 43, 44, + 45, 46, 13, 47, 48, 49, 50, 51, 13, 52, + 53, 13, 54, 55, 56, 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, 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, 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, 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 + } ; + +static yyconst int yy_meta[58] = + { 0, + 1, 1, 2, 1, 1, 1, 3, 1, 1, 1, + 1, 4, 5, 1, 6, 6, 6, 1, 1, 1, + 1, 7, 1, 3, 6, 5, 5, 3, 1, 3, + 5, 6, 6, 6, 6, 6, 6, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 1, 1, 1, 7 + } ; + +static yyconst short int yy_base[477] = + { 0, + 0, 725, 55, 56, 64, 67, 720, 719, 95, 98, + 105, 108, 137, 143, 101, 113, 147, 150, 160, 178, + 205, 0, 53, 170, 178, 198, 728, 732, 732, 732, + 732, 254, 732, 732, 0, 54, 184, 150, 732, 0, + 732, 732, 732, 685, 732, 732, 732, 58, 732, 732, + 732, 732, 193, 732, 712, 732, 732, 213, 732, 732, + 732, 732, 732, 68, 732, 683, 732, 732, 304, 732, + 732, 732, 732, 732, 732, 158, 682, 732, 231, 47, + 732, 159, 123, 248, 732, 732, 667, 732, 0, 682, + 53, 176, 681, 678, 675, 45, 682, 195, 667, 221, + + 676, 72, 205, 671, 678, 681, 732, 0, 732, 0, + 257, 0, 690, 671, 732, 273, 280, 681, 732, 732, + 308, 680, 312, 732, 732, 205, 0, 732, 732, 732, + 732, 732, 732, 0, 732, 0, 732, 306, 309, 0, + 732, 336, 732, 732, 340, 732, 732, 343, 732, 342, + 345, 732, 0, 664, 330, 660, 659, 659, 68, 657, + 663, 123, 668, 654, 657, 225, 663, 649, 650, 147, + 649, 657, 658, 661, 645, 650, 644, 649, 641, 653, + 0, 0, 732, 642, 362, 216, 366, 369, 372, 377, + 228, 302, 0, 0, 0, 663, 380, 306, 383, 378, + + 387, 385, 652, 633, 238, 633, 645, 635, 643, 642, + 641, 664, 626, 625, 661, 640, 633, 634, 359, 297, + 622, 622, 619, 632, 621, 628, 624, 620, 614, 617, + 623, 622, 612, 623, 621, 618, 732, 0, 0, 396, + 606, 614, 601, 606, 602, 614, 600, 612, 633, 609, + 597, 602, 0, 595, 591, 603, 319, 602, 597, 588, + 599, 591, 583, 596, 0, 582, 365, 581, 593, 579, + 0, 583, 0, 582, 580, 0, 620, 0, 0, 570, + 0, 580, 585, 570, 0, 385, 570, 572, 386, 585, + 584, 583, 574, 0, 567, 575, 567, 562, 560, 0, + + 559, 595, 570, 559, 0, 555, 0, 387, 0, 555, + 404, 0, 732, 0, 553, 553, 566, 548, 392, 551, + 552, 549, 553, 547, 548, 545, 559, 554, 544, 552, + 0, 541, 539, 553, 539, 534, 546, 411, 394, 0, + 532, 544, 532, 542, 527, 528, 563, 542, 529, 536, + 521, 522, 535, 521, 535, 0, 519, 521, 532, 0, + 558, 516, 516, 513, 512, 521, 508, 520, 523, 511, + 505, 515, 509, 0, 0, 507, 502, 500, 0, 514, + 541, 498, 497, 510, 0, 502, 495, 493, 505, 0, + 0, 498, 488, 496, 503, 498, 491, 527, 188, 495, + + 0, 485, 477, 478, 0, 478, 474, 398, 481, 481, + 476, 486, 732, 487, 472, 0, 470, 478, 0, 471, + 476, 0, 0, 0, 0, 479, 410, 464, 456, 448, + 0, 443, 429, 404, 390, 398, 0, 403, 396, 393, + 0, 400, 397, 420, 383, 384, 0, 392, 362, 354, + 364, 348, 0, 732, 441, 448, 455, 462, 465, 471, + 477, 484, 488, 494, 346, 343, 328, 260, 501, 243, + 233, 203, 197, 138, 69, 507 + } ; + +static yyconst short int yy_def[477] = + { 0, + 454, 1, 455, 455, 455, 455, 456, 456, 455, 455, + 455, 455, 457, 457, 455, 455, 455, 455, 458, 458, + 455, 21, 21, 21, 21, 21, 454, 454, 454, 454, + 454, 454, 454, 454, 459, 454, 454, 454, 454, 460, + 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454, 454, 461, 454, 454, + 454, 454, 454, 454, 454, 454, 454, 454, 462, 454, + 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454, 454, 454, 463, 463, + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, + + 463, 463, 463, 463, 463, 463, 454, 459, 454, 464, + 454, 465, 460, 454, 454, 454, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454, 466, 454, 454, 454, + 454, 454, 454, 467, 454, 468, 454, 454, 454, 469, + 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, + 454, 454, 463, 463, 463, 463, 463, 463, 463, 463, + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, + 464, 465, 454, 454, 454, 454, 454, 454, 454, 454, + 461, 454, 470, 471, 468, 469, 454, 454, 454, 454, + + 454, 454, 463, 463, 463, 463, 463, 463, 463, 463, + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, + 463, 463, 463, 463, 463, 454, 454, 472, 473, 454, + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, + 463, 463, 463, 463, 463, 463, 454, 474, 475, 463, + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, + + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, + 454, 467, 454, 463, 463, 463, 463, 463, 463, 463, + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, + 463, 463, 463, 463, 463, 463, 463, 454, 463, 463, + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, + 454, 463, 463, 463, 463, 463, 463, 463, 463, 463, + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, + 476, 463, 463, 463, 463, 463, 463, 463, 463, 463, + 463, 463, 463, 463, 463, 463, 463, 476, 476, 463, + + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, + 463, 463, 454, 463, 463, 463, 463, 463, 463, 463, + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, + 463, 463, 463, 463, 463, 463, 463, 463, 463, 463, + 463, 463, 463, 0, 454, 454, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454 + } ; + +static yyconst short int yy_nxt[790] = + { 0, + 28, 29, 30, 29, 31, 28, 28, 32, 33, 28, + 34, 28, 35, 36, 37, 38, 38, 28, 39, 40, + 41, 28, 28, 28, 35, 35, 35, 28, 28, 28, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 42, 43, 28, 28, 46, 46, 47, + 87, 47, 47, 109, 48, 48, 52, 110, 141, 52, + 47, 115, 45, 47, 313, 142, 49, 109, 49, 49, + 162, 110, 50, 50, 51, 51, 116, 49, 155, 163, + 49, 50, 53, 51, 50, 53, 51, 56, 156, 57, + + 56, 47, 57, 67, 47, 68, 45, 59, 45, 210, + 59, 47, 173, 60, 47, 67, 60, 68, 49, 211, + 174, 49, 50, 58, 51, 50, 58, 51, 49, 69, + 146, 49, 50, 58, 51, 50, 58, 51, 62, 30, + 62, 69, 147, 312, 62, 30, 62, 63, 66, 71, + 64, 148, 71, 63, 65, 72, 64, 70, 72, 214, + 65, 74, 30, 74, 111, 111, 111, 109, 143, 70, + 75, 110, 144, 76, 215, 69, 47, 87, 69, 74, + 30, 74, 224, 77, 47, 45, 225, 145, 75, 45, + 413, 76, 399, 49, 117, 118, 117, 45, 111, 111, + + 111, 49, 279, 70, 47, 45, 70, 46, 278, 78, + 112, 79, 80, 81, 121, 122, 121, 45, 82, 192, + 192, 49, 157, 45, 83, 45, 165, 158, 84, 115, + 454, 45, 50, 45, 51, 112, 219, 137, 239, 166, + 175, 123, 138, 167, 116, 139, 139, 139, 238, 176, + 140, 45, 169, 45, 149, 219, 123, 177, 85, 150, + 86, 88, 151, 151, 151, 195, 89, 170, 220, 243, + 171, 111, 111, 111, 185, 186, 185, 244, 89, 89, + 89, 117, 118, 117, 89, 89, 90, 89, 91, 92, + 93, 94, 89, 95, 89, 96, 97, 98, 99, 100, + + 101, 102, 103, 104, 105, 89, 106, 107, 125, 188, + 122, 188, 125, 190, 191, 190, 237, 237, 126, 126, + 139, 139, 139, 139, 139, 139, 125, 141, 260, 127, + 295, 261, 125, 194, 142, 128, 129, 197, 198, 197, + 130, 199, 200, 199, 201, 202, 201, 131, 193, 295, + 132, 182, 133, 134, 135, 136, 151, 151, 151, 151, + 151, 151, 204, 185, 186, 185, 205, 117, 118, 117, + 188, 122, 188, 188, 122, 188, 304, 206, 190, 191, + 190, 197, 198, 197, 199, 200, 199, 143, 201, 202, + 201, 144, 146, 258, 453, 304, 318, 321, 336, 452, + + 259, 451, 137, 343, 147, 362, 145, 138, 450, 420, + 139, 139, 139, 148, 361, 318, 321, 336, 338, 338, + 338, 432, 343, 449, 362, 338, 338, 338, 420, 448, + 447, 446, 445, 444, 443, 442, 441, 440, 439, 438, + 432, 45, 45, 45, 45, 45, 45, 45, 54, 54, + 54, 54, 54, 54, 54, 61, 61, 61, 61, 61, + 61, 61, 73, 73, 73, 73, 73, 73, 73, 108, + 108, 113, 437, 113, 113, 113, 113, 120, 120, 436, + 120, 120, 120, 120, 124, 124, 124, 124, 124, 124, + 124, 153, 153, 153, 181, 435, 181, 181, 181, 181, + + 181, 196, 434, 196, 196, 196, 196, 398, 433, 398, + 398, 398, 398, 398, 431, 430, 429, 428, 427, 426, + 425, 424, 423, 422, 421, 419, 418, 417, 416, 415, + 414, 399, 412, 411, 410, 409, 408, 407, 406, 405, + 404, 403, 402, 401, 400, 399, 397, 396, 395, 394, + 393, 392, 391, 390, 389, 388, 387, 386, 385, 384, + 383, 382, 381, 380, 379, 378, 377, 376, 375, 374, + 373, 372, 371, 370, 369, 368, 367, 366, 365, 364, + 363, 360, 359, 358, 357, 356, 355, 354, 353, 352, + 351, 350, 349, 348, 347, 346, 345, 344, 342, 341, + + 340, 339, 337, 335, 334, 333, 332, 331, 330, 329, + 328, 327, 326, 325, 324, 323, 322, 320, 319, 317, + 316, 315, 314, 311, 310, 309, 308, 307, 306, 305, + 303, 302, 301, 300, 299, 298, 297, 296, 294, 293, + 292, 291, 290, 289, 288, 287, 286, 285, 284, 283, + 282, 281, 280, 277, 276, 275, 274, 273, 272, 271, + 270, 269, 268, 267, 266, 265, 264, 263, 262, 257, + 256, 255, 254, 253, 252, 251, 250, 249, 248, 247, + 246, 245, 242, 241, 240, 236, 235, 234, 233, 232, + 231, 230, 229, 228, 227, 226, 223, 222, 221, 218, + + 217, 216, 213, 212, 209, 208, 207, 203, 189, 187, + 184, 183, 180, 179, 178, 172, 168, 164, 161, 160, + 159, 154, 152, 114, 114, 119, 114, 454, 55, 55, + 44, 27, 454, 454, 454, 454, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454, 454, 454, 454 + } ; + +static yyconst short int yy_chk[790] = + { 0, + 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, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 3, 4, 23, + 23, 3, 4, 36, 3, 4, 5, 36, 80, 6, + 5, 48, 23, 6, 475, 80, 23, 64, 3, 4, + 96, 64, 3, 4, 3, 4, 48, 5, 91, 96, + 6, 5, 5, 5, 6, 6, 6, 9, 91, 9, + + 10, 9, 10, 15, 10, 15, 23, 11, 23, 159, + 12, 11, 102, 11, 12, 16, 12, 16, 9, 159, + 102, 10, 9, 9, 9, 10, 10, 10, 11, 15, + 83, 12, 11, 11, 11, 12, 12, 12, 13, 13, + 13, 16, 83, 474, 14, 14, 14, 13, 14, 17, + 13, 83, 18, 14, 13, 17, 14, 15, 18, 162, + 14, 19, 19, 19, 38, 38, 38, 76, 82, 16, + 19, 76, 82, 19, 162, 17, 24, 24, 18, 20, + 20, 20, 170, 20, 25, 25, 170, 82, 20, 24, + 399, 20, 399, 24, 53, 53, 53, 25, 37, 37, + + 37, 25, 473, 17, 26, 26, 18, 21, 472, 21, + 37, 21, 21, 21, 58, 58, 58, 26, 21, 126, + 126, 26, 92, 24, 21, 24, 98, 92, 21, 186, + 191, 25, 21, 25, 21, 37, 166, 79, 471, 98, + 103, 58, 79, 98, 186, 79, 79, 79, 470, 103, + 79, 26, 100, 26, 84, 166, 191, 103, 21, 84, + 21, 32, 84, 84, 84, 468, 32, 100, 166, 205, + 100, 111, 111, 111, 116, 116, 116, 205, 32, 32, + 32, 117, 117, 117, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + + 32, 32, 32, 32, 32, 32, 32, 32, 69, 121, + 121, 121, 69, 123, 123, 123, 192, 192, 69, 69, + 138, 138, 138, 139, 139, 139, 69, 198, 220, 69, + 257, 220, 69, 467, 198, 69, 69, 142, 142, 142, + 69, 145, 145, 145, 148, 148, 148, 69, 466, 257, + 69, 465, 69, 69, 69, 69, 150, 150, 150, 151, + 151, 151, 155, 185, 185, 185, 155, 187, 187, 187, + 188, 188, 188, 189, 189, 189, 267, 155, 190, 190, + 190, 197, 197, 197, 199, 199, 199, 200, 201, 201, + 201, 200, 202, 219, 452, 267, 286, 289, 308, 451, + + 219, 450, 240, 319, 202, 339, 200, 240, 449, 408, + 240, 240, 240, 202, 338, 286, 289, 308, 311, 311, + 311, 427, 319, 448, 339, 338, 338, 338, 408, 446, + 445, 444, 443, 442, 440, 439, 438, 436, 435, 434, + 427, 455, 455, 455, 455, 455, 455, 455, 456, 456, + 456, 456, 456, 456, 456, 457, 457, 457, 457, 457, + 457, 457, 458, 458, 458, 458, 458, 458, 458, 459, + 459, 460, 433, 460, 460, 460, 460, 461, 461, 432, + 461, 461, 461, 461, 462, 462, 462, 462, 462, 462, + 462, 463, 463, 463, 464, 430, 464, 464, 464, 464, + + 464, 469, 429, 469, 469, 469, 469, 476, 428, 476, + 476, 476, 476, 476, 426, 421, 420, 418, 417, 415, + 414, 412, 411, 410, 409, 407, 406, 404, 403, 402, + 400, 398, 397, 396, 395, 394, 393, 392, 389, 388, + 387, 386, 384, 383, 382, 381, 380, 378, 377, 376, + 373, 372, 371, 370, 369, 368, 367, 366, 365, 364, + 363, 362, 361, 359, 358, 357, 355, 354, 353, 352, + 351, 350, 349, 348, 347, 346, 345, 344, 343, 342, + 341, 337, 336, 335, 334, 333, 332, 330, 329, 328, + 327, 326, 325, 324, 323, 322, 321, 320, 318, 317, + + 316, 315, 310, 306, 304, 303, 302, 301, 299, 298, + 297, 296, 295, 293, 292, 291, 290, 288, 287, 284, + 283, 282, 280, 277, 275, 274, 272, 270, 269, 268, + 266, 264, 263, 262, 261, 260, 259, 258, 256, 255, + 254, 252, 251, 250, 249, 248, 247, 246, 245, 244, + 243, 242, 241, 236, 235, 234, 233, 232, 231, 230, + 229, 228, 227, 226, 225, 224, 223, 222, 221, 218, + 217, 216, 215, 214, 213, 212, 211, 210, 209, 208, + 207, 206, 204, 203, 196, 184, 180, 179, 178, 177, + 176, 175, 174, 173, 172, 171, 169, 168, 167, 165, + + 164, 163, 161, 160, 158, 157, 156, 154, 122, 118, + 114, 113, 106, 105, 104, 101, 99, 97, 95, 94, + 93, 90, 87, 77, 66, 55, 44, 27, 8, 7, + 2, 454, 454, 454, 454, 454, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454, 454, 454, 454, 454, + 454, 454, 454, 454, 454, 454, 454, 454, 454 + } ; + +static yy_state_type yy_last_accepting_state; +static char *yy_last_accepting_cpos; + +extern int yy_flex_debug; +int yy_flex_debug = 1; + +static yyconst short int yy_rule_linenum[106] = + { 0, + 162, 163, 164, 165, 173, 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, 224, 228, 229, 230, 232, 239, + 243, 249, 252, 255, 258, 267, 275, 282, 299, 305, + 326, 327, 338, 349, 350, 362, 371, 382, 396, 402, + 412, 422, 434, 435, 436, 437, 438, 439, 440, 443, + 445, 454, 466, 471, 472, 478, 479, 490, 496, 502, + 508, 524, 558, 559, 560, 595, 597, 598, 610, 645, + + 646, 647, 648, 656, 657 + } ; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "scan-gram.l" +#define INITIAL 0 +/* Bison Grammar Scanner -*- C -*- + + Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA +*/ +#define YY_NO_UNPUT 1 +#define YY_NEVER_INTERACTIVE 1 +#line 27 "scan-gram.l" +#include "system.h" + +#include +#include +#include + +#include "complain.h" +#include "files.h" +#include "getargs.h" +#include "gram.h" +#include "reader.h" +#include "uniqstr.h" + +#define YY_USER_INIT \ + do \ + { \ + scanner_cursor.file = current_file; \ + scanner_cursor.line = 1; \ + scanner_cursor.column = 1; \ + code_start = scanner_cursor; \ + } \ + while (0) + +/* Location of scanner cursor. */ +boundary scanner_cursor; + +static void adjust_location (location *, char const *, size_t); +#define YY_USER_ACTION adjust_location (loc, yytext, yyleng); + +static size_t no_cr_read (FILE *, char *, size_t); +#define YY_INPUT(buf, result, size) ((result) = no_cr_read (yyin, buf, size)) + + +/* OBSTACK_FOR_STRING -- Used to store all the characters that we need to + keep (to construct ID, STRINGS etc.). Use the following macros to + use it. + + Use STRING_GROW to append what has just been matched, and + STRING_FINISH to end the string (it puts the ending 0). + STRING_FINISH also stores this string in LAST_STRING, which can be + used, and which is used by STRING_FREE to free the last string. */ + +static struct obstack obstack_for_string; + +/* A string representing the most recently saved token. */ +static char *last_string; + + +#define STRING_GROW \ + obstack_grow (&obstack_for_string, yytext, yyleng) + +#define STRING_FINISH \ + do { \ + obstack_1grow (&obstack_for_string, '\0'); \ + last_string = obstack_finish (&obstack_for_string); \ + } while (0) + +#define STRING_FREE \ + obstack_free (&obstack_for_string, last_string) + +void +scanner_last_string_free (void) +{ + STRING_FREE; +} + +/* Within well-formed rules, RULE_LENGTH is the number of values in + the current rule so far, which says where to find `$0' with respect + to the top of the stack. It is not the same as the rule->length in + the case of mid rule actions. + + Outside of well-formed rules, RULE_LENGTH has an undefined value. */ +static int rule_length; + +static void handle_dollar (int token_type, char *cp, location loc); +static void handle_at (int token_type, char *cp, location loc); +static void handle_syncline (char *args); +static unsigned long int scan_integer (char const *p, int base, location loc); +static int convert_ucn_to_byte (char const *hex_text); +static void unexpected_eof (boundary, char const *); +static void unexpected_newline (boundary, char const *); + +#define SC_COMMENT 1 +#define SC_LINE_COMMENT 2 +#define SC_YACC_COMMENT 3 + +#define SC_STRING 4 +#define SC_CHARACTER 5 + +#define SC_AFTER_IDENTIFIER 6 + +#define SC_ESCAPED_STRING 7 +#define SC_ESCAPED_CHARACTER 8 + +#define SC_PRE_CODE 9 +#define SC_BRACED_CODE 10 +#define SC_PROLOGUE 11 +#define SC_EPILOGUE 12 + +/* POSIX says that a tag must be both an id and a C union member, but + historically almost any character is allowed in a tag. We disallow + NUL and newline, as this simplifies our implementation. */ +/* Zero or more instances of backslash-newline. Following GCC, allow + white space between the backslash and the newline. */ +#line 869 "scan-gram.c" + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap YY_PROTO(( void )); +#else +extern int yywrap YY_PROTO(( void )); +#endif +#endif + +#ifndef YY_NO_UNPUT +static void yyunput YY_PROTO(( int c, char *buf_ptr )); +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen YY_PROTO(( yyconst char * )); +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput YY_PROTO(( void )); +#else +static int input YY_PROTO(( void )); +#endif +#endif + +#if YY_STACK_USED +static int yy_start_stack_ptr = 0; +static int yy_start_stack_depth = 0; +static int *yy_start_stack = 0; +#ifndef YY_NO_PUSH_STATE +static void yy_push_state YY_PROTO(( int new_state )); +#endif +#ifndef YY_NO_POP_STATE +static void yy_pop_state YY_PROTO(( void )); +#endif +#ifndef YY_NO_TOP_STATE +static int yy_top_state YY_PROTO(( void )); +#endif + +#else +#define YY_NO_PUSH_STATE 1 +#define YY_NO_POP_STATE 1 +#define YY_NO_TOP_STATE 1 +#endif + +#ifdef YY_MALLOC_DECL +YY_MALLOC_DECL +#else +#if __STDC__ +#ifndef __cplusplus +#include +#endif +#else +/* Just try to get by without declaring the routines. This will fail + * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) + * or sizeof(void*) != sizeof(int). + */ +#endif +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ + +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(yyin); \ + } \ + } +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL int yylex YY_PROTO(( void )) +#endif + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + if ( yyleng > 0 ) \ + yy_current_buffer->yy_at_bol = \ + (yytext[yyleng - 1] == '\n'); \ + YY_USER_ACTION + +YY_DECL + { + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 130 "scan-gram.l" + + + /* Nesting level of the current code in braces. */ + int braces_level IF_LINT (= 0); + + /* Parent context state, when applicable. */ + int context_state IF_LINT (= 0); + + /* Token type to return, when applicable. */ + int token_type IF_LINT (= 0); + + /* Location of most recent identifier, when applicable. */ + location id_loc IF_LINT (= empty_location); + + /* Where containing code started, when applicable. Its initial + value is relevant only when yylex is invoked in the SC_EPILOGUE + start condition. */ + boundary code_start = scanner_cursor; + + /* Where containing comment or string or character literal started, + when applicable. */ + boundary token_start IF_LINT (= scanner_cursor); + + + + /*-----------------------. + | Scanning white space. | + `-----------------------*/ + +#line 1064 "scan-gram.c" + + if ( yy_init ) + { + yy_init = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yy_start ) + yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! yy_current_buffer ) + yy_current_buffer = + yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_load_buffer_state(); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yy_start; + yy_current_state += YY_AT_BOL(); +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + 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 >= 455 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 732 ); + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) + { /* have to back up */ + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + +do_action: /* This label is used only to access EOF actions. */ + + if ( yy_flex_debug ) + { + if ( yy_act == 0 ) + fprintf( stderr, "--scanner backing up\n" ); + else if ( yy_act < 106 ) + fprintf( stderr, "--accepting rule at line %d (\"%s\")\n", + yy_rule_linenum[yy_act], yytext ); + else if ( yy_act == 106 ) + fprintf( stderr, "--accepting default rule (\"%s\")\n", + yytext ); + else if ( yy_act == 107 ) + fprintf( stderr, "--(end of buffer or a NUL)\n" ); + else + fprintf( stderr, "--EOF (start condition %d)\n", YY_START ); + } + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = yy_hold_char; + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + goto yy_find_action; + + + +/* Comments and white space. */ +case 1: +YY_RULE_SETUP +#line 162 "scan-gram.l" +warn_at (*loc, _("stray `,' treated as white space")); + YY_BREAK +case 2: +#line 164 "scan-gram.l" +case 3: +YY_RULE_SETUP +#line 164 "scan-gram.l" +; + YY_BREAK +case 4: +YY_RULE_SETUP +#line 165 "scan-gram.l" +{ + token_start = loc->start; + context_state = YY_START; + BEGIN SC_YACC_COMMENT; + } + YY_BREAK +/* #line directives are not documented, and may be withdrawn or + modified in future versions of Bison. */ +case 5: +YY_RULE_SETUP +#line 173 "scan-gram.l" +{ + handle_syncline (yytext + sizeof "#line " - 1); + } + YY_BREAK + +/*----------------------------. + | Scanning Bison directives. | + `----------------------------*/ + + +case 6: +YY_RULE_SETUP +#line 184 "scan-gram.l" +return PERCENT_NONASSOC; + YY_BREAK +case 7: +YY_RULE_SETUP +#line 185 "scan-gram.l" +return PERCENT_DEBUG; + YY_BREAK +case 8: +YY_RULE_SETUP +#line 186 "scan-gram.l" +return PERCENT_DEFAULT_PREC; + YY_BREAK +case 9: +YY_RULE_SETUP +#line 187 "scan-gram.l" +return PERCENT_DEFINE; + YY_BREAK +case 10: +YY_RULE_SETUP +#line 188 "scan-gram.l" +return PERCENT_DEFINES; + YY_BREAK +case 11: +YY_RULE_SETUP +#line 189 "scan-gram.l" +token_type = PERCENT_DESTRUCTOR; BEGIN SC_PRE_CODE; + YY_BREAK +case 12: +YY_RULE_SETUP +#line 190 "scan-gram.l" +return PERCENT_DPREC; + YY_BREAK +case 13: +YY_RULE_SETUP +#line 191 "scan-gram.l" +return PERCENT_ERROR_VERBOSE; + YY_BREAK +case 14: +YY_RULE_SETUP +#line 192 "scan-gram.l" +return PERCENT_EXPECT; + YY_BREAK +case 15: +YY_RULE_SETUP +#line 193 "scan-gram.l" +return PERCENT_EXPECT_RR; + YY_BREAK +case 16: +YY_RULE_SETUP +#line 194 "scan-gram.l" +return PERCENT_FILE_PREFIX; + YY_BREAK +case 17: +YY_RULE_SETUP +#line 195 "scan-gram.l" +return PERCENT_YACC; + YY_BREAK +case 18: +YY_RULE_SETUP +#line 196 "scan-gram.l" +token_type = PERCENT_INITIAL_ACTION; BEGIN SC_PRE_CODE; + YY_BREAK +case 19: +YY_RULE_SETUP +#line 197 "scan-gram.l" +return PERCENT_GLR_PARSER; + YY_BREAK +case 20: +YY_RULE_SETUP +#line 198 "scan-gram.l" +return PERCENT_LEFT; + YY_BREAK +case 21: +YY_RULE_SETUP +#line 199 "scan-gram.l" +token_type = PERCENT_LEX_PARAM; BEGIN SC_PRE_CODE; + YY_BREAK +case 22: +YY_RULE_SETUP +#line 200 "scan-gram.l" +return PERCENT_LOCATIONS; + YY_BREAK +case 23: +YY_RULE_SETUP +#line 201 "scan-gram.l" +return PERCENT_MERGE; + YY_BREAK +case 24: +YY_RULE_SETUP +#line 202 "scan-gram.l" +return PERCENT_NAME_PREFIX; + YY_BREAK +case 25: +YY_RULE_SETUP +#line 203 "scan-gram.l" +return PERCENT_NO_DEFAULT_PREC; + YY_BREAK +case 26: +YY_RULE_SETUP +#line 204 "scan-gram.l" +return PERCENT_NO_LINES; + YY_BREAK +case 27: +YY_RULE_SETUP +#line 205 "scan-gram.l" +return PERCENT_NONASSOC; + YY_BREAK +case 28: +YY_RULE_SETUP +#line 206 "scan-gram.l" +return PERCENT_NONDETERMINISTIC_PARSER; + YY_BREAK +case 29: +YY_RULE_SETUP +#line 207 "scan-gram.l" +return PERCENT_NTERM; + YY_BREAK +case 30: +YY_RULE_SETUP +#line 208 "scan-gram.l" +return PERCENT_OUTPUT; + YY_BREAK +case 31: +YY_RULE_SETUP +#line 209 "scan-gram.l" +token_type = PERCENT_PARSE_PARAM; BEGIN SC_PRE_CODE; + YY_BREAK +case 32: +YY_RULE_SETUP +#line 210 "scan-gram.l" +rule_length--; return PERCENT_PREC; + YY_BREAK +case 33: +YY_RULE_SETUP +#line 211 "scan-gram.l" +token_type = PERCENT_PRINTER; BEGIN SC_PRE_CODE; + YY_BREAK +case 34: +YY_RULE_SETUP +#line 212 "scan-gram.l" +return PERCENT_PURE_PARSER; + YY_BREAK +case 35: +YY_RULE_SETUP +#line 213 "scan-gram.l" +return PERCENT_RIGHT; + YY_BREAK +case 36: +YY_RULE_SETUP +#line 214 "scan-gram.l" +return PERCENT_SKELETON; + YY_BREAK +case 37: +YY_RULE_SETUP +#line 215 "scan-gram.l" +return PERCENT_START; + YY_BREAK +case 38: +YY_RULE_SETUP +#line 216 "scan-gram.l" +return PERCENT_TOKEN; + YY_BREAK +case 39: +YY_RULE_SETUP +#line 217 "scan-gram.l" +return PERCENT_TOKEN; + YY_BREAK +case 40: +YY_RULE_SETUP +#line 218 "scan-gram.l" +return PERCENT_TOKEN_TABLE; + YY_BREAK +case 41: +YY_RULE_SETUP +#line 219 "scan-gram.l" +return PERCENT_TYPE; + YY_BREAK +case 42: +YY_RULE_SETUP +#line 220 "scan-gram.l" +token_type = PERCENT_UNION; BEGIN SC_PRE_CODE; + YY_BREAK +case 43: +YY_RULE_SETUP +#line 221 "scan-gram.l" +return PERCENT_VERBOSE; + YY_BREAK +case 44: +YY_RULE_SETUP +#line 222 "scan-gram.l" +return PERCENT_YACC; + YY_BREAK +case 45: +YY_RULE_SETUP +#line 224 "scan-gram.l" +{ + complain_at (*loc, _("invalid directive: %s"), quote (yytext)); + } + YY_BREAK +case 46: +YY_RULE_SETUP +#line 228 "scan-gram.l" +return EQUAL; + YY_BREAK +case 47: +YY_RULE_SETUP +#line 229 "scan-gram.l" +rule_length = 0; return PIPE; + YY_BREAK +case 48: +YY_RULE_SETUP +#line 230 "scan-gram.l" +return SEMICOLON; + YY_BREAK +case 49: +YY_RULE_SETUP +#line 232 "scan-gram.l" +{ + val->symbol = symbol_get (yytext, *loc); + id_loc = *loc; + rule_length++; + BEGIN SC_AFTER_IDENTIFIER; + } + YY_BREAK +case 50: +YY_RULE_SETUP +#line 239 "scan-gram.l" +{ + val->integer = scan_integer (yytext, 10, *loc); + return INT; + } + YY_BREAK +case 51: +YY_RULE_SETUP +#line 243 "scan-gram.l" +{ + val->integer = scan_integer (yytext, 16, *loc); + return INT; + } + YY_BREAK +/* Characters. We don't check there is only one. */ +case 52: +YY_RULE_SETUP +#line 249 "scan-gram.l" +STRING_GROW; token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; + YY_BREAK +/* Strings. */ +case 53: +YY_RULE_SETUP +#line 252 "scan-gram.l" +STRING_GROW; token_start = loc->start; BEGIN SC_ESCAPED_STRING; + YY_BREAK +/* Prologue. */ +case 54: +YY_RULE_SETUP +#line 255 "scan-gram.l" +code_start = loc->start; BEGIN SC_PROLOGUE; + YY_BREAK +/* Code in between braces. */ +case 55: +YY_RULE_SETUP +#line 258 "scan-gram.l" +{ + STRING_GROW; + token_type = BRACED_CODE; + braces_level = 0; + code_start = loc->start; + BEGIN SC_BRACED_CODE; + } + YY_BREAK +/* A type. */ +case 56: +YY_RULE_SETUP +#line 267 "scan-gram.l" +{ + obstack_grow (&obstack_for_string, yytext + 1, yyleng - 2); + STRING_FINISH; + val->uniqstr = uniqstr_new (last_string); + STRING_FREE; + return TYPE; + } + YY_BREAK +case 57: +YY_RULE_SETUP +#line 275 "scan-gram.l" +{ + static int percent_percent_count; + if (++percent_percent_count == 2) + BEGIN SC_EPILOGUE; + return PERCENT_PERCENT; + } + YY_BREAK +case 58: +YY_RULE_SETUP +#line 282 "scan-gram.l" +{ + complain_at (*loc, _("invalid character: %s"), quote (yytext)); + } + YY_BREAK +case YY_STATE_EOF(INITIAL): +#line 286 "scan-gram.l" +{ + loc->start = loc->end = scanner_cursor; + yyterminate (); + } + YY_BREAK + +/*-----------------------------------------------------------------. + | Scanning after an identifier, checking whether a colon is next. | + `-----------------------------------------------------------------*/ + + +case 59: +YY_RULE_SETUP +#line 299 "scan-gram.l" +{ + rule_length = 0; + *loc = id_loc; + BEGIN INITIAL; + return ID_COLON; + } + YY_BREAK +case 60: +YY_RULE_SETUP +#line 305 "scan-gram.l" +{ + scanner_cursor.column -= mbsnwidth (yytext, yyleng, 0); + yyless (0); + *loc = id_loc; + BEGIN INITIAL; + return ID; + } + YY_BREAK +case YY_STATE_EOF(SC_AFTER_IDENTIFIER): +#line 312 "scan-gram.l" +{ + *loc = id_loc; + BEGIN INITIAL; + return ID; + } + YY_BREAK + +/*---------------------------------------------------------------. + | Scanning a Yacc comment. The initial `/ *' is already eaten. | + `---------------------------------------------------------------*/ + + +case 61: +YY_RULE_SETUP +#line 326 "scan-gram.l" +BEGIN context_state; + YY_BREAK +case 62: +YY_RULE_SETUP +#line 327 "scan-gram.l" +; + YY_BREAK +case YY_STATE_EOF(SC_YACC_COMMENT): +#line 328 "scan-gram.l" +unexpected_eof (token_start, "*/"); BEGIN context_state; + YY_BREAK + +/*------------------------------------------------------------. + | Scanning a C comment. The initial `/ *' is already eaten. | + `------------------------------------------------------------*/ + + +case 63: +YY_RULE_SETUP +#line 338 "scan-gram.l" +STRING_GROW; BEGIN context_state; + YY_BREAK +case YY_STATE_EOF(SC_COMMENT): +#line 339 "scan-gram.l" +unexpected_eof (token_start, "*/"); BEGIN context_state; + YY_BREAK + +/*--------------------------------------------------------------. + | Scanning a line comment. The initial `//' is already eaten. | + `--------------------------------------------------------------*/ + + +case 64: +YY_RULE_SETUP +#line 349 "scan-gram.l" +STRING_GROW; BEGIN context_state; + YY_BREAK +case 65: +YY_RULE_SETUP +#line 350 "scan-gram.l" +STRING_GROW; + YY_BREAK +case YY_STATE_EOF(SC_LINE_COMMENT): +#line 351 "scan-gram.l" +BEGIN context_state; + YY_BREAK + +/*------------------------------------------------. + | Scanning a Bison string, including its escapes. | + | The initial quote is already eaten. | + `------------------------------------------------*/ + + +case 66: +YY_RULE_SETUP +#line 362 "scan-gram.l" +{ + STRING_GROW; + STRING_FINISH; + loc->start = token_start; + val->chars = last_string; + rule_length++; + BEGIN INITIAL; + return STRING; + } + YY_BREAK +case 67: +YY_RULE_SETUP +#line 371 "scan-gram.l" +unexpected_newline (token_start, "\""); BEGIN INITIAL; + YY_BREAK +case YY_STATE_EOF(SC_ESCAPED_STRING): +#line 372 "scan-gram.l" +unexpected_eof (token_start, "\""); BEGIN INITIAL; + YY_BREAK + +/*----------------------------------------------------------. + | Scanning a Bison character literal, decoding its escapes. | + | The initial quote is already eaten. | + `----------------------------------------------------------*/ + + +case 68: +YY_RULE_SETUP +#line 382 "scan-gram.l" +{ + unsigned char last_string_1; + STRING_GROW; + STRING_FINISH; + loc->start = token_start; + val->symbol = symbol_get (last_string, *loc); + symbol_class_set (val->symbol, token_sym, *loc); + last_string_1 = last_string[1]; + symbol_user_token_number_set (val->symbol, last_string_1, *loc); + STRING_FREE; + rule_length++; + BEGIN INITIAL; + return ID; + } + YY_BREAK +case 69: +YY_RULE_SETUP +#line 396 "scan-gram.l" +unexpected_newline (token_start, "'"); BEGIN INITIAL; + YY_BREAK +case YY_STATE_EOF(SC_ESCAPED_CHARACTER): +#line 397 "scan-gram.l" +unexpected_eof (token_start, "'"); BEGIN INITIAL; + YY_BREAK + + + +case 70: +YY_RULE_SETUP +#line 402 "scan-gram.l" +complain_at (*loc, _("invalid null character")); + YY_BREAK + +/*----------------------------. + | Decode escaped characters. | + `----------------------------*/ + + +case 71: +YY_RULE_SETUP +#line 412 "scan-gram.l" +{ + unsigned long int c = strtoul (yytext + 1, 0, 8); + if (UCHAR_MAX < c) + complain_at (*loc, _("invalid escape sequence: %s"), quote (yytext)); + else if (! c) + complain_at (*loc, _("invalid null character: %s"), quote (yytext)); + else + obstack_1grow (&obstack_for_string, c); + } + YY_BREAK +case 72: +YY_RULE_SETUP +#line 422 "scan-gram.l" +{ + unsigned long int c; + set_errno (0); + c = strtoul (yytext + 2, 0, 16); + if (UCHAR_MAX < c || get_errno ()) + complain_at (*loc, _("invalid escape sequence: %s"), quote (yytext)); + else if (! c) + complain_at (*loc, _("invalid null character: %s"), quote (yytext)); + else + obstack_1grow (&obstack_for_string, c); + } + YY_BREAK +case 73: +YY_RULE_SETUP +#line 434 "scan-gram.l" +obstack_1grow (&obstack_for_string, '\a'); + YY_BREAK +case 74: +YY_RULE_SETUP +#line 435 "scan-gram.l" +obstack_1grow (&obstack_for_string, '\b'); + YY_BREAK +case 75: +YY_RULE_SETUP +#line 436 "scan-gram.l" +obstack_1grow (&obstack_for_string, '\f'); + YY_BREAK +case 76: +YY_RULE_SETUP +#line 437 "scan-gram.l" +obstack_1grow (&obstack_for_string, '\n'); + YY_BREAK +case 77: +YY_RULE_SETUP +#line 438 "scan-gram.l" +obstack_1grow (&obstack_for_string, '\r'); + YY_BREAK +case 78: +YY_RULE_SETUP +#line 439 "scan-gram.l" +obstack_1grow (&obstack_for_string, '\t'); + YY_BREAK +case 79: +YY_RULE_SETUP +#line 440 "scan-gram.l" +obstack_1grow (&obstack_for_string, '\v'); + YY_BREAK +/* \\[\"\'?\\] would be shorter, but it confuses xgettext. */ +case 80: +YY_RULE_SETUP +#line 443 "scan-gram.l" +obstack_1grow (&obstack_for_string, yytext[1]); + YY_BREAK +case 81: +YY_RULE_SETUP +#line 445 "scan-gram.l" +{ + int c = convert_ucn_to_byte (yytext); + if (c < 0) + complain_at (*loc, _("invalid escape sequence: %s"), quote (yytext)); + else if (! c) + complain_at (*loc, _("invalid null character: %s"), quote (yytext)); + else + obstack_1grow (&obstack_for_string, c); + } + YY_BREAK +case 82: +YY_RULE_SETUP +#line 454 "scan-gram.l" +{ + complain_at (*loc, _("unrecognized escape sequence: %s"), quote (yytext)); + STRING_GROW; + } + YY_BREAK + +/*--------------------------------------------. + | Scanning user-code characters and strings. | + `--------------------------------------------*/ + + +case 83: +YY_RULE_SETUP +#line 466 "scan-gram.l" +STRING_GROW; + YY_BREAK + + + +case 84: +YY_RULE_SETUP +#line 471 "scan-gram.l" +STRING_GROW; BEGIN context_state; + YY_BREAK +case 85: +YY_RULE_SETUP +#line 472 "scan-gram.l" +unexpected_newline (token_start, "'"); BEGIN context_state; + YY_BREAK +case YY_STATE_EOF(SC_CHARACTER): +#line 473 "scan-gram.l" +unexpected_eof (token_start, "'"); BEGIN context_state; + YY_BREAK + + + +case 86: +YY_RULE_SETUP +#line 478 "scan-gram.l" +STRING_GROW; BEGIN context_state; + YY_BREAK +case 87: +YY_RULE_SETUP +#line 479 "scan-gram.l" +unexpected_newline (token_start, "\""); BEGIN context_state; + YY_BREAK +case YY_STATE_EOF(SC_STRING): +#line 480 "scan-gram.l" +unexpected_eof (token_start, "\""); BEGIN context_state; + YY_BREAK + +/*---------------------------------------------------. + | Strings, comments etc. can be found in user code. | + `---------------------------------------------------*/ + + +case 88: +YY_RULE_SETUP +#line 490 "scan-gram.l" +{ + STRING_GROW; + context_state = YY_START; + token_start = loc->start; + BEGIN SC_CHARACTER; + } + YY_BREAK +case 89: +YY_RULE_SETUP +#line 496 "scan-gram.l" +{ + STRING_GROW; + context_state = YY_START; + token_start = loc->start; + BEGIN SC_STRING; + } + YY_BREAK +case 90: +YY_RULE_SETUP +#line 502 "scan-gram.l" +{ + STRING_GROW; + context_state = YY_START; + token_start = loc->start; + BEGIN SC_COMMENT; + } + YY_BREAK +case 91: +YY_RULE_SETUP +#line 508 "scan-gram.l" +{ + STRING_GROW; + context_state = YY_START; + BEGIN SC_LINE_COMMENT; + } + YY_BREAK + +/*---------------------------------------------------------------. + | Scanning after %union etc., possibly followed by white space. | + | For %union only, allow arbitrary C code to appear before the | + | following brace, as an extension to POSIX. | + `---------------------------------------------------------------*/ + + +case 92: +YY_RULE_SETUP +#line 524 "scan-gram.l" +{ + bool valid = yytext[0] == '{' || token_type == PERCENT_UNION; + scanner_cursor.column -= mbsnwidth (yytext, yyleng, 0); + yyless (0); + + if (valid) + { + braces_level = -1; + code_start = loc->start; + BEGIN SC_BRACED_CODE; + } + else + { + complain_at (*loc, _("missing `{' in `%s'"), + token_name (token_type)); + obstack_sgrow (&obstack_for_string, "{}"); + STRING_FINISH; + val->chars = last_string; + BEGIN INITIAL; + return token_type; + } + } + YY_BREAK +case YY_STATE_EOF(SC_PRE_CODE): +#line 547 "scan-gram.l" +unexpected_eof (scanner_cursor, "{}"); BEGIN INITIAL; + YY_BREAK + +/*---------------------------------------------------------------. + | Scanning some code in braces (%union and actions). The initial | + | "{" is already eaten. | + `---------------------------------------------------------------*/ + + +case 93: +YY_RULE_SETUP +#line 558 "scan-gram.l" +STRING_GROW; braces_level++; + YY_BREAK +case 94: +YY_RULE_SETUP +#line 559 "scan-gram.l" +STRING_GROW; braces_level--; + YY_BREAK +case 95: +YY_RULE_SETUP +#line 560 "scan-gram.l" +{ + bool outer_brace = --braces_level < 0; + + /* As an undocumented Bison extension, append `;' before the last + brace in braced code, so that the user code can omit trailing + `;'. But do not append `;' if emulating Yacc, since Yacc does + not append one. + + FIXME: Bison should warn if a semicolon seems to be necessary + here, and should omit the semicolon if it seems unnecessary + (e.g., after ';', '{', or '}', each followed by comments or + white space). Such a warning shouldn't depend on --yacc; it + should depend on a new --pedantic option, which would cause + Bison to warn if it detects an extension to POSIX. --pedantic + should also diagnose other Bison extensions like %yacc. + Perhaps there should also be a GCC-style --pedantic-errors + option, so that such warnings are diagnosed as errors. */ + if (outer_brace && token_type == BRACED_CODE && ! yacc_flag) + obstack_1grow (&obstack_for_string, ';'); + + obstack_1grow (&obstack_for_string, '}'); + + if (outer_brace) + { + STRING_FINISH; + rule_length++; + loc->start = code_start; + val->chars = last_string; + BEGIN INITIAL; + return token_type; + } + } + YY_BREAK +/* Tokenize `<<%' correctly (as `<<' `%') rather than incorrrectly + (as `<' `<%'). */ +case 96: +YY_RULE_SETUP +#line 595 "scan-gram.l" +STRING_GROW; + YY_BREAK +case 97: +YY_RULE_SETUP +#line 597 "scan-gram.l" +handle_dollar (token_type, yytext, *loc); + YY_BREAK +case 98: +YY_RULE_SETUP +#line 598 "scan-gram.l" +handle_at (token_type, yytext, *loc); + YY_BREAK +case YY_STATE_EOF(SC_BRACED_CODE): +#line 600 "scan-gram.l" +unexpected_eof (code_start, "}"); BEGIN INITIAL; + YY_BREAK + +/*--------------------------------------------------------------. + | Scanning some prologue: from "%{" (already scanned) to "%}". | + `--------------------------------------------------------------*/ + + +case 99: +YY_RULE_SETUP +#line 610 "scan-gram.l" +{ + STRING_FINISH; + loc->start = code_start; + val->chars = last_string; + BEGIN INITIAL; + return PROLOGUE; + } + YY_BREAK +case YY_STATE_EOF(SC_PROLOGUE): +#line 618 "scan-gram.l" +unexpected_eof (code_start, "%}"); BEGIN INITIAL; + YY_BREAK + +/*---------------------------------------------------------------. + | Scanning the epilogue (everything after the second "%%", which | + | has already been eaten). | + `---------------------------------------------------------------*/ + + +case YY_STATE_EOF(SC_EPILOGUE): +#line 629 "scan-gram.l" +{ + STRING_FINISH; + loc->start = code_start; + val->chars = last_string; + BEGIN INITIAL; + return EPILOGUE; + } + YY_BREAK + +/*-----------------------------------------. + | Escape M4 quoting characters in C code. | + `-----------------------------------------*/ + + +case 100: +YY_RULE_SETUP +#line 645 "scan-gram.l" +obstack_sgrow (&obstack_for_string, "$]["); + YY_BREAK +case 101: +YY_RULE_SETUP +#line 646 "scan-gram.l" +obstack_sgrow (&obstack_for_string, "@@"); + YY_BREAK +case 102: +YY_RULE_SETUP +#line 647 "scan-gram.l" +obstack_sgrow (&obstack_for_string, "@{"); + YY_BREAK +case 103: +YY_RULE_SETUP +#line 648 "scan-gram.l" +obstack_sgrow (&obstack_for_string, "@}"); + YY_BREAK + +/*-----------------------------------------------------. + | By default, grow the string obstack with the input. | + `-----------------------------------------------------*/ +case 104: +#line 657 "scan-gram.l" +case 105: +YY_RULE_SETUP +#line 657 "scan-gram.l" +STRING_GROW; + YY_BREAK +case 106: +YY_RULE_SETUP +#line 659 "scan-gram.l" +YY_FATAL_ERROR( "flex scanner jammed" ); + YY_BREAK +#line 2050 "scan-gram.c" + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yy_n_chars = yy_current_buffer->yy_n_chars; + yy_current_buffer->yy_input_file = yyin; + yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yy_c_buf_p; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer() ) + { + case EOB_ACT_END_OF_FILE: + { + yy_did_buffer_switch_on_eof = 0; + + if ( yywrap() ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = + yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yy_c_buf_p = + &yy_current_buffer->yy_ch_buf[yy_n_chars]; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of yylex */ + + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + +static int yy_get_next_buffer() + { + register char *dest = yy_current_buffer->yy_ch_buf; + register char *source = yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( yy_current_buffer->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + yy_current_buffer->yy_n_chars = yy_n_chars = 0; + + else + { + int num_to_read = + yy_current_buffer->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ +#ifdef YY_USES_REJECT + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +#else + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = yy_current_buffer; + + int yy_c_buf_p_offset = + (int) (yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yy_flex_realloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = yy_current_buffer->yy_buf_size - + number_to_move - 1; +#endif + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), + yy_n_chars, num_to_read ); + + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + if ( yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + yy_current_buffer->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + yy_n_chars += number_to_move; + yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; + yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; + + return ret_val; + } + + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +static yy_state_type yy_get_previous_state() + { + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = yy_start; + yy_current_state += YY_AT_BOL(); + + for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 57); + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + 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 >= 455 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + } + + return yy_current_state; + } + + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + +#ifdef YY_USE_PROTOS +static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) +#else +static yy_state_type yy_try_NUL_trans( yy_current_state ) +yy_state_type yy_current_state; +#endif + { + register int yy_is_jam; + register char *yy_cp = yy_c_buf_p; + + register YY_CHAR yy_c = 57; + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + 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 >= 455 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 454); + + return yy_is_jam ? 0 : yy_current_state; + } + + +#ifndef YY_NO_UNPUT +#ifdef YY_USE_PROTOS +static void yyunput( int c, register char *yy_bp ) +#else +static void yyunput( c, yy_bp ) +int c; +register char *yy_bp; +#endif + { + register char *yy_cp = yy_c_buf_p; + + /* undo effects of setting up yytext */ + *yy_cp = yy_hold_char; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yy_n_chars + 2; + register char *dest = &yy_current_buffer->yy_ch_buf[ + yy_current_buffer->yy_buf_size + 2]; + register char *source = + &yy_current_buffer->yy_ch_buf[number_to_move]; + + while ( source > yy_current_buffer->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + yy_current_buffer->yy_n_chars = + yy_n_chars = yy_current_buffer->yy_buf_size; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + + yytext_ptr = yy_bp; + yy_hold_char = *yy_cp; + yy_c_buf_p = yy_cp; + } +#endif /* ifndef YY_NO_UNPUT */ + + +#ifdef __cplusplus +static int yyinput() +#else +static int input() +#endif + { + int c; + + *yy_c_buf_p = yy_hold_char; + + if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + /* This was really a NUL. */ + *yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yy_c_buf_p - yytext_ptr; + ++yy_c_buf_p; + + switch ( yy_get_next_buffer() ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /* fall through */ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap() ) + return EOF; + + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ + *yy_c_buf_p = '\0'; /* preserve yytext */ + yy_hold_char = *++yy_c_buf_p; + + yy_current_buffer->yy_at_bol = (c == '\n'); + + return c; + } + + +#ifdef YY_USE_PROTOS +void yyrestart( FILE *input_file ) +#else +void yyrestart( input_file ) +FILE *input_file; +#endif + { + if ( ! yy_current_buffer ) + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_init_buffer( yy_current_buffer, input_file ); + yy_load_buffer_state(); + } + + +#ifdef YY_USE_PROTOS +void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) +#else +void yy_switch_to_buffer( new_buffer ) +YY_BUFFER_STATE new_buffer; +#endif + { + if ( yy_current_buffer == new_buffer ) + return; + + if ( yy_current_buffer ) + { + /* Flush out information for old buffer. */ + *yy_c_buf_p = yy_hold_char; + yy_current_buffer->yy_buf_pos = yy_c_buf_p; + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + yy_current_buffer = new_buffer; + yy_load_buffer_state(); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yy_did_buffer_switch_on_eof = 1; + } + + +#ifdef YY_USE_PROTOS +void yy_load_buffer_state( void ) +#else +void yy_load_buffer_state() +#endif + { + yy_n_chars = yy_current_buffer->yy_n_chars; + yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; + yyin = yy_current_buffer->yy_input_file; + yy_hold_char = *yy_c_buf_p; + } + + +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) +#else +YY_BUFFER_STATE yy_create_buffer( file, size ) +FILE *file; +int size; +#endif + { + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; + } + + +#ifdef YY_USE_PROTOS +void yy_delete_buffer( YY_BUFFER_STATE b ) +#else +void yy_delete_buffer( b ) +YY_BUFFER_STATE b; +#endif + { + if ( ! b ) + return; + + if ( b == yy_current_buffer ) + yy_current_buffer = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yy_flex_free( (void *) b->yy_ch_buf ); + + yy_flex_free( (void *) b ); + } + + +#ifndef _WIN32 +#include +#else +#ifndef YY_ALWAYS_INTERACTIVE +#ifndef YY_NEVER_INTERACTIVE +extern int isatty YY_PROTO(( int )); +#endif +#endif +#endif + +#ifdef YY_USE_PROTOS +void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) +#else +void yy_init_buffer( b, file ) +YY_BUFFER_STATE b; +FILE *file; +#endif + + + { + yy_flush_buffer( b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + +#if YY_ALWAYS_INTERACTIVE + b->yy_is_interactive = 1; +#else +#if YY_NEVER_INTERACTIVE + b->yy_is_interactive = 0; +#else + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +#endif +#endif + } + + +#ifdef YY_USE_PROTOS +void yy_flush_buffer( YY_BUFFER_STATE b ) +#else +void yy_flush_buffer( b ) +YY_BUFFER_STATE b; +#endif + + { + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer ) + yy_load_buffer_state(); + } + + +#ifndef YY_NO_SCAN_BUFFER +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) +#else +YY_BUFFER_STATE yy_scan_buffer( base, size ) +char *base; +yy_size_t size; +#endif + { + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; + } +#endif + + +#ifndef YY_NO_SCAN_STRING +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) +#else +YY_BUFFER_STATE yy_scan_string( yy_str ) +yyconst char *yy_str; +#endif + { + int len; + for ( len = 0; yy_str[len]; ++len ) + ; + + return yy_scan_bytes( yy_str, len ); + } +#endif + + +#ifndef YY_NO_SCAN_BYTES +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) +#else +YY_BUFFER_STATE yy_scan_bytes( bytes, len ) +yyconst char *bytes; +int len; +#endif + { + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yy_flex_alloc( n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; + } +#endif + + +#ifndef YY_NO_PUSH_STATE +#ifdef YY_USE_PROTOS +static void yy_push_state( int new_state ) +#else +static void yy_push_state( new_state ) +int new_state; +#endif + { + if ( yy_start_stack_ptr >= yy_start_stack_depth ) + { + yy_size_t new_size; + + yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yy_start_stack_depth * sizeof( int ); + + if ( ! yy_start_stack ) + yy_start_stack = (int *) yy_flex_alloc( new_size ); + + else + yy_start_stack = (int *) yy_flex_realloc( + (void *) yy_start_stack, new_size ); + + if ( ! yy_start_stack ) + YY_FATAL_ERROR( + "out of memory expanding start-condition stack" ); + } + + yy_start_stack[yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); + } +#endif + + +#ifndef YY_NO_POP_STATE +static void yy_pop_state() + { + if ( --yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yy_start_stack[yy_start_stack_ptr]); + } +#endif + + +#ifndef YY_NO_TOP_STATE +static int yy_top_state() + { + return yy_start_stack[yy_start_stack_ptr - 1]; + } +#endif + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +#ifdef YY_USE_PROTOS +static void yy_fatal_error( yyconst char msg[] ) +#else +static void yy_fatal_error( msg ) +char msg[]; +#endif + { + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); + } + + + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + yytext[yyleng] = yy_hold_char; \ + yy_c_buf_p = yytext + n; \ + yy_hold_char = *yy_c_buf_p; \ + *yy_c_buf_p = '\0'; \ + yyleng = n; \ + } \ + while ( 0 ) + + +/* Internal utility routines. */ + +#ifndef yytext_ptr +#ifdef YY_USE_PROTOS +static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) +#else +static void yy_flex_strncpy( s1, s2, n ) +char *s1; +yyconst char *s2; +int n; +#endif + { + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; + } +#endif + +#ifdef YY_NEED_STRLEN +#ifdef YY_USE_PROTOS +static int yy_flex_strlen( yyconst char *s ) +#else +static int yy_flex_strlen( s ) +yyconst char *s; +#endif + { + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; + } +#endif + + +#ifdef YY_USE_PROTOS +static void *yy_flex_alloc( yy_size_t size ) +#else +static void *yy_flex_alloc( size ) +yy_size_t size; +#endif + { + return (void *) malloc( size ); + } + +#ifdef YY_USE_PROTOS +static void *yy_flex_realloc( void *ptr, yy_size_t size ) +#else +static void *yy_flex_realloc( ptr, size ) +void *ptr; +yy_size_t size; +#endif + { + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); + } + +#ifdef YY_USE_PROTOS +static void yy_flex_free( void *ptr ) +#else +static void yy_flex_free( ptr ) +void *ptr; +#endif + { + free( ptr ); + } + +#if YY_MAIN +int main() + { + yylex(); + return 0; + } +#endif +#line 659 "scan-gram.l" + + +/* Keeps track of the maximum number of semantic values to the left of + a handle (those referenced by $0, $-1, etc.) are required by the + semantic actions of this grammar. */ +int max_left_semantic_context = 0; + +/* Set *LOC and adjust scanner cursor to account for token TOKEN of + size SIZE. */ + +static void +adjust_location (location *loc, char const *token, size_t size) +{ + int line = scanner_cursor.line; + int column = scanner_cursor.column; + char const *p0 = token; + char const *p = token; + char const *lim = token + size; + + loc->start = scanner_cursor; + + for (p = token; p < lim; p++) + switch (*p) + { + case '\n': + line++; + column = 1; + p0 = p + 1; + break; + + case '\t': + column += mbsnwidth (p0, p - p0, 0); + column += 8 - ((column - 1) & 7); + p0 = p + 1; + break; + } + + scanner_cursor.line = line; + scanner_cursor.column = column + mbsnwidth (p0, p - p0, 0); + + loc->end = scanner_cursor; +} + + +/* Read bytes from FP into buffer BUF of size SIZE. Return the + number of bytes read. Remove '\r' from input, treating \r\n + and isolated \r as \n. */ + +static size_t +no_cr_read (FILE *fp, char *buf, size_t size) +{ + size_t bytes_read = fread (buf, 1, size, fp); + if (bytes_read) + { + char *w = memchr (buf, '\r', bytes_read); + if (w) + { + char const *r = ++w; + char const *lim = buf + bytes_read; + + for (;;) + { + /* Found an '\r'. Treat it like '\n', but ignore any + '\n' that immediately follows. */ + w[-1] = '\n'; + if (r == lim) + { + int ch = getc (fp); + if (ch != '\n' && ungetc (ch, fp) != ch) + break; + } + else if (*r == '\n') + r++; + + /* Copy until the next '\r'. */ + do + { + if (r == lim) + return w - buf; + } + while ((*w++ = *r++) != '\r'); + } + + return w - buf; + } + } + + return bytes_read; +} + + +/*------------------------------------------------------------------. +| TEXT is pointing to a wannabee semantic value (i.e., a `$'). | +| | +| Possible inputs: $[]($|integer) | +| | +| Output to OBSTACK_FOR_STRING a reference to this semantic value. | +`------------------------------------------------------------------*/ + +static inline bool +handle_action_dollar (char *text, location loc) +{ + const char *type_name = NULL; + char *cp = text + 1; + + if (! current_rule) + return false; + + /* Get the type name if explicit. */ + if (*cp == '<') + { + type_name = ++cp; + while (*cp != '>') + ++cp; + *cp = '\0'; + ++cp; + } + + if (*cp == '$') + { + if (!type_name) + type_name = symbol_list_n_type_name_get (current_rule, loc, 0); + if (!type_name && typed) + complain_at (loc, _("$$ of `%s' has no declared type"), + current_rule->sym->tag); + if (!type_name) + type_name = ""; + obstack_fgrow1 (&obstack_for_string, + "]b4_lhs_value([%s])[", type_name); + } + else + { + long int num; + set_errno (0); + num = strtol (cp, 0, 10); + + if (INT_MIN <= num && num <= rule_length && ! get_errno ()) + { + int n = num; + if (1-n > max_left_semantic_context) + max_left_semantic_context = 1-n; + if (!type_name && n > 0) + type_name = symbol_list_n_type_name_get (current_rule, loc, n); + if (!type_name && typed) + complain_at (loc, _("$%d of `%s' has no declared type"), + n, current_rule->sym->tag); + if (!type_name) + type_name = ""; + obstack_fgrow3 (&obstack_for_string, + "]b4_rhs_value([%d], [%d], [%s])[", + rule_length, n, type_name); + } + else + complain_at (loc, _("integer out of range: %s"), quote (text)); + } + + return true; +} + + +/*----------------------------------------------------------------. +| Map `$?' onto the proper M4 symbol, depending on its TOKEN_TYPE | +| (are we in an action?). | +`----------------------------------------------------------------*/ + +static void +handle_dollar (int token_type, char *text, location loc) +{ + switch (token_type) + { + case BRACED_CODE: + if (handle_action_dollar (text, loc)) + return; + break; + + case PERCENT_DESTRUCTOR: + case PERCENT_INITIAL_ACTION: + case PERCENT_PRINTER: + if (text[1] == '$') + { + obstack_sgrow (&obstack_for_string, "]b4_dollar_dollar["); + return; + } + break; + + default: + break; + } + + complain_at (loc, _("invalid value: %s"), quote (text)); +} + + +/*------------------------------------------------------. +| TEXT is a location token (i.e., a `@...'). Output to | +| OBSTACK_FOR_STRING a reference to this location. | +`------------------------------------------------------*/ + +static inline bool +handle_action_at (char *text, location loc) +{ + char *cp = text + 1; + locations_flag = true; + + if (! current_rule) + return false; + + if (*cp == '$') + obstack_sgrow (&obstack_for_string, "]b4_lhs_location["); + else + { + long int num; + set_errno (0); + num = strtol (cp, 0, 10); + + if (INT_MIN <= num && num <= rule_length && ! get_errno ()) + { + int n = num; + obstack_fgrow2 (&obstack_for_string, "]b4_rhs_location([%d], [%d])[", + rule_length, n); + } + else + complain_at (loc, _("integer out of range: %s"), quote (text)); + } + + return true; +} + + +/*----------------------------------------------------------------. +| Map `@?' onto the proper M4 symbol, depending on its TOKEN_TYPE | +| (are we in an action?). | +`----------------------------------------------------------------*/ + +static void +handle_at (int token_type, char *text, location loc) +{ + switch (token_type) + { + case BRACED_CODE: + handle_action_at (text, loc); + return; + + case PERCENT_INITIAL_ACTION: + case PERCENT_DESTRUCTOR: + case PERCENT_PRINTER: + if (text[1] == '$') + { + obstack_sgrow (&obstack_for_string, "]b4_at_dollar["); + return; + } + break; + + default: + break; + } + + complain_at (loc, _("invalid value: %s"), quote (text)); +} + + +/*------------------------------------------------------. +| Scan NUMBER for a base-BASE integer at location LOC. | +`------------------------------------------------------*/ + +static unsigned long int +scan_integer (char const *number, int base, location loc) +{ + unsigned long int num; + set_errno (0); + num = strtoul (number, 0, base); + if (INT_MAX < num || get_errno ()) + { + complain_at (loc, _("integer out of range: %s"), quote (number)); + num = INT_MAX; + } + return num; +} + + +/*------------------------------------------------------------------. +| Convert universal character name UCN to a single-byte character, | +| and return that character. Return -1 if UCN does not correspond | +| to a single-byte character. | +`------------------------------------------------------------------*/ + +static int +convert_ucn_to_byte (char const *ucn) +{ + unsigned long int code = strtoul (ucn + 2, 0, 16); + + /* FIXME: Currently we assume Unicode-compatible unibyte characters + on ASCII hosts (i.e., Latin-1 on hosts with 8-bit bytes). On + non-ASCII hosts we support only the portable C character set. + These limitations should be removed once we add support for + multibyte characters. */ + + if (UCHAR_MAX < code) + return -1; + +#if ! ('$' == 0x24 && '@' == 0x40 && '`' == 0x60 && '~' == 0x7e) + { + /* A non-ASCII host. Use CODE to index into a table of the C + basic execution character set, which is guaranteed to exist on + all Standard C platforms. This table also includes '$', '@', + and '`', which are not in the basic execution character set but + which are unibyte characters on all the platforms that we know + about. */ + static signed char const table[] = + { + '\0', -1, -1, -1, -1, -1, -1, '\a', + '\b', '\t', '\n', '\v', '\f', '\r', -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '{', '|', '}', '~' + }; + + code = code < sizeof table ? table[code] : -1; + } +#endif + + return code; +} + + +/*----------------------------------------------------------------. +| Handle `#line INT "FILE"'. ARGS has already skipped `#line '. | +`----------------------------------------------------------------*/ + +static void +handle_syncline (char *args) +{ + int lineno = strtol (args, &args, 10); + const char *file = NULL; + file = strchr (args, '"') + 1; + *strchr (file, '"') = 0; + scanner_cursor.file = current_file = xstrdup (file); + scanner_cursor.line = lineno; + scanner_cursor.column = 1; +} + + +/*----------------------------------------------------------------. +| For a token or comment starting at START, report message MSGID, | +| which should say that an end marker was found before | +| the expected TOKEN_END. | +`----------------------------------------------------------------*/ + +static void +unexpected_end (boundary start, char const *msgid, char const *token_end) +{ + location loc; + loc.start = start; + loc.end = scanner_cursor; + complain_at (loc, _(msgid), token_end); +} + + +/*------------------------------------------------------------------------. +| Report an unexpected EOF in a token or comment starting at START. | +| An end of file was encountered and the expected TOKEN_END was missing. | +`------------------------------------------------------------------------*/ + +static void +unexpected_eof (boundary start, char const *token_end) +{ + unexpected_end (start, N_("missing `%s' at end of file"), token_end); +} + + +/*----------------------------------------. +| Likewise, but for unexpected newlines. | +`----------------------------------------*/ + +static void +unexpected_newline (boundary start, char const *token_end) +{ + unexpected_end (start, N_("missing `%s' at end of line"), token_end); +} + + +/*-------------------------. +| Initialize the scanner. | +`-------------------------*/ + +void +scanner_initialize (void) +{ + obstack_init (&obstack_for_string); +} + + +/*-----------------------------------------------. +| Free all the memory allocated to the scanner. | +`-----------------------------------------------*/ + +void +scanner_free (void) +{ + obstack_free (&obstack_for_string, 0); + /* Reclaim Flex's buffers. */ + yy_delete_buffer (YY_CURRENT_BUFFER); +} diff --git a/src/apps/bin/bison/src/scan-gram.l b/src/apps/bin/bison/src/scan-gram.l new file mode 100644 index 0000000000..77c304f2be --- /dev/null +++ b/src/apps/bin/bison/src/scan-gram.l @@ -0,0 +1,1072 @@ +/* Bison Grammar Scanner -*- C -*- + + Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software + Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA + 02111-1307 USA +*/ + +%option debug nodefault nounput noyywrap never-interactive +%option prefix="gram_" outfile="lex.yy.c" + +%{ +#include "system.h" + +#include +#include +#include + +#include "complain.h" +#include "files.h" +#include "getargs.h" +#include "gram.h" +#include "reader.h" +#include "uniqstr.h" + +#define YY_USER_INIT \ + do \ + { \ + scanner_cursor.file = current_file; \ + scanner_cursor.line = 1; \ + scanner_cursor.column = 1; \ + code_start = scanner_cursor; \ + } \ + while (0) + +/* Location of scanner cursor. */ +boundary scanner_cursor; + +static void adjust_location (location *, char const *, size_t); +#define YY_USER_ACTION adjust_location (loc, yytext, yyleng); + +static size_t no_cr_read (FILE *, char *, size_t); +#define YY_INPUT(buf, result, size) ((result) = no_cr_read (yyin, buf, size)) + + +/* OBSTACK_FOR_STRING -- Used to store all the characters that we need to + keep (to construct ID, STRINGS etc.). Use the following macros to + use it. + + Use STRING_GROW to append what has just been matched, and + STRING_FINISH to end the string (it puts the ending 0). + STRING_FINISH also stores this string in LAST_STRING, which can be + used, and which is used by STRING_FREE to free the last string. */ + +static struct obstack obstack_for_string; + +/* A string representing the most recently saved token. */ +static char *last_string; + + +#define STRING_GROW \ + obstack_grow (&obstack_for_string, yytext, yyleng) + +#define STRING_FINISH \ + do { \ + obstack_1grow (&obstack_for_string, '\0'); \ + last_string = obstack_finish (&obstack_for_string); \ + } while (0) + +#define STRING_FREE \ + obstack_free (&obstack_for_string, last_string) + +void +scanner_last_string_free (void) +{ + STRING_FREE; +} + +/* Within well-formed rules, RULE_LENGTH is the number of values in + the current rule so far, which says where to find `$0' with respect + to the top of the stack. It is not the same as the rule->length in + the case of mid rule actions. + + Outside of well-formed rules, RULE_LENGTH has an undefined value. */ +static int rule_length; + +static void handle_dollar (int token_type, char *cp, location loc); +static void handle_at (int token_type, char *cp, location loc); +static void handle_syncline (char *args); +static unsigned long int scan_integer (char const *p, int base, location loc); +static int convert_ucn_to_byte (char const *hex_text); +static void unexpected_eof (boundary, char const *); +static void unexpected_newline (boundary, char const *); + +%} +%x SC_COMMENT SC_LINE_COMMENT SC_YACC_COMMENT +%x SC_STRING SC_CHARACTER +%x SC_AFTER_IDENTIFIER +%x SC_ESCAPED_STRING SC_ESCAPED_CHARACTER +%x SC_PRE_CODE SC_BRACED_CODE SC_PROLOGUE SC_EPILOGUE + +letter [.abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ_] +id {letter}({letter}|[0-9])* +directive %{letter}({letter}|[0-9]|-)* +int [0-9]+ + +/* POSIX says that a tag must be both an id and a C union member, but + historically almost any character is allowed in a tag. We disallow + NUL and newline, as this simplifies our implementation. */ +tag [^\0\n>]+ + +/* Zero or more instances of backslash-newline. Following GCC, allow + white space between the backslash and the newline. */ +splice (\\[ \f\t\v]*\n)* + +%% +%{ + /* Nesting level of the current code in braces. */ + int braces_level IF_LINT (= 0); + + /* Parent context state, when applicable. */ + int context_state IF_LINT (= 0); + + /* Token type to return, when applicable. */ + int token_type IF_LINT (= 0); + + /* Location of most recent identifier, when applicable. */ + location id_loc IF_LINT (= empty_location); + + /* Where containing code started, when applicable. Its initial + value is relevant only when yylex is invoked in the SC_EPILOGUE + start condition. */ + boundary code_start = scanner_cursor; + + /* Where containing comment or string or character literal started, + when applicable. */ + boundary token_start IF_LINT (= scanner_cursor); +%} + + + /*-----------------------. + | Scanning white space. | + `-----------------------*/ + + +{ + /* Comments and white space. */ + "," warn_at (*loc, _("stray `,' treated as white space")); + [ \f\n\t\v] | + "//".* ; + "/*" { + token_start = loc->start; + context_state = YY_START; + BEGIN SC_YACC_COMMENT; + } + + /* #line directives are not documented, and may be withdrawn or + modified in future versions of Bison. */ + ^"#line "{int}" \"".*"\"\n" { + handle_syncline (yytext + sizeof "#line " - 1); + } +} + + + /*----------------------------. + | Scanning Bison directives. | + `----------------------------*/ + +{ + "%binary" return PERCENT_NONASSOC; + "%debug" return PERCENT_DEBUG; + "%default"[-_]"prec" return PERCENT_DEFAULT_PREC; + "%define" return PERCENT_DEFINE; + "%defines" return PERCENT_DEFINES; + "%destructor" token_type = PERCENT_DESTRUCTOR; BEGIN SC_PRE_CODE; + "%dprec" return PERCENT_DPREC; + "%error"[-_]"verbose" return PERCENT_ERROR_VERBOSE; + "%expect" return PERCENT_EXPECT; + "%expect"[-_]"rr" return PERCENT_EXPECT_RR; + "%file-prefix" return PERCENT_FILE_PREFIX; + "%fixed"[-_]"output"[-_]"files" return PERCENT_YACC; + "%initial-action" token_type = PERCENT_INITIAL_ACTION; BEGIN SC_PRE_CODE; + "%glr-parser" return PERCENT_GLR_PARSER; + "%left" return PERCENT_LEFT; + "%lex-param" token_type = PERCENT_LEX_PARAM; BEGIN SC_PRE_CODE; + "%locations" return PERCENT_LOCATIONS; + "%merge" return PERCENT_MERGE; + "%name"[-_]"prefix" return PERCENT_NAME_PREFIX; + "%no"[-_]"default"[-_]"prec" return PERCENT_NO_DEFAULT_PREC; + "%no"[-_]"lines" return PERCENT_NO_LINES; + "%nonassoc" return PERCENT_NONASSOC; + "%nondeterministic-parser" return PERCENT_NONDETERMINISTIC_PARSER; + "%nterm" return PERCENT_NTERM; + "%output" return PERCENT_OUTPUT; + "%parse-param" token_type = PERCENT_PARSE_PARAM; BEGIN SC_PRE_CODE; + "%prec" rule_length--; return PERCENT_PREC; + "%printer" token_type = PERCENT_PRINTER; BEGIN SC_PRE_CODE; + "%pure"[-_]"parser" return PERCENT_PURE_PARSER; + "%right" return PERCENT_RIGHT; + "%skeleton" return PERCENT_SKELETON; + "%start" return PERCENT_START; + "%term" return PERCENT_TOKEN; + "%token" return PERCENT_TOKEN; + "%token"[-_]"table" return PERCENT_TOKEN_TABLE; + "%type" return PERCENT_TYPE; + "%union" token_type = PERCENT_UNION; BEGIN SC_PRE_CODE; + "%verbose" return PERCENT_VERBOSE; + "%yacc" return PERCENT_YACC; + + {directive} { + complain_at (*loc, _("invalid directive: %s"), quote (yytext)); + } + + "=" return EQUAL; + "|" rule_length = 0; return PIPE; + ";" return SEMICOLON; + + {id} { + val->symbol = symbol_get (yytext, *loc); + id_loc = *loc; + rule_length++; + BEGIN SC_AFTER_IDENTIFIER; + } + + {int} { + val->integer = scan_integer (yytext, 10, *loc); + return INT; + } + 0[xX][0-9abcdefABCDEF]+ { + val->integer = scan_integer (yytext, 16, *loc); + return INT; + } + + /* Characters. We don't check there is only one. */ + "'" STRING_GROW; token_start = loc->start; BEGIN SC_ESCAPED_CHARACTER; + + /* Strings. */ + "\"" STRING_GROW; token_start = loc->start; BEGIN SC_ESCAPED_STRING; + + /* Prologue. */ + "%{" code_start = loc->start; BEGIN SC_PROLOGUE; + + /* Code in between braces. */ + "{" { + STRING_GROW; + token_type = BRACED_CODE; + braces_level = 0; + code_start = loc->start; + BEGIN SC_BRACED_CODE; + } + + /* A type. */ + "<"{tag}">" { + obstack_grow (&obstack_for_string, yytext + 1, yyleng - 2); + STRING_FINISH; + val->uniqstr = uniqstr_new (last_string); + STRING_FREE; + return TYPE; + } + + "%%" { + static int percent_percent_count; + if (++percent_percent_count == 2) + BEGIN SC_EPILOGUE; + return PERCENT_PERCENT; + } + + . { + complain_at (*loc, _("invalid character: %s"), quote (yytext)); + } + + <> { + loc->start = loc->end = scanner_cursor; + yyterminate (); + } +} + + + /*-----------------------------------------------------------------. + | Scanning after an identifier, checking whether a colon is next. | + `-----------------------------------------------------------------*/ + + +{ + ":" { + rule_length = 0; + *loc = id_loc; + BEGIN INITIAL; + return ID_COLON; + } + . { + scanner_cursor.column -= mbsnwidth (yytext, yyleng, 0); + yyless (0); + *loc = id_loc; + BEGIN INITIAL; + return ID; + } + <> { + *loc = id_loc; + BEGIN INITIAL; + return ID; + } +} + + + /*---------------------------------------------------------------. + | Scanning a Yacc comment. The initial `/ *' is already eaten. | + `---------------------------------------------------------------*/ + + +{ + "*/" BEGIN context_state; + .|\n ; + <> unexpected_eof (token_start, "*/"); BEGIN context_state; +} + + + /*------------------------------------------------------------. + | Scanning a C comment. The initial `/ *' is already eaten. | + `------------------------------------------------------------*/ + + +{ + "*"{splice}"/" STRING_GROW; BEGIN context_state; + <> unexpected_eof (token_start, "*/"); BEGIN context_state; +} + + + /*--------------------------------------------------------------. + | Scanning a line comment. The initial `//' is already eaten. | + `--------------------------------------------------------------*/ + + +{ + "\n" STRING_GROW; BEGIN context_state; + {splice} STRING_GROW; + <> BEGIN context_state; +} + + + /*------------------------------------------------. + | Scanning a Bison string, including its escapes. | + | The initial quote is already eaten. | + `------------------------------------------------*/ + + +{ + "\"" { + STRING_GROW; + STRING_FINISH; + loc->start = token_start; + val->chars = last_string; + rule_length++; + BEGIN INITIAL; + return STRING; + } + \n unexpected_newline (token_start, "\""); BEGIN INITIAL; + <> unexpected_eof (token_start, "\""); BEGIN INITIAL; +} + + /*----------------------------------------------------------. + | Scanning a Bison character literal, decoding its escapes. | + | The initial quote is already eaten. | + `----------------------------------------------------------*/ + + +{ + "'" { + unsigned char last_string_1; + STRING_GROW; + STRING_FINISH; + loc->start = token_start; + val->symbol = symbol_get (last_string, *loc); + symbol_class_set (val->symbol, token_sym, *loc); + last_string_1 = last_string[1]; + symbol_user_token_number_set (val->symbol, last_string_1, *loc); + STRING_FREE; + rule_length++; + BEGIN INITIAL; + return ID; + } + \n unexpected_newline (token_start, "'"); BEGIN INITIAL; + <> unexpected_eof (token_start, "'"); BEGIN INITIAL; +} + + +{ + \0 complain_at (*loc, _("invalid null character")); +} + + + /*----------------------------. + | Decode escaped characters. | + `----------------------------*/ + + +{ + \\[0-7]{1,3} { + unsigned long int c = strtoul (yytext + 1, 0, 8); + if (UCHAR_MAX < c) + complain_at (*loc, _("invalid escape sequence: %s"), quote (yytext)); + else if (! c) + complain_at (*loc, _("invalid null character: %s"), quote (yytext)); + else + obstack_1grow (&obstack_for_string, c); + } + + \\x[0-9abcdefABCDEF]+ { + unsigned long int c; + set_errno (0); + c = strtoul (yytext + 2, 0, 16); + if (UCHAR_MAX < c || get_errno ()) + complain_at (*loc, _("invalid escape sequence: %s"), quote (yytext)); + else if (! c) + complain_at (*loc, _("invalid null character: %s"), quote (yytext)); + else + obstack_1grow (&obstack_for_string, c); + } + + \\a obstack_1grow (&obstack_for_string, '\a'); + \\b obstack_1grow (&obstack_for_string, '\b'); + \\f obstack_1grow (&obstack_for_string, '\f'); + \\n obstack_1grow (&obstack_for_string, '\n'); + \\r obstack_1grow (&obstack_for_string, '\r'); + \\t obstack_1grow (&obstack_for_string, '\t'); + \\v obstack_1grow (&obstack_for_string, '\v'); + + /* \\[\"\'?\\] would be shorter, but it confuses xgettext. */ + \\("\""|"'"|"?"|"\\") obstack_1grow (&obstack_for_string, yytext[1]); + + \\(u|U[0-9abcdefABCDEF]{4})[0-9abcdefABCDEF]{4} { + int c = convert_ucn_to_byte (yytext); + if (c < 0) + complain_at (*loc, _("invalid escape sequence: %s"), quote (yytext)); + else if (! c) + complain_at (*loc, _("invalid null character: %s"), quote (yytext)); + else + obstack_1grow (&obstack_for_string, c); + } + \\(.|\n) { + complain_at (*loc, _("unrecognized escape sequence: %s"), quote (yytext)); + STRING_GROW; + } +} + + /*--------------------------------------------. + | Scanning user-code characters and strings. | + `--------------------------------------------*/ + + +{ + {splice}|\\{splice}[^\n$@\[\]] STRING_GROW; +} + + +{ + "'" STRING_GROW; BEGIN context_state; + \n unexpected_newline (token_start, "'"); BEGIN context_state; + <> unexpected_eof (token_start, "'"); BEGIN context_state; +} + + +{ + "\"" STRING_GROW; BEGIN context_state; + \n unexpected_newline (token_start, "\""); BEGIN context_state; + <> unexpected_eof (token_start, "\""); BEGIN context_state; +} + + + /*---------------------------------------------------. + | Strings, comments etc. can be found in user code. | + `---------------------------------------------------*/ + + +{ + "'" { + STRING_GROW; + context_state = YY_START; + token_start = loc->start; + BEGIN SC_CHARACTER; + } + "\"" { + STRING_GROW; + context_state = YY_START; + token_start = loc->start; + BEGIN SC_STRING; + } + "/"{splice}"*" { + STRING_GROW; + context_state = YY_START; + token_start = loc->start; + BEGIN SC_COMMENT; + } + "/"{splice}"/" { + STRING_GROW; + context_state = YY_START; + BEGIN SC_LINE_COMMENT; + } +} + + + /*---------------------------------------------------------------. + | Scanning after %union etc., possibly followed by white space. | + | For %union only, allow arbitrary C code to appear before the | + | following brace, as an extension to POSIX. | + `---------------------------------------------------------------*/ + + +{ + . { + bool valid = yytext[0] == '{' || token_type == PERCENT_UNION; + scanner_cursor.column -= mbsnwidth (yytext, yyleng, 0); + yyless (0); + + if (valid) + { + braces_level = -1; + code_start = loc->start; + BEGIN SC_BRACED_CODE; + } + else + { + complain_at (*loc, _("missing `{' in `%s'"), + token_name (token_type)); + obstack_sgrow (&obstack_for_string, "{}"); + STRING_FINISH; + val->chars = last_string; + BEGIN INITIAL; + return token_type; + } + } + + <> unexpected_eof (scanner_cursor, "{}"); BEGIN INITIAL; +} + + + /*---------------------------------------------------------------. + | Scanning some code in braces (%union and actions). The initial | + | "{" is already eaten. | + `---------------------------------------------------------------*/ + + +{ + "{"|"<"{splice}"%" STRING_GROW; braces_level++; + "%"{splice}">" STRING_GROW; braces_level--; + "}" { + bool outer_brace = --braces_level < 0; + + /* As an undocumented Bison extension, append `;' before the last + brace in braced code, so that the user code can omit trailing + `;'. But do not append `;' if emulating Yacc, since Yacc does + not append one. + + FIXME: Bison should warn if a semicolon seems to be necessary + here, and should omit the semicolon if it seems unnecessary + (e.g., after ';', '{', or '}', each followed by comments or + white space). Such a warning shouldn't depend on --yacc; it + should depend on a new --pedantic option, which would cause + Bison to warn if it detects an extension to POSIX. --pedantic + should also diagnose other Bison extensions like %yacc. + Perhaps there should also be a GCC-style --pedantic-errors + option, so that such warnings are diagnosed as errors. */ + if (outer_brace && token_type == BRACED_CODE && ! yacc_flag) + obstack_1grow (&obstack_for_string, ';'); + + obstack_1grow (&obstack_for_string, '}'); + + if (outer_brace) + { + STRING_FINISH; + rule_length++; + loc->start = code_start; + val->chars = last_string; + BEGIN INITIAL; + return token_type; + } + } + + /* Tokenize `<<%' correctly (as `<<' `%') rather than incorrrectly + (as `<' `<%'). */ + "<"{splice}"<" STRING_GROW; + + "$"("<"{tag}">")?(-?[0-9]+|"$") handle_dollar (token_type, yytext, *loc); + "@"(-?[0-9]+|"$") handle_at (token_type, yytext, *loc); + + <> unexpected_eof (code_start, "}"); BEGIN INITIAL; +} + + + /*--------------------------------------------------------------. + | Scanning some prologue: from "%{" (already scanned) to "%}". | + `--------------------------------------------------------------*/ + + +{ + "%}" { + STRING_FINISH; + loc->start = code_start; + val->chars = last_string; + BEGIN INITIAL; + return PROLOGUE; + } + + <> unexpected_eof (code_start, "%}"); BEGIN INITIAL; +} + + + /*---------------------------------------------------------------. + | Scanning the epilogue (everything after the second "%%", which | + | has already been eaten). | + `---------------------------------------------------------------*/ + + +{ + <> { + STRING_FINISH; + loc->start = code_start; + val->chars = last_string; + BEGIN INITIAL; + return EPILOGUE; + } +} + + + /*-----------------------------------------. + | Escape M4 quoting characters in C code. | + `-----------------------------------------*/ + + +{ + \$ obstack_sgrow (&obstack_for_string, "$]["); + \@ obstack_sgrow (&obstack_for_string, "@@"); + \[ obstack_sgrow (&obstack_for_string, "@{"); + \] obstack_sgrow (&obstack_for_string, "@}"); +} + + + /*-----------------------------------------------------. + | By default, grow the string obstack with the input. | + `-----------------------------------------------------*/ + +. | +\n STRING_GROW; + +%% + +/* Keeps track of the maximum number of semantic values to the left of + a handle (those referenced by $0, $-1, etc.) are required by the + semantic actions of this grammar. */ +int max_left_semantic_context = 0; + +/* Set *LOC and adjust scanner cursor to account for token TOKEN of + size SIZE. */ + +static void +adjust_location (location *loc, char const *token, size_t size) +{ + int line = scanner_cursor.line; + int column = scanner_cursor.column; + char const *p0 = token; + char const *p = token; + char const *lim = token + size; + + loc->start = scanner_cursor; + + for (p = token; p < lim; p++) + switch (*p) + { + case '\n': + line++; + column = 1; + p0 = p + 1; + break; + + case '\t': + column += mbsnwidth (p0, p - p0, 0); + column += 8 - ((column - 1) & 7); + p0 = p + 1; + break; + } + + scanner_cursor.line = line; + scanner_cursor.column = column + mbsnwidth (p0, p - p0, 0); + + loc->end = scanner_cursor; +} + + +/* Read bytes from FP into buffer BUF of size SIZE. Return the + number of bytes read. Remove '\r' from input, treating \r\n + and isolated \r as \n. */ + +static size_t +no_cr_read (FILE *fp, char *buf, size_t size) +{ + size_t bytes_read = fread (buf, 1, size, fp); + if (bytes_read) + { + char *w = memchr (buf, '\r', bytes_read); + if (w) + { + char const *r = ++w; + char const *lim = buf + bytes_read; + + for (;;) + { + /* Found an '\r'. Treat it like '\n', but ignore any + '\n' that immediately follows. */ + w[-1] = '\n'; + if (r == lim) + { + int ch = getc (fp); + if (ch != '\n' && ungetc (ch, fp) != ch) + break; + } + else if (*r == '\n') + r++; + + /* Copy until the next '\r'. */ + do + { + if (r == lim) + return w - buf; + } + while ((*w++ = *r++) != '\r'); + } + + return w - buf; + } + } + + return bytes_read; +} + + +/*------------------------------------------------------------------. +| TEXT is pointing to a wannabee semantic value (i.e., a `$'). | +| | +| Possible inputs: $[]($|integer) | +| | +| Output to OBSTACK_FOR_STRING a reference to this semantic value. | +`------------------------------------------------------------------*/ + +static inline bool +handle_action_dollar (char *text, location loc) +{ + const char *type_name = NULL; + char *cp = text + 1; + + if (! current_rule) + return false; + + /* Get the type name if explicit. */ + if (*cp == '<') + { + type_name = ++cp; + while (*cp != '>') + ++cp; + *cp = '\0'; + ++cp; + } + + if (*cp == '$') + { + if (!type_name) + type_name = symbol_list_n_type_name_get (current_rule, loc, 0); + if (!type_name && typed) + complain_at (loc, _("$$ of `%s' has no declared type"), + current_rule->sym->tag); + if (!type_name) + type_name = ""; + obstack_fgrow1 (&obstack_for_string, + "]b4_lhs_value([%s])[", type_name); + } + else + { + long int num; + set_errno (0); + num = strtol (cp, 0, 10); + + if (INT_MIN <= num && num <= rule_length && ! get_errno ()) + { + int n = num; + if (1-n > max_left_semantic_context) + max_left_semantic_context = 1-n; + if (!type_name && n > 0) + type_name = symbol_list_n_type_name_get (current_rule, loc, n); + if (!type_name && typed) + complain_at (loc, _("$%d of `%s' has no declared type"), + n, current_rule->sym->tag); + if (!type_name) + type_name = ""; + obstack_fgrow3 (&obstack_for_string, + "]b4_rhs_value([%d], [%d], [%s])[", + rule_length, n, type_name); + } + else + complain_at (loc, _("integer out of range: %s"), quote (text)); + } + + return true; +} + + +/*----------------------------------------------------------------. +| Map `$?' onto the proper M4 symbol, depending on its TOKEN_TYPE | +| (are we in an action?). | +`----------------------------------------------------------------*/ + +static void +handle_dollar (int token_type, char *text, location loc) +{ + switch (token_type) + { + case BRACED_CODE: + if (handle_action_dollar (text, loc)) + return; + break; + + case PERCENT_DESTRUCTOR: + case PERCENT_INITIAL_ACTION: + case PERCENT_PRINTER: + if (text[1] == '$') + { + obstack_sgrow (&obstack_for_string, "]b4_dollar_dollar["); + return; + } + break; + + default: + break; + } + + complain_at (loc, _("invalid value: %s"), quote (text)); +} + + +/*------------------------------------------------------. +| TEXT is a location token (i.e., a `@...'). Output to | +| OBSTACK_FOR_STRING a reference to this location. | +`------------------------------------------------------*/ + +static inline bool +handle_action_at (char *text, location loc) +{ + char *cp = text + 1; + locations_flag = true; + + if (! current_rule) + return false; + + if (*cp == '$') + obstack_sgrow (&obstack_for_string, "]b4_lhs_location["); + else + { + long int num; + set_errno (0); + num = strtol (cp, 0, 10); + + if (INT_MIN <= num && num <= rule_length && ! get_errno ()) + { + int n = num; + obstack_fgrow2 (&obstack_for_string, "]b4_rhs_location([%d], [%d])[", + rule_length, n); + } + else + complain_at (loc, _("integer out of range: %s"), quote (text)); + } + + return true; +} + + +/*----------------------------------------------------------------. +| Map `@?' onto the proper M4 symbol, depending on its TOKEN_TYPE | +| (are we in an action?). | +`----------------------------------------------------------------*/ + +static void +handle_at (int token_type, char *text, location loc) +{ + switch (token_type) + { + case BRACED_CODE: + handle_action_at (text, loc); + return; + + case PERCENT_INITIAL_ACTION: + case PERCENT_DESTRUCTOR: + case PERCENT_PRINTER: + if (text[1] == '$') + { + obstack_sgrow (&obstack_for_string, "]b4_at_dollar["); + return; + } + break; + + default: + break; + } + + complain_at (loc, _("invalid value: %s"), quote (text)); +} + + +/*------------------------------------------------------. +| Scan NUMBER for a base-BASE integer at location LOC. | +`------------------------------------------------------*/ + +static unsigned long int +scan_integer (char const *number, int base, location loc) +{ + unsigned long int num; + set_errno (0); + num = strtoul (number, 0, base); + if (INT_MAX < num || get_errno ()) + { + complain_at (loc, _("integer out of range: %s"), quote (number)); + num = INT_MAX; + } + return num; +} + + +/*------------------------------------------------------------------. +| Convert universal character name UCN to a single-byte character, | +| and return that character. Return -1 if UCN does not correspond | +| to a single-byte character. | +`------------------------------------------------------------------*/ + +static int +convert_ucn_to_byte (char const *ucn) +{ + unsigned long int code = strtoul (ucn + 2, 0, 16); + + /* FIXME: Currently we assume Unicode-compatible unibyte characters + on ASCII hosts (i.e., Latin-1 on hosts with 8-bit bytes). On + non-ASCII hosts we support only the portable C character set. + These limitations should be removed once we add support for + multibyte characters. */ + + if (UCHAR_MAX < code) + return -1; + +#if ! ('$' == 0x24 && '@' == 0x40 && '`' == 0x60 && '~' == 0x7e) + { + /* A non-ASCII host. Use CODE to index into a table of the C + basic execution character set, which is guaranteed to exist on + all Standard C platforms. This table also includes '$', '@', + and '`', which are not in the basic execution character set but + which are unibyte characters on all the platforms that we know + about. */ + static signed char const table[] = + { + '\0', -1, -1, -1, -1, -1, -1, '\a', + '\b', '\t', '\n', '\v', '\f', '\r', -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + -1, -1, -1, -1, -1, -1, -1, -1, + ' ', '!', '"', '#', '$', '%', '&', '\'', + '(', ')', '*', '+', ',', '-', '.', '/', + '0', '1', '2', '3', '4', '5', '6', '7', + '8', '9', ':', ';', '<', '=', '>', '?', + '@', 'A', 'B', 'C', 'D', 'E', 'F', 'G', + 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', + 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', + 'X', 'Y', 'Z', '[', '\\', ']', '^', '_', + '`', 'a', 'b', 'c', 'd', 'e', 'f', 'g', + 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', + 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', + 'x', 'y', 'z', '{', '|', '}', '~' + }; + + code = code < sizeof table ? table[code] : -1; + } +#endif + + return code; +} + + +/*----------------------------------------------------------------. +| Handle `#line INT "FILE"'. ARGS has already skipped `#line '. | +`----------------------------------------------------------------*/ + +static void +handle_syncline (char *args) +{ + int lineno = strtol (args, &args, 10); + const char *file = NULL; + file = strchr (args, '"') + 1; + *strchr (file, '"') = 0; + scanner_cursor.file = current_file = xstrdup (file); + scanner_cursor.line = lineno; + scanner_cursor.column = 1; +} + + +/*----------------------------------------------------------------. +| For a token or comment starting at START, report message MSGID, | +| which should say that an end marker was found before | +| the expected TOKEN_END. | +`----------------------------------------------------------------*/ + +static void +unexpected_end (boundary start, char const *msgid, char const *token_end) +{ + location loc; + loc.start = start; + loc.end = scanner_cursor; + complain_at (loc, _(msgid), token_end); +} + + +/*------------------------------------------------------------------------. +| Report an unexpected EOF in a token or comment starting at START. | +| An end of file was encountered and the expected TOKEN_END was missing. | +`------------------------------------------------------------------------*/ + +static void +unexpected_eof (boundary start, char const *token_end) +{ + unexpected_end (start, N_("missing `%s' at end of file"), token_end); +} + + +/*----------------------------------------. +| Likewise, but for unexpected newlines. | +`----------------------------------------*/ + +static void +unexpected_newline (boundary start, char const *token_end) +{ + unexpected_end (start, N_("missing `%s' at end of line"), token_end); +} + + +/*-------------------------. +| Initialize the scanner. | +`-------------------------*/ + +void +scanner_initialize (void) +{ + obstack_init (&obstack_for_string); +} + + +/*-----------------------------------------------. +| Free all the memory allocated to the scanner. | +`-----------------------------------------------*/ + +void +scanner_free (void) +{ + obstack_free (&obstack_for_string, 0); + /* Reclaim Flex's buffers. */ + yy_delete_buffer (YY_CURRENT_BUFFER); +} diff --git a/src/apps/bin/bison/src/scan-skel.c b/src/apps/bin/bison/src/scan-skel.c new file mode 100644 index 0000000000..e5c85b1178 --- /dev/null +++ b/src/apps/bin/bison/src/scan-skel.c @@ -0,0 +1,1727 @@ +#define yy_create_buffer skel__create_buffer +#define yy_delete_buffer skel__delete_buffer +#define yy_scan_buffer skel__scan_buffer +#define yy_scan_string skel__scan_string +#define yy_scan_bytes skel__scan_bytes +#define yy_flex_debug skel__flex_debug +#define yy_init_buffer skel__init_buffer +#define yy_flush_buffer skel__flush_buffer +#define yy_load_buffer_state skel__load_buffer_state +#define yy_switch_to_buffer skel__switch_to_buffer +#define yyin skel_in +#define yyleng skel_leng +#define yylex skel_lex +#define yyout skel_out +#define yyrestart skel_restart +#define yytext skel_text + +#line 19 "scan-skel.c" +/* A lexical scanner generated by flex */ + +/* Scanner skeleton version: + * $Header: /tmp/bonefish/open-beos/current/src/apps/bin/bison/src/scan-skel.c,v 1.1 2004/06/01 09:52:40 korli Exp $ + */ + +#define FLEX_SCANNER +#define YY_FLEX_MAJOR_VERSION 2 +#define YY_FLEX_MINOR_VERSION 5 + +#include +#include + +/* cfront 1.2 defines "c_plusplus" instead of "__cplusplus" */ +#ifdef c_plusplus +#ifndef __cplusplus +#define __cplusplus +#endif +#endif + + +#ifdef __cplusplus + +#include +#ifndef _WIN32 +#include +#else +#ifndef YY_ALWAYS_INTERACTIVE +#ifndef YY_NEVER_INTERACTIVE +extern int isatty YY_PROTO(( int )); +#endif +#endif +#endif + +/* Use prototypes in function declarations. */ +#define YY_USE_PROTOS + +/* The "const" storage-class-modifier is valid. */ +#define YY_USE_CONST + +#else /* ! __cplusplus */ + +#if __STDC__ + +#define YY_USE_PROTOS +#define YY_USE_CONST + +#endif /* __STDC__ */ +#endif /* ! __cplusplus */ + +#ifdef __TURBOC__ + #pragma warn -rch + #pragma warn -use +#include +#include +#define YY_USE_CONST +#define YY_USE_PROTOS +#endif + +#ifdef YY_USE_CONST +#define yyconst const +#else +#define yyconst +#endif + + +#ifdef YY_USE_PROTOS +#define YY_PROTO(proto) proto +#else +#define YY_PROTO(proto) () +#endif + +/* Returned upon end-of-file. */ +#define YY_NULL 0 + +/* Promotes a possibly negative, possibly signed char to an unsigned + * integer for use as an array index. If the signed char is negative, + * we want to instead treat it as an 8-bit unsigned char, hence the + * double cast. + */ +#define YY_SC_TO_UI(c) ((unsigned int) (unsigned char) c) + +/* Enter a start condition. This macro really ought to take a parameter, + * but we do it the disgusting crufty way forced on us by the ()-less + * definition of BEGIN. + */ +#define BEGIN yy_start = 1 + 2 * + +/* Translate the current start state into a value that can be later handed + * to BEGIN to return to the state. The YYSTATE alias is for lex + * compatibility. + */ +#define YY_START ((yy_start - 1) / 2) +#define YYSTATE YY_START + +/* Action number for EOF rule of a given start state. */ +#define YY_STATE_EOF(state) (YY_END_OF_BUFFER + state + 1) + +/* Special action meaning "start processing a new file". */ +#define YY_NEW_FILE yyrestart( yyin ) + +#define YY_END_OF_BUFFER_CHAR 0 + +/* Size of default input buffer. */ +#define YY_BUF_SIZE 16384 + +typedef struct yy_buffer_state *YY_BUFFER_STATE; + +extern int yyleng; +extern FILE *yyin, *yyout; + +#define EOB_ACT_CONTINUE_SCAN 0 +#define EOB_ACT_END_OF_FILE 1 +#define EOB_ACT_LAST_MATCH 2 + +/* The funky do-while in the following #define is used to turn the definition + * int a single C statement (which needs a semi-colon terminator). This + * avoids problems with code like: + * + * if ( condition_holds ) + * yyless( 5 ); + * else + * do_something_else(); + * + * Prior to using the do-while the compiler would get upset at the + * "else" because it interpreted the "if" statement as being all + * done when it reached the ';' after the yyless() call. + */ + +/* Return all but the first 'n' matched characters back to the input stream. */ + +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + *yy_cp = yy_hold_char; \ + YY_RESTORE_YY_MORE_OFFSET \ + yy_c_buf_p = yy_cp = yy_bp + n - YY_MORE_ADJ; \ + YY_DO_BEFORE_ACTION; /* set up yytext again */ \ + } \ + while ( 0 ) + +#define unput(c) yyunput( c, yytext_ptr ) + +/* The following is because we cannot portably get our hands on size_t + * (without autoconf's help, which isn't available because we want + * flex-generated scanners to compile on their own). + */ +typedef unsigned int yy_size_t; + + +struct yy_buffer_state + { + FILE *yy_input_file; + + char *yy_ch_buf; /* input buffer */ + char *yy_buf_pos; /* current position in input buffer */ + + /* Size of input buffer in bytes, not including room for EOB + * characters. + */ + yy_size_t yy_buf_size; + + /* Number of characters read into yy_ch_buf, not including EOB + * characters. + */ + int yy_n_chars; + + /* Whether we "own" the buffer - i.e., we know we created it, + * and can realloc() it to grow it, and should free() it to + * delete it. + */ + int yy_is_our_buffer; + + /* Whether this is an "interactive" input source; if so, and + * if we're using stdio for input, then we want to use getc() + * instead of fread(), to make sure we stop fetching input after + * each newline. + */ + int yy_is_interactive; + + /* Whether we're considered to be at the beginning of a line. + * If so, '^' rules will be active on the next match, otherwise + * not. + */ + int yy_at_bol; + + /* Whether to try to fill the input buffer when we reach the + * end of it. + */ + int yy_fill_buffer; + + int yy_buffer_status; +#define YY_BUFFER_NEW 0 +#define YY_BUFFER_NORMAL 1 + /* When an EOF's been seen but there's still some text to process + * then we mark the buffer as YY_EOF_PENDING, to indicate that we + * shouldn't try reading from the input source any more. We might + * still have a bunch of tokens to match, though, because of + * possible backing-up. + * + * When we actually see the EOF, we change the status to "new" + * (via yyrestart()), so that the user can continue scanning by + * just pointing yyin at a new input file. + */ +#define YY_BUFFER_EOF_PENDING 2 + }; + +static YY_BUFFER_STATE yy_current_buffer = 0; + +/* We provide macros for accessing buffer states in case in the + * future we want to put the buffer states in a more general + * "scanner state". + */ +#define YY_CURRENT_BUFFER yy_current_buffer + + +/* yy_hold_char holds the character lost when yytext is formed. */ +static char yy_hold_char; + +static int yy_n_chars; /* number of characters read into yy_ch_buf */ + + +int yyleng; + +/* Points to current character in buffer. */ +static char *yy_c_buf_p = (char *) 0; +static int yy_init = 1; /* whether we need to initialize */ +static int yy_start = 0; /* start state number */ + +/* Flag which is used to allow yywrap()'s to do buffer switches + * instead of setting up a fresh yyin. A bit of a hack ... + */ +static int yy_did_buffer_switch_on_eof; + +void yyrestart YY_PROTO(( FILE *input_file )); + +void yy_switch_to_buffer YY_PROTO(( YY_BUFFER_STATE new_buffer )); +void yy_load_buffer_state YY_PROTO(( void )); +YY_BUFFER_STATE yy_create_buffer YY_PROTO(( FILE *file, int size )); +void yy_delete_buffer YY_PROTO(( YY_BUFFER_STATE b )); +void yy_init_buffer YY_PROTO(( YY_BUFFER_STATE b, FILE *file )); +void yy_flush_buffer YY_PROTO(( YY_BUFFER_STATE b )); +#define YY_FLUSH_BUFFER yy_flush_buffer( yy_current_buffer ) + +YY_BUFFER_STATE yy_scan_buffer YY_PROTO(( char *base, yy_size_t size )); +YY_BUFFER_STATE yy_scan_string YY_PROTO(( yyconst char *yy_str )); +YY_BUFFER_STATE yy_scan_bytes YY_PROTO(( yyconst char *bytes, int len )); + +static void *yy_flex_alloc YY_PROTO(( yy_size_t )); +static void *yy_flex_realloc YY_PROTO(( void *, yy_size_t )); +static void yy_flex_free YY_PROTO(( void * )); + +#define yy_new_buffer yy_create_buffer + +#define yy_set_interactive(is_interactive) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_is_interactive = is_interactive; \ + } + +#define yy_set_bol(at_bol) \ + { \ + if ( ! yy_current_buffer ) \ + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); \ + yy_current_buffer->yy_at_bol = at_bol; \ + } + +#define YY_AT_BOL() (yy_current_buffer->yy_at_bol) + + +#define yywrap() 1 +#define YY_SKIP_YYWRAP + +#define FLEX_DEBUG +typedef unsigned char YY_CHAR; +FILE *yyin = (FILE *) 0, *yyout = (FILE *) 0; +typedef int yy_state_type; + +#define FLEX_DEBUG +extern char *yytext; +#define yytext_ptr yytext + +static yy_state_type yy_get_previous_state YY_PROTO(( void )); +static yy_state_type yy_try_NUL_trans YY_PROTO(( yy_state_type current_state )); +static int yy_get_next_buffer YY_PROTO(( void )); +static void yy_fatal_error YY_PROTO(( yyconst char msg[] )); + +/* Done after the current pattern has been matched and before the + * corresponding action - sets up yytext. + */ +#define YY_DO_BEFORE_ACTION \ + yytext_ptr = yy_bp; \ + yyleng = (int) (yy_cp - yy_bp); \ + yy_hold_char = *yy_cp; \ + *yy_cp = '\0'; \ + yy_c_buf_p = yy_cp; + +#define YY_NUM_RULES 12 +#define YY_END_OF_BUFFER 13 +static yyconst short int yy_accept[56] = + { 0, + 0, 0, 13, 11, 10, 9, 11, 2, 0, 3, + 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 5, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 8, 7, 0 + } ; + +static yyconst int yy_ec[256] = + { 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 3, 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, 4, 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, 5, 1, 6, 1, 1, 7, + + 8, 9, 1, 10, 11, 1, 1, 12, 13, 14, + 15, 16, 1, 17, 18, 19, 20, 1, 1, 1, + 1, 1, 21, 1, 22, 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, 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, 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, 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 + } ; + +static yyconst int yy_meta[23] = + { 0, + 1, 2, 1, 2, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1 + } ; + +static yyconst short int yy_base[59] = + { 0, + 0, 1, 57, 0, 58, 2, 0, 58, 0, 58, + 58, 45, 44, 35, 41, 38, 35, 42, 41, 28, + 43, 42, 26, 58, 58, 5, 42, 3, 41, 58, + 34, 35, 34, 22, 31, 19, 28, 27, 17, 16, + 27, 26, 16, 15, 16, 15, 5, 3, 7, 6, + 7, 3, 58, 58, 58, 24, 0, 26 + } ; + +static yyconst short int yy_def[59] = + { 0, + 56, 56, 55, 57, 55, 55, 57, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 58, 55, 58, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 0, 55, 55, 55 + } ; + +static yyconst short int yy_nxt[81] = + { 0, + 7, 5, 5, 6, 6, 8, 54, 27, 12, 28, + 53, 13, 31, 52, 51, 50, 9, 49, 32, 14, + 48, 47, 10, 11, 4, 4, 29, 29, 46, 45, + 44, 43, 42, 41, 40, 39, 38, 37, 36, 35, + 34, 33, 30, 30, 26, 25, 24, 23, 22, 21, + 20, 19, 18, 17, 16, 15, 55, 3, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55 + } ; + +static yyconst short int yy_chk[81] = + { 0, + 57, 1, 2, 1, 2, 6, 52, 26, 9, 26, + 51, 9, 28, 50, 49, 48, 6, 47, 28, 9, + 46, 45, 6, 6, 56, 56, 58, 58, 44, 43, + 42, 41, 40, 39, 38, 37, 36, 35, 34, 33, + 32, 31, 29, 27, 23, 22, 21, 20, 19, 18, + 17, 16, 15, 14, 13, 12, 3, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, 55, 55 + } ; + +static yy_state_type yy_last_accepting_state; +static char *yy_last_accepting_cpos; + +extern int yy_flex_debug; +int yy_flex_debug = 1; + +static yyconst short int yy_rule_linenum[12] = + { 0, + 47, 68, 69, 70, 72, 73, 74, 75, 77, 78, + 79 + } ; + +/* The intent behind this definition is that it'll catch + * any uses of REJECT which flex missed. + */ +#define REJECT reject_used_but_not_detected +#define yymore() yymore_used_but_not_detected +#define YY_MORE_ADJ 0 +#define YY_RESTORE_YY_MORE_OFFSET +char *yytext; +#line 1 "scan-skel.l" +#define INITIAL 0 +/* Scan Bison Skeletons. -*- C -*- + + Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ +#define YY_NO_UNPUT 1 +#define YY_NEVER_INTERACTIVE 1 +#line 26 "scan-skel.l" +#include "system.h" + +#include +#include + +#include "getargs.h" +#include "files.h" + +int skel_lex (void); + +#define QPUTS(String) \ + fputs (quotearg_style (c_quoting_style, (String)), yyout) + +#line 472 "scan-skel.c" + +/* Macros after this point can all be overridden by user definitions in + * section 1. + */ + +#ifndef YY_SKIP_YYWRAP +#ifdef __cplusplus +extern "C" int yywrap YY_PROTO(( void )); +#else +extern int yywrap YY_PROTO(( void )); +#endif +#endif + +#ifndef YY_NO_UNPUT +static void yyunput YY_PROTO(( int c, char *buf_ptr )); +#endif + +#ifndef yytext_ptr +static void yy_flex_strncpy YY_PROTO(( char *, yyconst char *, int )); +#endif + +#ifdef YY_NEED_STRLEN +static int yy_flex_strlen YY_PROTO(( yyconst char * )); +#endif + +#ifndef YY_NO_INPUT +#ifdef __cplusplus +static int yyinput YY_PROTO(( void )); +#else +static int input YY_PROTO(( void )); +#endif +#endif + +#if YY_STACK_USED +static int yy_start_stack_ptr = 0; +static int yy_start_stack_depth = 0; +static int *yy_start_stack = 0; +#ifndef YY_NO_PUSH_STATE +static void yy_push_state YY_PROTO(( int new_state )); +#endif +#ifndef YY_NO_POP_STATE +static void yy_pop_state YY_PROTO(( void )); +#endif +#ifndef YY_NO_TOP_STATE +static int yy_top_state YY_PROTO(( void )); +#endif + +#else +#define YY_NO_PUSH_STATE 1 +#define YY_NO_POP_STATE 1 +#define YY_NO_TOP_STATE 1 +#endif + +#ifdef YY_MALLOC_DECL +YY_MALLOC_DECL +#else +#if __STDC__ +#ifndef __cplusplus +#include +#endif +#else +/* Just try to get by without declaring the routines. This will fail + * miserably on non-ANSI systems for which sizeof(size_t) != sizeof(int) + * or sizeof(void*) != sizeof(int). + */ +#endif +#endif + +/* Amount of stuff to slurp up with each read. */ +#ifndef YY_READ_BUF_SIZE +#define YY_READ_BUF_SIZE 8192 +#endif + +/* Copy whatever the last rule matched to the standard output. */ + +#ifndef ECHO +/* This used to be an fputs(), but since the string might contain NUL's, + * we now use fwrite(). + */ +#define ECHO (void) fwrite( yytext, yyleng, 1, yyout ) +#endif + +/* Gets input and stuffs it into "buf". number of characters read, or YY_NULL, + * is returned in "result". + */ +#ifndef YY_INPUT +#define YY_INPUT(buf,result,max_size) \ + if ( yy_current_buffer->yy_is_interactive ) \ + { \ + int c = '*', n; \ + for ( n = 0; n < max_size && \ + (c = getc( yyin )) != EOF && c != '\n'; ++n ) \ + buf[n] = (char) c; \ + if ( c == '\n' ) \ + buf[n++] = (char) c; \ + if ( c == EOF && ferror( yyin ) ) \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + result = n; \ + } \ + else \ + { \ + errno=0; \ + while ( (result = fread(buf, 1, max_size, yyin))==0 && ferror(yyin)) \ + { \ + if( errno != EINTR) \ + { \ + YY_FATAL_ERROR( "input in flex scanner failed" ); \ + break; \ + } \ + errno=0; \ + clearerr(yyin); \ + } \ + } +#endif + +/* No semi-colon after return; correct usage is to write "yyterminate();" - + * we don't want an extra ';' after the "return" because that will cause + * some compilers to complain about unreachable statements. + */ +#ifndef yyterminate +#define yyterminate() return YY_NULL +#endif + +/* Number of entries by which start-condition stack grows. */ +#ifndef YY_START_STACK_INCR +#define YY_START_STACK_INCR 25 +#endif + +/* Report a fatal error. */ +#ifndef YY_FATAL_ERROR +#define YY_FATAL_ERROR(msg) yy_fatal_error( msg ) +#endif + +/* Default declaration of generated scanner - a define so the user can + * easily add parameters. + */ +#ifndef YY_DECL +#define YY_DECL int yylex YY_PROTO(( void )) +#endif + +/* Code executed at the beginning of each rule, after yytext and yyleng + * have been set up. + */ +#ifndef YY_USER_ACTION +#define YY_USER_ACTION +#endif + +/* Code executed at the end of each rule. */ +#ifndef YY_BREAK +#define YY_BREAK break; +#endif + +#define YY_RULE_SETUP \ + YY_USER_ACTION + +YY_DECL + { + register yy_state_type yy_current_state; + register char *yy_cp, *yy_bp; + register int yy_act; + +#line 40 "scan-skel.l" + + + + int lineno IF_LINT (= 0); + char *outname = NULL; + + +#line 642 "scan-skel.c" + + if ( yy_init ) + { + yy_init = 0; + +#ifdef YY_USER_INIT + YY_USER_INIT; +#endif + + if ( ! yy_start ) + yy_start = 1; /* first start state */ + + if ( ! yyin ) + yyin = stdin; + + if ( ! yyout ) + yyout = stdout; + + if ( ! yy_current_buffer ) + yy_current_buffer = + yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_load_buffer_state(); + } + + while ( 1 ) /* loops until end-of-file is reached */ + { + yy_cp = yy_c_buf_p; + + /* Support of yytext. */ + *yy_cp = yy_hold_char; + + /* yy_bp points to the position in yy_ch_buf of the start of + * the current run. + */ + yy_bp = yy_cp; + + yy_current_state = yy_start; +yy_match: + do + { + register YY_CHAR yy_c = yy_ec[YY_SC_TO_UI(*yy_cp)]; + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + 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 >= 56 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + ++yy_cp; + } + while ( yy_base[yy_current_state] != 58 ); + +yy_find_action: + yy_act = yy_accept[yy_current_state]; + if ( yy_act == 0 ) + { /* have to back up */ + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + yy_act = yy_accept[yy_current_state]; + } + + YY_DO_BEFORE_ACTION; + + +do_action: /* This label is used only to access EOF actions. */ + + if ( yy_flex_debug ) + { + if ( yy_act == 0 ) + fprintf( stderr, "--scanner backing up\n" ); + else if ( yy_act < 12 ) + fprintf( stderr, "--accepting rule at line %d (\"%s\")\n", + yy_rule_linenum[yy_act], yytext ); + else if ( yy_act == 12 ) + fprintf( stderr, "--accepting default rule (\"%s\")\n", + yytext ); + else if ( yy_act == 13 ) + fprintf( stderr, "--(end of buffer or a NUL)\n" ); + else + fprintf( stderr, "--EOF (start condition %d)\n", YY_START ); + } + + switch ( yy_act ) + { /* beginning of action switch */ + case 0: /* must back up */ + /* undo the effects of YY_DO_BEFORE_ACTION */ + *yy_cp = yy_hold_char; + yy_cp = yy_last_accepting_cpos; + yy_current_state = yy_last_accepting_state; + goto yy_find_action; + +case 1: +YY_RULE_SETUP +#line 47 "scan-skel.l" +{ + char const *filename = yytext + sizeof "@output " - 1; + yytext[yyleng - 1] = '\0'; + + if (*filename == '@') + { + if (strcmp (filename, "@output_header_name@") == 0) + filename = spec_defines_file; + else if (strcmp (filename, "@output_parser_name@") == 0) + filename = parser_file_name; + else + abort (); + } + + XFREE (outname); + outname = xstrdup (filename); + xfclose (yyout); + yyout = xfopen (outname, "w"); + lineno = 1; +} + YY_BREAK +case 2: +YY_RULE_SETUP +#line 68 "scan-skel.l" +fputc ('@', yyout); + YY_BREAK +case 3: +YY_RULE_SETUP +#line 69 "scan-skel.l" +fputc ('[', yyout); + YY_BREAK +case 4: +YY_RULE_SETUP +#line 70 "scan-skel.l" +fputc (']', yyout); + YY_BREAK +case 5: +YY_RULE_SETUP +#line 72 "scan-skel.l" +fprintf (yyout, "%d", lineno + 1); + YY_BREAK +case 6: +YY_RULE_SETUP +#line 73 "scan-skel.l" +QPUTS (outname); + YY_BREAK +case 7: +YY_RULE_SETUP +#line 74 "scan-skel.l" +QPUTS (parser_file_name); + YY_BREAK +case 8: +YY_RULE_SETUP +#line 75 "scan-skel.l" +QPUTS (spec_defines_file); + YY_BREAK +case 9: +YY_RULE_SETUP +#line 77 "scan-skel.l" +abort (); + YY_BREAK +case 10: +YY_RULE_SETUP +#line 78 "scan-skel.l" +lineno++; ECHO; + YY_BREAK +case 11: +YY_RULE_SETUP +#line 79 "scan-skel.l" +ECHO; + YY_BREAK +case YY_STATE_EOF(INITIAL): +#line 81 "scan-skel.l" +xfclose (yyout); free (outname); return EOF; + YY_BREAK +case 12: +YY_RULE_SETUP +#line 82 "scan-skel.l" +YY_FATAL_ERROR( "flex scanner jammed" ); + YY_BREAK +#line 823 "scan-skel.c" + + case YY_END_OF_BUFFER: + { + /* Amount of text matched not including the EOB char. */ + int yy_amount_of_matched_text = (int) (yy_cp - yytext_ptr) - 1; + + /* Undo the effects of YY_DO_BEFORE_ACTION. */ + *yy_cp = yy_hold_char; + YY_RESTORE_YY_MORE_OFFSET + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_NEW ) + { + /* We're scanning a new file or input source. It's + * possible that this happened because the user + * just pointed yyin at a new source and called + * yylex(). If so, then we have to assure + * consistency between yy_current_buffer and our + * globals. Here is the right place to do so, because + * this is the first action (other than possibly a + * back-up) that will match for the new input source. + */ + yy_n_chars = yy_current_buffer->yy_n_chars; + yy_current_buffer->yy_input_file = yyin; + yy_current_buffer->yy_buffer_status = YY_BUFFER_NORMAL; + } + + /* Note that here we test for yy_c_buf_p "<=" to the position + * of the first EOB in the buffer, since yy_c_buf_p will + * already have been incremented past the NUL character + * (since all states make transitions on EOB to the + * end-of-buffer state). Contrast this with the test + * in input(). + */ + if ( yy_c_buf_p <= &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + { /* This was really a NUL. */ + yy_state_type yy_next_state; + + yy_c_buf_p = yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + /* Okay, we're now positioned to make the NUL + * transition. We couldn't have + * yy_get_previous_state() go ahead and do it + * for us because it doesn't know how to deal + * with the possibility of jamming (and we don't + * want to build jamming into it because then it + * will run more slowly). + */ + + yy_next_state = yy_try_NUL_trans( yy_current_state ); + + yy_bp = yytext_ptr + YY_MORE_ADJ; + + if ( yy_next_state ) + { + /* Consume the NUL. */ + yy_cp = ++yy_c_buf_p; + yy_current_state = yy_next_state; + goto yy_match; + } + + else + { + yy_cp = yy_c_buf_p; + goto yy_find_action; + } + } + + else switch ( yy_get_next_buffer() ) + { + case EOB_ACT_END_OF_FILE: + { + yy_did_buffer_switch_on_eof = 0; + + if ( yywrap() ) + { + /* Note: because we've taken care in + * yy_get_next_buffer() to have set up + * yytext, we can now set up + * yy_c_buf_p so that if some total + * hoser (like flex itself) wants to + * call the scanner after we return the + * YY_NULL, it'll still work - another + * YY_NULL will get returned. + */ + yy_c_buf_p = yytext_ptr + YY_MORE_ADJ; + + yy_act = YY_STATE_EOF(YY_START); + goto do_action; + } + + else + { + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; + } + break; + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = + yytext_ptr + yy_amount_of_matched_text; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_match; + + case EOB_ACT_LAST_MATCH: + yy_c_buf_p = + &yy_current_buffer->yy_ch_buf[yy_n_chars]; + + yy_current_state = yy_get_previous_state(); + + yy_cp = yy_c_buf_p; + yy_bp = yytext_ptr + YY_MORE_ADJ; + goto yy_find_action; + } + break; + } + + default: + YY_FATAL_ERROR( + "fatal flex scanner internal error--no action found" ); + } /* end of action switch */ + } /* end of scanning one token */ + } /* end of yylex */ + + +/* yy_get_next_buffer - try to read in a new buffer + * + * Returns a code representing an action: + * EOB_ACT_LAST_MATCH - + * EOB_ACT_CONTINUE_SCAN - continue scanning from current position + * EOB_ACT_END_OF_FILE - end of file + */ + +static int yy_get_next_buffer() + { + register char *dest = yy_current_buffer->yy_ch_buf; + register char *source = yytext_ptr; + register int number_to_move, i; + int ret_val; + + if ( yy_c_buf_p > &yy_current_buffer->yy_ch_buf[yy_n_chars + 1] ) + YY_FATAL_ERROR( + "fatal flex scanner internal error--end of buffer missed" ); + + if ( yy_current_buffer->yy_fill_buffer == 0 ) + { /* Don't try to fill the buffer, so this is an EOF. */ + if ( yy_c_buf_p - yytext_ptr - YY_MORE_ADJ == 1 ) + { + /* We matched a single character, the EOB, so + * treat this as a final EOF. + */ + return EOB_ACT_END_OF_FILE; + } + + else + { + /* We matched some text prior to the EOB, first + * process it. + */ + return EOB_ACT_LAST_MATCH; + } + } + + /* Try to read more data. */ + + /* First move last chars to start of buffer. */ + number_to_move = (int) (yy_c_buf_p - yytext_ptr) - 1; + + for ( i = 0; i < number_to_move; ++i ) + *(dest++) = *(source++); + + if ( yy_current_buffer->yy_buffer_status == YY_BUFFER_EOF_PENDING ) + /* don't do the read, it's not guaranteed to return an EOF, + * just force an EOF + */ + yy_current_buffer->yy_n_chars = yy_n_chars = 0; + + else + { + int num_to_read = + yy_current_buffer->yy_buf_size - number_to_move - 1; + + while ( num_to_read <= 0 ) + { /* Not enough room in the buffer - grow it. */ +#ifdef YY_USES_REJECT + YY_FATAL_ERROR( +"input buffer overflow, can't enlarge buffer because scanner uses REJECT" ); +#else + + /* just a shorter name for the current buffer */ + YY_BUFFER_STATE b = yy_current_buffer; + + int yy_c_buf_p_offset = + (int) (yy_c_buf_p - b->yy_ch_buf); + + if ( b->yy_is_our_buffer ) + { + int new_size = b->yy_buf_size * 2; + + if ( new_size <= 0 ) + b->yy_buf_size += b->yy_buf_size / 8; + else + b->yy_buf_size *= 2; + + b->yy_ch_buf = (char *) + /* Include room in for 2 EOB chars. */ + yy_flex_realloc( (void *) b->yy_ch_buf, + b->yy_buf_size + 2 ); + } + else + /* Can't grow it, we don't own it. */ + b->yy_ch_buf = 0; + + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( + "fatal error - scanner input buffer overflow" ); + + yy_c_buf_p = &b->yy_ch_buf[yy_c_buf_p_offset]; + + num_to_read = yy_current_buffer->yy_buf_size - + number_to_move - 1; +#endif + } + + if ( num_to_read > YY_READ_BUF_SIZE ) + num_to_read = YY_READ_BUF_SIZE; + + /* Read in more data. */ + YY_INPUT( (&yy_current_buffer->yy_ch_buf[number_to_move]), + yy_n_chars, num_to_read ); + + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + if ( yy_n_chars == 0 ) + { + if ( number_to_move == YY_MORE_ADJ ) + { + ret_val = EOB_ACT_END_OF_FILE; + yyrestart( yyin ); + } + + else + { + ret_val = EOB_ACT_LAST_MATCH; + yy_current_buffer->yy_buffer_status = + YY_BUFFER_EOF_PENDING; + } + } + + else + ret_val = EOB_ACT_CONTINUE_SCAN; + + yy_n_chars += number_to_move; + yy_current_buffer->yy_ch_buf[yy_n_chars] = YY_END_OF_BUFFER_CHAR; + yy_current_buffer->yy_ch_buf[yy_n_chars + 1] = YY_END_OF_BUFFER_CHAR; + + yytext_ptr = &yy_current_buffer->yy_ch_buf[0]; + + return ret_val; + } + + +/* yy_get_previous_state - get the state just before the EOB char was reached */ + +static yy_state_type yy_get_previous_state() + { + register yy_state_type yy_current_state; + register char *yy_cp; + + yy_current_state = yy_start; + + for ( yy_cp = yytext_ptr + YY_MORE_ADJ; yy_cp < yy_c_buf_p; ++yy_cp ) + { + register YY_CHAR yy_c = (*yy_cp ? yy_ec[YY_SC_TO_UI(*yy_cp)] : 1); + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + 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 >= 56 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + } + + return yy_current_state; + } + + +/* yy_try_NUL_trans - try to make a transition on the NUL character + * + * synopsis + * next_state = yy_try_NUL_trans( current_state ); + */ + +#ifdef YY_USE_PROTOS +static yy_state_type yy_try_NUL_trans( yy_state_type yy_current_state ) +#else +static yy_state_type yy_try_NUL_trans( yy_current_state ) +yy_state_type yy_current_state; +#endif + { + register int yy_is_jam; + register char *yy_cp = yy_c_buf_p; + + register YY_CHAR yy_c = 1; + if ( yy_accept[yy_current_state] ) + { + yy_last_accepting_state = yy_current_state; + yy_last_accepting_cpos = yy_cp; + } + 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 >= 56 ) + yy_c = yy_meta[(unsigned int) yy_c]; + } + yy_current_state = yy_nxt[yy_base[yy_current_state] + (unsigned int) yy_c]; + yy_is_jam = (yy_current_state == 55); + + return yy_is_jam ? 0 : yy_current_state; + } + + +#ifndef YY_NO_UNPUT +#ifdef YY_USE_PROTOS +static void yyunput( int c, register char *yy_bp ) +#else +static void yyunput( c, yy_bp ) +int c; +register char *yy_bp; +#endif + { + register char *yy_cp = yy_c_buf_p; + + /* undo effects of setting up yytext */ + *yy_cp = yy_hold_char; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + { /* need to shift things up to make room */ + /* +2 for EOB chars. */ + register int number_to_move = yy_n_chars + 2; + register char *dest = &yy_current_buffer->yy_ch_buf[ + yy_current_buffer->yy_buf_size + 2]; + register char *source = + &yy_current_buffer->yy_ch_buf[number_to_move]; + + while ( source > yy_current_buffer->yy_ch_buf ) + *--dest = *--source; + + yy_cp += (int) (dest - source); + yy_bp += (int) (dest - source); + yy_current_buffer->yy_n_chars = + yy_n_chars = yy_current_buffer->yy_buf_size; + + if ( yy_cp < yy_current_buffer->yy_ch_buf + 2 ) + YY_FATAL_ERROR( "flex scanner push-back overflow" ); + } + + *--yy_cp = (char) c; + + + yytext_ptr = yy_bp; + yy_hold_char = *yy_cp; + yy_c_buf_p = yy_cp; + } +#endif /* ifndef YY_NO_UNPUT */ + + +#ifdef __cplusplus +static int yyinput() +#else +static int input() +#endif + { + int c; + + *yy_c_buf_p = yy_hold_char; + + if ( *yy_c_buf_p == YY_END_OF_BUFFER_CHAR ) + { + /* yy_c_buf_p now points to the character we want to return. + * If this occurs *before* the EOB characters, then it's a + * valid NUL; if not, then we've hit the end of the buffer. + */ + if ( yy_c_buf_p < &yy_current_buffer->yy_ch_buf[yy_n_chars] ) + /* This was really a NUL. */ + *yy_c_buf_p = '\0'; + + else + { /* need more input */ + int offset = yy_c_buf_p - yytext_ptr; + ++yy_c_buf_p; + + switch ( yy_get_next_buffer() ) + { + case EOB_ACT_LAST_MATCH: + /* This happens because yy_g_n_b() + * sees that we've accumulated a + * token and flags that we need to + * try matching the token before + * proceeding. But for input(), + * there's no matching to consider. + * So convert the EOB_ACT_LAST_MATCH + * to EOB_ACT_END_OF_FILE. + */ + + /* Reset buffer status. */ + yyrestart( yyin ); + + /* fall through */ + + case EOB_ACT_END_OF_FILE: + { + if ( yywrap() ) + return EOF; + + if ( ! yy_did_buffer_switch_on_eof ) + YY_NEW_FILE; +#ifdef __cplusplus + return yyinput(); +#else + return input(); +#endif + } + + case EOB_ACT_CONTINUE_SCAN: + yy_c_buf_p = yytext_ptr + offset; + break; + } + } + } + + c = *(unsigned char *) yy_c_buf_p; /* cast for 8-bit char's */ + *yy_c_buf_p = '\0'; /* preserve yytext */ + yy_hold_char = *++yy_c_buf_p; + + + return c; + } + + +#ifdef YY_USE_PROTOS +void yyrestart( FILE *input_file ) +#else +void yyrestart( input_file ) +FILE *input_file; +#endif + { + if ( ! yy_current_buffer ) + yy_current_buffer = yy_create_buffer( yyin, YY_BUF_SIZE ); + + yy_init_buffer( yy_current_buffer, input_file ); + yy_load_buffer_state(); + } + + +#ifdef YY_USE_PROTOS +void yy_switch_to_buffer( YY_BUFFER_STATE new_buffer ) +#else +void yy_switch_to_buffer( new_buffer ) +YY_BUFFER_STATE new_buffer; +#endif + { + if ( yy_current_buffer == new_buffer ) + return; + + if ( yy_current_buffer ) + { + /* Flush out information for old buffer. */ + *yy_c_buf_p = yy_hold_char; + yy_current_buffer->yy_buf_pos = yy_c_buf_p; + yy_current_buffer->yy_n_chars = yy_n_chars; + } + + yy_current_buffer = new_buffer; + yy_load_buffer_state(); + + /* We don't actually know whether we did this switch during + * EOF (yywrap()) processing, but the only time this flag + * is looked at is after yywrap() is called, so it's safe + * to go ahead and always set it. + */ + yy_did_buffer_switch_on_eof = 1; + } + + +#ifdef YY_USE_PROTOS +void yy_load_buffer_state( void ) +#else +void yy_load_buffer_state() +#endif + { + yy_n_chars = yy_current_buffer->yy_n_chars; + yytext_ptr = yy_c_buf_p = yy_current_buffer->yy_buf_pos; + yyin = yy_current_buffer->yy_input_file; + yy_hold_char = *yy_c_buf_p; + } + + +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_create_buffer( FILE *file, int size ) +#else +YY_BUFFER_STATE yy_create_buffer( file, size ) +FILE *file; +int size; +#endif + { + YY_BUFFER_STATE b; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_buf_size = size; + + /* yy_ch_buf has to be 2 characters longer than the size given because + * we need to put in 2 end-of-buffer characters. + */ + b->yy_ch_buf = (char *) yy_flex_alloc( b->yy_buf_size + 2 ); + if ( ! b->yy_ch_buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_create_buffer()" ); + + b->yy_is_our_buffer = 1; + + yy_init_buffer( b, file ); + + return b; + } + + +#ifdef YY_USE_PROTOS +void yy_delete_buffer( YY_BUFFER_STATE b ) +#else +void yy_delete_buffer( b ) +YY_BUFFER_STATE b; +#endif + { + if ( ! b ) + return; + + if ( b == yy_current_buffer ) + yy_current_buffer = (YY_BUFFER_STATE) 0; + + if ( b->yy_is_our_buffer ) + yy_flex_free( (void *) b->yy_ch_buf ); + + yy_flex_free( (void *) b ); + } + + +#ifndef _WIN32 +#include +#else +#ifndef YY_ALWAYS_INTERACTIVE +#ifndef YY_NEVER_INTERACTIVE +extern int isatty YY_PROTO(( int )); +#endif +#endif +#endif + +#ifdef YY_USE_PROTOS +void yy_init_buffer( YY_BUFFER_STATE b, FILE *file ) +#else +void yy_init_buffer( b, file ) +YY_BUFFER_STATE b; +FILE *file; +#endif + + + { + yy_flush_buffer( b ); + + b->yy_input_file = file; + b->yy_fill_buffer = 1; + +#if YY_ALWAYS_INTERACTIVE + b->yy_is_interactive = 1; +#else +#if YY_NEVER_INTERACTIVE + b->yy_is_interactive = 0; +#else + b->yy_is_interactive = file ? (isatty( fileno(file) ) > 0) : 0; +#endif +#endif + } + + +#ifdef YY_USE_PROTOS +void yy_flush_buffer( YY_BUFFER_STATE b ) +#else +void yy_flush_buffer( b ) +YY_BUFFER_STATE b; +#endif + + { + if ( ! b ) + return; + + b->yy_n_chars = 0; + + /* We always need two end-of-buffer characters. The first causes + * a transition to the end-of-buffer state. The second causes + * a jam in that state. + */ + b->yy_ch_buf[0] = YY_END_OF_BUFFER_CHAR; + b->yy_ch_buf[1] = YY_END_OF_BUFFER_CHAR; + + b->yy_buf_pos = &b->yy_ch_buf[0]; + + b->yy_at_bol = 1; + b->yy_buffer_status = YY_BUFFER_NEW; + + if ( b == yy_current_buffer ) + yy_load_buffer_state(); + } + + +#ifndef YY_NO_SCAN_BUFFER +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_buffer( char *base, yy_size_t size ) +#else +YY_BUFFER_STATE yy_scan_buffer( base, size ) +char *base; +yy_size_t size; +#endif + { + YY_BUFFER_STATE b; + + if ( size < 2 || + base[size-2] != YY_END_OF_BUFFER_CHAR || + base[size-1] != YY_END_OF_BUFFER_CHAR ) + /* They forgot to leave room for the EOB's. */ + return 0; + + b = (YY_BUFFER_STATE) yy_flex_alloc( sizeof( struct yy_buffer_state ) ); + if ( ! b ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_buffer()" ); + + b->yy_buf_size = size - 2; /* "- 2" to take care of EOB's */ + b->yy_buf_pos = b->yy_ch_buf = base; + b->yy_is_our_buffer = 0; + b->yy_input_file = 0; + b->yy_n_chars = b->yy_buf_size; + b->yy_is_interactive = 0; + b->yy_at_bol = 1; + b->yy_fill_buffer = 0; + b->yy_buffer_status = YY_BUFFER_NEW; + + yy_switch_to_buffer( b ); + + return b; + } +#endif + + +#ifndef YY_NO_SCAN_STRING +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_string( yyconst char *yy_str ) +#else +YY_BUFFER_STATE yy_scan_string( yy_str ) +yyconst char *yy_str; +#endif + { + int len; + for ( len = 0; yy_str[len]; ++len ) + ; + + return yy_scan_bytes( yy_str, len ); + } +#endif + + +#ifndef YY_NO_SCAN_BYTES +#ifdef YY_USE_PROTOS +YY_BUFFER_STATE yy_scan_bytes( yyconst char *bytes, int len ) +#else +YY_BUFFER_STATE yy_scan_bytes( bytes, len ) +yyconst char *bytes; +int len; +#endif + { + YY_BUFFER_STATE b; + char *buf; + yy_size_t n; + int i; + + /* Get memory for full buffer, including space for trailing EOB's. */ + n = len + 2; + buf = (char *) yy_flex_alloc( n ); + if ( ! buf ) + YY_FATAL_ERROR( "out of dynamic memory in yy_scan_bytes()" ); + + for ( i = 0; i < len; ++i ) + buf[i] = bytes[i]; + + buf[len] = buf[len+1] = YY_END_OF_BUFFER_CHAR; + + b = yy_scan_buffer( buf, n ); + if ( ! b ) + YY_FATAL_ERROR( "bad buffer in yy_scan_bytes()" ); + + /* It's okay to grow etc. this buffer, and we should throw it + * away when we're done. + */ + b->yy_is_our_buffer = 1; + + return b; + } +#endif + + +#ifndef YY_NO_PUSH_STATE +#ifdef YY_USE_PROTOS +static void yy_push_state( int new_state ) +#else +static void yy_push_state( new_state ) +int new_state; +#endif + { + if ( yy_start_stack_ptr >= yy_start_stack_depth ) + { + yy_size_t new_size; + + yy_start_stack_depth += YY_START_STACK_INCR; + new_size = yy_start_stack_depth * sizeof( int ); + + if ( ! yy_start_stack ) + yy_start_stack = (int *) yy_flex_alloc( new_size ); + + else + yy_start_stack = (int *) yy_flex_realloc( + (void *) yy_start_stack, new_size ); + + if ( ! yy_start_stack ) + YY_FATAL_ERROR( + "out of memory expanding start-condition stack" ); + } + + yy_start_stack[yy_start_stack_ptr++] = YY_START; + + BEGIN(new_state); + } +#endif + + +#ifndef YY_NO_POP_STATE +static void yy_pop_state() + { + if ( --yy_start_stack_ptr < 0 ) + YY_FATAL_ERROR( "start-condition stack underflow" ); + + BEGIN(yy_start_stack[yy_start_stack_ptr]); + } +#endif + + +#ifndef YY_NO_TOP_STATE +static int yy_top_state() + { + return yy_start_stack[yy_start_stack_ptr - 1]; + } +#endif + +#ifndef YY_EXIT_FAILURE +#define YY_EXIT_FAILURE 2 +#endif + +#ifdef YY_USE_PROTOS +static void yy_fatal_error( yyconst char msg[] ) +#else +static void yy_fatal_error( msg ) +char msg[]; +#endif + { + (void) fprintf( stderr, "%s\n", msg ); + exit( YY_EXIT_FAILURE ); + } + + + +/* Redefine yyless() so it works in section 3 code. */ + +#undef yyless +#define yyless(n) \ + do \ + { \ + /* Undo effects of setting up yytext. */ \ + yytext[yyleng] = yy_hold_char; \ + yy_c_buf_p = yytext + n; \ + yy_hold_char = *yy_c_buf_p; \ + *yy_c_buf_p = '\0'; \ + yyleng = n; \ + } \ + while ( 0 ) + + +/* Internal utility routines. */ + +#ifndef yytext_ptr +#ifdef YY_USE_PROTOS +static void yy_flex_strncpy( char *s1, yyconst char *s2, int n ) +#else +static void yy_flex_strncpy( s1, s2, n ) +char *s1; +yyconst char *s2; +int n; +#endif + { + register int i; + for ( i = 0; i < n; ++i ) + s1[i] = s2[i]; + } +#endif + +#ifdef YY_NEED_STRLEN +#ifdef YY_USE_PROTOS +static int yy_flex_strlen( yyconst char *s ) +#else +static int yy_flex_strlen( s ) +yyconst char *s; +#endif + { + register int n; + for ( n = 0; s[n]; ++n ) + ; + + return n; + } +#endif + + +#ifdef YY_USE_PROTOS +static void *yy_flex_alloc( yy_size_t size ) +#else +static void *yy_flex_alloc( size ) +yy_size_t size; +#endif + { + return (void *) malloc( size ); + } + +#ifdef YY_USE_PROTOS +static void *yy_flex_realloc( void *ptr, yy_size_t size ) +#else +static void *yy_flex_realloc( ptr, size ) +void *ptr; +yy_size_t size; +#endif + { + /* The cast to (char *) in the following accommodates both + * implementations that use char* generic pointers, and those + * that use void* generic pointers. It works with the latter + * because both ANSI C and C++ allow castless assignment from + * any pointer type to void*, and deal with argument conversions + * as though doing an assignment. + */ + return (void *) realloc( (char *) ptr, size ); + } + +#ifdef YY_USE_PROTOS +static void yy_flex_free( void *ptr ) +#else +static void yy_flex_free( ptr ) +void *ptr; +#endif + { + free( ptr ); + } + +#if YY_MAIN +int main() + { + yylex(); + return 0; + } +#endif +#line 82 "scan-skel.l" + + +/*------------------------. +| Scan a Bison skeleton. | +`------------------------*/ + +void scan_skel (FILE *); + +void +scan_skel (FILE *in) +{ + skel_in = in; + skel__flex_debug = trace_flag & trace_skeleton; + skel_lex (); + /* Reclaim Flex's buffers. */ + yy_delete_buffer (YY_CURRENT_BUFFER); +} diff --git a/src/apps/bin/bison/src/scan-skel.l b/src/apps/bin/bison/src/scan-skel.l new file mode 100644 index 0000000000..af5226c9dd --- /dev/null +++ b/src/apps/bin/bison/src/scan-skel.l @@ -0,0 +1,98 @@ +/* Scan Bison Skeletons. -*- C -*- + + Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + +%option nodefault noyywrap nounput never-interactive debug +%option prefix="skel_" outfile="lex.yy.c" + +%{ +#include "system.h" + +#include +#include + +#include "getargs.h" +#include "files.h" + +int skel_lex (void); + +#define QPUTS(String) \ + fputs (quotearg_style (c_quoting_style, (String)), yyout) + +%} +%% + +%{ + int lineno IF_LINT (= 0); + char *outname = NULL; +%} + +"@output ".*\n { + char const *filename = yytext + sizeof "@output " - 1; + yytext[yyleng - 1] = '\0'; + + if (*filename == '@') + { + if (strcmp (filename, "@output_header_name@") == 0) + filename = spec_defines_file; + else if (strcmp (filename, "@output_parser_name@") == 0) + filename = parser_file_name; + else + abort (); + } + + XFREE (outname); + outname = xstrdup (filename); + xfclose (yyout); + yyout = xfopen (outname, "w"); + lineno = 1; +} + +"@@" fputc ('@', yyout); +"@{" fputc ('[', yyout); +"@}" fputc (']', yyout); + +"@oline@" fprintf (yyout, "%d", lineno + 1); +"@ofile@" QPUTS (outname); +"@output_parser_name@" QPUTS (parser_file_name); +"@output_header_name@" QPUTS (spec_defines_file); + +"@" abort (); +\n lineno++; ECHO; +[^@\n]+ ECHO; + +<> xfclose (yyout); free (outname); return EOF; +%% + +/*------------------------. +| Scan a Bison skeleton. | +`------------------------*/ + +void scan_skel (FILE *); + +void +scan_skel (FILE *in) +{ + skel_in = in; + skel__flex_debug = trace_flag & trace_skeleton; + skel_lex (); + /* Reclaim Flex's buffers. */ + yy_delete_buffer (YY_CURRENT_BUFFER); +} diff --git a/src/apps/bin/bison/src/state.c b/src/apps/bin/bison/src/state.c new file mode 100644 index 0000000000..445c86fd9b --- /dev/null +++ b/src/apps/bin/bison/src/state.c @@ -0,0 +1,371 @@ +/* Type definitions for nondeterministic finite state machine for Bison. + + Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + +#include "system.h" + +#include + +#include "complain.h" +#include "gram.h" +#include "state.h" + + + /*-------------------. + | Shifts and Gotos. | + `-------------------*/ + + +/*-----------------------------------------. +| Create a new array of NUM shifts/gotos. | +`-----------------------------------------*/ + +static transitions * +transitions_new (int num, state **the_states) +{ + size_t states_size = num * sizeof *the_states; + transitions *res = xmalloc (offsetof (transitions, states) + states_size); + res->num = num; + memcpy (res->states, the_states, states_size); + return res; +} + + +/*-------------------------------------------------------. +| Return the state such that SHIFTS contain a shift/goto | +| to it on SYM. Abort if none found. | +`-------------------------------------------------------*/ + +state * +transitions_to (transitions *shifts, symbol_number sym) +{ + int j; + for (j = 0; j < shifts->num; j++) + if (TRANSITION_SYMBOL (shifts, j) == sym) + return shifts->states[j]; + abort (); +} + + + /*--------------------. + | Error transitions. | + `--------------------*/ + + +/*---------------------------------. +| Create a new array of NUM errs. | +`---------------------------------*/ + +errs * +errs_new (int num, symbol **tokens) +{ + size_t symbols_size = num * sizeof *tokens; + errs *res = xmalloc (offsetof (errs, symbols) + symbols_size); + res->num = num; + memcpy (res->symbols, tokens, symbols_size); + return res; +} + + + + + /*-------------. + | Reductions. | + `-------------*/ + + +/*---------------------------------------. +| Create a new array of NUM reductions. | +`---------------------------------------*/ + +static reductions * +reductions_new (int num, rule **reds) +{ + size_t rules_size = num * sizeof *reds; + reductions *res = xmalloc (offsetof (reductions, rules) + rules_size); + res->num = num; + res->lookaheads = NULL; + memcpy (res->rules, reds, rules_size); + return res; +} + + + + /*---------. + | States. | + `---------*/ + + +state_number nstates = 0; +/* FINAL_STATE is properly set by new_state when it recognizes its + accessing symbol: $end. */ +state *final_state = NULL; + + +/*------------------------------------------------------------------. +| Create a new state with ACCESSING_SYMBOL, for those items. Store | +| it in the state hash table. | +`------------------------------------------------------------------*/ + +state * +state_new (symbol_number accessing_symbol, + size_t nitems, item_number *core) +{ + state *res; + size_t items_size = nitems * sizeof *core; + + if (STATE_NUMBER_MAXIMUM <= nstates) + abort (); + + res = xmalloc (offsetof (state, items) + items_size); + res->number = nstates++; + res->accessing_symbol = accessing_symbol; + res->transitions = NULL; + res->reductions = NULL; + res->errs = NULL; + res->consistent = 0; + res->solved_conflicts = NULL; + + res->nitems = nitems; + memcpy (res->items, core, items_size); + + state_hash_insert (res); + + return res; +} + + +/*---------. +| Free S. | +`---------*/ + +static void +state_free (state *s) +{ + free (s->transitions); + free (s->reductions); + free (s->errs); + free (s); +} + + +/*---------------------------. +| Set the transitions of S. | +`---------------------------*/ + +void +state_transitions_set (state *s, int num, state **trans) +{ + if (s->transitions) + abort (); + s->transitions = transitions_new (num, trans); +} + + +/*--------------------------. +| Set the reductions of S. | +`--------------------------*/ + +void +state_reductions_set (state *s, int num, rule **reds) +{ + if (s->reductions) + abort (); + s->reductions = reductions_new (num, reds); +} + + +int +state_reduction_find (state *s, rule *r) +{ + int i; + reductions *reds = s->reductions; + for (i = 0; i < reds->num; ++i) + if (reds->rules[i] == r) + return i; + return -1; +} + + +/*--------------------. +| Set the errs of S. | +`--------------------*/ + +void +state_errs_set (state *s, int num, symbol **tokens) +{ + if (s->errs) + abort (); + s->errs = errs_new (num, tokens); +} + + + +/*-----------------------------------------------------. +| Print on OUT all the lookaheads such that S wants to | +| reduce R. | +`-----------------------------------------------------*/ + +void +state_rule_lookaheads_print (state *s, rule *r, FILE *out) +{ + /* Find the reduction we are handling. */ + reductions *reds = s->reductions; + int red = state_reduction_find (s, r); + + /* Print them if there are. */ + if (reds->lookaheads && red != -1) + { + bitset_iterator biter; + int k; + char const *sep = ""; + fprintf (out, " ["); + BITSET_FOR_EACH (biter, reds->lookaheads[red], k, 0) + { + fprintf (out, "%s%s", sep, symbols[k]->tag); + sep = ", "; + } + fprintf (out, "]"); + } +} + + +/*----------------------. +| A state hash table. | +`----------------------*/ + +/* Initial capacity of states hash table. */ +#define HT_INITIAL_CAPACITY 257 + +static struct hash_table *state_table = NULL; + +/* Two states are equal if they have the same core items. */ +static inline bool +state_compare (state const *s1, state const *s2) +{ + int i; + + if (s1->nitems != s2->nitems) + return false; + + for (i = 0; i < s1->nitems; ++i) + if (s1->items[i] != s2->items[i]) + return false; + + return true; +} + +static bool +state_comparator (void const *s1, void const *s2) +{ + return state_compare (s1, s2); +} + +static inline size_t +state_hash (state const *s, size_t tablesize) +{ + /* Add up the state's item numbers to get a hash key. */ + size_t key = 0; + int i; + for (i = 0; i < s->nitems; ++i) + key += s->items[i]; + return key % tablesize; +} + +static size_t +state_hasher (void const *s, size_t tablesize) +{ + return state_hash (s, tablesize); +} + + +/*-------------------------------. +| Create the states hash table. | +`-------------------------------*/ + +void +state_hash_new (void) +{ + state_table = hash_initialize (HT_INITIAL_CAPACITY, + NULL, + state_hasher, + state_comparator, + NULL); +} + + +/*---------------------------------------------. +| Free the states hash table, not the states. | +`---------------------------------------------*/ + +void +state_hash_free (void) +{ + hash_free (state_table); +} + + +/*-----------------------------------. +| Insert S in the state hash table. | +`-----------------------------------*/ + +void +state_hash_insert (state *s) +{ + hash_insert (state_table, s); +} + + +/*------------------------------------------------------------------. +| Find the state associated to the CORE, and return it. If it does | +| not exist yet, return NULL. | +`------------------------------------------------------------------*/ + +state * +state_hash_lookup (size_t nitems, item_number *core) +{ + size_t items_size = nitems * sizeof *core; + state *probe = xmalloc (offsetof (state, items) + items_size); + state *entry; + + probe->nitems = nitems; + memcpy (probe->items, core, items_size); + entry = hash_lookup (state_table, probe); + free (probe); + return entry; +} + +/* All the decorated states, indexed by the state number. */ +state **states = NULL; + + +/*----------------------. +| Free all the states. | +`----------------------*/ + +void +states_free (void) +{ + state_number i; + for (i = 0; i < nstates; ++i) + state_free (states[i]); + free (states); +} diff --git a/src/apps/bin/bison/src/state.h b/src/apps/bin/bison/src/state.h new file mode 100644 index 0000000000..2c6c45a54c --- /dev/null +++ b/src/apps/bin/bison/src/state.h @@ -0,0 +1,257 @@ +/* Type definitions for nondeterministic finite state machine for Bison. + + Copyright (C) 1984, 1989, 2000, 2001, 2002, 2003, 2004 Free + Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + +/* These type definitions are used to represent a nondeterministic + finite state machine that parses the specified grammar. This + information is generated by the function generate_states in the + file LR0. + + Each state of the machine is described by a set of items -- + particular positions in particular rules -- that are the possible + places where parsing could continue when the machine is in this + state. These symbols at these items are the allowable inputs that + can follow now. + + A core represents one state. States are numbered in the NUMBER + field. When generate_states is finished, the starting state is + state 0 and NSTATES is the number of states. (FIXME: This sentence + is no longer true: A transition to a state whose state number is + NSTATES indicates termination.) All the cores are chained together + and FIRST_STATE points to the first one (state 0). + + For each state there is a particular symbol which must have been + the last thing accepted to reach that state. It is the + ACCESSING_SYMBOL of the core. + + Each core contains a vector of NITEMS items which are the indices + in the RITEMS vector of the items that are selected in this state. + + The two types of actions are shifts/gotos (push the lookahead token + and read another/goto to the state designated by a nterm) and + reductions (combine the last n things on the stack via a rule, + replace them with the symbol that the rule derives, and leave the + lookahead token alone). When the states are generated, these + actions are represented in two other lists. + + Each transition structure describes the possible transitions out + of one state, the state whose number is in the number field. Each + contains a vector of numbers of the states that transitions can go + to. The accessing_symbol fields of those states' cores say what + kind of input leads to them. + + A transition to state zero should be ignored: conflict resolution + deletes transitions by having them point to zero. + + Each reductions structure describes the possible reductions at the + state whose number is in the number field. The data is a list of + nreds rules, represented by their rule numbers. first_reduction + points to the list of these structures. + + Conflict resolution can decide that certain tokens in certain + states should explicitly be errors (for implementing %nonassoc). + For each state, the tokens that are errors for this reason are + recorded in an errs structure, which holds the token numbers. + + There is at least one goto transition present in state zero. It + leads to a next-to-final state whose accessing_symbol is the + grammar's start symbol. The next-to-final state has one shift to + the final state, whose accessing_symbol is zero (end of input). + The final state has one shift, which goes to the termination state. + The reason for the extra state at the end is to placate the + parser's strategy of making all decisions one token ahead of its + actions. */ + +#ifndef STATE_H_ +# define STATE_H_ + +# include + +# include "gram.h" +# include "symtab.h" + + +/*-------------------. +| Numbering states. | +`-------------------*/ + +typedef short int state_number; +# define STATE_NUMBER_MAXIMUM SHRT_MAX + +/* Be ready to map a state_number to an int. */ +static inline int +state_number_as_int (state_number s) +{ + return s; +} + + +typedef struct state state; + +/*--------------. +| Transitions. | +`--------------*/ + +typedef struct +{ + short int num; + state *states[1]; +} transitions; + + +/* What is the symbol labelling the transition to + TRANSITIONS->states[Num]? Can be a token (amongst which the error + token), or non terminals in case of gotos. */ + +#define TRANSITION_SYMBOL(Transitions, Num) \ + (Transitions->states[Num]->accessing_symbol) + +/* Is the TRANSITIONS->states[Num] a shift? (as opposed to gotos). */ + +#define TRANSITION_IS_SHIFT(Transitions, Num) \ + (ISTOKEN (TRANSITION_SYMBOL (Transitions, Num))) + +/* Is the TRANSITIONS->states[Num] a goto?. */ + +#define TRANSITION_IS_GOTO(Transitions, Num) \ + (!TRANSITION_IS_SHIFT (Transitions, Num)) + +/* Is the TRANSITIONS->states[Num] labelled by the error token? */ + +#define TRANSITION_IS_ERROR(Transitions, Num) \ + (TRANSITION_SYMBOL (Transitions, Num) == errtoken->number) + +/* When resolving a SR conflicts, if the reduction wins, the shift is + disabled. */ + +#define TRANSITION_DISABLE(Transitions, Num) \ + (Transitions->states[Num] = NULL) + +#define TRANSITION_IS_DISABLED(Transitions, Num) \ + (Transitions->states[Num] == NULL) + + +/* Iterate over each transition over a token (shifts). */ +#define FOR_EACH_SHIFT(Transitions, Iter) \ + for (Iter = 0; \ + Iter < Transitions->num \ + && (TRANSITION_IS_DISABLED (Transitions, Iter) \ + || TRANSITION_IS_SHIFT (Transitions, Iter)); \ + ++Iter) \ + if (!TRANSITION_IS_DISABLED (Transitions, Iter)) + + +/* Return the state such SHIFTS contain a shift/goto to it on SYM. + Abort if none found. */ +struct state *transitions_to (transitions *shifts, symbol_number sym); + + +/*-------. +| Errs. | +`-------*/ + +typedef struct +{ + short int num; + symbol *symbols[1]; +} errs; + +errs *errs_new (int num, symbol **tokens); + + +/*-------------. +| Reductions. | +`-------------*/ + +typedef struct +{ + short int num; + bitset *lookaheads; + rule *rules[1]; +} reductions; + + + +/*---------. +| states. | +`---------*/ + +struct state +{ + state_number number; + symbol_number accessing_symbol; + transitions *transitions; + reductions *reductions; + errs *errs; + + /* Nonzero if no lookahead is needed to decide what to do in state S. */ + char consistent; + + /* If some conflicts were solved thanks to precedence/associativity, + a human readable description of the resolution. */ + const char *solved_conflicts; + + /* Its items. Must be last, since ITEMS can be arbitrarily large. + */ + unsigned short int nitems; + item_number items[1]; +}; + +extern state_number nstates; +extern state *final_state; + +/* Create a new state with ACCESSING_SYMBOL for those items. */ +state *state_new (symbol_number accessing_symbol, + size_t core_size, item_number *core); + +/* Set the transitions of STATE. */ +void state_transitions_set (state *s, int num, state **trans); + +/* Set the reductions of STATE. */ +void state_reductions_set (state *s, int num, rule **reds); + +int state_reduction_find (state *s, rule *r); + +/* Set the errs of STATE. */ +void state_errs_set (state *s, int num, symbol **errors); + +/* Print on OUT all the lookaheads such that this STATE wants to + reduce R. */ +void state_rule_lookaheads_print (state *s, rule *r, FILE *out); + +/* Create/destroy the states hash table. */ +void state_hash_new (void); +void state_hash_free (void); + +/* Find the state associated to the CORE, and return it. If it does + not exist yet, return NULL. */ +state *state_hash_lookup (size_t core_size, item_number *core); + +/* Insert STATE in the state hash table. */ +void state_hash_insert (state *s); + +/* All the states, indexed by the state number. */ +extern state **states; + +/* Free all the states. */ +void states_free (void); +#endif /* !STATE_H_ */ diff --git a/src/apps/bin/bison/src/symlist.c b/src/apps/bin/bison/src/symlist.c new file mode 100644 index 0000000000..5b25ac5689 --- /dev/null +++ b/src/apps/bin/bison/src/symlist.c @@ -0,0 +1,115 @@ +/* Lists of symbols for Bison + + Copyright (C) 2002 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include "system.h" + +#include "complain.h" +#include "symlist.h" + + +/*--------------------------------------. +| Create a list containing SYM at LOC. | +`--------------------------------------*/ + +symbol_list * +symbol_list_new (symbol *sym, location loc) +{ + symbol_list *res = MALLOC (res, 1); + res->next = NULL; + res->sym = sym; + res->location = loc; + res->action = NULL; + res->ruleprec = NULL; + res->dprec = 0; + res->merger = 0; + return res; +} + + +/*---------------------------------. +| Prepend SYM at LOC to the LIST. | +`---------------------------------*/ + +symbol_list * +symbol_list_prepend (symbol_list *list, symbol *sym, location loc) +{ + symbol_list *res = symbol_list_new (sym, loc); + res->next = list; + return res; +} + + +/*-------------------------------------------------. +| Free the LIST, but not the symbols it contains. | +`-------------------------------------------------*/ + +void +symbol_list_free (symbol_list *list) +{ + LIST_FREE (symbol_list, list); +} + + +/*--------------------. +| Return its length. | +`--------------------*/ + +unsigned int +symbol_list_length (symbol_list *list) +{ + int res = 0; + for (/* Nothing. */; list; list = list->next) + ++res; + return res; +} + + +/*--------------------------------------------------------------. +| Get the data type (alternative in the union) of the value for | +| symbol N in symbol list RP. | +`--------------------------------------------------------------*/ + +uniqstr +symbol_list_n_type_name_get (symbol_list *rp, location loc, int n) +{ + int i; + + if (n < 0) + { + complain_at (loc, _("invalid $ value")); + return NULL; + } + + i = 0; + + while (i < n) + { + rp = rp->next; + if (rp == NULL || rp->sym == NULL) + { + complain_at (loc, _("invalid $ value")); + return NULL; + } + ++i; + } + + return rp->sym->type_name; +} diff --git a/src/apps/bin/bison/src/symlist.h b/src/apps/bin/bison/src/symlist.h new file mode 100644 index 0000000000..c88c0cae1c --- /dev/null +++ b/src/apps/bin/bison/src/symlist.h @@ -0,0 +1,62 @@ +/* Lists of symbols for Bison + + Copyright (C) 2002 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef SYMLIST_H_ +# define SYMLIST_H_ + +# include "location.h" +# include "symtab.h" + +typedef struct symbol_list +{ + struct symbol_list *next; + symbol *sym; + location location; + + /* The action is attached to the LHS of a rule. */ + const char *action; + location action_location; + + symbol *ruleprec; + int dprec; + int merger; +} symbol_list; + + +/* Create a list containing SYM at LOC. */ +symbol_list *symbol_list_new (symbol *sym, location loc); + +/* Prepend SYM at LOC to the LIST. */ +symbol_list *symbol_list_prepend (symbol_list *list, + symbol *sym, + location loc); + +/* Free the LIST, but not the symbols it contains. */ +void symbol_list_free (symbol_list *list); + +/* Return its length. */ +unsigned int symbol_list_length (symbol_list *list); + +/* Get the data type (alternative in the union) of the value for + symbol N in rule RULE. */ +uniqstr symbol_list_n_type_name_get (symbol_list *rp, location loc, int n); + +#endif /* !SYMLIST_H_ */ diff --git a/src/apps/bin/bison/src/symtab.c b/src/apps/bin/bison/src/symtab.c new file mode 100644 index 0000000000..2a54205193 --- /dev/null +++ b/src/apps/bin/bison/src/symtab.c @@ -0,0 +1,597 @@ +/* Symbol table manager for Bison. + + Copyright (C) 1984, 1989, 2000, 2001, 2002, 2004 Free Software + Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + + +#include "system.h" + +#include +#include + +#include "complain.h" +#include "gram.h" +#include "symtab.h" + +/*------------------------. +| Distinguished symbols. | +`------------------------*/ + +symbol *errtoken = NULL; +symbol *undeftoken = NULL; +symbol *endtoken = NULL; +symbol *accept = NULL; +symbol *startsymbol = NULL; +location startsymbol_location; + +/*---------------------------------. +| Create a new symbol, named TAG. | +`---------------------------------*/ + +static symbol * +symbol_new (uniqstr tag, location loc) +{ + symbol *res = MALLOC (res, 1); + + uniqstr_assert (tag); + res->tag = tag; + res->location = loc; + + res->type_name = NULL; + res->destructor = NULL; + res->printer = NULL; + + res->number = NUMBER_UNDEFINED; + res->prec = 0; + res->assoc = undef_assoc; + res->user_token_number = USER_NUMBER_UNDEFINED; + + res->alias = NULL; + res->class = unknown_sym; + + nsyms++; + return res; +} + + +/*-----------------------------------------------------------------. +| Set the TYPE_NAME associated with SYM. Does nothing if passed 0 | +| as TYPE_NAME. | +`-----------------------------------------------------------------*/ + +void +symbol_type_set (symbol *sym, uniqstr type_name, location loc) +{ + if (type_name) + { + if (sym->type_name) + complain_at (loc, _("type redeclaration for %s"), sym->tag); + uniqstr_assert (type_name); + sym->type_name = type_name; + } +} + + +/*------------------------------------------------------------------. +| Set the DESTRUCTOR associated with SYM. Do nothing if passed 0. | +`------------------------------------------------------------------*/ + +void +symbol_destructor_set (symbol *sym, char *destructor, location loc) +{ + if (destructor) + { + if (sym->destructor) + complain_at (loc, _("%s redeclaration for %s"), + "%destructor", sym->tag); + sym->destructor = destructor; + sym->destructor_location = loc; + } +} + + +/*---------------------------------------------------------------. +| Set the PRINTER associated with SYM. Do nothing if passed 0. | +`---------------------------------------------------------------*/ + +void +symbol_printer_set (symbol *sym, char *printer, location loc) +{ + if (printer) + { + if (sym->printer) + complain_at (loc, _("%s redeclaration for %s"), + "%printer", sym->tag); + sym->printer = printer; + sym->printer_location = loc; + } +} + + +/*-----------------------------------------------------------------. +| Set the PRECEDENCE associated with SYM. Does nothing if invoked | +| with UNDEF_ASSOC as ASSOC. | +`-----------------------------------------------------------------*/ + +void +symbol_precedence_set (symbol *sym, int prec, assoc a, location loc) +{ + if (a != undef_assoc) + { + if (sym->prec != 0) + complain_at (loc, _("redefining precedence of %s"), sym->tag); + sym->prec = prec; + sym->assoc = a; + } + + /* Only terminals have a precedence. */ + symbol_class_set (sym, token_sym, loc); +} + + +/*------------------------------------. +| Set the CLASS associated with SYM. | +`------------------------------------*/ + +void +symbol_class_set (symbol *sym, symbol_class class, location loc) +{ + if (sym->class != unknown_sym && sym->class != class) + complain_at (loc, _("symbol %s redefined"), sym->tag); + + if (class == nterm_sym && sym->class != nterm_sym) + sym->number = nvars++; + else if (class == token_sym && sym->number == NUMBER_UNDEFINED) + sym->number = ntokens++; + + sym->class = class; +} + + +/*------------------------------------------------. +| Set the USER_TOKEN_NUMBER associated with SYM. | +`------------------------------------------------*/ + +void +symbol_user_token_number_set (symbol *sym, int user_token_number, location loc) +{ + if (sym->class != token_sym) + abort (); + + if (sym->user_token_number != USER_NUMBER_UNDEFINED + && sym->user_token_number != user_token_number) + complain_at (loc, _("redefining user token number of %s"), sym->tag); + + sym->user_token_number = user_token_number; + /* User defined $end token? */ + if (user_token_number == 0) + { + endtoken = sym; + endtoken->number = 0; + /* It is always mapped to 0, so it was already counted in + NTOKENS. */ + --ntokens; + } +} + + +/*----------------------------------------------------------. +| If SYM is not defined, report an error, and consider it a | +| nonterminal. | +`----------------------------------------------------------*/ + +static inline bool +symbol_check_defined (symbol *sym) +{ + if (sym->class == unknown_sym) + { + complain_at + (sym->location, + _("symbol %s is used, but is not defined as a token and has no rules"), + sym->tag); + sym->class = nterm_sym; + sym->number = nvars++; + } + + return true; +} + +static bool +symbol_check_defined_processor (void *sym, void *null ATTRIBUTE_UNUSED) +{ + return symbol_check_defined (sym); +} + + +/*------------------------------------------------------------------. +| Declare the new symbol SYM. Make it an alias of SYMVAL, and type | +| SYMVAL with SYM's type. | +`------------------------------------------------------------------*/ + +void +symbol_make_alias (symbol *sym, symbol *symval, location loc) +{ + if (symval->alias) + warn_at (loc, _("symbol `%s' used more than once as a literal string"), + symval->tag); + else if (sym->alias) + warn_at (loc, _("symbol `%s' given more than one literal string"), + sym->tag); + else + { + symval->class = token_sym; + symval->user_token_number = sym->user_token_number; + sym->user_token_number = USER_NUMBER_ALIAS; + symval->alias = sym; + sym->alias = symval; + /* sym and symval combined are only one symbol. */ + nsyms--; + ntokens--; + if (ntokens != sym->number && ntokens != symval->number) + abort (); + sym->number = symval->number = + (symval->number < sym->number) ? symval->number : sym->number; + symbol_type_set (symval, sym->type_name, loc); + } +} + + +/*---------------------------------------------------------. +| Check that THIS, and its alias, have same precedence and | +| associativity. | +`---------------------------------------------------------*/ + +static inline bool +symbol_check_alias_consistency (symbol *this) +{ + /* Check only those who _are_ the aliases. */ + if (this->alias && this->user_token_number == USER_NUMBER_ALIAS) + { + if (this->prec != this->alias->prec) + { + if (this->prec != 0 && this->alias->prec != 0) + complain_at (this->alias->location, + _("conflicting precedences for %s and %s"), + this->tag, this->alias->tag); + if (this->prec != 0) + this->alias->prec = this->prec; + else + this->prec = this->alias->prec; + } + + if (this->assoc != this->alias->assoc) + { + if (this->assoc != undef_assoc && this->alias->assoc != undef_assoc) + complain_at (this->alias->location, + _("conflicting associativities for %s (%s) and %s (%s)"), + this->tag, assoc_to_string (this->assoc), + this->alias->tag, assoc_to_string (this->alias->assoc)); + if (this->assoc != undef_assoc) + this->alias->assoc = this->assoc; + else + this->assoc = this->alias->assoc; + } + } + return true; +} + +static bool +symbol_check_alias_consistency_processor (void *this, + void *null ATTRIBUTE_UNUSED) +{ + return symbol_check_alias_consistency (this); +} + + +/*-------------------------------------------------------------------. +| Assign a symbol number, and write the definition of the token name | +| into FDEFINES. Put in SYMBOLS. | +`-------------------------------------------------------------------*/ + +static inline bool +symbol_pack (symbol *this) +{ + if (this->class == nterm_sym) + { + this->number += ntokens; + } + else if (this->alias) + { + /* This symbol and its alias are a single token defn. + Allocate a tokno, and assign to both check agreement of + prec and assoc fields and make both the same */ + if (this->number == NUMBER_UNDEFINED) + { + if (this == endtoken || this->alias == endtoken) + this->number = this->alias->number = 0; + else + { + if (this->alias->number == NUMBER_UNDEFINED) + abort (); + this->number = this->alias->number; + } + } + /* Do not do processing below for USER_NUMBER_ALIASes. */ + if (this->user_token_number == USER_NUMBER_ALIAS) + return true; + } + else /* this->class == token_sym */ + { + if (this->number == NUMBER_UNDEFINED) + abort (); + } + + symbols[this->number] = this; + return true; +} + +static bool +symbol_pack_processor (void *this, void *null ATTRIBUTE_UNUSED) +{ + return symbol_pack (this); +} + + + + +/*--------------------------------------------------. +| Put THIS in TOKEN_TRANSLATIONS if it is a token. | +`--------------------------------------------------*/ + +static inline bool +symbol_translation (symbol *this) +{ + /* Non-terminal? */ + if (this->class == token_sym + && this->user_token_number != USER_NUMBER_ALIAS) + { + /* A token which translation has already been set? */ + if (token_translations[this->user_token_number] != undeftoken->number) + complain_at (this->location, + _("tokens %s and %s both assigned number %d"), + symbols[token_translations[this->user_token_number]]->tag, + this->tag, this->user_token_number); + + token_translations[this->user_token_number] = this->number; + } + + return true; +} + +static bool +symbol_translation_processor (void *this, void *null ATTRIBUTE_UNUSED) +{ + return symbol_translation (this); +} + + +/*----------------------. +| A symbol hash table. | +`----------------------*/ + +/* Initial capacity of symbols hash table. */ +#define HT_INITIAL_CAPACITY 257 + +static struct hash_table *symbol_table = NULL; + +static inline bool +hash_compare_symbol (const symbol *m1, const symbol *m2) +{ + /* Since tags are unique, we can compare the pointers themselves. */ + return UNIQSTR_EQ (m1->tag, m2->tag); +} + +static bool +hash_symbol_comparator (void const *m1, void const *m2) +{ + return hash_compare_symbol (m1, m2); +} + +static inline size_t +hash_symbol (const symbol *m, size_t tablesize) +{ + /* Since tags are unique, we can hash the pointer itself. */ + return ((uintptr_t) m->tag) % tablesize; +} + +static size_t +hash_symbol_hasher (void const *m, size_t tablesize) +{ + return hash_symbol (m, tablesize); +} + + +/*-------------------------------. +| Create the symbol hash table. | +`-------------------------------*/ + +void +symbols_new (void) +{ + symbol_table = hash_initialize (HT_INITIAL_CAPACITY, + NULL, + hash_symbol_hasher, + hash_symbol_comparator, + free); +} + + +/*----------------------------------------------------------------. +| Find the symbol named KEY, and return it. If it does not exist | +| yet, create it. | +`----------------------------------------------------------------*/ + +symbol * +symbol_get (const char *key, location loc) +{ + symbol probe; + symbol *entry; + + /* Keep the symbol in a printable form. */ + key = uniqstr_new (quotearg_style (escape_quoting_style, key)); + probe.tag = key; + entry = hash_lookup (symbol_table, &probe); + + if (!entry) + { + /* First insertion in the hash. */ + entry = symbol_new (key, loc); + hash_insert (symbol_table, entry); + } + return entry; +} + + +/*------------------------------------------------------------------. +| Generate a dummy nonterminal, whose name cannot conflict with the | +| user's names. | +`------------------------------------------------------------------*/ + +symbol * +dummy_symbol_get (location loc) +{ + /* Incremented for each generated symbol. */ + static int dummy_count = 0; + static char buf[256]; + + symbol *sym; + + sprintf (buf, "@%d", ++dummy_count); + sym = symbol_get (buf, loc); + sym->class = nterm_sym; + sym->number = nvars++; + return sym; +} + + +/*-------------------. +| Free the symbols. | +`-------------------*/ + +void +symbols_free (void) +{ + hash_free (symbol_table); + free (symbols); +} + + +/*---------------------------------------------------------------. +| Look for undefined symbols, report an error, and consider them | +| terminals. | +`---------------------------------------------------------------*/ + +static void +symbols_do (Hash_processor processor, void *processor_data) +{ + hash_do_for_each (symbol_table, processor, processor_data); +} + + +/*--------------------------------------------------------------. +| Check that all the symbols are defined. Report any undefined | +| symbols and consider them nonterminals. | +`--------------------------------------------------------------*/ + +void +symbols_check_defined (void) +{ + symbols_do (symbol_check_defined_processor, NULL); +} + +/*------------------------------------------------------------------. +| Set TOKEN_TRANSLATIONS. Check that no two symbols share the same | +| number. | +`------------------------------------------------------------------*/ + +static void +symbols_token_translations_init (void) +{ + bool num_256_available_p = true; + int i; + + /* Find the highest user token number, and whether 256, the POSIX + preferred user token number for the error token, is used. */ + max_user_token_number = 0; + for (i = 0; i < ntokens; ++i) + { + symbol *this = symbols[i]; + if (this->user_token_number != USER_NUMBER_UNDEFINED) + { + if (this->user_token_number > max_user_token_number) + max_user_token_number = this->user_token_number; + if (this->user_token_number == 256) + num_256_available_p = false; + } + } + + /* If 256 is not used, assign it to error, to follow POSIX. */ + if (num_256_available_p + && errtoken->user_token_number == USER_NUMBER_UNDEFINED) + errtoken->user_token_number = 256; + + /* Set the missing user numbers. */ + if (max_user_token_number < 256) + max_user_token_number = 256; + + for (i = 0; i < ntokens; ++i) + { + symbol *this = symbols[i]; + if (this->user_token_number == USER_NUMBER_UNDEFINED) + this->user_token_number = ++max_user_token_number; + if (this->user_token_number > max_user_token_number) + max_user_token_number = this->user_token_number; + } + + CALLOC (token_translations, max_user_token_number + 1); + + /* Initialize all entries for literal tokens to 2, the internal + token number for $undefined, which represents all invalid inputs. + */ + for (i = 0; i < max_user_token_number + 1; i++) + token_translations[i] = undeftoken->number; + symbols_do (symbol_translation_processor, NULL); +} + + +/*----------------------------------------------------------------. +| Assign symbol numbers, and write definition of token names into | +| FDEFINES. Set up vectors SYMBOL_TABLE, TAGS of symbols. | +`----------------------------------------------------------------*/ + +void +symbols_pack (void) +{ + CALLOC (symbols, nsyms); + + symbols_do (symbol_check_alias_consistency_processor, NULL); + symbols_do (symbol_pack_processor, NULL); + + symbols_token_translations_init (); + + if (startsymbol->class == unknown_sym) + fatal_at (startsymbol_location, + _("the start symbol %s is undefined"), + startsymbol->tag); + else if (startsymbol->class == token_sym) + fatal_at (startsymbol_location, + _("the start symbol %s is a token"), + startsymbol->tag); +} diff --git a/src/apps/bin/bison/src/symtab.h b/src/apps/bin/bison/src/symtab.h new file mode 100644 index 0000000000..42c8ffb82a --- /dev/null +++ b/src/apps/bin/bison/src/symtab.h @@ -0,0 +1,149 @@ +/* Definitions for symtab.c and callers, part of Bison. + + Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002, 2004 + Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef SYMTAB_H_ +# define SYMTAB_H_ + +# include "assoc.h" +# include "location.h" +# include "uniqstr.h" + +/*----------. +| Symbols. | +`----------*/ + +/* Symbol classes. */ +typedef enum +{ + unknown_sym, + token_sym, /* terminal symbol */ + nterm_sym /* non-terminal */ +} symbol_class; + + +/* Internal token numbers. */ +typedef short int symbol_number; +#define SYMBOL_NUMBER_MAXIMUM SHRT_MAX + + +typedef struct symbol symbol; +struct symbol +{ + /* The key, name of the symbol. */ + uniqstr tag; + /* The location of its first occurrence. */ + location location; + + /* Its %type and associated printer and destructor. */ + uniqstr type_name; + char *destructor; + location destructor_location; + char *printer; + location printer_location; + + symbol_number number; + short int prec; + assoc assoc; + int user_token_number; + + /* Points to the other in the identifier-symbol pair for an alias. + Special value USER_NUMBER_ALIAS in the identifier half of the + identifier-symbol pair for an alias. */ + symbol *alias; + symbol_class class; +}; + +/* Undefined user number. */ +#define USER_NUMBER_UNDEFINED -1 + +/* `symbol->user_token_number == USER_NUMBER_ALIAS' means this symbol + *has* (not is) a string literal alias. For instance, `%token foo + "foo"' has `"foo"' numbered regularly, and `foo' numbered as + USER_NUMBER_ALIAS. */ +#define USER_NUMBER_ALIAS -9991 + +/* Undefined internal token number. */ +#define NUMBER_UNDEFINED (-1) + + +/* Fetch (or create) the symbol associated to KEY. */ +symbol *symbol_get (const char *key, location loc); + +/* Generate a dummy nonterminal, whose name cannot conflict with the + user's names. */ +symbol *dummy_symbol_get (location loc); + +/* Declare the new symbol SYM. Make it an alias of SYMVAL. */ +void symbol_make_alias (symbol *sym, symbol *symval, location loc); + +/* Set the TYPE_NAME associated with SYM. Do nothing if passed 0 as + TYPE_NAME. */ +void symbol_type_set (symbol *sym, uniqstr type_name, location loc); + +/* Set the DESTRUCTOR associated with SYM. */ +void symbol_destructor_set (symbol *sym, char *destructor, location loc); + +/* Set the PRINTER associated with SYM. */ +void symbol_printer_set (symbol *sym, char *printer, location loc); + +/* Set the PRECEDENCE associated with SYM. Ensure that SYMBOL is a + terminal. Do nothing if invoked with UNDEF_ASSOC as ASSOC. */ +void symbol_precedence_set (symbol *sym, int prec, assoc a, location loc); + +/* Set the CLASS associated with SYM. */ +void symbol_class_set (symbol *sym, symbol_class class, location loc); + +/* Set the USER_TOKEN_NUMBER associated with SYM. */ +void symbol_user_token_number_set (symbol *sym, int user_number, location loc); + + +/* Distinguished symbols. AXIOM is the real start symbol, that used + by the automaton. STARTSYMBOL is the one specified by the user. + */ +extern symbol *errtoken; +extern symbol *undeftoken; +extern symbol *endtoken; +extern symbol *accept; +extern symbol *startsymbol; +extern location startsymbol_location; + + +/*---------------. +| Symbol table. | +`---------------*/ + + +/* Create the symbol table. */ +void symbols_new (void); + +/* Free all the memory allocated for symbols. */ +void symbols_free (void); + +/* Check that all the symbols are defined. Report any undefined + symbols and consider them nonterminals. */ +void symbols_check_defined (void); + +/* Perform various sanity checks, assign symbol numbers, and set up + TOKEN_TRANSLATIONS. */ +void symbols_pack (void); + +#endif /* !SYMTAB_H_ */ diff --git a/src/apps/bin/bison/src/system.h b/src/apps/bin/bison/src/system.h new file mode 100644 index 0000000000..62640c5cc9 --- /dev/null +++ b/src/apps/bin/bison/src/system.h @@ -0,0 +1,222 @@ +/* System-dependent definitions for Bison. + + Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program; if not, write to the Free Software Foundation, + Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ + +#ifndef BISON_SYSTEM_H +#define BISON_SYSTEM_H + +#if HAVE_CONFIG_H +# include +#endif + +#include +#include +#include +#include +#include + +/* Verify a requirement at compile-time (unlike assert, which is runtime). */ +#define verify(name, assertion) struct name {char name[(assertion) ? 1 : -1];} + +#if HAVE_SYS_TYPES_H +# include +#endif + +#if HAVE_UNISTD_H +# include +#endif + +#if HAVE_INTTYPES_H +# include +#endif +#if HAVE_STDINT_H +# include +#endif + +#if ! HAVE_UINTPTR_T +/* This isn't perfect, but it's good enough for Bison, which needs + only to hash pointers. */ +typedef size_t uintptr_t; +#endif + +#include +#define CALLOC(P, N) ((P) = xcalloc (N, sizeof *(P))) +#define MALLOC(P, N) ((P) = xnmalloc (N, sizeof *(P))) +#define REALLOC(P, N) ((P) = xnrealloc (P, N, sizeof *(P))) + + +/*---------------------. +| Missing prototypes. | +`---------------------*/ + +#include + + +/*-----------------. +| GCC extensions. | +`-----------------*/ + +/* Use this to suppress gcc's `...may be used before initialized' + warnings. */ +#ifdef lint +# define IF_LINT(Code) Code +#else +# define IF_LINT(Code) /* empty */ +#endif + +#ifndef __attribute__ +/* This feature is available in gcc versions 2.5 and later. */ +# if !defined (__GNUC__) || __GNUC__ < 2 || \ +(__GNUC__ == 2 && __GNUC_MINOR__ < 5) || __STRICT_ANSI__ +# define __attribute__(Spec) /* empty */ +# endif +#endif + +/* The __-protected variants of `format' and `printf' attributes + are accepted by gcc versions 2.6.4 (effectively 2.7) and later. */ +#if __GNUC__ < 2 || (__GNUC__ == 2 && __GNUC_MINOR__ < 7) +# define __format__ format +# define __printf__ printf +#endif + +#ifndef ATTRIBUTE_NORETURN +# define ATTRIBUTE_NORETURN __attribute__ ((__noreturn__)) +#endif + +#ifndef ATTRIBUTE_UNUSED +# define ATTRIBUTE_UNUSED __attribute__ ((__unused__)) +#endif + +/*------. +| NLS. | +`------*/ + +#include + +#include +#define _(Msgid) gettext (Msgid) +#define N_(Msgid) (Msgid) + + +/*-------------------------------. +| Fix broken compilation flags. | +`-------------------------------*/ + +#ifndef LOCALEDIR +# define LOCALEDIR "/usr/local/share/locale" +#endif + + +/*-----------. +| Booleans. | +`-----------*/ + +#include + + +/*-----------. +| Obstacks. | +`-----------*/ + +# define obstack_chunk_alloc xmalloc +# define obstack_chunk_free free +# include + +#define obstack_sgrow(Obs, Str) \ + obstack_grow (Obs, Str, strlen (Str)) + +#define obstack_fgrow1(Obs, Format, Arg1) \ +do { \ + char buf[4096]; \ + sprintf (buf, Format, Arg1); \ + obstack_grow (Obs, buf, strlen (buf)); \ +} while (0) + +#define obstack_fgrow2(Obs, Format, Arg1, Arg2) \ +do { \ + char buf[4096]; \ + sprintf (buf, Format, Arg1, Arg2); \ + obstack_grow (Obs, buf, strlen (buf)); \ +} while (0) + +#define obstack_fgrow3(Obs, Format, Arg1, Arg2, Arg3) \ +do { \ + char buf[4096]; \ + sprintf (buf, Format, Arg1, Arg2, Arg3); \ + obstack_grow (Obs, buf, strlen (buf)); \ +} while (0) + +#define obstack_fgrow4(Obs, Format, Arg1, Arg2, Arg3, Arg4) \ +do { \ + char buf[4096]; \ + sprintf (buf, Format, Arg1, Arg2, Arg3, Arg4); \ + obstack_grow (Obs, buf, strlen (buf)); \ +} while (0) + + + +/*-----------------------------------------. +| Extensions to use for the output files. | +`-----------------------------------------*/ + +#ifdef VMS + /* VMS. */ +# define TAB_EXT "_tab" +# define OUTPUT_EXT ".output" +#else /* ! VMS */ +# ifdef MSDOS + /* MS DOS. */ +# define TAB_EXT "_tab" +# define OUTPUT_EXT ".out" +# else /* ! MSDOS */ + /* Standard. */ +# define TAB_EXT ".tab" +# define OUTPUT_EXT ".output" +# endif /* ! MSDOS */ +#endif /* ! VMS */ + +#ifndef DEFAULT_TMPDIR +# define DEFAULT_TMPDIR "/tmp" +#endif + + + +/*---------------------. +| Free a linked list. | +`---------------------*/ + +#define LIST_FREE(Type, List) \ +do { \ + Type *_node, *_next; \ + for (_node = List; _node; _node = _next) \ + { \ + _next = _node->next; \ + XFREE (_node); \ + } \ +} while (0) + + +/*---------------------------------------------. +| Debugging memory allocation (must be last). | +`---------------------------------------------*/ + +# if WITH_DMALLOC +# define DMALLOC_FUNC_CHECK +# include +# endif /* WITH_DMALLOC */ + +#endif /* ! BISON_SYSTEM_H */ diff --git a/src/apps/bin/bison/src/tables.c b/src/apps/bin/bison/src/tables.c new file mode 100644 index 0000000000..af5a5cb57b --- /dev/null +++ b/src/apps/bin/bison/src/tables.c @@ -0,0 +1,861 @@ +/* Output the generated parsing program for Bison. + + Copyright (C) 1984, 1986, 1989, 1992, 2000, 2001, 2002, 2003, 2004 + Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + + +#include "system.h" + +#include +#include + +#include "complain.h" +#include "conflicts.h" +#include "files.h" +#include "getargs.h" +#include "gram.h" +#include "lalr.h" +#include "reader.h" +#include "symtab.h" +#include "tables.h" + +/* Several tables are indexed both by state and nonterminal numbers. + We call such an index a `vector'; i.e., a vector is either a state + or a nonterminal number. + + Of course vector_number_t ought to be wide enough to contain + state_number and symbol_number. */ +typedef short int vector_number; + +static inline vector_number +state_number_to_vector_number (state_number s) +{ + return s; +} + +static inline vector_number +symbol_number_to_vector_number (symbol_number sym) +{ + return state_number_as_int (nstates) + sym - ntokens; +} + +int nvectors; + + +/* FROMS and TOS are indexed by vector_number. + + If VECTOR is a nonterminal, (FROMS[VECTOR], TOS[VECTOR]) form an + array of state numbers of the non defaulted GOTO on VECTOR. + + If VECTOR is a state, TOS[VECTOR] is the array of actions to do on + the (array of) symbols FROMS[VECTOR]. + + In both cases, TALLY[VECTOR] is the size of the arrays + FROMS[VECTOR], TOS[VECTOR]; and WIDTH[VECTOR] = + (FROMS[VECTOR][SIZE] - FROMS[VECTOR][0] + 1) where SIZE = + TALLY[VECTOR]. + + FROMS therefore contains symbol_number and action_number, + TOS state_number and action_number, + TALLY sizes, + WIDTH differences of FROMS. + + Let base_number be the type of FROMS, TOS, and WIDTH. */ +#define BASE_MAXIMUM INT_MAX +#define BASE_MINIMUM INT_MIN + +static base_number **froms = NULL; +static base_number **tos = NULL; +static unsigned int **conflict_tos = NULL; +static short int *tally = NULL; +static base_number *width = NULL; + + +/* For a given state, N = ACTROW[SYMBOL]: + + If N = 0, stands for `run the default action'. + If N = MIN, stands for `raise a syntax error'. + If N > 0, stands for `shift SYMBOL and go to n'. + If N < 0, stands for `reduce -N'. */ +typedef short int action_number; +#define ACTION_NUMBER_MINIMUM SHRT_MIN + +static action_number *actrow = NULL; + +/* FROMS and TOS are reordered to be compressed. ORDER[VECTOR] is the + new vector number of VECTOR. We skip `empty' vectors (i.e., + TALLY[VECTOR] = 0), and call these `entries'. */ +static vector_number *order = NULL; +static int nentries; + +base_number *base = NULL; +/* A distinguished value of BASE, negative infinite. During the + computation equals to BASE_MINIMUM, later mapped to BASE_NINF to + keep parser tables small. */ +base_number base_ninf = 0; +static base_number *pos = NULL; + +static unsigned int *conflrow = NULL; +unsigned int *conflict_table = NULL; +unsigned int *conflict_list = NULL; +int conflict_list_cnt; +static int conflict_list_free; + +/* TABLE_SIZE is the allocated size of both TABLE and CHECK. We start + with more or less the original hard-coded value (which was + SHRT_MAX). */ +static int table_size = 32768; +base_number *table = NULL; +base_number *check = NULL; +/* The value used in TABLE to denote explicit syntax errors + (%nonassoc), a negative infinite. First defaults to ACTION_NUMBER_MININUM, + but in order to keep small tables, renumbered as TABLE_ERROR, which + is the smallest (non error) value minus 1. */ +base_number table_ninf = 0; +static int lowzero; +int high; + +state_number *yydefgoto; +rule_number *yydefact; + +/*----------------------------------------------------------------. +| If TABLE (and CHECK) appear to be small to be addressed at | +| DESIRED, grow them. Note that TABLE[DESIRED] is to be used, so | +| the desired size is at least DESIRED + 1. | +`----------------------------------------------------------------*/ + +static void +table_grow (int desired) +{ + int old_size = table_size; + + while (table_size <= desired) + table_size *= 2; + + if (trace_flag & trace_resource) + fprintf (stderr, "growing table and check from: %d to %d\n", + old_size, table_size); + + REALLOC (table, table_size); + REALLOC (check, table_size); + REALLOC (conflict_table, table_size); + + for (/* Nothing. */; old_size < table_size; ++old_size) + { + table[old_size] = 0; + check[old_size] = -1; + } +} + + + + +/*-------------------------------------------------------------------. +| For GLR parsers, for each conflicted token in S, as indicated | +| by non-zero entries in CONFLROW, create a list of possible | +| reductions that are alternatives to the shift or reduction | +| currently recorded for that token in S. Store the alternative | +| reductions followed by a 0 in CONFLICT_LIST, updating | +| CONFLICT_LIST_CNT, and storing an index to the start of the list | +| back into CONFLROW. | +`-------------------------------------------------------------------*/ + +static void +conflict_row (state *s) +{ + int i, j; + reductions *reds = s->reductions; + + if (!nondeterministic_parser) + return; + + for (j = 0; j < ntokens; j += 1) + if (conflrow[j]) + { + conflrow[j] = conflict_list_cnt; + + /* Find all reductions for token J, and record all that do not + match ACTROW[J]. */ + for (i = 0; i < reds->num; i += 1) + if (bitset_test (reds->lookaheads[i], j) + && (actrow[j] + != rule_number_as_item_number (reds->rules[i]->number))) + { + if (conflict_list_free <= 0) + abort (); + conflict_list[conflict_list_cnt] = reds->rules[i]->number + 1; + conflict_list_cnt += 1; + conflict_list_free -= 1; + } + + /* Leave a 0 at the end. */ + if (conflict_list_free <= 0) + abort (); + conflict_list_cnt += 1; + conflict_list_free -= 1; + } +} + + +/*------------------------------------------------------------------. +| Decide what to do for each type of token if seen as the lookahead | +| token in specified state. The value returned is used as the | +| default action (yydefact) for the state. In addition, ACTROW is | +| filled with what to do for each kind of token, index by symbol | +| number, with zero meaning do the default action. The value | +| ACTION_NUMBER_MINIMUM, a very negative number, means this | +| situation is an error. The parser recognizes this value | +| specially. | +| | +| This is where conflicts are resolved. The loop over lookahead | +| rules considered lower-numbered rules last, and the last rule | +| considered that likes a token gets to handle it. | +| | +| For GLR parsers, also sets CONFLROW[SYM] to an index into | +| CONFLICT_LIST iff there is an unresolved conflict (s/r or r/r) | +| with symbol SYM. The default reduction is not used for a symbol | +| that has any such conflicts. | +`------------------------------------------------------------------*/ + +static rule * +action_row (state *s) +{ + int i; + rule *default_rule = NULL; + reductions *reds = s->reductions; + transitions *trans = s->transitions; + errs *errp = s->errs; + /* Set to nonzero to inhibit having any default reduction. */ + bool nodefault = false; + bool conflicted = false; + + for (i = 0; i < ntokens; i++) + actrow[i] = conflrow[i] = 0; + + if (reds->lookaheads) + { + int j; + bitset_iterator biter; + /* loop over all the rules available here which require + lookahead (in reverse order to give precedence to the first + rule) */ + for (i = reds->num - 1; i >= 0; --i) + /* and find each token which the rule finds acceptable + to come next */ + BITSET_FOR_EACH (biter, reds->lookaheads[i], j, 0) + { + /* and record this rule as the rule to use if that + token follows. */ + if (actrow[j] != 0) + { + conflicted = true; + conflrow[j] = 1; + } + actrow[j] = rule_number_as_item_number (reds->rules[i]->number); + } + } + + /* Now see which tokens are allowed for shifts in this state. For + them, record the shift as the thing to do. So shift is preferred + to reduce. */ + FOR_EACH_SHIFT (trans, i) + { + symbol_number sym = TRANSITION_SYMBOL (trans, i); + state *shift_state = trans->states[i]; + + if (actrow[sym] != 0) + { + conflicted = true; + conflrow[sym] = 1; + } + actrow[sym] = state_number_as_int (shift_state->number); + + /* Do not use any default reduction if there is a shift for + error */ + if (sym == errtoken->number) + nodefault = true; + } + + /* See which tokens are an explicit error in this state (due to + %nonassoc). For them, record ACTION_NUMBER_MINIMUM as the + action. */ + for (i = 0; i < errp->num; i++) + { + symbol *sym = errp->symbols[i]; + actrow[sym->number] = ACTION_NUMBER_MINIMUM; + } + + /* Now find the most common reduction and make it the default action + for this state. */ + + if (reds->num >= 1 && !nodefault) + { + if (s->consistent) + default_rule = reds->rules[0]; + else + { + int max = 0; + for (i = 0; i < reds->num; i++) + { + int count = 0; + rule *r = reds->rules[i]; + symbol_number j; + + for (j = 0; j < ntokens; j++) + if (actrow[j] == rule_number_as_item_number (r->number)) + count++; + + if (count > max) + { + max = count; + default_rule = r; + } + } + + /* GLR parsers need space for conflict lists, so we can't + default conflicted entries. For non-conflicted entries + or as long as we are not building a GLR parser, + actions that match the default are replaced with zero, + which means "use the default". */ + + if (max > 0) + { + int j; + for (j = 0; j < ntokens; j++) + if (actrow[j] == rule_number_as_item_number (default_rule->number) + && ! (nondeterministic_parser && conflrow[j])) + actrow[j] = 0; + } + } + } + + /* If have no default rule, the default is an error. + So replace any action which says "error" with "use default". */ + + if (!default_rule) + for (i = 0; i < ntokens; i++) + if (actrow[i] == ACTION_NUMBER_MINIMUM) + actrow[i] = 0; + + if (conflicted) + conflict_row (s); + + return default_rule; +} + + +/*----------------------------------------. +| Set FROMS, TOS, TALLY and WIDTH for S. | +`----------------------------------------*/ + +static void +save_row (state_number s) +{ + symbol_number i; + int count; + base_number *sp; + base_number *sp1; + base_number *sp2; + unsigned int *sp3 IF_LINT (= NULL); + + /* Number of non default actions in S. */ + count = 0; + for (i = 0; i < ntokens; i++) + if (actrow[i] != 0) + count++; + + if (count == 0) + return; + + /* Allocate non defaulted actions. */ + froms[s] = sp = CALLOC (sp1, count); + tos[s] = CALLOC (sp2, count); + conflict_tos[s] = nondeterministic_parser ? CALLOC (sp3, count) : NULL; + + /* Store non defaulted actions. */ + for (i = 0; i < ntokens; i++) + if (actrow[i] != 0) + { + *sp1++ = i; + *sp2++ = actrow[i]; + if (nondeterministic_parser) + *sp3++ = conflrow[i]; + } + + tally[s] = count; + width[s] = sp1[-1] - sp[0] + 1; +} + + +/*------------------------------------------------------------------. +| Figure out the actions for the specified state, indexed by | +| lookahead token type. | +| | +| The YYDEFACT table is output now. The detailed info is saved for | +| putting into YYTABLE later. | +`------------------------------------------------------------------*/ + +static void +token_actions (void) +{ + state_number i; + symbol_number j; + rule_number r; + + int nconflict = nondeterministic_parser ? conflicts_total_count () : 0; + + CALLOC (yydefact, nstates); + + CALLOC (actrow, ntokens); + CALLOC (conflrow, ntokens); + + CALLOC (conflict_list, 1 + 2 * nconflict); + conflict_list_free = 2 * nconflict; + conflict_list_cnt = 1; + + /* Find the rules which are reduced. */ + if (!nondeterministic_parser) + for (r = 0; r < nrules; ++r) + rules[r].useful = false; + + for (i = 0; i < nstates; ++i) + { + rule *default_rule = action_row (states[i]); + yydefact[i] = default_rule ? default_rule->number + 1 : 0; + save_row (i); + + /* Now that the parser was computed, we can find which rules are + really reduced, and which are not because of SR or RR + conflicts. */ + if (!nondeterministic_parser) + { + for (j = 0; j < ntokens; ++j) + if (actrow[j] < 0 && actrow[j] != ACTION_NUMBER_MINIMUM) + rules[item_number_as_rule_number (actrow[j])].useful = true; + if (yydefact[i]) + rules[yydefact[i] - 1].useful = true; + } + } + + free (actrow); + free (conflrow); +} + + +/*------------------------------------------------------------------. +| Compute FROMS[VECTOR], TOS[VECTOR], TALLY[VECTOR], WIDTH[VECTOR], | +| i.e., the information related to non defaulted GOTO on the nterm | +| SYM. | +| | +| DEFAULT_STATE is the principal destination on SYM, i.e., the | +| default GOTO destination on SYM. | +`------------------------------------------------------------------*/ + +static void +save_column (symbol_number sym, state_number default_state) +{ + int i; + base_number *sp; + base_number *sp1; + base_number *sp2; + int count; + vector_number symno = symbol_number_to_vector_number (sym); + + goto_number begin = goto_map[sym - ntokens]; + goto_number end = goto_map[sym - ntokens + 1]; + + /* Number of non default GOTO. */ + count = 0; + for (i = begin; i < end; i++) + if (to_state[i] != default_state) + count++; + + if (count == 0) + return; + + /* Allocate room for non defaulted gotos. */ + froms[symno] = sp = CALLOC (sp1, count); + tos[symno] = CALLOC (sp2, count); + + /* Store the state numbers of the non defaulted gotos. */ + for (i = begin; i < end; i++) + if (to_state[i] != default_state) + { + *sp1++ = from_state[i]; + *sp2++ = to_state[i]; + } + + tally[symno] = count; + width[symno] = sp1[-1] - sp[0] + 1; +} + + +/*-------------------------------------------------------------. +| Return `the' most common destination GOTO on SYM (a nterm). | +`-------------------------------------------------------------*/ + +static state_number +default_goto (symbol_number sym, short int state_count[]) +{ + state_number s; + int i; + goto_number m = goto_map[sym - ntokens]; + goto_number n = goto_map[sym - ntokens + 1]; + state_number default_state = -1; + int max = 0; + + if (m == n) + return -1; + + for (s = 0; s < nstates; s++) + state_count[s] = 0; + + for (i = m; i < n; i++) + state_count[to_state[i]]++; + + for (s = 0; s < nstates; s++) + if (state_count[s] > max) + { + max = state_count[s]; + default_state = s; + } + + return default_state; +} + + +/*-------------------------------------------------------------------. +| Figure out what to do after reducing with each rule, depending on | +| the saved state from before the beginning of parsing the data that | +| matched this rule. | +| | +| The YYDEFGOTO table is output now. The detailed info is saved for | +| putting into YYTABLE later. | +`-------------------------------------------------------------------*/ + +static void +goto_actions (void) +{ + symbol_number i; + short int *state_count = CALLOC (state_count, nstates); + MALLOC (yydefgoto, nvars); + + /* For a given nterm I, STATE_COUNT[S] is the number of times there + is a GOTO to S on I. */ + for (i = ntokens; i < nsyms; ++i) + { + state_number default_state = default_goto (i, state_count); + save_column (i, default_state); + yydefgoto[i - ntokens] = default_state; + } + free (state_count); +} + + +/*------------------------------------------------------------------. +| Compute ORDER, a reordering of vectors, in order to decide how to | +| pack the actions and gotos information into yytable. | +`------------------------------------------------------------------*/ + +static void +sort_actions (void) +{ + int i; + + nentries = 0; + + for (i = 0; i < nvectors; i++) + if (tally[i] > 0) + { + int k; + int t = tally[i]; + int w = width[i]; + int j = nentries - 1; + + while (j >= 0 && (width[order[j]] < w)) + j--; + + while (j >= 0 && (width[order[j]] == w) && (tally[order[j]] < t)) + j--; + + for (k = nentries - 1; k > j; k--) + order[k + 1] = order[k]; + + order[j + 1] = i; + nentries++; + } +} + + +/* If VECTOR is a state which actions (reflected by FROMS, TOS, TALLY + and WIDTH of VECTOR) are common to a previous state, return this + state number. + + In any other case, return -1. */ + +static state_number +matching_state (vector_number vector) +{ + vector_number i = order[vector]; + int t; + int w; + int prev; + + /* If VECTOR is a nterm, return -1. */ + if (nstates <= i) + return -1; + + t = tally[i]; + w = width[i]; + + /* If VECTOR has GLR conflicts, return -1 */ + if (conflict_tos[i] != NULL) + { + int j; + for (j = 0; j < t; j += 1) + if (conflict_tos[i][j] != 0) + return -1; + } + + for (prev = vector - 1; prev >= 0; prev--) + { + vector_number j = order[prev]; + int k; + int match = 1; + + /* Given how ORDER was computed, if the WIDTH or TALLY is + different, there cannot be a matching state. */ + if (width[j] != w || tally[j] != t) + return -1; + + for (k = 0; match && k < t; k++) + if (tos[j][k] != tos[i][k] || froms[j][k] != froms[i][k] + || (conflict_tos[j] != NULL && conflict_tos[j][k] != 0)) + match = 0; + + if (match) + return j; + } + + return -1; +} + + +static base_number +pack_vector (vector_number vector) +{ + vector_number i = order[vector]; + int j; + int t = tally[i]; + int loc = 0; + base_number *from = froms[i]; + base_number *to = tos[i]; + unsigned int *conflict_to = conflict_tos[i]; + + if (!t) + abort (); + + for (j = lowzero - from[0]; ; j++) + { + int k; + bool ok = true; + + if (table_size <= j) + abort (); + + for (k = 0; ok && k < t; k++) + { + loc = j + state_number_as_int (from[k]); + if (table_size <= loc) + table_grow (loc); + + if (table[loc] != 0) + ok = false; + } + + for (k = 0; ok && k < vector; k++) + if (pos[k] == j) + ok = false; + + if (ok) + { + for (k = 0; k < t; k++) + { + loc = j + from[k]; + table[loc] = to[k]; + if (nondeterministic_parser && conflict_to != NULL) + conflict_table[loc] = conflict_to[k]; + check[loc] = from[k]; + } + + while (table[lowzero] != 0) + lowzero++; + + if (loc > high) + high = loc; + + if (! (BASE_MINIMUM <= j && j <= BASE_MAXIMUM)) + abort (); + return j; + } + } +} + + +/*-------------------------------------------------------------. +| Remap the negative infinite in TAB from NINF to the greatest | +| possible smallest value. Return it. | +| | +| In most case this allows us to use shorts instead of ints in | +| parsers. | +`-------------------------------------------------------------*/ + +static base_number +table_ninf_remap (base_number tab[], int size, base_number ninf) +{ + base_number res = 0; + int i; + + for (i = 0; i < size; i++) + if (tab[i] < res && tab[i] != ninf) + res = tab[i]; + + --res; + + for (i = 0; i < size; i++) + if (tab[i] == ninf) + tab[i] = res; + + return res; +} + +static void +pack_table (void) +{ + int i; + + CALLOC (base, nvectors); + CALLOC (pos, nentries); + CALLOC (table, table_size); + CALLOC (conflict_table, table_size); + CALLOC (check, table_size); + + lowzero = 0; + high = 0; + + for (i = 0; i < nvectors; i++) + base[i] = BASE_MINIMUM; + + for (i = 0; i < table_size; i++) + check[i] = -1; + + for (i = 0; i < nentries; i++) + { + state_number s = matching_state (i); + base_number place; + + if (s < 0) + /* A new set of state actions, or a nonterminal. */ + place = pack_vector (i); + else + /* Action of I were already coded for S. */ + place = base[s]; + + pos[i] = place; + base[order[i]] = place; + } + + /* Use the greatest possible negative infinites. */ + base_ninf = table_ninf_remap (base, nvectors, BASE_MINIMUM); + table_ninf = table_ninf_remap (table, high + 1, ACTION_NUMBER_MINIMUM); + + free (pos); +} + + + +/*-----------------------------------------------------------------. +| Compute and output yydefact, yydefgoto, yypact, yypgoto, yytable | +| and yycheck. | +`-----------------------------------------------------------------*/ + +void +tables_generate (void) +{ + int i; + + /* This is a poor way to make sure the sizes are properly + correlated. In particular the signedness is not taken into + account. But it's not useless. */ + verify (sizes_are_properly_correlated, + (sizeof nstates <= sizeof nvectors + && sizeof nvars <= sizeof nvectors)); + + nvectors = state_number_as_int (nstates) + nvars; + + CALLOC (froms, nvectors); + CALLOC (tos, nvectors); + CALLOC (conflict_tos, nvectors); + CALLOC (tally, nvectors); + CALLOC (width, nvectors); + + token_actions (); + + goto_actions (); + free (goto_map); + free (from_state); + free (to_state); + + CALLOC (order, nvectors); + sort_actions (); + pack_table (); + free (order); + + free (tally); + free (width); + + for (i = 0; i < nvectors; i++) + { + free (froms[i]); + free (tos[i]); + XFREE (conflict_tos[i]); + } + + free (froms); + free (tos); + free (conflict_tos); +} + + +/*-------------------------. +| Free the parser tables. | +`-------------------------*/ + +void +tables_free (void) +{ + free (base); + free (conflict_table); + free (conflict_list); + free (table); + free (check); + free (yydefgoto); + free (yydefact); +} diff --git a/src/apps/bin/bison/src/tables.h b/src/apps/bin/bison/src/tables.h new file mode 100644 index 0000000000..cda1e67d8c --- /dev/null +++ b/src/apps/bin/bison/src/tables.h @@ -0,0 +1,119 @@ +/* Prepare the LALR and GLR parser tables. + Copyright (C) 2002 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify it + under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, but + WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to the Free + Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA + 02111-1307, USA. */ + +#ifndef TABLES_H_ +# define TABLES_H_ + +# include "state.h" + +/* The parser tables consist of these tables. + + YYTRANSLATE = vector mapping yylex's token numbers into bison's + token numbers. + + YYTNAME = vector of string-names indexed by bison token number. + + YYTOKNUM = vector of yylex token numbers corresponding to entries + in YYTNAME. + + YYRLINE = vector of line-numbers of all rules. For yydebug + printouts. + + YYRHS = vector of items of all rules. This is exactly what RITEMS + contains. For yydebug and for semantic parser. + + YYPRHS[R] = index in YYRHS of first item for rule R. + + YYR1[R] = symbol number of symbol that rule R derives. + + YYR2[R] = number of symbols composing right hand side of rule R. + + YYSTOS[S] = the symbol number of the symbol that leads to state S. + + YYDEFACT[S] = default rule to reduce with in state s, when YYTABLE + doesn't specify something else to do. Zero means the default is an + error. + + YYDEFGOTO[I] = default state to go to after a reduction of a rule + that generates variable NTOKENS + I, except when YYTABLE specifies + something else to do. + + YYPACT[S] = index in YYTABLE of the portion describing state S. + The lookahead token's type is used to index that portion to find + out what to do. + + If the value in YYTABLE is positive, we shift the token and go to + that state. + + If the value is negative, it is minus a rule number to reduce by. + + If the value is zero, the default action from YYDEFACT[S] is used. + + YYPGOTO[I] = the index in YYTABLE of the portion describing what to + do after reducing a rule that derives variable I + NTOKENS. This + portion is indexed by the parser state number, S, as of before the + text for this nonterminal was read. The value from YYTABLE is the + state to go to if the corresponding value in YYCHECK is S. + + YYTABLE = a vector filled with portions for different uses, found + via YYPACT and YYPGOTO. + + YYCHECK = a vector indexed in parallel with YYTABLE. It indicates, + in a roundabout way, the bounds of the portion you are trying to + examine. + + Suppose that the portion of YYTABLE starts at index P and the index + to be examined within the portion is I. Then if YYCHECK[P+I] != I, + I is outside the bounds of what is actually allocated, and the + default (from YYDEFACT or YYDEFGOTO) should be used. Otherwise, + YYTABLE[P+I] should be used. + + YYFINAL = the state number of the termination state. + + YYLAST ( = high) the number of the last element of YYTABLE, i.e., + sizeof (YYTABLE) - 1. */ + +extern int nvectors; + +typedef int base_number; +extern base_number *base; +/* A distinguished value of BASE, negative infinite. During the + computation equals to BASE_MINIMUM, later mapped to BASE_NINF to + keep parser tables small. */ +extern base_number base_ninf; + +extern unsigned int *conflict_table; +extern unsigned int *conflict_list; +extern int conflict_list_cnt; + +extern base_number *table; +extern base_number *check; +/* The value used in TABLE to denote explicit syntax errors + (%nonassoc), a negative infinite. */ +extern base_number table_ninf; + +extern state_number *yydefgoto; +extern rule_number *yydefact; +extern int high; + +void tables_generate (void); +void tables_free (void); + +#endif /* !TABLES_H_ */ diff --git a/src/apps/bin/bison/src/uniqstr.c b/src/apps/bin/bison/src/uniqstr.c new file mode 100644 index 0000000000..cc5bc68579 --- /dev/null +++ b/src/apps/bin/bison/src/uniqstr.c @@ -0,0 +1,151 @@ +/* Keep a unique copy of strings. + + Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include "system.h" + +#include +#include +#include + +#include "uniqstr.h" + +/*-----------------------. +| A uniqstr hash table. | +`-----------------------*/ + +/* Initial capacity of uniqstr hash table. */ +#define HT_INITIAL_CAPACITY 257 + +static struct hash_table *uniqstrs_table = NULL; + +/*-------------------------------------. +| Create the uniqstr for S if needed. | +`-------------------------------------*/ + +uniqstr +uniqstr_new (char const *str) +{ + uniqstr res = hash_lookup (uniqstrs_table, str); + if (!res) + { + /* First insertion in the hash. */ + res = xstrdup (str); + hash_insert (uniqstrs_table, res); + } + return res; +} + + +/*------------------------------. +| Abort if S is not a uniqstr. | +`------------------------------*/ + +void +uniqstr_assert (char const *str) +{ + if (!hash_lookup (uniqstrs_table, str)) + { + error (0, 0, "not a uniqstr: %s", quotearg (str)); + abort (); + } +} + + +/*--------------------. +| Print the uniqstr. | +`--------------------*/ + +static inline bool +uniqstr_print (uniqstr ustr) +{ + fprintf (stderr, "%s\n", ustr); + return true; +} + +static bool +uniqstr_print_processor (void *ustr, void *null ATTRIBUTE_UNUSED) +{ + return uniqstr_print (ustr); +} + + +/*-----------------------. +| A uniqstr hash table. | +`-----------------------*/ + +static bool +hash_compare_uniqstr (void const *m1, void const *m2) +{ + return strcmp (m1, m2) == 0; +} + +static size_t +hash_uniqstr (void const *m, size_t tablesize) +{ + return hash_string (m, tablesize); +} + +/*----------------------------. +| Create the uniqstrs table. | +`----------------------------*/ + +void +uniqstrs_new (void) +{ + uniqstrs_table = hash_initialize (HT_INITIAL_CAPACITY, + NULL, + hash_uniqstr, + hash_compare_uniqstr, + free); +} + + +/*-------------------------------------. +| Perform a task on all the uniqstrs. | +`-------------------------------------*/ + +static void +uniqstrs_do (Hash_processor processor, void *processor_data) +{ + hash_do_for_each (uniqstrs_table, processor, processor_data); +} + + +/*-----------------. +| Print them all. | +`-----------------*/ + +void +uniqstrs_print (void) +{ + uniqstrs_do (uniqstr_print_processor, NULL); +} + + +/*--------------------. +| Free the uniqstrs. | +`--------------------*/ + +void +uniqstrs_free (void) +{ + hash_free (uniqstrs_table); +} diff --git a/src/apps/bin/bison/src/uniqstr.h b/src/apps/bin/bison/src/uniqstr.h new file mode 100644 index 0000000000..8f94114109 --- /dev/null +++ b/src/apps/bin/bison/src/uniqstr.h @@ -0,0 +1,53 @@ +/* Keeping a unique copy of strings. + + Copyright (C) 2002, 2003 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef UNIQSTR_H_ +# define UNIQSTR_H_ + +/*-----------------------------------------. +| Pointers to unique copies of C strings. | +`-----------------------------------------*/ + +typedef char const *uniqstr; + +/* Return the uniqstr for STR. */ +uniqstr uniqstr_new (char const *str); + +/* Two uniqstr values have the same value iff they are the same. */ +#define UNIQSTR_EQ(USTR1, USTR2) ((USTR1) == (USTR2)) + +/*--------------------------------------. +| Initializing, destroying, debugging. | +`--------------------------------------*/ + +/* Create the string table. */ +void uniqstrs_new (void); + +/* Die if STR is not a uniqstr. */ +void uniqstr_assert (char const *str); + +/* Free all the memory allocated for symbols. */ +void uniqstrs_free (void); + +/* Report them all. */ +void uniqstrs_print (void); + +#endif /* ! defined UNIQSTR_H_ */ diff --git a/src/apps/bin/bison/src/vcg.c b/src/apps/bin/bison/src/vcg.c new file mode 100644 index 0000000000..d6ae21f8b8 --- /dev/null +++ b/src/apps/bin/bison/src/vcg.c @@ -0,0 +1,873 @@ +/* VCG description handler for Bison. + + Copyright (C) 2001, 2002, 2003 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#include "system.h" + +#include + +#include "vcg.h" +#include "vcg_defaults.h" + +/* Return an unambiguous printable representated, for NAME, suitable + for C strings. Use slot 2 since the user may use slots 0 and 1. + */ + +static char const * +quote (char const *name) +{ + return quotearg_n_style (2, c_quoting_style, name); +} + + +/* Initialize a graph with the default values. */ +void +new_graph (graph *g) +{ + g->title = G_TITLE; + g->label = G_LABEL; + + g->infos[0] = G_INFOS1; + g->infos[1] = G_INFOS2; + g->infos[2] = G_INFOS3; + + g->color = G_COLOR; + g->textcolor = G_TEXTCOLOR; + g->bordercolor = G_BORDERCOLOR; + + g->width = G_WIDTH; + g->height = G_HEIGHT; + g->borderwidth = G_BORDERWIDTH; + g->x = G_X; + g->y = G_Y; + g->folding = G_FOLDING; + g->shrink = G_SHRINK; + g->expand = G_EXPAND; + + g->textmode = G_TEXTMODE; + g->shape = G_SHAPE; + + g->vertical_order = G_VERTICAL_ORDER; + g->horizontal_order = G_HORIZONTAL_ORDER; + + g->xmax = G_XMAX; /* Not output. */ + g->ymax = G_YMAX; /* Not output. */ + + g->xbase = G_XBASE; + g->ybase = G_YBASE; + + g->xspace = G_XSPACE; + g->yspace = G_YSPACE; + g->xlspace = G_XLSPACE; /* Not output. */ + + g->xraster = G_XRASTER; + g->yraster = G_YRASTER; + g->xlraster = G_XLRASTER; + + g->hidden = G_HIDDEN; /* No default value. */ + + g->classname = G_CLASSNAME; /* No class name association. */ + + g->layoutalgorithm = G_LAYOUTALGORITHM; + g->layout_downfactor = G_LAYOUT_DOWNFACTOR; + g->layout_upfactor = G_LAYOUT_UPFACTOR; + g->layout_nearfactor = G_LAYOUT_NEARFACTOR; + g->layout_splinefactor = G_LAYOUT_SPLINEFACTOR; + + g->late_edge_labels = G_LATE_EDGE_LABELS; + g->display_edge_labels = G_DISPLAY_EDGE_LABELS; + g->dirty_edge_labels = G_DIRTY_EDGE_LABELS; + g->finetuning = G_FINETUNING; + g->ignore_singles = G_IGNORE_SINGLES; + g->priority_phase = G_PRIORITY_PHASE; + g->manhattan_edges = G_MANHATTAN_EDGES; + g->smanhattan_edges = G_SMANHATTAN_EDGES; + g->near_edges = G_NEAR_EDGES; + + g->orientation = G_ORIENTATION; + g->node_alignment = G_NODE_ALIGNMENT; + g->port_sharing = G_PORT_SHARING; + g->arrow_mode = G_ARROW_MODE; + g->treefactor = G_TREEFACTOR; + g->spreadlevel = G_SPREADLEVEL; + g->crossing_weight = G_CROSSING_WEIGHT; + g->crossing_phase2 = G_CROSSING_PHASE2; + g->crossing_optimization = G_CROSSING_OPTIMIZATION; + g->view = G_VIEW; + + g->edges = G_EDGES; + g->nodes = G_NODES; + g->splines = G_SPLINES; + + g->bmax = G_BMAX; + g->cmin = G_CMIN; + g->cmax = G_CMAX; + g->pmin = G_PMIN; + g->pmax = G_PMAX; + g->rmin = G_RMIN; + g->rmax = G_RMAX; + g->smax = G_SMAX; + + g->node_list = G_NODE_LIST; + g->edge_list = G_EDGE_LIST; + + new_edge (&g->edge); + new_node (&g->node); +} + +/* Initialize a node with the default values. */ +void +new_node (node *n) +{ + n->title = N_TITLE; + n->label = N_LABEL; + + n->locx = N_LOCX; /* Default unspcified. */ + n->locy = N_LOCY; /* Default unspcified. */ + + n->vertical_order = N_VERTICAL_ORDER; /* Default unspcified. */ + n->horizontal_order = N_HORIZONTAL_ORDER; /* Default unspcified. */ + + n->width = N_WIDTH; /* We assume that we can't define it now. */ + n->height = N_HEIGHT; /* Also. */ + + n->shrink = N_SHRINK; + n->expand = N_EXPAND; + + n->folding = N_FOLDING; /* No explicit default value. */ + + n->shape = N_SHAPE; + n->textmode = N_TEXTMODE; + n->borderwidth = N_BORDERWIDTH; + + n->color = N_COLOR; + n->textcolor = N_TEXTCOLOR; + n->bordercolor = N_BORDERCOLOR; + + n->infos[0] = N_INFOS1; + n->infos[1] = N_INFOS2; + n->infos[2] = N_INFOS3; + + n->next = N_NEXT; +} + +/* Initialize an edge with the default values. */ +void +new_edge (edge *e) +{ + e->type = E_EDGE_TYPE; + + e->sourcename = E_SOURCENAME; + e->targetname = E_TARGETNAME; + e->label = E_LABEL; + + e->linestyle = E_LINESTYLE; + e->thickness = E_THICKNESS; + + e->class = E_CLASS; + + e->color = E_COLOR; + e->textcolor = E_TEXTCOLOR; + e->arrowcolor = E_ARROWCOLOR; + e->backarrowcolor = E_BACKARROWCOLOR; + + e->arrowsize = E_ARROWSIZE; + e->backarrowsize = E_BACKARROWSIZE; + e->arrowstyle = E_ARROWSTYLE; + + e->backarrowstyle = E_BACKARROWSTYLE; + + e->priority = E_PRIORITY; + + e->anchor = E_ANCHOR; + + e->horizontal_order = E_HORIZONTAL_ORDER; + + e->next = E_NEXT; +} + +/*----------------------------------------------. +| Get functions. | +| Return string corresponding to an enum value. | +`----------------------------------------------*/ + +static const char * +get_color_str (enum color color) +{ + switch (color) + { + case white: return "white"; + case blue: return "blue"; + case red: return "red"; + case green: return "green"; + case yellow: return "yellow"; + case magenta: return "magenta"; + case cyan: return "cyan"; + case darkgrey: return "darkgrey"; + case darkblue: return "darkblue"; + case darkred: return "darkred"; + case darkgreen: return "darkgreen"; + case darkyellow: return "darkyellow"; + case darkmagenta: return "darkmagenta"; + case darkcyan: return "darkcyan"; + case gold: return "gold"; + case lightgrey: return "lightgrey"; + case lightblue: return "lightblue"; + case lightred: return "lightred"; + case lightgreen: return "lightgreen"; + case lightyellow: return "lightyellow"; + case lightmagenta: return "lightmagenta"; + case lightcyan: return "lightcyan"; + case lilac: return "lilac"; + case turquoise: return "turquoise"; + case aquamarine: return "aquamarine"; + case khaki: return "khaki"; + case purple: return "purple"; + case yellowgreen: return "yellowgreen"; + case pink: return "pink"; + case orange: return "orange"; + case orchid: return "orchid"; + case black: return "black"; + default: abort (); return NULL; + } +} + +static const char * +get_textmode_str (enum textmode textmode) +{ + switch (textmode) + { + case centered: return "center"; + case left_justify: return "left_justify"; + case right_justify: return "right_justify"; + default: abort (); return NULL; + } +} + +static const char * +get_shape_str (enum shape shape) +{ + switch (shape) + { + case box: return "box"; + case rhomb: return "rhomb"; + case ellipse: return "ellipse"; + case triangle: return "triangle"; + default: abort (); return NULL; + } +} + +static const char * +get_layoutalgorithm_str (enum layoutalgorithm layoutalgorithm) +{ + switch (layoutalgorithm) + { + case normal: return "normal"; + case maxdepth: return "maxdepth"; + case mindepth: return "mindepth"; + case maxdepthslow: return "maxdepthslow"; + case mindepthslow: return "mindepthslow"; + case maxdegree: return "maxdegree"; + case mindegree: return "mindegree"; + case maxindegree: return "maxindegree"; + case minindegree: return "minindegree"; + case maxoutdegree: return "maxoutdegree"; + case minoutdegree: return "minoutdegree"; + case minbackward: return "minbackward"; + case dfs: return "dfs"; + case tree: return "tree"; + default: abort (); return NULL; + } +} + +static const char * +get_decision_str (enum decision decision) +{ + switch (decision) + { + case no: return "no"; + case yes: return "yes"; + default: abort (); return NULL; + } +} + +static const char * +get_orientation_str (enum orientation orientation) +{ + switch (orientation) + { + case top_to_bottom: return "top_to_bottom"; + case bottom_to_top: return "bottom_to_top"; + case left_to_right: return "left_to_right"; + case right_to_left: return "right_to_left"; + default: abort (); return NULL; + } +} + +static const char * +get_node_alignment_str (enum alignment alignment) +{ + switch (alignment) + { + case center: return "center"; + case top: return "top"; + case bottom: return "bottom"; + default: abort (); return NULL; + } +} + +static const char * +get_arrow_mode_str (enum arrow_mode arrow_mode) +{ + switch (arrow_mode) + { + case fixed: return "fixed"; + case free_a: return "free"; + default: abort (); return NULL; + } +} + +static const char * +get_crossing_type_str (enum crossing_type crossing_type) +{ + switch (crossing_type) + { + case bary: return "bary"; + case median: return "median"; + case barymedian: return "barymedian"; + case medianbary: return "medianbary"; + default: abort (); return NULL; + } +} + +static const char * +get_view_str (enum view view) +{ + switch (view) + { + case normal_view: return "normal_view"; + case cfish: return "cfish"; + case pfish: return "pfish"; + case fcfish: return "fcfish"; + case fpfish: return "fpfish"; + default: abort (); return NULL; + } +} + +static const char * +get_linestyle_str (enum linestyle linestyle) +{ + switch (linestyle) + { + case continuous: return "continuous"; + case dashed: return "dashed"; + case dotted: return "dotted"; + case invisible: return "invisible"; + default: abort (); return NULL; + } +} + +static const char * +get_arrowstyle_str (enum arrowstyle arrowstyle) +{ + switch (arrowstyle) + { + case solid: return "solid"; + case line: return "line"; + case none: return "none"; + default: abort (); return NULL; + } +} + +/*------------------------------. +| Add functions. | +| Edge and nodes into a graph. | +`------------------------------*/ + +void +add_node (graph *g, node *n) +{ + n->next = g->node_list; + g->node_list = n; +} + +void +add_edge (graph *g, edge *e) +{ + e->next = g->edge_list; + g->edge_list = e; +} + +void +add_classname (graph *g, int val, const char *name) +{ + struct classname *classname; + + MALLOC (classname, 1); + classname->no = val; + classname->name = name; + classname->next = g->classname; + g->classname = classname; +} + +void +add_infoname (graph *g, int integer, const char *str) +{ + struct infoname *infoname; + + MALLOC (infoname, 1); + infoname->integer = integer; + infoname->chars = str; + infoname->next = g->infoname; + g->infoname = infoname; +} + +/* Build a colorentry struct and add it to the list. */ +void +add_colorentry (graph *g, int color_idx, int red_cp, + int green_cp, int blue_cp) +{ + struct colorentry *ce; + + MALLOC (ce, 1); + ce->color_index = color_idx; + ce->red_cp = red_cp; + ce->green_cp = green_cp; + ce->blue_cp = blue_cp; + ce->next = g->colorentry; + g->colorentry = ce; +} + +/*-------------------------------------. +| Open and close functions (formatted) | +`-------------------------------------*/ + +void +open_edge (edge *e, FILE *fout) +{ + switch (e->type) + { + case normal_edge: + fputs ("\tedge: {\n", fout); + break; + case back_edge: + fputs ("\tbackedge: {\n", fout); + break; + case near_edge: + fputs ("\tnearedge: {\n", fout); + break; + case bent_near_edge: + fputs ("\tbentnearedge: {\n", fout); + break; + default: + fputs ("\tedge: {\n", fout); + } +} + +void +close_edge (FILE *fout) +{ + fputs ("\t}\n", fout); +} + +void +open_node (FILE *fout) +{ + fputs ("\tnode: {\n", fout); +} + +void +close_node (FILE *fout) +{ + fputs ("\t}\n", fout); +} + +void +open_graph (FILE *fout) +{ + fputs ("graph: {\n", fout); +} + +void +close_graph (graph *g, FILE *fout) +{ + fputc ('\n', fout); + + /* FIXME: Unallocate nodes and edges if required. */ + { + node *n; + + for (n = g->node_list; n; n = n->next) + { + open_node (fout); + output_node (n, fout); + close_node (fout); + } + } + + fputc ('\n', fout); + + { + edge *e; + + for (e = g->edge_list; e; e = e->next) + { + open_edge (e, fout); + output_edge (e, fout); + close_edge (fout); + } + } + + fputs ("}\n", fout); +} + +/*-------------------------------------------. +| Output functions (formatted) in file FOUT | +`-------------------------------------------*/ + +void +output_node (node *n, FILE *fout) +{ + if (n->title != N_TITLE) + fprintf (fout, "\t\ttitle:\t%s\n", quote (n->title)); + if (n->label != N_LABEL) + fprintf (fout, "\t\tlabel:\t%s\n", quote (n->label)); + + if ((n->locx != N_LOCX) && (n->locy != N_LOCY)) + fprintf (fout, "\t\tloc { x: %d y: %d }\t\n", n->locx, n->locy); + + if (n->vertical_order != N_VERTICAL_ORDER) + fprintf (fout, "\t\tvertical_order:\t%d\n", n->vertical_order); + if (n->horizontal_order != N_HORIZONTAL_ORDER) + fprintf (fout, "\t\thorizontal_order:\t%d\n", n->horizontal_order); + + if (n->width != N_WIDTH) + fprintf (fout, "\t\twidth:\t%d\n", n->width); + if (n->height != N_HEIGHT) + fprintf (fout, "\t\theight:\t%d\n", n->height); + + if (n->shrink != N_SHRINK) + fprintf (fout, "\t\tshrink:\t%d\n", n->shrink); + if (n->expand != N_EXPAND) + fprintf (fout, "\t\texpand:\t%d\n", n->expand); + + if (n->folding != N_FOLDING) + fprintf (fout, "\t\tfolding:\t%d\n", n->folding); + + if (n->textmode != N_TEXTMODE) + fprintf (fout, "\t\ttextmode:\t%s\n", + get_textmode_str (n->textmode)); + + if (n->shape != N_SHAPE) + fprintf (fout, "\t\tshape:\t%s\n", get_shape_str (n->shape)); + + if (n->borderwidth != N_BORDERWIDTH) + fprintf (fout, "\t\tborderwidth:\t%d\n", n->borderwidth); + + if (n->color != N_COLOR) + fprintf (fout, "\t\tcolor:\t%s\n", get_color_str (n->color)); + if (n->textcolor != N_TEXTCOLOR) + fprintf (fout, "\t\ttextcolor:\t%s\n", + get_color_str (n->textcolor)); + if (n->bordercolor != N_BORDERCOLOR) + fprintf (fout, "\t\tbordercolor:\t%s\n", + get_color_str (n->bordercolor)); + + { + int i; + for (i = 0; i < 3; ++i) + if (n->infos[i]) + fprintf (fout, "\t\tinfo%d:\t%s\n", + i, quote (n->infos[i])); + } +} + +void +output_edge (edge *e, FILE *fout) +{ + /* FIXME: SOURCENAME and TARGETNAME are mandatory + so it has to be fatal not to give these informations. */ + if (e->sourcename != E_SOURCENAME) + fprintf (fout, "\t\tsourcename:\t%s\n", quote (e->sourcename)); + if (e->targetname != E_TARGETNAME) + fprintf (fout, "\t\ttargetname:\t%s\n", quote (e->targetname)); + + if (e->label != E_LABEL) + fprintf (fout, "\t\tlabel:\t%s\n", quote (e->label)); + + if (e->linestyle != E_LINESTYLE) + fprintf (fout, "\t\tlinestyle:\t%s\n", + quote (get_linestyle_str (e->linestyle))); + + if (e->thickness != E_THICKNESS) + fprintf (fout, "\t\tthickness:\t%d\n", e->thickness); + if (e->class != E_CLASS) + fprintf (fout, "\t\tclass:\t%d\n", e->class); + + if (e->color != E_COLOR) + fprintf (fout, "\t\tcolor:\t%s\n", get_color_str (e->color)); + if (e->color != E_TEXTCOLOR) + fprintf (fout, "\t\ttextcolor:\t%s\n", + get_color_str (e->textcolor)); + if (e->arrowcolor != E_ARROWCOLOR) + fprintf (fout, "\t\tarrowcolor:\t%s\n", + get_color_str (e->arrowcolor)); + if (e->backarrowcolor != E_BACKARROWCOLOR) + fprintf (fout, "\t\tbackarrowcolor:\t%s\n", + get_color_str (e->backarrowcolor)); + + if (e->arrowsize != E_ARROWSIZE) + fprintf (fout, "\t\tarrowsize:\t%d\n", e->arrowsize); + if (e->backarrowsize != E_BACKARROWSIZE) + fprintf (fout, "\t\tbackarrowsize:\t%d\n", e->backarrowsize); + + if (e->arrowstyle != E_ARROWSTYLE) + fprintf (fout, "\t\tarrowstyle:\t%s\n", + get_arrowstyle_str (e->arrowstyle)); + if (e->backarrowstyle != E_BACKARROWSTYLE) + fprintf (fout, "\t\tbackarrowstyle:\t%s\n", + get_arrowstyle_str (e->backarrowstyle)); + + if (e->priority != E_PRIORITY) + fprintf (fout, "\t\tpriority:\t%d\n", e->priority); + if (e->anchor != E_ANCHOR) + fprintf (fout, "\t\tanchor:\t%d\n", e->anchor); + if (e->horizontal_order != E_HORIZONTAL_ORDER) + fprintf (fout, "\t\thorizontal_order:\t%d\n", e->horizontal_order); +} + +void +output_graph (graph *g, FILE *fout) +{ + if (g->title) + fprintf (fout, "\ttitle:\t%s\n", quote (g->title)); + if (g->label) + fprintf (fout, "\tlabel:\t%s\n", quote (g->label)); + + { + int i; + for (i = 0; i < 3; ++i) + if (g->infos[i]) + fprintf (fout, "\tinfo%d:\t%s\n", i, quote (g->infos[i])); + } + + if (g->color != G_COLOR) + fprintf (fout, "\tcolor:\t%s\n", get_color_str (g->color)); + if (g->textcolor != G_TEXTCOLOR) + fprintf (fout, "\ttextcolor:\t%s\n", get_color_str (g->textcolor)); + if (g->bordercolor != G_BORDERCOLOR) + fprintf (fout, "\tbordercolor:\t%s\n", + get_color_str (g->bordercolor)); + + if (g->width != G_WIDTH) + fprintf (fout, "\twidth:\t%d\n", g->width); + if (g->height != G_HEIGHT) + fprintf (fout, "\theight:\t%d\n", g->height); + if (g->borderwidth != G_BORDERWIDTH) + fprintf (fout, "\tborderwidth:\t%d\n", g->borderwidth); + + if (g->x != G_X) + fprintf (fout, "\tx:\t%d\n", g->x); + if (g->y != G_Y) + fprintf (fout, "\ty:\t%d\n", g->y); + + if (g->folding != G_FOLDING) + fprintf (fout, "\tfolding:\t%d\n", g->folding); + + if (g->shrink != G_SHRINK) + fprintf (fout, "\tshrink:\t%d\n", g->shrink); + if (g->expand != G_EXPAND) + fprintf (fout, "\texpand:\t%d\n", g->expand); + + if (g->textmode != G_TEXTMODE) + fprintf (fout, "\ttextmode:\t%s\n", + get_textmode_str (g->textmode)); + + if (g->shape != G_SHAPE) + fprintf (fout, "\tshape:\t%s\n", get_shape_str (g->shape)); + + if (g->vertical_order != G_VERTICAL_ORDER) + fprintf (fout, "\tvertical_order:\t%d\n", g->vertical_order); + if (g->horizontal_order != G_HORIZONTAL_ORDER) + fprintf (fout, "\thorizontal_order:\t%d\n", g->horizontal_order); + + if (g->xmax != G_XMAX) + fprintf (fout, "\txmax:\t%d\n", g->xmax); + if (g->ymax != G_YMAX) + fprintf (fout, "\tymax:\t%d\n", g->ymax); + + if (g->xbase != G_XBASE) + fprintf (fout, "\txbase:\t%d\n", g->xbase); + if (g->ybase != G_YBASE) + fprintf (fout, "\tybase:\t%d\n", g->ybase); + + if (g->xspace != G_XSPACE) + fprintf (fout, "\txspace:\t%d\n", g->xspace); + if (g->yspace != G_YSPACE) + fprintf (fout, "\tyspace:\t%d\n", g->yspace); + if (g->xlspace != G_XLSPACE) + fprintf (fout, "\txlspace:\t%d\n", g->xlspace); + + if (g->xraster != G_XRASTER) + fprintf (fout, "\txraster:\t%d\n", g->xraster); + if (g->yraster != G_YRASTER) + fprintf (fout, "\tyraster:\t%d\n", g->yraster); + if (g->xlraster != G_XLRASTER) + fprintf (fout, "\txlraster:\t%d\n", g->xlraster); + + if (g->hidden != G_HIDDEN) + fprintf (fout, "\thidden:\t%d\n", g->hidden); + + /* FIXME: Unallocate struct list if required. + Maybe with a little function. */ + if (g->classname != G_CLASSNAME) + { + struct classname *ite; + + for (ite = g->classname; ite; ite = ite->next) + fprintf (fout, "\tclassname %d :\t%s\n", ite->no, ite->name); + } + + if (g->infoname != G_INFONAME) + { + struct infoname *ite; + + for (ite = g->infoname; ite; ite = ite->next) + fprintf (fout, "\tinfoname %d :\t%s\n", ite->integer, ite->chars); + } + + if (g->colorentry != G_COLORENTRY) + { + struct colorentry *ite; + + for (ite = g->colorentry; ite; ite = ite->next) + { + fprintf (fout, "\tcolorentry %d :\t%d %d %d\n", + ite->color_index, + ite->red_cp, + ite->green_cp, + ite->blue_cp); + } + } + + if (g->layoutalgorithm != G_LAYOUTALGORITHM) + fprintf (fout, "\tlayoutalgorithm:\t%s\n", + get_layoutalgorithm_str (g->layoutalgorithm)); + + if (g->layout_downfactor != G_LAYOUT_DOWNFACTOR) + fprintf (fout, "\tlayout_downfactor:\t%d\n", g->layout_downfactor); + if (g->layout_upfactor != G_LAYOUT_UPFACTOR) + fprintf (fout, "\tlayout_upfactor:\t%d\n", g->layout_upfactor); + if (g->layout_nearfactor != G_LAYOUT_NEARFACTOR) + fprintf (fout, "\tlayout_nearfactor:\t%d\n", g->layout_nearfactor); + if (g->layout_splinefactor != G_LAYOUT_SPLINEFACTOR) + fprintf (fout, "\tlayout_splinefactor:\t%d\n", + g->layout_splinefactor); + + if (g->late_edge_labels != G_LATE_EDGE_LABELS) + fprintf (fout, "\tlate_edge_labels:\t%s\n", + get_decision_str (g->late_edge_labels)); + if (g->display_edge_labels != G_DISPLAY_EDGE_LABELS) + fprintf (fout, "\tdisplay_edge_labels:\t%s\n", + get_decision_str (g->display_edge_labels)); + if (g->dirty_edge_labels != G_DIRTY_EDGE_LABELS) + fprintf (fout, "\tdirty_edge_labels:\t%s\n", + get_decision_str (g->dirty_edge_labels)); + if (g->finetuning != G_FINETUNING) + fprintf (fout, "\tfinetuning:\t%s\n", + get_decision_str (g->finetuning)); + if (g->ignore_singles != G_IGNORE_SINGLES) + fprintf (fout, "\tignore_singles:\t%s\n", + get_decision_str (g->ignore_singles)); + if (g->priority_phase != G_PRIORITY_PHASE) + fprintf (fout, "\tpriority_phase:\t%s\n", + get_decision_str (g->priority_phase)); + if (g->manhattan_edges != G_MANHATTAN_EDGES) + fprintf (fout, + "\tmanhattan_edges:\t%s\n", + get_decision_str (g->manhattan_edges)); + if (g->smanhattan_edges != G_SMANHATTAN_EDGES) + fprintf (fout, + "\tsmanhattan_edges:\t%s\n", + get_decision_str (g->smanhattan_edges)); + if (g->near_edges != G_NEAR_EDGES) + fprintf (fout, "\tnear_edges:\t%s\n", + get_decision_str (g->near_edges)); + + if (g->orientation != G_ORIENTATION) + fprintf (fout, "\torientation:\t%s\n", + get_orientation_str (g->orientation)); + + if (g->node_alignment != G_NODE_ALIGNMENT) + fprintf (fout, "\tnode_alignment:\t%s\n", + get_node_alignment_str (g->node_alignment)); + + if (g->port_sharing != G_PORT_SHARING) + fprintf (fout, "\tport_sharing:\t%s\n", + get_decision_str (g->port_sharing)); + + if (g->arrow_mode != G_ARROW_MODE) + fprintf (fout, "\tarrow_mode:\t%s\n", + get_arrow_mode_str (g->arrow_mode)); + + if (g->treefactor != G_TREEFACTOR) + fprintf (fout, "\ttreefactor:\t%f\n", g->treefactor); + if (g->spreadlevel != G_SPREADLEVEL) + fprintf (fout, "\tspreadlevel:\t%d\n", g->spreadlevel); + + if (g->crossing_weight != G_CROSSING_WEIGHT) + fprintf (fout, "\tcrossing_weight:\t%s\n", + get_crossing_type_str (g->crossing_weight)); + if (g->crossing_phase2 != G_CROSSING_PHASE2) + fprintf (fout, "\tcrossing_phase2:\t%s\n", + get_decision_str (g->crossing_phase2)); + if (g->crossing_optimization != G_CROSSING_OPTIMIZATION) + fprintf (fout, "\tcrossing_optimization:\t%s\n", + get_decision_str (g->crossing_optimization)); + + if (g->view != G_VIEW) + fprintf (fout, "\tview:\t%s\n", get_view_str (g->view)); + + if (g->edges != G_EDGES) + fprintf (fout, "\tedges:\t%s\n", get_decision_str (g->edges)); + + if (g->nodes != G_NODES) + fprintf (fout,"\tnodes:\t%s\n", get_decision_str (g->nodes)); + + if (g->splines != G_SPLINES) + fprintf (fout, "\tsplines:\t%s\n", get_decision_str (g->splines)); + + if (g->bmax != G_BMAX) + fprintf (fout, "\tbmax:\t%d\n", g->bmax); + if (g->cmin != G_CMIN) + fprintf (fout, "\tcmin:\t%d\n", g->cmin); + if (g->cmax != G_CMAX) + fprintf (fout, "\tcmax:\t%d\n", g->cmax); + if (g->pmin != G_PMIN) + fprintf (fout, "\tpmin:\t%d\n", g->pmin); + if (g->pmax != G_PMAX) + fprintf (fout, "\tpmax:\t%d\n", g->pmax); + if (g->rmin != G_RMIN) + fprintf (fout, "\trmin:\t%d\n", g->rmin); + if (g->rmax != G_RMAX) + fprintf (fout, "\trmax:\t%d\n", g->rmax); + if (g->smax != G_SMAX) + fprintf (fout, "\tsmax:\t%d\n", g->smax); +} diff --git a/src/apps/bin/bison/src/vcg.h b/src/apps/bin/bison/src/vcg.h new file mode 100644 index 0000000000..44d700cb6b --- /dev/null +++ b/src/apps/bin/bison/src/vcg.h @@ -0,0 +1,1011 @@ +/* VCG description handler for Bison. + + Copyright (C) 2001, 2002 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef VCG_H_ +# define VCG_H_ + +/* VCG color map. The 32 prime predefined colors. */ +enum color +{ + white = 0, + blue, + red, + green = 3, + yellow, + magenta, + cyan = 6, + darkgrey, + darkblue, + darkred = 9, + darkgreen, + darkyellow, + darkmagenta = 12, + darkcyan, + gold, + lightgrey = 15, + lightblue, + lightred, + lightgreen = 18, + lightyellow, + lightmagenta, + lightcyan = 21, + lilac, + turquoise, + aquamarine = 24, + khaki, + purple, + yellowgreen = 27, + pink, + orange, + orchid, + black = 31 +}; + +/* VCG textmode. Specify the adjustement of the text within the border of a summary node. */ +enum textmode +{ + centered, + left_justify, + right_justify +}; + +/* VCG shapes. Used for nodes shapes. */ +enum shape +{ + box, + rhomb, + ellipse, + triangle +}; + +/* Structure for colorentries. */ +struct colorentry +{ + int color_index; + int red_cp; + int green_cp; + int blue_cp; + struct colorentry *next; +}; + +/* Structure to construct lists of classnames. */ +struct classname +{ + int no; /* Class number */ + const char *name; /* Name associated to the class no. */ + struct classname *next; /* next name class association. */ +}; + +/* Structure is in infoname. */ +struct infoname +{ + int integer; + char const *chars; + struct infoname *next; +}; + +/* Layout Algorithms which can be found in VCG. + Details about each algoithm can be found below. */ +enum layoutalgorithm +{ + normal, + maxdepth, + mindepth, + maxdepthslow, + mindepthslow, + maxdegree, + mindegree, + maxindegree, + minindegree, + maxoutdegree, + minoutdegree, + minbackward, + dfs, + tree +}; + +/* VCG decision yes/no. */ +enum decision +{ + yes, + no +}; + +/* VCG graph orientation. */ +enum orientation +{ + top_to_bottom, + bottom_to_top, + left_to_right, + right_to_left +}; + +/* VCG alignment for node alignement. */ +enum alignment +{ + center, + top, + bottom +}; + +/* VCG arrow mode. */ +enum arrow_mode +{ + fixed, + free_a +}; + +/* VCG crossing weight type. */ +enum crossing_type +{ + bary, + median, + barymedian, + medianbary +}; + +/* VCG views. */ +enum view +{ + normal_view, + cfish, + pfish, + fcfish, + fpfish +}; + +/*------------------------------------------------------. +| Node attributs list. structure that describes a node. | +`------------------------------------------------------*/ + +struct node +{ + /* Title the unique string identifying the node. This attribute is + mandatory. */ + const char *title; + + /* Label the text displayed inside the node. If no label is specified + then the title of the node will be used. Note that this text may + contain control characters like NEWLINE that influences the size of + the node. */ + const char *label; + + /* loc is the location as x, y position relatively to the system of + coordinates of the graph. Locations are specified in the form + loc: - x: xpos y: ypos "". The locations of nodes are only valid, + if the whole graph is fully specified with locations and no part is + folded. The layout algorithm of the tool calculates appropriate x, y + positions, if at least one node that must be drawn (i.e., is not + hidden by folding or edge classes) does not have fixed specified + locations. + Default is none. */ + int locx; + int locy; + + /* vertical order is the level position (rank) of the node. We can also + specify level: int. Level specifications are only valid, if the + layout is calculated, i.e. if at least one node does not have a + fixed location specification. The layout algorithm partitioned all + nodes into levels 0...maxlevel. Nodes at the level 0 are on the + upper corner. The algorithm is able to calculate appropriate levels + for the nodes automatically, if no fixed levels are given. + Specifications of levels are additional constraints, that may be + ignored, if they are in conflict with near edge specifications. + Default values are unspecified. */ + int vertical_order; + + /* horizontal order is the horizontal position of the node within a + level. The nodes which are specified with horizontal positions are + ordered according to these positions within the levels. The nodes + which do not have this attribute are inserted into this ordering by + the crossing reduction mechanism. Note that connected components are + handled separately, thus it is not possible to intermix such + components by specifying a horizontal order. If the algorithm for + downward laid out trees is used, the horizontal order influences + only the order of the child nodes at a node, but not the order of + the whole level. + Default is unspecified. */ + int horizontal_order; + + /* width, height is the width and height of a node including the border. + If no value (in pixels) is given then width and height are + calculated from the size of the label. + Default are width and height of the label. */ + int width; + int height; + + /* shrink, expand gives the shrinking and expanding factor of the + node. The values of the attributes width, height, borderwidth and + the size of the label text is scaled by ((expand=shrink) \Lambda + 100) percent. Note that the actual scale value is determined by the + scale value of a node relatively to a scale value of the graph, + i.e. if (expand,shrink) = (2,1) for the graph and (expand,shrink) + = (2,1) for the node of the graph, then the node is scaled by the + factor 4 compared to the normal size. The scale value can also be + specified by scaling: float. + Default are 1,1. */ + int shrink; + int expand; + + /* folding specifies the default folding of the nodes. The folding k + (with k ? 0) means that the graph part that is reachable via edges + of a class less or equal to k is folded and displayed as one node. + There are commands to unfold such summary nodes, see section 5. If + no folding is specified for a node, then the node may be folded if + it is in the region of another node that starts the folding. If + folding 0 is specified, then the node is never folded. In this case + the folding stops at the predecessors of this node, if it is + reachable from another folding node. The summary node inherits some + attributes from the original node which starts the folding (all + color attributes, textmode and label, but not the location). A + folded region may contain folded regions with smaller folding class + values (nested foldings). If there is more than one node that start + the folding of the same region (this implies that the folding class + values are equal) then the attributes are inherited by one of these + nodes nondeterministically. If foldnode attributes are specified, + then the summary node attributes are inherited from these attributes. + Default is none. */ + int folding; + + /* shape specifies the visual appearance of a node: box, rhomb, ellipse, + and triangle. The drawing of ellipses is much slower than the drawing + of the other shapes. + Default is box. */ + enum shape shape; + + /* textmode specifies the adjustment of the text within the border of a + node. The possibilities are center, left.justify and right.justify. + Default is center. */ + enum textmode textmode; + + /* borderwidth specifies the thickness of the node's border in pixels. + color is the background color of the node. If none is given, the + node is white. For the possibilities, see the attribute color for + graphs. + Default is 2. */ + int borderwidth; + + /* node color. + Default is white or transparent, */ + enum color color; + + /* textcolor is the color for the label text. bordercolor is the color + of the border. Default color is the textcolor. info1, info2, info3 + combines additional text labels with a node or a folded graph. info1, + Default is black. */ + enum color textcolor; + + /* info2, info3 can be selected from the menu. The corresponding text + labels can be shown by mouse clicks on nodes. + Default are null strings. */ + const char *infos[3]; + + /* Node border color. + Default is textcolor. */ + enum color bordercolor; + + /* Next node node... */ + struct node *next; +}; + +/* typedef alias. */ +typedef struct node node; + +/*-------------------------------------------------------. +| Edge attributs list. Structure that describes an edge. | +`-------------------------------------------------------*/ + +/* VCG Edge type. */ +enum edge_type +{ + normal_edge, + back_edge, + near_edge, + bent_near_edge +}; + +/* Structs enum definitions for edges. */ +enum linestyle +{ + continuous, + dashed, + dotted, + invisible +}; + +enum arrowstyle +{ + solid, + line, + none +}; + +/* The struct edge itself. */ +struct edge +{ + + /* Edge type. + Default is normal edge. */ + enum edge_type type; + + /* Sourcename is the title of the source node of the edge. + Default: none. */ + const char *sourcename; /* Mandatory. */ + + /* Targetname is the title of the target node of the edge. + Default: none. */ + const char *targetname; /* Mandatory. */ + + /* Label specifies the label of the edge. It is drawn if + display.edge.labels is set to yes. + Default: no label. */ + const char *label; + + /* Linestyle specifies the style the edge is drawn. Possibilities are: + ffl continuous a solid line is drawn ( -- ) ffl dashed the edge + consists of single dashes ( - - - ) ffl dotted the edge is made of + single dots ( \Delta \Delta \Delta ) ffl invisible the edge is not + drawn. The attributes of its shape (color, thickness) are ignored. + To draw a dashed or dotted line needs more time than solid lines. + Default is continuous. */ + enum linestyle linestyle; + + /* Thickness is the thickness of an edge. + Default is 2. */ + int thickness; + + /* Class specifies the folding class of the edge. Nodes reachable by + edges of a class less or equal to a constant k specify folding + regions of k. See the node attribute folding and the folding commands. + Default is 1. */ + int class; + + /* color is the color of the edge. + Default is black. */ + enum color color; + + /* textcolor is the color of the label of the edge. arrowcolor, + backarrowcolor is the color of the arrow head and of the backarrow + head. priority The positions of the nodes are mainly determined by + the incoming and outgoing edges. One can think of rubberbands instead + of edges that pull a node into its position. The priority of an edges + corresponds to the strength of the rubberband. + Default is color. */ + enum color textcolor; + + /* Arrow color. + Default is color. */ + enum color arrowcolor; + + /* BackArrow color. + Default is color. */ + enum color backarrowcolor; + + /* arrowsize, backarrowsize The arrow head is a right-angled, isosceles + triangle and the cathetuses have length arrowsize. + Default is 10. */ + int arrowsize; + + /* Backarrow size + Default is 0. */ + int backarrowsize; + + /* arrowstyle, backarrowstyle Each edge has two arrow heads: the one + appears at the target node (the normal arrow head), the other appears + at the source node (the backarrow head). Normal edges only have the + normal solid arrow head, while the backarrow head is not drawn, i.e. + it is none. Arrowstyle is the style of the normal arrow head, and + backarrowstyle is the style of the backarrow head. Styles are none, + i.e. no arrow head, solid, and line. + Default is solid. */ + enum arrowstyle arrowstyle; + + /* Default is none. */ + enum arrowstyle backarrowstyle; + + /* Default is 1. */ + int priority; + + /* Anchor. An anchor point describes the vertical position in a node + where an edge goes out. This is useful, if node labels are several + lines long, and outgoing edges are related to label lines. (E.g., + this allows a nice visualization of structs containing pointers as + fields.). + Default is none. */ + int anchor; + + /* Horizontal order is the horizontal position the edge. This is of + interest only if the edge crosses several levels because it specifies + the point where the edge crosses the level. within a level. The nodes + which are specified with horizontal positions are ordered according + to these positions within a level. The horizontal position of a long + edge that crosses the level specifies between which two node of that + level the edge has to be drawn. Other edges which do not have this + attribute are inserted into this ordering by the crossing reduction + mechanism. Note that connected components are handled separately, + thus it is not possible to intermix such components by specifying a + horizontal order. + Default is unspcified. */ + int horizontal_order; + + /* + ** Next edge node... + */ + struct edge *next; + +}; + +/* +** typedef alias. +*/ +typedef struct edge edge; + +/*--------------------------------------------------------. +| Graph attributs list. Structure that describes a graph. | +`--------------------------------------------------------*/ + +struct graph +{ + /* Graph title or name. + Title specifies the name (a string) associated with the graph. The + default name of a subgraph is the name of the outer graph, and the + name of the outmost graph is the name of the specification input + file. The name of a graph is used to identify this graph, e.g., if + we want to express that an edge points to a subgraph. Such edges + point to the root of the graph, i.e. the first node of the graph or + the root of the first subgraph in the graph, if the subgraph is + visualized explicitly. + By default, it's the name of the vcg graph file description. */ + const char *title; + + /* Graph label. + Label the text displayed inside the node, when the graph is folded + to a node. If no label is specified then the title of the graph will + be used. Note that this text may contain control characters like + NEWLINE that influences the size of the node. + By default, it takes the title value */ + const char *label; + + /* Any informations. + Info1, info2, info3 combines additional text labels with a node or a + folded graph. info1, info2, info3 can be selected from the menu + interactively. The corresponding text labels can be shown by mouse + clicks on nodes. + Default values are empty strings (here NULL pointers) */ + const char *infos[3]; + + /* Background color and summary node colors + Color specifies the background color for the outermost graph, or the + color of the summary node for subgraphs. Colors are given in the enum + declared above. If more than these default colors are needed, a + color map with maximal 256 entries can be used. The first 32 entries + correspond to the colors just listed. A color of the color map can + selected by the color map index, an integer, for instance red has + index 2, green has index 3, etc. + Default is white for background and white or transparent for summary + nodes. */ + enum color color; + + /* Textcolor. + need explanations ??? + default is black for summary nodes. */ + enum color textcolor; + + /* Bordercolor is the color of the summary node's border. Default color + is the textcolor. width, height are width and height of the + displayed part of the window of the outermost graph in pixels, or + width and height of the summary node of inner subgraphs. + Default is the default of the textcolor. */ + enum color bordercolor; + + /* Width, height are width and height of the displayed part of the + window of the outermost graph in pixels, or width and height of the + summary node of inner subgraphs. + Default value is 100. */ + int width; + int height; + + /* Specify the thickness if summary node's border in pixels. + default value is 2. */ + int borderwidth; + + /* x, y are the x-position and y-position of the graph's window in + pixels, relatively to the root screen, if it is the outermost graph. + The origin of the window is upper, left hand. For inner subgraphs, + it is the position of the folded summary node. The position can also + be specified in the form loc: fx:int y:intg. + The default value is 0. */ + int x; + int y; + + /* folding of a subgraph is 1, if the subgraph is fused, and 0, if the + subgraph is visualized explicitly. There are commands to unfold such + summary nodes. + Default value is 0 */ + int folding; + + /* Shrink, expand gives the shrinking and expanding factor for the + graph's representation (default is 1, 1). ((expand=shrink) \Lambda + 100) is the scaling of the graph in percentage, e.g., + (expand,shrink) = (1,1) or (2,2) or (3,3) : : : is normal size, + (expand,shrink) = (1,2) is half size, (expand,shrink) = (2,1) is + double size. For subgraphs, it is also the scaling factor of the + summary node. The scaling factor can also be specified by scaling: + float (here, scaling 1.0 means normal size). */ + int shrink; + int expand; + + /* textmode specifies the adjustment of the text within the border of a + summary node. The possibilities are center, left.justify and + right.justify. + Default value is center.*/ + enum textmode textmode; + + /* Shape can be specified for subgraphs only. It is the shape of the + subgraph summary node that appears if the subgraph is folded: box, + rhomb, ellipse, and triangle. vertical order is the level position + (rank) of the summary node of an inner subgraph, if this subgraph is + folded. We can also specify level: int. The level is only + recognized, if an automatical layout is calculated. horizontal order + is the horizontal position of the summary node within a level. The + nodes which are specified with horizontal positions are ordered + according to these positions within the levels. The nodes which do + not have this attribute are inserted into this ordering by the + crossing reduction mechanism. Note that connected + components are handled separately, thus it is not possible to + intermix such components by specifying a horizontal order. If the + algorithm for downward laid out trees is used, the horizontal order + influences only the order of the child nodes at a node, but not the + order of the whole level. + Default is box, other: rhomb, ellipse, triangle. */ + enum shape shape; + + /* Vertical order is the level position (rank) of the summary node of an + inner subgraph, if this subgraph is folded. We can also specify + level: int. The level is only recognized, if an automatical layout is + calculated. */ + int vertical_order; + + /* Horizontal order is the horizontal position of the summary node within + a level. The nodes which are specified with horizontal positions are + ordered according to these positions within the levels. The nodes which + do not have this attribute are inserted into this ordering by the + crossing reduction mechanism. Note that connected components are + handled separately, thus it is not possible to intermix such components + by specifying a horizontal order. If the algorithm for downward laid + out trees is used, the horizontal order influences only the order of + the child nodes at a node, but not the order of the whole level. */ + int horizontal_order; + + /* xmax, ymax specify the maximal size of the virtual window that is + used to display the graph. This is usually larger than the displayed + part, thus the width and height of the displayed part cannot be + greater than xmax and ymax. Only those parts of the graph are drawn + that are inside the virtual window. The virtual window can be moved + over the potential infinite system of coordinates by special + positioning commands. + Defaults are 90 and 90. */ + int xmax; + int ymax; + + /* xy-base: specify the upper left corner coordinates of the graph + relatively to the root window. + Defaults are 5, 5. */ + int xbase; + int ybase; + + /* xspace, yspace the minimum horizontal and vertical distance between + nodes. xlspace is the horizontal distance between lines at the + points where they cross the levels. (At these points, dummy nodes + are used. In fact, this is the horizontal distance between dummy + nodes.) It is recommended to set xlspace to a larger value, if + splines are used to draw edges, to prevent sharp bendings. + Default are 20 and 70. */ + int xspace; + int yspace; + + /* The horizontal space between lines at the point where they cross + the levels. + defaults value is 1/2 xspace (polygone) and 4/5 xspace (splines)*/ + int xlspace; + + /* xraster, yraster specifies the raster distance for the position of + the nodes. The center of a node is aligned to this raster. xlraster + is the horizontal raster for the positions of the line control + points (the dummy nodes). It should be a divisor of xraster. + defaults are 1,1. */ + int xraster; + int yraster; + + /* xlraster is the horizontal raster for the positions of the line + control points (the dummy nodes). It should be a divisor of xraster. + defaults is 1. */ + int xlraster; + + /* hidden specifies the classes of edges that are hidden. + Edges that are within such a class are not laid out nor drawn. + Nodes that are only reachable (forward or backward) by edges of an + hidden class are not drawn. However, nodes that are not reachable + at all are drawn. (But see attribute ignore.singles.) Specification + of classes of hidden edges allows to hide parts of a graph, e.g., + annotations of a syntax tree. This attribute is only allowed at the + outermost level. More than one settings are possible to specify + exactly the set of classes that are hidden. Note the important + difference between hiding of edges and the edge line style invisible. + Hidden edges are not existent in the layout. Edges with line style + invisible are existent in the layout; they need space and may + produce crossings and influence the layout, but you cannot see + them. + No default value. */ + int hidden; + + /* Classname allows to introduce names for the edge classes. The names + are used in the menus. infoname allows to introduce names for the + additional text labels. The names are used in the menus. + defaults are 1,2,3... + By default, no class names. */ + struct classname *classname; + + /* Infoname allows to introduce names for the additional text labels. + The names are used in the menus. + Infoname is given by an integer and a string. + The default value is NULL. */ + struct infoname *infoname; + + /* Colorentry allows to fill the color map. A color is a triplet of integer + values for the red/green/blue-part. Each integer is between 0 (off) and + 255 (on), e.g., 0 0 0 is black and 255 255 255 is white. For instance + colorentry 75 : 70 130 180 sets the map entry 75 to steel blue. This + color can be used by specifying just the number 75. + Default id NULL. */ + struct colorentry *colorentry; + + /* layoutalgorithm chooses different graph layout algorithms + Possibilities are maxdepth, mindepth, maxdepthslow, mindepthslow, + maxdegree, mindegree, maxindegree, minindegree, maxoutdegree, + minoutdegree, minbackward, dfs and tree. The default algorithm tries + to give all edges the same orientation and is based on the + calculation of strongly connected components. The algorithms that + are based on depth first search are faster. While the simple dfs + does not enforce additionally constraints, the algorithm maxdepth + tries to increase the depth of the layout and the algorithm mindepth + tries to increase the wide of the layout. These algorithms are fast + heuristics. If they are not appropriate, the algorithms maxdepthslow + or mindepthslow also increase the depth or wide, but they are very + slow. The algorithm maxindegree lays out the nodes by scheduling the + nodes with the maximum of incoming edges first, and minindegree lays + out the nodes by scheduling the nodes with the minimum of incoming + edges first. In the same manner work the algorithms maxoutdegree and + minoutdegree for outgoing edges, and maxdegree and mindegree for the + sum of incoming and outgoing edges. These algorithms may have various + effects, and can sometimes be used as replacements of maxdepthslow + or mindepthslow. + + The algorithm minbackward can be used if the graph is acyclic. + The algorithm tree is a specialized method for downward laid out + trees. It is much faster on such tree-like graphs and results in a + balanced layout. + Default is normal. */ + enum layoutalgorithm layoutalgorithm; + + /* Layout downfactor, layout upfactor, layout nearfactor The layout + algorithm partitions the set of edges into edges pointing upward, + edges pointing downward, and edges pointing sidewards. The last type + of edges is also called near edges. If the layout.downfactor is + large compared to the layout.upfactor and the layout.nearfactor, + then the positions of the nodes is mainly determined by the edges + pointing downwards. If the layout.upfactor is large compared to the + layout.downfactor and the layout.nearfactor, then the positions of + the nodes is mainly determined by the edges pointing upwards. If the + layout.nearfactor is large, then the positions of the nodes is + mainly determined by the edges pointing sidewards. These attributes + have no effect, if the method for downward laid out trees is used. + Default is normal. */ + int layout_downfactor; + int layout_upfactor; + int layout_nearfactor; + /* Layout splinefactor determines the bending at splines. The factor + 100 indicates a very sharp bending, a factor 1 indicates a very flat + bending. Useful values are 30 : : : 80. */ + int layout_splinefactor; + + /* Late edge labels yes means that the graph is first partitioned and + then, labels are introduced. The default algorithm first creates + labels and then partitions the graph, which yield a more compact + layout, but may have more crossings. + Default is no. */ + enum decision late_edge_labels; + + /* Display edge labels yes means display labels and no means don't + display edge labels. + Default vaule is no. */ + enum decision display_edge_labels; + + /* Dirty edge labels yes enforces a fast layout of edge labels, which + may very ugly because several labels may be drawn at the same place. + Dirty edge labels cannot be used if splines are used. + Default is no. + */ + enum decision dirty_edge_labels; + + /* Finetuning no switches the fine tuning phase of the graph layout + algorithm off, while it is on as default. The fine tuning phase + tries to give all edges the same length. + Default is yes. */ + enum decision finetuning; + + /* Ignore singles yes hides all nodes which would appear single and + unconnected from the remaining graph. Such nodes have no edge at all + and are sometimes very ugly. Default is to show all nodes. + Default is no. */ + enum decision ignore_singles; + + /* priority phase yes replaces the normal pendulum method by a + specialized method: It forces straight long edges with 90 degree, + just as the straight phase. In fact, the straight phase is a fine + tune phase of the priority method. This phase is also recommended, + if an orthogonal layout is selected (see manhattan.edges). + Default is no. */ + enum decision priority_phase; + + /* manhattan edges yes switches the orthogonal layout on. Orthogonal + layout (or manhattan layout) means that all edges consist of line + segments with gradient 0 or 90 degree. Vertical edge segments might + by shared by several edges, while horizontal edge segments are never + shared. This results in very aesthetical layouts just for flowcharts. + If the orthogonal layout is used, then the priority phase and + straight phase should be used. Thus, these both phases are switched + on, too, unless priority layout and straight line tuning are + switched off explicitly. + Default is no. */ + enum decision manhattan_edges; + + /* Smanhattan edges yes switches a specialized orthogonal layout on: + Here, all horizontal edge segments between two levels share the same + horizontal line, i.e. not only vertical edge segments are shared, + but horizontal edge segments are shared by several edges, too. This + looks nice for trees but might be too confusing in general, because + the location of an edge might be ambiguously. + Default is no. */ + enum decision smanhattan_edges; + + /* Near edges no suppresses near edges and bent near edges in the + graph layout. + Default is yes. */ + enum decision near_edges; + + /* Orientation specifies the orientation of the graph: top.to.bottom, + bottom.to.top, left.to.right or right.to.left. Note: the normal + orientation is top.to.bottom. All explanations here are given + relatively to the normal orientation, i.e., e.g., if the orientation + is left to right, the attribute xlspace is not the horizontal but + the vertical distance between lines, etc. + Default is to_to_bottom. */ + enum orientation orientation; + + /* Node alignment specified the vertical alignment of nodes at the + horizontal reference line of the levels. If top is specified, the + tops of all nodes of a level have the same y-coordinate; on bottom, + the bottoms have the same y-coordinate, on center the nodes are + centered at the levels. + Default is center. */ + enum alignment node_alignment; + + /* Port sharing no suppresses the sharing of ports of edges at the + nodes. Normally, if multiple edges are adjacent to the same node, + and the arrow head of all these edges has the same visual appearance + (color, size, etc.), then these edges may share a port at a node, + i.e. only one arrow head is draw, and all edges are incoming into + this arrow head. This allows to have many edges adjacent to one node + without getting confused by too many arrow heads. If no port sharing + is used, each edge has its own port, i.e. its own place where it is + adjacent to the node. + Default is yes. */ + enum decision port_sharing; + + /* Arrow mode fixed (default) should be used, if port sharing is used, + because then, only a fixed set of rotations for the arrow heads are + used. If the arrow mode is free, then each arrow head is rotated + individually to each edge. But this can yield to a black spot, where + nothing is recognizable, if port sharing is used, since all these + qdifferently rotated arrow heads are drawn at the same place. If the + arrow mode is fixed, then the arrow head is rotated only in steps of + 45 degree, and only one arrow head occurs at each port. + Default is fixed. */ + enum arrow_mode arrow_mode; + + /* Treefactor The algorithm tree for downward laid out trees tries to + produce a medium dense, balanced tree-like layout. If the tree + factor is greater than 0.5, the tree edges are spread, i.e. they + get a larger gradient. This may improve the readability of the tree. + Note: it is not obvious whether spreading results in a more dense or + wide layout. For a tree, there is a tree factor such that the whole + tree is minimal wide. + Default is 0.5. */ + float treefactor; + + /* Spreadlevel This parameter only influences the algorithm tree, too. + For large, balanced trees, spreading of the uppermost nodes would + enlarge the width of the tree too much, such that the tree does not + fit anymore in a window. Thus, the spreadlevel specifies the minimal + level (rank) where nodes are spread. Nodes of levels upper than + spreadlevel are not spread. + Default is 1. */ + int spreadlevel; + + /* Crossing weight specifies the weight that is used for the crossing + reduction: bary (default), median, barymedian or medianbary. We + cannot give a general recommendation, which is the best method. For + graphs with very large average degree of edges (number of incoming + and outgoing edges at a node), the weight bary is the fastest + method. With the weights barymedian and medianbary, equal weights of + different nodes are not very probable, thus the crossing reduction + phase 2 might be very fast. + Default is bary. */ + enum crossing_type crossing_weight; + + /* Crossing phase2 is the most time consuming phase of the crossing + reduction. In this phase, the nodes that happen to have equal + crossing weights are permuted. By specifying no, this phase is + suppressed. + Default is yes. */ + enum decision crossing_phase2; + + /* Crossing optimization is a postprocessing phase after the normal + crossing reduction: we try to optimize locally, by exchanging pairs + of nodes to reduce the crossings. Although this phase is not very + time consuming, it can be suppressed by specifying no. + Default is yes. */ + enum decision crossing_optimization; + + /* View allows to select the fisheye views. Because + of the fixed size of the window that shows the graph, we normally + can only see a small amount of a large graph. If we shrink the graph + such that it fits into the window, we cannot recognize any detail + anymore. Fisheye views are coordinate transformations: the view onto + the graph is distort, to overcome this usage deficiency. The polar + fisheye is easy to explain: assume a projection of the plane that + contains the graph picture onto a spheric ball. If we now look onto + this ball in 3 D, we have a polar fisheye view. There is a focus + point which is magnified such that we see all details. Parts of the + plane that are far away from the focus point are demagnified very + much. Cartesian fisheye have a similar effect; only the formula for + the coordinate transformation is different. Selecting cfish means + the cartesian fisheye is used which demagnifies such that the whole + graph is visible (self adaptable cartesian fisheye). With fcfish, + the cartesian fisheye shows the region of a fixed radius around the + focus point (fixed radius cartesian fisheye). This region might be + smaller than the whole graph, but the demagnification needed to show + this region in the window is also not so large, thus more details + are recognizable. With pfish the self adaptable polar fisheye is + selected that shows the whole graph, and with fpfish the fixed + radius polar fisheye is selected. + Default is normal view. */ + enum view view; + + /* Edges no suppresses the drawing of edges. + Default is yes. */ + enum decision edges; + + /* Nodes no suppresses the drawing of nodes. + Default is yes. */ + enum decision nodes; + + /* Splines specifies whether splines are used to draw edges (yes or no). + As default, polygon segments are used to draw edges, because this is + much faster. Note that the spline drawing routine is not fully + validated, and is very slow. Its use is mainly to prepare high + quality PostScript output for very small graphs. + Default is no. */ + enum decision splines; + + /* Bmax set the maximal number of iterations that are done for the + reduction of edge bendings. + Default is 100. */ + int bmax; + + /* Cmin set the minimal number of iterations that are done for the + crossing reduction with the crossing weights. The normal method + stops if two consecutive checks does not reduce the number of + crossings anymore. However, this increasing of the number of + crossings might be locally, such that after some more iterations, + the crossing number might decrease much more. + Default is 0. */ + int cmin; + + /* Cmax set the maximal number of interactions for crossing reduction. + This is helpful for speedup the layout process. + Default is infinite. */ + int cmax; + + /* Pmin set the minimal number of iterations that is done with the + pendulum method. Similar to the crossing reduction, this method + stops if the `imbalancement weight' does not decreases anymore. + However, the increasing of the imbalancement weight might be locally, + such that after some more iterations, the imbalancement weight might + decrease much more. + Default is 0. */ + int pmin; + + /* Pmax set the maximal number of iterations of the pendulum method. + This is helpful for speedup the layout process. + Default is 100. */ + int pmax; + + /* Rmin set the minimal number of iterations that is done with the + rubberband method. This is similar as for the pendulum method. + Default is 0. */ + int rmin; + + /* Rmax set the maximal number of iterations of the rubberband method. + This is helpful for speedup the layout process. + Default is 100. */ + int rmax; + + /* Smax set the maximal number of iterations of the straight line + recognition phase (useful only, if the straight line recognition + phase is switched on, see attribute straight.phase). + Default is 100. */ + int smax; + + /* Generic values. + */ + node node; + edge edge; + + /* List of nodes declared. + Pointer. */ + node *node_list; + + /* List of edges declared. + Pointer. */ + edge *edge_list; + +}; + +/* Graph typedefs. */ +typedef struct graph graph; + +void new_graph (graph *g); +void new_node (node *n); +void new_edge (edge *e); + +void add_node (graph *g, node *n); +void add_edge (graph *g, edge *e); + +void add_colorentry (graph *g, int color_idx, int red_cp, + int green_cp, int blue_cp); +void add_classname (graph *g, int val, const char *name); +void add_infoname (graph *g, int val, const char *name); + +void open_node (FILE *fout); +void output_node (node *n, FILE *fout); +void close_node (FILE *fout); + +void open_edge (edge *e, FILE *fout); +void output_edge (edge *e, FILE *fout); +void close_edge (FILE *fout); + +void open_graph (FILE *fout); +void output_graph (graph *g, FILE *fout); +void close_graph (graph *g, FILE *fout); + +#endif /* VCG_H_ */ diff --git a/src/apps/bin/bison/src/vcg_defaults.h b/src/apps/bin/bison/src/vcg_defaults.h new file mode 100644 index 0000000000..36d49bbb18 --- /dev/null +++ b/src/apps/bin/bison/src/vcg_defaults.h @@ -0,0 +1,181 @@ +/* VCG description handler for Bison. + + Copyright (C) 2001, 2002 Free Software Foundation, Inc. + + This file is part of Bison, the GNU Compiler Compiler. + + Bison is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2, or (at your option) + any later version. + + Bison is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with Bison; see the file COPYING. If not, write to + the Free Software Foundation, Inc., 59 Temple Place - Suite 330, + Boston, MA 02111-1307, USA. */ + +#ifndef VCG_DEFAULTS_H_ +# define VCG_DEFAULTS_H_ + +/* Graph defaults. */ +# define G_TITLE NULL +# define G_LABEL NULL +# define G_INFOS1 NULL +# define G_INFOS2 NULL +# define G_INFOS3 NULL + +# define G_COLOR white +# define G_TEXTCOLOR black +# define G_BORDERCOLOR G_TEXTCOLOR + +# define G_WIDTH 100 +# define G_HEIGHT 100 +# define G_BORDERWIDTH 2 + +# define G_X 0 +# define G_Y 0 + +# define G_FOLDING 0 + +# define G_SHRINK 1 +# define G_EXPAND 1 + +# define G_TEXTMODE centered +# define G_SHAPE box + +# define G_VERTICAL_ORDER 0 /* Unspecified for subgraphs. */ +# define G_HORIZONTAL_ORDER 0 /* Unspecified for subgraphs. */ + +# define G_XMAX 90 /* Not output */ +# define G_YMAX 90 /* Not output */ + +# define G_XBASE 5 +# define G_YBASE 5 + +# define G_XSPACE 20 +# define G_YSPACE 70 +# define G_XLSPACE G_XSPACE / 2 /* Not output */ + +# define G_XRASTER 1 +# define G_YRASTER 1 +# define G_XLRASTER 1 + +# define G_HIDDEN -1 /* No default value. */ + +# define G_CLASSNAME NULL /* No class name association */ +# define G_INFONAME NULL +# define G_COLORENTRY NULL + +# define G_LAYOUTALGORITHM normal +# define G_LAYOUT_DOWNFACTOR 1 +# define G_LAYOUT_UPFACTOR 1 +# define G_LAYOUT_NEARFACTOR 1 +# define G_LAYOUT_SPLINEFACTOR 70 + +# define G_LATE_EDGE_LABELS no +# define G_DISPLAY_EDGE_LABELS no +# define G_DIRTY_EDGE_LABELS no +# define G_FINETUNING yes +# define G_IGNORE_SINGLES no +# define G_LONG_STRAIGHT_PHASE no +# define G_PRIORITY_PHASE no +# define G_MANHATTAN_EDGES no +# define G_SMANHATTAN_EDGES no +# define G_NEAR_EDGES yes + +# define G_ORIENTATION top_to_bottom +# define G_NODE_ALIGNMENT center +# define G_PORT_SHARING yes +# define G_ARROW_MODE fixed +# define G_TREEFACTOR 0.5 +# define G_SPREADLEVEL 1 +# define G_CROSSING_WEIGHT bary +# define G_CROSSING_PHASE2 yes +# define G_CROSSING_OPTIMIZATION yes +# define G_VIEW normal_view + +# define G_EDGES yes +# define G_NODES yes +# define G_SPLINES no + +# define G_BMAX 100 +# define G_CMIN 0 +# define G_CMAX INT_MAX +# define G_PMIN 0 +# define G_PMAX 100 +# define G_RMIN 0 +# define G_RMAX 100 +# define G_SMAX 100 + +# define G_NODE_LIST NULL +# define G_EDGE_LIST NULL + +/* Nodes defaults. */ +# define N_TITLE NULL +# define N_LABEL NULL + +# define N_LOCX -1 /* Default unspcified */ +# define N_LOCY -1 /* Default unspcified */ + +# define N_VERTICAL_ORDER -1 /* Default unspcified */ +# define N_HORIZONTAL_ORDER -1 /* Default unspcified */ + +# define N_WIDTH -1 /* We assume that we can't define it now. */ +# define N_HEIGHT -1 /* also. */ + +# define N_SHRINK 1 +# define N_EXPAND 1 + +# define N_FOLDING -1 /* no explicit default value. */ + +# define N_SHAPE box +# define N_TEXTMODE centered +# define N_BORDERWIDTH 2 + +# define N_COLOR white +# define N_TEXTCOLOR black +# define N_BORDERCOLOR N_TEXTCOLOR + +# define N_INFOS1 NULL +# define N_INFOS2 NULL +# define N_INFOS3 NULL + +# define N_NEXT NULL + +/* Edge defaults. */ +# define E_EDGE_TYPE normal_edge + +# define E_SOURCENAME NULL /* Mandatory. */ +# define E_TARGETNAME NULL /* Mandatory. */ +# define E_LABEL NULL + +# define E_LINESTYLE continuous +# define E_THICKNESS 2 + +# define E_CLASS 1 + +# define E_COLOR black +# define E_TEXTCOLOR E_COLOR +# define E_ARROWCOLOR E_COLOR +# define E_BACKARROWCOLOR E_COLOR + +# define E_ARROWSIZE 10 +# define E_BACKARROWSIZE 0 + +# define E_ARROWSTYLE solid +# define E_BACKARROWSTYLE none + +# define E_PRIORITY 1 + +# define E_ANCHOR -1 + +# define E_HORIZONTAL_ORDER -1 + +# define E_NEXT NULL + +#endif /* not VCG_DEFAULTS_H_ */ diff --git a/src/apps/bin/bison/tests/Makefile.am b/src/apps/bin/bison/tests/Makefile.am new file mode 100644 index 0000000000..c6bf2feddb --- /dev/null +++ b/src/apps/bin/bison/tests/Makefile.am @@ -0,0 +1,98 @@ +## Process this file with automake to create Makefile.in. + +## Makefile for Bison testsuite. +## Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + +## This program is free software; you can redistribute it and/or modify +## it under the terms of the GNU General Public License as published by +## the Free Software Foundation; either version 2, or (at your option) +## any later version. + +## This program is distributed in the hope that it will be useful, +## but WITHOUT ANY WARRANTY; without even the implied warranty of +## MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +## GNU General Public License for more details. + +## You should have received a copy of the GNU General Public License +## along with this program; if not, write to the Free Software +## Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +## 02111-1307, USA. + +EXTRA_DIST = $(TESTSUITE_AT) testsuite package.m4 + +DISTCLEANFILES = atconfig $(check_SCRIPTS) +MAINTAINERCLEANFILES = Makefile.in $(TESTSUITE) + +## ------------ ## +## package.m4. ## +## ------------ ## + +$(srcdir)/package.m4: $(top_srcdir)/configure.ac + { \ + echo '# Signature of the current package.'; \ + echo 'm4_define([AT_PACKAGE_NAME], [@PACKAGE_NAME@])'; \ + echo 'm4_define([AT_PACKAGE_TARNAME], [@PACKAGE_TARNAME@])'; \ + echo 'm4_define([AT_PACKAGE_VERSION], [@PACKAGE_VERSION@])'; \ + echo 'm4_define([AT_PACKAGE_STRING], [@PACKAGE_STRING@])'; \ + echo 'm4_define([AT_PACKAGE_BUGREPORT], [@PACKAGE_BUGREPORT@])'; \ + } >$(srcdir)/package.m4 + +## ------------ ## +## Test suite. ## +## ------------ ## + +TESTSUITE_AT = \ + local.at \ + testsuite.at \ + input.at \ + output.at sets.at reduce.at \ + synclines.at headers.at actions.at conflicts.at \ + calc.at \ + torture.at existing.at regression.at \ + cxx-type.at glr-regression.at + +TESTSUITE = $(srcdir)/testsuite + +AUTOTEST = $(AUTOM4TE) --language=autotest +$(TESTSUITE): package.m4 $(TESTSUITE_AT) + $(AUTOTEST) -I $(srcdir) testsuite.at -o $@.tmp + mv $@.tmp $@ + +atconfig: $(top_builddir)/config.status + cd $(top_builddir) && ./config.status tests/$@ + +clean-local: + test ! -f $(TESTSUITE) || $(SHELL) $(TESTSUITE) --clean + +check-local: atconfig atlocal $(TESTSUITE) + $(SHELL) $(TESTSUITE) + +check_SCRIPTS = bison + +# Run the test suite on the *installed* tree. +installcheck-local: + $(SHELL) $(TESTSUITE) AUTOTEST_PATH=$(exec_prefix)/bin + +# Be real mean with it. +.PHONY: maintainer-check-g++ +maintainer-check-g++: $(TESTSUITE) + if test -n "$(VALGRIND)"; then \ + $(TESTSUITE) CC='$(GXX)'; \ + else \ + true; \ + fi + +.PHONY: maintainer-check-posix +maintainer-check-posix: $(TESTSUITE) + $(TESTSUITE) POSIXLY_CORRECT=1 + +.PHONY: maintainer-check-valgrind +maintainer-check-valgrind: $(TESTSUITE) + if test -n "$(VALGRIND)"; then \ + $(TESTSUITE) PREBISON='$(VALGRIND) -q' PREPARSER='$(VALGRIND) -q'; \ + else \ + true; \ + fi + +.PHONY: maintainer-check +maintainer-check: maintainer-check-posix maintainer-check-valgrind maintainer-check-g++ diff --git a/src/apps/bin/bison/tests/Makefile.in b/src/apps/bin/bison/tests/Makefile.in new file mode 100644 index 0000000000..e46243ebe2 --- /dev/null +++ b/src/apps/bin/bison/tests/Makefile.in @@ -0,0 +1,411 @@ +# Makefile.in generated by automake 1.8.5 from Makefile.am. +# @configure_input@ + +# Copyright (C) 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001, 2002, +# 2003, 2004 Free Software Foundation, Inc. +# This Makefile.in is free software; the Free Software Foundation +# gives unlimited permission to copy and/or distribute it, +# with or without modifications, as long as this notice is preserved. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY, to the extent permitted by law; without +# even the implied warranty of MERCHANTABILITY or FITNESS FOR A +# PARTICULAR PURPOSE. + +@SET_MAKE@ +srcdir = @srcdir@ +top_srcdir = @top_srcdir@ +VPATH = @srcdir@ +pkgdatadir = $(datadir)/@PACKAGE@ +pkglibdir = $(libdir)/@PACKAGE@ +pkgincludedir = $(includedir)/@PACKAGE@ +top_builddir = .. +am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd +INSTALL = @INSTALL@ +install_sh_DATA = $(install_sh) -c -m 644 +install_sh_PROGRAM = $(install_sh) -c +install_sh_SCRIPT = $(install_sh) -c +INSTALL_HEADER = $(INSTALL_DATA) +transform = $(program_transform_name) +NORMAL_INSTALL = : +PRE_INSTALL = : +POST_INSTALL = : +NORMAL_UNINSTALL = : +PRE_UNINSTALL = : +POST_UNINSTALL = : +host_triplet = @host@ +subdir = tests +DIST_COMMON = $(srcdir)/Makefile.am $(srcdir)/Makefile.in \ + $(srcdir)/atlocal.in $(srcdir)/bison.in +ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 +am__aclocal_m4_deps = $(top_srcdir)/m4/alloca.m4 \ + $(top_srcdir)/m4/dirname.m4 $(top_srcdir)/m4/dmalloc.m4 \ + $(top_srcdir)/m4/dos.m4 $(top_srcdir)/m4/error.m4 \ + $(top_srcdir)/m4/exitfail.m4 $(top_srcdir)/m4/extensions.m4 \ + $(top_srcdir)/m4/getopt.m4 $(top_srcdir)/m4/gettext.m4 \ + $(top_srcdir)/m4/gnulib.m4 $(top_srcdir)/m4/hard-locale.m4 \ + $(top_srcdir)/m4/hash.m4 $(top_srcdir)/m4/iconv.m4 \ + $(top_srcdir)/m4/lib-ld.m4 $(top_srcdir)/m4/lib-link.m4 \ + $(top_srcdir)/m4/lib-prefix.m4 $(top_srcdir)/m4/m4.m4 \ + $(top_srcdir)/m4/mbrtowc.m4 $(top_srcdir)/m4/mbstate_t.m4 \ + $(top_srcdir)/m4/mbswidth.m4 $(top_srcdir)/m4/nls.m4 \ + $(top_srcdir)/m4/obstack.m4 $(top_srcdir)/m4/onceonly.m4 \ + $(top_srcdir)/m4/po.m4 $(top_srcdir)/m4/progtest.m4 \ + $(top_srcdir)/m4/quote.m4 $(top_srcdir)/m4/quotearg.m4 \ + $(top_srcdir)/m4/stdbool.m4 $(top_srcdir)/m4/stpcpy.m4 \ + $(top_srcdir)/m4/strndup.m4 $(top_srcdir)/m4/strnlen.m4 \ + $(top_srcdir)/m4/subpipe.m4 $(top_srcdir)/m4/timevar.m4 \ + $(top_srcdir)/m4/unlocked-io.m4 $(top_srcdir)/m4/warning.m4 \ + $(top_srcdir)/m4/xalloc.m4 $(top_srcdir)/m4/xstrndup.m4 \ + $(top_srcdir)/configure.ac +am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ + $(ACLOCAL_M4) +mkinstalldirs = $(SHELL) $(top_srcdir)/config/mkinstalldirs +CONFIG_HEADER = $(top_builddir)/config.h +CONFIG_CLEAN_FILES = atlocal bison +SOURCES = +DIST_SOURCES = +DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) +ACLOCAL = @ACLOCAL@ +ALLOCA = @ALLOCA@ +ALLOCA_H = @ALLOCA_H@ +AMDEP_FALSE = @AMDEP_FALSE@ +AMDEP_TRUE = @AMDEP_TRUE@ +AMTAR = @AMTAR@ +AUTOCONF = @AUTOCONF@ +AUTOHEADER = @AUTOHEADER@ +AUTOM4TE = @AUTOM4TE@ +AUTOMAKE = @AUTOMAKE@ +AWK = @AWK@ +CC = @CC@ +CCDEPMODE = @CCDEPMODE@ +CFLAGS = @CFLAGS@ +CPP = @CPP@ +CPPFLAGS = @CPPFLAGS@ +CXX = @CXX@ +CXXDEPMODE = @CXXDEPMODE@ +CXXFLAGS = @CXXFLAGS@ +CYGPATH_W = @CYGPATH_W@ +DEFS = @DEFS@ +DEPDIR = @DEPDIR@ +ECHO_C = @ECHO_C@ +ECHO_N = @ECHO_N@ +ECHO_T = @ECHO_T@ +EGREP = @EGREP@ +EXEEXT = @EXEEXT@ +GCC = @GCC@ +GMSGFMT = @GMSGFMT@ +HAVE__BOOL = @HAVE__BOOL@ +INSTALL_DATA = @INSTALL_DATA@ +INSTALL_PROGRAM = @INSTALL_PROGRAM@ +INSTALL_SCRIPT = @INSTALL_SCRIPT@ +INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ +INTLLIBS = @INTLLIBS@ +LDFLAGS = @LDFLAGS@ +LEX = @LEX@ +LEXLIB = @LEXLIB@ +LEX_OUTPUT_ROOT = @LEX_OUTPUT_ROOT@ +LIBICONV = @LIBICONV@ +LIBINTL = @LIBINTL@ +LIBOBJS = @LIBOBJS@ +LIBS = @LIBS@ +LTLIBICONV = @LTLIBICONV@ +LTLIBINTL = @LTLIBINTL@ +LTLIBOBJS = @LTLIBOBJS@ +M4 = @M4@ +MAKEINFO = @MAKEINFO@ +MKINSTALLDIRS = @MKINSTALLDIRS@ +MSGFMT = @MSGFMT@ +MSGMERGE = @MSGMERGE@ +O0CFLAGS = @O0CFLAGS@ +OBJEXT = @OBJEXT@ +PACKAGE = @PACKAGE@ +PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ +PACKAGE_NAME = @PACKAGE_NAME@ +PACKAGE_STRING = @PACKAGE_STRING@ +PACKAGE_TARNAME = @PACKAGE_TARNAME@ +PACKAGE_VERSION = @PACKAGE_VERSION@ +PATH_SEPARATOR = @PATH_SEPARATOR@ +POSUB = @POSUB@ +RANLIB = @RANLIB@ +SET_MAKE = @SET_MAKE@ +SHELL = @SHELL@ +STDBOOL_H = @STDBOOL_H@ +STRIP = @STRIP@ +USE_NLS = @USE_NLS@ +VALGRIND = @VALGRIND@ +VERSION = @VERSION@ +WARNING_CFLAGS = @WARNING_CFLAGS@ +WARNING_CXXFLAGS = @WARNING_CXXFLAGS@ +WERROR_CFLAGS = @WERROR_CFLAGS@ +XGETTEXT = @XGETTEXT@ +YACC = @YACC@ +YACC_LIBRARY = @YACC_LIBRARY@ +YACC_SCRIPT = @YACC_SCRIPT@ +ac_ct_CC = @ac_ct_CC@ +ac_ct_CXX = @ac_ct_CXX@ +ac_ct_RANLIB = @ac_ct_RANLIB@ +ac_ct_STRIP = @ac_ct_STRIP@ +am__fastdepCC_FALSE = @am__fastdepCC_FALSE@ +am__fastdepCC_TRUE = @am__fastdepCC_TRUE@ +am__fastdepCXX_FALSE = @am__fastdepCXX_FALSE@ +am__fastdepCXX_TRUE = @am__fastdepCXX_TRUE@ +am__include = @am__include@ +am__leading_dot = @am__leading_dot@ +am__quote = @am__quote@ +bindir = @bindir@ +build = @build@ +build_alias = @build_alias@ +build_cpu = @build_cpu@ +build_os = @build_os@ +build_vendor = @build_vendor@ +datadir = @datadir@ +exec_prefix = @exec_prefix@ +host = @host@ +host_alias = @host_alias@ +host_cpu = @host_cpu@ +host_os = @host_os@ +host_vendor = @host_vendor@ +includedir = @includedir@ +infodir = @infodir@ +install_sh = @install_sh@ +libdir = @libdir@ +libexecdir = @libexecdir@ +localstatedir = @localstatedir@ +mandir = @mandir@ +mkdir_p = @mkdir_p@ +oldincludedir = @oldincludedir@ +prefix = @prefix@ +program_transform_name = @program_transform_name@ +sbindir = @sbindir@ +sharedstatedir = @sharedstatedir@ +sysconfdir = @sysconfdir@ +target_alias = @target_alias@ +EXTRA_DIST = $(TESTSUITE_AT) testsuite package.m4 +DISTCLEANFILES = atconfig $(check_SCRIPTS) +MAINTAINERCLEANFILES = Makefile.in $(TESTSUITE) +TESTSUITE_AT = \ + local.at \ + testsuite.at \ + input.at \ + output.at sets.at reduce.at \ + synclines.at headers.at actions.at conflicts.at \ + calc.at \ + torture.at existing.at regression.at \ + cxx-type.at glr-regression.at + +TESTSUITE = $(srcdir)/testsuite +AUTOTEST = $(AUTOM4TE) --language=autotest +check_SCRIPTS = bison +all: all-am + +.SUFFIXES: +$(srcdir)/Makefile.in: $(srcdir)/Makefile.am $(am__configure_deps) + @for dep in $?; do \ + case '$(am__configure_deps)' in \ + *$$dep*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh \ + && exit 0; \ + exit 1;; \ + esac; \ + done; \ + echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu tests/Makefile'; \ + cd $(top_srcdir) && \ + $(AUTOMAKE) --gnu tests/Makefile +.PRECIOUS: Makefile +Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status + @case '$?' in \ + *config.status*) \ + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ + *) \ + echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe)'; \ + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__depfiles_maybe);; \ + esac; + +$(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh + +$(top_srcdir)/configure: $(am__configure_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +$(ACLOCAL_M4): $(am__aclocal_m4_deps) + cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh +atlocal: $(top_builddir)/config.status $(srcdir)/atlocal.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +bison: $(top_builddir)/config.status $(srcdir)/bison.in + cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ +uninstall-info-am: +tags: TAGS +TAGS: + +ctags: CTAGS +CTAGS: + + +distdir: $(DISTFILES) + @srcdirstrip=`echo "$(srcdir)" | sed 's|.|.|g'`; \ + topsrcdirstrip=`echo "$(top_srcdir)" | sed 's|.|.|g'`; \ + list='$(DISTFILES)'; for file in $$list; do \ + case $$file in \ + $(srcdir)/*) file=`echo "$$file" | sed "s|^$$srcdirstrip/||"`;; \ + $(top_srcdir)/*) file=`echo "$$file" | sed "s|^$$topsrcdirstrip/|$(top_builddir)/|"`;; \ + esac; \ + if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ + dir=`echo "$$file" | sed -e 's,/[^/]*$$,,'`; \ + if test "$$dir" != "$$file" && test "$$dir" != "."; then \ + dir="/$$dir"; \ + $(mkdir_p) "$(distdir)$$dir"; \ + else \ + dir=''; \ + fi; \ + if test -d $$d/$$file; then \ + if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ + cp -pR $(srcdir)/$$file $(distdir)$$dir || exit 1; \ + fi; \ + cp -pR $$d/$$file $(distdir)$$dir || exit 1; \ + else \ + test -f $(distdir)/$$file \ + || cp -p $$d/$$file $(distdir)/$$file \ + || exit 1; \ + fi; \ + done +check-am: all-am + $(MAKE) $(AM_MAKEFLAGS) $(check_SCRIPTS) + $(MAKE) $(AM_MAKEFLAGS) check-local +check: check-am +all-am: Makefile +installdirs: +install: install-am +install-exec: install-exec-am +install-data: install-data-am +uninstall: uninstall-am + +install-am: all-am + @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am + +installcheck: installcheck-am +install-strip: + $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ + install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ + `test -z '$(STRIP)' || \ + echo "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'"` install +mostlyclean-generic: + +clean-generic: + +distclean-generic: + -rm -f $(CONFIG_CLEAN_FILES) + -test -z "$(DISTCLEANFILES)" || rm -f $(DISTCLEANFILES) + +maintainer-clean-generic: + @echo "This command is intended for maintainers to use" + @echo "it deletes files that may require special tools to rebuild." + -test -z "$(MAINTAINERCLEANFILES)" || rm -f $(MAINTAINERCLEANFILES) +clean: clean-am + +clean-am: clean-generic clean-local mostlyclean-am + +distclean: distclean-am + -rm -f Makefile +distclean-am: clean-am distclean-generic + +dvi: dvi-am + +dvi-am: + +html: html-am + +info: info-am + +info-am: + +install-data-am: + +install-exec-am: + +install-info: install-info-am + +install-man: + +installcheck-am: installcheck-local + +maintainer-clean: maintainer-clean-am + -rm -f Makefile +maintainer-clean-am: distclean-am maintainer-clean-generic + +mostlyclean: mostlyclean-am + +mostlyclean-am: mostlyclean-generic + +pdf: pdf-am + +pdf-am: + +ps: ps-am + +ps-am: + +uninstall-am: uninstall-info-am + +.PHONY: all all-am check check-am check-local clean clean-generic \ + clean-local distclean distclean-generic distdir dvi dvi-am \ + html html-am info info-am install install-am install-data \ + install-data-am install-exec install-exec-am install-info \ + install-info-am install-man install-strip installcheck \ + installcheck-am installcheck-local installdirs \ + maintainer-clean maintainer-clean-generic mostlyclean \ + mostlyclean-generic pdf pdf-am ps ps-am uninstall uninstall-am \ + uninstall-info-am + + +$(srcdir)/package.m4: $(top_srcdir)/configure.ac + { \ + echo '# Signature of the current package.'; \ + echo 'm4_define([AT_PACKAGE_NAME], [@PACKAGE_NAME@])'; \ + echo 'm4_define([AT_PACKAGE_TARNAME], [@PACKAGE_TARNAME@])'; \ + echo 'm4_define([AT_PACKAGE_VERSION], [@PACKAGE_VERSION@])'; \ + echo 'm4_define([AT_PACKAGE_STRING], [@PACKAGE_STRING@])'; \ + echo 'm4_define([AT_PACKAGE_BUGREPORT], [@PACKAGE_BUGREPORT@])'; \ + } >$(srcdir)/package.m4 +$(TESTSUITE): package.m4 $(TESTSUITE_AT) + $(AUTOTEST) -I $(srcdir) testsuite.at -o $@.tmp + mv $@.tmp $@ + +atconfig: $(top_builddir)/config.status + cd $(top_builddir) && ./config.status tests/$@ + +clean-local: + test ! -f $(TESTSUITE) || $(SHELL) $(TESTSUITE) --clean + +check-local: atconfig atlocal $(TESTSUITE) + $(SHELL) $(TESTSUITE) + +# Run the test suite on the *installed* tree. +installcheck-local: + $(SHELL) $(TESTSUITE) AUTOTEST_PATH=$(exec_prefix)/bin + +# Be real mean with it. +.PHONY: maintainer-check-g++ +maintainer-check-g++: $(TESTSUITE) + if test -n "$(VALGRIND)"; then \ + $(TESTSUITE) CC='$(GXX)'; \ + else \ + true; \ + fi + +.PHONY: maintainer-check-posix +maintainer-check-posix: $(TESTSUITE) + $(TESTSUITE) POSIXLY_CORRECT=1 + +.PHONY: maintainer-check-valgrind +maintainer-check-valgrind: $(TESTSUITE) + if test -n "$(VALGRIND)"; then \ + $(TESTSUITE) PREBISON='$(VALGRIND) -q' PREPARSER='$(VALGRIND) -q'; \ + else \ + true; \ + fi + +.PHONY: maintainer-check +maintainer-check: maintainer-check-posix maintainer-check-valgrind maintainer-check-g++ +# Tell versions [3.59,3.63) of GNU make to not export all variables. +# Otherwise a system limit (for SysV at least) may be exceeded. +.NOEXPORT: diff --git a/src/apps/bin/bison/tests/actions.at b/src/apps/bin/bison/tests/actions.at new file mode 100644 index 0000000000..d97e9164ce --- /dev/null +++ b/src/apps/bin/bison/tests/actions.at @@ -0,0 +1,560 @@ +# Executing Actions. -*- Autotest -*- +# Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AT_BANNER([[User Actions.]]) + +## ------------------ ## +## Mid-rule actions. ## +## ------------------ ## + +AT_SETUP([Mid-rule actions]) + +# Bison once forgot the mid-rule actions. It was because the action +# was attached to the host rule (the one with the mid-rule action), +# instead of being attached to the empty rule dedicated to this +# action. + +AT_DATA_GRAMMAR([[input.y]], +[[%{ +# include +# include + static void yyerror (const char *msg); + static int yylex (void); +# define YYDEBUG 1 +# define YYERROR_VERBOSE 1 +%} +%% +exp: { putchar ('0'); } + '1' { putchar ('1'); } + '2' { putchar ('2'); } + '3' { putchar ('3'); } + '4' { putchar ('4'); } + '5' { putchar ('5'); } + '6' { putchar ('6'); } + '7' { putchar ('7'); } + '8' { putchar ('8'); } + '9' { putchar ('9'); } + { putchar ('\n'); } + ; +%% +static int +yylex (void) +{ + static const char *input = "123456789"; + return *input++; +} + +static void +yyerror (const char *msg) +{ + fprintf (stderr, "%s\n", msg); +} + +int +main (void) +{ + return yyparse (); +} +]]) + +AT_CHECK([bison -d -v -o input.c input.y]) +AT_COMPILE([input]) +AT_PARSER_CHECK([./input], 0, +[[0123456789 +]]) + +AT_CLEANUP + + + +## ---------------------- ## +## Actions after errors. ## +## ---------------------- ## + +AT_SETUP([Actions after errors]) + + + +AT_DATA_GRAMMAR([[input.y]], +[[%{ +#include +#include + +static int yylex (void); +static void yyerror (char const *); + +#define YYDEBUG 1 +%} +%union { int ival; } +%type 'x' ';' thing line input + +%% +input: + /* Nothing. */ + { + $$ = 0; + printf ("input (%d): /* Nothing */\n", $$); + } +| line input /* Right recursive to load the stack so that popping at + EOF can be exercised. */ + { + $$ = 2; + printf ("input (%d): line (%d) input (%d)\n", $$, $1, $2); + } +; + +line: + thing thing thing ';' + { + $$ = $1; + printf ("line (%d): thing (%d) thing (%d) thing (%d) ';' (%d)\n", + $$, $1, $2, $3, $4); + } +| thing thing ';' + { + $$ = $1; + printf ("line (%d): thing (%d) thing (%d) ';' (%d)\n", $$, $1, $2, $3); + } +| thing ';' + { + $$ = $1; + printf ("line (%d): thing (%d) ';' (%d)\n", $$, $1, $2); + } +| error ';' + { + $$ = -1; + printf ("line (%d): error ';' (%d)\n", $$, $2); + } +; + +thing: + 'x' + { + $$ = $1; + printf ("thing (%d): 'x' (%d)\n", $$, $1); + } +; +%% +static size_t counter; + +static int +yylex (void) +{ + static char const input[] = + { + /* Exercise the discarding of stack top and input until `error' + can be reduced. */ + 'x', 'x', 'x', 'x', 'x', 'x', ';', + + /* Load the stack and provoke an error that cannot be caught by + the grammar, to check that the stack is cleared. */ + 'x', 'x', ';', + 'x', ';', + 'y' + }; + + if (counter < sizeof input) + { + yylval.ival = counter; + printf ("sending: '%c' (%d)\n", input[counter], yylval.ival); + return input[counter++]; + } + else + { + printf ("sending: EOF\n"); + return EOF; + } +} + +static void +yyerror (char const *msg) +{ + printf ("%lu: %s\n", (unsigned long int) counter, msg); +} + +int +main (void) +{ + yydebug = !!getenv ("YYDEBUG"); + return yyparse (); +} +]]) + +AT_CHECK([bison -o input.c input.y]) +AT_COMPILE([input]) +AT_PARSER_CHECK([./input], 1, +[[sending: 'x' (0) +thing (0): 'x' (0) +sending: 'x' (1) +thing (1): 'x' (1) +sending: 'x' (2) +thing (2): 'x' (2) +sending: 'x' (3) +4: syntax error +sending: 'x' (4) +sending: 'x' (5) +sending: ';' (6) +line (-1): error ';' (6) +sending: 'x' (7) +thing (7): 'x' (7) +sending: 'x' (8) +thing (8): 'x' (8) +sending: ';' (9) +line (7): thing (7) thing (8) ';' (9) +sending: 'x' (10) +thing (10): 'x' (10) +sending: ';' (11) +line (10): thing (10) ';' (11) +sending: 'y' (12) +13: syntax error +sending: EOF +]]) + +AT_CLEANUP + + + +## ---------------- ## +## Exotic Dollars. ## +## ---------------- ## + +AT_SETUP([Exotic Dollars]) + +AT_DATA_GRAMMAR([[input.y]], +[[%{ +# include +# include + static void yyerror (const char *msg); + static int yylex (void); +# define YYDEBUG 1 +# define YYERROR_VERBOSE 1 +%} + +%union +{ + int val; +}; + +%type a_1 a_2 a_5 + sum_of_the_five_previous_values + +%% +exp: a_1 a_2 { $$ = 3; } { $$ = $3 + 1; } a_5 + sum_of_the_five_previous_values + { + printf ("%d\n", $6); + } +; +a_1: { $$ = 1; }; +a_2: { $$ = 2; }; +a_5: { $$ = 5; }; + +sum_of_the_five_previous_values: + { + $$ = $0 + $-1 + $-2 + $-3 + $-4; + } +; + +%% +static int +yylex (void) +{ + return EOF; +} + +static void +yyerror (const char *msg) +{ + fprintf (stderr, "%s\n", msg); +} + +int +main (void) +{ + return yyparse (); +} +]]) + +AT_CHECK([bison -d -v -o input.c input.y]) +AT_COMPILE([input]) +AT_PARSER_CHECK([./input], 0, +[[15 +]]) + +AT_CLEANUP + + + +## -------------------------- ## +## Printers and Destructors. ## +## -------------------------- ## + +# _AT_CHECK_PRINTER_AND_DESTRUCTOR($1, $2, $3, $4, BISON-DIRECTIVE) +# ----------------------------------------------------------------- +m4_define([_AT_CHECK_PRINTER_AND_DESTRUCTOR], +[m4_if([$1$2$3], $[1]$[2]$[3], [], + [m4_fatal([$0: Invalid arguments: $@])])dnl + +AT_SETUP([Printers and Destructors: $5]) + +# Make sure complex $n work. + +AT_BISON_OPTION_PUSHDEFS([$5]) +AT_DATA_GRAMMAR([[input.y]], +[[$5 +%{ +#include +#include +]AT_LALR1_CC_IF( + [#define RANGE(Location) (Location).begin.line, (Location).end.line], + [#define RANGE(Location) (Location).first_line, (Location).last_line]) +[%} +%error-verbose +%debug +%verbose +%locations +%union +{ + int ival; +} + +%{ +]AT_LALR1_CC_IF([typedef yy::Location YYLTYPE;]) +[static int yylex (]AT_LEX_FORMALS[); +]AT_LALR1_CC_IF([], [static void yyerror (const char *msg);]) +[%} + +%type 'x' ';' thing line input + +%printer { fprintf (yyoutput, "%d@%d-%d", $$, RANGE (@$)); } + input line thing 'x' + +%destructor + { printf ("Freeing nterm input (%d@%d-%d)\n", $$, RANGE (@$)); } + input + +%destructor + { printf ("Freeing nterm line (%d@%d-%d)\n", $$, RANGE (@$)); } + line + +%destructor + { printf ("Freeing nterm thing (%d@%d-%d)\n", $$, RANGE (@$)); } + thing + +%destructor + { printf ("Freeing token 'x' (%d@%d-%d)\n", $$, RANGE (@$)); } + 'x' + +%% +input: + /* Nothing. */ + { + $$ = 0; + printf ("input (%d@%d-%d): /* Nothing */\n", $$, RANGE (@$)); + } +| line input /* Right recursive to load the stack so that popping at + EOF can be exercised. */ + { + $$ = 2; + printf ("input (%d@%d-%d): line (%d@%d-%d) input (%d@%d-%d)\n", + $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2)); + } +; + +line: + thing thing thing ';' + { + $$ = $1; + printf ("line (%d@%d-%d): thing (%d@%d-%d) thing (%d@%d-%d) thing (%d@%d-%d) ';' (%d@%d-%d)\n", + $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2), + $3, RANGE (@3), $4, RANGE (@4)); + } +| thing thing ';' + { + $$ = $1; + printf ("line (%d@%d-%d): thing (%d@%d-%d) thing (%d@%d-%d) ';' (%d@%d-%d)\n", + $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2), $3, RANGE (@3)); + } +| thing ';' + { + $$ = $1; + printf ("line (%d@%d-%d): thing (%d@%d-%d) ';' (%d@%d-%d)\n", + $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2)); + } +| error ';' + { + $$ = -1; + printf ("line (%d@%d-%d): error (@%d-%d) ';' (%d@%d-%d)\n", + $$, RANGE (@$), RANGE (@1), $2, RANGE (@2)); + } +; + +thing: + 'x' + { + $$ = $1; + printf ("thing (%d@%d-%d): 'x' (%d@%d-%d)\n", + $$, RANGE (@$), $1, RANGE (@1)); + } +; +%% +static int +yylex (]AT_LEX_FORMALS[) +{ + static const unsigned int input[] = + { + /* Exercise the discarding of stack top and input until `error' + can be reduced. */ + 'x', 'x', 'x', 'x', 'x', 'x', ';', + + /* Load the stack and provoke an error that cannot be caught by + the grammar, to check that the stack is cleared. */ + 'x', 'x', ';', + 'x', ';', + 'y' + }; + static unsigned int counter = 0; + + if (counter < (sizeof(input) / sizeof (input[0]))) + { +]AT_LALR1_CC_IF( +[ yylval->ival = counter; + /* As in BASIC, line numbers go from 10 to 10. */ + yylloc->begin.line = yylloc->begin.column = 10 * counter; + yylloc->end.line = yylloc->end.column = yylloc->begin.line + 9; + printf ("sending: '%c' (%d@%d-%d)\n", + input[[counter]], yylval->ival, RANGE (*yylloc)); + return (int) input[[counter++]]; +], +[ yylval.ival = counter; + /* As in BASIC, line numbers go from 10 to 10. */ + yylloc.first_line = yylloc.first_column = 10 * counter; + yylloc.last_line = yylloc.last_column = yylloc.first_line + 9; + printf ("sending: '%c' (%d@%d-%d)\n", + input[[counter]], yylval.ival, RANGE (yylloc)); + return (int) input[[counter++]]; +])[ + } + else + { + printf ("sending: EOF\n"); + return EOF; + } +} + +]AT_LALR1_CC_IF( +[/* Currently, print_ is required in C++. */ +void +yy::Parser::print_ () +{ + std::cerr << location; +} + +/* A C++ error reporting function. */ +void +yy::Parser::error_ () +{ + printf ("%d-%d: %s\n", RANGE (location), message.c_str()); +} + +static bool yydebug; +int +yyparse () +{ + yy::Parser parser (yydebug, yy::Location::Location ()); + return parser.parse (); +} +], +[static void +yyerror (const char *msg) +{ + printf ("%d-%d: %s\n", RANGE (yylloc), msg); +}])[ + +int +main (void) +{ + yydebug = !!getenv ("YYDEBUG"); + if (yyparse ()) + { + printf ("Parsing FAILED.\n"); + exit (1); + } + printf ("Successful parse.\n"); + return 0; +} +]]) + +AT_CHECK([bison -o input.c input.y]) +AT_LALR1_CC_IF([AT_COMPILE_CXX([input])], + [AT_COMPILE([input])]) +AT_PARSER_CHECK([./input], 1, +[[sending: 'x' (0@0-9) +thing (0@0-9): 'x' (0@0-9) +sending: 'x' (1@10-19) +thing (1@10-19): 'x' (1@10-19) +sending: 'x' (2@20-29) +thing (2@20-29): 'x' (2@20-29) +sending: 'x' (3@30-39) +30-39: syntax error, unexpected 'x', expecting ';' +Freeing nterm thing (2@20-29) +Freeing nterm thing (1@10-19) +Freeing nterm thing (0@0-9) +Freeing token 'x' (3@30-39) +sending: 'x' (4@40-49) +Freeing token 'x' (4@40-49) +sending: 'x' (5@50-59) +Freeing token 'x' (5@50-59) +sending: ';' (6@60-69) +line (-1@0-69): error (@0-59) ';' (6@60-69) +sending: 'x' (7@70-79) +thing (7@70-79): 'x' (7@70-79) +sending: 'x' (8@80-89) +thing (8@80-89): 'x' (8@80-89) +sending: ';' (9@90-99) +line (7@70-99): thing (7@70-79) thing (8@80-89) ';' (9@90-99) +sending: 'x' (10@100-109) +thing (10@100-109): 'x' (10@100-109) +sending: ';' (11@110-119) +line (10@100-119): thing (10@100-109) ';' (11@110-119) +sending: 'y' (12@120-129) +120-129: syntax error, unexpected $undefined, expecting $end or 'x' +sending: EOF +Freeing nterm line (10@100-119) +Freeing nterm line (7@70-99) +Freeing nterm line (-1@0-69) +Parsing FAILED. +]]) + +AT_CLEANUP +]) + + +# AT_CHECK_PRINTER_AND_DESTRUCTOR([BISON-OPTIONS]) +# ------------------------------------------------ +# Produce `calc.y'. +m4_define([AT_CHECK_PRINTER_AND_DESTRUCTOR], +[_AT_CHECK_PRINTER_AND_DESTRUCTOR($[1], $[2], $[3], $[4], [$1]) +]) + + +AT_CHECK_PRINTER_AND_DESTRUCTOR() +AT_CHECK_PRINTER_AND_DESTRUCTOR([%locations %defines %skeleton "lalr1.cc"]) + +# FIXME. This test case fails. +#AT_CHECK_PRINTER_AND_DESTRUCTOR([%glr-parser]) diff --git a/src/apps/bin/bison/tests/atlocal.in b/src/apps/bin/bison/tests/atlocal.in new file mode 100644 index 0000000000..ac647c0e2b --- /dev/null +++ b/src/apps/bin/bison/tests/atlocal.in @@ -0,0 +1,27 @@ +# @configure_input@ -*- shell-script -*- +# Configurable variable values for Bison test suite. +# Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + +# We need a C compiler. +CC='@CC@' + +# We want no optimization. +CFLAGS='@O0CFLAGS@ @WARNING_CFLAGS@ @WERROR_CFLAGS@' + +# We need `config.h'. +CPPFLAGS="-DHAVE_CONFIG_H=1 -I$abs_top_builddir @CPPFLAGS@" + +# Is the compiler GCC? +GCC='@GCC@' + +# The GCC C++ compiler. +CXX='@CXX@' + +# We want no optimization with C++, too. +CXXFLAGS='@O0CFLAGS@ @WARNING_CXXFLAGS@ @WERROR_CFLAGS@' + +# Are special link options needed? +LDFLAGS='@LDFLAGS@' + +# Are special libraries needed? +LIBS='@LIBS@' diff --git a/src/apps/bin/bison/tests/bison.in b/src/apps/bin/bison/tests/bison.in new file mode 100644 index 0000000000..6d0de7e341 --- /dev/null +++ b/src/apps/bin/bison/tests/bison.in @@ -0,0 +1,8 @@ +#! @SHELL@ +# @configure_input@ +# Wrapper around a non installed bison to make it work as an installed one. + +# We want to use the files shipped with Bison. +BISON_PKGDATADIR='@abs_top_srcdir@/data' +export BISON_PKGDATADIR +exec $PREBISON '@abs_top_builddir@/src/bison' ${1+"$@"} diff --git a/src/apps/bin/bison/tests/calc.at b/src/apps/bin/bison/tests/calc.at new file mode 100644 index 0000000000..b2f8578348 --- /dev/null +++ b/src/apps/bin/bison/tests/calc.at @@ -0,0 +1,633 @@ +# Simple calculator. -*- Autotest -*- +# Copyright (C) 2000, 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +## ---------------------------------------------------- ## +## Compile the grammar described in the documentation. ## +## ---------------------------------------------------- ## + + +# ------------------------- # +# Helping Autotest macros. # +# ------------------------- # + + +# _AT_DATA_CALC_Y($1, $2, $3, [BISON-DIRECTIVES]) +# ----------------------------------------------- +# Produce `calc.y'. Don't call this macro directly, because it contains +# some occurrences of `$1' etc. which will be interpreted by m4. So +# you should call it with $1, $2, and $3 as arguments, which is what +# AT_DATA_CALC_Y does. +m4_define([_AT_DATA_CALC_Y], +[m4_if([$1$2$3], $[1]$[2]$[3], [], + [m4_fatal([$0: Invalid arguments: $@])])dnl +AT_DATA_GRAMMAR([calc.y], +[[/* Infix notation calculator--calc */ +]$4[ +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +]AT_LALR1_CC_IF([typedef yy::Location YYLTYPE;], +[/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror (AT_YYERROR_ARG_LOC_IF([YYLTYPE *yylloc, ]) + AT_PARAM_IF([semantic_value *result, int *count, ]) + const char *s + );])[ +static int yylex (]AT_LEX_FORMALS[); +static int yygetc (]AT_LEX_FORMALS[); +static void yyungetc (]AT_LEX_PRE_FORMALS[ int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { ]AT_PARAM_IF([++*count; ++global_count;])[ } +; + +line: + '\n' +| exp '\n' { ]AT_PARAM_IF([*result = global_result = $1;])[ } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +]AT_LALR1_CC_IF( +[/* Currently, print_ is required in C++. */ +void +yy::Parser::print_ () +{ +AT_LOCATION_IF([ + std::cerr << location;]) +} + +/* A C++ error reporting function. */ +void +yy::Parser::error_ () +{ + std::cerr << AT_LOCATION_IF([location << ": " << ])message << std::endl; +} + +int +yyparse (AT_PARAM_IF([semantic_value *result, int *count])) +{ + yy::Parser parser (!!YYDEBUG[]AT_LOCATION_IF([, yy::Location::Location ()])AT_PARAM_IF([, result, count])); + return parser.parse (); +} +], +[static void +yyerror (AT_YYERROR_ARG_LOC_IF([YYLTYPE *yylloc, ]) + AT_PARAM_IF([semantic_value *result, int *count, ]) + const char *s) +{ +AT_PARAM_IF([(void) result; (void) count;]) +AT_YYERROR_SEES_LOC_IF([ + fprintf (stderr, "%d.%d", + AT_LOC.first_line, AT_LOC.first_column); + if (AT_LOC.first_line != AT_LOC.last_line) + fprintf (stderr, "-%d.%d", + AT_LOC.last_line, AT_LOC.last_column - 1); + else if (AT_LOC.first_column != AT_LOC.last_column - 1) + fprintf (stderr, "-%d", + AT_LOC.last_column - 1); + fprintf (stderr, ": ");]) + fprintf (stderr, "%s\n", s); +}])[ + + +]AT_LOCATION_IF([ +static YYLTYPE last_yylloc; +])[ +static int +yygetc (]AT_LEX_FORMALS[) +{ + int res = getc (yyin); + ]AT_USE_LEX_ARGS[; +]AT_LOCATION_IF([ + last_yylloc = AT_LOC; + if (res == '\n') + { +AT_LALR1_CC_IF( +[ AT_LOC.end.line++; + AT_LOC.end.column = 0;], +[ AT_LOC.last_line++; + AT_LOC.last_column = 0;]) + } + else +AT_LALR1_CC_IF( +[ AT_LOC.end.column++;], +[ AT_LOC.last_column++;]) +])[ + return res; +} + + +static void +yyungetc (]AT_LEX_PRE_FORMALS[ int c) +{ + ]AT_USE_LEX_ARGS[; +]AT_LOCATION_IF([ + /* Wrong when C == `\n'. */ + AT_LOC = last_yylloc; +])[ + ungetc (c, yyin); +} + +static int +read_signed_integer (]AT_LEX_FORMALS[) +{ + int c = yygetc (]AT_LEX_ARGS[); + int sign = 1; + int n = 0; + + ]AT_USE_LEX_ARGS[; + if (c == '-') + { + c = yygetc (]AT_LEX_ARGS[); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (]AT_LEX_ARGS[); + } + + yyungetc (]AT_LEX_PRE_ARGS[ c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (]AT_LEX_FORMALS[) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; +]AT_LALR1_CC_IF([], +[AT_LOCATION_IF([ + AT_LOC.last_column = 0; + AT_LOC.last_line = 1; +])])[ + } + +]AT_LOCATION_IF([AT_LALR1_CC_IF( +[ AT_LOC.begin = AT_LOC.end;], +[ AT_LOC.first_column = AT_LOC.last_column; + AT_LOC.first_line = AT_LOC.last_line; +])])[ + + /* Skip white space. */ + while ((c = yygetc (]AT_LEX_ARGS[)) == ' ' || c == '\t') + { +]AT_LOCATION_IF([AT_LALR1_CC_IF( +[ AT_LOC.begin = AT_LOC.end;], +[ AT_LOC.first_column = AT_LOC.last_column; + AT_LOC.first_line = AT_LOC.last_line; +])])[ + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc (]AT_LEX_PRE_ARGS[ c); + ]AT_VAL[.ival = read_signed_integer (]AT_LEX_ARGS[); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + +]AT_LALR1_CC_IF([], [m4_bmatch([$4], [%debug], +[ yydebug = 1;])])[ + status = yyparse (]AT_PARAM_IF([&result, &count])[); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +]]) +])# _AT_DATA_CALC_Y + + +# AT_DATA_CALC_Y([BISON-OPTIONS]) +# ------------------------------- +# Produce `calc.y'. +m4_define([AT_DATA_CALC_Y], +[_AT_DATA_CALC_Y($[1], $[2], $[3], [$1]) +]) + + + +# _AT_CHECK_CALC(BISON-OPTIONS, INPUT, [NUM-STDERR-LINES = 0]) +# ------------------------------------------------------------ +# Run `calc' on INPUT and expect no STDOUT nor STDERR. +# +# If BISON-OPTIONS contains `%debug' but not `%glr-parser', then +# NUM-STDERR-LINES is the number of expected lines on stderr. +# +# We don't count GLR's traces yet, since its traces are somewhat +# different from LALR's. +m4_define([_AT_CHECK_CALC], +[AT_DATA([[input]], +[[$2 +]]) +AT_PARSER_CHECK([./calc input], 0, [], [stderr]) +m4_bmatch([$1], + [%debug.*%glr\|%glr.*%debug], + [], + [%debug], + [AT_CHECK([wc -l at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +AT_DATA([[expout]], +[$5 +]) +# 3. If locations are not used, remove them. +AT_YYERROR_SEES_LOC_IF([], +[[sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout]]) +# 4. If error-verbose is not used, strip the`, unexpected....' part. +m4_bmatch([$1], [%error-verbose], [], +[[sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout]]) +# 5. Check +AT_CHECK([cat stderr], 0, [expout]) +]) + + +# AT_CHECK_CALC([BISON-OPTIONS [, EXPECTED-TO-FAIL]]) +# ------------------------------ +# Start a testing chunk which compiles `calc' grammar with +# BISON-OPTIONS, and performs several tests over the parser. +# However, if EXPECTED-TO-FAIL is nonempty, this test is expected to fail. +m4_define([AT_CHECK_CALC], +[# We use integers to avoid dependencies upon the precision of doubles. +AT_SETUP([Calculator $1]) + +m4_ifval([$2], [AT_CHECK([exit 77])]) + +AT_BISON_OPTION_PUSHDEFS([$1]) + +AT_DATA_CALC_Y([$1]) + +# Specify the output files to avoid problems on different file systems. +AT_CHECK([bison -o calc.c calc.y]) + +AT_LALR1_CC_IF([AT_COMPILE_CXX([calc])], + [AT_COMPILE([calc])]) + +# Test the priorities. +_AT_CHECK_CALC([$1], +[1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64], + [486]) + +# Some syntax errors. +_AT_CHECK_CALC_ERROR([$1], [1], [0 0], [11], + [1.2: syntax error, unexpected "number"]) +_AT_CHECK_CALC_ERROR([$1], [1], [1//2], [15], + [1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!']) +_AT_CHECK_CALC_ERROR([$1], [1], [error], [4], + [1.0: syntax error, unexpected $undefined]) +_AT_CHECK_CALC_ERROR([$1], [1], [1 = 2 = 3], [22], + [1.6: syntax error, unexpected '=']) +_AT_CHECK_CALC_ERROR([$1], [1], + [ ++1], + [14], + [2.0: syntax error, unexpected '+']) +# Exercise error messages with EOF: work on an empty file. +_AT_CHECK_CALC_ERROR([$1], [1], [/dev/null], [4], + [1.0: syntax error, unexpected "end of input"]) + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +_AT_CHECK_CALC_ERROR([$1], [0], + [() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1], + [156], +[1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1]) + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +_AT_CHECK_CALC_ERROR([$1], [0], [(!) + (0 0) = 1], [62], +[1.9: syntax error, unexpected "number" +calc: error: 2222 != 1]) +_AT_CHECK_CALC_ERROR([$1], [0], [(- *) + (0 0) = 1], [70], +[1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1]) +AT_BISON_OPTION_POPDEFS + +AT_CLEANUP +])# AT_CHECK_CALC + + + + +# ------------------------ # +# Simple LALR Calculator. # +# ------------------------ # + +AT_BANNER([[Simple LALR Calculator.]]) + +# AT_CHECK_CALC_LALR([BISON-OPTIONS]) +# ----------------------------------- +# Start a testing chunk which compiles `calc' grammar with +# BISON-OPTIONS, and performs several tests over the parser. +m4_define([AT_CHECK_CALC_LALR], +[AT_CHECK_CALC($@)]) + +AT_CHECK_CALC_LALR() + +AT_CHECK_CALC_LALR([%defines]) +AT_CHECK_CALC_LALR([%locations]) +AT_CHECK_CALC_LALR([%name-prefix="calc"]) +AT_CHECK_CALC_LALR([%verbose]) +AT_CHECK_CALC_LALR([%yacc]) +AT_CHECK_CALC_LALR([%error-verbose]) + +AT_CHECK_CALC_LALR([%pure-parser %locations]) +AT_CHECK_CALC_LALR([%error-verbose %locations]) + +AT_CHECK_CALC_LALR([%error-verbose %locations %defines %name-prefix="calc" %verbose %yacc]) + +AT_CHECK_CALC_LALR([%debug]) +AT_CHECK_CALC_LALR([%error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc]) + +AT_CHECK_CALC_LALR([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc]) + +AT_CHECK_CALC_LALR([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}]) + + +# ----------------------- # +# Simple GLR Calculator. # +# ----------------------- # + +AT_BANNER([[Simple GLR Calculator.]]) + +# AT_CHECK_CALC_GLR([BISON-OPTIONS]) +# ---------------------------------- +# Start a testing chunk which compiles `calc' grammar with +# BISON-OPTIONS and %glr-parser, and performs several tests over the parser. +m4_define([AT_CHECK_CALC_GLR], +[AT_CHECK_CALC([%glr-parser] $@)]) + + +AT_CHECK_CALC_GLR() + +AT_CHECK_CALC_GLR([%defines]) +AT_CHECK_CALC_GLR([%locations]) +AT_CHECK_CALC_GLR([%name-prefix="calc"]) +AT_CHECK_CALC_GLR([%verbose]) +AT_CHECK_CALC_GLR([%yacc]) +AT_CHECK_CALC_GLR([%error-verbose]) + +AT_CHECK_CALC_GLR([%pure-parser %locations]) +AT_CHECK_CALC_GLR([%error-verbose %locations]) + +AT_CHECK_CALC_GLR([%error-verbose %locations %defines %name-prefix="calc" %verbose %yacc]) + +AT_CHECK_CALC_GLR([%debug]) +AT_CHECK_CALC_GLR([%error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc]) + +AT_CHECK_CALC_GLR([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc]) + +AT_CHECK_CALC_GLR([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}]) + + +# ----------------------------- # +# Simple LALR1 C++ Calculator. # +# ----------------------------- # + +AT_BANNER([[Simple LALR1 C++ Calculator.]]) + +# AT_CHECK_CALC_LALR1_CC([BISON-OPTIONS]) +# --------------------------------------- +# Start a testing chunk which compiles `calc' grammar with +# the C++ skeleton, and performs several tests over the parser. +m4_define([AT_CHECK_CALC_LALR1_CC], +[AT_CHECK_CALC([%skeleton "lalr1.cc"] $@)]) + +# AT_CHECK_CALC_LALR1_CC() + +AT_CHECK_CALC_LALR1_CC([%defines %locations]) + +AT_CHECK_CALC_LALR1_CC([%defines]) +# AT_CHECK_CALC_LALR1_CC([%locations]) +# AT_CHECK_CALC_LALR1_CC([%name-prefix="calc"]) +# AT_CHECK_CALC_LALR1_CC([%verbose]) +# AT_CHECK_CALC_LALR1_CC([%yacc]) +# AT_CHECK_CALC_LALR1_CC([%error-verbose]) + +# AT_CHECK_CALC_LALR1_CC([%pure-parser %locations]) +# AT_CHECK_CALC_LALR1_CC([%error-verbose %locations]) + +AT_CHECK_CALC_LALR1_CC([%error-verbose %locations %defines %name-prefix="calc" %verbose %yacc]) + +# AT_CHECK_CALC_LALR1_CC([%debug]) +AT_CHECK_CALC_LALR1_CC([%error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc]) + +AT_CHECK_CALC_LALR1_CC([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc]) + +AT_CHECK_CALC_LALR1_CC([%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}]) diff --git a/src/apps/bin/bison/tests/conflicts.at b/src/apps/bin/bison/tests/conflicts.at new file mode 100644 index 0000000000..381b49ef99 --- /dev/null +++ b/src/apps/bin/bison/tests/conflicts.at @@ -0,0 +1,621 @@ +# Exercising Bison on conflicts. -*- Autotest -*- + +# Copyright (C) 2002, 2003, 2004 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AT_BANNER([[Conflicts.]]) + + +## ---------------- ## +## S/R in initial. ## +## ---------------- ## + +# I once hacked Bison in such a way that it lost its reductions on the +# initial state (because it was confusing it with the last state). It +# took me a while to strip down my failures to this simple case. So +# make sure it finds the s/r conflict below. + +AT_SETUP([S/R in initial]) + +AT_DATA([[input.y]], +[[%expect 1 +%% +exp: e 'e'; +e: 'e' | /* Nothing. */; +]]) + +AT_CHECK([bison -o input.c input.y], 0, [], +[[input.y:4.9: warning: rule never reduced because of conflicts: e: /* empty */ +]]) + +AT_CLEANUP + + +## ------------------- ## +## %nonassoc and eof. ## +## ------------------- ## + +AT_SETUP([%nonassoc and eof]) + +AT_DATA_GRAMMAR([input.y], +[[ +%{ +#include +#include + +#define YYERROR_VERBOSE 1 +static void +yyerror (const char *msg) +{ + fprintf (stderr, "%s\n", msg); + exit (1); +} + +/* The current argument. */ +static const char *input = NULL; + +static int +yylex (void) +{ + /* No token stands for end of file. */ + if (input && *input) + return *input++; + else + return 0; +} + +%} + +%nonassoc '<' '>' + +%% +expr: expr '<' expr + | expr '>' expr + | '0' + ; +%% +int +main (int argc, const char *argv[]) +{ + if (argc > 1) + input = argv[1]; + return yyparse (); +} +]]) + +# Specify the output files to avoid problems on different file systems. +AT_CHECK([bison -o input.c input.y]) +AT_COMPILE([input]) + +AT_PARSER_CHECK([./input '0<0']) +# FIXME: This is an actual bug, but a new one, in the sense that +# no one has ever spotted it! The messages are *wrong*: there should +# be nothing there, it should be expected eof. +AT_PARSER_CHECK([./input '0<0<0'], [1], [], + [syntax error, unexpected '<', expecting '<' or '>' +]) + +AT_PARSER_CHECK([./input '0>0']) +AT_PARSER_CHECK([./input '0>0>0'], [1], [], + [syntax error, unexpected '>', expecting '<' or '>' +]) + +AT_PARSER_CHECK([./input '0<0>0'], [1], [], + [syntax error, unexpected '>', expecting '<' or '>' +]) + +AT_CLEANUP + + + +## ------------------------- ## +## Unresolved SR Conflicts. ## +## ------------------------- ## + +AT_SETUP([Unresolved SR Conflicts]) + +AT_KEYWORDS([report]) + +AT_DATA([input.y], +[[%token NUM OP +%% +exp: exp OP exp | NUM; +]]) + +AT_CHECK([bison -o input.c --report=all input.y], 0, [], +[input.y: conflicts: 1 shift/reduce +]) + +# Check the contents of the report. +AT_CHECK([cat input.output], [], +[[State 5 conflicts: 1 shift/reduce + + +Grammar + + 0 $accept: exp $end + + 1 exp: exp OP exp + 2 | NUM + + +Terminals, with rules where they appear + +$end (0) 0 +error (256) +NUM (258) 2 +OP (259) 1 + + +Nonterminals, with rules where they appear + +$accept (5) + on left: 0 +exp (6) + on left: 1 2, on right: 0 1 + + +state 0 + + 0 $accept: . exp $end + 1 exp: . exp OP exp + 2 | . NUM + + NUM shift, and go to state 1 + + exp go to state 2 + + +state 1 + + 2 exp: NUM . + + $default reduce using rule 2 (exp) + + +state 2 + + 0 $accept: exp . $end + 1 exp: exp . OP exp + + $end shift, and go to state 3 + OP shift, and go to state 4 + + +state 3 + + 0 $accept: exp $end . + + $default accept + + +state 4 + + 1 exp: . exp OP exp + 1 | exp OP . exp + 2 | . NUM + + NUM shift, and go to state 1 + + exp go to state 5 + + +state 5 + + 1 exp: exp . OP exp [$end, OP] + 1 | exp OP exp . [$end, OP] + + OP shift, and go to state 4 + + OP [reduce using rule 1 (exp)] + $default reduce using rule 1 (exp) +]]) + +AT_CLEANUP + + + +## ----------------------- ## +## Resolved SR Conflicts. ## +## ----------------------- ## + +AT_SETUP([Resolved SR Conflicts]) + +AT_KEYWORDS([report]) + +AT_DATA([input.y], +[[%token NUM OP +%left OP +%% +exp: exp OP exp | NUM; +]]) + +AT_CHECK([bison -o input.c --report=all input.y]) + +# Check the contents of the report. +AT_CHECK([cat input.output], [], +[[Grammar + + 0 $accept: exp $end + + 1 exp: exp OP exp + 2 | NUM + + +Terminals, with rules where they appear + +$end (0) 0 +error (256) +NUM (258) 2 +OP (259) 1 + + +Nonterminals, with rules where they appear + +$accept (5) + on left: 0 +exp (6) + on left: 1 2, on right: 0 1 + + +state 0 + + 0 $accept: . exp $end + 1 exp: . exp OP exp + 2 | . NUM + + NUM shift, and go to state 1 + + exp go to state 2 + + +state 1 + + 2 exp: NUM . + + $default reduce using rule 2 (exp) + + +state 2 + + 0 $accept: exp . $end + 1 exp: exp . OP exp + + $end shift, and go to state 3 + OP shift, and go to state 4 + + +state 3 + + 0 $accept: exp $end . + + $default accept + + +state 4 + + 1 exp: . exp OP exp + 1 | exp OP . exp + 2 | . NUM + + NUM shift, and go to state 1 + + exp go to state 5 + + +state 5 + + 1 exp: exp . OP exp [$end, OP] + 1 | exp OP exp . [$end, OP] + + $default reduce using rule 1 (exp) + + Conflict between rule 1 and token OP resolved as reduce (%left OP). +]]) + +AT_CLEANUP + + +## -------------------------------- ## +## Defaulted Conflicted Reduction. ## +## -------------------------------- ## + +# When there are RR conflicts, some rules are disabled. Usually it is +# simply displayed as: +# +# $end reduce using rule 3 (num) +# $end [reduce using rule 4 (id)] +# +# But when `reduce 3' is the default action, we'd produce: +# +# $end [reduce using rule 4 (id)] +# $default reduce using rule 3 (num) +# +# In this precise case (a reduction is masked by the default +# reduction), we make the `reduce 3' explicit: +# +# $end reduce using rule 3 (num) +# $end [reduce using rule 4 (id)] +# $default reduce using rule 3 (num) +# +# Maybe that's not the best display, but then, please propose something +# else. + +AT_SETUP([Defaulted Conflicted Reduction]) +AT_KEYWORDS([report]) + +AT_DATA([input.y], +[[%% +exp: num | id; +num: '0'; +id : '0'; +%% +]]) + +AT_CHECK([bison -o input.c --report=all input.y], 0, [], +[[input.y: conflicts: 1 reduce/reduce +input.y:4.6-8: warning: rule never reduced because of conflicts: id: '0' +]]) + +# Check the contents of the report. +AT_CHECK([cat input.output], [], +[[Rules never reduced + + 4 id: '0' + + +State 1 conflicts: 1 reduce/reduce + + +Grammar + + 0 $accept: exp $end + + 1 exp: num + 2 | id + + 3 num: '0' + + 4 id: '0' + + +Terminals, with rules where they appear + +$end (0) 0 +'0' (48) 3 4 +error (256) + + +Nonterminals, with rules where they appear + +$accept (4) + on left: 0 +exp (5) + on left: 1 2, on right: 0 +num (6) + on left: 3, on right: 1 +id (7) + on left: 4, on right: 2 + + +state 0 + + 0 $accept: . exp $end + 1 exp: . num + 2 | . id + 3 num: . '0' + 4 id: . '0' + + '0' shift, and go to state 1 + + exp go to state 2 + num go to state 3 + id go to state 4 + + +state 1 + + 3 num: '0' . [$end] + 4 id: '0' . [$end] + + $end reduce using rule 3 (num) + $end [reduce using rule 4 (id)] + $default reduce using rule 3 (num) + + +state 2 + + 0 $accept: exp . $end + + $end shift, and go to state 5 + + +state 3 + + 1 exp: num . + + $default reduce using rule 1 (exp) + + +state 4 + + 2 exp: id . + + $default reduce using rule 2 (exp) + + +state 5 + + 0 $accept: exp $end . + + $default accept +]]) + +AT_CLEANUP + + + + +## -------------------- ## +## %expect not enough. ## +## -------------------- ## + +AT_SETUP([%expect not enough]) + +AT_DATA([input.y], +[[%token NUM OP +%expect 0 +%% +exp: exp OP exp | NUM; +]]) + +AT_CHECK([bison -o input.c input.y], 0, [], +[input.y: conflicts: 1 shift/reduce +input.y: warning: expected 0 shift/reduce conflicts +]) +AT_CLEANUP + + +## --------------- ## +## %expect right. ## +## --------------- ## + +AT_SETUP([%expect right]) + +AT_DATA([input.y], +[[%token NUM OP +%expect 1 +%% +exp: exp OP exp | NUM; +]]) + +AT_CHECK([bison -o input.c input.y]) +AT_CLEANUP + + +## ------------------ ## +## %expect too much. ## +## ------------------ ## + +AT_SETUP([%expect too much]) + +AT_DATA([input.y], +[[%token NUM OP +%expect 2 +%% +exp: exp OP exp | NUM; +]]) + +AT_CHECK([bison -o input.c input.y], 0, [], +[input.y: conflicts: 1 shift/reduce +input.y: warning: expected 2 shift/reduce conflicts +]) +AT_CLEANUP + + +## ------------------------------ ## +## %expect with reduce conflicts ## +## ------------------------------ ## + +AT_SETUP([%expect with reduce conflicts]) + +AT_DATA([input.y], +[[%expect 0 +%% +program: a 'a' | a a; +a: 'a'; +]]) + +AT_CHECK([bison -o input.c input.y], 0, [], +[input.y: conflicts: 1 reduce/reduce +input.y: warning: expected 0 reduce/reduce conflicts +]) +AT_CLEANUP + + +## ------------------------------- ## +## %no-default-prec without %prec ## +## ------------------------------- ## + +AT_SETUP([%no-default-prec without %prec]) + +AT_DATA([[input.y]], +[[%left '+' +%left '*' + +%% + +%no-default-prec; + +e: e '+' e + | e '*' e + | '0' + ; +]]) + +AT_CHECK([bison -o input.c input.y], 0, [], +[[input.y: conflicts: 4 shift/reduce +]]) +AT_CLEANUP + + +## ---------------------------- ## +## %no-default-prec with %prec ## +## ---------------------------- ## + +AT_SETUP([%no-default-prec with %prec]) + +AT_DATA([[input.y]], +[[%left '+' +%left '*' + +%% + +%no-default-prec; + +e: e '+' e %prec '+' + | e '*' e %prec '*' + | '0' + ; +]]) + +AT_CHECK([bison -o input.c input.y]) +AT_CLEANUP + + +## ---------------- ## +## %default-prec ## +## ---------------- ## + +AT_SETUP([%default-prec]) + +AT_DATA([[input.y]], +[[%left '+' +%left '*' + +%% + +%default-prec; + +e: e '+' e + | e '*' e + | '0' + ; +]]) + +AT_CHECK([bison -o input.c input.y]) +AT_CLEANUP diff --git a/src/apps/bin/bison/tests/cxx-type.at b/src/apps/bin/bison/tests/cxx-type.at new file mode 100644 index 0000000000..89afc58a03 --- /dev/null +++ b/src/apps/bin/bison/tests/cxx-type.at @@ -0,0 +1,376 @@ +# Checking GLR Parsing. -*- Autotest -*- +# Copyright (C) 2002, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AT_BANNER([[C++ Type Syntax (GLR).]]) + +# _AT_TEST_GLR_CXXTYPES(DECL, RESOLVE1, RESOLVE2) +# ----------------------------------------------- +# Store into types.y the calc program, with DECL inserted as a declaration, +# and with RESOLVE1 and RESOLVE2 as annotations on the conflicted rule for +# stmt. Then compile the result. +m4_define([_AT_TEST_GLR_CXXTYPES], +[ +AT_BISON_OPTION_PUSHDEFS([$1]) + +AT_DATA_GRAMMAR([types.y], +[[/* Simplified C++ Type and Expression Grammar. */ + +$1 + +%{ + #include + #define YYSTYPE char const * +]m4_bmatch([$2], [stmtMerge], +[ static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1);])[ + #define YYINITDEPTH 10 + static char *format (char const *, ...); + struct YYLTYPE; +#if YYPURE +# if YYLSP_NEEDED +# define LEX_PARAMETERS YYSTYPE *lvalp, struct YYLTYPE *llocp +# define ERROR_PARAMETERS struct YYLTYPE *llocp, char const *s +# else +# define LEX_PARAMETERS YYSTYPE *lvalp +# endif +#endif +#ifndef LEX_PARAMETERS +# define LEX_PARAMETERS void +#endif +#ifndef ERROR_PARAMETERS +# define ERROR_PARAMETERS char const *s +#endif + int yylex (LEX_PARAMETERS); + int yyerror (ERROR_PARAMETERS); +%} + +%token TYPENAME ID + +%right '=' +%left '+' + +%glr-parser + +%% + +prog : + | prog stmt { +]AT_LOCATION_IF([ + printf ("%d.%d-%d.%d: ", + @2.first_line, @2.first_column, + @2.last_line, @2.last_column);])[ + printf ("%s\n", ]$[2); + } + ; + +stmt : expr ';' $2 { $$ = ]$[1; } + | decl $3 + | error ';' { $$ = ""; } + | '@' { YYACCEPT; } + ; + +expr : ID + | TYPENAME '(' expr ')' { $$ = format ("(%s,%s)", ]$[3, ]$[1); } + | expr '+' expr { $$ = format ("+(%s,%s)", ]$[1, ]$[3); } + | expr '=' expr { $$ = format ("=(%s,%s)", ]$[1, ]$[3); } + ; + +decl : TYPENAME declarator ';' + { $$ = format ("(%s,%s)", ]$[1, ]$[2); } + | TYPENAME declarator '=' expr ';' + { $$ = format ("(%s,%s,%s)", ]$[1, ]$[2, ]$[4); } + ; + +declarator : ID + | '(' declarator ')' { $$ = ]$[2; } + ; + +%% + +#include +#include +#include +#include + +int +main (int argc, char **argv) +{ + if (argc != 2) + abort (); + if (!freopen (argv[1], "r", stdin)) + abort (); + exit (yyparse ()); +} + +int +yylex (LEX_PARAMETERS) +{ + char buffer[256]; + int c; + unsigned int i; + static int lineNum = 1; + static int colNum = 1; + + +#if YYPURE +# define yylloc (*llocp) +# define yylval (*lvalp) +#endif + + while (1) + { + c = getchar (); + switch (c) + { + case EOF: + return 0; + case '\t': + colNum = 1 + ((colNum + 7) & ~7); + break; + case ' ': case '\f': + colNum += 1; + break; + case '\n': + lineNum += 1; + colNum = 1; + break; + default: + { + int tok; +#if YYLSP_NEEDED + yylloc.first_line = yylloc.last_line = lineNum; + yylloc.first_column = colNum; +#endif + if (isalpha (c)) + { + i = 0; + + do + { + buffer[i++] = c; + colNum += 1; + if (i == sizeof buffer - 1) + abort (); + c = getchar (); + } + while (isalnum (c) || c == '_'); + + ungetc (c, stdin); + buffer[i++] = 0; + tok = isupper ((unsigned char) buffer[0]) ? TYPENAME : ID; + yylval = strcpy (malloc (i), buffer); + } + else + { + colNum += 1; + tok = c; + yylval = ""; + } +#if YYLSP_NEEDED + yylloc.last_column = colNum-1; +#endif + return tok; + } + } + } +} + +int +yyerror (ERROR_PARAMETERS) +{ +#if YYPURE && YYLSP_NEEDED + /* Pacify GCC by using llocp. */ + if (! llocp) + abort (); +#endif + fprintf (stderr, "%s\n", s); + return 0; +} + + +static char * +format (char const *form, ...) +{ + char buffer[1024]; + va_list args; + va_start (args, form); + vsprintf (buffer, form, args); + va_end (args); + return strcpy (malloc (strlen (buffer) + 1), buffer); +} + +]] +m4_bmatch([$2], [stmtMerge], +[[static YYSTYPE +stmtMerge (YYSTYPE x0, YYSTYPE x1) +{ + return format ("(%s,%s)", x0, x1); +} +]]) +) + +AT_DATA([test-input], +[[ + +z + q; + +T x; + +T x = y; + +x = y; + +T (x) + y; + +T (x); + +T (y) = z + q; + +T (y y) = z + q; + +z + q; + +@ + +This is total garbage, but it should be ignored. +]]) + +AT_CHECK([bison -o types.c types.y], 0, [], ignore) +AT_COMPILE([types]) +AT_BISON_OPTION_POPDEFS +]) + +m4_define([_AT_RESOLVED_GLR_OUTPUT], +[[+(z,q) +(T,x) +(T,x,y) +=(x,y) ++((x,T),y) +(T,x) +(T,y,+(z,q)) + ++(z,q) +]]) + +m4_define([_AT_RESOLVED_GLR_OUTPUT_WITH_LOC], +[[3.1-3.6: +(z,q) +5.1-5.4: (T,x) +7.1-7.8: (T,x,y) +9.1-9.6: =(x,y) +11.1-11.10: +((x,T),y) +13.1-13.6: (T,x) +15.1-15.14: (T,y,+(z,q)) +17.6-17.16: +19.1-19.6: +(z,q) +]]) + +m4_define([_AT_AMBIG_GLR_OUTPUT], +[[+(z,q) +(T,x) +(T,x,y) +=(x,y) ++((x,T),y) +((T,x),(x,T)) +((T,y,+(z,q)),=((y,T),+(z,q))) + ++(z,q) +]]) + +m4_define([_AT_AMBIG_GLR_OUTPUT_WITH_LOC], +[[3.1-3.6: +(z,q) +5.1-5.4: (T,x) +7.1-7.8: (T,x,y) +9.1-9.6: =(x,y) +11.1-11.10: +((x,T),y) +13.1-13.6: ((T,x),(x,T)) +15.1-15.14: ((T,y,+(z,q)),=((y,T),+(z,q))) +17.6-17.16: +19.1-19.6: +(z,q) +]]) + +m4_define([_AT_GLR_STDERR], +[[syntax error +]]) + +m4_define([_AT_VERBOSE_GLR_STDERR], +[[syntax error, unexpected ID, expecting '=' or '+' or ')' +]]) + +## ---------------------------------------------------- ## +## Compile the grammar described in the documentation. ## +## ---------------------------------------------------- ## + +AT_SETUP([GLR: Resolve ambiguity, impure, no locations]) +_AT_TEST_GLR_CXXTYPES([], + [%dprec 1], [%dprec 2]) +AT_PARSER_CHECK([[./types test-input | sed 's/ *$//']], 0, + _AT_RESOLVED_GLR_OUTPUT, _AT_GLR_STDERR) +AT_CLEANUP + +AT_SETUP([GLR: Resolve ambiguity, impure, locations]) +_AT_TEST_GLR_CXXTYPES([%locations],[%dprec 1],[%dprec 2]) +AT_PARSER_CHECK([[./types test-input | sed 's/ *$//']], 0, + _AT_RESOLVED_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR) +AT_CLEANUP + +AT_SETUP([GLR: Resolve ambiguity, pure, no locations]) +_AT_TEST_GLR_CXXTYPES([%pure-parser], + [%dprec 1], [%dprec 2]) +AT_PARSER_CHECK([[./types test-input | sed 's/ *$//']], 0, + _AT_RESOLVED_GLR_OUTPUT, _AT_GLR_STDERR) +AT_CLEANUP + +AT_SETUP([GLR: Resolve ambiguity, pure, locations]) +_AT_TEST_GLR_CXXTYPES([%pure-parser %locations], + [%dprec 1], [%dprec 2]) +AT_PARSER_CHECK([[./types test-input | sed 's/ *$//']], 0, + _AT_RESOLVED_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR) +AT_CLEANUP + +AT_SETUP([GLR: Merge conflicting parses, impure, no locations]) +_AT_TEST_GLR_CXXTYPES([], + [%merge ], [%merge ]) +AT_PARSER_CHECK([[./types test-input | sed 's/ *$//']], 0, + _AT_AMBIG_GLR_OUTPUT, _AT_GLR_STDERR) +AT_CLEANUP + +AT_SETUP([GLR: Merge conflicting parses, impure, locations]) +_AT_TEST_GLR_CXXTYPES([%locations], + [%merge ], [%merge ]) +AT_PARSER_CHECK([[./types test-input | sed 's/ *$//']], 0, + _AT_AMBIG_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR) +AT_CLEANUP + +AT_SETUP([GLR: Merge conflicting parses, pure, no locations]) +_AT_TEST_GLR_CXXTYPES([%pure-parser], + [%merge ], [%merge ]) +AT_PARSER_CHECK([[./types test-input | sed 's/ *$//']], 0, + _AT_AMBIG_GLR_OUTPUT, _AT_GLR_STDERR) +AT_CLEANUP +AT_SETUP([GLR: Merge conflicting parses, pure, locations]) +_AT_TEST_GLR_CXXTYPES([%pure-parser %locations], + [%merge ],[%merge ]) +AT_PARSER_CHECK([[./types test-input | sed 's/ *$//']], 0, + _AT_AMBIG_GLR_OUTPUT_WITH_LOC, _AT_GLR_STDERR) +AT_CLEANUP + +AT_SETUP([GLR: Verbose messages, resolve ambiguity, impure, no locations]) +_AT_TEST_GLR_CXXTYPES([%error-verbose], + [%merge ], [%merge ]) +AT_PARSER_CHECK([[./types test-input | sed 's/ *$//']], 0, + _AT_AMBIG_GLR_OUTPUT, _AT_VERBOSE_GLR_STDERR) +AT_CLEANUP diff --git a/src/apps/bin/bison/tests/existing.at b/src/apps/bin/bison/tests/existing.at new file mode 100644 index 0000000000..f1af48b9d4 --- /dev/null +++ b/src/apps/bin/bison/tests/existing.at @@ -0,0 +1,2753 @@ +# Exercising Bison on actual grammars. -*- Autotest -*- + +# Copyright (C) 1989, 1990, 1991, 1992, 2000, 2001, 2002, 2003, 2004 +# Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AT_BANNER([[Existing Grammars.]]) +## ----------------- ## +## GNU AWK Grammar. ## +## ----------------- ## + +AT_SETUP([GNU AWK Grammar]) + +# We have been careful to strip all the actions excepts the +# mid-rule actions. We rely on %expect to check that there are +# indeed 65 SR conflicts. +# +# Bison was once wrong, due to an incorrect computation of nullable. +# It reported 485 SR conflicts! + +AT_DATA([[input.y]], +[[%expect 65 + +%token FUNC_CALL NAME REGEXP +%token ERROR +%token YNUMBER YSTRING +%token RELOP APPEND_OP +%token ASSIGNOP MATCHOP NEWLINE CONCAT_OP +%token LEX_BEGIN LEX_END LEX_IF LEX_ELSE LEX_RETURN LEX_DELETE +%token LEX_WHILE LEX_DO LEX_FOR LEX_BREAK LEX_CONTINUE +%token LEX_PRINT LEX_PRINTF LEX_NEXT LEX_EXIT LEX_FUNCTION +%token LEX_GETLINE LEX_NEXTFILE +%token LEX_IN +%token LEX_AND LEX_OR INCREMENT DECREMENT +%token LEX_BUILTIN LEX_LENGTH + +/* Lowest to highest */ +%right ASSIGNOP +%right '?' ':' +%left LEX_OR +%left LEX_AND +%left LEX_GETLINE +%nonassoc LEX_IN +%left FUNC_CALL LEX_BUILTIN LEX_LENGTH +%nonassoc ',' +%nonassoc MATCHOP +%nonassoc RELOP '<' '>' '|' APPEND_OP TWOWAYIO +%left CONCAT_OP +%left YSTRING YNUMBER +%left '+' '-' +%left '*' '/' '%' +%right '!' UNARY +%right '^' +%left INCREMENT DECREMENT +%left '$' +%left '(' ')' +%% + +start + : opt_nls program opt_nls + ; + +program + : rule + | program rule + | error + | program error + | /* empty */ + ; + +rule + : LEX_BEGIN {} action + | LEX_END {} action + | LEX_BEGIN statement_term + | LEX_END statement_term + | pattern action + | action + | pattern statement_term + | function_prologue function_body + ; + +func_name + : NAME + | FUNC_CALL + | lex_builtin + ; + +lex_builtin + : LEX_BUILTIN + | LEX_LENGTH + ; + +function_prologue + : LEX_FUNCTION {} func_name '(' opt_param_list r_paren opt_nls + ; + +function_body + : l_brace statements r_brace opt_semi opt_nls + | l_brace r_brace opt_semi opt_nls + ; + + +pattern + : exp + | exp ',' exp + ; + +regexp + /* + * In this rule, want_regexp tells yylex that the next thing + * is a regexp so it should read up to the closing slash. + */ + : '/' {} REGEXP '/' + ; + +action + : l_brace statements r_brace opt_semi opt_nls + | l_brace r_brace opt_semi opt_nls + ; + +statements + : statement + | statements statement + | error + | statements error + ; + +statement_term + : nls + | semi opt_nls + ; + +statement + : semi opt_nls + | l_brace r_brace + | l_brace statements r_brace + | if_statement + | LEX_WHILE '(' exp r_paren opt_nls statement + | LEX_DO opt_nls statement LEX_WHILE '(' exp r_paren opt_nls + | LEX_FOR '(' NAME LEX_IN NAME r_paren opt_nls statement + | LEX_FOR '(' opt_exp semi opt_nls exp semi opt_nls opt_exp r_paren opt_nls statement + | LEX_FOR '(' opt_exp semi opt_nls semi opt_nls opt_exp r_paren opt_nls statement + | LEX_BREAK statement_term + | LEX_CONTINUE statement_term + | print '(' expression_list r_paren output_redir statement_term + | print opt_rexpression_list output_redir statement_term + | LEX_NEXT statement_term + | LEX_NEXTFILE statement_term + | LEX_EXIT opt_exp statement_term + | LEX_RETURN {} opt_exp statement_term + | LEX_DELETE NAME '[' expression_list ']' statement_term + | LEX_DELETE NAME statement_term + | exp statement_term + ; + +print + : LEX_PRINT + | LEX_PRINTF + ; + +if_statement + : LEX_IF '(' exp r_paren opt_nls statement + | LEX_IF '(' exp r_paren opt_nls statement + LEX_ELSE opt_nls statement + ; + +nls + : NEWLINE + | nls NEWLINE + ; + +opt_nls + : /* empty */ + | nls + ; + +input_redir + : /* empty */ + | '<' simp_exp + ; + +output_redir + : /* empty */ + | '>' exp + | APPEND_OP exp + | '|' exp + | TWOWAYIO exp + ; + +opt_param_list + : /* empty */ + | param_list + ; + +param_list + : NAME + | param_list comma NAME + | error + | param_list error + | param_list comma error + ; + +/* optional expression, as in for loop */ +opt_exp + : /* empty */ + | exp + ; + +opt_rexpression_list + : /* empty */ + | rexpression_list + ; + +rexpression_list + : rexp + | rexpression_list comma rexp + | error + | rexpression_list error + | rexpression_list error rexp + | rexpression_list comma error + ; + +opt_expression_list + : /* empty */ + | expression_list + ; + +expression_list + : exp + | expression_list comma exp + | error + | expression_list error + | expression_list error exp + | expression_list comma error + ; + +/* Expressions, not including the comma operator. */ +exp : variable ASSIGNOP {} exp + | '(' expression_list r_paren LEX_IN NAME + | exp '|' LEX_GETLINE opt_variable + | exp TWOWAYIO LEX_GETLINE opt_variable + | LEX_GETLINE opt_variable input_redir + | exp LEX_AND exp + | exp LEX_OR exp + | exp MATCHOP exp + | regexp + | '!' regexp %prec UNARY + | exp LEX_IN NAME + | exp RELOP exp + | exp '<' exp + | exp '>' exp + | exp '?' exp ':' exp + | simp_exp + | exp simp_exp %prec CONCAT_OP + ; + +rexp + : variable ASSIGNOP {} rexp + | rexp LEX_AND rexp + | rexp LEX_OR rexp + | LEX_GETLINE opt_variable input_redir + | regexp + | '!' regexp %prec UNARY + | rexp MATCHOP rexp + | rexp LEX_IN NAME + | rexp RELOP rexp + | rexp '?' rexp ':' rexp + | simp_exp + | rexp simp_exp %prec CONCAT_OP + ; + +simp_exp + : non_post_simp_exp + /* Binary operators in order of decreasing precedence. */ + | simp_exp '^' simp_exp + | simp_exp '*' simp_exp + | simp_exp '/' simp_exp + | simp_exp '%' simp_exp + | simp_exp '+' simp_exp + | simp_exp '-' simp_exp + | variable INCREMENT + | variable DECREMENT + ; + +non_post_simp_exp + : '!' simp_exp %prec UNARY + | '(' exp r_paren + | LEX_BUILTIN + '(' opt_expression_list r_paren + | LEX_LENGTH '(' opt_expression_list r_paren + | LEX_LENGTH + | FUNC_CALL '(' opt_expression_list r_paren + | variable + | INCREMENT variable + | DECREMENT variable + | YNUMBER + | YSTRING + | '-' simp_exp %prec UNARY + | '+' simp_exp %prec UNARY + ; + +opt_variable + : /* empty */ + | variable + ; + +variable + : NAME + | NAME '[' expression_list ']' + | '$' non_post_simp_exp + ; + +l_brace + : '{' opt_nls + ; + +r_brace + : '}' opt_nls + ; + +r_paren + : ')' + ; + +opt_semi + : /* empty */ + | semi + ; + +semi + : ';' + ; + +comma : ',' opt_nls + ; + +%% +]]) + +# Pass plenty of options, to exercise plenty of code, even if we +# don't actually check the output. But SEGV is watching us, and +# so might do dmalloc. +AT_CHECK([[bison --verbose --defines input.y]]) + +AT_CLEANUP + + +## ----------------- ## +## GNU Cim Grammar. ## +## ----------------- ## + +AT_SETUP([GNU Cim Grammar]) + +# GNU Cim, the GNU Simula 87 Compiler. + +# Bison was once wrong, due to an incorrect computation of the RR conflicts. +# It reported 80 SR && 99 RR conflicts instead of 78/10!!! + +AT_DATA([[input.y]], +[[%union { + long int token; + long int ival; + long int arrdim; + double rval; + char *ident; + char *tval; + char stat_decl; + } + +%token + HACTIVATE HAFTER /*HAND*/ HARRAY HAT + HBEFORE HBEGIN HBOOLEAN + HCHARACTER HCLASS /*HCOMMENT*/ HCONC + HDELAY HDO + HELSE HEND HEQ /*HEQV*/ HEXTERNAL + HFOR + HGE HGO HGOTO HGT + HHIDDEN + HIF /*HIMP*/ HIN HINNER HINSPECT HINTEGER HIS + HLABEL HLE HLONG HLT + HNAME HNE HNEW HNONE /*HNOT*/ HNOTEXT + /*HOR*/ HOTHERWISE + HPRIOR HPROCEDURE HPROTECTED + HQUA + HREACTIVATE HREAL HREF + HSHORT HSTEP HSWITCH + HTEXT HTHEN HTHIS HTO + HUNTIL + HVALUE HVAR HVIRTUAL + HWHEN HWHILE + + HASSIGNVALUE HASSIGNREF + /*HDOT*/ HPAREXPSEPARATOR HLABELSEPARATOR HSTATEMENTSEPARATOR + HBEGPAR HENDPAR + HEQR HNER + HADD HSUB HMUL HDIV HINTDIV HEXP + HDOTDOTDOT + +%token HIDENTIFIER +%token HBOOLEANKONST HINTEGERKONST HCHARACTERKONST +%token HREALKONST +%token HTEXTKONST + +%type EXT_IDENT +%type DECLSTATEMENT MODULSTATEMENT MBEE_DECLSTMS MBEE_DECLSTMSU +%type MODULS +%type EXPRESSION_SIMP MBEE_ARG_R_PT +%type BAUND_PAIR_LIST + +%right HASSIGN +%left HORELSE +%left HANDTHEN +%left HEQV +%left HIMP +%left HOR +%left HAND + +%left HNOT + +%left HVALRELOPERATOR HREFRELOPERATOR HOBJRELOPERATOR + +%left HCONC + +%left HTERMOPERATOR +%left UNEAR +%left HFACTOROPERATOR +%left HPRIMARYOPERATOR + +%left HQUA + +%left HDOT + +%start MAIN_MODULE +%% +/* GRAMATIKK FOR PROGRAM MODULES */ +MAIN_MODULE : { categ=CLOCAL; mout(MBLOCK); + beginBlock(KBLOKK);separat_comp=FALSE;} + MODULS { endBlock(NULL,CCNO); mout(MENDBLOCK);} + | error HSTATEMENTSEPARATOR MBEE_DECLSTMS + ; +EXT_DECLARATION : HEXTERNAL + MBEE_TYPE + HPROCEDURE + { MBEENEWBLOCK(); + kind=KPROC;} + EXT_LIST + | + HEXTERNAL + HIDENTIFIER + HPROCEDURE + { MBEENEWBLOCK(); + type=TNOTY; + kind=KPROC; + if($2==Ckind)categ=CCPROC;else + yerror (1); + ysensitive=sensitive; + sensitive=ON;} + HIDENTIFIER { $$=$5; + sensitive=ysensitive;} + EXTERNAL_KIND_ITEM + { categ=CLOCAL;} + | HEXTERNAL + HCLASS + { MBEENEWBLOCK(); + kind=KCLASS;} + EXT_LIST + + ; +EXTERNAL_KIND_ITEM: EXT_IDENT + HOBJRELOPERATOR + { if($2!=HIS)yerror (2);} + MBEE_TYPE HPROCEDURE + HIDENTIFIER + { regDecl($6, type, KPROC, CCPROC); + beginBlock(kind);} + HEADING EMPTY_BLOCK + { categ=CLOCAL; + endBlock($1==NULL?$0:tag($1),CCCPROC);} +/* | + EXT_IDENT + { if($1!=NULL)yerror (3); + regDecl($0, type, kind, categ);} + MBEE_REST_EXT_LIST + { endBlock(NULL,CCNO);} + ; +MBEE_REST_EXT_LIST: /* EMPTY + | HPAREXPSEPARATOR EXT_KIND_LIST + ; +EXT_KIND_LIST : EXT_KIND_ITEM + | EXT_KIND_LIST HPAREXPSEPARATOR EXT_KIND_ITEM + ; +EXT_KIND_ITEM : HIDENTIFIER + EXT_IDENT + { if($2!=NULL)yerror (3); + regDecl($1, type, kind, categ);}*/ + ; +EMPTY_BLOCK : /*EMPT*/ + | HBEGIN HEND + ; +EXT_LIST : EXT_ITEM + | EXT_LIST HPAREXPSEPARATOR EXT_ITEM + ; +EXT_ITEM : HIDENTIFIER + EXT_IDENT + { lesinn_external_spec($1,$2, kind);} + ; +EXT_IDENT : /* EMPTY */ { $$=NULL;} + | HVALRELOPERATOR { if($1!=HEQ)yerror (9); + external=TRUE;} + HTEXTKONST { $$=$3;external=FALSE;} + ; +/* GRAMATIKK FOR TYPER */ +NO_TYPE : /*EMPT*/ { type=TNOTY;} + ; +MBEE_TYPE : NO_TYPE + | TYPE + ; +TYPE : HREF HBEGPAR + HIDENTIFIER + { prefquantident=$3; + type=TREF;} + HENDPAR + | HTEXT { type=TTEXT;} + | HBOOLEAN { type=TBOOL;} + | HCHARACTER { type=TCHAR;} + | HSHORT HINTEGER { type=TSHORT;} + | HINTEGER { type=TINTG;} + | HREAL { type=TREAL;} + | HLONG HREAL { type=TLONG;} + ; + +/* GRAMATIKK FOR DEL AV SETNINGER */ +MBEE_ELSE_PART : /*EMPT*/ +/* | HELSE + HIF + EXPRESSION + HTHEN { mout(MELSE); + mout(MIF); + OBSBLOCK();} + BLOCK { MBEEENDBLOCK();} + MBEE_ELSE_PART { mout(MENDIF);}*/ + | HELSE { OBSBLOCK(); mout(MELSE);} + BLOCK { MBEEENDBLOCK();} + ; +FOR_LIST : FOR_LIST_ELEMENT { mout(MENDSEP); + mout(MLISTSEP);} + | FOR_LIST_ELEMENT + HPAREXPSEPARATOR + FOR_LIST { mout(MLISTSEP);} + ; +FOR_LIST_ELEMENT: EXPRESSION + MBEE_F_L_EL_R_PT + ; +MBEE_F_L_EL_R_PT: /*EMPT*/ + | HWHILE + EXPRESSION { mout(MFORWHILE);} + | HSTEP + EXPRESSION + HUNTIL + EXPRESSION { mout(MUNTIL); + mout(MSTEP);} + ; +GOTO : HGO + HTO + | HGOTO + ; +CONN_STATE_R_PT : WHEN_CLAUSE_LIST + | HDO { beginBlock(KCON); mout(MDO); + OBSBLOCK(); } + BLOCK { endBlock(NULL,CCNO); + MBEEENDBLOCK(); mout(MENDDO);} + ; +WHEN_CLAUSE_LIST: HWHEN + HIDENTIFIER + HDO { beginBlock(KCON); mout(MIDENTIFIER); + OBSBLOCK(); moutId($2); + mout(MWHEN);} + BLOCK { endBlock(NULL,CCNO); + MBEEENDBLOCK(); mout(MENDWHEN);} + | WHEN_CLAUSE_LIST + HWHEN + HIDENTIFIER + HDO { beginBlock(KCON); mout(MIDENTIFIER); + OBSBLOCK(); moutId($3); + mout(MWHEN);} + BLOCK { endBlock(NULL,CCNO); + MBEEENDBLOCK(); mout(MENDWHEN);} + ; +MBEE_OTWI_CLAUS : /*EMPT*/ + | HOTHERWISE {OBSBLOCK(); mout(MOTHERWISE);} + + BLOCK {MBEEENDBLOCK();mout(MENDOTHERWISE);} + ; +ACTIVATOR : HACTIVATE { mout(MBOOLEANKONST); + moutIval(FALSE);} + | HREACTIVATE { mout(MBOOLEANKONST); + moutIval(TRUE);} + ; +SCHEDULE : /*EMPT*/ { mout(MCHARACTERKONST); + moutIval(DIRECT); + mout(MINTEGERKONST); + moutIval(0); + mout(MNONE); + mout(MBOOLEANKONST); + moutIval(FALSE);} + | ATDELAY EXPRESSION { mout(MNONE);} + PRIOR + | BEFOREAFTER { mout(MINTEGERKONST); + moutIval(0);} + EXPRESSION { mout(MBOOLEANKONST); + moutIval(FALSE);} + ; +ATDELAY : HAT { mout(MCHARACTERKONST); + moutIval(AT);} + | HDELAY { mout(MCHARACTERKONST); + moutIval(DELAYS);} + ; +BEFOREAFTER : HBEFORE { mout(MCHARACTERKONST); + moutIval(BEFORE);} + | HAFTER { mout(MCHARACTERKONST); + moutIval(AFTER);} + ; +PRIOR : /*EMPT*/ { mout(MBOOLEANKONST); + moutIval(FALSE);} + | HPRIOR { mout(MBOOLEANKONST); + moutIval(TRUE);} + ; +/* GRAMATIKK FOR SETNINGER OG DEKLARASJONER */ +MODULSTATEMENT : HWHILE + EXPRESSION + HDO { STOPOBSBLOCK(); mout(MWHILE); + OBSBLOCK();} + BLOCK { MBEEENDBLOCK(); mout(MENDWHILE); + $$=STATEMENT;} + | HIF + EXPRESSION + HTHEN { STOPOBSBLOCK(); mout(MIF); + OBSBLOCK();} + BLOCK { MBEEENDBLOCK();} + MBEE_ELSE_PART { mout(MENDIF); + $$=STATEMENT;} + | HFOR + HIDENTIFIER + HASSIGN { STOPOBSBLOCK(); mout(MIDENTIFIER); + moutId($2);} + FOR_LIST + HDO { beginBlock(KFOR); + if($3==HASSIGNVALUE) mout(MFOR); + else mout(MFORR); + OBSBLOCK(); mout(MFORDO);} + BLOCK { MBEEENDBLOCK(); + endBlock(NULL,CCNO); mout(MENDFOR); + $$=STATEMENT;} + | GOTO + EXPRESSION { mout(MGOTO); + STOPOBSBLOCK(); $$=STATEMENT;} + | HINSPECT + EXPRESSION { mout(MINSPECT); + STOPOBSBLOCK(); + beginBlock(KINSP);} + CONN_STATE_R_PT + { endBlock(NULL,CCNO);} + MBEE_OTWI_CLAUS { mout(MENDINSPECT); + $$=STATEMENT;} + | HINNER { STOPOBSBLOCK(); mout(MINNER); + regInner(); $$=STATEMENT;} + | HIDENTIFIER + HLABELSEPARATOR + { STOPOBSBLOCK(); + regDecl($1, TLABEL, KSIMPLE, categ); mout(MLABEL); + moutId($1); + mout(MENDLABEL);} + DECLSTATEMENT { if($4<=DECLARATION) + { yerror (27); + $$=DECLARATION;} + else $$=$4;} + | EXPRESSION_SIMP + HBEGIN + { $$=$1; } + IMPORT_SPEC_MODULE + { mout(MPRBLOCK); + prefquantident=$1; + beginBlock(KPRBLK);} + MBEE_DECLSTMS + HEND { endBlock(NULL,CCNO); mout(MENDPRBLOCK); + $$=STATEMENT;} + | EXPRESSION_SIMP HBEGIN error HSTATEMENTSEPARATOR + MBEE_DECLSTMS HEND { $$=STATEMENT; + endBlock(NULL,CCNO); mout(MENDPRBLOCK);} + | EXPRESSION_SIMP HBEGIN error HEND + { $$=STATEMENT; + endBlock(NULL,CCNO); mout(MENDPRBLOCK);} + + | EXPRESSION_SIMP + { STOPOBSBLOCK(); $$=STATEMENT; + mout(MENDASSIGN);} + | ACTIVATOR EXPRESSION SCHEDULE + { $$=STATEMENT; + mout(MENDSEP); + mout(MARGUMENTSEP); + mout(MARGUMENTSEP); + mout(MARGUMENTSEP); + mout(MARGUMENTSEP); + mout(MARGUMENTSEP); + mout(MARGUMENTSEP); + mout(MARGUMENT); + moutId(activateid); + mout(MENDASSIGN);} + | HBEGIN + { STOPOBSBLOCK(); + OBSBLOCK();} + MBEE_DECLSTMS + HEND { MBEEENDBLOCK(); $$=STATEMENT;} + | MBEE_TYPE HPROCEDURE + HIDENTIFIER + { MBEENEWBLOCK(); mout(MPROCEDURE); + regDecl($3, type, KPROC, categ); + beginBlock(KPROC);} + HEADING BLOCK { endBlock(NULL,CCNO); $$=DECLARATION; + mout(MENDPROCEDURE);} + | HIDENTIFIER + HCLASS + NO_TYPE + { $$=$1; } + IMPORT_SPEC_MODULE + HIDENTIFIER + { prefquantident=$1; + mout(MCLASS); + regDecl($6, TNOTY, KCLASS, categ); + beginBlock(KCLASS);} + HEADING + BLOCK { endBlock(NULL,CCNO); $$=DECLARATION; + mout(MENDCLASS);} + | HCLASS + NO_TYPE + HIDENTIFIER + { prefquantident=0; + MBEENEWBLOCK(); mout(MCLASS); + regDecl($3, TNOTY, KCLASS, categ); + beginBlock(KCLASS);} + HEADING + BLOCK { endBlock(NULL,CCNO); $$=DECLARATION; + mout(MENDCLASS);} + | EXT_DECLARATION { $$=EXTDECLARATION;} + | /*EMPT*/{ STOPOBSBLOCK(); $$=EMPTYSTATEMENT;} + ; +IMPORT_SPEC_MODULE: { MBEENEWBLOCK(); + kind=KCLASS; + if($0==simsetident && + findDecl(simsetident,cblock,FALSE)==NULL) + lesinn_external_spec(simsetident, + SIMSETATRFILE, kind); + if($0==simulationident && findDecl( + simulationident,cblock,FALSE)==NULL) + lesinn_external_spec(simulationident, + SIMULATIONATRFILE, kind); + if(($0==fileident && findDecl( + fileident,cblock,FALSE)==NULL) || + ($0==outfileident && findDecl( + outfileident,cblock,FALSE)==NULL) || + ($0==infileident && findDecl( + infileident,cblock,FALSE)==NULL) || + ($0==directfileident && findDecl( + directfileident,cblock,FALSE)==NULL) || + ($0==printfileident && findDecl( + printfileident,cblock,FALSE)==NULL) || + ($0==bytefileident && findDecl( + bytefileident,cblock,FALSE)==NULL) || + ($0==inbytefileident && findDecl( + inbytefileident,cblock,FALSE)==NULL) || + ($0==outbytefileident && findDecl( + outbytefileident,cblock,FALSE)==NULL) || + ($0==directbytefileident && findDecl( + directbytefileident,cblock,FALSE)==NULL)) + lesinn_external_spec(fileident, + FILEATRFILE, kind);} + ; +DECLSTATEMENT : MODULSTATEMENT + | TYPE + HIDENTIFIER + MBEE_CONSTANT + HPAREXPSEPARATOR + { MBEENEWBLOCK(); + kind=KSIMPLE; + regDecl($2, type, KSIMPLE, categ); + categ=CLOCAL;} + IDENTIFIER_LISTC { $$=DECLARATION;} + | TYPE + HIDENTIFIER + MBEE_CONSTANT + { MBEENEWBLOCK(); + regDecl($2, type, KSIMPLE, categ); + categ=CLOCAL; $$=DECLARATION;} + | MBEE_TYPE + HARRAY { MBEENEWBLOCK(); + kind=KARRAY;} + ARR_SEGMENT_LIST { $$=DECLARATION;} + | HSWITCH + HIDENTIFIER + HASSIGN { MBEENEWBLOCK(); mout(MIDENTIFIER); + moutId($2); + regDecl($2, TLABEL, KARRAY, categ);} + SWITCH_LIST { $$=DECLARATION; + mout(MSWITCH); + mout(MENDSWITCH);} + ; +BLOCK : DECLSTATEMENT { if($1<=DECLARATION)yerror (29);} + | HBEGIN MBEE_DECLSTMS HEND + | HBEGIN error HSTATEMENTSEPARATOR MBEE_DECLSTMS HEND + | HBEGIN error HEND + ; +MBEE_DECLSTMS : MBEE_DECLSTMSU { if($1<=DECLARATION)yerror (28); + $$=$1;} + ; +MBEE_DECLSTMSU : DECLSTATEMENT { $$=$1;} + | MBEE_DECLSTMSU + HSTATEMENTSEPARATOR + DECLSTATEMENT { if($1>=STATEMENT && $3<=DECLARATION) + yerror (26); + $$=$3;} + ; +MODULS : MODULSTATEMENT { if($1==DECLARATION) + {separat_comp=TRUE;gettimestamp();} + $$=$1;} + | MODULS HSTATEMENTSEPARATOR MODULSTATEMENT + { if($1>=STATEMENT && $3<=DECLARATION) + yerror (26);else + if($1>=STATEMENT + && $3!=EMPTYSTATEMENT)yerror (25); + if(separat_comp && $3==STATEMENT) + yerror (25); + if($3==DECLARATION && !separat_comp) + {separat_comp=TRUE;gettimestamp();} + $$=$3;} + ; +/* GRAMATIKK FOR DEL AV DEKLARASJONER */ +ARR_SEGMENT_LIST: ARR_SEGMENT + | ARR_SEGMENT_LIST + HPAREXPSEPARATOR + ARR_SEGMENT + ; +ARR_SEGMENT : ARRAY_SEGMENT + HBEGPAR + BAUND_PAIR_LIST HENDPAR { mout(MARRAY); + mout(MENDARRAY); + setArrayDim($3);} + ; +ARRAY_SEGMENT : ARRAY_SEGMENT_EL { mout(MENDSEP); + mout(MARRAYSEP);} + + | ARRAY_SEGMENT_EL + HPAREXPSEPARATOR + ARRAY_SEGMENT { mout(MARRAYSEP);} + ; +ARRAY_SEGMENT_EL: HIDENTIFIER { mout(MIDENTIFIER); + moutId($1); + regDecl($1, type, kind, categ); + if(lastArray==NULL) + lastArray=cblock->lastparloc;} + ; +BAUND_PAIR_LIST : BAUND_PAIR { mout(MENDSEP); + mout(MBOUNDSEP); + $$=1;} + | BAUND_PAIR + HPAREXPSEPARATOR + BAUND_PAIR_LIST { mout(MBOUNDSEP); + $$=$3+1;} + ; +BAUND_PAIR : EXPRESSION + HLABELSEPARATOR + EXPRESSION { mout(MBOUNDPARSEP);} + ; +SWITCH_LIST : EXPRESSION { mout(MENDSEP); + mout(MSWITCHSEP);} + | EXPRESSION + HPAREXPSEPARATOR + SWITCH_LIST { mout(MSWITCHSEP);} + ; +HEADING : MBEE_FMAL_PAR_P HSTATEMENTSEPARATOR { kind=KNOKD;} + MBEE_MODE_PART { categ=CSPEC;} + MBEE_SPEC_PART { kind=KNOKD;} + MBEE_PROT_PART { categ=CVIRT;} + MBEE_VIRT_PART + { categ=CLOCAL;} + ; +MBEE_FMAL_PAR_P : /*EMPT*/ + | FMAL_PAR_PART + ; +FMAL_PAR_PART : HBEGPAR NO_TYPE + MBEE_LISTV HENDPAR + ; +MBEE_LISTV : /*EMPT*/ + | LISTV + ; +LISTV : HIDENTIFIER { regDecl($1, type, KNOKD, CDEFLT);} + | FPP_CATEG HDOTDOTDOT { regDecl(varargsid, TVARARGS, KNOKD, categ);} + | HIDENTIFIER { regDecl($1, type, KNOKD, CDEFLT);} + HPAREXPSEPARATOR LISTV {} + | FPP_SPEC + | FPP_SPEC + HPAREXPSEPARATOR LISTV + ; +FPP_HEADING : HBEGPAR NO_TYPE + FPP_MBEE_LISTV HENDPAR + ; +FPP_MBEE_LISTV : /*EMPT*/ + | FPP_LISTV + ; +FPP_LISTV : FPP_CATEG HDOTDOTDOT { regDecl(varargsid, TVARARGS, KNOKD, categ);} + | FPP_SPEC + | FPP_SPEC + HPAREXPSEPARATOR LISTV + ; +FPP_SPEC : FPP_CATEG SPECIFIER HIDENTIFIER + { regDecl($3, type, kind, categ);} + | FPP_CATEG FPP_PROC_DECL_IN_SPEC + ; +FPP_CATEG : HNAME HLABELSEPARATOR + { categ=CNAME;} + | HVALUE HLABELSEPARATOR + { categ=CVALUE;} + | HVAR HLABELSEPARATOR + { categ=CVAR;} + | /*EMPT*/ { categ=CDEFLT;} + ; +FPP_PROC_DECL_IN_SPEC: MBEE_TYPE HPROCEDURE + HIDENTIFIER + { $$=categ; + regDecl($3, type, KPROC, categ); + beginBlock(KPROC);} + FPP_HEADING + { categ=$4; /* M} settes tilbake*/} + { endBlock(NULL,CCNO);} + ; +IDENTIFIER_LISTV: HIDENTIFIER { regDecl($1, type, kind, categ);} + | HDOTDOTDOT { regDecl(varargsid, TVARARGS, kind, categ);} + | HIDENTIFIER { regDecl($1, type, kind, categ);} + HPAREXPSEPARATOR IDENTIFIER_LISTV {} + ; +MBEE_MODE_PART : /*EMPT*/ + | MODE_PART + ; +MODE_PART : NAME_PART + | VALUE_PART + | VAR_PART + | NAME_PART VALUE_PART + | VALUE_PART NAME_PART + | NAME_PART VAR_PART + | VAR_PART NAME_PART + | VALUE_PART VAR_PART + | VAR_PART VALUE_PART + | VAR_PART NAME_PART VALUE_PART + | NAME_PART VAR_PART VALUE_PART + | NAME_PART VALUE_PART VAR_PART + | VAR_PART VALUE_PART NAME_PART + | VALUE_PART VAR_PART NAME_PART + | VALUE_PART NAME_PART VAR_PART + ; +NAME_PART : HNAME { categ=CNAME;} + IDENTIFIER_LISTV + HSTATEMENTSEPARATOR + ; +VAR_PART : HVAR { categ=CVAR;} + IDENTIFIER_LISTV + HSTATEMENTSEPARATOR + ; +VALUE_PART : HVALUE { categ=CVALUE;} + IDENTIFIER_LISTV HSTATEMENTSEPARATOR + ; +MBEE_SPEC_PART : /*EMPT*/ + | SPEC_PART + ; +SPEC_PART : ONE_SPEC + | SPEC_PART ONE_SPEC + ; +ONE_SPEC : SPECIFIER IDENTIFIER_LIST HSTATEMENTSEPARATOR + | NO_TYPE HPROCEDURE HIDENTIFIER HOBJRELOPERATOR + { if($4!=HIS) yerror (8);} + PROC_DECL_IN_SPEC HSTATEMENTSEPARATOR + | FPP_PROC_DECL_IN_SPEC HSTATEMENTSEPARATOR + | MBEE_TYPE HPROCEDURE HIDENTIFIER HSTATEMENTSEPARATOR + { yerror (45);} + | MBEE_TYPE HPROCEDURE HIDENTIFIER HPAREXPSEPARATOR + IDENTIFIER_LIST HSTATEMENTSEPARATOR + { yerror (45);} + ; +SPECIFIER : TYPE { kind=KSIMPLE;} + | MBEE_TYPE + HARRAY { kind=KARRAY;} + | HLABEL { type=TLABEL; + kind=KSIMPLE;} + | HSWITCH { type=TLABEL; + kind=KARRAY;} + ; +PROC_DECL_IN_SPEC: MBEE_TYPE HPROCEDURE + HIDENTIFIER + { $$=categ; + regDecl($3, type, KPROC, categ); + beginBlock(KPROC);} + HEADING + { categ=$4; /* M} settes tilbake*/} + MBEE_BEGIN_END + { endBlock(NULL,CCNO);} + ; +MBEE_BEGIN_END : /* EMPTY */ + | HBEGIN HEND + ; +MBEE_PROT_PART : /*EMPT*/ + | PROTECTION_PART + ; +PROTECTION_PART : PROT_SPECIFIER IDENTIFIER_LIST + HSTATEMENTSEPARATOR + | PROTECTION_PART PROT_SPECIFIER + IDENTIFIER_LIST HSTATEMENTSEPARATOR + ; +PROT_SPECIFIER : HHIDDEN { categ=CHIDEN;} + | HPROTECTED { categ=CPROT;} + | HHIDDEN + HPROTECTED { categ=CHIPRO;} + | HPROTECTED + HHIDDEN { categ=CHIPRO;} + ; +MBEE_VIRT_PART : /*EMPT*/ + | VIRTUAL_PART + ; +VIRTUAL_PART : HVIRTUAL + HLABELSEPARATOR + MBEE_SPEC_PART + ; +IDENTIFIER_LIST : HIDENTIFIER { regDecl($1, type, kind, categ);} + | IDENTIFIER_LIST HPAREXPSEPARATOR + HIDENTIFIER { regDecl($3, type, kind, categ);} + ; +IDENTIFIER_LISTC: HIDENTIFIER + MBEE_CONSTANT { regDecl($1, type, kind, categ); + categ=CLOCAL;} + | IDENTIFIER_LISTC HPAREXPSEPARATOR + HIDENTIFIER + MBEE_CONSTANT { regDecl($3, type, kind, categ); + categ=CLOCAL;} + ; +MBEE_CONSTANT : /* EMPTY */ + | HVALRELOPERATOR + { MBEENEWBLOCK(); + if($1!=HEQ) yerror (8); + if(type==TREF)yerror (7); + categ=CCONSTU; + mout(MIDENTIFIER); + moutId($0);} + EXPRESSION { mout(MASSIGN); + mout(MCONST);} + ; + +/* GRAMATIKK FOR UTTRYKK */ +EXPRESSION : EXPRESSION_SIMP {} + | HIF + EXPRESSION + HTHEN + EXPRESSION + HELSE + EXPRESSION { mout(MELSEE); + mout(MIFE);} + ; +EXPRESSION_SIMP : EXPRESSION_SIMP + HASSIGN + EXPRESSION { if($2==HASSIGNREF)mout(MASSIGNR); + else mout(MASSIGN);$$=NULL;} + | + + EXPRESSION_SIMP + HCONC + EXPRESSION_SIMP { mout(MCONC);$$=NULL;} + | EXPRESSION_SIMP HOR + HELSE + EXPRESSION_SIMP + %prec HORELSE { mout(MORELSEE);$$=NULL;} + | EXPRESSION_SIMP HAND + HTHEN + EXPRESSION_SIMP + %prec HANDTHEN { mout(MANDTHENE);$$=NULL;} + | EXPRESSION_SIMP + HEQV EXPRESSION_SIMP { mout(MEQV);$$=NULL;} + | EXPRESSION_SIMP + HIMP EXPRESSION_SIMP { mout(MIMP);$$=NULL;} + | EXPRESSION_SIMP + HOR EXPRESSION_SIMP { mout(MOR);$$=NULL;} + | EXPRESSION_SIMP + HAND EXPRESSION_SIMP { mout(MAND);$$=NULL;} + | HNOT EXPRESSION_SIMP { mout(MNOT);$$=NULL;} + | EXPRESSION_SIMP + HVALRELOPERATOR + EXPRESSION_SIMP + { switch($2) + { case HEQ: mout(MEQ);break; + case HNE: mout(MNE);break; + case HLT: mout(MLT);break; + case HLE: mout(MLE);break; + case HGT: mout(MGT);break; + case HGE: mout(MGE);break; + }$$=NULL;} + | EXPRESSION_SIMP + HREFRELOPERATOR + EXPRESSION_SIMP + { if($2==HNER) mout(MNER); + else mout(MEQR);$$=NULL;} + | EXPRESSION_SIMP + HOBJRELOPERATOR + EXPRESSION_SIMP + { if($2==HIS) mout(MIS); + else mout(MINS);$$=NULL;} + | HTERMOPERATOR + EXPRESSION_SIMP %prec UNEAR + { if($1==HADD) mout(MUADD); + else mout(MUSUB);$$=NULL;} + | EXPRESSION_SIMP + HTERMOPERATOR + EXPRESSION_SIMP + { if($2==HADD) mout(MADD); + else mout(MSUB);$$=NULL;} + | EXPRESSION_SIMP + HFACTOROPERATOR + EXPRESSION_SIMP + { if($2==HMUL) mout(MMUL); else + if($2==HDIV) mout(MDIV); + else mout(MINTDIV);$$=NULL;} + | EXPRESSION_SIMP + HPRIMARYOPERATOR + EXPRESSION_SIMP { mout(MPRIMARY);$$=NULL;} + | HBEGPAR + EXPRESSION HENDPAR { mout(MNOOP);$$=NULL;} + | HTEXTKONST { mout(MTEXTKONST); + moutTval($1);$$=NULL;} + | HCHARACTERKONST { mout(MCHARACTERKONST); + moutIval($1);$$=NULL;} + | HREALKONST { mout(MREALKONST); + moutRval($1);$$=NULL;} + | HINTEGERKONST { mout(MINTEGERKONST); + moutIval($1);$$=NULL;} + | HBOOLEANKONST { mout(MBOOLEANKONST); + moutIval($1);$$=NULL;} + | HNONE { mout(MNONE);$$=NULL;} + | HIDENTIFIER + { $$=$1;} + MBEE_ARG_R_PT {} + | HTHIS HIDENTIFIER { mout(MTHIS); + moutId($2);$$=NULL;} + | HNEW + HIDENTIFIER + ARG_R_PT { mout(MNEWARG); + moutId($2);$$=NULL;} + | EXPRESSION_SIMP + HDOT + EXPRESSION_SIMP { mout(MDOT);$$=NULL;} + | EXPRESSION_SIMP + HQUA HIDENTIFIER { mout(MQUA); + moutId($3);$$=NULL;} + ; +ARG_R_PT : /*EMPTY*/ { mout(MENDSEP);} + | HBEGPAR + ARGUMENT_LIST HENDPAR + ; +MBEE_ARG_R_PT : /*EMPTY*/ { mout(MIDENTIFIER); + moutId($0); + $$=$0;} + | HBEGPAR + ARGUMENT_LIST HENDPAR { mout(MARGUMENT); + moutId($0);} + ; +ARGUMENT_LIST : EXPRESSION { mout(MENDSEP); + mout(MARGUMENTSEP);} + | EXPRESSION + HPAREXPSEPARATOR + ARGUMENT_LIST { mout(MARGUMENTSEP);} + ; +%% +]]) + +# Pass plenty of options, to exercise plenty of code, even if we +# don't actually check the output. But SEGV is watching us, and +# so might do dmalloc. +AT_CHECK([[bison --verbose --defines input.y]], 0, [], +[[input.y: conflicts: 78 shift/reduce, 10 reduce/reduce +]]) + +AT_CHECK([[grep '^State.*conflicts:' input.output]], 0, +[[State 64 conflicts: 14 shift/reduce +State 164 conflicts: 1 shift/reduce +State 201 conflicts: 33 shift/reduce, 4 reduce/reduce +State 206 conflicts: 1 shift/reduce +State 240 conflicts: 1 shift/reduce +State 335 conflicts: 9 shift/reduce, 2 reduce/reduce +State 356 conflicts: 1 shift/reduce +State 360 conflicts: 9 shift/reduce, 2 reduce/reduce +State 427 conflicts: 9 shift/reduce, 2 reduce/reduce +]]) + +AT_CLEANUP + + +## ----------------- ## +## GNU pic Grammar. ## +## ----------------- ## + +AT_SETUP([GNU pic Grammar]) + +# GNU pic, part of groff. + +# Bison once reported shift/reduce conflicts that it shouldn't have. + +AT_DATA([[input.y]], +[[%union { + char *str; + int n; + double x; + struct { double x, y; } pair; + struct { double x; char *body; } if_data; + struct { char *str; const char *filename; int lineno; } lstr; + struct { double *v; int nv; int maxv; } dv; + struct { double val; int is_multiplicative; } by; + place pl; + object *obj; + corner crn; + path *pth; + object_spec *spec; + saved_state *pstate; + graphics_state state; + object_type obtype; +} + +%token LABEL +%token VARIABLE +%token NUMBER +%token TEXT +%token COMMAND_LINE +%token DELIMITED +%token ORDINAL +%token TH +%token LEFT_ARROW_HEAD +%token RIGHT_ARROW_HEAD +%token DOUBLE_ARROW_HEAD +%token LAST +%token UP +%token DOWN +%token LEFT +%token RIGHT +%token BOX +%token CIRCLE +%token ELLIPSE +%token ARC +%token LINE +%token ARROW +%token MOVE +%token SPLINE +%token HEIGHT +%token RADIUS +%token WIDTH +%token DIAMETER +%token FROM +%token TO +%token AT +%token WITH +%token BY +%token THEN +%token SOLID +%token DOTTED +%token DASHED +%token CHOP +%token SAME +%token INVISIBLE +%token LJUST +%token RJUST +%token ABOVE +%token BELOW +%token OF +%token THE +%token WAY +%token BETWEEN +%token AND +%token HERE +%token DOT_N +%token DOT_E +%token DOT_W +%token DOT_S +%token DOT_NE +%token DOT_SE +%token DOT_NW +%token DOT_SW +%token DOT_C +%token DOT_START +%token DOT_END +%token DOT_X +%token DOT_Y +%token DOT_HT +%token DOT_WID +%token DOT_RAD +%token SIN +%token COS +%token ATAN2 +%token LOG +%token EXP +%token SQRT +%token K_MAX +%token K_MIN +%token INT +%token RAND +%token SRAND +%token COPY +%token THRU +%token TOP +%token BOTTOM +%token UPPER +%token LOWER +%token SH +%token PRINT +%token CW +%token CCW +%token FOR +%token DO +%token IF +%token ELSE +%token ANDAND +%token OROR +%token NOTEQUAL +%token EQUALEQUAL +%token LESSEQUAL +%token GREATEREQUAL +%token LEFT_CORNER +%token RIGHT_CORNER +%token NORTH +%token SOUTH +%token EAST +%token WEST +%token CENTER +%token END +%token START +%token RESET +%token UNTIL +%token PLOT +%token THICKNESS +%token FILL +%token COLORED +%token OUTLINED +%token SHADED +%token ALIGNED +%token SPRINTF +%token COMMAND + +%left '.' + +/* this ensures that plot 17 "%g" parses as (plot 17 "%g") */ +%left PLOT +%left TEXT SPRINTF + +/* give text adjustments higher precedence than TEXT, so that +box "foo" above ljust == box ("foo" above ljust) +*/ + +%left LJUST RJUST ABOVE BELOW + +%left LEFT RIGHT +/* Give attributes that take an optional expression a higher +precedence than left and right, so that eg `line chop left' +parses properly. */ +%left CHOP SOLID DASHED DOTTED UP DOWN FILL COLORED OUTLINED +%left LABEL + +%left VARIABLE NUMBER '(' SIN COS ATAN2 LOG EXP SQRT K_MAX K_MIN INT RAND SRAND LAST +%left ORDINAL HERE '`' + +%left BOX CIRCLE ELLIPSE ARC LINE ARROW SPLINE '[' /* ] */ + +/* these need to be lower than '-' */ +%left HEIGHT RADIUS WIDTH DIAMETER FROM TO AT THICKNESS + +/* these must have higher precedence than CHOP so that `label %prec CHOP' +works */ +%left DOT_N DOT_E DOT_W DOT_S DOT_NE DOT_SE DOT_NW DOT_SW DOT_C +%left DOT_START DOT_END TOP BOTTOM LEFT_CORNER RIGHT_CORNER +%left UPPER LOWER NORTH SOUTH EAST WEST CENTER START END + +%left ',' +%left OROR +%left ANDAND +%left EQUALEQUAL NOTEQUAL +%left '<' '>' LESSEQUAL GREATEREQUAL + +%left BETWEEN OF +%left AND + +%left '+' '-' +%left '*' '/' '%' +%right '!' +%right '^' + +%type expr any_expr text_expr +%type optional_by +%type expr_pair position_not_place +%type simple_if +%type nth_primitive +%type corner +%type path label_path relative_path +%type place label element element_list middle_element_list +%type object_spec +%type position +%type object_type +%type optional_ordinal_last ordinal +%type until +%type sprintf_args +%type text print_args print_arg + +%% + +top: + optional_separator + | element_list + { + if (olist.head) + print_picture(olist.head); + } + ; + + +element_list: + optional_separator middle_element_list optional_separator + { $$ = $2; } + ; + +middle_element_list: + element + { $$ = $1; } + | middle_element_list separator element + { $$ = $1; } + ; + +optional_separator: + /* empty */ + | separator + ; + +separator: + ';' + | separator ';' + ; + +placeless_element: + VARIABLE '=' any_expr + { + define_variable($1, $3); + a_delete $1; + } + | VARIABLE ':' '=' any_expr + { + place *p = lookup_label($1); + if (!p) { + lex_error("variable `%1' not defined", $1); + YYABORT; + } + p->obj = 0; + p->x = $4; + p->y = 0.0; + a_delete $1; + } + | UP + { current_direction = UP_DIRECTION; } + | DOWN + { current_direction = DOWN_DIRECTION; } + | LEFT + { current_direction = LEFT_DIRECTION; } + | RIGHT + { current_direction = RIGHT_DIRECTION; } + | COMMAND_LINE + { + olist.append(make_command_object($1.str, $1.filename, + $1.lineno)); + } + | COMMAND print_args + { + olist.append(make_command_object($2.str, $2.filename, + $2.lineno)); + } + | PRINT print_args + { + fprintf(stderr, "%s\n", $2.str); + a_delete $2.str; + fflush(stderr); + } + | SH + { delim_flag = 1; } + DELIMITED + { + delim_flag = 0; + if (safer_flag) + lex_error("unsafe to run command `%1'", $3); + else + system($3); + a_delete $3; + } + | COPY TEXT + { + if (yychar < 0) + do_lookahead(); + do_copy($2.str); + // do not delete the filename + } + | COPY TEXT THRU + { delim_flag = 2; } + DELIMITED + { delim_flag = 0; } + until + { + if (yychar < 0) + do_lookahead(); + copy_file_thru($2.str, $5, $7); + // do not delete the filename + a_delete $5; + a_delete $7; + } + | COPY THRU + { delim_flag = 2; } + DELIMITED + { delim_flag = 0; } + until + { + if (yychar < 0) + do_lookahead(); + copy_rest_thru($4, $6); + a_delete $4; + a_delete $6; + } + | FOR VARIABLE '=' expr TO expr optional_by DO + { delim_flag = 1; } + DELIMITED + { + delim_flag = 0; + if (yychar < 0) + do_lookahead(); + do_for($2, $4, $6, $7.is_multiplicative, $7.val, $10); + } + | simple_if + { + if (yychar < 0) + do_lookahead(); + if ($1.x != 0.0) + push_body($1.body); + a_delete $1.body; + } + | simple_if ELSE + { delim_flag = 1; } + DELIMITED + { + delim_flag = 0; + if (yychar < 0) + do_lookahead(); + if ($1.x != 0.0) + push_body($1.body); + else + push_body($4); + a_delete $1.body; + a_delete $4; + } + | reset_variables + | RESET + { define_variable("scale", 1.0); } + ; + +reset_variables: + RESET VARIABLE + { + reset($2); + a_delete $2; + } + | reset_variables VARIABLE + { + reset($2); + a_delete $2; + } + | reset_variables ',' VARIABLE + { + reset($3); + a_delete $3; + } + ; + +print_args: + print_arg + { $$ = $1; } + | print_args print_arg + { + $$.str = new char[strlen($1.str) + strlen($2.str) + 1]; + strcpy($$.str, $1.str); + strcat($$.str, $2.str); + a_delete $1.str; + a_delete $2.str; + if ($1.filename) { + $$.filename = $1.filename; + $$.lineno = $1.lineno; + } + else if ($2.filename) { + $$.filename = $2.filename; + $$.lineno = $2.lineno; + } + } + ; + +print_arg: + expr %prec ',' + { + $$.str = new char[GDIGITS + 1]; + sprintf($$.str, "%g", $1); + $$.filename = 0; + $$.lineno = 0; + } + | text + { $$ = $1; } + | position %prec ',' + { + $$.str = new char[GDIGITS + 2 + GDIGITS + 1]; + sprintf($$.str, "%g, %g", $1.x, $1.y); + $$.filename = 0; + $$.lineno = 0; + } + ; + +simple_if: + IF any_expr THEN + { delim_flag = 1; } + DELIMITED + { + delim_flag = 0; + $$.x = $2; + $$.body = $5; + } + ; + +until: + /* empty */ + { $$ = 0; } + | UNTIL TEXT + { $$ = $2.str; } + ; + +any_expr: + expr + { $$ = $1; } + | text_expr + { $$ = $1; } + ; + +text_expr: + text EQUALEQUAL text + { + $$ = strcmp($1.str, $3.str) == 0; + a_delete $1.str; + a_delete $3.str; + } + | text NOTEQUAL text + { + $$ = strcmp($1.str, $3.str) != 0; + a_delete $1.str; + a_delete $3.str; + } + | text_expr ANDAND text_expr + { $$ = ($1 != 0.0 && $3 != 0.0); } + | text_expr ANDAND expr + { $$ = ($1 != 0.0 && $3 != 0.0); } + | expr ANDAND text_expr + { $$ = ($1 != 0.0 && $3 != 0.0); } + | text_expr OROR text_expr + { $$ = ($1 != 0.0 || $3 != 0.0); } + | text_expr OROR expr + { $$ = ($1 != 0.0 || $3 != 0.0); } + | expr OROR text_expr + { $$ = ($1 != 0.0 || $3 != 0.0); } + | '!' text_expr + { $$ = ($2 == 0.0); } + ; + + +optional_by: + /* empty */ + { + $$.val = 1.0; + $$.is_multiplicative = 0; + } + | BY expr + { + $$.val = $2; + $$.is_multiplicative = 0; + } + | BY '*' expr + { + $$.val = $3; + $$.is_multiplicative = 1; + } + ; + +element: + object_spec + { + $$.obj = $1->make_object(¤t_position, + ¤t_direction); + if ($$.obj == 0) + YYABORT; + delete $1; + if ($$.obj) + olist.append($$.obj); + else { + $$.x = current_position.x; + $$.y = current_position.y; + } + } + | LABEL ':' optional_separator element + { + $$ = $4; + define_label($1, & $$); + a_delete $1; + } + | LABEL ':' optional_separator position_not_place + { + $$.obj = 0; + $$.x = $4.x; + $$.y = $4.y; + define_label($1, & $$); + a_delete $1; + } + | LABEL ':' optional_separator place + { + $$ = $4; + define_label($1, & $$); + a_delete $1; + } + | '{' + { + $$.x = current_position.x; + $$.y = current_position.y; + $$.dir = current_direction; + } + element_list '}' + { + current_position.x = $2.x; + current_position.y = $2.y; + current_direction = $2.dir; + } + optional_element + { + $$ = $3; + } + | placeless_element + { + $$.obj = 0; + $$.x = current_position.x; + $$.y = current_position.y; + } + ; + +optional_element: + /* empty */ + {} + | element + {} + ; + +object_spec: + BOX + { $$ = new object_spec(BOX_OBJECT); } + | CIRCLE + { $$ = new object_spec(CIRCLE_OBJECT); } + | ELLIPSE + { $$ = new object_spec(ELLIPSE_OBJECT); } + | ARC + { + $$ = new object_spec(ARC_OBJECT); + $$->dir = current_direction; + } + | LINE + { + $$ = new object_spec(LINE_OBJECT); + lookup_variable("lineht", & $$->segment_height); + lookup_variable("linewid", & $$->segment_width); + $$->dir = current_direction; + } + | ARROW + { + $$ = new object_spec(ARROW_OBJECT); + lookup_variable("lineht", & $$->segment_height); + lookup_variable("linewid", & $$->segment_width); + $$->dir = current_direction; + } + | MOVE + { + $$ = new object_spec(MOVE_OBJECT); + lookup_variable("moveht", & $$->segment_height); + lookup_variable("movewid", & $$->segment_width); + $$->dir = current_direction; + } + | SPLINE + { + $$ = new object_spec(SPLINE_OBJECT); + lookup_variable("lineht", & $$->segment_height); + lookup_variable("linewid", & $$->segment_width); + $$->dir = current_direction; + } + | text %prec TEXT + { + $$ = new object_spec(TEXT_OBJECT); + $$->text = new text_item($1.str, $1.filename, $1.lineno); + } + | PLOT expr + { + $$ = new object_spec(TEXT_OBJECT); + $$->text = new text_item(format_number(0, $2), 0, -1); + } + | PLOT expr text + { + $$ = new object_spec(TEXT_OBJECT); + $$->text = new text_item(format_number($3.str, $2), + $3.filename, $3.lineno); + a_delete $3.str; + } + | '[' + { + saved_state *p = new saved_state; + $$ = p; + p->x = current_position.x; + p->y = current_position.y; + p->dir = current_direction; + p->tbl = current_table; + p->prev = current_saved_state; + current_position.x = 0.0; + current_position.y = 0.0; + current_table = new PTABLE(place); + current_saved_state = p; + olist.append(make_mark_object()); + } + element_list ']' + { + current_position.x = $2->x; + current_position.y = $2->y; + current_direction = $2->dir; + $$ = new object_spec(BLOCK_OBJECT); + olist.wrap_up_block(& $$->oblist); + $$->tbl = current_table; + current_table = $2->tbl; + current_saved_state = $2->prev; + delete $2; + } + | object_spec HEIGHT expr + { + $$ = $1; + $$->height = $3; + $$->flags |= HAS_HEIGHT; + } + | object_spec RADIUS expr + { + $$ = $1; + $$->radius = $3; + $$->flags |= HAS_RADIUS; + } + | object_spec WIDTH expr + { + $$ = $1; + $$->width = $3; + $$->flags |= HAS_WIDTH; + } + | object_spec DIAMETER expr + { + $$ = $1; + $$->radius = $3/2.0; + $$->flags |= HAS_RADIUS; + } + | object_spec expr %prec HEIGHT + { + $$ = $1; + $$->flags |= HAS_SEGMENT; + switch ($$->dir) { + case UP_DIRECTION: + $$->segment_pos.y += $2; + break; + case DOWN_DIRECTION: + $$->segment_pos.y -= $2; + break; + case RIGHT_DIRECTION: + $$->segment_pos.x += $2; + break; + case LEFT_DIRECTION: + $$->segment_pos.x -= $2; + break; + } + } + | object_spec UP + { + $$ = $1; + $$->dir = UP_DIRECTION; + $$->flags |= HAS_SEGMENT; + $$->segment_pos.y += $$->segment_height; + } + | object_spec UP expr + { + $$ = $1; + $$->dir = UP_DIRECTION; + $$->flags |= HAS_SEGMENT; + $$->segment_pos.y += $3; + } + | object_spec DOWN + { + $$ = $1; + $$->dir = DOWN_DIRECTION; + $$->flags |= HAS_SEGMENT; + $$->segment_pos.y -= $$->segment_height; + } + | object_spec DOWN expr + { + $$ = $1; + $$->dir = DOWN_DIRECTION; + $$->flags |= HAS_SEGMENT; + $$->segment_pos.y -= $3; + } + | object_spec RIGHT + { + $$ = $1; + $$->dir = RIGHT_DIRECTION; + $$->flags |= HAS_SEGMENT; + $$->segment_pos.x += $$->segment_width; + } + | object_spec RIGHT expr + { + $$ = $1; + $$->dir = RIGHT_DIRECTION; + $$->flags |= HAS_SEGMENT; + $$->segment_pos.x += $3; + } + | object_spec LEFT + { + $$ = $1; + $$->dir = LEFT_DIRECTION; + $$->flags |= HAS_SEGMENT; + $$->segment_pos.x -= $$->segment_width; + } + | object_spec LEFT expr + { + $$ = $1; + $$->dir = LEFT_DIRECTION; + $$->flags |= HAS_SEGMENT; + $$->segment_pos.x -= $3; + } + | object_spec FROM position + { + $$ = $1; + $$->flags |= HAS_FROM; + $$->from.x = $3.x; + $$->from.y = $3.y; + } + | object_spec TO position + { + $$ = $1; + if ($$->flags & HAS_SEGMENT) + $$->segment_list = new segment($$->segment_pos, + $$->segment_is_absolute, + $$->segment_list); + $$->flags |= HAS_SEGMENT; + $$->segment_pos.x = $3.x; + $$->segment_pos.y = $3.y; + $$->segment_is_absolute = 1; + $$->flags |= HAS_TO; + $$->to.x = $3.x; + $$->to.y = $3.y; + } + | object_spec AT position + { + $$ = $1; + $$->flags |= HAS_AT; + $$->at.x = $3.x; + $$->at.y = $3.y; + if ($$->type != ARC_OBJECT) { + $$->flags |= HAS_FROM; + $$->from.x = $3.x; + $$->from.y = $3.y; + } + } + | object_spec WITH path + { + $$ = $1; + $$->flags |= HAS_WITH; + $$->with = $3; + } + | object_spec WITH position %prec ',' + { + $$ = $1; + $$->flags |= HAS_WITH; + position pos; + pos.x = $3.x; + pos.y = $3.y; + $$->with = new path(pos); + } + | object_spec BY expr_pair + { + $$ = $1; + $$->flags |= HAS_SEGMENT; + $$->segment_pos.x += $3.x; + $$->segment_pos.y += $3.y; + } + | object_spec THEN + { + $$ = $1; + if ($$->flags & HAS_SEGMENT) { + $$->segment_list = new segment($$->segment_pos, + $$->segment_is_absolute, + $$->segment_list); + $$->flags &= ~HAS_SEGMENT; + $$->segment_pos.x = $$->segment_pos.y = 0.0; + $$->segment_is_absolute = 0; + } + } + | object_spec SOLID + { + $$ = $1; // nothing + } + | object_spec DOTTED + { + $$ = $1; + $$->flags |= IS_DOTTED; + lookup_variable("dashwid", & $$->dash_width); + } + | object_spec DOTTED expr + { + $$ = $1; + $$->flags |= IS_DOTTED; + $$->dash_width = $3; + } + | object_spec DASHED + { + $$ = $1; + $$->flags |= IS_DASHED; + lookup_variable("dashwid", & $$->dash_width); + } + | object_spec DASHED expr + { + $$ = $1; + $$->flags |= IS_DASHED; + $$->dash_width = $3; + } + | object_spec FILL + { + $$ = $1; + $$->flags |= IS_DEFAULT_FILLED; + } + | object_spec FILL expr + { + $$ = $1; + $$->flags |= IS_FILLED; + $$->fill = $3; + } + | object_spec SHADED text + { + $$ = $1; + $$->flags |= (IS_SHADED | IS_FILLED); + $$->shaded = new char[strlen($3.str)+1]; + strcpy($$->shaded, $3.str); + } + | object_spec COLORED text + { + $$ = $1; + $$->flags |= (IS_SHADED | IS_OUTLINED | IS_FILLED); + $$->shaded = new char[strlen($3.str)+1]; + strcpy($$->shaded, $3.str); + $$->outlined = new char[strlen($3.str)+1]; + strcpy($$->outlined, $3.str); + } + | object_spec OUTLINED text + { + $$ = $1; + $$->flags |= IS_OUTLINED; + $$->outlined = new char[strlen($3.str)+1]; + strcpy($$->outlined, $3.str); + } + | object_spec CHOP + { + $$ = $1; + // line chop chop means line chop 0 chop 0 + if ($$->flags & IS_DEFAULT_CHOPPED) { + $$->flags |= IS_CHOPPED; + $$->flags &= ~IS_DEFAULT_CHOPPED; + $$->start_chop = $$->end_chop = 0.0; + } + else if ($$->flags & IS_CHOPPED) { + $$->end_chop = 0.0; + } + else { + $$->flags |= IS_DEFAULT_CHOPPED; + } + } + | object_spec CHOP expr + { + $$ = $1; + if ($$->flags & IS_DEFAULT_CHOPPED) { + $$->flags |= IS_CHOPPED; + $$->flags &= ~IS_DEFAULT_CHOPPED; + $$->start_chop = 0.0; + $$->end_chop = $3; + } + else if ($$->flags & IS_CHOPPED) { + $$->end_chop = $3; + } + else { + $$->start_chop = $$->end_chop = $3; + $$->flags |= IS_CHOPPED; + } + } + | object_spec SAME + { + $$ = $1; + $$->flags |= IS_SAME; + } + | object_spec INVISIBLE + { + $$ = $1; + $$->flags |= IS_INVISIBLE; + } + | object_spec LEFT_ARROW_HEAD + { + $$ = $1; + $$->flags |= HAS_LEFT_ARROW_HEAD; + } + | object_spec RIGHT_ARROW_HEAD + { + $$ = $1; + $$->flags |= HAS_RIGHT_ARROW_HEAD; + } + | object_spec DOUBLE_ARROW_HEAD + { + $$ = $1; + $$->flags |= (HAS_LEFT_ARROW_HEAD|HAS_RIGHT_ARROW_HEAD); + } + | object_spec CW + { + $$ = $1; + $$->flags |= IS_CLOCKWISE; + } + | object_spec CCW + { + $$ = $1; + $$->flags &= ~IS_CLOCKWISE; + } + | object_spec text %prec TEXT + { + $$ = $1; + text_item **p; + for (p = & $$->text; *p; p = &(*p)->next) + ; + *p = new text_item($2.str, $2.filename, $2.lineno); + } + | object_spec LJUST + { + $$ = $1; + if ($$->text) { + text_item *p; + for (p = $$->text; p->next; p = p->next) + ; + p->adj.h = LEFT_ADJUST; + } + } + | object_spec RJUST + { + $$ = $1; + if ($$->text) { + text_item *p; + for (p = $$->text; p->next; p = p->next) + ; + p->adj.h = RIGHT_ADJUST; + } + } + | object_spec ABOVE + { + $$ = $1; + if ($$->text) { + text_item *p; + for (p = $$->text; p->next; p = p->next) + ; + p->adj.v = ABOVE_ADJUST; + } + } + | object_spec BELOW + { + $$ = $1; + if ($$->text) { + text_item *p; + for (p = $$->text; p->next; p = p->next) + ; + p->adj.v = BELOW_ADJUST; + } + } + | object_spec THICKNESS expr + { + $$ = $1; + $$->flags |= HAS_THICKNESS; + $$->thickness = $3; + } + | object_spec ALIGNED + { + $$ = $1; + $$->flags |= IS_ALIGNED; + } + ; + +text: + TEXT + { $$ = $1; } + | SPRINTF '(' TEXT sprintf_args ')' + { + $$.filename = $3.filename; + $$.lineno = $3.lineno; + $$.str = do_sprintf($3.str, $4.v, $4.nv); + a_delete $4.v; + a_delete $3.str; + } + ; + +sprintf_args: + /* empty */ + { + $$.v = 0; + $$.nv = 0; + $$.maxv = 0; + } + | sprintf_args ',' expr + { + $$ = $1; + if ($$.nv >= $$.maxv) { + if ($$.nv == 0) { + $$.v = new double[4]; + $$.maxv = 4; + } + else { + double *oldv = $$.v; + $$.maxv *= 2; + $$.v = new double[$$.maxv]; + memcpy($$.v, oldv, $$.nv*sizeof(double)); + a_delete oldv; + } + } + $$.v[$$.nv] = $3; + $$.nv += 1; + } + ; + +position: + position_not_place + { $$ = $1; } + | place + { + position pos = $1; + $$.x = pos.x; + $$.y = pos.y; + } + ; + +position_not_place: + expr_pair + { $$ = $1; } + | position '+' expr_pair + { + $$.x = $1.x + $3.x; + $$.y = $1.y + $3.y; + } + | position '-' expr_pair + { + $$.x = $1.x - $3.x; + $$.y = $1.y - $3.y; + } + | '(' position ',' position ')' + { + $$.x = $2.x; + $$.y = $4.y; + } + | expr between position AND position + { + $$.x = (1.0 - $1)*$3.x + $1*$5.x; + $$.y = (1.0 - $1)*$3.y + $1*$5.y; + } + | expr '<' position ',' position '>' + { + $$.x = (1.0 - $1)*$3.x + $1*$5.x; + $$.y = (1.0 - $1)*$3.y + $1*$5.y; + } + ; + +between: + BETWEEN + | OF THE WAY BETWEEN + ; + +expr_pair: + expr ',' expr + { + $$.x = $1; + $$.y = $3; + } + | '(' expr_pair ')' + { $$ = $2; } + ; + +place: + /* line at A left == line (at A) left */ + label %prec CHOP + { $$ = $1; } + | label corner + { + path pth($2); + if (!pth.follow($1, & $$)) + YYABORT; + } + | corner label + { + path pth($1); + if (!pth.follow($2, & $$)) + YYABORT; + } + | corner OF label + { + path pth($1); + if (!pth.follow($3, & $$)) + YYABORT; + } + | HERE + { + $$.x = current_position.x; + $$.y = current_position.y; + $$.obj = 0; + } + ; + +label: + LABEL + { + place *p = lookup_label($1); + if (!p) { + lex_error("there is no place `%1'", $1); + YYABORT; + } + $$ = *p; + a_delete $1; + } + | nth_primitive + { $$.obj = $1; } + | label '.' LABEL + { + path pth($3); + if (!pth.follow($1, & $$)) + YYABORT; + } + ; + +ordinal: + ORDINAL + { $$ = $1; } + | '`' any_expr TH + { + // XXX Check for overflow (and non-integers?). + $$ = (int)$2; + } + ; + +optional_ordinal_last: + LAST + { $$ = 1; } + | ordinal LAST + { $$ = $1; } + ; + +nth_primitive: + ordinal object_type + { + int count = 0; + object *p; + for (p = olist.head; p != 0; p = p->next) + if (p->type() == $2 && ++count == $1) { + $$ = p; + break; + } + if (p == 0) { + lex_error("there is no %1%2 %3", $1, ordinal_postfix($1), + object_type_name($2)); + YYABORT; + } + } + | optional_ordinal_last object_type + { + int count = 0; + object *p; + for (p = olist.tail; p != 0; p = p->prev) + if (p->type() == $2 && ++count == $1) { + $$ = p; + break; + } + if (p == 0) { + lex_error("there is no %1%2 last %3", $1, + ordinal_postfix($1), object_type_name($2)); + YYABORT; + } + } + ; + +object_type: + BOX + { $$ = BOX_OBJECT; } + | CIRCLE + { $$ = CIRCLE_OBJECT; } + | ELLIPSE + { $$ = ELLIPSE_OBJECT; } + | ARC + { $$ = ARC_OBJECT; } + | LINE + { $$ = LINE_OBJECT; } + | ARROW + { $$ = ARROW_OBJECT; } + | SPLINE + { $$ = SPLINE_OBJECT; } + | '[' ']' + { $$ = BLOCK_OBJECT; } + | TEXT + { $$ = TEXT_OBJECT; } + ; + +label_path: + '.' LABEL + { $$ = new path($2); } + | label_path '.' LABEL + { + $$ = $1; + $$->append($3); + } + ; + +relative_path: + corner %prec CHOP + { $$ = new path($1); } + /* give this a lower precedence than LEFT and RIGHT so that + [A: box] with .A left == [A: box] with (.A left) */ + | label_path %prec TEXT + { $$ = $1; } + | label_path corner + { + $$ = $1; + $$->append($2); + } + ; + +path: + relative_path + { $$ = $1; } + | '(' relative_path ',' relative_path ')' + { + $$ = $2; + $$->set_ypath($4); + } + /* The rest of these rules are a compatibility sop. */ + | ORDINAL LAST object_type relative_path + { + lex_warning("`%1%2 last %3' in `with' argument ignored", + $1, ordinal_postfix($1), object_type_name($3)); + $$ = $4; + } + | LAST object_type relative_path + { + lex_warning("`last %1' in `with' argument ignored", + object_type_name($2)); + $$ = $3; + } + | ORDINAL object_type relative_path + { + lex_warning("`%1%2 %3' in `with' argument ignored", + $1, ordinal_postfix($1), object_type_name($2)); + $$ = $3; + } + | LABEL relative_path + { + lex_warning("initial `%1' in `with' argument ignored", $1); + a_delete $1; + $$ = $2; + } + ; + +corner: + DOT_N + { $$ = &object::north; } + | DOT_E + { $$ = &object::east; } + | DOT_W + { $$ = &object::west; } + | DOT_S + { $$ = &object::south; } + | DOT_NE + { $$ = &object::north_east; } + | DOT_SE + { $$ = &object:: south_east; } + | DOT_NW + { $$ = &object::north_west; } + | DOT_SW + { $$ = &object::south_west; } + | DOT_C + { $$ = &object::center; } + | DOT_START + { $$ = &object::start; } + | DOT_END + { $$ = &object::end; } + | TOP + { $$ = &object::north; } + | BOTTOM + { $$ = &object::south; } + | LEFT + { $$ = &object::west; } + | RIGHT + { $$ = &object::east; } + | UPPER LEFT + { $$ = &object::north_west; } + | LOWER LEFT + { $$ = &object::south_west; } + | UPPER RIGHT + { $$ = &object::north_east; } + | LOWER RIGHT + { $$ = &object::south_east; } + | LEFT_CORNER + { $$ = &object::west; } + | RIGHT_CORNER + { $$ = &object::east; } + | UPPER LEFT_CORNER + { $$ = &object::north_west; } + | LOWER LEFT_CORNER + { $$ = &object::south_west; } + | UPPER RIGHT_CORNER + { $$ = &object::north_east; } + | LOWER RIGHT_CORNER + { $$ = &object::south_east; } + | NORTH + { $$ = &object::north; } + | SOUTH + { $$ = &object::south; } + | EAST + { $$ = &object::east; } + | WEST + { $$ = &object::west; } + | CENTER + { $$ = &object::center; } + | START + { $$ = &object::start; } + | END + { $$ = &object::end; } + ; + +expr: + VARIABLE + { + if (!lookup_variable($1, & $$)) { + lex_error("there is no variable `%1'", $1); + YYABORT; + } + a_delete $1; + } + | NUMBER + { $$ = $1; } + | place DOT_X + { + if ($1.obj != 0) + $$ = $1.obj->origin().x; + else + $$ = $1.x; + } + | place DOT_Y + { + if ($1.obj != 0) + $$ = $1.obj->origin().y; + else + $$ = $1.y; + } + | place DOT_HT + { + if ($1.obj != 0) + $$ = $1.obj->height(); + else + $$ = 0.0; + } + | place DOT_WID + { + if ($1.obj != 0) + $$ = $1.obj->width(); + else + $$ = 0.0; + } + | place DOT_RAD + { + if ($1.obj != 0) + $$ = $1.obj->radius(); + else + $$ = 0.0; + } + | expr '+' expr + { $$ = $1 + $3; } + | expr '-' expr + { $$ = $1 - $3; } + | expr '*' expr + { $$ = $1 * $3; } + | expr '/' expr + { + if ($3 == 0.0) { + lex_error("division by zero"); + YYABORT; + } + $$ = $1/$3; + } + | expr '%' expr + { + if ($3 == 0.0) { + lex_error("modulus by zero"); + YYABORT; + } + $$ = fmod($1, $3); + } + | expr '^' expr + { + errno = 0; + $$ = pow($1, $3); + if (errno == EDOM) { + lex_error("arguments to `^' operator out of domain"); + YYABORT; + } + if (errno == ERANGE) { + lex_error("result of `^' operator out of range"); + YYABORT; + } + } + | '-' expr %prec '!' + { $$ = -$2; } + | '(' any_expr ')' + { $$ = $2; } + | SIN '(' any_expr ')' + { + errno = 0; + $$ = sin($3); + if (errno == ERANGE) { + lex_error("sin result out of range"); + YYABORT; + } + } + | COS '(' any_expr ')' + { + errno = 0; + $$ = cos($3); + if (errno == ERANGE) { + lex_error("cos result out of range"); + YYABORT; + } + } + | ATAN2 '(' any_expr ',' any_expr ')' + { + errno = 0; + $$ = atan2($3, $5); + if (errno == EDOM) { + lex_error("atan2 argument out of domain"); + YYABORT; + } + if (errno == ERANGE) { + lex_error("atan2 result out of range"); + YYABORT; + } + } + | LOG '(' any_expr ')' + { + errno = 0; + $$ = log10($3); + if (errno == ERANGE) { + lex_error("log result out of range"); + YYABORT; + } + } + | EXP '(' any_expr ')' + { + errno = 0; + $$ = pow(10.0, $3); + if (errno == ERANGE) { + lex_error("exp result out of range"); + YYABORT; + } + } + | SQRT '(' any_expr ')' + { + errno = 0; + $$ = sqrt($3); + if (errno == EDOM) { + lex_error("sqrt argument out of domain"); + YYABORT; + } + } + | K_MAX '(' any_expr ',' any_expr ')' + { $$ = $3 > $5 ? $3 : $5; } + | K_MIN '(' any_expr ',' any_expr ')' + { $$ = $3 < $5 ? $3 : $5; } + | INT '(' any_expr ')' + { $$ = floor($3); } + | RAND '(' any_expr ')' + { $$ = 1.0 + floor(((rand()&0x7fff)/double(0x7fff))*$3); } + | RAND '(' ')' + { + /* return a random number in the range >=0, <1 */ + /* portable, but not very random */ + $$ = (rand() & 0x7fff) / double(0x8000); + } + | SRAND '(' any_expr ')' + { + $$ = 0; + srand((unsigned int)$3); + } + | expr '<' expr + { $$ = ($1 < $3); } + | expr LESSEQUAL expr + { $$ = ($1 <= $3); } + | expr '>' expr + { $$ = ($1 > $3); } + | expr GREATEREQUAL expr + { $$ = ($1 >= $3); } + | expr EQUALEQUAL expr + { $$ = ($1 == $3); } + | expr NOTEQUAL expr + { $$ = ($1 != $3); } + | expr ANDAND expr + { $$ = ($1 != 0.0 && $3 != 0.0); } + | expr OROR expr + { $$ = ($1 != 0.0 || $3 != 0.0); } + | '!' expr + { $$ = ($2 == 0.0); } + + ; +]]) + +# Pass plenty of options, to exercise plenty of code, even if we +# don't actually check the output. But SEGV is watching us, and +# so might do dmalloc. +AT_CHECK([[bison --verbose --defines input.y]], 0, [], []) + +AT_CLEANUP diff --git a/src/apps/bin/bison/tests/glr-regression.at b/src/apps/bin/bison/tests/glr-regression.at new file mode 100644 index 0000000000..b7d24ab7a8 --- /dev/null +++ b/src/apps/bin/bison/tests/glr-regression.at @@ -0,0 +1,220 @@ +# Checking GLR Parsing: Regression Tests -*- Autotest -*- +# Copyright (C) 2002, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AT_BANNER([[GLR Regression Tests]]) + +## --------------------------- ## +## Badly Collapsed GLR States. ## +## --------------------------- ## + +AT_SETUP([Badly Collapsed GLR States]) + +AT_DATA_GRAMMAR([glr-regr1.y], +[[/* Regression Test: Improper state compression */ +/* Reported by Scott McPeak */ + +%{ +#include + +#define YYSTYPE int +static YYSTYPE exprMerge (YYSTYPE x0, YYSTYPE x1); +int yylex (void); +int yyerror (char const *msg); +%} + + +%glr-parser + + +/* -------- productions ------ */ +%% + +StartSymbol: E { $$=0; } %merge + ; + +E: E 'P' E { $$=1; printf("E -> E 'P' E\n"); } %merge + | 'B' { $$=2; printf("E -> 'B'\n"); } %merge + ; + + + +/* ---------- C code ----------- */ +%% + +static YYSTYPE exprMerge (YYSTYPE x0, YYSTYPE x1) +{ + (void) x0; + (void) x1; + printf ("\n"); + return 0; +} + +int +main (void) +{ + return yyparse (); +} + +int +yyerror (char const *msg) +{ + fprintf (stderr, "%s\n", msg); + exit (4); +} + + +int +yylex (void) +{ + for (;;) + { + int ch = getchar (); + if (ch == EOF) + return 0; + else if (ch == 'B' || ch == 'P') + return ch; + } +} +]]) + +AT_CHECK([[bison -o glr-regr1.c glr-regr1.y]], 0, [], +[glr-regr1.y: conflicts: 1 shift/reduce +]) +AT_COMPILE([glr-regr1]) +AT_CHECK([[echo BPBPB | ./glr-regr1]], 0, +[[E -> 'B' +E -> 'B' +E -> E 'P' E +E -> 'B' +E -> E 'P' E +E -> 'B' +E -> E 'P' E +E -> E 'P' E + +]], []) + +AT_CLEANUP + +## ------------------------------------------------------------ ## +## Improper handling of embedded actions and $-N in GLR parsers ## +## ------------------------------------------------------------ ## + +AT_SETUP([Improper handling of embedded actions and $-N in GLR parsers]) + +AT_DATA_GRAMMAR([glr-regr2a.y], +[[/* Regression Test: Improper handling of embedded actions and $-N */ +/* Reported by S. Eken */ + +%{ + #define YYSTYPE char const * + #define yyfalse 0 + #define yytrue 1 + + #include + #include + #include + int yylex (void); + void yyerror (char const *); +%} + +%glr-parser + +%% + +command: + 's' var 't' + { printf ("Variable: '%s'\n", $2); } + 'v' 'x' 'q' + | 's' var_list 't' 'e' + { printf ("Varlist: '%s'\n", $2); } + | 's' var 't' var_printer 'x' + ; + +var: + 'V' + { $$ = $1; } + ; + +var_list: + var + { $$ = $1; } + | var ',' var_list + { + char buffer[50]; + strcpy (buffer, $1); + strcat (buffer, ","); + strcat (buffer, $3); + $$ = strdup (buffer); + } + ; + +var_printer: 'v' + { printf ("Variable: '%s'\n", $-1); } + +%% + +FILE *yyin = NULL; + +int +yylex (void) +{ + char buf[50]; + switch (fscanf (yyin, " %1[a-z,]", buf)) { + case 1: + return buf[0]; + case EOF: + return 0; + default: + break; + } + fscanf (yyin, "%s", buf); + yylval = strdup (buf); + return 'V'; +} + +void +yyerror (char const *s) +{ printf ("%s\n", s); +} + +int +main (int argc, char **argv) +{ + yyin = stdin; + if (argc == 2 && !(yyin = fopen (argv[1], "r"))) return 1; + return yyparse (); +} +]]) + +AT_CHECK([[bison -o glr-regr2a.c glr-regr2a.y]], 0, [], +[glr-regr2a.y: conflicts: 2 shift/reduce +]) +AT_COMPILE([glr-regr2a]) + +AT_CHECK([[echo s VARIABLE_1 t v x q | ./glr-regr2a]], 0, +[[Variable: 'VARIABLE_1' +]], []) +AT_CHECK([[echo s VARIABLE_1 , ANOTHER_VARIABLE_2 t e | ./glr-regr2a]], 0, +[[Varlist: 'VARIABLE_1,ANOTHER_VARIABLE_2' +]]) +AT_CHECK([[echo s VARIABLE_3 t v x | ./glr-regr2a]], 0, +[[Variable: 'VARIABLE_3' +]], []) + + +AT_CLEANUP diff --git a/src/apps/bin/bison/tests/headers.at b/src/apps/bin/bison/tests/headers.at new file mode 100644 index 0000000000..7865341c77 --- /dev/null +++ b/src/apps/bin/bison/tests/headers.at @@ -0,0 +1,136 @@ +# Bison Parser Headers. -*- Autotest -*- +# Copyright 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AT_BANNER([[Parser Headers.]]) + + +## ---------------------- ## +## %union and --defines. ## +## ---------------------- ## + + +AT_SETUP([%union and --defines]) + +AT_DATA([input.y], +[%union +{ + int integer; + char *string ; +} +%% +exp: {}; +]) + +AT_CHECK([bison --defines input.y]) + +AT_CLEANUP + + + +## --------------------- ## +## Invalid CPP headers. ## +## --------------------- ## + +# AT_TEST_CPP_GUARD_H([INPUT-FILE-BASE) +# ------------------------------------- +m4_define([AT_TEST_CPP_GUARD_H], +[AT_SETUP([Invalid CPP guards: $1]) + +# Possibly create inner directories. +dirname=`AS_DIRNAME([$1])` +AS_MKDIR_P([$dirname]) + +AT_DATA_GRAMMAR([$1.y], +[%{ +#include "$1.h" +%} +%% +dummy:; +%% +#include "$1.h" +]) + +AT_CHECK([bison --defines=$1.h --output=y.tab.c $1.y]) + +# CPP should be happy with it. +AT_CHECK([$CC -E -I. y.tab.c], 0, [ignore]) + +AT_CLEANUP +]) + +AT_TEST_CPP_GUARD_H([input/input]) +AT_TEST_CPP_GUARD_H([9foo]) + + + +## ---------------- ## +## export YYLTYPE. ## +## ---------------- ## + + +AT_SETUP([export YYLTYPE]) + +AT_DATA_GRAMMAR([input.y], +[%locations + +%name-prefix="my_" +%{ +#include +#include + +static int +my_lex (void) +{ + return EOF; +} + +static void +my_error (const char *msg) +{ + fprintf (stderr, "%s\n", msg); +} + +%} +%% +exp:; +]) + +AT_CHECK([bison --defines -o input.c input.y]) + +# YYLTYPE should be defined, and MY_LLOC declared. +AT_DATA([caller.c], +[[#include "input.h" +YYLTYPE *my_llocp = &my_lloc; + +int my_parse (void); + +int +main (void) +{ + return my_parse (); +} +]]) + +# Link and execute, just to make sure everything is fine (and in +# particular, that MY_LLOC is indeed defined somewhere). +AT_COMPILE([caller.o], [-c caller.c]) +AT_COMPILE([input.o], [-c input.c]) +AT_COMPILE([caller], [caller.o input.o]) +AT_PARSER_CHECK([./caller]) + +AT_CLEANUP diff --git a/src/apps/bin/bison/tests/input.at b/src/apps/bin/bison/tests/input.at new file mode 100644 index 0000000000..4b3e4e2128 --- /dev/null +++ b/src/apps/bin/bison/tests/input.at @@ -0,0 +1,237 @@ +# Checking the Bison scanner. -*- Autotest -*- +# Copyright (C) 2002, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AT_BANNER([[Input Processing.]]) + +# Mostly test that we are robust to mistakes. + + +## ------------ ## +## Invalid $n. ## +## ------------ ## + +AT_SETUP([Invalid $n]) + +AT_DATA([input.y], +[[%% +exp: { $$ = $1 ; }; +]]) + +AT_CHECK([bison input.y], [1], [], +[[input.y:2.13-14: integer out of range: `$1' +]]) + +AT_CLEANUP + + +## ------------ ## +## Invalid @n. ## +## ------------ ## + +AT_SETUP([Invalid @n]) + +AT_DATA([input.y], +[[%% +exp: { @$ = @1 ; }; +]]) + +AT_CHECK([bison input.y], [1], [], +[[input.y:2.13-14: integer out of range: `@1' +]]) + +AT_CLEANUP + + +## -------------- ## +## Type Clashes. ## +## -------------- ## + +AT_SETUP([Type Clashes]) + +AT_DATA([input.y], +[[%token foo +%type exp +%% +exp: foo {} foo + | foo + | /* Empty. */ + ; +]]) + +AT_CHECK([bison input.y], [], [], +[[input.y:4.6-15: warning: type clash on default action: != <> +input.y:5.6-8: warning: type clash on default action: != <> +input.y:6.5: warning: empty rule for typed nonterminal, and no action +]]) + +AT_CLEANUP + + + +## ----------------------- ## +## Torturing the Scanner. ## +## ----------------------- ## + +# Be sure to compile and run, so that the C compiler checks what +# we do. + +AT_SETUP([Torturing the Scanner]) + + +AT_DATA([input.y], []) +AT_CHECK([bison input.y], [1], [], +[[input.y:1.1: syntax error, unexpected "end of file" +]]) + + +AT_DATA_GRAMMAR([input.y], +[[%{ +/* This is seen in GCC: a %{ and %} in middle of a comment. */ +const char *foo = "So %{ and %} can be here too."; + +#if 0 +/* These examples test Bison while not stressing C compilers too much. + Many C compilers mishandle backslash-newlines, so this part of the + test is inside "#if 0". The comment and string are written so that + the "#endif" will be seen regardless of the C compiler bugs that we + know about, namely: + + HP C (as of late 2002) mishandles *\[newline]\[newline]/ within a + comment. + + The Apple Darwin compiler (as of late 2002) mishandles + \\[newline]' within a character constant. + + */ + +/\ +* A comment with backslash-newlines in it. %} *\ +\ +/ +/* { Close the above comment, if the C compiler mishandled it. */ + +char str[] = "\\ +" A string with backslash-newlines in it %{ %} \\ +\ +""; + +char apostrophe = '\''; +#endif + +#include +%} +/* %{ and %} can be here too. */ + +%{ +/* Exercise pre-prologue dependency to %union. */ +typedef int value; +%} + +/* Exercise M4 quoting: '@:>@@:>@', 0. */ + +/* Also exercise %union. */ +%union +{ + value ival; /* A comment to exercise an old bug. */ +}; + + +/* Exercise post-prologue dependency to %union. */ +%{ +static YYSTYPE value_as_yystype (value val); + +/* Exercise quotes in declarations. */ +char quote[] = "@:>@@:>@,"; +%} + +%{ +static void yyerror (const char *s); +static int yylex (void); +%} + +%type '@<:@' + +/* Exercise quotes in strings. */ +%token FAKE "fake @<:@@:>@ \a\b\f\n\r\t\v\"\'\?\\\u005B\U0000005c ??!??'??(??)??-??/?? \x1\1" + +%% +/* Exercise M4 quoting: '@:>@@:>@', @<:@, 1. */ +exp: '@<:@' '\1' two '$' '@' '{' oline output.or.oline.opt + { + /* Exercise quotes in braces. */ + char tmp[] = "@<:@%c@:>@,\n"; + printf (tmp, $1); + } +; + +two: '\x000000000000000000000000000000000000000000000000000000000000000000002'; +oline: '@' 'o' 'l' 'i' 'n' 'e' '@' '_' '_' 'o' 'l' 'i' 'n' 'e' '_' '_'; +output.or.oline.opt: ;|oline;;|output;;; +output: '#' 'o' 'u' 't' 'p' 'u' 't' ' '; +%% +/* Exercise M4 quoting: '@:>@@:>@', @<:@, 2. */ + +static YYSTYPE +value_as_yystype (value val) +{ + YYSTYPE res; + res.ival = val; + return res; +} + +static int +yylex (void) +{ + static const char *input = "@<:@\1\2$@{@oline@__@&t@oline__\ +#output "; /* " + */ + yylval = value_as_yystype (*input); + return *input++; +} + +static void +yyerror (const char *msg) +{ + fprintf (stderr, "%s\n", msg); +} +]]) + +# Pacify Emacs'font-lock-mode: " + +AT_DATA([main.c], +[[typedef int value; +#include "input.h" + +int yyparse (void); + +int +main (void) +{ + return yyparse (); +} +]]) + +AT_CHECK([bison -d -v -o input.c input.y]) +AT_COMPILE([input.o], [-c input.c]) +AT_COMPILE([main.o], [-c main.c]) +AT_COMPILE([input], [input.o main.o]) +AT_PARSER_CHECK([./input], 0, +[[[@<:@], +]]) + +AT_CLEANUP diff --git a/src/apps/bin/bison/tests/local.at b/src/apps/bin/bison/tests/local.at new file mode 100644 index 0000000000..7ff9f3b44c --- /dev/null +++ b/src/apps/bin/bison/tests/local.at @@ -0,0 +1,206 @@ +# Process this -*- Autotest -*- file with autom4te. + +# Macros for the GNU Bison Test suite. +# Copyright (C) 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +# We want a recent Autotest. +m4_version_prereq([2.58]) + + +## ------------------------------- ## +## Macros decoding Bison options. ## +## ------------------------------- ## + + +# AT_BISON_OPTION_PUSHDEFS([BISON-OPTIONS]) +# ----------------------------------------- +m4_define([AT_BISON_OPTION_PUSHDEFS], +[_AT_BISON_OPTION_PUSHDEFS($[1], $[2], [$1])]) + + +# _AT_BISON_OPTION_PUSHDEFS($1, $2, [BISON-OPTIONS]) +# -------------------------------------------------- +# This macro works around the impossibility to define macros +# inside macros, because issuing `[$1]' is not possible in M4 :(. +# This sucks hard, GNU M4 should really provide M5 like $$1. +m4_define([_AT_BISON_OPTION_PUSHDEFS], +[m4_if([$1$2], $[1]$[2], [], + [m4_fatal([$0: Invalid arguments: $@])])dnl +m4_pushdef([AT_LALR1_CC_IF], +[m4_bmatch([$3], ["lalr1.cc"], [$1], [$2])]) +m4_pushdef([AT_GLR_IF], +[m4_bmatch([$3], [%glr-parser], [$1], [$2])]) +# Using yacc.c? +m4_pushdef([AT_YACC_IF], +[m4_bmatch([$3], [%glr-parser\|%skeleton], [$2], [$1])]) +m4_pushdef([AT_PARAM_IF], +[m4_bmatch([$3], [%parse-param], [$1], [$2])]) +m4_pushdef([AT_LOCATION_IF], +[m4_bmatch([$3], [%locations], [$1], [$2])]) +m4_pushdef([AT_PURE_IF], +[m4_bmatch([$3], [%pure-parser], [$1], [$2])]) +m4_pushdef([AT_PURE_AND_LOC_IF], +[m4_bmatch([$3], [%locations.*%pure-parser\|%pure-parser.*%locations], + [$1], [$2])]) +m4_pushdef([AT_GLR_OR_PARAM_IF], +[m4_bmatch([$3], [%glr-parser\|%parse-param], [$1], [$2])]) + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). +m4_pushdef([AT_YYERROR_ARG_LOC_IF], +[AT_GLR_OR_PARAM_IF([AT_PURE_AND_LOC_IF([$1], [$2])], + [$2])]) +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. +m4_pushdef([AT_YYERROR_SEES_LOC_IF], +[AT_LOCATION_IF([AT_YACC_IF([AT_PURE_IF([AT_PARAM_IF([$1], [$2])], + [$1])], + [$1])], + [$2])]) + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. +m4_pushdef([AT_PURE_LEX_IF], +[AT_PURE_IF([$1], + [AT_LALR1_CC_IF([$1], [$2])])]) + +AT_PURE_LEX_IF( +[m4_pushdef([AT_LOC], [(*yylloc)]) + m4_pushdef([AT_VAL], [(*yylval)]) + m4_pushdef([AT_LEX_FORMALS], + [YYSTYPE *yylval[]AT_LOCATION_IF([, YYLTYPE *yylloc])]) + m4_pushdef([AT_LEX_ARGS], + [yylval[]AT_LOCATION_IF([, yylloc])]) + m4_pushdef([AT_USE_LEX_ARGS], + [(void) yylval;AT_LOCATION_IF([(void) yylloc])]) + m4_pushdef([AT_LEX_PRE_FORMALS], + [AT_LEX_FORMALS, ]) + m4_pushdef([AT_LEX_PRE_ARGS], + [AT_LEX_ARGS, ]) +], +[m4_pushdef([AT_LOC], [(yylloc)]) + m4_pushdef([AT_VAL], [(yylval)]) + m4_pushdef([AT_LEX_FORMALS], [void]) + m4_pushdef([AT_LEX_ARGS], []) + m4_pushdef([AT_USE_LEX_ARGS], []) + m4_pushdef([AT_LEX_PRE_FORMALS], []) + m4_pushdef([AT_LEX_PRE_ARGS], []) +]) +])# _AT_BISON_OPTION_PUSHDEFS + + +# AT_BISON_OPTION_POPDEFS +# ----------------------- +m4_define([AT_BISON_OPTION_POPDEFS], +[m4_popdef([AT_LEX_PRE_ARGS]) +m4_popdef([AT_LEX_PRE_FORMALS]) +m4_popdef([AT_USE_LEX_ARGS]) +m4_popdef([AT_LEX_ARGS]) +m4_popdef([AT_LEX_FORMALS]) +m4_popdef([AT_VAL]) +m4_popdef([AT_LOC]) +m4_popdef([AT_PURE_LEX_IF]) +m4_popdef([AT_YYERROR_SEES_LOC_IF]) +m4_popdef([AT_YYERROR_ARG_LOC_IF]) +m4_popdef([AT_GLR_OR_PARAM_IF]) +m4_popdef([AT_PURE_AND_LOC_IF]) +m4_popdef([AT_LOCATION_IF]) +m4_popdef([AT_PARAM_IF]) +m4_popdef([AT_YACC_IF]) +m4_popdef([AT_GLR_IF]) +m4_popdef([AT_LALR1_CC_IF]) +])# AT_BISON_OPTION_POPDEFS + + + +## -------------------------- ## +## Generating Grammar Files. ## +## -------------------------- ## + + +# AT_DATA_GRAMMAR_PROLOGUE +# ------------------------ +# The prologue that should be included in any grammar which parser is +# meant to be compiled. +m4_define([AT_DATA_GRAMMAR_PROLOGUE], +[[%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%}] +]) + + +# AT_DATA_GRAMMAR(NAME, CONTENT) +# ------------------------------ +# Generate the file NAME, which CONTENT is preceded by +# AT_DATA_GRAMMAR_PROLOGUE. +m4_define([AT_DATA_GRAMMAR], +[AT_DATA([$1], +[AT_DATA_GRAMMAR_PROLOGUE +$2]) +]) + + +## ------------------------ ## +## Compiling C, C++ Files. ## +## ------------------------ ## + + +# AT_COMPILE(OUTPUT, [SOURCES = OUTPUT.c]) +# ---------------------------------------- +# Compile SOURCES into OUTPUT. If OUTPUT does not contain '.', +# assume that we are linking too; this is a hack. +m4_define([AT_COMPILE], +[AT_CHECK([$CC $CFLAGS $CPPFLAGS m4_bmatch([$1], [[.]], [], [$LDFLAGS ])m4_default([$2], [$1.c]) m4_bmatch([$1], [[.]], [], [$LIBS ])-o $1], + 0, [ignore], [ignore])]) + +# AT_COMPILE_CXX(OUTPUT, [SOURCES = OUTPUT.c]) +# -------------------------------------------- +# If the C++ compiler is not defined, ignore the test. +m4_define([AT_COMPILE_CXX], +[AT_KEYWORDS(c++) +AT_CHECK([$CXX --version || exit 77], 0, ignore, ignore) +AT_CHECK([$CXX $CXXFLAGS $CPPFLAGS m4_default([$2], [$1.c]) -o $1], + 0, [ignore], [ignore])]) + + + +## ---------------------------- ## +## Running a generated parser. ## +## ---------------------------- ## + +# AT_PARSER_CHECK(COMMAND, EXIT-STATUS, EXPOUT, EXPERR) +# ----------------------------------------------------- +# So that we can run `./testsuite PREPARSER='valgrind -q' for instance. +m4_define([AT_PARSER_CHECK], +[AT_CHECK([$PREPARSER $1], [$2], [$3], [$4])]) + + + + +## ----------------------- ## +## Launch the test suite. ## +## ----------------------- ## + +AT_INIT + +AT_TESTED([bison]) diff --git a/src/apps/bin/bison/tests/output.at b/src/apps/bin/bison/tests/output.at new file mode 100644 index 0000000000..147e8b28ad --- /dev/null +++ b/src/apps/bin/bison/tests/output.at @@ -0,0 +1,83 @@ +# Checking the output filenames. -*- Autotest -*- +# Copyright 2000, 2001 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AT_BANNER([[Output file names.]]) + + +# AT_CHECK_OUTPUT(INPUT-FILE, [DIRECTIVES], [FLAGS], EXPECTED-FILES) +# ------------------------------------------------------------------ +m4_define([AT_CHECK_OUTPUT], +[AT_SETUP([Output files: $2 & $3.]) +AT_DATA([$1], +[[$2 +%% +foo: {}; +]]) + +AT_CHECK([bison $3 $1], 0) +AT_CHECK([ls $4], [], [ignore]) +AT_CLEANUP +]) + +AT_CHECK_OUTPUT([foo.y], [], [-dv], + [foo.output foo.tab.c foo.tab.h]) +AT_CHECK_OUTPUT([foo.y], [], [-dv -o foo.c], + [foo.c foo.h foo.output]) +AT_CHECK_OUTPUT([foo.y], [], [-dv -o foo.tab.c], + [foo.output foo.tab.c foo.tab.h]) +AT_CHECK_OUTPUT([foo.y], [], [-dv -y], + [y.output y.tab.c y.tab.h]) +AT_CHECK_OUTPUT([foo.y], [], [-dv -b bar], + [bar.output bar.tab.c bar.tab.h]) +AT_CHECK_OUTPUT([foo.y], [], [-dv -g -o foo.c], + [foo.c foo.h foo.output foo.vcg]) + + +AT_CHECK_OUTPUT([foo.y], [%defines %verbose], [], + [foo.output foo.tab.c foo.tab.h]) +AT_CHECK_OUTPUT([foo.y], [%defines %verbose %yacc],[], + [y.output y.tab.c y.tab.h]) + +AT_CHECK_OUTPUT([foo.yy], [%defines %verbose %yacc],[], + [y.output y.tab.c y.tab.h]) + +# Exercise %output and %file-prefix +AT_CHECK_OUTPUT([foo.y], [%file-prefix="bar" %defines %verbose], [], + [bar.output bar.tab.c bar.tab.h]) +AT_CHECK_OUTPUT([foo.y], [%output="bar.c" %defines %verbose %yacc],[], + [bar.output bar.c bar.h]) +AT_CHECK_OUTPUT([foo.y], + [%file-prefix="baz" %output="bar.c" %defines %verbose %yacc], + [], + [bar.output bar.c bar.h]) + + +# Check priorities of extension control. +AT_CHECK_OUTPUT([foo.yy], [%defines %verbose], [], + [foo.output foo.tab.cc foo.tab.hh]) + +AT_CHECK_OUTPUT([foo.yy], [%defines %verbose ], [-o foo.c], + [foo.c foo.h foo.output]) + +AT_CHECK_OUTPUT([foo.yy], [], + [--defines=foo.hpp -o foo.c++], + [foo.c++ foo.hpp]) + +AT_CHECK_OUTPUT([foo.yy], [], + [-o foo.c++ --graph=foo.gph], + [foo.c++ foo.gph]) diff --git a/src/apps/bin/bison/tests/package.m4 b/src/apps/bin/bison/tests/package.m4 new file mode 100644 index 0000000000..a2ac18d0ea --- /dev/null +++ b/src/apps/bin/bison/tests/package.m4 @@ -0,0 +1,6 @@ +# Signature of the current package. +m4_define([AT_PACKAGE_NAME], [GNU Bison]) +m4_define([AT_PACKAGE_TARNAME], [bison]) +m4_define([AT_PACKAGE_VERSION], [1.875d]) +m4_define([AT_PACKAGE_STRING], [GNU Bison 1.875d]) +m4_define([AT_PACKAGE_BUGREPORT], [bug-bison@gnu.org]) diff --git a/src/apps/bin/bison/tests/reduce.at b/src/apps/bin/bison/tests/reduce.at new file mode 100644 index 0000000000..c6e501fa9a --- /dev/null +++ b/src/apps/bin/bison/tests/reduce.at @@ -0,0 +1,355 @@ +# Exercising Bison Grammar Reduction. -*- Autotest -*- +# Copyright (C) 2001, 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AT_BANNER([[Grammar Reduction.]]) + + +## ------------------- ## +## Useless Terminals. ## +## ------------------- ## + +AT_SETUP([Useless Terminals]) + +AT_DATA([[input.y]], +[[%verbose +%output="input.c" + +%token useless1 +%token useless2 +%token useless3 +%token useless4 +%token useless5 +%token useless6 +%token useless7 +%token useless8 +%token useless9 + +%token useful +%% +exp: useful; +]]) + +AT_CHECK([[bison input.y]]) + +AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0, +[[Terminals which are not used + useless1 + useless2 + useless3 + useless4 + useless5 + useless6 + useless7 + useless8 + useless9 +]]) + +AT_CLEANUP + + + +## ---------------------- ## +## Useless Nonterminals. ## +## ---------------------- ## + +AT_SETUP([Useless Nonterminals]) + +AT_DATA([[input.y]], +[[%verbose +%output="input.c" + +%nterm useless1 +%nterm useless2 +%nterm useless3 +%nterm useless4 +%nterm useless5 +%nterm useless6 +%nterm useless7 +%nterm useless8 +%nterm useless9 + +%token useful +%% +exp: useful; +]]) + +AT_CHECK([[bison input.y]], 0, [], +[[input.y: warning: 9 useless nonterminals +input.y:4.8-15: warning: useless nonterminal: useless1 +input.y:5.8-15: warning: useless nonterminal: useless2 +input.y:6.8-15: warning: useless nonterminal: useless3 +input.y:7.8-15: warning: useless nonterminal: useless4 +input.y:8.8-15: warning: useless nonterminal: useless5 +input.y:9.8-15: warning: useless nonterminal: useless6 +input.y:10.8-15: warning: useless nonterminal: useless7 +input.y:11.8-15: warning: useless nonterminal: useless8 +input.y:12.8-15: warning: useless nonterminal: useless9 +]]) + +AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0, +[[Useless nonterminals + useless1 + useless2 + useless3 + useless4 + useless5 + useless6 + useless7 + useless8 + useless9 +]]) + +AT_CLEANUP + + + +## --------------- ## +## Useless Rules. ## +## --------------- ## + +AT_SETUP([Useless Rules]) + +AT_KEYWORDS([report]) + +AT_DATA([[input.y]], +[[%verbose +%output="input.c" +%token useful +%% +exp: useful; +useless1: '1'; +useless2: '2'; +useless3: '3'; +useless4: '4'; +useless5: '5'; +useless6: '6'; +useless7: '7'; +useless8: '8'; +useless9: '9'; +]]) + +AT_CHECK([[bison input.y]], 0, [], +[[input.y: warning: 9 useless nonterminals and 9 useless rules +input.y:6.1-8: warning: useless nonterminal: useless1 +input.y:7.1-8: warning: useless nonterminal: useless2 +input.y:8.1-8: warning: useless nonterminal: useless3 +input.y:9.1-8: warning: useless nonterminal: useless4 +input.y:10.1-8: warning: useless nonterminal: useless5 +input.y:11.1-8: warning: useless nonterminal: useless6 +input.y:12.1-8: warning: useless nonterminal: useless7 +input.y:13.1-8: warning: useless nonterminal: useless8 +input.y:14.1-8: warning: useless nonterminal: useless9 +input.y:6.11-13: warning: useless rule: useless1: '1' +input.y:7.11-13: warning: useless rule: useless2: '2' +input.y:8.11-13: warning: useless rule: useless3: '3' +input.y:9.11-13: warning: useless rule: useless4: '4' +input.y:10.11-13: warning: useless rule: useless5: '5' +input.y:11.11-13: warning: useless rule: useless6: '6' +input.y:12.11-13: warning: useless rule: useless7: '7' +input.y:13.11-13: warning: useless rule: useless8: '8' +input.y:14.11-13: warning: useless rule: useless9: '9' +]]) + +AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0, +[[Useless nonterminals + useless1 + useless2 + useless3 + useless4 + useless5 + useless6 + useless7 + useless8 + useless9 +Terminals which are not used + '1' + '2' + '3' + '4' + '5' + '6' + '7' + '8' + '9' +Useless rules + 2 useless1: '1' + 3 useless2: '2' + 4 useless3: '3' + 5 useless4: '4' + 6 useless5: '5' + 7 useless6: '6' + 8 useless7: '7' + 9 useless8: '8' + 10 useless9: '9' +]]) + +AT_CLEANUP + + + +## ------------------- ## +## Reduced Automaton. ## +## ------------------- ## + +# Check that the automaton is that as the for the grammar reduced by +# hand. + +AT_SETUP([Reduced Automaton]) + +AT_KEYWORDS([report]) + +# The non reduced grammar. +# ------------------------ +AT_DATA([[not-reduced.y]], +[[/* A useless token. */ +%token useless_token +/* A useful one. */ +%token useful +%verbose +%output="not-reduced.c" + +%% + +exp: useful { /* A useful action. */ } + | non_productive { /* A non productive action. */ } + ; + +not_reachable: useful { /* A not reachable action. */ } + ; + +non_productive: non_productive useless_token + { /* Another non productive action. */ } + ; +%% +]]) + +AT_CHECK([[bison not-reduced.y]], 0, [], +[[not-reduced.y: warning: 2 useless nonterminals and 3 useless rules +not-reduced.y:14.1-13: warning: useless nonterminal: not_reachable +not-reduced.y:11.6-19: warning: useless nonterminal: non_productive +not-reduced.y:11.6-57: warning: useless rule: exp: non_productive +not-reduced.y:14.16-56: warning: useless rule: not_reachable: useful +not-reduced.y:17.17-18.63: warning: useless rule: non_productive: non_productive useless_token +]]) + +AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' not-reduced.output]], 0, +[[Useless nonterminals + not_reachable + non_productive +Terminals which are not used + useless_token +Useless rules + 2 exp: non_productive + 3 not_reachable: useful + 4 non_productive: non_productive useless_token +]]) + +# The reduced grammar. +# -------------------- +AT_DATA([[reduced.y]], +[[/* A useless token. */ +%token useless_token +/* A useful one. */ +%token useful +%verbose +%output="reduced.c" + +%% + +exp: useful { /* A useful action. */ } +// | non_productive { /* A non productive action. */ } */ + ; + +//not_reachable: useful { /* A not reachable action. */ } +// ; + +//non_productive: non_productive useless_token +// { /* Another non productive action. */ } +// ; +%% +]]) + +AT_CHECK([[bison reduced.y]]) + +# Comparing the parsers. +cp reduced.c expout +AT_CHECK([sed 's/not-reduced/reduced/g' not-reduced.c], 0, [expout]) + +AT_CLEANUP + + + +## ------------------- ## +## Underivable Rules. ## +## ------------------- ## + +AT_SETUP([Underivable Rules]) + +AT_KEYWORDS([report]) + +AT_DATA([[input.y]], +[[%verbose +%output="input.c" +%token useful +%% +exp: useful | underivable; +underivable: indirection; +indirection: underivable; +]]) + +AT_CHECK([[bison input.y]], 0, [], +[[input.y: warning: 2 useless nonterminals and 3 useless rules +input.y:5.15-25: warning: useless nonterminal: underivable +input.y:6.14-24: warning: useless nonterminal: indirection +input.y:5.15-25: warning: useless rule: exp: underivable +input.y:6.14-24: warning: useless rule: underivable: indirection +input.y:7.14-24: warning: useless rule: indirection: underivable +]]) + +AT_CHECK([[sed -n '/^Grammar/q;/^$/!p' input.output]], 0, +[[Useless nonterminals + underivable + indirection +Useless rules + 2 exp: underivable + 3 underivable: indirection + 4 indirection: underivable +]]) + +AT_CLEANUP + + + +## ---------------- ## +## Empty Language. ## +## ---------------- ## + +AT_SETUP([Empty Language]) + +AT_DATA([[input.y]], +[[%output="input.c" +%% +exp: exp; +]]) + +AT_CHECK([[bison input.y]], 1, [], +[[input.y: warning: 2 useless nonterminals and 2 useless rules +input.y:3.1-3: fatal error: start symbol exp does not derive any sentence +]]) + +AT_CLEANUP diff --git a/src/apps/bin/bison/tests/regression.at b/src/apps/bin/bison/tests/regression.at new file mode 100644 index 0000000000..94422bd3e1 --- /dev/null +++ b/src/apps/bin/bison/tests/regression.at @@ -0,0 +1,794 @@ +# Bison Regressions. -*- Autotest -*- +# Copyright (C) 2001, 2002, 2003, 2004 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AT_BANNER([[Regression tests.]]) + + +## ------------------------- ## +## Early token definitions. ## +## ------------------------- ## + + +AT_SETUP([Early token definitions]) + +# Found in GCJ: they expect the tokens to be defined before the user +# prologue, so that they can use the token definitions in it. + +AT_DATA_GRAMMAR([input.y], +[[%{ +void yyerror (const char *s); +int yylex (void); +%} + +%union +{ + int val; +}; +%{ +#ifndef MY_TOKEN +# error "MY_TOKEN not defined." +#endif +%} +%token MY_TOKEN +%% +exp: MY_TOKEN; +%% +]]) + +AT_CHECK([bison -o input.c input.y]) +AT_COMPILE([input.o], [-c input.c]) + +AT_CLEANUP + + + +## ---------------- ## +## Braces parsing. ## +## ---------------- ## + + +AT_SETUP([Braces parsing]) + +AT_DATA([input.y], +[[/* Bison used to swallow the character after `}'. */ + +%% +exp: { tests = {{{{{{{{{{}}}}}}}}}}; }; +%% +]]) + +AT_CHECK([bison -v -o input.c input.y]) + +AT_CHECK([grep 'tests = {{{{{{{{{{}}}}}}}}}};' input.c], 0, [ignore]) + +AT_CLEANUP + + +## ------------------ ## +## Duplicate string. ## +## ------------------ ## + + +AT_SETUP([Duplicate string]) + +AT_DATA([input.y], +[[/* `Bison -v' used to dump core when two tokens are defined with the same + string, as LE and GE below. */ + +%token NUM +%token LE "<=" +%token GE "<=" + +%% +exp: '(' exp ')' | NUM ; +%% +]]) + +AT_CHECK([bison -v -o input.c input.y], 0, [], +[[input.y:6.8-14: warning: symbol `"<="' used more than once as a literal string +]]) + +AT_CLEANUP + + +## ------------------- ## +## Rule Line Numbers. ## +## ------------------- ## + +AT_SETUP([Rule Line Numbers]) + +AT_KEYWORDS([report]) + +AT_DATA([input.y], +[[%% +expr: +'a' + +{ + +} + +'b' + +{ + +} + +| + + +{ + + +} + +'c' + +{ + +}; +]]) + +AT_CHECK([bison -o input.c -v input.y]) + +# Check the contents of the report. +AT_CHECK([cat input.output], [], +[[Grammar + + 0 $accept: expr $end + + 1 @1: /* empty */ + + 2 expr: 'a' @1 'b' + + 3 @2: /* empty */ + + 4 expr: @2 'c' + + +Terminals, with rules where they appear + +$end (0) 0 +'a' (97) 2 +'b' (98) 2 +'c' (99) 4 +error (256) + + +Nonterminals, with rules where they appear + +$accept (6) + on left: 0 +expr (7) + on left: 2 4, on right: 0 +@1 (8) + on left: 1, on right: 2 +@2 (9) + on left: 3, on right: 4 + + +state 0 + + 0 $accept: . expr $end + + 'a' shift, and go to state 1 + + $default reduce using rule 3 (@2) + + expr go to state 2 + @2 go to state 3 + + +state 1 + + 2 expr: 'a' . @1 'b' + + $default reduce using rule 1 (@1) + + @1 go to state 4 + + +state 2 + + 0 $accept: expr . $end + + $end shift, and go to state 5 + + +state 3 + + 4 expr: @2 . 'c' + + 'c' shift, and go to state 6 + + +state 4 + + 2 expr: 'a' @1 . 'b' + + 'b' shift, and go to state 7 + + +state 5 + + 0 $accept: expr $end . + + $default accept + + +state 6 + + 4 expr: @2 'c' . + + $default reduce using rule 4 (expr) + + +state 7 + + 2 expr: 'a' @1 'b' . + + $default reduce using rule 2 (expr) +]]) + +AT_CLEANUP + + + +## ---------------------- ## +## Mixing %token styles. ## +## ---------------------- ## + + +AT_SETUP([Mixing %token styles]) + +# Taken from the documentation. +AT_DATA([input.y], +[[%token OR "||" +%token LE 134 "<=" +%left OR "<=" +%% +exp: ; +%% +]]) + +AT_CHECK([bison -v -o input.c input.y]) + +AT_CLEANUP + + + +## ---------------- ## +## Invalid inputs. ## +## ---------------- ## + + +AT_SETUP([Invalid inputs]) + +AT_DATA([input.y], +[[%% +? +default: 'a' } +%& +%a-does-not-exist +%- +%{ +]]) + +AT_CHECK([bison input.y], [1], [], +[[input.y:2.1: invalid character: `?' +input.y:3.14: invalid character: `}' +input.y:4.1: invalid character: `%' +input.y:4.2: invalid character: `&' +input.y:5.1-17: invalid directive: `%a-does-not-exist' +input.y:6.1: invalid character: `%' +input.y:6.2: invalid character: `-' +input.y:7.1-8.0: missing `%}' at end of file +]]) + +AT_CLEANUP + + + +## ------------------- ## +## Token definitions. ## +## ------------------- ## + + +AT_SETUP([Token definitions]) + +# Bison managed, when fed with `%token 'f' "f"' to #define 'f'! +AT_DATA_GRAMMAR([input.y], +[%{ +void yyerror (const char *s); +int yylex (void); +%} +[%token MYEOF 0 "end of file" +%token 'a' "a" +%token b "b" +%token c 'c' +%token 'd' d +%% +exp: "a"; +]]) + +AT_CHECK([bison -o input.c input.y]) +AT_COMPILE([input.o], [-c input.c]) +AT_CLEANUP + + + +## -------------------- ## +## Characters Escapes. ## +## -------------------- ## + + +AT_SETUP([Characters Escapes]) + +AT_DATA_GRAMMAR([input.y], +[%{ +void yyerror (const char *s); +int yylex (void); +%} +[%% +exp: + '\'' "\'" +| '\"' "\"" +| '"' "'" +; +]]) +# Pacify font-lock-mode: " + +AT_CHECK([bison -o input.c input.y]) +AT_COMPILE([input.o], [-c input.c]) +AT_CLEANUP + + + +## -------------- ## +## Web2c Report. ## +## -------------- ## + +# The generation of the reduction was once wrong in Bison, and made it +# miss some reductions. In the following test case, the reduction on +# `undef_id_tok' in state 1 was missing. This is stripped down from +# the actual web2c.y. + +AT_SETUP([Web2c Report]) + +AT_KEYWORDS([report]) + +AT_DATA([input.y], +[[%token undef_id_tok const_id_tok + +%start CONST_DEC_PART + +%% +CONST_DEC_PART: + CONST_DEC_LIST + ; + +CONST_DEC_LIST: + CONST_DEC + | CONST_DEC_LIST CONST_DEC + ; + +CONST_DEC: + { } undef_id_tok '=' const_id_tok ';' + ; +%% +]]) + +AT_CHECK([bison -v input.y]) +AT_CHECK([cat input.output], 0, +[[Grammar + + 0 $accept: CONST_DEC_PART $end + + 1 CONST_DEC_PART: CONST_DEC_LIST + + 2 CONST_DEC_LIST: CONST_DEC + 3 | CONST_DEC_LIST CONST_DEC + + 4 @1: /* empty */ + + 5 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';' + + +Terminals, with rules where they appear + +$end (0) 0 +';' (59) 5 +'=' (61) 5 +error (256) +undef_id_tok (258) 5 +const_id_tok (259) 5 + + +Nonterminals, with rules where they appear + +$accept (7) + on left: 0 +CONST_DEC_PART (8) + on left: 1, on right: 0 +CONST_DEC_LIST (9) + on left: 2 3, on right: 1 3 +CONST_DEC (10) + on left: 5, on right: 2 3 +@1 (11) + on left: 4, on right: 5 + + +state 0 + + 0 $accept: . CONST_DEC_PART $end + + $default reduce using rule 4 (@1) + + CONST_DEC_PART go to state 1 + CONST_DEC_LIST go to state 2 + CONST_DEC go to state 3 + @1 go to state 4 + + +state 1 + + 0 $accept: CONST_DEC_PART . $end + + $end shift, and go to state 5 + + +state 2 + + 1 CONST_DEC_PART: CONST_DEC_LIST . + 3 CONST_DEC_LIST: CONST_DEC_LIST . CONST_DEC + + undef_id_tok reduce using rule 4 (@1) + $default reduce using rule 1 (CONST_DEC_PART) + + CONST_DEC go to state 6 + @1 go to state 4 + + +state 3 + + 2 CONST_DEC_LIST: CONST_DEC . + + $default reduce using rule 2 (CONST_DEC_LIST) + + +state 4 + + 5 CONST_DEC: @1 . undef_id_tok '=' const_id_tok ';' + + undef_id_tok shift, and go to state 7 + + +state 5 + + 0 $accept: CONST_DEC_PART $end . + + $default accept + + +state 6 + + 3 CONST_DEC_LIST: CONST_DEC_LIST CONST_DEC . + + $default reduce using rule 3 (CONST_DEC_LIST) + + +state 7 + + 5 CONST_DEC: @1 undef_id_tok . '=' const_id_tok ';' + + '=' shift, and go to state 8 + + +state 8 + + 5 CONST_DEC: @1 undef_id_tok '=' . const_id_tok ';' + + const_id_tok shift, and go to state 9 + + +state 9 + + 5 CONST_DEC: @1 undef_id_tok '=' const_id_tok . ';' + + ';' shift, and go to state 10 + + +state 10 + + 5 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';' . + + $default reduce using rule 5 (CONST_DEC) +]]) + +AT_CLEANUP + + +## --------------- ## +## Web2c Actions. ## +## --------------- ## + +# The generation of the mapping `state -> action' was once wrong in +# extremely specific situations. web2c.y exhibits this situation. +# Below is a stripped version of the grammar. It looks like one can +# simplify it further, but just don't: it is tuned to exhibit a bug, +# which disapears when applying sane grammar transformations. +# +# It used to be wrong on yydefact only: +# +# static const short int yydefact[] = +# { +# - 2, 0, 1, 0, 0, 2, 3, 2, 5, 4, +# + 2, 0, 1, 0, 0, 0, 3, 2, 5, 4, +# 0, 0 +# }; +# +# but let's check all the tables. + + +AT_SETUP([Web2c Actions]) + +AT_KEYWORDS([report]) + +AT_DATA([input.y], +[[%% +statement: struct_stat; +struct_stat: /* empty. */ | if else; +if: "if" "const" "then" statement; +else: "else" statement; +%% +]]) + +AT_CHECK([bison -v -o input.c input.y]) + +# Check only the tables. We don't use --no-parser, because it is +# still to be implemented in the experimental branch of Bison. +[sed -n 's/ *$//;/^static const.*\[\] =/,/^}/p' input.c >tables.c] + +AT_CHECK([[cat tables.c]], 0, +[[static const unsigned char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6 +}; +static const unsigned char yyprhs[] = +{ + 0, 0, 3, 5, 6, 9, 14 +}; +static const yysigned_char yyrhs[] = +{ + 8, 0, -1, 9, -1, -1, 10, 11, -1, 3, + 4, 5, 8, -1, 6, 8, -1 +}; +static const unsigned char yyrline[] = +{ + 0, 2, 2, 3, 3, 4, 5 +}; +static const char *const yytname[] = +{ + "$end", "error", "$undefined", "\"if\"", "\"const\"", "\"then\"", + "\"else\"", "$accept", "statement", "struct_stat", "if", "else", 0 +}; +static const unsigned short int yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261 +}; +static const unsigned char yyr1[] = +{ + 0, 7, 8, 9, 9, 10, 11 +}; +static const unsigned char yyr2[] = +{ + 0, 2, 1, 0, 2, 4, 2 +}; +static const unsigned char yydefact[] = +{ + 3, 0, 0, 2, 0, 0, 1, 3, 4, 3, + 6, 5 +}; +static const yysigned_char yydefgoto[] = +{ + -1, 2, 3, 4, 8 +}; +static const yysigned_char yypact[] = +{ + -2, -1, 4, -8, 0, 2, -8, -2, -8, -2, + -8, -8 +}; +static const yysigned_char yypgoto[] = +{ + -8, -7, -8, -8, -8 +}; +static const unsigned char yytable[] = +{ + 10, 1, 11, 5, 6, 0, 7, 9 +}; +static const yysigned_char yycheck[] = +{ + 7, 3, 9, 4, 0, -1, 6, 5 +}; +static const unsigned char yystos[] = +{ + 0, 3, 8, 9, 10, 4, 0, 6, 11, 5, + 8, 8 +}; +]]) + +AT_CLEANUP + + +## ------------------------- ## +## yycheck Bound Violation. ## +## ------------------------- ## + + +# _AT_DATA_DANCER_Y(BISON-OPTIONS) +# -------------------------------- +# The following grammar, taken from Andrew Suffield's GPL'd implementation +# of DGMTP, the Dancer Generic Message Transport Protocol, used to violate +# yycheck's bounds where issuing a verbose error message. Keep this test +# so that possible bound checking compilers could check all the skeletons. +m4_define([_AT_DATA_DANCER_Y], +[AT_DATA_GRAMMAR([dancer.y], +[%{ +static int yylex (AT_LALR1_CC_IF([int *], [void])); +AT_LALR1_CC_IF([], +[#include +static void yyerror (const char *);]) +%} +$1 +%token ARROW INVALID NUMBER STRING DATA +%defines +%verbose +%error-verbose +/* Grammar follows */ +%% +line: header body + ; + +header: '<' from ARROW to '>' type ':' + | '<' ARROW to '>' type ':' + | ARROW to type ':' + | type ':' + | '<' '>' + ; + +from: DATA + | STRING + | INVALID + ; + +to: DATA + | STRING + | INVALID + ; + +type: DATA + | STRING + | INVALID + ; + +body: /* empty */ + | body member + ; + +member: STRING + | DATA + | '+' NUMBER + | '-' NUMBER + | NUMBER + | INVALID + ; +%% +AT_LALR1_CC_IF( +[/* Currently, print_ is required in C++. */ +void +yy::Parser::print_ () +{ +} + +/* A C++ error reporting function. */ +void +yy::Parser::error_ () +{ + std::cerr << message << std::endl; +} + +int +yyparse (void) +{ + yy::Parser parser (!!YYDEBUG); + return parser.parse (); +} +], +[static void +yyerror (const char *s) +{ + fprintf (stderr, "%s\n", s); +}]) + +static int +yylex (AT_LALR1_CC_IF([int *lval], [void])) +[{ + static int toknum = 0; + int tokens[] = + { + ':', -1 + }; + ]AT_LALR1_CC_IF([*lval = 0; /* Pacify GCC. */])[ + return tokens[toknum++]; +}] + +int +main (void) +{ + return yyparse (); +} +]) +])# _AT_DATA_DANCER_Y + + +# AT_CHECK_DANCER(BISON-OPTIONS) +# ------------------------------ +# Generate the grammar, compile it, run it. +m4_define([AT_CHECK_DANCER], +[AT_SETUP([Dancer $1]) +AT_BISON_OPTION_PUSHDEFS([$1]) +_AT_DATA_DANCER_Y([$1]) +AT_CHECK([bison -o dancer.c dancer.y]) +AT_LALR1_CC_IF([AT_COMPILE_CXX([dancer])], + [AT_COMPILE([dancer])]) +AT_PARSER_CHECK([./dancer], 1, [], +[syntax error, unexpected ':' +]) +AT_BISON_OPTION_POPDEFS +AT_CLEANUP +]) + +AT_CHECK_DANCER() +AT_CHECK_DANCER([%glr-parser]) +AT_CHECK_DANCER([%skeleton "lalr1.cc"]) diff --git a/src/apps/bin/bison/tests/sets.at b/src/apps/bin/bison/tests/sets.at new file mode 100644 index 0000000000..373271dc1a --- /dev/null +++ b/src/apps/bin/bison/tests/sets.at @@ -0,0 +1,254 @@ +# Exercising Bison Grammar Sets. -*- Autotest -*- +# Copyright (C) 2001, 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + + +# AT_EXTRACT_SETS(INPUT, OUTPUT) +# ------------------------------ +# Extract the information about the grammar sets from a bison +# trace output (INPUT), and save it in OUTPUT. +# And remember, there is no alternation in portable sed. +m4_define([AT_EXTRACT_SETS], +[AT_DATA([extract.sed], +[[#n +/^NULLABLE$/ { + :null + p + n + /^[ ]*$/ !b null +} +/^FIRSTS$/ { + :firsts + p + n + /^[ ]*$/ !b firsts +} +/^FDERIVES$/ { + :fderiv + p + n + /^[ ]*$/ !b fderiv +} +/^DERIVES$/ { + :deriv + p + n + /^[ ]*$/ !b deriv +} +]]) +AT_CHECK([sed -f extract.sed $1], 0, [stdout]) +AT_CHECK([mv stdout $2]) +]) + + + +AT_BANNER([[Grammar Sets (Firsts etc.).]]) + + +## ---------- ## +## Nullable. ## +## ---------- ## + +AT_SETUP([Nullable]) + +# At some point, nullable had been smoking grass, and managed to say: +# +# Entering set_nullable +# NULLABLE +# 'e': yes +# (null): no +# ... + +AT_DATA([[input.y]], +[[%% +e: 'e' | /* Nothing */; +]]) + +AT_CHECK([[bison --trace=sets input.y]], [], [], [stderr]) +AT_EXTRACT_SETS([stderr], [sets]) +AT_CHECK([[cat sets]], [], +[[DERIVES + $accept derives + 0 e $end + e derives + 1 'e' + 2 /* empty */ +NULLABLE + $accept: no + e: yes +FIRSTS + $accept firsts + $accept + e + e firsts + e +FDERIVES + $accept derives + 0 e $end + 1 'e' + 2 /* empty */ + e derives + 1 'e' + 2 /* empty */ +]]) + +AT_CLEANUP + + +## ---------------- ## +## Broken Closure. ## +## ---------------- ## + +# TC was once broken during a massive `simplification' of the code. +# It resulted in bison dumping core on the following grammar (the +# computation of FIRSTS uses TC). It managed to produce a pretty +# exotic closure: +# +# TC: Input +# +# 01234567 +# +--------+ +# 0| 1 | +# 1| 1 | +# 2| 1 | +# 3| 1 | +# 4| 1 | +# 5| 1 | +# 6| 1| +# 7| | +# +--------+ +# +# TC: Output +# +# 01234567 +# +--------+ +# 0| 1 | +# 1| 111 | +# 2| 111 | +# 3| 1111 | +# 4| 111 1 | +# 5| 111 1 | +# 6| 111 1| +# 7| 111 | +# +--------+ +# +# instead of that below. + +AT_SETUP([Broken Closure]) + +AT_DATA([input.y], +[[%% +a: b; +b: c; +c: d; +d: e; +e: f; +f: g; +g: h; +h: 'h'; +]]) + +AT_CHECK([[bison --trace=sets input.y]], [], [], [stderr]) + +AT_CHECK([[sed -n 's/[ ]*$//;/^RTC: Firsts Output BEGIN/,/^RTC: Firsts Output END/p' stderr]], [], +[[RTC: Firsts Output BEGIN + + 012345678 + .---------. + 0|111111111| + 1| 11111111| + 2| 1111111| + 3| 111111| + 4| 11111| + 5| 1111| + 6| 111| + 7| 11| + 8| 1| + `---------' +RTC: Firsts Output END +]]) + +AT_CLEANUP + + + +## -------- ## +## Firsts. ## +## -------- ## + +AT_SETUP([Firsts]) + +AT_DATA([input.y], +[[%nonassoc '<' '>' +%left '+' '-' +%right '^' '=' +%% +exp: + exp '<' exp + | exp '>' exp + | exp '+' exp + | exp '-' exp + | exp '^' exp + | exp '=' exp + | "exp" + ; +]]) + +AT_CHECK([[bison --trace=sets input.y]], [], [], [stderr]) +AT_EXTRACT_SETS([stderr], [sets]) +AT_CHECK([[cat sets]], [], +[[DERIVES + $accept derives + 0 exp $end + exp derives + 1 exp '<' exp + 2 exp '>' exp + 3 exp '+' exp + 4 exp '-' exp + 5 exp '^' exp + 6 exp '=' exp + 7 "exp" +NULLABLE + $accept: no + exp: no +FIRSTS + $accept firsts + $accept + exp + exp firsts + exp +FDERIVES + $accept derives + 0 exp $end + 1 exp '<' exp + 2 exp '>' exp + 3 exp '+' exp + 4 exp '-' exp + 5 exp '^' exp + 6 exp '=' exp + 7 "exp" + exp derives + 1 exp '<' exp + 2 exp '>' exp + 3 exp '+' exp + 4 exp '-' exp + 5 exp '^' exp + 6 exp '=' exp + 7 "exp" +]]) + +AT_CLEANUP diff --git a/src/apps/bin/bison/tests/synclines.at b/src/apps/bin/bison/tests/synclines.at new file mode 100644 index 0000000000..e10f3c6364 --- /dev/null +++ b/src/apps/bin/bison/tests/synclines.at @@ -0,0 +1,173 @@ +# Executing Actions. -*- Autotest -*- +# Copyright (C) 2002, 2004 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AT_BANNER([[User Actions.]]) + + +# AT_SYNCLINES_COMPILE(FILE) +# -------------------------- +# Compile FILE expecting an error, and save in the file stdout the +# normalized output. Ignore the exit status, since some compilers +# (e.g. c89 on IRIX 6.5) triger warnings on `#error', instead of +# errors. +m4_define([AT_SYNCLINES_COMPILE], +[AT_CHECK([$CC $CFLAGS $CPPFLAGS -c $1], [ignore], [], [stderr]) +# In case GCC displays column information, strip it down. +# +# input.y:4:2: #error "4" or input.y:4.2: #error "4" +# => +# input.y:4: #error "4" +# +AT_CHECK([[sed 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' stderr]], 0, [stdout]) +]) + +# AT_TEST_SYNCLINE(TITLE, INPUT, ERROR-MSG) +# ----------------------------------------- +# Check that compiling the parser produced from INPUT cause GCC +# to issue ERROR-MSG. +m4_define([AT_TEST_SYNCLINE], +[AT_SETUP([$1]) + +# It seems impossible to find a generic scheme to check the location +# of an error. Even requiring GCC is not sufficient, since for instance +# the version modified by Apple: +# +# | Reading specs from /usr/libexec/gcc/darwin/ppc/2.95.2/specs +# | Apple Computer, Inc. version gcc-934.3, based on gcc version 2.95.2 +# | 19991024 (release) configure:2124: $? = 0 +# +# instead of: +# +# | input.y:2: #error "2" +# +# it reports: +# +# | input.y:2: "2" +# | cpp-precomp: warning: errors during smart preprocessing, retrying in basic mode + +AT_DATA([syncline.c], +[[#error "1" +]]) + +AT_SYNCLINES_COMPILE([syncline.c]) +AT_CHECK([[test "`cat stdout`" = 'syncline.c:1: @%:@error "1"' || exit 77]]) + +AT_DATA([[input.y]], [$2]) +AT_CHECK([bison -o input.c input.y]) +AT_SYNCLINES_COMPILE([input.c]) +AT_CHECK([cat stdout], 0, [$3]) +AT_CLEANUP +]) + + +## --------------------- ## +## Prologue synch line. ## +## --------------------- ## + + +AT_TEST_SYNCLINE([Prologue synch line], +[[%{ +#error "2" +void yyerror (const char *s); +int yylex (void); +%} +%% +exp: '0'; +]], +[input.y:2: #error "2" +]) + + +## ------------------- ## +## %union synch line. ## +## ------------------- ## + +AT_TEST_SYNCLINE([%union synch line], +[[%union { +#error "2" + char dummy; +} +%{ +void yyerror (const char *s); +int yylex (void); +%} +%% +exp: '0'; +]], +[input.y:2: #error "2" +]) + + +## ------------------------- ## +## Postprologue synch line. ## +## ------------------------- ## + +AT_TEST_SYNCLINE([Postprologue synch line], +[[%{ +void yyerror (const char *s); +int yylex (void); +%} +%union +{ + int ival; +} +%{ +#error "10" +%} +%% +exp: '0'; +]], +[input.y:10: #error "10" +]) + + +## ------------------- ## +## Action synch line. ## +## ------------------- ## + +AT_TEST_SYNCLINE([Action synch line], +[[%{ +void yyerror (const char *s); +int yylex (void); +%} +%% +exp: +{ +#error "8" +}; +]], +[input.y:8: #error "8" +]) + + +## --------------------- ## +## Epilogue synch line. ## +## --------------------- ## + +AT_TEST_SYNCLINE([Epilogue synch line], +[[%{ +void yyerror (const char *s); +int yylex (void); +%} +%% +exp: '0'; +%% +#error "8" +]], +[input.y:8: #error "8" +]) diff --git a/src/apps/bin/bison/tests/testsuite b/src/apps/bin/bison/tests/testsuite new file mode 100644 index 0000000000..e5ecb224ca --- /dev/null +++ b/src/apps/bin/bison/tests/testsuite @@ -0,0 +1,60357 @@ +#! /bin/sh +## --------------------- ## +## M4sh Initialization. ## +## --------------------- ## + +# Be Bourne compatible +if test -n "${ZSH_VERSION+set}" && (emulate sh) >/dev/null 2>&1; then + emulate sh + NULLCMD=: + # Zsh 3.x and 4.x performs word splitting on ${1+"$@"}, which + # is contrary to our usage. Disable this feature. + alias -g '${1+"$@"}'='"$@"' +elif test -n "${BASH_VERSION+set}" && (set -o posix) >/dev/null 2>&1; then + set -o posix +fi +DUALCASE=1; export DUALCASE # for MKS sh + +# Support unset when possible. +if ( (MAIL=60; unset MAIL) || exit) >/dev/null 2>&1; then + as_unset=unset +else + as_unset=false +fi + + +# Work around bugs in pre-3.0 UWIN ksh. +$as_unset ENV MAIL MAILPATH +PS1='$ ' +PS2='> ' +PS4='+ ' + +# NLS nuisances. +for as_var in \ + LANG LANGUAGE LC_ADDRESS LC_ALL LC_COLLATE LC_CTYPE LC_IDENTIFICATION \ + LC_MEASUREMENT LC_MESSAGES LC_MONETARY LC_NAME LC_NUMERIC LC_PAPER \ + LC_TELEPHONE LC_TIME +do + if (set +x; test -z "`(eval $as_var=C; export $as_var) 2>&1`"); then + eval $as_var=C; export $as_var + else + $as_unset $as_var + fi +done + +# Required to use basename. +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +if (basename /) >/dev/null 2>&1 && test "X`basename / 2>&1`" = "X/"; then + as_basename=basename +else + as_basename=false +fi + + +# Name of the executable. +as_me=`$as_basename "$0" || +$as_expr X/"$0" : '.*/\([^/][^/]*\)/*$' \| \ + X"$0" : 'X\(//\)$' \| \ + X"$0" : 'X\(/\)$' \| \ + . : '\(.\)' 2>/dev/null || +echo X/"$0" | + sed '/^.*\/\([^/][^/]*\)\/*$/{ s//\1/; q; } + /^X\/\(\/\/\)$/{ s//\1/; q; } + /^X\/\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + + +# PATH needs CR, and LINENO needs CR and PATH. +# Avoid depending upon Character Ranges. +as_cr_letters='abcdefghijklmnopqrstuvwxyz' +as_cr_LETTERS='ABCDEFGHIJKLMNOPQRSTUVWXYZ' +as_cr_Letters=$as_cr_letters$as_cr_LETTERS +as_cr_digits='0123456789' +as_cr_alnum=$as_cr_Letters$as_cr_digits + +# The user is always right. +if test "${PATH_SEPARATOR+set}" != set; then + echo "#! /bin/sh" >conf$$.sh + echo "exit 0" >>conf$$.sh + chmod +x conf$$.sh + if (PATH="/nonexistent;."; conf$$.sh) >/dev/null 2>&1; then + PATH_SEPARATOR=';' + else + PATH_SEPARATOR=: + fi + rm -f conf$$.sh +fi + + + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" || { + # Find who we are. Look in the path if we contain no path at all + # relative or not. + case $0 in + *[\\/]* ) as_myself=$0 ;; + *) as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -r "$as_dir/$0" && as_myself=$as_dir/$0 && break +done + + ;; + esac + # We did not find ourselves, most probably we were run as `sh COMMAND' + # in which case we are not to be found in the path. + if test "x$as_myself" = x; then + as_myself=$0 + fi + if test ! -f "$as_myself"; then + { echo "$as_me: error: cannot find myself; rerun with an absolute path" >&2 + { (exit 1); exit 1; }; } + fi + case $CONFIG_SHELL in + '') + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in /bin$PATH_SEPARATOR/usr/bin$PATH_SEPARATOR$PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + for as_base in sh bash ksh sh5; do + case $as_dir in + /*) + if ("$as_dir/$as_base" -c ' + as_lineno_1=$LINENO + as_lineno_2=$LINENO + as_lineno_3=`(expr $as_lineno_1 + 1) 2>/dev/null` + test "x$as_lineno_1" != "x$as_lineno_2" && + test "x$as_lineno_3" = "x$as_lineno_2" ') 2>/dev/null; then + $as_unset BASH_ENV || test "${BASH_ENV+set}" != set || { BASH_ENV=; export BASH_ENV; } + $as_unset ENV || test "${ENV+set}" != set || { ENV=; export ENV; } + CONFIG_SHELL=$as_dir/$as_base + export CONFIG_SHELL + exec "$CONFIG_SHELL" "$0" ${1+"$@"} + fi;; + esac + done +done +;; + esac + + # Create $as_me.lineno as a copy of $as_myself, but with $LINENO + # uniformly replaced by the line number. The first 'sed' inserts a + # line-number line before each line; the second 'sed' does the real + # work. The second script uses 'N' to pair each line-number line + # with the numbered line, and appends trailing '-' during + # substitution so that $LINENO is not a special case at line end. + # (Raja R Harinath suggested sed '=', and Paul Eggert wrote the + # second 'sed' script. Blame Lee E. McMahon for sed's syntax. :-) + sed '=' <$as_myself | + sed ' + N + s,$,-, + : loop + s,^\(['$as_cr_digits']*\)\(.*\)[$]LINENO\([^'$as_cr_alnum'_]\),\1\2\1\3, + t loop + s,-$,, + s,^['$as_cr_digits']*\n,, + ' >$as_me.lineno && + chmod +x $as_me.lineno || + { echo "$as_me: error: cannot create $as_me.lineno; rerun with a POSIX shell" >&2 + { (exit 1); exit 1; }; } + + # Don't try to exec as it changes $[0], causing all sort of problems + # (the dirname of $[0] is not the place where we might find the + # original and so on. Autoconf is especially sensible to this). + . ./$as_me.lineno + # Exit status is that of the last command. + exit +} + + +case `echo "testing\c"; echo 1,2,3`,`echo -n testing; echo 1,2,3` in + *c*,-n*) ECHO_N= ECHO_C=' +' ECHO_T=' ' ;; + *c*,* ) ECHO_N=-n ECHO_C= ECHO_T= ;; + *) ECHO_N= ECHO_C='\c' ECHO_T= ;; +esac + +if expr a : '\(a\)' >/dev/null 2>&1; then + as_expr=expr +else + as_expr=false +fi + +rm -f conf$$ conf$$.exe conf$$.file +echo >conf$$.file +if ln -s conf$$.file conf$$ 2>/dev/null; then + # We could just check for DJGPP; but this test a) works b) is more generic + # and c) will remain valid once DJGPP supports symlinks (DJGPP 2.04). + if test -f conf$$.exe; then + # Don't use ln at all; we don't have any links + as_ln_s='cp -p' + else + as_ln_s='ln -s' + fi +elif ln conf$$.file conf$$ 2>/dev/null; then + as_ln_s=ln +else + as_ln_s='cp -p' +fi +rm -f conf$$ conf$$.exe conf$$.file + +if mkdir -p . 2>/dev/null; then + as_mkdir_p=: +else + test -d ./-p && rmdir ./-p + as_mkdir_p=false +fi + +as_executable_p="test -f" + +# Sed expression to map a string onto a valid CPP name. +as_tr_cpp="eval sed 'y%*$as_cr_letters%P$as_cr_LETTERS%;s%[^_$as_cr_alnum]%_%g'" + +# Sed expression to map a string onto a valid variable name. +as_tr_sh="eval sed 'y%*+%pp%;s%[^_$as_cr_alnum]%_%g'" + + +# IFS +# We need space, tab and new line, in precisely that order. +as_nl=' +' +IFS=" $as_nl" + +# CDPATH. +$as_unset CDPATH + + +SHELL=${CONFIG_SHELL-/bin/sh} + +# How were we run? +at_cli_args="$@" + +# Load the config file. +for at_file in atconfig atlocal +do + test -r $at_file || continue + . ./$at_file || { echo "$as_me: error: invalid content: $at_file" >&2 + { (exit 1); exit 1; }; } +done + +# atconfig delivers paths relative to the directory the test suite is +# in, but the groups themselves are run in testsuite-dir/group-dir. +if test -n "$at_top_srcdir"; then + builddir=../.. + for at_dir in srcdir top_srcdir top_builddir + do + at_val=`eval echo '${'at_$at_dir'}'` + eval "$at_dir=\$at_val/../.." + done +fi + +# Not all shells have the 'times' builtin; the subshell is needed to make +# sure we discard the 'times: not found' message from the shell. +at_times_p=false +(times) >/dev/null 2>&1 && at_times_p=: + +# CLI Arguments to pass to the debugging scripts. +at_debug_args= +# -e sets to true +at_errexit_p=false +# Shall we be verbose? +at_verbose=: +at_quiet=echo + +# Shall we keep the debug scripts? Must be `:' when the suite is +# run by a debug script, so that the script doesn't remove itself. +at_debug_p=false +# Display help message? +at_help_p=false +# List test groups? +at_list_p=false +# Test groups to run +at_groups= + +# The directory we are in. +at_dir=`pwd` +# The directory the whole suite works in. +# Should be absolutely to let the user `cd' at will. +at_suite_dir=$at_dir/$as_me.dir +# The file containing the suite. +at_suite_log=$at_dir/$as_me.log +# The file containing the location of the last AT_CHECK. +at_check_line_file=$at_suite_dir/at-check-line +# The file containing the exit status of the last command. +at_status_file=$at_suite_dir/at-status +# The files containing the output of the tested commands. +at_stdout=$at_suite_dir/at-stdout +at_stder1=$at_suite_dir/at-stder1 +at_stderr=$at_suite_dir/at-stderr +# The file containing dates. +at_times_file=$at_suite_dir/at-times + +# List of the tested programs. +at_tested='bison' +# List of the all the test groups. +at_groups_all=' banner-1 1 2 3 4 banner-2 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 banner-3 21 22 23 banner-4 24 25 26 27 28 29 banner-5 30 31 32 33 34 banner-6 35 36 37 38 banner-7 39 40 41 42 43 banner-8 44 45 46 47 48 49 50 51 52 53 54 55 banner-9 56 57 58 59 60 61 62 63 64 65 66 67 68 69 banner-10 70 71 72 73 74 75 76 77 78 79 80 81 82 83 banner-11 84 85 86 87 88 89 banner-12 90 91 92 93 94 banner-13 95 96 97 banner-14 98 99 100 101 102 103 104 105 106 107 108 109 110 banner-15 111 112 113 114 115 116 117 118 119 banner-16 120 121' +# As many dots as there are digits in the last test group number. +# Used to normalize the test group numbers so that `ls' lists them in +# numerical order. +at_format='...' +# Description of all the test groups. +at_help_all='1;input.at:28;Invalid $n;; +2;input.at:46;Invalid @n;; +3;input.at:64;Type Clashes;; +4;input.at:93;Torturing the Scanner;; +5;output.at:38;Output files: & -dv.;; +6;output.at:40;Output files: & -dv -o foo.c.;; +7;output.at:42;Output files: & -dv -o foo.tab.c.;; +8;output.at:44;Output files: & -dv -y.;; +9;output.at:46;Output files: & -dv -b bar.;; +10;output.at:48;Output files: & -dv -g -o foo.c.;; +11;output.at:52;Output files: %defines %verbose & .;; +12;output.at:54;Output files: %defines %verbose %yacc & .;; +13;output.at:57;Output files: %defines %verbose %yacc & .;; +14;output.at:61;Output files: %file-prefix="bar" %defines %verbose & .;; +15;output.at:63;Output files: %output="bar.c" %defines %verbose %yacc & .;; +16;output.at:67;Output files: %file-prefix="baz" %output="bar.c" %defines %verbose %yacc & .;; +17;output.at:72;Output files: %defines %verbose & .;; +18;output.at:75;Output files: %defines %verbose & -o foo.c.;; +19;output.at:79;Output files: & --defines=foo.hpp -o foo.c++.;; +20;output.at:83;Output files: & -o foo.c++ --graph=foo.gph.;; +21;sets.at:66;Nullable;; +22;sets.at:151;Broken Closure;; +23;sets.at:193;Firsts;; +24;reduce.at:26;Useless Terminals;; +25;reduce.at:70;Useless Nonterminals;; +26;reduce.at:125;Useless Rules;report; +27;reduce.at:212;Reduced Automaton;report; +28;reduce.at:301;Underivable Rules;report; +29;reduce.at:342;Empty Language;; +30;synclines.at:93;Prologue synch line;; +31;synclines.at:113;%union synch line;; +32;synclines.at:136;Postprologue synch line;; +33;synclines.at:155;Action synch line;; +34;synclines.at:173;Epilogue synch line;; +35;headers.at:27;%union and --defines;; +36;headers.at:76;Invalid CPP guards: input/input;; +37;headers.at:77;Invalid CPP guards: 9foo;; +38;headers.at:86;export YYLTYPE;; +39;actions.at:25;Mid-rule actions;; +40;actions.at:89;Actions after errors;; +41;actions.at:236;Exotic Dollars;; +42;actions.at:556;Printers and Destructors: ;; +43;actions.at:557;Printers and Destructors: %locations %defines %skeleton "lalr1.cc";c++; +44;conflicts.at:32;S/R in initial;; +45;conflicts.at:52;%nonassoc and eof;; +46;conflicts.at:129;Unresolved SR Conflicts;report; +47;conflicts.at:236;Resolved SR Conflicts;report; +48;conflicts.at:358;Defaulted Conflicted Reduction;report; +49;conflicts.at:477;%expect not enough;; +50;conflicts.at:497;%expect right;; +51;conflicts.at:514;%expect too much;; +52;conflicts.at:534;%expect with reduce conflicts;; +53;conflicts.at:554;%no-default-prec without %prec;; +54;conflicts.at:580;%no-default-prec with %prec;; +55;conflicts.at:604;%default-prec;; +56;calc.at:541;Calculator ;; +57;calc.at:543;Calculator %defines;; +58;calc.at:544;Calculator %locations;; +59;calc.at:545;Calculator %name-prefix="calc";; +60;calc.at:546;Calculator %verbose;; +61;calc.at:547;Calculator %yacc;; +62;calc.at:548;Calculator %error-verbose;; +63;calc.at:550;Calculator %pure-parser %locations;; +64;calc.at:551;Calculator %error-verbose %locations;; +65;calc.at:553;Calculator %error-verbose %locations %defines %name-prefix="calc" %verbose %yacc;; +66;calc.at:555;Calculator %debug;; +67;calc.at:556;Calculator %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc;; +68;calc.at:558;Calculator %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc;; +69;calc.at:560;Calculator %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count};; +70;calc.at:577;Calculator %glr-parser ;; +71;calc.at:579;Calculator %glr-parser %defines;; +72;calc.at:580;Calculator %glr-parser %locations;; +73;calc.at:581;Calculator %glr-parser %name-prefix="calc";; +74;calc.at:582;Calculator %glr-parser %verbose;; +75;calc.at:583;Calculator %glr-parser %yacc;; +76;calc.at:584;Calculator %glr-parser %error-verbose;; +77;calc.at:586;Calculator %glr-parser %pure-parser %locations;; +78;calc.at:587;Calculator %glr-parser %error-verbose %locations;; +79;calc.at:589;Calculator %glr-parser %error-verbose %locations %defines %name-prefix="calc" %verbose %yacc;; +80;calc.at:591;Calculator %glr-parser %debug;; +81;calc.at:592;Calculator %glr-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc;; +82;calc.at:594;Calculator %glr-parser %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc;; +83;calc.at:596;Calculator %glr-parser %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count};; +84;calc.at:614;Calculator %skeleton "lalr1.cc" %defines %locations;c++; +85;calc.at:616;Calculator %skeleton "lalr1.cc" %defines;c++; +86;calc.at:626;Calculator %skeleton "lalr1.cc" %error-verbose %locations %defines %name-prefix="calc" %verbose %yacc;c++; +87;calc.at:629;Calculator %skeleton "lalr1.cc" %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc;c++; +88;calc.at:631;Calculator %skeleton "lalr1.cc" %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc;c++; +89;calc.at:633;Calculator %skeleton "lalr1.cc" %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count};c++; +90;torture.at:140;Big triangle;; +91;torture.at:231;Big horizontal;; +92;torture.at:366;Many lookaheads;; +93;torture.at:440;Exploding the Stack Size with Alloca;; +94;torture.at:461;Exploding the Stack Size with Malloc;; +95;existing.at:26;GNU AWK Grammar;; +96;existing.at:366;GNU Cim Grammar;; +97;existing.at:1218;GNU pic Grammar;; +98;regression.at:27;Early token definitions;; +99;regression.at:65;Braces parsing;; +100;regression.at:87;Duplicate string;; +101;regression.at:113;Rule Line Numbers;report; +102;regression.at:257;Mixing %token styles;; +103;regression.at:280;Invalid inputs;; +104;regression.at:312;Token definitions;; +105;regression.at:340;Characters Escapes;; +106;regression.at:371;Web2c Report;report; +107;regression.at:548;Web2c Actions;report; +108;regression.at:792;Dancer ;; +109;regression.at:793;Dancer %glr-parser;; +110;regression.at:794;Dancer %skeleton "lalr1.cc";c++; +111;cxx-type.at:317;GLR: Resolve ambiguity, impure, no locations;; +112;cxx-type.at:324;GLR: Resolve ambiguity, impure, locations;; +113;cxx-type.at:330;GLR: Resolve ambiguity, pure, no locations;; +114;cxx-type.at:337;GLR: Resolve ambiguity, pure, locations;; +115;cxx-type.at:344;GLR: Merge conflicting parses, impure, no locations;; +116;cxx-type.at:351;GLR: Merge conflicting parses, impure, locations;; +117;cxx-type.at:358;GLR: Merge conflicting parses, pure, no locations;; +118;cxx-type.at:364;GLR: Merge conflicting parses, pure, locations;; +119;cxx-type.at:371;GLR: Verbose messages, resolve ambiguity, impure, no locations;; +120;glr-regression.at:25;Badly Collapsed GLR States;; +121;glr-regression.at:117;Improper handling of embedded actions and $-N in GLR parsers;; +' + +at_keywords= +at_prev= +for at_option +do + # If the previous option needs an argument, assign it. + if test -n "$at_prev"; then + at_option=$at_prev=$at_option + at_prev= + fi + + at_optarg=`expr "x$at_option" : 'x[^=]*=\(.*\)'` + + # Accept the important Cygnus configure options, so we can diagnose typos. + + case $at_option in + --help | -h ) + at_help_p=: + ;; + + --list | -l ) + at_list_p=: + ;; + + --version | -V ) + echo "$as_me (GNU Bison 1.875d)" + exit 0 + ;; + + --clean | -c ) + rm -rf $at_suite_dir $at_suite_log + exit 0 + ;; + + --debug | -d ) + at_debug_p=: + ;; + + --errexit | -e ) + at_debug_p=: + at_errexit_p=: + ;; + + --verbose | -v ) + at_verbose=echo; at_quiet=: + ;; + + --trace | -x ) + at_traceon='set -vx'; at_traceoff='set +vx' + ;; + + [0-9] | [0-9][0-9] | [0-9][0-9][0-9] | [0-9][0-9][0-9][0-9]) + at_groups="$at_groups$at_option " + ;; + + # Ranges + [0-9]- | [0-9][0-9]- | [0-9][0-9][0-9]- | [0-9][0-9][0-9][0-9]-) + at_range_start=`echo $at_option |tr -d '-'` + at_range=`echo " $at_groups_all " | \ + sed -e 's,^.* '$at_range_start' ,'$at_range_start' ,'` + at_groups="$at_groups$at_range " + ;; + + -[0-9] | -[0-9][0-9] | -[0-9][0-9][0-9] | -[0-9][0-9][0-9][0-9]) + at_range_end=`echo $at_option |tr -d '-'` + at_range=`echo " $at_groups_all " | \ + sed -e 's, '$at_range_end' .*$, '$at_range_end','` + at_groups="$at_groups$at_range " + ;; + + [0-9]-[0-9] | [0-9]-[0-9][0-9] | [0-9]-[0-9][0-9][0-9] | \ + [0-9]-[0-9][0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9] | \ + [0-9][0-9]-[0-9][0-9][0-9] | [0-9][0-9]-[0-9][0-9][0-9][0-9] | \ + [0-9][0-9][0-9]-[0-9][0-9][0-9] | \ + [0-9][0-9][0-9]-[0-9][0-9][0-9][0-9] | \ + [0-9][0-9][0-9][0-9]-[0-9][0-9][0-9][0-9] ) + at_range_start=`echo $at_option |sed 's,-.*,,'` + at_range_end=`echo $at_option |sed 's,.*-,,'` + # FIXME: Maybe test to make sure start <= end? + at_range=`echo " $at_groups_all " | \ + sed -e 's,^.* '$at_range_start' ,'$at_range_start' ,' \ + -e 's, '$at_range_end' .*$, '$at_range_end','` + at_groups="$at_groups$at_range " + ;; + + # Keywords. + --keywords | -k ) + at_prev=--keywords + ;; + --keywords=* ) + at_keywords="$at_keywords,$at_optarg" + ;; + + *=*) + at_envvar=`expr "x$at_option" : 'x\([^=]*\)='` + # Reject names that are not valid shell variable names. + expr "x$at_envvar" : ".*[^_$as_cr_alnum]" >/dev/null && + { echo "$as_me: error: invalid variable name: $at_envvar" >&2 + { (exit 1); exit 1; }; } + at_value=`echo "$at_optarg" | sed "s/'/'\\\\\\\\''/g"` + eval "$at_envvar='$at_value'" + export $at_envvar + # Propagate to debug scripts. + at_debug_args="$at_debug_args $at_option" + ;; + + *) echo "$as_me: invalid option: $at_option" >&2 + echo "Try \`$0 --help' for more information." >&2 + exit 1 + ;; + esac +done + +# Process the --keywords +if test -n "$at_keywords"; then + at_groups_selected=$at_help_all + for at_keyword in `IFS=,; set X $at_keywords; shift; echo ${1+$@}` + do + # It is on purpose that we match the test group titles too. + at_groups_selected=`echo "$at_groups_selected" | + grep -i "^[^;]*;[^;]*.*[; ]$at_keyword[ ;]"` + done + at_groups_selected=`echo "$at_groups_selected" | sed 's/;.*//'` + # Smash the end of lines. + at_groups_selected=`echo $at_groups_selected` + at_groups="$at_groups$at_groups_selected " +fi + +# Selected test groups. +test -z "$at_groups" && at_groups=$at_groups_all + +# Help message. +if $at_help_p; then + cat <<_ATEOF +Usage: $0 [OPTION]... [VARIABLE=VALUE]... [TESTS] + +Run all the tests, or the selected TESTS, and save a detailed log file. +Upon failure, create debugging scripts. + +You should not change environment variables unless explicitly passed +as command line arguments. Set \`AUTOTEST_PATH' to select the executables +to exercise. Each relative directory is expanded as build and source +directories relatively to the top level of this distribution. E.g., + + $ $0 AUTOTEST_PATH=bin + +possibly amounts into + + PATH=/tmp/foo-1.0/bin:/src/foo-1.0/bin:\$PATH +_ATEOF +cat <<_ATEOF + +Operation modes: + -h, --help print the help message, then exit + -V, --version print version number, then exit + -c, --clean remove all the files this test suite might create and exit + -l, --list describes all the tests, or the selected TESTS +_ATEOF +cat <<_ATEOF + +Execution tuning: + -k, --keywords=KEYWORDS + select the tests matching all the comma separated KEYWORDS + accumulates + -e, --errexit abort as soon as a test fails; implies --debug + -v, --verbose force more detailed output + default for debugging scripts + -d, --debug inhibit clean up and debug script creation + default for debugging scripts + -x, --trace enable tests shell tracing +_ATEOF +cat <<_ATEOF + +Report bugs to . +_ATEOF + exit 0 +fi + +# List of tests. +if $at_list_p; then + cat <<_ATEOF +GNU Bison 1.875d test suite test groups: + + NUM: FILENAME:LINE TEST-GROUP-NAME + KEYWORDS + +_ATEOF + # " 1 42 45 " => "^(1|42|45);". + at_groups_pattern=`echo "$at_groups" | sed 's/^ *//;s/ *$//;s/ */|/g'` + echo "$at_help_all" | + awk 'BEGIN { FS = ";" } + { if ($1 !~ /^('"$at_groups_pattern"')$/) next } + { if ($1) printf " %3d: %-18s %s\n", $1, $2, $3 + if ($4) printf " %s\n", $4 } ' + exit 0 +fi + +# Don't take risks: use only absolute directories in PATH. +# +# For stand-alone test suites, AUTOTEST_PATH is relative to `.'. +# +# For embedded test suites, AUTOTEST_PATH is relative to the top level +# of the package. Then expand it into build/src parts, since users +# may create executables in both places. +# +# There might be directories that don't exist, but don't redirect +# builtins' (eg., cd) stderr directly: Ultrix's sh hates that. +AUTOTEST_PATH=`echo $AUTOTEST_PATH | tr ':' $PATH_SEPARATOR` +at_path= +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $AUTOTEST_PATH $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + case $as_dir in + [\\/]* | ?:[\\/]* ) + at_path=$at_path$PATH_SEPARATOR$as_dir + ;; + * ) + if test -z "$at_top_builddir"; then + # Stand-alone test suite. + at_path=$at_path$PATH_SEPARATOR$as_dir + else + # Embedded test suite. + at_path=$at_path$PATH_SEPARATOR$at_top_builddir/$as_dir + at_path=$at_path$PATH_SEPARATOR$at_top_srcdir/$as_dir + fi + ;; +esac +done + + +# Now build and simplify PATH. +PATH= +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $at_path +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + as_dir=`(cd "$as_dir" && pwd) 2>/dev/null` +test -d "$as_dir" || continue +case $PATH in + $as_dir | \ + $as_dir$PATH_SEPARATOR* | \ + *$PATH_SEPARATOR$as_dir | \ + *$PATH_SEPARATOR$as_dir$PATH_SEPARATOR* ) ;; + + '') PATH=$as_dir ;; + *) PATH=$PATH$PATH_SEPARATOR$as_dir ;; +esac +done + +export PATH + +# Setting up the FDs. +# 5 is the log file. Not to be overwritten if `-d'. + +$at_debug_p && at_suite_log=/dev/null +exec 5>$at_suite_log + +# Banners and logs. +cat <<\_ASBOX +## ---------------------------- ## +## GNU Bison 1.875d test suite. ## +## ---------------------------- ## +_ASBOX +{ + cat <<\_ASBOX +## ---------------------------- ## +## GNU Bison 1.875d test suite. ## +## ---------------------------- ## +_ASBOX + echo + + echo "$as_me: command line was:" + echo " $ $0 $at_cli_args" + echo + + # Try to find a few ChangeLogs in case it might help determining the + # exact version. Use the relative dir: if the top dir is a symlink, + # find will not follow it (and options to follow the links are not + # portable), which would result in no output here. + if test -n "$at_top_srcdir"; then + cat <<\_ASBOX +## ----------- ## +## ChangeLogs. ## +## ----------- ## +_ASBOX + echo + for at_file in `find "$at_top_srcdir" -name ChangeLog -print` + do + echo "$as_me: $at_file:" + sed 's/^/| /;10q' $at_file + echo + done + + { +cat <<_ASUNAME +## --------- ## +## Platform. ## +## --------- ## + +hostname = `(hostname || uname -n) 2>/dev/null | sed 1q` +uname -m = `(uname -m) 2>/dev/null || echo unknown` +uname -r = `(uname -r) 2>/dev/null || echo unknown` +uname -s = `(uname -s) 2>/dev/null || echo unknown` +uname -v = `(uname -v) 2>/dev/null || echo unknown` + +/usr/bin/uname -p = `(/usr/bin/uname -p) 2>/dev/null || echo unknown` +/bin/uname -X = `(/bin/uname -X) 2>/dev/null || echo unknown` + +/bin/arch = `(/bin/arch) 2>/dev/null || echo unknown` +/usr/bin/arch -k = `(/usr/bin/arch -k) 2>/dev/null || echo unknown` +/usr/convex/getsysinfo = `(/usr/convex/getsysinfo) 2>/dev/null || echo unknown` +hostinfo = `(hostinfo) 2>/dev/null || echo unknown` +/bin/machine = `(/bin/machine) 2>/dev/null || echo unknown` +/usr/bin/oslevel = `(/usr/bin/oslevel) 2>/dev/null || echo unknown` +/bin/universe = `(/bin/universe) 2>/dev/null || echo unknown` + +_ASUNAME + +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + echo "PATH: $as_dir" +done + +} + echo + fi + + # Contents of the config files. + for at_file in atconfig atlocal + do + test -r $at_file || continue + echo "$as_me: $at_file:" + sed 's/^/| /' $at_file + echo + done + + cat <<\_ASBOX +## ---------------- ## +## Tested programs. ## +## ---------------- ## +_ASBOX + echo +} >&5 + +# Report what programs are being tested. +for at_program in : $at_tested +do + test "$at_program" = : && continue + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + test -f $as_dir/$at_program && break +done + + if test -f $as_dir/$at_program; then + { + echo "local.at:204: $as_dir/$at_program --version" + $as_dir/$at_program --version + echo + } >&5 2>&1 + else + { { echo "$as_me:$LINENO: error: cannot find $at_program" >&5 +echo "$as_me: error: cannot find $at_program" >&2;} + { (exit 1); exit 1; }; } + fi +done + +{ + cat <<\_ASBOX +## ------------------ ## +## Running the tests. ## +## ------------------ ## +_ASBOX +} >&5 + +at_start_date=`date` +at_start_time=`(date +%s) 2>/dev/null` +echo "$as_me: starting at: $at_start_date" >&5 +at_xpass_list= +at_xfail_list= +at_pass_list= +at_fail_list= +at_skip_list= +at_group_count=0 + +# Create the master directory if it doesn't already exist. +test -d $at_suite_dir || + mkdir $at_suite_dir || + { { echo "$as_me:$LINENO: error: cannot create $at_suite_dir" >&5 +echo "$as_me: error: cannot create $at_suite_dir" >&2;} + { (exit 1); exit 1; }; } + +# Can we diff with `/dev/null'? DU 5.0 refuses. +if diff /dev/null /dev/null >/dev/null 2>&1; then + at_devnull=/dev/null +else + at_devnull=$at_suite_dir/devnull + cp /dev/null $at_devnull +fi + +# Use `diff -u' when possible. +if diff -u $at_devnull $at_devnull >/dev/null 2>&1; then + at_diff='diff -u' +else + at_diff=diff +fi + + +for at_group in $at_groups +do + # Be sure to come back to the top test directory. + cd $at_suite_dir + + case $at_group in + banner-*) + at_group_log=$at_suite_log + ;; + + *) + # Skip tests we already run (using --keywords makes it easy to get + # duplication). + case " $at_pass_test $at_skip_test $at_fail_test " in + *" $at_group "* ) continue;; + esac + + # Normalize the test group number. + at_group_normalized=`expr "00000$at_group" : ".*\($at_format\)"` + + # Create a fresh directory for the next test group, and enter. + at_group_dir=$at_suite_dir/$at_group_normalized + at_group_log=$at_group_dir/$as_me.log + rm -rf $at_group_dir + mkdir $at_group_dir || + { { echo "$as_me:$LINENO: error: cannot create $at_group_dir" >&5 +echo "$as_me: error: cannot create $at_group_dir" >&2;} + { (exit 1); exit 1; }; } + cd $at_group_dir + ;; + esac + + echo 0 > $at_status_file + + # Clearly separate the test groups when verbose. + test $at_group_count != 0 && $at_verbose + + # In verbose mode, append to the log file *and* show on + # the standard output; in quiet mode only write to the log + if test $at_verbose = echo; then + at_tee_pipe="tee -a $at_group_log" + else + at_tee_pipe="cat >> $at_group_log" + fi + + case $at_group in + + banner-1 ) # Banner 1. input.at:19 + cat <<\_ATEOF + +Input Processing. + +_ATEOF + ;; + + 1 ) # 1. input.at:28: Invalid $n + at_setup_line='input.at:28' + at_desc='Invalid $n' + $at_quiet $ECHO_N " 1: Invalid $n $ECHO_C" + at_xfail=no + ( + echo "1. input.at:28: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +%% +exp: { $$ = $1 ; }; +_ATEOF + + +$at_traceoff +echo "input.at:37: bison input.y" +echo input.at:37 >$at_check_line_file +( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "input.y:2.13-14: integer out of range: \`\$1' +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "input.at:37: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 2 ) # 2. input.at:46: Invalid @n + at_setup_line='input.at:46' + at_desc='Invalid @n' + $at_quiet $ECHO_N " 2: Invalid @n $ECHO_C" + at_xfail=no + ( + echo "2. input.at:46: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +%% +exp: { @$ = @1 ; }; +_ATEOF + + +$at_traceoff +echo "input.at:55: bison input.y" +echo input.at:55 >$at_check_line_file +( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "input.y:2.13-14: integer out of range: \`@1' +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "input.at:55: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 3 ) # 3. input.at:64: Type Clashes + at_setup_line='input.at:64' + at_desc='Type Clashes' + $at_quiet $ECHO_N " 3: Type Clashes $ECHO_C" + at_xfail=no + ( + echo "3. input.at:64: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +%token foo +%type exp +%% +exp: foo {} foo + | foo + | /* Empty. */ + ; +_ATEOF + + +$at_traceoff +echo "input.at:80: bison input.y" +echo input.at:80 >$at_check_line_file +( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "input.y:4.6-15: warning: type clash on default action: != <> +input.y:5.6-8: warning: type clash on default action: != <> +input.y:6.5: warning: empty rule for typed nonterminal, and no action +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "input.at:80: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 4 ) # 4. input.at:93: Torturing the Scanner + at_setup_line='input.at:93' + at_desc='Torturing the Scanner' + $at_quiet $ECHO_N " 4: Torturing the Scanner $ECHO_C" + at_xfail=no + ( + echo "4. input.at:93: testing ..." + $at_traceon + + + +cat >input.y <<'_ATEOF' +_ATEOF + +$at_traceoff +echo "input.at:99: bison input.y" +echo input.at:99 >$at_check_line_file +( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "input.y:1.1: syntax error, unexpected \"end of file\" +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "input.at:99: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +cat >input.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +%{ +/* This is seen in GCC: a %{ and %} in middle of a comment. */ +const char *foo = "So %{ and %} can be here too."; + +#if 0 +/* These examples test Bison while not stressing C compilers too much. + Many C compilers mishandle backslash-newlines, so this part of the + test is inside "#if 0". The comment and string are written so that + the "#endif" will be seen regardless of the C compiler bugs that we + know about, namely: + + HP C (as of late 2002) mishandles *\[newline]\[newline]/ within a + comment. + + The Apple Darwin compiler (as of late 2002) mishandles + \\[newline]' within a character constant. + + */ + +/\ +* A comment with backslash-newlines in it. %} *\ +\ +/ +/* { Close the above comment, if the C compiler mishandled it. */ + +char str[] = "\\ +" A string with backslash-newlines in it %{ %} \\ +\ +""; + +char apostrophe = '\''; +#endif + +#include +%} +/* %{ and %} can be here too. */ + +%{ +/* Exercise pre-prologue dependency to %union. */ +typedef int value; +%} + +/* Exercise M4 quoting: ']]', 0. */ + +/* Also exercise %union. */ +%union +{ + value ival; /* A comment to exercise an old bug. */ +}; + + +/* Exercise post-prologue dependency to %union. */ +%{ +static YYSTYPE value_as_yystype (value val); + +/* Exercise quotes in declarations. */ +char quote[] = "]],"; +%} + +%{ +static void yyerror (const char *s); +static int yylex (void); +%} + +%type '[' + +/* Exercise quotes in strings. */ +%token FAKE "fake [] \a\b\f\n\r\t\v\"\'\?\\\u005B\U0000005c ??!??'??(??)??-??/?? \x1\1" + +%% +/* Exercise M4 quoting: ']]', [, 1. */ +exp: '[' '\1' two '$' '@' '{' oline output.or.oline.opt + { + /* Exercise quotes in braces. */ + char tmp[] = "[%c],\n"; + printf (tmp, $1); + } +; + +two: '\x000000000000000000000000000000000000000000000000000000000000000000002'; +oline: '@' 'o' 'l' 'i' 'n' 'e' '@' '_' '_' 'o' 'l' 'i' 'n' 'e' '_' '_'; +output.or.oline.opt: ;|oline;;|output;;; +output: '#' 'o' 'u' 't' 'p' 'u' 't' ' '; +%% +/* Exercise M4 quoting: ']]', [, 2. */ + +static YYSTYPE +value_as_yystype (value val) +{ + YYSTYPE res; + res.ival = val; + return res; +} + +static int +yylex (void) +{ + static const char *input = "[\1\2$@{@oline@__oline__\ +#output "; /* " + */ + yylval = value_as_yystype (*input); + return *input++; +} + +static void +yyerror (const char *msg) +{ + fprintf (stderr, "%s\n", msg); +} +_ATEOF + + + +# Pacify Emacs'font-lock-mode: " + +cat >main.c <<'_ATEOF' +typedef int value; +#include "input.h" + +int yyparse (void); + +int +main (void) +{ + return yyparse (); +} +_ATEOF + + +$at_traceoff +echo "input.at:229: bison -d -v -o input.c input.y" +echo input.at:229 >$at_check_line_file +( $at_traceon; bison -d -v -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "input.at:229: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "input.at:230: \$CC \$CFLAGS \$CPPFLAGS -c input.c -o input.o" +echo input.at:230 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS -c input.c -o input.o ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "input.at:230: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "input.at:231: \$CC \$CFLAGS \$CPPFLAGS -c main.c -o main.o" +echo input.at:231 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS -c main.c -o main.o ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "input.at:231: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "input.at:232: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS input.o main.o \$LIBS -o input" +echo input.at:232 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS input.o main.o $LIBS -o input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "input.at:232: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "input.at:235: \$PREPARSER ./input" +echo input.at:235 >$at_check_line_file +( $at_traceon; $PREPARSER ./input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "[[], +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "input.at:235: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + + banner-2 ) # Banner 2. output.at:19 + cat <<\_ATEOF + +Output file names. + +_ATEOF + ;; + + 5 ) # 5. output.at:38: Output files: & -dv. + at_setup_line='output.at:38' + at_desc='Output files: & -dv.' + $at_quiet $ECHO_N " 5: Output files: & -dv. $ECHO_C" + at_xfail=no + ( + echo "5. output.at:38: testing ..." + $at_traceon + +cat >foo.y <<'_ATEOF' + +%% +foo: {}; +_ATEOF + + +$at_traceoff +echo "output.at:38: bison -dv foo.y" +echo output.at:38 >$at_check_line_file +( $at_traceon; bison -dv foo.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:38: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "output.at:38: ls foo.output foo.tab.c foo.tab.h" +echo output.at:38 >$at_check_line_file +( $at_traceon; ls foo.output foo.tab.c foo.tab.h ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:38: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 6 ) # 6. output.at:40: Output files: & -dv -o foo.c. + at_setup_line='output.at:40' + at_desc='Output files: & -dv -o foo.c.' + $at_quiet $ECHO_N " 6: Output files: & -dv -o foo.c. $ECHO_C" + at_xfail=no + ( + echo "6. output.at:40: testing ..." + $at_traceon + +cat >foo.y <<'_ATEOF' + +%% +foo: {}; +_ATEOF + + +$at_traceoff +echo "output.at:40: bison -dv -o foo.c foo.y" +echo output.at:40 >$at_check_line_file +( $at_traceon; bison -dv -o foo.c foo.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:40: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "output.at:40: ls foo.c foo.h foo.output" +echo output.at:40 >$at_check_line_file +( $at_traceon; ls foo.c foo.h foo.output ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:40: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 7 ) # 7. output.at:42: Output files: & -dv -o foo.tab.c. + at_setup_line='output.at:42' + at_desc='Output files: & -dv -o foo.tab.c.' + $at_quiet $ECHO_N " 7: Output files: & -dv -o foo.tab.c. $ECHO_C" + at_xfail=no + ( + echo "7. output.at:42: testing ..." + $at_traceon + +cat >foo.y <<'_ATEOF' + +%% +foo: {}; +_ATEOF + + +$at_traceoff +echo "output.at:42: bison -dv -o foo.tab.c foo.y" +echo output.at:42 >$at_check_line_file +( $at_traceon; bison -dv -o foo.tab.c foo.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:42: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "output.at:42: ls foo.output foo.tab.c foo.tab.h" +echo output.at:42 >$at_check_line_file +( $at_traceon; ls foo.output foo.tab.c foo.tab.h ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:42: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 8 ) # 8. output.at:44: Output files: & -dv -y. + at_setup_line='output.at:44' + at_desc='Output files: & -dv -y.' + $at_quiet $ECHO_N " 8: Output files: & -dv -y. $ECHO_C" + at_xfail=no + ( + echo "8. output.at:44: testing ..." + $at_traceon + +cat >foo.y <<'_ATEOF' + +%% +foo: {}; +_ATEOF + + +$at_traceoff +echo "output.at:44: bison -dv -y foo.y" +echo output.at:44 >$at_check_line_file +( $at_traceon; bison -dv -y foo.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:44: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "output.at:44: ls y.output y.tab.c y.tab.h" +echo output.at:44 >$at_check_line_file +( $at_traceon; ls y.output y.tab.c y.tab.h ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:44: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 9 ) # 9. output.at:46: Output files: & -dv -b bar. + at_setup_line='output.at:46' + at_desc='Output files: & -dv -b bar.' + $at_quiet $ECHO_N " 9: Output files: & -dv -b bar. $ECHO_C" + at_xfail=no + ( + echo "9. output.at:46: testing ..." + $at_traceon + +cat >foo.y <<'_ATEOF' + +%% +foo: {}; +_ATEOF + + +$at_traceoff +echo "output.at:46: bison -dv -b bar foo.y" +echo output.at:46 >$at_check_line_file +( $at_traceon; bison -dv -b bar foo.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:46: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "output.at:46: ls bar.output bar.tab.c bar.tab.h" +echo output.at:46 >$at_check_line_file +( $at_traceon; ls bar.output bar.tab.c bar.tab.h ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:46: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 10 ) # 10. output.at:48: Output files: & -dv -g -o foo.c. + at_setup_line='output.at:48' + at_desc='Output files: & -dv -g -o foo.c.' + $at_quiet $ECHO_N " 10: Output files: & -dv -g -o foo.c. $ECHO_C" + at_xfail=no + ( + echo "10. output.at:48: testing ..." + $at_traceon + +cat >foo.y <<'_ATEOF' + +%% +foo: {}; +_ATEOF + + +$at_traceoff +echo "output.at:48: bison -dv -g -o foo.c foo.y" +echo output.at:48 >$at_check_line_file +( $at_traceon; bison -dv -g -o foo.c foo.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:48: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "output.at:48: ls foo.c foo.h foo.output foo.vcg" +echo output.at:48 >$at_check_line_file +( $at_traceon; ls foo.c foo.h foo.output foo.vcg ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:48: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 11 ) # 11. output.at:52: Output files: %defines %verbose & . + at_setup_line='output.at:52' + at_desc='Output files: %defines %verbose & .' + $at_quiet $ECHO_N " 11: Output files: %defines %verbose & . $ECHO_C" + at_xfail=no + ( + echo "11. output.at:52: testing ..." + $at_traceon + +cat >foo.y <<'_ATEOF' +%defines %verbose +%% +foo: {}; +_ATEOF + + +$at_traceoff +echo "output.at:52: bison foo.y" +echo output.at:52 >$at_check_line_file +( $at_traceon; bison foo.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:52: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "output.at:52: ls foo.output foo.tab.c foo.tab.h" +echo output.at:52 >$at_check_line_file +( $at_traceon; ls foo.output foo.tab.c foo.tab.h ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:52: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 12 ) # 12. output.at:54: Output files: %defines %verbose %yacc & . + at_setup_line='output.at:54' + at_desc='Output files: %defines %verbose %yacc & .' + $at_quiet $ECHO_N " 12: Output files: %defines %verbose %yacc & . $ECHO_C" + at_xfail=no + ( + echo "12. output.at:54: testing ..." + $at_traceon + +cat >foo.y <<'_ATEOF' +%defines %verbose %yacc +%% +foo: {}; +_ATEOF + + +$at_traceoff +echo "output.at:54: bison foo.y" +echo output.at:54 >$at_check_line_file +( $at_traceon; bison foo.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:54: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "output.at:54: ls y.output y.tab.c y.tab.h" +echo output.at:54 >$at_check_line_file +( $at_traceon; ls y.output y.tab.c y.tab.h ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:54: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 13 ) # 13. output.at:57: Output files: %defines %verbose %yacc & . + at_setup_line='output.at:57' + at_desc='Output files: %defines %verbose %yacc & .' + $at_quiet $ECHO_N " 13: Output files: %defines %verbose %yacc & . $ECHO_C" + at_xfail=no + ( + echo "13. output.at:57: testing ..." + $at_traceon + +cat >foo.yy <<'_ATEOF' +%defines %verbose %yacc +%% +foo: {}; +_ATEOF + + +$at_traceoff +echo "output.at:57: bison foo.yy" +echo output.at:57 >$at_check_line_file +( $at_traceon; bison foo.yy ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:57: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "output.at:57: ls y.output y.tab.c y.tab.h" +echo output.at:57 >$at_check_line_file +( $at_traceon; ls y.output y.tab.c y.tab.h ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:57: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 14 ) # 14. output.at:61: Output files: %file-prefix="bar" %defines %verbose & . + at_setup_line='output.at:61' + at_desc='Output files: %file-prefix="bar" %defines %verbose & .' + $at_quiet $ECHO_N " 14: Output files: %file-prefix="bar" %defines %verbose & .$ECHO_C" + at_xfail=no + ( + echo "14. output.at:61: testing ..." + $at_traceon + +cat >foo.y <<'_ATEOF' +%file-prefix="bar" %defines %verbose +%% +foo: {}; +_ATEOF + + +$at_traceoff +echo "output.at:61: bison foo.y" +echo output.at:61 >$at_check_line_file +( $at_traceon; bison foo.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:61: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "output.at:61: ls bar.output bar.tab.c bar.tab.h" +echo output.at:61 >$at_check_line_file +( $at_traceon; ls bar.output bar.tab.c bar.tab.h ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:61: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 15 ) # 15. output.at:63: Output files: %output="bar.c" %defines %verbose %yacc & . + at_setup_line='output.at:63' + at_desc='Output files: %output="bar.c" %defines %verbose %yacc & .' + $at_quiet $ECHO_N " 15: Output files: %output="bar.c" %defines %verbose %yacc & .$ECHO_C" + at_xfail=no + ( + echo "15. output.at:63: testing ..." + $at_traceon + +cat >foo.y <<'_ATEOF' +%output="bar.c" %defines %verbose %yacc +%% +foo: {}; +_ATEOF + + +$at_traceoff +echo "output.at:63: bison foo.y" +echo output.at:63 >$at_check_line_file +( $at_traceon; bison foo.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:63: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "output.at:63: ls bar.output bar.c bar.h" +echo output.at:63 >$at_check_line_file +( $at_traceon; ls bar.output bar.c bar.h ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:63: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 16 ) # 16. output.at:67: Output files: %file-prefix="baz" %output="bar.c" %defines %verbose %yacc & . + at_setup_line='output.at:67' + at_desc='Output files: %file-prefix="baz" %output="bar.c" %defines %verbose %yacc & .' + $at_quiet $ECHO_N " 16: Output files: %file-prefix="baz" %output="bar.c" %defines %verbose %yacc & .$ECHO_C" + at_xfail=no + ( + echo "16. output.at:67: testing ..." + $at_traceon + +cat >foo.y <<'_ATEOF' +%file-prefix="baz" %output="bar.c" %defines %verbose %yacc +%% +foo: {}; +_ATEOF + + +$at_traceoff +echo "output.at:67: bison foo.y" +echo output.at:67 >$at_check_line_file +( $at_traceon; bison foo.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:67: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "output.at:67: ls bar.output bar.c bar.h" +echo output.at:67 >$at_check_line_file +( $at_traceon; ls bar.output bar.c bar.h ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:67: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 17 ) # 17. output.at:72: Output files: %defines %verbose & . + at_setup_line='output.at:72' + at_desc='Output files: %defines %verbose & .' + $at_quiet $ECHO_N " 17: Output files: %defines %verbose & . $ECHO_C" + at_xfail=no + ( + echo "17. output.at:72: testing ..." + $at_traceon + +cat >foo.yy <<'_ATEOF' +%defines %verbose +%% +foo: {}; +_ATEOF + + +$at_traceoff +echo "output.at:72: bison foo.yy" +echo output.at:72 >$at_check_line_file +( $at_traceon; bison foo.yy ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:72: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "output.at:72: ls foo.output foo.tab.cc foo.tab.hh" +echo output.at:72 >$at_check_line_file +( $at_traceon; ls foo.output foo.tab.cc foo.tab.hh ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:72: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 18 ) # 18. output.at:75: Output files: %defines %verbose & -o foo.c. + at_setup_line='output.at:75' + at_desc='Output files: %defines %verbose & -o foo.c.' + $at_quiet $ECHO_N " 18: Output files: %defines %verbose & -o foo.c. $ECHO_C" + at_xfail=no + ( + echo "18. output.at:75: testing ..." + $at_traceon + +cat >foo.yy <<'_ATEOF' +%defines %verbose +%% +foo: {}; +_ATEOF + + +$at_traceoff +echo "output.at:75: bison -o foo.c foo.yy" +echo output.at:75 >$at_check_line_file +( $at_traceon; bison -o foo.c foo.yy ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:75: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "output.at:75: ls foo.c foo.h foo.output" +echo output.at:75 >$at_check_line_file +( $at_traceon; ls foo.c foo.h foo.output ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:75: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 19 ) # 19. output.at:79: Output files: & --defines=foo.hpp -o foo.c++. + at_setup_line='output.at:79' + at_desc='Output files: & --defines=foo.hpp -o foo.c++.' + $at_quiet $ECHO_N " 19: Output files: & --defines=foo.hpp -o foo.c++.$ECHO_C" + at_xfail=no + ( + echo "19. output.at:79: testing ..." + $at_traceon + +cat >foo.yy <<'_ATEOF' + +%% +foo: {}; +_ATEOF + + +$at_traceoff +echo "output.at:79: bison --defines=foo.hpp -o foo.c++ foo.yy" +echo output.at:79 >$at_check_line_file +( $at_traceon; bison --defines=foo.hpp -o foo.c++ foo.yy ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:79: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "output.at:79: ls foo.c++ foo.hpp" +echo output.at:79 >$at_check_line_file +( $at_traceon; ls foo.c++ foo.hpp ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:79: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 20 ) # 20. output.at:83: Output files: & -o foo.c++ --graph=foo.gph. + at_setup_line='output.at:83' + at_desc='Output files: & -o foo.c++ --graph=foo.gph.' + $at_quiet $ECHO_N " 20: Output files: & -o foo.c++ --graph=foo.gph. $ECHO_C" + at_xfail=no + ( + echo "20. output.at:83: testing ..." + $at_traceon + +cat >foo.yy <<'_ATEOF' + +%% +foo: {}; +_ATEOF + + +$at_traceoff +echo "output.at:83: bison -o foo.c++ --graph=foo.gph foo.yy" +echo output.at:83 >$at_check_line_file +( $at_traceon; bison -o foo.c++ --graph=foo.gph foo.yy ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:83: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "output.at:83: ls foo.c++ foo.gph" +echo output.at:83 >$at_check_line_file +( $at_traceon; ls foo.c++ foo.gph ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "output.at:83: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + + banner-3 ) # Banner 3. sets.at:59 + cat <<\_ATEOF + +Grammar Sets (Firsts etc.). + +_ATEOF + ;; + + 21 ) # 21. sets.at:66: Nullable + at_setup_line='sets.at:66' + at_desc='Nullable' + $at_quiet $ECHO_N " 21: Nullable $ECHO_C" + at_xfail=no + ( + echo "21. sets.at:66: testing ..." + $at_traceon + + +# At some point, nullable had been smoking grass, and managed to say: +# +# Entering set_nullable +# NULLABLE +# 'e': yes +# (null): no +# ... + +cat >input.y <<'_ATEOF' +%% +e: 'e' | /* Nothing */; +_ATEOF + + +$at_traceoff +echo "sets.at:81: bison --trace=sets input.y" +echo sets.at:81 >$at_check_line_file +( $at_traceon; bison --trace=sets input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "sets.at:81: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +cat >extract.sed <<'_ATEOF' +#n +/^NULLABLE$/ { + :null + p + n + /^[ ]*$/ !b null +} +/^FIRSTS$/ { + :firsts + p + n + /^[ ]*$/ !b firsts +} +/^FDERIVES$/ { + :fderiv + p + n + /^[ ]*$/ !b fderiv +} +/^DERIVES$/ { + :deriv + p + n + /^[ ]*$/ !b deriv +} +_ATEOF + +$at_traceoff +echo "sets.at:82: sed -f extract.sed stderr" +echo sets.at:82 >$at_check_line_file +( $at_traceon; sed -f extract.sed stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; tee stdout <$at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "sets.at:82: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "sets.at:82: mv stdout sets" +echo sets.at:82 >$at_check_line_file +( $at_traceon; mv stdout sets ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "sets.at:82: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "sets.at:107: cat sets" +echo sets.at:107 >$at_check_line_file +( $at_traceon; cat sets ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "DERIVES + \$accept derives + 0 e \$end + e derives + 1 'e' + 2 /* empty */ +NULLABLE + \$accept: no + e: yes +FIRSTS + \$accept firsts + \$accept + e + e firsts + e +FDERIVES + \$accept derives + 0 e \$end + 1 'e' + 2 /* empty */ + e derives + 1 'e' + 2 /* empty */ +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "sets.at:107: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 22 ) # 22. sets.at:151: Broken Closure + at_setup_line='sets.at:151' + at_desc='Broken Closure' + $at_quiet $ECHO_N " 22: Broken Closure $ECHO_C" + at_xfail=no + ( + echo "22. sets.at:151: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +%% +a: b; +b: c; +c: d; +d: e; +e: f; +f: g; +g: h; +h: 'h'; +_ATEOF + + +$at_traceoff +echo "sets.at:165: bison --trace=sets input.y" +echo sets.at:165 >$at_check_line_file +( $at_traceon; bison --trace=sets input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "sets.at:165: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "sets.at:183: sed -n 's/[ ]*\$//;/^RTC: Firsts Output BEGIN/,/^RTC: Firsts Output END/p' stderr" +echo sets.at:183 >$at_check_line_file +( $at_traceon; sed -n 's/[ ]*$//;/^RTC: Firsts Output BEGIN/,/^RTC: Firsts Output END/p' stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "RTC: Firsts Output BEGIN + + 012345678 + .---------. + 0|111111111| + 1| 11111111| + 2| 1111111| + 3| 111111| + 4| 11111| + 5| 1111| + 6| 111| + 7| 11| + 8| 1| + \`---------' +RTC: Firsts Output END +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "sets.at:183: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 23 ) # 23. sets.at:193: Firsts + at_setup_line='sets.at:193' + at_desc='Firsts' + $at_quiet $ECHO_N " 23: Firsts $ECHO_C" + at_xfail=no + ( + echo "23. sets.at:193: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +%nonassoc '<' '>' +%left '+' '-' +%right '^' '=' +%% +exp: + exp '<' exp + | exp '>' exp + | exp '+' exp + | exp '-' exp + | exp '^' exp + | exp '=' exp + | "exp" + ; +_ATEOF + + +$at_traceoff +echo "sets.at:211: bison --trace=sets input.y" +echo sets.at:211 >$at_check_line_file +( $at_traceon; bison --trace=sets input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "sets.at:211: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +cat >extract.sed <<'_ATEOF' +#n +/^NULLABLE$/ { + :null + p + n + /^[ ]*$/ !b null +} +/^FIRSTS$/ { + :firsts + p + n + /^[ ]*$/ !b firsts +} +/^FDERIVES$/ { + :fderiv + p + n + /^[ ]*$/ !b fderiv +} +/^DERIVES$/ { + :deriv + p + n + /^[ ]*$/ !b deriv +} +_ATEOF + +$at_traceoff +echo "sets.at:212: sed -f extract.sed stderr" +echo sets.at:212 >$at_check_line_file +( $at_traceon; sed -f extract.sed stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; tee stdout <$at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "sets.at:212: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "sets.at:212: mv stdout sets" +echo sets.at:212 >$at_check_line_file +( $at_traceon; mv stdout sets ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "sets.at:212: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "sets.at:252: cat sets" +echo sets.at:252 >$at_check_line_file +( $at_traceon; cat sets ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "DERIVES + \$accept derives + 0 exp \$end + exp derives + 1 exp '<' exp + 2 exp '>' exp + 3 exp '+' exp + 4 exp '-' exp + 5 exp '^' exp + 6 exp '=' exp + 7 \"exp\" +NULLABLE + \$accept: no + exp: no +FIRSTS + \$accept firsts + \$accept + exp + exp firsts + exp +FDERIVES + \$accept derives + 0 exp \$end + 1 exp '<' exp + 2 exp '>' exp + 3 exp '+' exp + 4 exp '-' exp + 5 exp '^' exp + 6 exp '=' exp + 7 \"exp\" + exp derives + 1 exp '<' exp + 2 exp '>' exp + 3 exp '+' exp + 4 exp '-' exp + 5 exp '^' exp + 6 exp '=' exp + 7 \"exp\" +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "sets.at:252: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + + banner-4 ) # Banner 4. reduce.at:19 + cat <<\_ATEOF + +Grammar Reduction. + +_ATEOF + ;; + + 24 ) # 24. reduce.at:26: Useless Terminals + at_setup_line='reduce.at:26' + at_desc='Useless Terminals' + $at_quiet $ECHO_N " 24: Useless Terminals $ECHO_C" + at_xfail=no + ( + echo "24. reduce.at:26: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +%verbose +%output="input.c" + +%token useless1 +%token useless2 +%token useless3 +%token useless4 +%token useless5 +%token useless6 +%token useless7 +%token useless8 +%token useless9 + +%token useful +%% +exp: useful; +_ATEOF + + +$at_traceoff +echo "reduce.at:47: bison input.y" +echo reduce.at:47 >$at_check_line_file +( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "reduce.at:47: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "reduce.at:60: sed -n '/^Grammar/q;/^\$/!p' input.output" +echo reduce.at:60 >$at_check_line_file +( $at_traceon; sed -n '/^Grammar/q;/^$/!p' input.output ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "Terminals which are not used + useless1 + useless2 + useless3 + useless4 + useless5 + useless6 + useless7 + useless8 + useless9 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "reduce.at:60: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 25 ) # 25. reduce.at:70: Useless Nonterminals + at_setup_line='reduce.at:70' + at_desc='Useless Nonterminals' + $at_quiet $ECHO_N " 25: Useless Nonterminals $ECHO_C" + at_xfail=no + ( + echo "25. reduce.at:70: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +%verbose +%output="input.c" + +%nterm useless1 +%nterm useless2 +%nterm useless3 +%nterm useless4 +%nterm useless5 +%nterm useless6 +%nterm useless7 +%nterm useless8 +%nterm useless9 + +%token useful +%% +exp: useful; +_ATEOF + + +$at_traceoff +echo "reduce.at:102: bison input.y" +echo reduce.at:102 >$at_check_line_file +( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "input.y: warning: 9 useless nonterminals +input.y:4.8-15: warning: useless nonterminal: useless1 +input.y:5.8-15: warning: useless nonterminal: useless2 +input.y:6.8-15: warning: useless nonterminal: useless3 +input.y:7.8-15: warning: useless nonterminal: useless4 +input.y:8.8-15: warning: useless nonterminal: useless5 +input.y:9.8-15: warning: useless nonterminal: useless6 +input.y:10.8-15: warning: useless nonterminal: useless7 +input.y:11.8-15: warning: useless nonterminal: useless8 +input.y:12.8-15: warning: useless nonterminal: useless9 +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "reduce.at:102: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "reduce.at:115: sed -n '/^Grammar/q;/^\$/!p' input.output" +echo reduce.at:115 >$at_check_line_file +( $at_traceon; sed -n '/^Grammar/q;/^$/!p' input.output ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "Useless nonterminals + useless1 + useless2 + useless3 + useless4 + useless5 + useless6 + useless7 + useless8 + useless9 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "reduce.at:115: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 26 ) # 26. reduce.at:125: Useless Rules + at_setup_line='reduce.at:125' + at_desc='Useless Rules' + $at_quiet $ECHO_N " 26: Useless Rules $ECHO_C" + at_xfail=no + ( + echo "26. reduce.at:125: testing ..." + $at_traceon + + + + +cat >input.y <<'_ATEOF' +%verbose +%output="input.c" +%token useful +%% +exp: useful; +useless1: '1'; +useless2: '2'; +useless3: '3'; +useless4: '4'; +useless5: '5'; +useless6: '6'; +useless7: '7'; +useless8: '8'; +useless9: '9'; +_ATEOF + + +$at_traceoff +echo "reduce.at:166: bison input.y" +echo reduce.at:166 >$at_check_line_file +( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "input.y: warning: 9 useless nonterminals and 9 useless rules +input.y:6.1-8: warning: useless nonterminal: useless1 +input.y:7.1-8: warning: useless nonterminal: useless2 +input.y:8.1-8: warning: useless nonterminal: useless3 +input.y:9.1-8: warning: useless nonterminal: useless4 +input.y:10.1-8: warning: useless nonterminal: useless5 +input.y:11.1-8: warning: useless nonterminal: useless6 +input.y:12.1-8: warning: useless nonterminal: useless7 +input.y:13.1-8: warning: useless nonterminal: useless8 +input.y:14.1-8: warning: useless nonterminal: useless9 +input.y:6.11-13: warning: useless rule: useless1: '1' +input.y:7.11-13: warning: useless rule: useless2: '2' +input.y:8.11-13: warning: useless rule: useless3: '3' +input.y:9.11-13: warning: useless rule: useless4: '4' +input.y:10.11-13: warning: useless rule: useless5: '5' +input.y:11.11-13: warning: useless rule: useless6: '6' +input.y:12.11-13: warning: useless rule: useless7: '7' +input.y:13.11-13: warning: useless rule: useless8: '8' +input.y:14.11-13: warning: useless rule: useless9: '9' +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "reduce.at:166: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "reduce.at:199: sed -n '/^Grammar/q;/^\$/!p' input.output" +echo reduce.at:199 >$at_check_line_file +( $at_traceon; sed -n '/^Grammar/q;/^$/!p' input.output ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "Useless nonterminals + useless1 + useless2 + useless3 + useless4 + useless5 + useless6 + useless7 + useless8 + useless9 +Terminals which are not used + '1' + '2' + '3' + '4' + '5' + '6' + '7' + '8' + '9' +Useless rules + 2 useless1: '1' + 3 useless2: '2' + 4 useless3: '3' + 5 useless4: '4' + 6 useless5: '5' + 7 useless6: '6' + 8 useless7: '7' + 9 useless8: '8' + 10 useless9: '9' +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "reduce.at:199: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 27 ) # 27. reduce.at:212: Reduced Automaton + at_setup_line='reduce.at:212' + at_desc='Reduced Automaton' + $at_quiet $ECHO_N " 27: Reduced Automaton $ECHO_C" + at_xfail=no + ( + echo "27. reduce.at:212: testing ..." + $at_traceon + + + + +# The non reduced grammar. +# ------------------------ +cat >not-reduced.y <<'_ATEOF' +/* A useless token. */ +%token useless_token +/* A useful one. */ +%token useful +%verbose +%output="not-reduced.c" + +%% + +exp: useful { /* A useful action. */ } + | non_productive { /* A non productive action. */ } + ; + +not_reachable: useful { /* A not reachable action. */ } + ; + +non_productive: non_productive useless_token + { /* Another non productive action. */ } + ; +%% +_ATEOF + + +$at_traceoff +echo "reduce.at:248: bison not-reduced.y" +echo reduce.at:248 >$at_check_line_file +( $at_traceon; bison not-reduced.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "not-reduced.y: warning: 2 useless nonterminals and 3 useless rules +not-reduced.y:14.1-13: warning: useless nonterminal: not_reachable +not-reduced.y:11.6-19: warning: useless nonterminal: non_productive +not-reduced.y:11.6-57: warning: useless rule: exp: non_productive +not-reduced.y:14.16-56: warning: useless rule: not_reachable: useful +not-reduced.y:17.17-18.63: warning: useless rule: non_productive: non_productive useless_token +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "reduce.at:248: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "reduce.at:260: sed -n '/^Grammar/q;/^\$/!p' not-reduced.output" +echo reduce.at:260 >$at_check_line_file +( $at_traceon; sed -n '/^Grammar/q;/^$/!p' not-reduced.output ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "Useless nonterminals + not_reachable + non_productive +Terminals which are not used + useless_token +Useless rules + 2 exp: non_productive + 3 not_reachable: useful + 4 non_productive: non_productive useless_token +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "reduce.at:260: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# The reduced grammar. +# -------------------- +cat >reduced.y <<'_ATEOF' +/* A useless token. */ +%token useless_token +/* A useful one. */ +%token useful +%verbose +%output="reduced.c" + +%% + +exp: useful { /* A useful action. */ } +// | non_productive { /* A non productive action. */ } */ + ; + +//not_reachable: useful { /* A not reachable action. */ } +// ; + +//non_productive: non_productive useless_token +// { /* Another non productive action. */ } +// ; +%% +_ATEOF + + +$at_traceoff +echo "reduce.at:287: bison reduced.y" +echo reduce.at:287 >$at_check_line_file +( $at_traceon; bison reduced.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "reduce.at:287: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Comparing the parsers. +cp reduced.c expout +$at_traceoff +echo "reduce.at:291: sed 's/not-reduced/reduced/g' not-reduced.c" +echo reduce.at:291 >$at_check_line_file +( $at_traceon; sed 's/not-reduced/reduced/g' not-reduced.c ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "reduce.at:291: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 28 ) # 28. reduce.at:301: Underivable Rules + at_setup_line='reduce.at:301' + at_desc='Underivable Rules' + $at_quiet $ECHO_N " 28: Underivable Rules $ECHO_C" + at_xfail=no + ( + echo "28. reduce.at:301: testing ..." + $at_traceon + + + + +cat >input.y <<'_ATEOF' +%verbose +%output="input.c" +%token useful +%% +exp: useful | underivable; +underivable: indirection; +indirection: underivable; +_ATEOF + + +$at_traceoff +echo "reduce.at:322: bison input.y" +echo reduce.at:322 >$at_check_line_file +( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "input.y: warning: 2 useless nonterminals and 3 useless rules +input.y:5.15-25: warning: useless nonterminal: underivable +input.y:6.14-24: warning: useless nonterminal: indirection +input.y:5.15-25: warning: useless rule: exp: underivable +input.y:6.14-24: warning: useless rule: underivable: indirection +input.y:7.14-24: warning: useless rule: indirection: underivable +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "reduce.at:322: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "reduce.at:332: sed -n '/^Grammar/q;/^\$/!p' input.output" +echo reduce.at:332 >$at_check_line_file +( $at_traceon; sed -n '/^Grammar/q;/^$/!p' input.output ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "Useless nonterminals + underivable + indirection +Useless rules + 2 exp: underivable + 3 underivable: indirection + 4 indirection: underivable +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "reduce.at:332: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 29 ) # 29. reduce.at:342: Empty Language + at_setup_line='reduce.at:342' + at_desc='Empty Language' + $at_quiet $ECHO_N " 29: Empty Language $ECHO_C" + at_xfail=no + ( + echo "29. reduce.at:342: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +%output="input.c" +%% +exp: exp; +_ATEOF + + +$at_traceoff +echo "reduce.at:353: bison input.y" +echo reduce.at:353 >$at_check_line_file +( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "input.y: warning: 2 useless nonterminals and 2 useless rules +input.y:3.1-3: fatal error: start symbol exp does not derive any sentence +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "reduce.at:353: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + + banner-5 ) # Banner 5. synclines.at:19 + cat <<\_ATEOF + +User Actions. + +_ATEOF + ;; + + 30 ) # 30. synclines.at:93: Prologue synch line + at_setup_line='synclines.at:93' + at_desc='Prologue synch line' + $at_quiet $ECHO_N " 30: Prologue synch line $ECHO_C" + at_xfail=no + ( + echo "30. synclines.at:93: testing ..." + $at_traceon + + +# It seems impossible to find a generic scheme to check the location +# of an error. Even requiring GCC is not sufficient, since for instance +# the version modified by Apple: +# +# | Reading specs from /usr/libexec/gcc/darwin/ppc/2.95.2/specs +# | Apple Computer, Inc. version gcc-934.3, based on gcc version 2.95.2 +# | 19991024 (release) configure:2124: $? = 0 +# +# instead of: +# +# | input.y:2: #error "2" +# +# it reports: +# +# | input.y:2: "2" +# | cpp-precomp: warning: errors during smart preprocessing, retrying in basic mode + +cat >syncline.c <<'_ATEOF' +#error "1" +_ATEOF + + +$at_traceoff +echo "synclines.at:93: \$CC \$CFLAGS \$CPPFLAGS -c syncline.c" +echo synclines.at:93 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS -c syncline.c ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + *);; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +# In case GCC displays column information, strip it down. +# +# input.y:4:2: #error "4" or input.y:4.2: #error "4" +# => +# input.y:4: #error "4" +# +$at_traceoff +echo "synclines.at:93: sed 's/^\\([^:]*:[^:.]*\\)[.:][^:]*:\\(.*\\)\$/\\1:\\2/' stderr" +echo synclines.at:93 >$at_check_line_file +( $at_traceon; sed 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; tee stdout <$at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:93: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "synclines.at:93: test \"\`cat stdout\`\" = 'syncline.c:1: #error \"1\"' || exit 77" +echo synclines.at:93 >$at_check_line_file +( $at_traceon; test "`cat stdout`" = 'syncline.c:1: #error "1"' || exit 77 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:93: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input.y <<'_ATEOF' +%{ +#error "2" +void yyerror (const char *s); +int yylex (void); +%} +%% +exp: '0'; +_ATEOF + +$at_traceoff +echo "synclines.at:93: bison -o input.c input.y" +echo synclines.at:93 >$at_check_line_file +( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:93: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "synclines.at:93: \$CC \$CFLAGS \$CPPFLAGS -c input.c" +echo synclines.at:93 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS -c input.c ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + *);; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +# In case GCC displays column information, strip it down. +# +# input.y:4:2: #error "4" or input.y:4.2: #error "4" +# => +# input.y:4: #error "4" +# +$at_traceoff +echo "synclines.at:93: sed 's/^\\([^:]*:[^:.]*\\)[.:][^:]*:\\(.*\\)\$/\\1:\\2/' stderr" +echo synclines.at:93 >$at_check_line_file +( $at_traceon; sed 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; tee stdout <$at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:93: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "synclines.at:93: cat stdout" +echo synclines.at:93 >$at_check_line_file +( $at_traceon; cat stdout ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "input.y:2: #error \"2\" +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:93: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 31 ) # 31. synclines.at:113: %union synch line + at_setup_line='synclines.at:113' + at_desc='%union synch line' + $at_quiet $ECHO_N " 31: %union synch line $ECHO_C" + at_xfail=no + ( + echo "31. synclines.at:113: testing ..." + $at_traceon + + +# It seems impossible to find a generic scheme to check the location +# of an error. Even requiring GCC is not sufficient, since for instance +# the version modified by Apple: +# +# | Reading specs from /usr/libexec/gcc/darwin/ppc/2.95.2/specs +# | Apple Computer, Inc. version gcc-934.3, based on gcc version 2.95.2 +# | 19991024 (release) configure:2124: $? = 0 +# +# instead of: +# +# | input.y:2: #error "2" +# +# it reports: +# +# | input.y:2: "2" +# | cpp-precomp: warning: errors during smart preprocessing, retrying in basic mode + +cat >syncline.c <<'_ATEOF' +#error "1" +_ATEOF + + +$at_traceoff +echo "synclines.at:113: \$CC \$CFLAGS \$CPPFLAGS -c syncline.c" +echo synclines.at:113 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS -c syncline.c ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + *);; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +# In case GCC displays column information, strip it down. +# +# input.y:4:2: #error "4" or input.y:4.2: #error "4" +# => +# input.y:4: #error "4" +# +$at_traceoff +echo "synclines.at:113: sed 's/^\\([^:]*:[^:.]*\\)[.:][^:]*:\\(.*\\)\$/\\1:\\2/' stderr" +echo synclines.at:113 >$at_check_line_file +( $at_traceon; sed 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; tee stdout <$at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:113: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "synclines.at:113: test \"\`cat stdout\`\" = 'syncline.c:1: #error \"1\"' || exit 77" +echo synclines.at:113 >$at_check_line_file +( $at_traceon; test "`cat stdout`" = 'syncline.c:1: #error "1"' || exit 77 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:113: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input.y <<'_ATEOF' +%union { +#error "2" + char dummy; +} +%{ +void yyerror (const char *s); +int yylex (void); +%} +%% +exp: '0'; +_ATEOF + +$at_traceoff +echo "synclines.at:113: bison -o input.c input.y" +echo synclines.at:113 >$at_check_line_file +( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:113: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "synclines.at:113: \$CC \$CFLAGS \$CPPFLAGS -c input.c" +echo synclines.at:113 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS -c input.c ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + *);; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +# In case GCC displays column information, strip it down. +# +# input.y:4:2: #error "4" or input.y:4.2: #error "4" +# => +# input.y:4: #error "4" +# +$at_traceoff +echo "synclines.at:113: sed 's/^\\([^:]*:[^:.]*\\)[.:][^:]*:\\(.*\\)\$/\\1:\\2/' stderr" +echo synclines.at:113 >$at_check_line_file +( $at_traceon; sed 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; tee stdout <$at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:113: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "synclines.at:113: cat stdout" +echo synclines.at:113 >$at_check_line_file +( $at_traceon; cat stdout ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "input.y:2: #error \"2\" +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:113: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 32 ) # 32. synclines.at:136: Postprologue synch line + at_setup_line='synclines.at:136' + at_desc='Postprologue synch line' + $at_quiet $ECHO_N " 32: Postprologue synch line $ECHO_C" + at_xfail=no + ( + echo "32. synclines.at:136: testing ..." + $at_traceon + + +# It seems impossible to find a generic scheme to check the location +# of an error. Even requiring GCC is not sufficient, since for instance +# the version modified by Apple: +# +# | Reading specs from /usr/libexec/gcc/darwin/ppc/2.95.2/specs +# | Apple Computer, Inc. version gcc-934.3, based on gcc version 2.95.2 +# | 19991024 (release) configure:2124: $? = 0 +# +# instead of: +# +# | input.y:2: #error "2" +# +# it reports: +# +# | input.y:2: "2" +# | cpp-precomp: warning: errors during smart preprocessing, retrying in basic mode + +cat >syncline.c <<'_ATEOF' +#error "1" +_ATEOF + + +$at_traceoff +echo "synclines.at:136: \$CC \$CFLAGS \$CPPFLAGS -c syncline.c" +echo synclines.at:136 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS -c syncline.c ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + *);; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +# In case GCC displays column information, strip it down. +# +# input.y:4:2: #error "4" or input.y:4.2: #error "4" +# => +# input.y:4: #error "4" +# +$at_traceoff +echo "synclines.at:136: sed 's/^\\([^:]*:[^:.]*\\)[.:][^:]*:\\(.*\\)\$/\\1:\\2/' stderr" +echo synclines.at:136 >$at_check_line_file +( $at_traceon; sed 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; tee stdout <$at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:136: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "synclines.at:136: test \"\`cat stdout\`\" = 'syncline.c:1: #error \"1\"' || exit 77" +echo synclines.at:136 >$at_check_line_file +( $at_traceon; test "`cat stdout`" = 'syncline.c:1: #error "1"' || exit 77 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:136: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input.y <<'_ATEOF' +%{ +void yyerror (const char *s); +int yylex (void); +%} +%union +{ + int ival; +} +%{ +#error "10" +%} +%% +exp: '0'; +_ATEOF + +$at_traceoff +echo "synclines.at:136: bison -o input.c input.y" +echo synclines.at:136 >$at_check_line_file +( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:136: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "synclines.at:136: \$CC \$CFLAGS \$CPPFLAGS -c input.c" +echo synclines.at:136 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS -c input.c ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + *);; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +# In case GCC displays column information, strip it down. +# +# input.y:4:2: #error "4" or input.y:4.2: #error "4" +# => +# input.y:4: #error "4" +# +$at_traceoff +echo "synclines.at:136: sed 's/^\\([^:]*:[^:.]*\\)[.:][^:]*:\\(.*\\)\$/\\1:\\2/' stderr" +echo synclines.at:136 >$at_check_line_file +( $at_traceon; sed 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; tee stdout <$at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:136: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "synclines.at:136: cat stdout" +echo synclines.at:136 >$at_check_line_file +( $at_traceon; cat stdout ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "input.y:10: #error \"10\" +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:136: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 33 ) # 33. synclines.at:155: Action synch line + at_setup_line='synclines.at:155' + at_desc='Action synch line' + $at_quiet $ECHO_N " 33: Action synch line $ECHO_C" + at_xfail=no + ( + echo "33. synclines.at:155: testing ..." + $at_traceon + + +# It seems impossible to find a generic scheme to check the location +# of an error. Even requiring GCC is not sufficient, since for instance +# the version modified by Apple: +# +# | Reading specs from /usr/libexec/gcc/darwin/ppc/2.95.2/specs +# | Apple Computer, Inc. version gcc-934.3, based on gcc version 2.95.2 +# | 19991024 (release) configure:2124: $? = 0 +# +# instead of: +# +# | input.y:2: #error "2" +# +# it reports: +# +# | input.y:2: "2" +# | cpp-precomp: warning: errors during smart preprocessing, retrying in basic mode + +cat >syncline.c <<'_ATEOF' +#error "1" +_ATEOF + + +$at_traceoff +echo "synclines.at:155: \$CC \$CFLAGS \$CPPFLAGS -c syncline.c" +echo synclines.at:155 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS -c syncline.c ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + *);; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +# In case GCC displays column information, strip it down. +# +# input.y:4:2: #error "4" or input.y:4.2: #error "4" +# => +# input.y:4: #error "4" +# +$at_traceoff +echo "synclines.at:155: sed 's/^\\([^:]*:[^:.]*\\)[.:][^:]*:\\(.*\\)\$/\\1:\\2/' stderr" +echo synclines.at:155 >$at_check_line_file +( $at_traceon; sed 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; tee stdout <$at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:155: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "synclines.at:155: test \"\`cat stdout\`\" = 'syncline.c:1: #error \"1\"' || exit 77" +echo synclines.at:155 >$at_check_line_file +( $at_traceon; test "`cat stdout`" = 'syncline.c:1: #error "1"' || exit 77 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:155: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input.y <<'_ATEOF' +%{ +void yyerror (const char *s); +int yylex (void); +%} +%% +exp: +{ +#error "8" +}; +_ATEOF + +$at_traceoff +echo "synclines.at:155: bison -o input.c input.y" +echo synclines.at:155 >$at_check_line_file +( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:155: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "synclines.at:155: \$CC \$CFLAGS \$CPPFLAGS -c input.c" +echo synclines.at:155 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS -c input.c ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + *);; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +# In case GCC displays column information, strip it down. +# +# input.y:4:2: #error "4" or input.y:4.2: #error "4" +# => +# input.y:4: #error "4" +# +$at_traceoff +echo "synclines.at:155: sed 's/^\\([^:]*:[^:.]*\\)[.:][^:]*:\\(.*\\)\$/\\1:\\2/' stderr" +echo synclines.at:155 >$at_check_line_file +( $at_traceon; sed 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; tee stdout <$at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:155: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "synclines.at:155: cat stdout" +echo synclines.at:155 >$at_check_line_file +( $at_traceon; cat stdout ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "input.y:8: #error \"8\" +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:155: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 34 ) # 34. synclines.at:173: Epilogue synch line + at_setup_line='synclines.at:173' + at_desc='Epilogue synch line' + $at_quiet $ECHO_N " 34: Epilogue synch line $ECHO_C" + at_xfail=no + ( + echo "34. synclines.at:173: testing ..." + $at_traceon + + +# It seems impossible to find a generic scheme to check the location +# of an error. Even requiring GCC is not sufficient, since for instance +# the version modified by Apple: +# +# | Reading specs from /usr/libexec/gcc/darwin/ppc/2.95.2/specs +# | Apple Computer, Inc. version gcc-934.3, based on gcc version 2.95.2 +# | 19991024 (release) configure:2124: $? = 0 +# +# instead of: +# +# | input.y:2: #error "2" +# +# it reports: +# +# | input.y:2: "2" +# | cpp-precomp: warning: errors during smart preprocessing, retrying in basic mode + +cat >syncline.c <<'_ATEOF' +#error "1" +_ATEOF + + +$at_traceoff +echo "synclines.at:173: \$CC \$CFLAGS \$CPPFLAGS -c syncline.c" +echo synclines.at:173 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS -c syncline.c ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + *);; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +# In case GCC displays column information, strip it down. +# +# input.y:4:2: #error "4" or input.y:4.2: #error "4" +# => +# input.y:4: #error "4" +# +$at_traceoff +echo "synclines.at:173: sed 's/^\\([^:]*:[^:.]*\\)[.:][^:]*:\\(.*\\)\$/\\1:\\2/' stderr" +echo synclines.at:173 >$at_check_line_file +( $at_traceon; sed 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; tee stdout <$at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:173: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "synclines.at:173: test \"\`cat stdout\`\" = 'syncline.c:1: #error \"1\"' || exit 77" +echo synclines.at:173 >$at_check_line_file +( $at_traceon; test "`cat stdout`" = 'syncline.c:1: #error "1"' || exit 77 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:173: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input.y <<'_ATEOF' +%{ +void yyerror (const char *s); +int yylex (void); +%} +%% +exp: '0'; +%% +#error "8" +_ATEOF + +$at_traceoff +echo "synclines.at:173: bison -o input.c input.y" +echo synclines.at:173 >$at_check_line_file +( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:173: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "synclines.at:173: \$CC \$CFLAGS \$CPPFLAGS -c input.c" +echo synclines.at:173 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS -c input.c ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + *);; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +# In case GCC displays column information, strip it down. +# +# input.y:4:2: #error "4" or input.y:4.2: #error "4" +# => +# input.y:4: #error "4" +# +$at_traceoff +echo "synclines.at:173: sed 's/^\\([^:]*:[^:.]*\\)[.:][^:]*:\\(.*\\)\$/\\1:\\2/' stderr" +echo synclines.at:173 >$at_check_line_file +( $at_traceon; sed 's/^\([^:]*:[^:.]*\)[.:][^:]*:\(.*\)$/\1:\2/' stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; tee stdout <$at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:173: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "synclines.at:173: cat stdout" +echo synclines.at:173 >$at_check_line_file +( $at_traceon; cat stdout ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "input.y:8: #error \"8\" +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "synclines.at:173: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + + banner-6 ) # Banner 6. headers.at:19 + cat <<\_ATEOF + +Parser Headers. + +_ATEOF + ;; + + 35 ) # 35. headers.at:27: %union and --defines + at_setup_line='headers.at:27' + at_desc='%union and --defines' + $at_quiet $ECHO_N " 35: %union and --defines $ECHO_C" + at_xfail=no + ( + echo "35. headers.at:27: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +%union +{ + int integer; + char *string ; +} +%% +exp: {}; +_ATEOF + + +$at_traceoff +echo "headers.at:39: bison --defines input.y" +echo headers.at:39 >$at_check_line_file +( $at_traceon; bison --defines input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "headers.at:39: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 36 ) # 36. headers.at:76: Invalid CPP guards: input/input + at_setup_line='headers.at:76' + at_desc='Invalid CPP guards: input/input' + $at_quiet $ECHO_N " 36: Invalid CPP guards: input/input $ECHO_C" + at_xfail=no + ( + echo "36. headers.at:76: testing ..." + $at_traceon + + +# Possibly create inner directories. +dirname=`(dirname input/input) 2>/dev/null || +$as_expr Xinput/input : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + Xinput/input : 'X\(//\)[^/]' \| \ + Xinput/input : 'X\(//\)$' \| \ + Xinput/input : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo Xinput/input | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` +{ if $as_mkdir_p; then + mkdir -p $dirname + else + as_dir=$dirname + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirname" >&5 +echo "$as_me: error: cannot create directory $dirname" >&2;} + { (exit 1); exit 1; }; }; } + + +cat >input/input.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +%{ +#include "input/input.h" +%} +%% +dummy:; +%% +#include "input/input.h" +_ATEOF + + + +$at_traceoff +echo "headers.at:76: bison --defines=input/input.h --output=y.tab.c input/input.y" +echo headers.at:76 >$at_check_line_file +( $at_traceon; bison --defines=input/input.h --output=y.tab.c input/input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "headers.at:76: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# CPP should be happy with it. +$at_traceoff +echo "headers.at:76: \$CC -E -I. y.tab.c" +echo headers.at:76 >$at_check_line_file +( $at_traceon; $CC -E -I. y.tab.c ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "headers.at:76: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 37 ) # 37. headers.at:77: Invalid CPP guards: 9foo + at_setup_line='headers.at:77' + at_desc='Invalid CPP guards: 9foo' + $at_quiet $ECHO_N " 37: Invalid CPP guards: 9foo $ECHO_C" + at_xfail=no + ( + echo "37. headers.at:77: testing ..." + $at_traceon + + +# Possibly create inner directories. +dirname=`(dirname 9foo) 2>/dev/null || +$as_expr X9foo : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X9foo : 'X\(//\)[^/]' \| \ + X9foo : 'X\(//\)$' \| \ + X9foo : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X9foo | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` +{ if $as_mkdir_p; then + mkdir -p $dirname + else + as_dir=$dirname + as_dirs= + while test ! -d "$as_dir"; do + as_dirs="$as_dir $as_dirs" + as_dir=`(dirname "$as_dir") 2>/dev/null || +$as_expr X"$as_dir" : 'X\(.*[^/]\)//*[^/][^/]*/*$' \| \ + X"$as_dir" : 'X\(//\)[^/]' \| \ + X"$as_dir" : 'X\(//\)$' \| \ + X"$as_dir" : 'X\(/\)' \| \ + . : '\(.\)' 2>/dev/null || +echo X"$as_dir" | + sed '/^X\(.*[^/]\)\/\/*[^/][^/]*\/*$/{ s//\1/; q; } + /^X\(\/\/\)[^/].*/{ s//\1/; q; } + /^X\(\/\/\)$/{ s//\1/; q; } + /^X\(\/\).*/{ s//\1/; q; } + s/.*/./; q'` + done + test ! -n "$as_dirs" || mkdir $as_dirs + fi || { { echo "$as_me:$LINENO: error: cannot create directory $dirname" >&5 +echo "$as_me: error: cannot create directory $dirname" >&2;} + { (exit 1); exit 1; }; }; } + + +cat >9foo.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +%{ +#include "9foo.h" +%} +%% +dummy:; +%% +#include "9foo.h" +_ATEOF + + + +$at_traceoff +echo "headers.at:77: bison --defines=9foo.h --output=y.tab.c 9foo.y" +echo headers.at:77 >$at_check_line_file +( $at_traceon; bison --defines=9foo.h --output=y.tab.c 9foo.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "headers.at:77: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# CPP should be happy with it. +$at_traceoff +echo "headers.at:77: \$CC -E -I. y.tab.c" +echo headers.at:77 >$at_check_line_file +( $at_traceon; $CC -E -I. y.tab.c ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "headers.at:77: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 38 ) # 38. headers.at:86: export YYLTYPE + at_setup_line='headers.at:86' + at_desc='export YYLTYPE' + $at_quiet $ECHO_N " 38: export YYLTYPE $ECHO_C" + at_xfail=no + ( + echo "38. headers.at:86: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +%locations + +%name-prefix="my_" +%{ +#include +#include + +static int +my_lex (void) +{ + return EOF; +} + +static void +my_error (const char *msg) +{ + fprintf (stderr, "%s\n", msg); +} + +%} +%% +exp:; +_ATEOF + + + +$at_traceoff +echo "headers.at:113: bison --defines -o input.c input.y" +echo headers.at:113 >$at_check_line_file +( $at_traceon; bison --defines -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "headers.at:113: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# YYLTYPE should be defined, and MY_LLOC declared. +cat >caller.c <<'_ATEOF' +#include "input.h" +YYLTYPE *my_llocp = &my_lloc; + +int my_parse (void); + +int +main (void) +{ + return my_parse (); +} +_ATEOF + + +# Link and execute, just to make sure everything is fine (and in +# particular, that MY_LLOC is indeed defined somewhere). +$at_traceoff +echo "headers.at:131: \$CC \$CFLAGS \$CPPFLAGS -c caller.c -o caller.o" +echo headers.at:131 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS -c caller.c -o caller.o ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "headers.at:131: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "headers.at:132: \$CC \$CFLAGS \$CPPFLAGS -c input.c -o input.o" +echo headers.at:132 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS -c input.c -o input.o ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "headers.at:132: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "headers.at:133: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS caller.o input.o \$LIBS -o caller" +echo headers.at:133 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS caller.o input.o $LIBS -o caller ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "headers.at:133: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "headers.at:134: \$PREPARSER ./caller" +echo headers.at:134 >$at_check_line_file +( $at_traceon; $PREPARSER ./caller ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "headers.at:134: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + + banner-7 ) # Banner 7. actions.at:19 + cat <<\_ATEOF + +User Actions. + +_ATEOF + ;; + + 39 ) # 39. actions.at:25: Mid-rule actions + at_setup_line='actions.at:25' + at_desc='Mid-rule actions' + $at_quiet $ECHO_N " 39: Mid-rule actions $ECHO_C" + at_xfail=no + ( + echo "39. actions.at:25: testing ..." + $at_traceon + + +# Bison once forgot the mid-rule actions. It was because the action +# was attached to the host rule (the one with the mid-rule action), +# instead of being attached to the empty rule dedicated to this +# action. + +cat >input.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +%{ +# include +# include + static void yyerror (const char *msg); + static int yylex (void); +# define YYDEBUG 1 +# define YYERROR_VERBOSE 1 +%} +%% +exp: { putchar ('0'); } + '1' { putchar ('1'); } + '2' { putchar ('2'); } + '3' { putchar ('3'); } + '4' { putchar ('4'); } + '5' { putchar ('5'); } + '6' { putchar ('6'); } + '7' { putchar ('7'); } + '8' { putchar ('8'); } + '9' { putchar ('9'); } + { putchar ('\n'); } + ; +%% +static int +yylex (void) +{ + static const char *input = "123456789"; + return *input++; +} + +static void +yyerror (const char *msg) +{ + fprintf (stderr, "%s\n", msg); +} + +int +main (void) +{ + return yyparse (); +} +_ATEOF + + + +$at_traceoff +echo "actions.at:75: bison -d -v -o input.c input.y" +echo actions.at:75 >$at_check_line_file +( $at_traceon; bison -d -v -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "actions.at:75: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "actions.at:76: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS input.c \$LIBS -o input" +echo actions.at:76 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS input.c $LIBS -o input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "actions.at:76: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "actions.at:79: \$PREPARSER ./input" +echo actions.at:79 >$at_check_line_file +( $at_traceon; $PREPARSER ./input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "0123456789 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "actions.at:79: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 40 ) # 40. actions.at:89: Actions after errors + at_setup_line='actions.at:89' + at_desc='Actions after errors' + $at_quiet $ECHO_N " 40: Actions after errors $ECHO_C" + at_xfail=no + ( + echo "40. actions.at:89: testing ..." + $at_traceon + + + + +cat >input.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +%{ +#include +#include + +static int yylex (void); +static void yyerror (char const *); + +#define YYDEBUG 1 +%} +%union { int ival; } +%type 'x' ';' thing line input + +%% +input: + /* Nothing. */ + { + $$ = 0; + printf ("input (%d): /* Nothing */\n", $$); + } +| line input /* Right recursive to load the stack so that popping at + EOF can be exercised. */ + { + $$ = 2; + printf ("input (%d): line (%d) input (%d)\n", $$, $1, $2); + } +; + +line: + thing thing thing ';' + { + $$ = $1; + printf ("line (%d): thing (%d) thing (%d) thing (%d) ';' (%d)\n", + $$, $1, $2, $3, $4); + } +| thing thing ';' + { + $$ = $1; + printf ("line (%d): thing (%d) thing (%d) ';' (%d)\n", $$, $1, $2, $3); + } +| thing ';' + { + $$ = $1; + printf ("line (%d): thing (%d) ';' (%d)\n", $$, $1, $2); + } +| error ';' + { + $$ = -1; + printf ("line (%d): error ';' (%d)\n", $$, $2); + } +; + +thing: + 'x' + { + $$ = $1; + printf ("thing (%d): 'x' (%d)\n", $$, $1); + } +; +%% +static size_t counter; + +static int +yylex (void) +{ + static char const input[] = + { + /* Exercise the discarding of stack top and input until `error' + can be reduced. */ + 'x', 'x', 'x', 'x', 'x', 'x', ';', + + /* Load the stack and provoke an error that cannot be caught by + the grammar, to check that the stack is cleared. */ + 'x', 'x', ';', + 'x', ';', + 'y' + }; + + if (counter < sizeof input) + { + yylval.ival = counter; + printf ("sending: '%c' (%d)\n", input[counter], yylval.ival); + return input[counter++]; + } + else + { + printf ("sending: EOF\n"); + return EOF; + } +} + +static void +yyerror (char const *msg) +{ + printf ("%lu: %s\n", (unsigned long int) counter, msg); +} + +int +main (void) +{ + yydebug = !!getenv ("YYDEBUG"); + return yyparse (); +} +_ATEOF + + + +$at_traceoff +echo "actions.at:198: bison -o input.c input.y" +echo actions.at:198 >$at_check_line_file +( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "actions.at:198: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "actions.at:199: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS input.c \$LIBS -o input" +echo actions.at:199 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS input.c $LIBS -o input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "actions.at:199: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "actions.at:226: \$PREPARSER ./input" +echo actions.at:226 >$at_check_line_file +( $at_traceon; $PREPARSER ./input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "sending: 'x' (0) +thing (0): 'x' (0) +sending: 'x' (1) +thing (1): 'x' (1) +sending: 'x' (2) +thing (2): 'x' (2) +sending: 'x' (3) +4: syntax error +sending: 'x' (4) +sending: 'x' (5) +sending: ';' (6) +line (-1): error ';' (6) +sending: 'x' (7) +thing (7): 'x' (7) +sending: 'x' (8) +thing (8): 'x' (8) +sending: ';' (9) +line (7): thing (7) thing (8) ';' (9) +sending: 'x' (10) +thing (10): 'x' (10) +sending: ';' (11) +line (10): thing (10) ';' (11) +sending: 'y' (12) +13: syntax error +sending: EOF +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "actions.at:226: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 41 ) # 41. actions.at:236: Exotic Dollars + at_setup_line='actions.at:236' + at_desc='Exotic Dollars' + $at_quiet $ECHO_N " 41: Exotic Dollars $ECHO_C" + at_xfail=no + ( + echo "41. actions.at:236: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +%{ +# include +# include + static void yyerror (const char *msg); + static int yylex (void); +# define YYDEBUG 1 +# define YYERROR_VERBOSE 1 +%} + +%union +{ + int val; +}; + +%type a_1 a_2 a_5 + sum_of_the_five_previous_values + +%% +exp: a_1 a_2 { $$ = 3; } { $$ = $3 + 1; } a_5 + sum_of_the_five_previous_values + { + printf ("%d\n", $6); + } +; +a_1: { $$ = 1; }; +a_2: { $$ = 2; }; +a_5: { $$ = 5; }; + +sum_of_the_five_previous_values: + { + $$ = $0 + $-1 + $-2 + $-3 + $-4; + } +; + +%% +static int +yylex (void) +{ + return EOF; +} + +static void +yyerror (const char *msg) +{ + fprintf (stderr, "%s\n", msg); +} + +int +main (void) +{ + return yyparse (); +} +_ATEOF + + + +$at_traceoff +echo "actions.at:293: bison -d -v -o input.c input.y" +echo actions.at:293 >$at_check_line_file +( $at_traceon; bison -d -v -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "actions.at:293: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "actions.at:294: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS input.c \$LIBS -o input" +echo actions.at:294 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS input.c $LIBS -o input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "actions.at:294: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "actions.at:297: \$PREPARSER ./input" +echo actions.at:297 >$at_check_line_file +( $at_traceon; $PREPARSER ./input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "15 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "actions.at:297: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 42 ) # 42. actions.at:556: Printers and Destructors: + at_setup_line='actions.at:556' + at_desc='Printers and Destructors: ' + $at_quiet $ECHO_N " 42: Printers and Destructors: $ECHO_C" + at_xfail=no + ( + echo "42. actions.at:556: testing ..." + $at_traceon + + +# Make sure complex $n work. + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + +cat >input.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + + +%{ +#include +#include +#define RANGE(Location) (Location).first_line, (Location).last_line +%} +%error-verbose +%debug +%verbose +%locations +%union +{ + int ival; +} + +%{ + +static int yylex (void); +static void yyerror (const char *msg); +%} + +%type 'x' ';' thing line input + +%printer { fprintf (yyoutput, "%d@%d-%d", $$, RANGE (@$)); } + input line thing 'x' + +%destructor + { printf ("Freeing nterm input (%d@%d-%d)\n", $$, RANGE (@$)); } + input + +%destructor + { printf ("Freeing nterm line (%d@%d-%d)\n", $$, RANGE (@$)); } + line + +%destructor + { printf ("Freeing nterm thing (%d@%d-%d)\n", $$, RANGE (@$)); } + thing + +%destructor + { printf ("Freeing token 'x' (%d@%d-%d)\n", $$, RANGE (@$)); } + 'x' + +%% +input: + /* Nothing. */ + { + $$ = 0; + printf ("input (%d@%d-%d): /* Nothing */\n", $$, RANGE (@$)); + } +| line input /* Right recursive to load the stack so that popping at + EOF can be exercised. */ + { + $$ = 2; + printf ("input (%d@%d-%d): line (%d@%d-%d) input (%d@%d-%d)\n", + $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2)); + } +; + +line: + thing thing thing ';' + { + $$ = $1; + printf ("line (%d@%d-%d): thing (%d@%d-%d) thing (%d@%d-%d) thing (%d@%d-%d) ';' (%d@%d-%d)\n", + $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2), + $3, RANGE (@3), $4, RANGE (@4)); + } +| thing thing ';' + { + $$ = $1; + printf ("line (%d@%d-%d): thing (%d@%d-%d) thing (%d@%d-%d) ';' (%d@%d-%d)\n", + $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2), $3, RANGE (@3)); + } +| thing ';' + { + $$ = $1; + printf ("line (%d@%d-%d): thing (%d@%d-%d) ';' (%d@%d-%d)\n", + $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2)); + } +| error ';' + { + $$ = -1; + printf ("line (%d@%d-%d): error (@%d-%d) ';' (%d@%d-%d)\n", + $$, RANGE (@$), RANGE (@1), $2, RANGE (@2)); + } +; + +thing: + 'x' + { + $$ = $1; + printf ("thing (%d@%d-%d): 'x' (%d@%d-%d)\n", + $$, RANGE (@$), $1, RANGE (@1)); + } +; +%% +static int +yylex (void) +{ + static const unsigned int input[] = + { + /* Exercise the discarding of stack top and input until `error' + can be reduced. */ + 'x', 'x', 'x', 'x', 'x', 'x', ';', + + /* Load the stack and provoke an error that cannot be caught by + the grammar, to check that the stack is cleared. */ + 'x', 'x', ';', + 'x', ';', + 'y' + }; + static unsigned int counter = 0; + + if (counter < (sizeof(input) / sizeof (input[0]))) + { + yylval.ival = counter; + /* As in BASIC, line numbers go from 10 to 10. */ + yylloc.first_line = yylloc.first_column = 10 * counter; + yylloc.last_line = yylloc.last_column = yylloc.first_line + 9; + printf ("sending: '%c' (%d@%d-%d)\n", + input[counter], yylval.ival, RANGE (yylloc)); + return (int) input[counter++]; + + } + else + { + printf ("sending: EOF\n"); + return EOF; + } +} + +static void +yyerror (const char *msg) +{ + printf ("%d-%d: %s\n", RANGE (yylloc), msg); +} + +int +main (void) +{ + yydebug = !!getenv ("YYDEBUG"); + if (yyparse ()) + { + printf ("Parsing FAILED.\n"); + exit (1); + } + printf ("Successful parse.\n"); + return 0; +} +_ATEOF + + + +$at_traceoff +echo "actions.at:556: bison -o input.c input.y" +echo actions.at:556 >$at_check_line_file +( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "actions.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "actions.at:556: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS input.c \$LIBS -o input" +echo actions.at:556 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS input.c $LIBS -o input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "actions.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "actions.at:556: \$PREPARSER ./input" +echo actions.at:556 >$at_check_line_file +( $at_traceon; $PREPARSER ./input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "sending: 'x' (0@0-9) +thing (0@0-9): 'x' (0@0-9) +sending: 'x' (1@10-19) +thing (1@10-19): 'x' (1@10-19) +sending: 'x' (2@20-29) +thing (2@20-29): 'x' (2@20-29) +sending: 'x' (3@30-39) +30-39: syntax error, unexpected 'x', expecting ';' +Freeing nterm thing (2@20-29) +Freeing nterm thing (1@10-19) +Freeing nterm thing (0@0-9) +Freeing token 'x' (3@30-39) +sending: 'x' (4@40-49) +Freeing token 'x' (4@40-49) +sending: 'x' (5@50-59) +Freeing token 'x' (5@50-59) +sending: ';' (6@60-69) +line (-1@0-69): error (@0-59) ';' (6@60-69) +sending: 'x' (7@70-79) +thing (7@70-79): 'x' (7@70-79) +sending: 'x' (8@80-89) +thing (8@80-89): 'x' (8@80-89) +sending: ';' (9@90-99) +line (7@70-99): thing (7@70-79) thing (8@80-89) ';' (9@90-99) +sending: 'x' (10@100-109) +thing (10@100-109): 'x' (10@100-109) +sending: ';' (11@110-119) +line (10@100-119): thing (10@100-109) ';' (11@110-119) +sending: 'y' (12@120-129) +120-129: syntax error, unexpected \$undefined, expecting \$end or 'x' +sending: EOF +Freeing nterm line (10@100-119) +Freeing nterm line (7@70-99) +Freeing nterm line (-1@0-69) +Parsing FAILED. +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "actions.at:556: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 43 ) # 43. actions.at:557: Printers and Destructors: %locations %defines %skeleton "lalr1.cc" + at_setup_line='actions.at:557' + at_desc='Printers and Destructors: %locations %defines %skeleton "lalr1.cc"' + $at_quiet $ECHO_N " 43: Printers and Destructors: %locations %defines %skeleton "lalr1.cc"$ECHO_C" + at_xfail=no + ( + echo "43. actions.at:557: testing ..." + $at_traceon + + +# Make sure complex $n work. + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + +cat >input.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +%locations %defines %skeleton "lalr1.cc" +%{ +#include +#include +#define RANGE(Location) (Location).begin.line, (Location).end.line +%} +%error-verbose +%debug +%verbose +%locations +%union +{ + int ival; +} + +%{ +typedef yy::Location YYLTYPE; +static int yylex (YYSTYPE *yylval, YYLTYPE *yylloc); + +%} + +%type 'x' ';' thing line input + +%printer { fprintf (yyoutput, "%d@%d-%d", $$, RANGE (@$)); } + input line thing 'x' + +%destructor + { printf ("Freeing nterm input (%d@%d-%d)\n", $$, RANGE (@$)); } + input + +%destructor + { printf ("Freeing nterm line (%d@%d-%d)\n", $$, RANGE (@$)); } + line + +%destructor + { printf ("Freeing nterm thing (%d@%d-%d)\n", $$, RANGE (@$)); } + thing + +%destructor + { printf ("Freeing token 'x' (%d@%d-%d)\n", $$, RANGE (@$)); } + 'x' + +%% +input: + /* Nothing. */ + { + $$ = 0; + printf ("input (%d@%d-%d): /* Nothing */\n", $$, RANGE (@$)); + } +| line input /* Right recursive to load the stack so that popping at + EOF can be exercised. */ + { + $$ = 2; + printf ("input (%d@%d-%d): line (%d@%d-%d) input (%d@%d-%d)\n", + $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2)); + } +; + +line: + thing thing thing ';' + { + $$ = $1; + printf ("line (%d@%d-%d): thing (%d@%d-%d) thing (%d@%d-%d) thing (%d@%d-%d) ';' (%d@%d-%d)\n", + $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2), + $3, RANGE (@3), $4, RANGE (@4)); + } +| thing thing ';' + { + $$ = $1; + printf ("line (%d@%d-%d): thing (%d@%d-%d) thing (%d@%d-%d) ';' (%d@%d-%d)\n", + $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2), $3, RANGE (@3)); + } +| thing ';' + { + $$ = $1; + printf ("line (%d@%d-%d): thing (%d@%d-%d) ';' (%d@%d-%d)\n", + $$, RANGE (@$), $1, RANGE (@1), $2, RANGE (@2)); + } +| error ';' + { + $$ = -1; + printf ("line (%d@%d-%d): error (@%d-%d) ';' (%d@%d-%d)\n", + $$, RANGE (@$), RANGE (@1), $2, RANGE (@2)); + } +; + +thing: + 'x' + { + $$ = $1; + printf ("thing (%d@%d-%d): 'x' (%d@%d-%d)\n", + $$, RANGE (@$), $1, RANGE (@1)); + } +; +%% +static int +yylex (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + static const unsigned int input[] = + { + /* Exercise the discarding of stack top and input until `error' + can be reduced. */ + 'x', 'x', 'x', 'x', 'x', 'x', ';', + + /* Load the stack and provoke an error that cannot be caught by + the grammar, to check that the stack is cleared. */ + 'x', 'x', ';', + 'x', ';', + 'y' + }; + static unsigned int counter = 0; + + if (counter < (sizeof(input) / sizeof (input[0]))) + { + yylval->ival = counter; + /* As in BASIC, line numbers go from 10 to 10. */ + yylloc->begin.line = yylloc->begin.column = 10 * counter; + yylloc->end.line = yylloc->end.column = yylloc->begin.line + 9; + printf ("sending: '%c' (%d@%d-%d)\n", + input[counter], yylval->ival, RANGE (*yylloc)); + return (int) input[counter++]; + + } + else + { + printf ("sending: EOF\n"); + return EOF; + } +} + +/* Currently, print_ is required in C++. */ +void +yy::Parser::print_ () +{ + std::cerr << location; +} + +/* A C++ error reporting function. */ +void +yy::Parser::error_ () +{ + printf ("%d-%d: %s\n", RANGE (location), message.c_str()); +} + +static bool yydebug; +int +yyparse () +{ + yy::Parser parser (yydebug, yy::Location::Location ()); + return parser.parse (); +} + + +int +main (void) +{ + yydebug = !!getenv ("YYDEBUG"); + if (yyparse ()) + { + printf ("Parsing FAILED.\n"); + exit (1); + } + printf ("Successful parse.\n"); + return 0; +} +_ATEOF + + + +$at_traceoff +echo "actions.at:557: bison -o input.c input.y" +echo actions.at:557 >$at_check_line_file +( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "actions.at:557: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "actions.at:557: \$CXX --version || exit 77" +echo actions.at:557 >$at_check_line_file +( $at_traceon; $CXX --version || exit 77 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "actions.at:557: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "actions.at:557: \$CXX \$CXXFLAGS \$CPPFLAGS input.c -o input" +echo actions.at:557 >$at_check_line_file +( $at_traceon; $CXX $CXXFLAGS $CPPFLAGS input.c -o input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "actions.at:557: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "actions.at:557: \$PREPARSER ./input" +echo actions.at:557 >$at_check_line_file +( $at_traceon; $PREPARSER ./input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "sending: 'x' (0@0-9) +thing (0@0-9): 'x' (0@0-9) +sending: 'x' (1@10-19) +thing (1@10-19): 'x' (1@10-19) +sending: 'x' (2@20-29) +thing (2@20-29): 'x' (2@20-29) +sending: 'x' (3@30-39) +30-39: syntax error, unexpected 'x', expecting ';' +Freeing nterm thing (2@20-29) +Freeing nterm thing (1@10-19) +Freeing nterm thing (0@0-9) +Freeing token 'x' (3@30-39) +sending: 'x' (4@40-49) +Freeing token 'x' (4@40-49) +sending: 'x' (5@50-59) +Freeing token 'x' (5@50-59) +sending: ';' (6@60-69) +line (-1@0-69): error (@0-59) ';' (6@60-69) +sending: 'x' (7@70-79) +thing (7@70-79): 'x' (7@70-79) +sending: 'x' (8@80-89) +thing (8@80-89): 'x' (8@80-89) +sending: ';' (9@90-99) +line (7@70-99): thing (7@70-79) thing (8@80-89) ';' (9@90-99) +sending: 'x' (10@100-109) +thing (10@100-109): 'x' (10@100-109) +sending: ';' (11@110-119) +line (10@100-119): thing (10@100-109) ';' (11@110-119) +sending: 'y' (12@120-129) +120-129: syntax error, unexpected \$undefined, expecting \$end or 'x' +sending: EOF +Freeing nterm line (10@100-119) +Freeing nterm line (7@70-99) +Freeing nterm line (-1@0-69) +Parsing FAILED. +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "actions.at:557: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + + banner-8 ) # Banner 8. conflicts.at:20 + cat <<\_ATEOF + +Conflicts. + +_ATEOF + ;; + + 44 ) # 44. conflicts.at:32: S/R in initial + at_setup_line='conflicts.at:32' + at_desc='S/R in initial' + $at_quiet $ECHO_N " 44: S/R in initial $ECHO_C" + at_xfail=no + ( + echo "44. conflicts.at:32: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +%expect 1 +%% +exp: e 'e'; +e: 'e' | /* Nothing. */; +_ATEOF + + +$at_traceoff +echo "conflicts.at:43: bison -o input.c input.y" +echo conflicts.at:43 >$at_check_line_file +( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "input.y:4.9: warning: rule never reduced because of conflicts: e: /* empty */ +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "conflicts.at:43: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 45 ) # 45. conflicts.at:52: %nonassoc and eof + at_setup_line='conflicts.at:52' + at_desc='%nonassoc and eof' + $at_quiet $ECHO_N " 45: %nonassoc and eof $ECHO_C" + at_xfail=no + ( + echo "45. conflicts.at:52: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + + +%{ +#include +#include + +#define YYERROR_VERBOSE 1 +static void +yyerror (const char *msg) +{ + fprintf (stderr, "%s\n", msg); + exit (1); +} + +/* The current argument. */ +static const char *input = NULL; + +static int +yylex (void) +{ + /* No token stands for end of file. */ + if (input && *input) + return *input++; + else + return 0; +} + +%} + +%nonassoc '<' '>' + +%% +expr: expr '<' expr + | expr '>' expr + | '0' + ; +%% +int +main (int argc, const char *argv[]) +{ + if (argc > 1) + input = argv[1]; + return yyparse (); +} +_ATEOF + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "conflicts.at:101: bison -o input.c input.y" +echo conflicts.at:101 >$at_check_line_file +( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "conflicts.at:101: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "conflicts.at:102: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS input.c \$LIBS -o input" +echo conflicts.at:102 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS input.c $LIBS -o input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "conflicts.at:102: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "conflicts.at:104: \$PREPARSER ./input '0<0'" +echo conflicts.at:104 >$at_check_line_file +( $at_traceon; $PREPARSER ./input '0<0' ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "conflicts.at:104: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +# FIXME: This is an actual bug, but a new one, in the sense that +# no one has ever spotted it! The messages are *wrong*: there should +# be nothing there, it should be expected eof. +$at_traceoff +echo "conflicts.at:110: \$PREPARSER ./input '0<0<0'" +echo conflicts.at:110 >$at_check_line_file +( $at_traceon; $PREPARSER ./input '0<0<0' ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "syntax error, unexpected '<', expecting '<' or '>' +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "conflicts.at:110: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "conflicts.at:112: \$PREPARSER ./input '0>0'" +echo conflicts.at:112 >$at_check_line_file +( $at_traceon; $PREPARSER ./input '0>0' ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "conflicts.at:112: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "conflicts.at:115: \$PREPARSER ./input '0>0>0'" +echo conflicts.at:115 >$at_check_line_file +( $at_traceon; $PREPARSER ./input '0>0>0' ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "syntax error, unexpected '>', expecting '<' or '>' +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "conflicts.at:115: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "conflicts.at:119: \$PREPARSER ./input '0<0>0'" +echo conflicts.at:119 >$at_check_line_file +( $at_traceon; $PREPARSER ./input '0<0>0' ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "syntax error, unexpected '>', expecting '<' or '>' +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "conflicts.at:119: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 46 ) # 46. conflicts.at:129: Unresolved SR Conflicts + at_setup_line='conflicts.at:129' + at_desc='Unresolved SR Conflicts' + $at_quiet $ECHO_N " 46: Unresolved SR Conflicts $ECHO_C" + at_xfail=no + ( + echo "46. conflicts.at:129: testing ..." + $at_traceon + + + + +cat >input.y <<'_ATEOF' +%token NUM OP +%% +exp: exp OP exp | NUM; +_ATEOF + + +$at_traceoff +echo "conflicts.at:141: bison -o input.c --report=all input.y" +echo conflicts.at:141 >$at_check_line_file +( $at_traceon; bison -o input.c --report=all input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "input.y: conflicts: 1 shift/reduce +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "conflicts.at:141: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Check the contents of the report. +$at_traceoff +echo "conflicts.at:226: cat input.output" +echo conflicts.at:226 >$at_check_line_file +( $at_traceon; cat input.output ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "State 5 conflicts: 1 shift/reduce + + +Grammar + + 0 \$accept: exp \$end + + 1 exp: exp OP exp + 2 | NUM + + +Terminals, with rules where they appear + +\$end (0) 0 +error (256) +NUM (258) 2 +OP (259) 1 + + +Nonterminals, with rules where they appear + +\$accept (5) + on left: 0 +exp (6) + on left: 1 2, on right: 0 1 + + +state 0 + + 0 \$accept: . exp \$end + 1 exp: . exp OP exp + 2 | . NUM + + NUM shift, and go to state 1 + + exp go to state 2 + + +state 1 + + 2 exp: NUM . + + \$default reduce using rule 2 (exp) + + +state 2 + + 0 \$accept: exp . \$end + 1 exp: exp . OP exp + + \$end shift, and go to state 3 + OP shift, and go to state 4 + + +state 3 + + 0 \$accept: exp \$end . + + \$default accept + + +state 4 + + 1 exp: . exp OP exp + 1 | exp OP . exp + 2 | . NUM + + NUM shift, and go to state 1 + + exp go to state 5 + + +state 5 + + 1 exp: exp . OP exp [\$end, OP] + 1 | exp OP exp . [\$end, OP] + + OP shift, and go to state 4 + + OP [reduce using rule 1 (exp)] + \$default reduce using rule 1 (exp) +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "conflicts.at:226: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 47 ) # 47. conflicts.at:236: Resolved SR Conflicts + at_setup_line='conflicts.at:236' + at_desc='Resolved SR Conflicts' + $at_quiet $ECHO_N " 47: Resolved SR Conflicts $ECHO_C" + at_xfail=no + ( + echo "47. conflicts.at:236: testing ..." + $at_traceon + + + + +cat >input.y <<'_ATEOF' +%token NUM OP +%left OP +%% +exp: exp OP exp | NUM; +_ATEOF + + +$at_traceoff +echo "conflicts.at:247: bison -o input.c --report=all input.y" +echo conflicts.at:247 >$at_check_line_file +( $at_traceon; bison -o input.c --report=all input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "conflicts.at:247: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Check the contents of the report. +$at_traceoff +echo "conflicts.at:328: cat input.output" +echo conflicts.at:328 >$at_check_line_file +( $at_traceon; cat input.output ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "Grammar + + 0 \$accept: exp \$end + + 1 exp: exp OP exp + 2 | NUM + + +Terminals, with rules where they appear + +\$end (0) 0 +error (256) +NUM (258) 2 +OP (259) 1 + + +Nonterminals, with rules where they appear + +\$accept (5) + on left: 0 +exp (6) + on left: 1 2, on right: 0 1 + + +state 0 + + 0 \$accept: . exp \$end + 1 exp: . exp OP exp + 2 | . NUM + + NUM shift, and go to state 1 + + exp go to state 2 + + +state 1 + + 2 exp: NUM . + + \$default reduce using rule 2 (exp) + + +state 2 + + 0 \$accept: exp . \$end + 1 exp: exp . OP exp + + \$end shift, and go to state 3 + OP shift, and go to state 4 + + +state 3 + + 0 \$accept: exp \$end . + + \$default accept + + +state 4 + + 1 exp: . exp OP exp + 1 | exp OP . exp + 2 | . NUM + + NUM shift, and go to state 1 + + exp go to state 5 + + +state 5 + + 1 exp: exp . OP exp [\$end, OP] + 1 | exp OP exp . [\$end, OP] + + \$default reduce using rule 1 (exp) + + Conflict between rule 1 and token OP resolved as reduce (%left OP). +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "conflicts.at:328: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 48 ) # 48. conflicts.at:358: Defaulted Conflicted Reduction + at_setup_line='conflicts.at:358' + at_desc='Defaulted Conflicted Reduction' + $at_quiet $ECHO_N " 48: Defaulted Conflicted Reduction $ECHO_C" + at_xfail=no + ( + echo "48. conflicts.at:358: testing ..." + $at_traceon + + + +cat >input.y <<'_ATEOF' +%% +exp: num | id; +num: '0'; +id : '0'; +%% +_ATEOF + + +$at_traceoff +echo "conflicts.at:372: bison -o input.c --report=all input.y" +echo conflicts.at:372 >$at_check_line_file +( $at_traceon; bison -o input.c --report=all input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "input.y: conflicts: 1 reduce/reduce +input.y:4.6-8: warning: rule never reduced because of conflicts: id: '0' +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "conflicts.at:372: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Check the contents of the report. +$at_traceoff +echo "conflicts.at:466: cat input.output" +echo conflicts.at:466 >$at_check_line_file +( $at_traceon; cat input.output ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "Rules never reduced + + 4 id: '0' + + +State 1 conflicts: 1 reduce/reduce + + +Grammar + + 0 \$accept: exp \$end + + 1 exp: num + 2 | id + + 3 num: '0' + + 4 id: '0' + + +Terminals, with rules where they appear + +\$end (0) 0 +'0' (48) 3 4 +error (256) + + +Nonterminals, with rules where they appear + +\$accept (4) + on left: 0 +exp (5) + on left: 1 2, on right: 0 +num (6) + on left: 3, on right: 1 +id (7) + on left: 4, on right: 2 + + +state 0 + + 0 \$accept: . exp \$end + 1 exp: . num + 2 | . id + 3 num: . '0' + 4 id: . '0' + + '0' shift, and go to state 1 + + exp go to state 2 + num go to state 3 + id go to state 4 + + +state 1 + + 3 num: '0' . [\$end] + 4 id: '0' . [\$end] + + \$end reduce using rule 3 (num) + \$end [reduce using rule 4 (id)] + \$default reduce using rule 3 (num) + + +state 2 + + 0 \$accept: exp . \$end + + \$end shift, and go to state 5 + + +state 3 + + 1 exp: num . + + \$default reduce using rule 1 (exp) + + +state 4 + + 2 exp: id . + + \$default reduce using rule 2 (exp) + + +state 5 + + 0 \$accept: exp \$end . + + \$default accept +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "conflicts.at:466: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 49 ) # 49. conflicts.at:477: %expect not enough + at_setup_line='conflicts.at:477' + at_desc='%expect not enough' + $at_quiet $ECHO_N " 49: %expect not enough $ECHO_C" + at_xfail=no + ( + echo "49. conflicts.at:477: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +%token NUM OP +%expect 0 +%% +exp: exp OP exp | NUM; +_ATEOF + + +$at_traceoff +echo "conflicts.at:489: bison -o input.c input.y" +echo conflicts.at:489 >$at_check_line_file +( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "input.y: conflicts: 1 shift/reduce +input.y: warning: expected 0 shift/reduce conflicts +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "conflicts.at:489: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 50 ) # 50. conflicts.at:497: %expect right + at_setup_line='conflicts.at:497' + at_desc='%expect right' + $at_quiet $ECHO_N " 50: %expect right $ECHO_C" + at_xfail=no + ( + echo "50. conflicts.at:497: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +%token NUM OP +%expect 1 +%% +exp: exp OP exp | NUM; +_ATEOF + + +$at_traceoff +echo "conflicts.at:506: bison -o input.c input.y" +echo conflicts.at:506 >$at_check_line_file +( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "conflicts.at:506: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 51 ) # 51. conflicts.at:514: %expect too much + at_setup_line='conflicts.at:514' + at_desc='%expect too much' + $at_quiet $ECHO_N " 51: %expect too much $ECHO_C" + at_xfail=no + ( + echo "51. conflicts.at:514: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +%token NUM OP +%expect 2 +%% +exp: exp OP exp | NUM; +_ATEOF + + +$at_traceoff +echo "conflicts.at:526: bison -o input.c input.y" +echo conflicts.at:526 >$at_check_line_file +( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "input.y: conflicts: 1 shift/reduce +input.y: warning: expected 2 shift/reduce conflicts +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "conflicts.at:526: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 52 ) # 52. conflicts.at:534: %expect with reduce conflicts + at_setup_line='conflicts.at:534' + at_desc='%expect with reduce conflicts' + $at_quiet $ECHO_N " 52: %expect with reduce conflicts $ECHO_C" + at_xfail=no + ( + echo "52. conflicts.at:534: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +%expect 0 +%% +program: a 'a' | a a; +a: 'a'; +_ATEOF + + +$at_traceoff +echo "conflicts.at:546: bison -o input.c input.y" +echo conflicts.at:546 >$at_check_line_file +( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "input.y: conflicts: 1 reduce/reduce +input.y: warning: expected 0 reduce/reduce conflicts +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "conflicts.at:546: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 53 ) # 53. conflicts.at:554: %no-default-prec without %prec + at_setup_line='conflicts.at:554' + at_desc='%no-default-prec without %prec' + $at_quiet $ECHO_N " 53: %no-default-prec without %prec $ECHO_C" + at_xfail=no + ( + echo "53. conflicts.at:554: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +%left '+' +%left '*' + +%% + +%no-default-prec; + +e: e '+' e + | e '*' e + | '0' + ; +_ATEOF + + +$at_traceoff +echo "conflicts.at:572: bison -o input.c input.y" +echo conflicts.at:572 >$at_check_line_file +( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "input.y: conflicts: 4 shift/reduce +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "conflicts.at:572: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 54 ) # 54. conflicts.at:580: %no-default-prec with %prec + at_setup_line='conflicts.at:580' + at_desc='%no-default-prec with %prec' + $at_quiet $ECHO_N " 54: %no-default-prec with %prec $ECHO_C" + at_xfail=no + ( + echo "54. conflicts.at:580: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +%left '+' +%left '*' + +%% + +%no-default-prec; + +e: e '+' e %prec '+' + | e '*' e %prec '*' + | '0' + ; +_ATEOF + + +$at_traceoff +echo "conflicts.at:596: bison -o input.c input.y" +echo conflicts.at:596 >$at_check_line_file +( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "conflicts.at:596: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 55 ) # 55. conflicts.at:604: %default-prec + at_setup_line='conflicts.at:604' + at_desc='%default-prec' + $at_quiet $ECHO_N " 55: %default-prec $ECHO_C" + at_xfail=no + ( + echo "55. conflicts.at:604: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +%left '+' +%left '*' + +%% + +%default-prec; + +e: e '+' e + | e '*' e + | '0' + ; +_ATEOF + + +$at_traceoff +echo "conflicts.at:620: bison -o input.c input.y" +echo conflicts.at:620 >$at_check_line_file +( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "conflicts.at:620: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + + banner-9 ) # Banner 9. calc.at:532 + cat <<\_ATEOF + +Simple LALR Calculator. + +_ATEOF + ;; + + 56 ) # 56. calc.at:541: Calculator + at_setup_line='calc.at:541' + at_desc='Calculator ' + $at_quiet $ECHO_N " 56: Calculator $ECHO_C" + at_xfail=no + ( + echo "56. calc.at:541: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ + +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (void); +static int yygetc (void); +static void yyungetc ( int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%s\n", s); +} + + + +static int +yygetc (void) +{ + int res = getc (yyin); + ; + + return res; +} + + +static void +yyungetc ( int c) +{ + ; + + ungetc (c, yyin); +} + +static int +read_signed_integer (void) +{ + int c = yygetc (); + int sign = 1; + int n = 0; + + ; + if (c == '-') + { + c = yygetc (); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (); + } + + yyungetc ( c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (void) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + } + + + + /* Skip white space. */ + while ((c = yygetc ()) == ' ' || c == '\t') + { + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc ( c); + (yylval).ival = read_signed_integer (); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:541: bison -o calc.c calc.y" +echo calc.at:541 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:541: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:541: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:541 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:541: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:541: \$PREPARSER ./calc input" +echo calc.at:541 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:541: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:541: \$PREPARSER ./calc input" +echo calc.at:541 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:541: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:541: cat stderr" +echo calc.at:541 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:541: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:541: \$PREPARSER ./calc input" +echo calc.at:541 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:541: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:541: cat stderr" +echo calc.at:541 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:541: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:541: \$PREPARSER ./calc input" +echo calc.at:541 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:541: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:541: cat stderr" +echo calc.at:541 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:541: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:541: \$PREPARSER ./calc input" +echo calc.at:541 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:541: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:541: cat stderr" +echo calc.at:541 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:541: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:541: \$PREPARSER ./calc input" +echo calc.at:541 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:541: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:541: cat stderr" +echo calc.at:541 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:541: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:541: \$PREPARSER ./calc /dev/null" +echo calc.at:541 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:541: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:541: cat stderr" +echo calc.at:541 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:541: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:541: \$PREPARSER ./calc input" +echo calc.at:541 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:541: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:541: cat stderr" +echo calc.at:541 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:541: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:541: \$PREPARSER ./calc input" +echo calc.at:541 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:541: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:541: cat stderr" +echo calc.at:541 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:541: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:541: \$PREPARSER ./calc input" +echo calc.at:541 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:541: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:541: cat stderr" +echo calc.at:541 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:541: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 57 ) # 57. calc.at:543: Calculator %defines + at_setup_line='calc.at:543' + at_desc='Calculator %defines' + $at_quiet $ECHO_N " 57: Calculator %defines $ECHO_C" + at_xfail=no + ( + echo "57. calc.at:543: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%defines +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (void); +static int yygetc (void); +static void yyungetc ( int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%s\n", s); +} + + + +static int +yygetc (void) +{ + int res = getc (yyin); + ; + + return res; +} + + +static void +yyungetc ( int c) +{ + ; + + ungetc (c, yyin); +} + +static int +read_signed_integer (void) +{ + int c = yygetc (); + int sign = 1; + int n = 0; + + ; + if (c == '-') + { + c = yygetc (); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (); + } + + yyungetc ( c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (void) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + } + + + + /* Skip white space. */ + while ((c = yygetc ()) == ' ' || c == '\t') + { + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc ( c); + (yylval).ival = read_signed_integer (); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:543: bison -o calc.c calc.y" +echo calc.at:543 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:543: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:543: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:543 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:543: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:543: \$PREPARSER ./calc input" +echo calc.at:543 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:543: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:543: \$PREPARSER ./calc input" +echo calc.at:543 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:543: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:543: cat stderr" +echo calc.at:543 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:543: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:543: \$PREPARSER ./calc input" +echo calc.at:543 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:543: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:543: cat stderr" +echo calc.at:543 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:543: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:543: \$PREPARSER ./calc input" +echo calc.at:543 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:543: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:543: cat stderr" +echo calc.at:543 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:543: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:543: \$PREPARSER ./calc input" +echo calc.at:543 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:543: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:543: cat stderr" +echo calc.at:543 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:543: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:543: \$PREPARSER ./calc input" +echo calc.at:543 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:543: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:543: cat stderr" +echo calc.at:543 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:543: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:543: \$PREPARSER ./calc /dev/null" +echo calc.at:543 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:543: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:543: cat stderr" +echo calc.at:543 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:543: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:543: \$PREPARSER ./calc input" +echo calc.at:543 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:543: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:543: cat stderr" +echo calc.at:543 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:543: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:543: \$PREPARSER ./calc input" +echo calc.at:543 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:543: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:543: cat stderr" +echo calc.at:543 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:543: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:543: \$PREPARSER ./calc input" +echo calc.at:543 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:543: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:543: cat stderr" +echo calc.at:543 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:543: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 58 ) # 58. calc.at:544: Calculator %locations + at_setup_line='calc.at:544' + at_desc='Calculator %locations' + $at_quiet $ECHO_N " 58: Calculator %locations $ECHO_C" + at_xfail=no + ( + echo "58. calc.at:544: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%locations +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (void); +static int yygetc (void); +static void yyungetc ( int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%d.%d", + (yylloc).first_line, (yylloc).first_column); + if ((yylloc).first_line != (yylloc).last_line) + fprintf (stderr, "-%d.%d", + (yylloc).last_line, (yylloc).last_column - 1); + else if ((yylloc).first_column != (yylloc).last_column - 1) + fprintf (stderr, "-%d", + (yylloc).last_column - 1); + fprintf (stderr, ": "); + fprintf (stderr, "%s\n", s); +} + + + +static YYLTYPE last_yylloc; + +static int +yygetc (void) +{ + int res = getc (yyin); + ; + + last_yylloc = (yylloc); + if (res == '\n') + { + (yylloc).last_line++; + (yylloc).last_column = 0; + } + else + (yylloc).last_column++; + + return res; +} + + +static void +yyungetc ( int c) +{ + ; + + /* Wrong when C == `\n'. */ + (yylloc) = last_yylloc; + + ungetc (c, yyin); +} + +static int +read_signed_integer (void) +{ + int c = yygetc (); + int sign = 1; + int n = 0; + + ; + if (c == '-') + { + c = yygetc (); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (); + } + + yyungetc ( c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (void) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + (yylloc).last_column = 0; + (yylloc).last_line = 1; + + } + + (yylloc).first_column = (yylloc).last_column; + (yylloc).first_line = (yylloc).last_line; + + + /* Skip white space. */ + while ((c = yygetc ()) == ' ' || c == '\t') + { + (yylloc).first_column = (yylloc).last_column; + (yylloc).first_line = (yylloc).last_line; + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc ( c); + (yylval).ival = read_signed_integer (); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:544: bison -o calc.c calc.y" +echo calc.at:544 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:544: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:544: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:544 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:544: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:544: \$PREPARSER ./calc input" +echo calc.at:544 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:544: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:544: \$PREPARSER ./calc input" +echo calc.at:544 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:544: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:544: cat stderr" +echo calc.at:544 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:544: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:544: \$PREPARSER ./calc input" +echo calc.at:544 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:544: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:544: cat stderr" +echo calc.at:544 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:544: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:544: \$PREPARSER ./calc input" +echo calc.at:544 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:544: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:544: cat stderr" +echo calc.at:544 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:544: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:544: \$PREPARSER ./calc input" +echo calc.at:544 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:544: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:544: cat stderr" +echo calc.at:544 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:544: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:544: \$PREPARSER ./calc input" +echo calc.at:544 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:544: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:544: cat stderr" +echo calc.at:544 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:544: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:544: \$PREPARSER ./calc /dev/null" +echo calc.at:544 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:544: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:544: cat stderr" +echo calc.at:544 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:544: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:544: \$PREPARSER ./calc input" +echo calc.at:544 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:544: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:544: cat stderr" +echo calc.at:544 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:544: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:544: \$PREPARSER ./calc input" +echo calc.at:544 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:544: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:544: cat stderr" +echo calc.at:544 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:544: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:544: \$PREPARSER ./calc input" +echo calc.at:544 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:544: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:544: cat stderr" +echo calc.at:544 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:544: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 59 ) # 59. calc.at:545: Calculator %name-prefix="calc" + at_setup_line='calc.at:545' + at_desc='Calculator %name-prefix="calc"' + $at_quiet $ECHO_N " 59: Calculator %name-prefix="calc" $ECHO_C" + at_xfail=no + ( + echo "59. calc.at:545: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%name-prefix="calc" +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (void); +static int yygetc (void); +static void yyungetc ( int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%s\n", s); +} + + + +static int +yygetc (void) +{ + int res = getc (yyin); + ; + + return res; +} + + +static void +yyungetc ( int c) +{ + ; + + ungetc (c, yyin); +} + +static int +read_signed_integer (void) +{ + int c = yygetc (); + int sign = 1; + int n = 0; + + ; + if (c == '-') + { + c = yygetc (); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (); + } + + yyungetc ( c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (void) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + } + + + + /* Skip white space. */ + while ((c = yygetc ()) == ' ' || c == '\t') + { + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc ( c); + (yylval).ival = read_signed_integer (); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:545: bison -o calc.c calc.y" +echo calc.at:545 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:545: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:545: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:545 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:545: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:545: \$PREPARSER ./calc input" +echo calc.at:545 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:545: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:545: \$PREPARSER ./calc input" +echo calc.at:545 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:545: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:545: cat stderr" +echo calc.at:545 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:545: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:545: \$PREPARSER ./calc input" +echo calc.at:545 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:545: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:545: cat stderr" +echo calc.at:545 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:545: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:545: \$PREPARSER ./calc input" +echo calc.at:545 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:545: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:545: cat stderr" +echo calc.at:545 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:545: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:545: \$PREPARSER ./calc input" +echo calc.at:545 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:545: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:545: cat stderr" +echo calc.at:545 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:545: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:545: \$PREPARSER ./calc input" +echo calc.at:545 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:545: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:545: cat stderr" +echo calc.at:545 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:545: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:545: \$PREPARSER ./calc /dev/null" +echo calc.at:545 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:545: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:545: cat stderr" +echo calc.at:545 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:545: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:545: \$PREPARSER ./calc input" +echo calc.at:545 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:545: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:545: cat stderr" +echo calc.at:545 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:545: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:545: \$PREPARSER ./calc input" +echo calc.at:545 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:545: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:545: cat stderr" +echo calc.at:545 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:545: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:545: \$PREPARSER ./calc input" +echo calc.at:545 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:545: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:545: cat stderr" +echo calc.at:545 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:545: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 60 ) # 60. calc.at:546: Calculator %verbose + at_setup_line='calc.at:546' + at_desc='Calculator %verbose' + $at_quiet $ECHO_N " 60: Calculator %verbose $ECHO_C" + at_xfail=no + ( + echo "60. calc.at:546: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%verbose +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (void); +static int yygetc (void); +static void yyungetc ( int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%s\n", s); +} + + + +static int +yygetc (void) +{ + int res = getc (yyin); + ; + + return res; +} + + +static void +yyungetc ( int c) +{ + ; + + ungetc (c, yyin); +} + +static int +read_signed_integer (void) +{ + int c = yygetc (); + int sign = 1; + int n = 0; + + ; + if (c == '-') + { + c = yygetc (); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (); + } + + yyungetc ( c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (void) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + } + + + + /* Skip white space. */ + while ((c = yygetc ()) == ' ' || c == '\t') + { + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc ( c); + (yylval).ival = read_signed_integer (); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:546: bison -o calc.c calc.y" +echo calc.at:546 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:546: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:546: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:546 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:546: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:546: \$PREPARSER ./calc input" +echo calc.at:546 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:546: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:546: \$PREPARSER ./calc input" +echo calc.at:546 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:546: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:546: cat stderr" +echo calc.at:546 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:546: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:546: \$PREPARSER ./calc input" +echo calc.at:546 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:546: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:546: cat stderr" +echo calc.at:546 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:546: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:546: \$PREPARSER ./calc input" +echo calc.at:546 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:546: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:546: cat stderr" +echo calc.at:546 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:546: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:546: \$PREPARSER ./calc input" +echo calc.at:546 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:546: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:546: cat stderr" +echo calc.at:546 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:546: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:546: \$PREPARSER ./calc input" +echo calc.at:546 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:546: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:546: cat stderr" +echo calc.at:546 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:546: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:546: \$PREPARSER ./calc /dev/null" +echo calc.at:546 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:546: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:546: cat stderr" +echo calc.at:546 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:546: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:546: \$PREPARSER ./calc input" +echo calc.at:546 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:546: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:546: cat stderr" +echo calc.at:546 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:546: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:546: \$PREPARSER ./calc input" +echo calc.at:546 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:546: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:546: cat stderr" +echo calc.at:546 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:546: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:546: \$PREPARSER ./calc input" +echo calc.at:546 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:546: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:546: cat stderr" +echo calc.at:546 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:546: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 61 ) # 61. calc.at:547: Calculator %yacc + at_setup_line='calc.at:547' + at_desc='Calculator %yacc' + $at_quiet $ECHO_N " 61: Calculator %yacc $ECHO_C" + at_xfail=no + ( + echo "61. calc.at:547: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%yacc +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (void); +static int yygetc (void); +static void yyungetc ( int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%s\n", s); +} + + + +static int +yygetc (void) +{ + int res = getc (yyin); + ; + + return res; +} + + +static void +yyungetc ( int c) +{ + ; + + ungetc (c, yyin); +} + +static int +read_signed_integer (void) +{ + int c = yygetc (); + int sign = 1; + int n = 0; + + ; + if (c == '-') + { + c = yygetc (); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (); + } + + yyungetc ( c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (void) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + } + + + + /* Skip white space. */ + while ((c = yygetc ()) == ' ' || c == '\t') + { + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc ( c); + (yylval).ival = read_signed_integer (); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:547: bison -o calc.c calc.y" +echo calc.at:547 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:547: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:547: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:547 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:547: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:547: \$PREPARSER ./calc input" +echo calc.at:547 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:547: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:547: \$PREPARSER ./calc input" +echo calc.at:547 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:547: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:547: cat stderr" +echo calc.at:547 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:547: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:547: \$PREPARSER ./calc input" +echo calc.at:547 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:547: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:547: cat stderr" +echo calc.at:547 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:547: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:547: \$PREPARSER ./calc input" +echo calc.at:547 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:547: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:547: cat stderr" +echo calc.at:547 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:547: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:547: \$PREPARSER ./calc input" +echo calc.at:547 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:547: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:547: cat stderr" +echo calc.at:547 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:547: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:547: \$PREPARSER ./calc input" +echo calc.at:547 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:547: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:547: cat stderr" +echo calc.at:547 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:547: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:547: \$PREPARSER ./calc /dev/null" +echo calc.at:547 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:547: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:547: cat stderr" +echo calc.at:547 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:547: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:547: \$PREPARSER ./calc input" +echo calc.at:547 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:547: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:547: cat stderr" +echo calc.at:547 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:547: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:547: \$PREPARSER ./calc input" +echo calc.at:547 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:547: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:547: cat stderr" +echo calc.at:547 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:547: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:547: \$PREPARSER ./calc input" +echo calc.at:547 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:547: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:547: cat stderr" +echo calc.at:547 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:547: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 62 ) # 62. calc.at:548: Calculator %error-verbose + at_setup_line='calc.at:548' + at_desc='Calculator %error-verbose' + $at_quiet $ECHO_N " 62: Calculator %error-verbose $ECHO_C" + at_xfail=no + ( + echo "62. calc.at:548: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%error-verbose +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (void); +static int yygetc (void); +static void yyungetc ( int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%s\n", s); +} + + + +static int +yygetc (void) +{ + int res = getc (yyin); + ; + + return res; +} + + +static void +yyungetc ( int c) +{ + ; + + ungetc (c, yyin); +} + +static int +read_signed_integer (void) +{ + int c = yygetc (); + int sign = 1; + int n = 0; + + ; + if (c == '-') + { + c = yygetc (); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (); + } + + yyungetc ( c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (void) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + } + + + + /* Skip white space. */ + while ((c = yygetc ()) == ' ' || c == '\t') + { + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc ( c); + (yylval).ival = read_signed_integer (); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:548: bison -o calc.c calc.y" +echo calc.at:548 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:548: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:548: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:548 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:548: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:548: \$PREPARSER ./calc input" +echo calc.at:548 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:548: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:548: \$PREPARSER ./calc input" +echo calc.at:548 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:548: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:548: cat stderr" +echo calc.at:548 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:548: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:548: \$PREPARSER ./calc input" +echo calc.at:548 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:548: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:548: cat stderr" +echo calc.at:548 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:548: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:548: \$PREPARSER ./calc input" +echo calc.at:548 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:548: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:548: cat stderr" +echo calc.at:548 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:548: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:548: \$PREPARSER ./calc input" +echo calc.at:548 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:548: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:548: cat stderr" +echo calc.at:548 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:548: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:548: \$PREPARSER ./calc input" +echo calc.at:548 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:548: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:548: cat stderr" +echo calc.at:548 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:548: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:548: \$PREPARSER ./calc /dev/null" +echo calc.at:548 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:548: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:548: cat stderr" +echo calc.at:548 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:548: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:548: \$PREPARSER ./calc input" +echo calc.at:548 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:548: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:548: cat stderr" +echo calc.at:548 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:548: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:548: \$PREPARSER ./calc input" +echo calc.at:548 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:548: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:548: cat stderr" +echo calc.at:548 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:548: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:548: \$PREPARSER ./calc input" +echo calc.at:548 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:548: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:548: cat stderr" +echo calc.at:548 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:548: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 63 ) # 63. calc.at:550: Calculator %pure-parser %locations + at_setup_line='calc.at:550' + at_desc='Calculator %pure-parser %locations' + $at_quiet $ECHO_N " 63: Calculator %pure-parser %locations $ECHO_C" + at_xfail=no + ( + echo "63. calc.at:550: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%pure-parser %locations +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (YYSTYPE *yylval, YYLTYPE *yylloc); +static int yygetc (YYSTYPE *yylval, YYLTYPE *yylloc); +static void yyungetc (YYSTYPE *yylval, YYLTYPE *yylloc, int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%s\n", s); +} + + + +static YYLTYPE last_yylloc; + +static int +yygetc (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + int res = getc (yyin); + (void) yylval;(void) yylloc; + + last_yylloc = (*yylloc); + if (res == '\n') + { + (*yylloc).last_line++; + (*yylloc).last_column = 0; + } + else + (*yylloc).last_column++; + + return res; +} + + +static void +yyungetc (YYSTYPE *yylval, YYLTYPE *yylloc, int c) +{ + (void) yylval;(void) yylloc; + + /* Wrong when C == `\n'. */ + (*yylloc) = last_yylloc; + + ungetc (c, yyin); +} + +static int +read_signed_integer (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + int c = yygetc (yylval, yylloc); + int sign = 1; + int n = 0; + + (void) yylval;(void) yylloc; + if (c == '-') + { + c = yygetc (yylval, yylloc); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (yylval, yylloc); + } + + yyungetc (yylval, yylloc, c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + (*yylloc).last_column = 0; + (*yylloc).last_line = 1; + + } + + (*yylloc).first_column = (*yylloc).last_column; + (*yylloc).first_line = (*yylloc).last_line; + + + /* Skip white space. */ + while ((c = yygetc (yylval, yylloc)) == ' ' || c == '\t') + { + (*yylloc).first_column = (*yylloc).last_column; + (*yylloc).first_line = (*yylloc).last_line; + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc (yylval, yylloc, c); + (*yylval).ival = read_signed_integer (yylval, yylloc); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:550: bison -o calc.c calc.y" +echo calc.at:550 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:550: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:550: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:550 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:550: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:550: \$PREPARSER ./calc input" +echo calc.at:550 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:550: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:550: \$PREPARSER ./calc input" +echo calc.at:550 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:550: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:550: cat stderr" +echo calc.at:550 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:550: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:550: \$PREPARSER ./calc input" +echo calc.at:550 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:550: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:550: cat stderr" +echo calc.at:550 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:550: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:550: \$PREPARSER ./calc input" +echo calc.at:550 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:550: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:550: cat stderr" +echo calc.at:550 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:550: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:550: \$PREPARSER ./calc input" +echo calc.at:550 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:550: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:550: cat stderr" +echo calc.at:550 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:550: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:550: \$PREPARSER ./calc input" +echo calc.at:550 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:550: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:550: cat stderr" +echo calc.at:550 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:550: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:550: \$PREPARSER ./calc /dev/null" +echo calc.at:550 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:550: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:550: cat stderr" +echo calc.at:550 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:550: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:550: \$PREPARSER ./calc input" +echo calc.at:550 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:550: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:550: cat stderr" +echo calc.at:550 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:550: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:550: \$PREPARSER ./calc input" +echo calc.at:550 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:550: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:550: cat stderr" +echo calc.at:550 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:550: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:550: \$PREPARSER ./calc input" +echo calc.at:550 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:550: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:550: cat stderr" +echo calc.at:550 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:550: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 64 ) # 64. calc.at:551: Calculator %error-verbose %locations + at_setup_line='calc.at:551' + at_desc='Calculator %error-verbose %locations' + $at_quiet $ECHO_N " 64: Calculator %error-verbose %locations $ECHO_C" + at_xfail=no + ( + echo "64. calc.at:551: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%error-verbose %locations +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (void); +static int yygetc (void); +static void yyungetc ( int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%d.%d", + (yylloc).first_line, (yylloc).first_column); + if ((yylloc).first_line != (yylloc).last_line) + fprintf (stderr, "-%d.%d", + (yylloc).last_line, (yylloc).last_column - 1); + else if ((yylloc).first_column != (yylloc).last_column - 1) + fprintf (stderr, "-%d", + (yylloc).last_column - 1); + fprintf (stderr, ": "); + fprintf (stderr, "%s\n", s); +} + + + +static YYLTYPE last_yylloc; + +static int +yygetc (void) +{ + int res = getc (yyin); + ; + + last_yylloc = (yylloc); + if (res == '\n') + { + (yylloc).last_line++; + (yylloc).last_column = 0; + } + else + (yylloc).last_column++; + + return res; +} + + +static void +yyungetc ( int c) +{ + ; + + /* Wrong when C == `\n'. */ + (yylloc) = last_yylloc; + + ungetc (c, yyin); +} + +static int +read_signed_integer (void) +{ + int c = yygetc (); + int sign = 1; + int n = 0; + + ; + if (c == '-') + { + c = yygetc (); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (); + } + + yyungetc ( c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (void) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + (yylloc).last_column = 0; + (yylloc).last_line = 1; + + } + + (yylloc).first_column = (yylloc).last_column; + (yylloc).first_line = (yylloc).last_line; + + + /* Skip white space. */ + while ((c = yygetc ()) == ' ' || c == '\t') + { + (yylloc).first_column = (yylloc).last_column; + (yylloc).first_line = (yylloc).last_line; + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc ( c); + (yylval).ival = read_signed_integer (); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:551: bison -o calc.c calc.y" +echo calc.at:551 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:551: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:551: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:551 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:551: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:551: \$PREPARSER ./calc input" +echo calc.at:551 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:551: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:551: \$PREPARSER ./calc input" +echo calc.at:551 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:551: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:551: cat stderr" +echo calc.at:551 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:551: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:551: \$PREPARSER ./calc input" +echo calc.at:551 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:551: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:551: cat stderr" +echo calc.at:551 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:551: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:551: \$PREPARSER ./calc input" +echo calc.at:551 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:551: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:551: cat stderr" +echo calc.at:551 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:551: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:551: \$PREPARSER ./calc input" +echo calc.at:551 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:551: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:551: cat stderr" +echo calc.at:551 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:551: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:551: \$PREPARSER ./calc input" +echo calc.at:551 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:551: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:551: cat stderr" +echo calc.at:551 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:551: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:551: \$PREPARSER ./calc /dev/null" +echo calc.at:551 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:551: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:551: cat stderr" +echo calc.at:551 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:551: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:551: \$PREPARSER ./calc input" +echo calc.at:551 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:551: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:551: cat stderr" +echo calc.at:551 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:551: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:551: \$PREPARSER ./calc input" +echo calc.at:551 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:551: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:551: cat stderr" +echo calc.at:551 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:551: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:551: \$PREPARSER ./calc input" +echo calc.at:551 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:551: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:551: cat stderr" +echo calc.at:551 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:551: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 65 ) # 65. calc.at:553: Calculator %error-verbose %locations %defines %name-prefix="calc" %verbose %yacc + at_setup_line='calc.at:553' + at_desc='Calculator %error-verbose %locations %defines %name-prefix="calc" %verbose %yacc' + $at_quiet $ECHO_N " 65: Calculator %error-verbose %locations %defines %name-prefix="calc" %verbose %yacc$ECHO_C" + at_xfail=no + ( + echo "65. calc.at:553: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%error-verbose %locations %defines %name-prefix="calc" %verbose %yacc +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (void); +static int yygetc (void); +static void yyungetc ( int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%d.%d", + (yylloc).first_line, (yylloc).first_column); + if ((yylloc).first_line != (yylloc).last_line) + fprintf (stderr, "-%d.%d", + (yylloc).last_line, (yylloc).last_column - 1); + else if ((yylloc).first_column != (yylloc).last_column - 1) + fprintf (stderr, "-%d", + (yylloc).last_column - 1); + fprintf (stderr, ": "); + fprintf (stderr, "%s\n", s); +} + + + +static YYLTYPE last_yylloc; + +static int +yygetc (void) +{ + int res = getc (yyin); + ; + + last_yylloc = (yylloc); + if (res == '\n') + { + (yylloc).last_line++; + (yylloc).last_column = 0; + } + else + (yylloc).last_column++; + + return res; +} + + +static void +yyungetc ( int c) +{ + ; + + /* Wrong when C == `\n'. */ + (yylloc) = last_yylloc; + + ungetc (c, yyin); +} + +static int +read_signed_integer (void) +{ + int c = yygetc (); + int sign = 1; + int n = 0; + + ; + if (c == '-') + { + c = yygetc (); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (); + } + + yyungetc ( c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (void) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + (yylloc).last_column = 0; + (yylloc).last_line = 1; + + } + + (yylloc).first_column = (yylloc).last_column; + (yylloc).first_line = (yylloc).last_line; + + + /* Skip white space. */ + while ((c = yygetc ()) == ' ' || c == '\t') + { + (yylloc).first_column = (yylloc).last_column; + (yylloc).first_line = (yylloc).last_line; + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc ( c); + (yylval).ival = read_signed_integer (); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:553: bison -o calc.c calc.y" +echo calc.at:553 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:553: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:553: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:553 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:553: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:553: \$PREPARSER ./calc input" +echo calc.at:553 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:553: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:553: \$PREPARSER ./calc input" +echo calc.at:553 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:553: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:553: cat stderr" +echo calc.at:553 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:553: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:553: \$PREPARSER ./calc input" +echo calc.at:553 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:553: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:553: cat stderr" +echo calc.at:553 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:553: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:553: \$PREPARSER ./calc input" +echo calc.at:553 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:553: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:553: cat stderr" +echo calc.at:553 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:553: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:553: \$PREPARSER ./calc input" +echo calc.at:553 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:553: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:553: cat stderr" +echo calc.at:553 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:553: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:553: \$PREPARSER ./calc input" +echo calc.at:553 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:553: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:553: cat stderr" +echo calc.at:553 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:553: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:553: \$PREPARSER ./calc /dev/null" +echo calc.at:553 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:553: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:553: cat stderr" +echo calc.at:553 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:553: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:553: \$PREPARSER ./calc input" +echo calc.at:553 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:553: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:553: cat stderr" +echo calc.at:553 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:553: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:553: \$PREPARSER ./calc input" +echo calc.at:553 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:553: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:553: cat stderr" +echo calc.at:553 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:553: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:553: \$PREPARSER ./calc input" +echo calc.at:553 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:553: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:553: cat stderr" +echo calc.at:553 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:553: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 66 ) # 66. calc.at:555: Calculator %debug + at_setup_line='calc.at:555' + at_desc='Calculator %debug' + $at_quiet $ECHO_N " 66: Calculator %debug $ECHO_C" + at_xfail=no + ( + echo "66. calc.at:555: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%debug +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (void); +static int yygetc (void); +static void yyungetc ( int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%s\n", s); +} + + + +static int +yygetc (void) +{ + int res = getc (yyin); + ; + + return res; +} + + +static void +yyungetc ( int c) +{ + ; + + ungetc (c, yyin); +} + +static int +read_signed_integer (void) +{ + int c = yygetc (); + int sign = 1; + int n = 0; + + ; + if (c == '-') + { + c = yygetc (); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (); + } + + yyungetc ( c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (void) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + } + + + + /* Skip white space. */ + while ((c = yygetc ()) == ' ' || c == '\t') + { + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc ( c); + (yylval).ival = read_signed_integer (); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + yydebug = 1; + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:555: bison -o calc.c calc.y" +echo calc.at:555 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:555: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:555 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:555: \$PREPARSER ./calc input" +echo calc.at:555 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:555: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "486 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:555: \$PREPARSER ./calc input" +echo calc.at:555 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:555: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:555: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "11 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:555: cat stderr" +echo calc.at:555 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:555: \$PREPARSER ./calc input" +echo calc.at:555 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:555: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:555: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "15 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:555: cat stderr" +echo calc.at:555 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:555: \$PREPARSER ./calc input" +echo calc.at:555 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:555: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:555: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "4 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:555: cat stderr" +echo calc.at:555 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:555: \$PREPARSER ./calc input" +echo calc.at:555 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:555: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:555: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "22 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:555: cat stderr" +echo calc.at:555 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:555: \$PREPARSER ./calc input" +echo calc.at:555 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:555: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:555: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "14 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:555: cat stderr" +echo calc.at:555 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:555: \$PREPARSER ./calc /dev/null" +echo calc.at:555 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:555: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:555: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "4 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:555: cat stderr" +echo calc.at:555 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:555: \$PREPARSER ./calc input" +echo calc.at:555 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:555: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "156 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:555: cat stderr" +echo calc.at:555 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:555: \$PREPARSER ./calc input" +echo calc.at:555 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:555: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "62 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:555: cat stderr" +echo calc.at:555 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:555: \$PREPARSER ./calc input" +echo calc.at:555 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:555: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "70 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:555: cat stderr" +echo calc.at:555 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:555: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 67 ) # 67. calc.at:556: Calculator %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc + at_setup_line='calc.at:556' + at_desc='Calculator %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc' + $at_quiet $ECHO_N " 67: Calculator %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc$ECHO_C" + at_xfail=no + ( + echo "67. calc.at:556: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (void); +static int yygetc (void); +static void yyungetc ( int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%d.%d", + (yylloc).first_line, (yylloc).first_column); + if ((yylloc).first_line != (yylloc).last_line) + fprintf (stderr, "-%d.%d", + (yylloc).last_line, (yylloc).last_column - 1); + else if ((yylloc).first_column != (yylloc).last_column - 1) + fprintf (stderr, "-%d", + (yylloc).last_column - 1); + fprintf (stderr, ": "); + fprintf (stderr, "%s\n", s); +} + + + +static YYLTYPE last_yylloc; + +static int +yygetc (void) +{ + int res = getc (yyin); + ; + + last_yylloc = (yylloc); + if (res == '\n') + { + (yylloc).last_line++; + (yylloc).last_column = 0; + } + else + (yylloc).last_column++; + + return res; +} + + +static void +yyungetc ( int c) +{ + ; + + /* Wrong when C == `\n'. */ + (yylloc) = last_yylloc; + + ungetc (c, yyin); +} + +static int +read_signed_integer (void) +{ + int c = yygetc (); + int sign = 1; + int n = 0; + + ; + if (c == '-') + { + c = yygetc (); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (); + } + + yyungetc ( c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (void) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + (yylloc).last_column = 0; + (yylloc).last_line = 1; + + } + + (yylloc).first_column = (yylloc).last_column; + (yylloc).first_line = (yylloc).last_line; + + + /* Skip white space. */ + while ((c = yygetc ()) == ' ' || c == '\t') + { + (yylloc).first_column = (yylloc).last_column; + (yylloc).first_line = (yylloc).last_line; + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc ( c); + (yylval).ival = read_signed_integer (); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + yydebug = 1; + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:556: bison -o calc.c calc.y" +echo calc.at:556 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:556: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:556 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:556: \$PREPARSER ./calc input" +echo calc.at:556 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:556: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "486 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:556: \$PREPARSER ./calc input" +echo calc.at:556 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:556: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:556: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "11 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:556: cat stderr" +echo calc.at:556 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:556: \$PREPARSER ./calc input" +echo calc.at:556 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:556: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:556: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "15 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:556: cat stderr" +echo calc.at:556 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:556: \$PREPARSER ./calc input" +echo calc.at:556 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:556: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:556: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "4 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:556: cat stderr" +echo calc.at:556 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:556: \$PREPARSER ./calc input" +echo calc.at:556 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:556: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:556: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "22 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:556: cat stderr" +echo calc.at:556 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:556: \$PREPARSER ./calc input" +echo calc.at:556 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:556: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:556: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "14 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:556: cat stderr" +echo calc.at:556 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:556: \$PREPARSER ./calc /dev/null" +echo calc.at:556 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:556: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:556: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "4 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:556: cat stderr" +echo calc.at:556 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:556: \$PREPARSER ./calc input" +echo calc.at:556 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:556: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "156 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:556: cat stderr" +echo calc.at:556 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:556: \$PREPARSER ./calc input" +echo calc.at:556 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:556: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "62 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:556: cat stderr" +echo calc.at:556 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:556: \$PREPARSER ./calc input" +echo calc.at:556 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:556: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "70 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:556: cat stderr" +echo calc.at:556 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:556: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 68 ) # 68. calc.at:558: Calculator %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc + at_setup_line='calc.at:558' + at_desc='Calculator %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc' + $at_quiet $ECHO_N " 68: Calculator %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc$ECHO_C" + at_xfail=no + ( + echo "68. calc.at:558: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (YYSTYPE *yylval, YYLTYPE *yylloc); +static int yygetc (YYSTYPE *yylval, YYLTYPE *yylloc); +static void yyungetc (YYSTYPE *yylval, YYLTYPE *yylloc, int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%s\n", s); +} + + + +static YYLTYPE last_yylloc; + +static int +yygetc (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + int res = getc (yyin); + (void) yylval;(void) yylloc; + + last_yylloc = (*yylloc); + if (res == '\n') + { + (*yylloc).last_line++; + (*yylloc).last_column = 0; + } + else + (*yylloc).last_column++; + + return res; +} + + +static void +yyungetc (YYSTYPE *yylval, YYLTYPE *yylloc, int c) +{ + (void) yylval;(void) yylloc; + + /* Wrong when C == `\n'. */ + (*yylloc) = last_yylloc; + + ungetc (c, yyin); +} + +static int +read_signed_integer (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + int c = yygetc (yylval, yylloc); + int sign = 1; + int n = 0; + + (void) yylval;(void) yylloc; + if (c == '-') + { + c = yygetc (yylval, yylloc); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (yylval, yylloc); + } + + yyungetc (yylval, yylloc, c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + (*yylloc).last_column = 0; + (*yylloc).last_line = 1; + + } + + (*yylloc).first_column = (*yylloc).last_column; + (*yylloc).first_line = (*yylloc).last_line; + + + /* Skip white space. */ + while ((c = yygetc (yylval, yylloc)) == ' ' || c == '\t') + { + (*yylloc).first_column = (*yylloc).last_column; + (*yylloc).first_line = (*yylloc).last_line; + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc (yylval, yylloc, c); + (*yylval).ival = read_signed_integer (yylval, yylloc); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + yydebug = 1; + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:558: bison -o calc.c calc.y" +echo calc.at:558 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:558: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:558 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:558: \$PREPARSER ./calc input" +echo calc.at:558 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:558: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "486 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:558: \$PREPARSER ./calc input" +echo calc.at:558 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:558: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:558: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "11 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:558: cat stderr" +echo calc.at:558 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:558: \$PREPARSER ./calc input" +echo calc.at:558 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:558: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:558: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "15 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:558: cat stderr" +echo calc.at:558 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:558: \$PREPARSER ./calc input" +echo calc.at:558 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:558: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:558: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "4 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:558: cat stderr" +echo calc.at:558 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:558: \$PREPARSER ./calc input" +echo calc.at:558 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:558: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:558: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "22 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:558: cat stderr" +echo calc.at:558 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:558: \$PREPARSER ./calc input" +echo calc.at:558 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:558: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:558: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "14 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:558: cat stderr" +echo calc.at:558 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:558: \$PREPARSER ./calc /dev/null" +echo calc.at:558 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:558: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:558: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "4 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:558: cat stderr" +echo calc.at:558 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:558: \$PREPARSER ./calc input" +echo calc.at:558 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:558: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "156 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:558: cat stderr" +echo calc.at:558 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:558: \$PREPARSER ./calc input" +echo calc.at:558 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:558: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "62 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:558: cat stderr" +echo calc.at:558 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:558: \$PREPARSER ./calc input" +echo calc.at:558 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:558: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "70 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:558: cat stderr" +echo calc.at:558 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:558: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 69 ) # 69. calc.at:560: Calculator %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count} + at_setup_line='calc.at:560' + at_desc='Calculator %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}' + $at_quiet $ECHO_N " 69: Calculator %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}$ECHO_C" + at_xfail=no + ( + echo "69. calc.at:560: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count} +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror (YYLTYPE *yylloc, + semantic_value *result, int *count, + const char *s + ); +static int yylex (YYSTYPE *yylval, YYLTYPE *yylloc); +static int yygetc (YYSTYPE *yylval, YYLTYPE *yylloc); +static void yyungetc (YYSTYPE *yylval, YYLTYPE *yylloc, int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { ++*count; ++global_count; } +; + +line: + '\n' +| exp '\n' { *result = global_result = $1; } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror (YYLTYPE *yylloc, + semantic_value *result, int *count, + const char *s) +{ +(void) result; (void) count; + + fprintf (stderr, "%d.%d", + (*yylloc).first_line, (*yylloc).first_column); + if ((*yylloc).first_line != (*yylloc).last_line) + fprintf (stderr, "-%d.%d", + (*yylloc).last_line, (*yylloc).last_column - 1); + else if ((*yylloc).first_column != (*yylloc).last_column - 1) + fprintf (stderr, "-%d", + (*yylloc).last_column - 1); + fprintf (stderr, ": "); + fprintf (stderr, "%s\n", s); +} + + + +static YYLTYPE last_yylloc; + +static int +yygetc (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + int res = getc (yyin); + (void) yylval;(void) yylloc; + + last_yylloc = (*yylloc); + if (res == '\n') + { + (*yylloc).last_line++; + (*yylloc).last_column = 0; + } + else + (*yylloc).last_column++; + + return res; +} + + +static void +yyungetc (YYSTYPE *yylval, YYLTYPE *yylloc, int c) +{ + (void) yylval;(void) yylloc; + + /* Wrong when C == `\n'. */ + (*yylloc) = last_yylloc; + + ungetc (c, yyin); +} + +static int +read_signed_integer (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + int c = yygetc (yylval, yylloc); + int sign = 1; + int n = 0; + + (void) yylval;(void) yylloc; + if (c == '-') + { + c = yygetc (yylval, yylloc); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (yylval, yylloc); + } + + yyungetc (yylval, yylloc, c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + (*yylloc).last_column = 0; + (*yylloc).last_line = 1; + + } + + (*yylloc).first_column = (*yylloc).last_column; + (*yylloc).first_line = (*yylloc).last_line; + + + /* Skip white space. */ + while ((c = yygetc (yylval, yylloc)) == ' ' || c == '\t') + { + (*yylloc).first_column = (*yylloc).last_column; + (*yylloc).first_line = (*yylloc).last_line; + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc (yylval, yylloc, c); + (*yylval).ival = read_signed_integer (yylval, yylloc); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + yydebug = 1; + status = yyparse (&result, &count); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:560: bison -o calc.c calc.y" +echo calc.at:560 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:560: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:560 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:560: \$PREPARSER ./calc input" +echo calc.at:560 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:560: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "486 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:560: \$PREPARSER ./calc input" +echo calc.at:560 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:560: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:560: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "11 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:560: cat stderr" +echo calc.at:560 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:560: \$PREPARSER ./calc input" +echo calc.at:560 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:560: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:560: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "15 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:560: cat stderr" +echo calc.at:560 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:560: \$PREPARSER ./calc input" +echo calc.at:560 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:560: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:560: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "4 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:560: cat stderr" +echo calc.at:560 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:560: \$PREPARSER ./calc input" +echo calc.at:560 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:560: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:560: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "22 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:560: cat stderr" +echo calc.at:560 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:560: \$PREPARSER ./calc input" +echo calc.at:560 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:560: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:560: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "14 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:560: cat stderr" +echo calc.at:560 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:560: \$PREPARSER ./calc /dev/null" +echo calc.at:560 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:560: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:560: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "4 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:560: cat stderr" +echo calc.at:560 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:560: \$PREPARSER ./calc input" +echo calc.at:560 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:560: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "156 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:560: cat stderr" +echo calc.at:560 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:560: \$PREPARSER ./calc input" +echo calc.at:560 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:560: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "62 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:560: cat stderr" +echo calc.at:560 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:560: \$PREPARSER ./calc input" +echo calc.at:560 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:560: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "70 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:560: cat stderr" +echo calc.at:560 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:560: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + + banner-10 ) # Banner 10. calc.at:567 + cat <<\_ATEOF + +Simple GLR Calculator. + +_ATEOF + ;; + + 70 ) # 70. calc.at:577: Calculator %glr-parser + at_setup_line='calc.at:577' + at_desc='Calculator %glr-parser ' + $at_quiet $ECHO_N " 70: Calculator %glr-parser $ECHO_C" + at_xfail=no + ( + echo "70. calc.at:577: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%glr-parser +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (void); +static int yygetc (void); +static void yyungetc ( int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%s\n", s); +} + + + +static int +yygetc (void) +{ + int res = getc (yyin); + ; + + return res; +} + + +static void +yyungetc ( int c) +{ + ; + + ungetc (c, yyin); +} + +static int +read_signed_integer (void) +{ + int c = yygetc (); + int sign = 1; + int n = 0; + + ; + if (c == '-') + { + c = yygetc (); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (); + } + + yyungetc ( c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (void) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + } + + + + /* Skip white space. */ + while ((c = yygetc ()) == ' ' || c == '\t') + { + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc ( c); + (yylval).ival = read_signed_integer (); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:577: bison -o calc.c calc.y" +echo calc.at:577 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:577: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:577: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:577 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:577: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:577: \$PREPARSER ./calc input" +echo calc.at:577 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:577: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:577: \$PREPARSER ./calc input" +echo calc.at:577 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:577: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:577: cat stderr" +echo calc.at:577 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:577: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:577: \$PREPARSER ./calc input" +echo calc.at:577 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:577: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:577: cat stderr" +echo calc.at:577 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:577: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:577: \$PREPARSER ./calc input" +echo calc.at:577 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:577: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:577: cat stderr" +echo calc.at:577 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:577: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:577: \$PREPARSER ./calc input" +echo calc.at:577 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:577: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:577: cat stderr" +echo calc.at:577 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:577: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:577: \$PREPARSER ./calc input" +echo calc.at:577 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:577: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:577: cat stderr" +echo calc.at:577 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:577: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:577: \$PREPARSER ./calc /dev/null" +echo calc.at:577 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:577: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:577: cat stderr" +echo calc.at:577 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:577: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:577: \$PREPARSER ./calc input" +echo calc.at:577 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:577: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:577: cat stderr" +echo calc.at:577 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:577: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:577: \$PREPARSER ./calc input" +echo calc.at:577 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:577: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:577: cat stderr" +echo calc.at:577 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:577: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:577: \$PREPARSER ./calc input" +echo calc.at:577 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:577: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:577: cat stderr" +echo calc.at:577 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:577: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 71 ) # 71. calc.at:579: Calculator %glr-parser %defines + at_setup_line='calc.at:579' + at_desc='Calculator %glr-parser %defines' + $at_quiet $ECHO_N " 71: Calculator %glr-parser %defines $ECHO_C" + at_xfail=no + ( + echo "71. calc.at:579: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%glr-parser %defines +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (void); +static int yygetc (void); +static void yyungetc ( int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%s\n", s); +} + + + +static int +yygetc (void) +{ + int res = getc (yyin); + ; + + return res; +} + + +static void +yyungetc ( int c) +{ + ; + + ungetc (c, yyin); +} + +static int +read_signed_integer (void) +{ + int c = yygetc (); + int sign = 1; + int n = 0; + + ; + if (c == '-') + { + c = yygetc (); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (); + } + + yyungetc ( c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (void) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + } + + + + /* Skip white space. */ + while ((c = yygetc ()) == ' ' || c == '\t') + { + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc ( c); + (yylval).ival = read_signed_integer (); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:579: bison -o calc.c calc.y" +echo calc.at:579 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:579: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:579: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:579 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:579: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:579: \$PREPARSER ./calc input" +echo calc.at:579 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:579: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:579: \$PREPARSER ./calc input" +echo calc.at:579 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:579: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:579: cat stderr" +echo calc.at:579 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:579: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:579: \$PREPARSER ./calc input" +echo calc.at:579 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:579: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:579: cat stderr" +echo calc.at:579 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:579: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:579: \$PREPARSER ./calc input" +echo calc.at:579 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:579: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:579: cat stderr" +echo calc.at:579 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:579: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:579: \$PREPARSER ./calc input" +echo calc.at:579 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:579: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:579: cat stderr" +echo calc.at:579 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:579: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:579: \$PREPARSER ./calc input" +echo calc.at:579 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:579: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:579: cat stderr" +echo calc.at:579 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:579: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:579: \$PREPARSER ./calc /dev/null" +echo calc.at:579 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:579: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:579: cat stderr" +echo calc.at:579 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:579: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:579: \$PREPARSER ./calc input" +echo calc.at:579 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:579: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:579: cat stderr" +echo calc.at:579 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:579: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:579: \$PREPARSER ./calc input" +echo calc.at:579 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:579: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:579: cat stderr" +echo calc.at:579 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:579: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:579: \$PREPARSER ./calc input" +echo calc.at:579 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:579: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:579: cat stderr" +echo calc.at:579 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:579: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 72 ) # 72. calc.at:580: Calculator %glr-parser %locations + at_setup_line='calc.at:580' + at_desc='Calculator %glr-parser %locations' + $at_quiet $ECHO_N " 72: Calculator %glr-parser %locations $ECHO_C" + at_xfail=no + ( + echo "72. calc.at:580: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%glr-parser %locations +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (void); +static int yygetc (void); +static void yyungetc ( int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%d.%d", + (yylloc).first_line, (yylloc).first_column); + if ((yylloc).first_line != (yylloc).last_line) + fprintf (stderr, "-%d.%d", + (yylloc).last_line, (yylloc).last_column - 1); + else if ((yylloc).first_column != (yylloc).last_column - 1) + fprintf (stderr, "-%d", + (yylloc).last_column - 1); + fprintf (stderr, ": "); + fprintf (stderr, "%s\n", s); +} + + + +static YYLTYPE last_yylloc; + +static int +yygetc (void) +{ + int res = getc (yyin); + ; + + last_yylloc = (yylloc); + if (res == '\n') + { + (yylloc).last_line++; + (yylloc).last_column = 0; + } + else + (yylloc).last_column++; + + return res; +} + + +static void +yyungetc ( int c) +{ + ; + + /* Wrong when C == `\n'. */ + (yylloc) = last_yylloc; + + ungetc (c, yyin); +} + +static int +read_signed_integer (void) +{ + int c = yygetc (); + int sign = 1; + int n = 0; + + ; + if (c == '-') + { + c = yygetc (); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (); + } + + yyungetc ( c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (void) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + (yylloc).last_column = 0; + (yylloc).last_line = 1; + + } + + (yylloc).first_column = (yylloc).last_column; + (yylloc).first_line = (yylloc).last_line; + + + /* Skip white space. */ + while ((c = yygetc ()) == ' ' || c == '\t') + { + (yylloc).first_column = (yylloc).last_column; + (yylloc).first_line = (yylloc).last_line; + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc ( c); + (yylval).ival = read_signed_integer (); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:580: bison -o calc.c calc.y" +echo calc.at:580 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:580: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:580: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:580 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:580: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:580: \$PREPARSER ./calc input" +echo calc.at:580 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:580: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:580: \$PREPARSER ./calc input" +echo calc.at:580 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:580: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:580: cat stderr" +echo calc.at:580 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:580: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:580: \$PREPARSER ./calc input" +echo calc.at:580 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:580: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:580: cat stderr" +echo calc.at:580 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:580: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:580: \$PREPARSER ./calc input" +echo calc.at:580 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:580: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:580: cat stderr" +echo calc.at:580 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:580: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:580: \$PREPARSER ./calc input" +echo calc.at:580 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:580: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:580: cat stderr" +echo calc.at:580 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:580: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:580: \$PREPARSER ./calc input" +echo calc.at:580 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:580: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:580: cat stderr" +echo calc.at:580 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:580: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:580: \$PREPARSER ./calc /dev/null" +echo calc.at:580 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:580: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:580: cat stderr" +echo calc.at:580 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:580: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:580: \$PREPARSER ./calc input" +echo calc.at:580 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:580: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:580: cat stderr" +echo calc.at:580 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:580: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:580: \$PREPARSER ./calc input" +echo calc.at:580 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:580: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:580: cat stderr" +echo calc.at:580 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:580: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:580: \$PREPARSER ./calc input" +echo calc.at:580 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:580: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:580: cat stderr" +echo calc.at:580 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:580: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 73 ) # 73. calc.at:581: Calculator %glr-parser %name-prefix="calc" + at_setup_line='calc.at:581' + at_desc='Calculator %glr-parser %name-prefix="calc"' + $at_quiet $ECHO_N " 73: Calculator %glr-parser %name-prefix="calc" $ECHO_C" + at_xfail=no + ( + echo "73. calc.at:581: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%glr-parser %name-prefix="calc" +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (void); +static int yygetc (void); +static void yyungetc ( int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%s\n", s); +} + + + +static int +yygetc (void) +{ + int res = getc (yyin); + ; + + return res; +} + + +static void +yyungetc ( int c) +{ + ; + + ungetc (c, yyin); +} + +static int +read_signed_integer (void) +{ + int c = yygetc (); + int sign = 1; + int n = 0; + + ; + if (c == '-') + { + c = yygetc (); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (); + } + + yyungetc ( c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (void) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + } + + + + /* Skip white space. */ + while ((c = yygetc ()) == ' ' || c == '\t') + { + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc ( c); + (yylval).ival = read_signed_integer (); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:581: bison -o calc.c calc.y" +echo calc.at:581 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:581: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:581: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:581 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:581: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:581: \$PREPARSER ./calc input" +echo calc.at:581 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:581: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:581: \$PREPARSER ./calc input" +echo calc.at:581 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:581: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:581: cat stderr" +echo calc.at:581 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:581: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:581: \$PREPARSER ./calc input" +echo calc.at:581 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:581: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:581: cat stderr" +echo calc.at:581 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:581: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:581: \$PREPARSER ./calc input" +echo calc.at:581 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:581: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:581: cat stderr" +echo calc.at:581 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:581: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:581: \$PREPARSER ./calc input" +echo calc.at:581 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:581: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:581: cat stderr" +echo calc.at:581 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:581: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:581: \$PREPARSER ./calc input" +echo calc.at:581 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:581: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:581: cat stderr" +echo calc.at:581 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:581: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:581: \$PREPARSER ./calc /dev/null" +echo calc.at:581 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:581: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:581: cat stderr" +echo calc.at:581 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:581: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:581: \$PREPARSER ./calc input" +echo calc.at:581 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:581: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:581: cat stderr" +echo calc.at:581 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:581: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:581: \$PREPARSER ./calc input" +echo calc.at:581 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:581: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:581: cat stderr" +echo calc.at:581 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:581: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:581: \$PREPARSER ./calc input" +echo calc.at:581 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:581: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:581: cat stderr" +echo calc.at:581 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:581: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 74 ) # 74. calc.at:582: Calculator %glr-parser %verbose + at_setup_line='calc.at:582' + at_desc='Calculator %glr-parser %verbose' + $at_quiet $ECHO_N " 74: Calculator %glr-parser %verbose $ECHO_C" + at_xfail=no + ( + echo "74. calc.at:582: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%glr-parser %verbose +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (void); +static int yygetc (void); +static void yyungetc ( int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%s\n", s); +} + + + +static int +yygetc (void) +{ + int res = getc (yyin); + ; + + return res; +} + + +static void +yyungetc ( int c) +{ + ; + + ungetc (c, yyin); +} + +static int +read_signed_integer (void) +{ + int c = yygetc (); + int sign = 1; + int n = 0; + + ; + if (c == '-') + { + c = yygetc (); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (); + } + + yyungetc ( c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (void) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + } + + + + /* Skip white space. */ + while ((c = yygetc ()) == ' ' || c == '\t') + { + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc ( c); + (yylval).ival = read_signed_integer (); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:582: bison -o calc.c calc.y" +echo calc.at:582 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:582: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:582: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:582 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:582: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:582: \$PREPARSER ./calc input" +echo calc.at:582 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:582: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:582: \$PREPARSER ./calc input" +echo calc.at:582 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:582: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:582: cat stderr" +echo calc.at:582 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:582: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:582: \$PREPARSER ./calc input" +echo calc.at:582 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:582: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:582: cat stderr" +echo calc.at:582 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:582: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:582: \$PREPARSER ./calc input" +echo calc.at:582 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:582: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:582: cat stderr" +echo calc.at:582 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:582: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:582: \$PREPARSER ./calc input" +echo calc.at:582 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:582: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:582: cat stderr" +echo calc.at:582 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:582: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:582: \$PREPARSER ./calc input" +echo calc.at:582 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:582: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:582: cat stderr" +echo calc.at:582 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:582: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:582: \$PREPARSER ./calc /dev/null" +echo calc.at:582 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:582: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:582: cat stderr" +echo calc.at:582 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:582: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:582: \$PREPARSER ./calc input" +echo calc.at:582 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:582: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:582: cat stderr" +echo calc.at:582 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:582: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:582: \$PREPARSER ./calc input" +echo calc.at:582 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:582: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:582: cat stderr" +echo calc.at:582 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:582: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:582: \$PREPARSER ./calc input" +echo calc.at:582 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:582: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:582: cat stderr" +echo calc.at:582 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:582: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 75 ) # 75. calc.at:583: Calculator %glr-parser %yacc + at_setup_line='calc.at:583' + at_desc='Calculator %glr-parser %yacc' + $at_quiet $ECHO_N " 75: Calculator %glr-parser %yacc $ECHO_C" + at_xfail=no + ( + echo "75. calc.at:583: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%glr-parser %yacc +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (void); +static int yygetc (void); +static void yyungetc ( int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%s\n", s); +} + + + +static int +yygetc (void) +{ + int res = getc (yyin); + ; + + return res; +} + + +static void +yyungetc ( int c) +{ + ; + + ungetc (c, yyin); +} + +static int +read_signed_integer (void) +{ + int c = yygetc (); + int sign = 1; + int n = 0; + + ; + if (c == '-') + { + c = yygetc (); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (); + } + + yyungetc ( c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (void) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + } + + + + /* Skip white space. */ + while ((c = yygetc ()) == ' ' || c == '\t') + { + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc ( c); + (yylval).ival = read_signed_integer (); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:583: bison -o calc.c calc.y" +echo calc.at:583 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:583: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:583: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:583 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:583: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:583: \$PREPARSER ./calc input" +echo calc.at:583 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:583: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:583: \$PREPARSER ./calc input" +echo calc.at:583 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:583: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:583: cat stderr" +echo calc.at:583 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:583: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:583: \$PREPARSER ./calc input" +echo calc.at:583 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:583: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:583: cat stderr" +echo calc.at:583 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:583: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:583: \$PREPARSER ./calc input" +echo calc.at:583 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:583: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:583: cat stderr" +echo calc.at:583 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:583: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:583: \$PREPARSER ./calc input" +echo calc.at:583 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:583: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:583: cat stderr" +echo calc.at:583 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:583: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:583: \$PREPARSER ./calc input" +echo calc.at:583 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:583: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:583: cat stderr" +echo calc.at:583 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:583: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:583: \$PREPARSER ./calc /dev/null" +echo calc.at:583 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:583: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:583: cat stderr" +echo calc.at:583 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:583: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:583: \$PREPARSER ./calc input" +echo calc.at:583 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:583: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:583: cat stderr" +echo calc.at:583 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:583: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:583: \$PREPARSER ./calc input" +echo calc.at:583 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:583: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:583: cat stderr" +echo calc.at:583 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:583: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:583: \$PREPARSER ./calc input" +echo calc.at:583 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:583: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:583: cat stderr" +echo calc.at:583 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:583: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 76 ) # 76. calc.at:584: Calculator %glr-parser %error-verbose + at_setup_line='calc.at:584' + at_desc='Calculator %glr-parser %error-verbose' + $at_quiet $ECHO_N " 76: Calculator %glr-parser %error-verbose $ECHO_C" + at_xfail=no + ( + echo "76. calc.at:584: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%glr-parser %error-verbose +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (void); +static int yygetc (void); +static void yyungetc ( int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%s\n", s); +} + + + +static int +yygetc (void) +{ + int res = getc (yyin); + ; + + return res; +} + + +static void +yyungetc ( int c) +{ + ; + + ungetc (c, yyin); +} + +static int +read_signed_integer (void) +{ + int c = yygetc (); + int sign = 1; + int n = 0; + + ; + if (c == '-') + { + c = yygetc (); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (); + } + + yyungetc ( c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (void) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + } + + + + /* Skip white space. */ + while ((c = yygetc ()) == ' ' || c == '\t') + { + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc ( c); + (yylval).ival = read_signed_integer (); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:584: bison -o calc.c calc.y" +echo calc.at:584 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:584: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:584: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:584 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:584: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:584: \$PREPARSER ./calc input" +echo calc.at:584 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:584: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:584: \$PREPARSER ./calc input" +echo calc.at:584 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:584: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:584: cat stderr" +echo calc.at:584 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:584: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:584: \$PREPARSER ./calc input" +echo calc.at:584 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:584: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:584: cat stderr" +echo calc.at:584 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:584: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:584: \$PREPARSER ./calc input" +echo calc.at:584 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:584: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:584: cat stderr" +echo calc.at:584 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:584: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:584: \$PREPARSER ./calc input" +echo calc.at:584 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:584: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:584: cat stderr" +echo calc.at:584 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:584: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:584: \$PREPARSER ./calc input" +echo calc.at:584 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:584: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:584: cat stderr" +echo calc.at:584 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:584: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:584: \$PREPARSER ./calc /dev/null" +echo calc.at:584 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:584: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:584: cat stderr" +echo calc.at:584 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:584: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:584: \$PREPARSER ./calc input" +echo calc.at:584 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:584: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:584: cat stderr" +echo calc.at:584 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:584: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:584: \$PREPARSER ./calc input" +echo calc.at:584 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:584: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:584: cat stderr" +echo calc.at:584 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:584: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:584: \$PREPARSER ./calc input" +echo calc.at:584 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:584: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:584: cat stderr" +echo calc.at:584 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:584: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 77 ) # 77. calc.at:586: Calculator %glr-parser %pure-parser %locations + at_setup_line='calc.at:586' + at_desc='Calculator %glr-parser %pure-parser %locations' + $at_quiet $ECHO_N " 77: Calculator %glr-parser %pure-parser %locations$ECHO_C" + at_xfail=no + ( + echo "77. calc.at:586: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%glr-parser %pure-parser %locations +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror (YYLTYPE *yylloc, + + const char *s + ); +static int yylex (YYSTYPE *yylval, YYLTYPE *yylloc); +static int yygetc (YYSTYPE *yylval, YYLTYPE *yylloc); +static void yyungetc (YYSTYPE *yylval, YYLTYPE *yylloc, int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror (YYLTYPE *yylloc, + + const char *s) +{ + + + fprintf (stderr, "%d.%d", + (*yylloc).first_line, (*yylloc).first_column); + if ((*yylloc).first_line != (*yylloc).last_line) + fprintf (stderr, "-%d.%d", + (*yylloc).last_line, (*yylloc).last_column - 1); + else if ((*yylloc).first_column != (*yylloc).last_column - 1) + fprintf (stderr, "-%d", + (*yylloc).last_column - 1); + fprintf (stderr, ": "); + fprintf (stderr, "%s\n", s); +} + + + +static YYLTYPE last_yylloc; + +static int +yygetc (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + int res = getc (yyin); + (void) yylval;(void) yylloc; + + last_yylloc = (*yylloc); + if (res == '\n') + { + (*yylloc).last_line++; + (*yylloc).last_column = 0; + } + else + (*yylloc).last_column++; + + return res; +} + + +static void +yyungetc (YYSTYPE *yylval, YYLTYPE *yylloc, int c) +{ + (void) yylval;(void) yylloc; + + /* Wrong when C == `\n'. */ + (*yylloc) = last_yylloc; + + ungetc (c, yyin); +} + +static int +read_signed_integer (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + int c = yygetc (yylval, yylloc); + int sign = 1; + int n = 0; + + (void) yylval;(void) yylloc; + if (c == '-') + { + c = yygetc (yylval, yylloc); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (yylval, yylloc); + } + + yyungetc (yylval, yylloc, c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + (*yylloc).last_column = 0; + (*yylloc).last_line = 1; + + } + + (*yylloc).first_column = (*yylloc).last_column; + (*yylloc).first_line = (*yylloc).last_line; + + + /* Skip white space. */ + while ((c = yygetc (yylval, yylloc)) == ' ' || c == '\t') + { + (*yylloc).first_column = (*yylloc).last_column; + (*yylloc).first_line = (*yylloc).last_line; + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc (yylval, yylloc, c); + (*yylval).ival = read_signed_integer (yylval, yylloc); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:586: bison -o calc.c calc.y" +echo calc.at:586 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:586: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:586: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:586 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:586: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:586: \$PREPARSER ./calc input" +echo calc.at:586 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:586: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:586: \$PREPARSER ./calc input" +echo calc.at:586 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:586: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:586: cat stderr" +echo calc.at:586 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:586: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:586: \$PREPARSER ./calc input" +echo calc.at:586 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:586: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:586: cat stderr" +echo calc.at:586 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:586: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:586: \$PREPARSER ./calc input" +echo calc.at:586 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:586: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:586: cat stderr" +echo calc.at:586 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:586: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:586: \$PREPARSER ./calc input" +echo calc.at:586 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:586: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:586: cat stderr" +echo calc.at:586 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:586: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:586: \$PREPARSER ./calc input" +echo calc.at:586 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:586: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:586: cat stderr" +echo calc.at:586 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:586: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:586: \$PREPARSER ./calc /dev/null" +echo calc.at:586 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:586: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:586: cat stderr" +echo calc.at:586 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:586: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:586: \$PREPARSER ./calc input" +echo calc.at:586 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:586: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:586: cat stderr" +echo calc.at:586 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:586: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:586: \$PREPARSER ./calc input" +echo calc.at:586 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:586: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:586: cat stderr" +echo calc.at:586 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:586: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:586: \$PREPARSER ./calc input" +echo calc.at:586 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:586: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:586: cat stderr" +echo calc.at:586 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:586: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 78 ) # 78. calc.at:587: Calculator %glr-parser %error-verbose %locations + at_setup_line='calc.at:587' + at_desc='Calculator %glr-parser %error-verbose %locations' + $at_quiet $ECHO_N " 78: Calculator %glr-parser %error-verbose %locations$ECHO_C" + at_xfail=no + ( + echo "78. calc.at:587: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%glr-parser %error-verbose %locations +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (void); +static int yygetc (void); +static void yyungetc ( int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%d.%d", + (yylloc).first_line, (yylloc).first_column); + if ((yylloc).first_line != (yylloc).last_line) + fprintf (stderr, "-%d.%d", + (yylloc).last_line, (yylloc).last_column - 1); + else if ((yylloc).first_column != (yylloc).last_column - 1) + fprintf (stderr, "-%d", + (yylloc).last_column - 1); + fprintf (stderr, ": "); + fprintf (stderr, "%s\n", s); +} + + + +static YYLTYPE last_yylloc; + +static int +yygetc (void) +{ + int res = getc (yyin); + ; + + last_yylloc = (yylloc); + if (res == '\n') + { + (yylloc).last_line++; + (yylloc).last_column = 0; + } + else + (yylloc).last_column++; + + return res; +} + + +static void +yyungetc ( int c) +{ + ; + + /* Wrong when C == `\n'. */ + (yylloc) = last_yylloc; + + ungetc (c, yyin); +} + +static int +read_signed_integer (void) +{ + int c = yygetc (); + int sign = 1; + int n = 0; + + ; + if (c == '-') + { + c = yygetc (); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (); + } + + yyungetc ( c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (void) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + (yylloc).last_column = 0; + (yylloc).last_line = 1; + + } + + (yylloc).first_column = (yylloc).last_column; + (yylloc).first_line = (yylloc).last_line; + + + /* Skip white space. */ + while ((c = yygetc ()) == ' ' || c == '\t') + { + (yylloc).first_column = (yylloc).last_column; + (yylloc).first_line = (yylloc).last_line; + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc ( c); + (yylval).ival = read_signed_integer (); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:587: bison -o calc.c calc.y" +echo calc.at:587 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:587: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:587: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:587 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:587: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:587: \$PREPARSER ./calc input" +echo calc.at:587 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:587: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:587: \$PREPARSER ./calc input" +echo calc.at:587 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:587: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:587: cat stderr" +echo calc.at:587 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:587: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:587: \$PREPARSER ./calc input" +echo calc.at:587 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:587: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:587: cat stderr" +echo calc.at:587 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:587: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:587: \$PREPARSER ./calc input" +echo calc.at:587 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:587: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:587: cat stderr" +echo calc.at:587 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:587: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:587: \$PREPARSER ./calc input" +echo calc.at:587 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:587: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:587: cat stderr" +echo calc.at:587 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:587: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:587: \$PREPARSER ./calc input" +echo calc.at:587 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:587: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:587: cat stderr" +echo calc.at:587 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:587: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:587: \$PREPARSER ./calc /dev/null" +echo calc.at:587 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:587: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:587: cat stderr" +echo calc.at:587 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:587: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:587: \$PREPARSER ./calc input" +echo calc.at:587 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:587: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:587: cat stderr" +echo calc.at:587 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:587: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:587: \$PREPARSER ./calc input" +echo calc.at:587 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:587: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:587: cat stderr" +echo calc.at:587 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:587: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:587: \$PREPARSER ./calc input" +echo calc.at:587 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:587: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:587: cat stderr" +echo calc.at:587 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:587: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 79 ) # 79. calc.at:589: Calculator %glr-parser %error-verbose %locations %defines %name-prefix="calc" %verbose %yacc + at_setup_line='calc.at:589' + at_desc='Calculator %glr-parser %error-verbose %locations %defines %name-prefix="calc" %verbose %yacc' + $at_quiet $ECHO_N " 79: Calculator %glr-parser %error-verbose %locations %defines %name-prefix="calc" %verbose %yacc$ECHO_C" + at_xfail=no + ( + echo "79. calc.at:589: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%glr-parser %error-verbose %locations %defines %name-prefix="calc" %verbose %yacc +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (void); +static int yygetc (void); +static void yyungetc ( int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%d.%d", + (yylloc).first_line, (yylloc).first_column); + if ((yylloc).first_line != (yylloc).last_line) + fprintf (stderr, "-%d.%d", + (yylloc).last_line, (yylloc).last_column - 1); + else if ((yylloc).first_column != (yylloc).last_column - 1) + fprintf (stderr, "-%d", + (yylloc).last_column - 1); + fprintf (stderr, ": "); + fprintf (stderr, "%s\n", s); +} + + + +static YYLTYPE last_yylloc; + +static int +yygetc (void) +{ + int res = getc (yyin); + ; + + last_yylloc = (yylloc); + if (res == '\n') + { + (yylloc).last_line++; + (yylloc).last_column = 0; + } + else + (yylloc).last_column++; + + return res; +} + + +static void +yyungetc ( int c) +{ + ; + + /* Wrong when C == `\n'. */ + (yylloc) = last_yylloc; + + ungetc (c, yyin); +} + +static int +read_signed_integer (void) +{ + int c = yygetc (); + int sign = 1; + int n = 0; + + ; + if (c == '-') + { + c = yygetc (); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (); + } + + yyungetc ( c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (void) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + (yylloc).last_column = 0; + (yylloc).last_line = 1; + + } + + (yylloc).first_column = (yylloc).last_column; + (yylloc).first_line = (yylloc).last_line; + + + /* Skip white space. */ + while ((c = yygetc ()) == ' ' || c == '\t') + { + (yylloc).first_column = (yylloc).last_column; + (yylloc).first_line = (yylloc).last_line; + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc ( c); + (yylval).ival = read_signed_integer (); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:589: bison -o calc.c calc.y" +echo calc.at:589 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:589: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:589: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:589 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:589: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:589: \$PREPARSER ./calc input" +echo calc.at:589 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:589: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:589: \$PREPARSER ./calc input" +echo calc.at:589 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:589: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:589: cat stderr" +echo calc.at:589 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:589: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:589: \$PREPARSER ./calc input" +echo calc.at:589 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:589: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:589: cat stderr" +echo calc.at:589 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:589: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:589: \$PREPARSER ./calc input" +echo calc.at:589 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:589: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:589: cat stderr" +echo calc.at:589 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:589: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:589: \$PREPARSER ./calc input" +echo calc.at:589 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:589: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:589: cat stderr" +echo calc.at:589 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:589: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:589: \$PREPARSER ./calc input" +echo calc.at:589 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:589: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:589: cat stderr" +echo calc.at:589 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:589: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:589: \$PREPARSER ./calc /dev/null" +echo calc.at:589 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:589: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:589: cat stderr" +echo calc.at:589 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:589: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:589: \$PREPARSER ./calc input" +echo calc.at:589 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:589: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:589: cat stderr" +echo calc.at:589 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:589: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:589: \$PREPARSER ./calc input" +echo calc.at:589 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:589: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:589: cat stderr" +echo calc.at:589 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:589: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:589: \$PREPARSER ./calc input" +echo calc.at:589 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:589: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:589: cat stderr" +echo calc.at:589 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:589: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 80 ) # 80. calc.at:591: Calculator %glr-parser %debug + at_setup_line='calc.at:591' + at_desc='Calculator %glr-parser %debug' + $at_quiet $ECHO_N " 80: Calculator %glr-parser %debug $ECHO_C" + at_xfail=no + ( + echo "80. calc.at:591: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%glr-parser %debug +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (void); +static int yygetc (void); +static void yyungetc ( int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%s\n", s); +} + + + +static int +yygetc (void) +{ + int res = getc (yyin); + ; + + return res; +} + + +static void +yyungetc ( int c) +{ + ; + + ungetc (c, yyin); +} + +static int +read_signed_integer (void) +{ + int c = yygetc (); + int sign = 1; + int n = 0; + + ; + if (c == '-') + { + c = yygetc (); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (); + } + + yyungetc ( c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (void) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + } + + + + /* Skip white space. */ + while ((c = yygetc ()) == ' ' || c == '\t') + { + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc ( c); + (yylval).ival = read_signed_integer (); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + yydebug = 1; + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:591: bison -o calc.c calc.y" +echo calc.at:591 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:591: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:591: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:591 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:591: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:591: \$PREPARSER ./calc input" +echo calc.at:591 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:591: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:591: \$PREPARSER ./calc input" +echo calc.at:591 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:591: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:591: cat stderr" +echo calc.at:591 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:591: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:591: \$PREPARSER ./calc input" +echo calc.at:591 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:591: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:591: cat stderr" +echo calc.at:591 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:591: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:591: \$PREPARSER ./calc input" +echo calc.at:591 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:591: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:591: cat stderr" +echo calc.at:591 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:591: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:591: \$PREPARSER ./calc input" +echo calc.at:591 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:591: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:591: cat stderr" +echo calc.at:591 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:591: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:591: \$PREPARSER ./calc input" +echo calc.at:591 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:591: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:591: cat stderr" +echo calc.at:591 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:591: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:591: \$PREPARSER ./calc /dev/null" +echo calc.at:591 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:591: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:591: cat stderr" +echo calc.at:591 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:591: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:591: \$PREPARSER ./calc input" +echo calc.at:591 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:591: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:591: cat stderr" +echo calc.at:591 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:591: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:591: \$PREPARSER ./calc input" +echo calc.at:591 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:591: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:591: cat stderr" +echo calc.at:591 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:591: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:591: \$PREPARSER ./calc input" +echo calc.at:591 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:591: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:591: cat stderr" +echo calc.at:591 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:591: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 81 ) # 81. calc.at:592: Calculator %glr-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc + at_setup_line='calc.at:592' + at_desc='Calculator %glr-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc' + $at_quiet $ECHO_N " 81: Calculator %glr-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc$ECHO_C" + at_xfail=no + ( + echo "81. calc.at:592: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%glr-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror ( + + const char *s + ); +static int yylex (void); +static int yygetc (void); +static void yyungetc ( int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror ( + + const char *s) +{ + + + fprintf (stderr, "%d.%d", + (yylloc).first_line, (yylloc).first_column); + if ((yylloc).first_line != (yylloc).last_line) + fprintf (stderr, "-%d.%d", + (yylloc).last_line, (yylloc).last_column - 1); + else if ((yylloc).first_column != (yylloc).last_column - 1) + fprintf (stderr, "-%d", + (yylloc).last_column - 1); + fprintf (stderr, ": "); + fprintf (stderr, "%s\n", s); +} + + + +static YYLTYPE last_yylloc; + +static int +yygetc (void) +{ + int res = getc (yyin); + ; + + last_yylloc = (yylloc); + if (res == '\n') + { + (yylloc).last_line++; + (yylloc).last_column = 0; + } + else + (yylloc).last_column++; + + return res; +} + + +static void +yyungetc ( int c) +{ + ; + + /* Wrong when C == `\n'. */ + (yylloc) = last_yylloc; + + ungetc (c, yyin); +} + +static int +read_signed_integer (void) +{ + int c = yygetc (); + int sign = 1; + int n = 0; + + ; + if (c == '-') + { + c = yygetc (); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (); + } + + yyungetc ( c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (void) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + (yylloc).last_column = 0; + (yylloc).last_line = 1; + + } + + (yylloc).first_column = (yylloc).last_column; + (yylloc).first_line = (yylloc).last_line; + + + /* Skip white space. */ + while ((c = yygetc ()) == ' ' || c == '\t') + { + (yylloc).first_column = (yylloc).last_column; + (yylloc).first_line = (yylloc).last_line; + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc ( c); + (yylval).ival = read_signed_integer (); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + yydebug = 1; + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:592: bison -o calc.c calc.y" +echo calc.at:592 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:592: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:592: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:592 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:592: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:592: \$PREPARSER ./calc input" +echo calc.at:592 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:592: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:592: \$PREPARSER ./calc input" +echo calc.at:592 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:592: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:592: cat stderr" +echo calc.at:592 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:592: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:592: \$PREPARSER ./calc input" +echo calc.at:592 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:592: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:592: cat stderr" +echo calc.at:592 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:592: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:592: \$PREPARSER ./calc input" +echo calc.at:592 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:592: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:592: cat stderr" +echo calc.at:592 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:592: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:592: \$PREPARSER ./calc input" +echo calc.at:592 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:592: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:592: cat stderr" +echo calc.at:592 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:592: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:592: \$PREPARSER ./calc input" +echo calc.at:592 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:592: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:592: cat stderr" +echo calc.at:592 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:592: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:592: \$PREPARSER ./calc /dev/null" +echo calc.at:592 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:592: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:592: cat stderr" +echo calc.at:592 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:592: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:592: \$PREPARSER ./calc input" +echo calc.at:592 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:592: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:592: cat stderr" +echo calc.at:592 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:592: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:592: \$PREPARSER ./calc input" +echo calc.at:592 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:592: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:592: cat stderr" +echo calc.at:592 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:592: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:592: \$PREPARSER ./calc input" +echo calc.at:592 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:592: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:592: cat stderr" +echo calc.at:592 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:592: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 82 ) # 82. calc.at:594: Calculator %glr-parser %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc + at_setup_line='calc.at:594' + at_desc='Calculator %glr-parser %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc' + $at_quiet $ECHO_N " 82: Calculator %glr-parser %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc$ECHO_C" + at_xfail=no + ( + echo "82. calc.at:594: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%glr-parser %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror (YYLTYPE *yylloc, + + const char *s + ); +static int yylex (YYSTYPE *yylval, YYLTYPE *yylloc); +static int yygetc (YYSTYPE *yylval, YYLTYPE *yylloc); +static void yyungetc (YYSTYPE *yylval, YYLTYPE *yylloc, int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror (YYLTYPE *yylloc, + + const char *s) +{ + + + fprintf (stderr, "%d.%d", + (*yylloc).first_line, (*yylloc).first_column); + if ((*yylloc).first_line != (*yylloc).last_line) + fprintf (stderr, "-%d.%d", + (*yylloc).last_line, (*yylloc).last_column - 1); + else if ((*yylloc).first_column != (*yylloc).last_column - 1) + fprintf (stderr, "-%d", + (*yylloc).last_column - 1); + fprintf (stderr, ": "); + fprintf (stderr, "%s\n", s); +} + + + +static YYLTYPE last_yylloc; + +static int +yygetc (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + int res = getc (yyin); + (void) yylval;(void) yylloc; + + last_yylloc = (*yylloc); + if (res == '\n') + { + (*yylloc).last_line++; + (*yylloc).last_column = 0; + } + else + (*yylloc).last_column++; + + return res; +} + + +static void +yyungetc (YYSTYPE *yylval, YYLTYPE *yylloc, int c) +{ + (void) yylval;(void) yylloc; + + /* Wrong when C == `\n'. */ + (*yylloc) = last_yylloc; + + ungetc (c, yyin); +} + +static int +read_signed_integer (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + int c = yygetc (yylval, yylloc); + int sign = 1; + int n = 0; + + (void) yylval;(void) yylloc; + if (c == '-') + { + c = yygetc (yylval, yylloc); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (yylval, yylloc); + } + + yyungetc (yylval, yylloc, c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + (*yylloc).last_column = 0; + (*yylloc).last_line = 1; + + } + + (*yylloc).first_column = (*yylloc).last_column; + (*yylloc).first_line = (*yylloc).last_line; + + + /* Skip white space. */ + while ((c = yygetc (yylval, yylloc)) == ' ' || c == '\t') + { + (*yylloc).first_column = (*yylloc).last_column; + (*yylloc).first_line = (*yylloc).last_line; + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc (yylval, yylloc, c); + (*yylval).ival = read_signed_integer (yylval, yylloc); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + yydebug = 1; + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:594: bison -o calc.c calc.y" +echo calc.at:594 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:594: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:594: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:594 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:594: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:594: \$PREPARSER ./calc input" +echo calc.at:594 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:594: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:594: \$PREPARSER ./calc input" +echo calc.at:594 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:594: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:594: cat stderr" +echo calc.at:594 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:594: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:594: \$PREPARSER ./calc input" +echo calc.at:594 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:594: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:594: cat stderr" +echo calc.at:594 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:594: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:594: \$PREPARSER ./calc input" +echo calc.at:594 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:594: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:594: cat stderr" +echo calc.at:594 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:594: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:594: \$PREPARSER ./calc input" +echo calc.at:594 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:594: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:594: cat stderr" +echo calc.at:594 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:594: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:594: \$PREPARSER ./calc input" +echo calc.at:594 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:594: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:594: cat stderr" +echo calc.at:594 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:594: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:594: \$PREPARSER ./calc /dev/null" +echo calc.at:594 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:594: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:594: cat stderr" +echo calc.at:594 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:594: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:594: \$PREPARSER ./calc input" +echo calc.at:594 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:594: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:594: cat stderr" +echo calc.at:594 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:594: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:594: \$PREPARSER ./calc input" +echo calc.at:594 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:594: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:594: cat stderr" +echo calc.at:594 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:594: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:594: \$PREPARSER ./calc input" +echo calc.at:594 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:594: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:594: cat stderr" +echo calc.at:594 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:594: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 83 ) # 83. calc.at:596: Calculator %glr-parser %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count} + at_setup_line='calc.at:596' + at_desc='Calculator %glr-parser %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}' + $at_quiet $ECHO_N " 83: Calculator %glr-parser %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}$ECHO_C" + at_xfail=no + ( + echo "83. calc.at:596: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%glr-parser %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count} +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +/* yyerror receives the location if: + - %location & %pure & %glr + - %location & %pure & %yacc & %parse-param. */ +static void yyerror (YYLTYPE *yylloc, + semantic_value *result, int *count, + const char *s + ); +static int yylex (YYSTYPE *yylval, YYLTYPE *yylloc); +static int yygetc (YYSTYPE *yylval, YYLTYPE *yylloc); +static void yyungetc (YYSTYPE *yylval, YYLTYPE *yylloc, int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { ++*count; ++global_count; } +; + +line: + '\n' +| exp '\n' { *result = global_result = $1; } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +static void +yyerror (YYLTYPE *yylloc, + semantic_value *result, int *count, + const char *s) +{ +(void) result; (void) count; + + fprintf (stderr, "%d.%d", + (*yylloc).first_line, (*yylloc).first_column); + if ((*yylloc).first_line != (*yylloc).last_line) + fprintf (stderr, "-%d.%d", + (*yylloc).last_line, (*yylloc).last_column - 1); + else if ((*yylloc).first_column != (*yylloc).last_column - 1) + fprintf (stderr, "-%d", + (*yylloc).last_column - 1); + fprintf (stderr, ": "); + fprintf (stderr, "%s\n", s); +} + + + +static YYLTYPE last_yylloc; + +static int +yygetc (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + int res = getc (yyin); + (void) yylval;(void) yylloc; + + last_yylloc = (*yylloc); + if (res == '\n') + { + (*yylloc).last_line++; + (*yylloc).last_column = 0; + } + else + (*yylloc).last_column++; + + return res; +} + + +static void +yyungetc (YYSTYPE *yylval, YYLTYPE *yylloc, int c) +{ + (void) yylval;(void) yylloc; + + /* Wrong when C == `\n'. */ + (*yylloc) = last_yylloc; + + ungetc (c, yyin); +} + +static int +read_signed_integer (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + int c = yygetc (yylval, yylloc); + int sign = 1; + int n = 0; + + (void) yylval;(void) yylloc; + if (c == '-') + { + c = yygetc (yylval, yylloc); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (yylval, yylloc); + } + + yyungetc (yylval, yylloc, c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + (*yylloc).last_column = 0; + (*yylloc).last_line = 1; + + } + + (*yylloc).first_column = (*yylloc).last_column; + (*yylloc).first_line = (*yylloc).last_line; + + + /* Skip white space. */ + while ((c = yygetc (yylval, yylloc)) == ' ' || c == '\t') + { + (*yylloc).first_column = (*yylloc).last_column; + (*yylloc).first_line = (*yylloc).last_line; + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc (yylval, yylloc, c); + (*yylval).ival = read_signed_integer (yylval, yylloc); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + yydebug = 1; + status = yyparse (&result, &count); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:596: bison -o calc.c calc.y" +echo calc.at:596 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:596: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "calc.at:596: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS calc.c \$LIBS -o calc" +echo calc.at:596 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS calc.c $LIBS -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:596: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:596: \$PREPARSER ./calc input" +echo calc.at:596 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:596: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:596: \$PREPARSER ./calc input" +echo calc.at:596 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:596: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:596: cat stderr" +echo calc.at:596 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:596: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:596: \$PREPARSER ./calc input" +echo calc.at:596 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:596: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:596: cat stderr" +echo calc.at:596 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:596: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:596: \$PREPARSER ./calc input" +echo calc.at:596 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:596: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:596: cat stderr" +echo calc.at:596 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:596: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:596: \$PREPARSER ./calc input" +echo calc.at:596 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:596: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:596: cat stderr" +echo calc.at:596 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:596: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:596: \$PREPARSER ./calc input" +echo calc.at:596 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:596: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:596: cat stderr" +echo calc.at:596 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:596: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:596: \$PREPARSER ./calc /dev/null" +echo calc.at:596 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:596: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:596: cat stderr" +echo calc.at:596 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:596: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:596: \$PREPARSER ./calc input" +echo calc.at:596 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:596: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:596: cat stderr" +echo calc.at:596 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:596: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:596: \$PREPARSER ./calc input" +echo calc.at:596 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:596: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:596: cat stderr" +echo calc.at:596 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:596: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:596: \$PREPARSER ./calc input" +echo calc.at:596 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:596: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:596: cat stderr" +echo calc.at:596 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:596: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + + banner-11 ) # Banner 11. calc.at:603 + cat <<\_ATEOF + +Simple LALR1 C++ Calculator. + +_ATEOF + ;; + + 84 ) # 84. calc.at:614: Calculator %skeleton "lalr1.cc" %defines %locations + at_setup_line='calc.at:614' + at_desc='Calculator %skeleton "lalr1.cc" %defines %locations' + $at_quiet $ECHO_N " 84: Calculator %skeleton "lalr1.cc" %defines %locations$ECHO_C" + at_xfail=no + ( + echo "84. calc.at:614: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%skeleton "lalr1.cc" %defines %locations +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +typedef yy::Location YYLTYPE; +static int yylex (YYSTYPE *yylval, YYLTYPE *yylloc); +static int yygetc (YYSTYPE *yylval, YYLTYPE *yylloc); +static void yyungetc (YYSTYPE *yylval, YYLTYPE *yylloc, int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +/* Currently, print_ is required in C++. */ +void +yy::Parser::print_ () +{ + + std::cerr << location; +} + +/* A C++ error reporting function. */ +void +yy::Parser::error_ () +{ + std::cerr << location << ": " << message << std::endl; +} + +int +yyparse () +{ + yy::Parser parser (!!YYDEBUG, yy::Location::Location ()); + return parser.parse (); +} + + + + +static YYLTYPE last_yylloc; + +static int +yygetc (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + int res = getc (yyin); + (void) yylval;(void) yylloc; + + last_yylloc = (*yylloc); + if (res == '\n') + { + (*yylloc).end.line++; + (*yylloc).end.column = 0; + } + else + (*yylloc).end.column++; + + return res; +} + + +static void +yyungetc (YYSTYPE *yylval, YYLTYPE *yylloc, int c) +{ + (void) yylval;(void) yylloc; + + /* Wrong when C == `\n'. */ + (*yylloc) = last_yylloc; + + ungetc (c, yyin); +} + +static int +read_signed_integer (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + int c = yygetc (yylval, yylloc); + int sign = 1; + int n = 0; + + (void) yylval;(void) yylloc; + if (c == '-') + { + c = yygetc (yylval, yylloc); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (yylval, yylloc); + } + + yyungetc (yylval, yylloc, c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + } + + (*yylloc).begin = (*yylloc).end; + + /* Skip white space. */ + while ((c = yygetc (yylval, yylloc)) == ' ' || c == '\t') + { + (*yylloc).begin = (*yylloc).end; + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc (yylval, yylloc, c); + (*yylval).ival = read_signed_integer (yylval, yylloc); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:614: bison -o calc.c calc.y" +echo calc.at:614 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:614: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +$at_traceoff +echo "calc.at:614: \$CXX --version || exit 77" +echo calc.at:614 >$at_check_line_file +( $at_traceon; $CXX --version || exit 77 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:614: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:614: \$CXX \$CXXFLAGS \$CPPFLAGS calc.c -o calc" +echo calc.at:614 >$at_check_line_file +( $at_traceon; $CXX $CXXFLAGS $CPPFLAGS calc.c -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:614: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:614: \$PREPARSER ./calc input" +echo calc.at:614 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:614: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:614: \$PREPARSER ./calc input" +echo calc.at:614 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:614: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:614: cat stderr" +echo calc.at:614 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:614: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:614: \$PREPARSER ./calc input" +echo calc.at:614 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:614: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:614: cat stderr" +echo calc.at:614 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:614: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:614: \$PREPARSER ./calc input" +echo calc.at:614 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:614: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:614: cat stderr" +echo calc.at:614 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:614: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:614: \$PREPARSER ./calc input" +echo calc.at:614 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:614: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:614: cat stderr" +echo calc.at:614 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:614: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:614: \$PREPARSER ./calc input" +echo calc.at:614 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:614: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:614: cat stderr" +echo calc.at:614 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:614: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:614: \$PREPARSER ./calc /dev/null" +echo calc.at:614 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:614: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:614: cat stderr" +echo calc.at:614 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:614: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:614: \$PREPARSER ./calc input" +echo calc.at:614 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:614: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:614: cat stderr" +echo calc.at:614 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:614: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:614: \$PREPARSER ./calc input" +echo calc.at:614 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:614: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:614: cat stderr" +echo calc.at:614 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:614: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:614: \$PREPARSER ./calc input" +echo calc.at:614 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:614: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:614: cat stderr" +echo calc.at:614 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:614: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 85 ) # 85. calc.at:616: Calculator %skeleton "lalr1.cc" %defines + at_setup_line='calc.at:616' + at_desc='Calculator %skeleton "lalr1.cc" %defines' + $at_quiet $ECHO_N " 85: Calculator %skeleton "lalr1.cc" %defines $ECHO_C" + at_xfail=no + ( + echo "85. calc.at:616: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%skeleton "lalr1.cc" %defines +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +typedef yy::Location YYLTYPE; +static int yylex (YYSTYPE *yylval); +static int yygetc (YYSTYPE *yylval); +static void yyungetc (YYSTYPE *yylval, int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +/* Currently, print_ is required in C++. */ +void +yy::Parser::print_ () +{ + +} + +/* A C++ error reporting function. */ +void +yy::Parser::error_ () +{ + std::cerr << message << std::endl; +} + +int +yyparse () +{ + yy::Parser parser (!!YYDEBUG); + return parser.parse (); +} + + + + +static int +yygetc (YYSTYPE *yylval) +{ + int res = getc (yyin); + (void) yylval;; + + return res; +} + + +static void +yyungetc (YYSTYPE *yylval, int c) +{ + (void) yylval;; + + ungetc (c, yyin); +} + +static int +read_signed_integer (YYSTYPE *yylval) +{ + int c = yygetc (yylval); + int sign = 1; + int n = 0; + + (void) yylval;; + if (c == '-') + { + c = yygetc (yylval); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (yylval); + } + + yyungetc (yylval, c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (YYSTYPE *yylval) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + } + + + + /* Skip white space. */ + while ((c = yygetc (yylval)) == ' ' || c == '\t') + { + + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc (yylval, c); + (*yylval).ival = read_signed_integer (yylval); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:616: bison -o calc.c calc.y" +echo calc.at:616 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:616: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +$at_traceoff +echo "calc.at:616: \$CXX --version || exit 77" +echo calc.at:616 >$at_check_line_file +( $at_traceon; $CXX --version || exit 77 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:616: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:616: \$CXX \$CXXFLAGS \$CPPFLAGS calc.c -o calc" +echo calc.at:616 >$at_check_line_file +( $at_traceon; $CXX $CXXFLAGS $CPPFLAGS calc.c -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:616: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:616: \$PREPARSER ./calc input" +echo calc.at:616 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:616: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:616: \$PREPARSER ./calc input" +echo calc.at:616 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:616: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:616: cat stderr" +echo calc.at:616 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:616: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:616: \$PREPARSER ./calc input" +echo calc.at:616 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:616: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:616: cat stderr" +echo calc.at:616 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:616: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:616: \$PREPARSER ./calc input" +echo calc.at:616 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:616: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:616: cat stderr" +echo calc.at:616 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:616: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:616: \$PREPARSER ./calc input" +echo calc.at:616 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:616: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:616: cat stderr" +echo calc.at:616 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:616: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:616: \$PREPARSER ./calc input" +echo calc.at:616 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:616: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:616: cat stderr" +echo calc.at:616 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:616: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:616: \$PREPARSER ./calc /dev/null" +echo calc.at:616 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:616: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:616: cat stderr" +echo calc.at:616 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:616: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:616: \$PREPARSER ./calc input" +echo calc.at:616 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:616: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:616: cat stderr" +echo calc.at:616 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:616: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:616: \$PREPARSER ./calc input" +echo calc.at:616 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:616: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:616: cat stderr" +echo calc.at:616 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:616: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:616: \$PREPARSER ./calc input" +echo calc.at:616 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:616: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. +sed 's/^[-0-9.]*: //' expout >at-expout +mv at-expout expout +# 4. If error-verbose is not used, strip the`, unexpected....' part. +sed 's/syntax error, .*$/syntax error/' expout >at-expout +mv at-expout expout +# 5. Check +$at_traceoff +echo "calc.at:616: cat stderr" +echo calc.at:616 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:616: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 86 ) # 86. calc.at:626: Calculator %skeleton "lalr1.cc" %error-verbose %locations %defines %name-prefix="calc" %verbose %yacc + at_setup_line='calc.at:626' + at_desc='Calculator %skeleton "lalr1.cc" %error-verbose %locations %defines %name-prefix="calc" %verbose %yacc' + $at_quiet $ECHO_N " 86: Calculator %skeleton "lalr1.cc" %error-verbose %locations %defines %name-prefix="calc" %verbose %yacc$ECHO_C" + at_xfail=no + ( + echo "86. calc.at:626: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%skeleton "lalr1.cc" %error-verbose %locations %defines %name-prefix="calc" %verbose %yacc +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +typedef yy::Location YYLTYPE; +static int yylex (YYSTYPE *yylval, YYLTYPE *yylloc); +static int yygetc (YYSTYPE *yylval, YYLTYPE *yylloc); +static void yyungetc (YYSTYPE *yylval, YYLTYPE *yylloc, int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +/* Currently, print_ is required in C++. */ +void +yy::Parser::print_ () +{ + + std::cerr << location; +} + +/* A C++ error reporting function. */ +void +yy::Parser::error_ () +{ + std::cerr << location << ": " << message << std::endl; +} + +int +yyparse () +{ + yy::Parser parser (!!YYDEBUG, yy::Location::Location ()); + return parser.parse (); +} + + + + +static YYLTYPE last_yylloc; + +static int +yygetc (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + int res = getc (yyin); + (void) yylval;(void) yylloc; + + last_yylloc = (*yylloc); + if (res == '\n') + { + (*yylloc).end.line++; + (*yylloc).end.column = 0; + } + else + (*yylloc).end.column++; + + return res; +} + + +static void +yyungetc (YYSTYPE *yylval, YYLTYPE *yylloc, int c) +{ + (void) yylval;(void) yylloc; + + /* Wrong when C == `\n'. */ + (*yylloc) = last_yylloc; + + ungetc (c, yyin); +} + +static int +read_signed_integer (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + int c = yygetc (yylval, yylloc); + int sign = 1; + int n = 0; + + (void) yylval;(void) yylloc; + if (c == '-') + { + c = yygetc (yylval, yylloc); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (yylval, yylloc); + } + + yyungetc (yylval, yylloc, c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + } + + (*yylloc).begin = (*yylloc).end; + + /* Skip white space. */ + while ((c = yygetc (yylval, yylloc)) == ' ' || c == '\t') + { + (*yylloc).begin = (*yylloc).end; + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc (yylval, yylloc, c); + (*yylval).ival = read_signed_integer (yylval, yylloc); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:626: bison -o calc.c calc.y" +echo calc.at:626 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:626: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +$at_traceoff +echo "calc.at:626: \$CXX --version || exit 77" +echo calc.at:626 >$at_check_line_file +( $at_traceon; $CXX --version || exit 77 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:626: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:626: \$CXX \$CXXFLAGS \$CPPFLAGS calc.c -o calc" +echo calc.at:626 >$at_check_line_file +( $at_traceon; $CXX $CXXFLAGS $CPPFLAGS calc.c -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:626: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:626: \$PREPARSER ./calc input" +echo calc.at:626 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:626: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:626: \$PREPARSER ./calc input" +echo calc.at:626 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:626: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:626: cat stderr" +echo calc.at:626 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:626: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:626: \$PREPARSER ./calc input" +echo calc.at:626 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:626: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:626: cat stderr" +echo calc.at:626 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:626: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:626: \$PREPARSER ./calc input" +echo calc.at:626 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:626: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:626: cat stderr" +echo calc.at:626 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:626: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:626: \$PREPARSER ./calc input" +echo calc.at:626 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:626: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:626: cat stderr" +echo calc.at:626 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:626: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:626: \$PREPARSER ./calc input" +echo calc.at:626 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:626: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:626: cat stderr" +echo calc.at:626 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:626: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:626: \$PREPARSER ./calc /dev/null" +echo calc.at:626 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:626: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:626: cat stderr" +echo calc.at:626 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:626: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:626: \$PREPARSER ./calc input" +echo calc.at:626 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:626: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:626: cat stderr" +echo calc.at:626 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:626: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:626: \$PREPARSER ./calc input" +echo calc.at:626 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:626: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:626: cat stderr" +echo calc.at:626 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:626: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:626: \$PREPARSER ./calc input" +echo calc.at:626 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:626: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:626: cat stderr" +echo calc.at:626 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:626: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 87 ) # 87. calc.at:629: Calculator %skeleton "lalr1.cc" %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc + at_setup_line='calc.at:629' + at_desc='Calculator %skeleton "lalr1.cc" %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc' + $at_quiet $ECHO_N " 87: Calculator %skeleton "lalr1.cc" %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc$ECHO_C" + at_xfail=no + ( + echo "87. calc.at:629: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%skeleton "lalr1.cc" %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +typedef yy::Location YYLTYPE; +static int yylex (YYSTYPE *yylval, YYLTYPE *yylloc); +static int yygetc (YYSTYPE *yylval, YYLTYPE *yylloc); +static void yyungetc (YYSTYPE *yylval, YYLTYPE *yylloc, int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +/* Currently, print_ is required in C++. */ +void +yy::Parser::print_ () +{ + + std::cerr << location; +} + +/* A C++ error reporting function. */ +void +yy::Parser::error_ () +{ + std::cerr << location << ": " << message << std::endl; +} + +int +yyparse () +{ + yy::Parser parser (!!YYDEBUG, yy::Location::Location ()); + return parser.parse (); +} + + + + +static YYLTYPE last_yylloc; + +static int +yygetc (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + int res = getc (yyin); + (void) yylval;(void) yylloc; + + last_yylloc = (*yylloc); + if (res == '\n') + { + (*yylloc).end.line++; + (*yylloc).end.column = 0; + } + else + (*yylloc).end.column++; + + return res; +} + + +static void +yyungetc (YYSTYPE *yylval, YYLTYPE *yylloc, int c) +{ + (void) yylval;(void) yylloc; + + /* Wrong when C == `\n'. */ + (*yylloc) = last_yylloc; + + ungetc (c, yyin); +} + +static int +read_signed_integer (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + int c = yygetc (yylval, yylloc); + int sign = 1; + int n = 0; + + (void) yylval;(void) yylloc; + if (c == '-') + { + c = yygetc (yylval, yylloc); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (yylval, yylloc); + } + + yyungetc (yylval, yylloc, c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + } + + (*yylloc).begin = (*yylloc).end; + + /* Skip white space. */ + while ((c = yygetc (yylval, yylloc)) == ' ' || c == '\t') + { + (*yylloc).begin = (*yylloc).end; + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc (yylval, yylloc, c); + (*yylval).ival = read_signed_integer (yylval, yylloc); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:629: bison -o calc.c calc.y" +echo calc.at:629 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +$at_traceoff +echo "calc.at:629: \$CXX --version || exit 77" +echo calc.at:629 >$at_check_line_file +( $at_traceon; $CXX --version || exit 77 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:629: \$CXX \$CXXFLAGS \$CPPFLAGS calc.c -o calc" +echo calc.at:629 >$at_check_line_file +( $at_traceon; $CXX $CXXFLAGS $CPPFLAGS calc.c -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:629: \$PREPARSER ./calc input" +echo calc.at:629 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:629: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "486 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:629: \$PREPARSER ./calc input" +echo calc.at:629 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:629: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:629: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "11 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:629: cat stderr" +echo calc.at:629 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:629: \$PREPARSER ./calc input" +echo calc.at:629 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:629: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:629: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "15 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:629: cat stderr" +echo calc.at:629 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:629: \$PREPARSER ./calc input" +echo calc.at:629 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:629: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:629: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "4 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:629: cat stderr" +echo calc.at:629 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:629: \$PREPARSER ./calc input" +echo calc.at:629 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:629: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:629: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "22 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:629: cat stderr" +echo calc.at:629 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:629: \$PREPARSER ./calc input" +echo calc.at:629 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:629: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:629: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "14 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:629: cat stderr" +echo calc.at:629 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:629: \$PREPARSER ./calc /dev/null" +echo calc.at:629 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:629: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:629: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "4 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:629: cat stderr" +echo calc.at:629 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:629: \$PREPARSER ./calc input" +echo calc.at:629 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:629: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "156 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:629: cat stderr" +echo calc.at:629 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:629: \$PREPARSER ./calc input" +echo calc.at:629 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:629: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "62 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:629: cat stderr" +echo calc.at:629 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:629: \$PREPARSER ./calc input" +echo calc.at:629 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:629: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "70 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:629: cat stderr" +echo calc.at:629 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:629: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 88 ) # 88. calc.at:631: Calculator %skeleton "lalr1.cc" %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc + at_setup_line='calc.at:631' + at_desc='Calculator %skeleton "lalr1.cc" %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc' + $at_quiet $ECHO_N " 88: Calculator %skeleton "lalr1.cc" %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc$ECHO_C" + at_xfail=no + ( + echo "88. calc.at:631: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%skeleton "lalr1.cc" %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +typedef yy::Location YYLTYPE; +static int yylex (YYSTYPE *yylval, YYLTYPE *yylloc); +static int yygetc (YYSTYPE *yylval, YYLTYPE *yylloc); +static void yyungetc (YYSTYPE *yylval, YYLTYPE *yylloc, int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { } +; + +line: + '\n' +| exp '\n' { } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +/* Currently, print_ is required in C++. */ +void +yy::Parser::print_ () +{ + + std::cerr << location; +} + +/* A C++ error reporting function. */ +void +yy::Parser::error_ () +{ + std::cerr << location << ": " << message << std::endl; +} + +int +yyparse () +{ + yy::Parser parser (!!YYDEBUG, yy::Location::Location ()); + return parser.parse (); +} + + + + +static YYLTYPE last_yylloc; + +static int +yygetc (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + int res = getc (yyin); + (void) yylval;(void) yylloc; + + last_yylloc = (*yylloc); + if (res == '\n') + { + (*yylloc).end.line++; + (*yylloc).end.column = 0; + } + else + (*yylloc).end.column++; + + return res; +} + + +static void +yyungetc (YYSTYPE *yylval, YYLTYPE *yylloc, int c) +{ + (void) yylval;(void) yylloc; + + /* Wrong when C == `\n'. */ + (*yylloc) = last_yylloc; + + ungetc (c, yyin); +} + +static int +read_signed_integer (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + int c = yygetc (yylval, yylloc); + int sign = 1; + int n = 0; + + (void) yylval;(void) yylloc; + if (c == '-') + { + c = yygetc (yylval, yylloc); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (yylval, yylloc); + } + + yyungetc (yylval, yylloc, c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + } + + (*yylloc).begin = (*yylloc).end; + + /* Skip white space. */ + while ((c = yygetc (yylval, yylloc)) == ' ' || c == '\t') + { + (*yylloc).begin = (*yylloc).end; + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc (yylval, yylloc, c); + (*yylval).ival = read_signed_integer (yylval, yylloc); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:631: bison -o calc.c calc.y" +echo calc.at:631 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +$at_traceoff +echo "calc.at:631: \$CXX --version || exit 77" +echo calc.at:631 >$at_check_line_file +( $at_traceon; $CXX --version || exit 77 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:631: \$CXX \$CXXFLAGS \$CPPFLAGS calc.c -o calc" +echo calc.at:631 >$at_check_line_file +( $at_traceon; $CXX $CXXFLAGS $CPPFLAGS calc.c -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:631: \$PREPARSER ./calc input" +echo calc.at:631 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:631: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "486 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:631: \$PREPARSER ./calc input" +echo calc.at:631 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:631: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:631: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "11 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:631: cat stderr" +echo calc.at:631 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:631: \$PREPARSER ./calc input" +echo calc.at:631 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:631: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:631: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "15 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:631: cat stderr" +echo calc.at:631 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:631: \$PREPARSER ./calc input" +echo calc.at:631 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:631: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:631: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "4 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:631: cat stderr" +echo calc.at:631 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:631: \$PREPARSER ./calc input" +echo calc.at:631 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:631: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:631: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "22 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:631: cat stderr" +echo calc.at:631 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:631: \$PREPARSER ./calc input" +echo calc.at:631 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:631: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:631: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "14 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:631: cat stderr" +echo calc.at:631 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:631: \$PREPARSER ./calc /dev/null" +echo calc.at:631 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:631: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:631: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "4 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:631: cat stderr" +echo calc.at:631 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:631: \$PREPARSER ./calc input" +echo calc.at:631 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:631: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "156 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:631: cat stderr" +echo calc.at:631 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:631: \$PREPARSER ./calc input" +echo calc.at:631 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:631: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "62 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:631: cat stderr" +echo calc.at:631 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:631: \$PREPARSER ./calc input" +echo calc.at:631 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:631: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "70 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:631: cat stderr" +echo calc.at:631 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:631: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 89 ) # 89. calc.at:633: Calculator %skeleton "lalr1.cc" %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count} + at_setup_line='calc.at:633' + at_desc='Calculator %skeleton "lalr1.cc" %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}' + $at_quiet $ECHO_N " 89: Calculator %skeleton "lalr1.cc" %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count}$ECHO_C" + at_xfail=no + ( + echo "89. calc.at:633: testing ..." + $at_traceon + + + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >calc.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Infix notation calculator--calc */ +%skeleton "lalr1.cc" %pure-parser %error-verbose %debug %locations %defines %name-prefix="calc" %verbose %yacc %parse-param {semantic_value *result} %parse-param {int *count} +%{ +#include + +#include +#include +#if HAVE_UNISTD_H +# include +#else +# undef alarm +# define alarm(seconds) /* empty */ +#endif +#include + +/* Exercise pre-prologue dependency to %union. */ +typedef int semantic_value; + +static semantic_value global_result = 0; +static int global_count = 0; +%} + +/* Exercise %union. */ +%union +{ + semantic_value ival; +}; + +%{ +static int power (int base, int exponent); +typedef yy::Location YYLTYPE; +static int yylex (YYSTYPE *yylval, YYLTYPE *yylloc); +static int yygetc (YYSTYPE *yylval, YYLTYPE *yylloc); +static void yyungetc (YYSTYPE *yylval, YYLTYPE *yylloc, int c); +%} + +/* Bison Declarations */ +%token CALC_EOF 0 "end of input" +%token NUM "number" +%type exp + +%nonassoc '=' /* comparison */ +%left '-' '+' +%left '*' '/' +%left NEG /* negation--unary minus */ +%right '^' /* exponentiation */ + +/* Grammar follows */ +%% +input: + line +| input line { ++*count; ++global_count; } +; + +line: + '\n' +| exp '\n' { *result = global_result = $1; } +; + +exp: + NUM { $$ = $1; } +| exp '=' exp + { + if ($1 != $3) + fprintf (stderr, "calc: error: %d != %d\n", $1, $3); + $$ = $1; + } +| exp '+' exp { $$ = $1 + $3; } +| exp '-' exp { $$ = $1 - $3; } +| exp '*' exp { $$ = $1 * $3; } +| exp '/' exp { $$ = $1 / $3; } +| '-' exp %prec NEG { $$ = -$2; } +| exp '^' exp { $$ = power ($1, $3); } +| '(' exp ')' { $$ = $2; } +| '(' error ')' { $$ = 1111; } +| '!' { YYERROR; } +| '-' error { YYERROR; } +; +%% +/* The input. */ +static FILE *yyin; + +/* Currently, print_ is required in C++. */ +void +yy::Parser::print_ () +{ + + std::cerr << location; +} + +/* A C++ error reporting function. */ +void +yy::Parser::error_ () +{ + std::cerr << location << ": " << message << std::endl; +} + +int +yyparse (semantic_value *result, int *count) +{ + yy::Parser parser (!!YYDEBUG, yy::Location::Location (), result, count); + return parser.parse (); +} + + + + +static YYLTYPE last_yylloc; + +static int +yygetc (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + int res = getc (yyin); + (void) yylval;(void) yylloc; + + last_yylloc = (*yylloc); + if (res == '\n') + { + (*yylloc).end.line++; + (*yylloc).end.column = 0; + } + else + (*yylloc).end.column++; + + return res; +} + + +static void +yyungetc (YYSTYPE *yylval, YYLTYPE *yylloc, int c) +{ + (void) yylval;(void) yylloc; + + /* Wrong when C == `\n'. */ + (*yylloc) = last_yylloc; + + ungetc (c, yyin); +} + +static int +read_signed_integer (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + int c = yygetc (yylval, yylloc); + int sign = 1; + int n = 0; + + (void) yylval;(void) yylloc; + if (c == '-') + { + c = yygetc (yylval, yylloc); + sign = -1; + } + + while (isdigit (c)) + { + n = 10 * n + (c - '0'); + c = yygetc (yylval, yylloc); + } + + yyungetc (yylval, yylloc, c); + + return sign * n; +} + + + +/*---------------------------------------------------------------. +| Lexical analyzer returns an integer on the stack and the token | +| NUM, or the ASCII character read if not a number. Skips all | +| blanks and tabs, returns 0 for EOF. | +`---------------------------------------------------------------*/ + +static int +yylex (YYSTYPE *yylval, YYLTYPE *yylloc) +{ + static int init = 1; + int c; + + if (init) + { + init = 0; + + } + + (*yylloc).begin = (*yylloc).end; + + /* Skip white space. */ + while ((c = yygetc (yylval, yylloc)) == ' ' || c == '\t') + { + (*yylloc).begin = (*yylloc).end; + } + + /* process numbers */ + if (c == '.' || isdigit (c)) + { + yyungetc (yylval, yylloc, c); + (*yylval).ival = read_signed_integer (yylval, yylloc); + return NUM; + } + + /* Return end-of-file. */ + if (c == EOF) + return CALC_EOF; + + /* Return single chars. */ + return c; +} + +static int +power (int base, int exponent) +{ + int res = 1; + if (exponent < 0) + exit (1); + for (/* Niente */; exponent; --exponent) + res *= base; + return res; +} + + +int +main (int argc, const char **argv) +{ + semantic_value result = 0; + int count = 0; + int status; + + alarm (10); + if (argc == 2) + yyin = fopen (argv[1], "r"); + else + yyin = stdin; + + if (!yyin) + { + perror (argv[1]); + exit (1); + } + + + status = yyparse (&result, &count); + if (global_result != result) + abort (); + if (global_count != count) + abort (); + return status; +} +_ATEOF + + + + + +# Specify the output files to avoid problems on different file systems. +$at_traceoff +echo "calc.at:633: bison -o calc.c calc.y" +echo calc.at:633 >$at_check_line_file +( $at_traceon; bison -o calc.c calc.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +$at_traceoff +echo "calc.at:633: \$CXX --version || exit 77" +echo calc.at:633 >$at_check_line_file +( $at_traceon; $CXX --version || exit 77 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:633: \$CXX \$CXXFLAGS \$CPPFLAGS calc.c -o calc" +echo calc.at:633 >$at_check_line_file +( $at_traceon; $CXX $CXXFLAGS $CPPFLAGS calc.c -o calc ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Test the priorities. +cat >input <<'_ATEOF' +1 + 2 * 3 = 7 +1 + 2 * -3 = -5 + +-1^2 = -1 +(-1)^2 = 1 + +---1 = -1 + +1 - 2 - 3 = -4 +1 - (2 - 3) = 2 + +2^2^3 = 256 +(2^2)^3 = 64 +_ATEOF + +$at_traceoff +echo "calc.at:633: \$PREPARSER ./calc input" +echo calc.at:633 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:633: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "486 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Some syntax errors. +cat >input <<'_ATEOF' +0 0 +_ATEOF + +$at_traceoff +echo "calc.at:633: \$PREPARSER ./calc input" +echo calc.at:633 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:633: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:633: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "11 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected "number" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:633: cat stderr" +echo calc.at:633 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1//2 +_ATEOF + +$at_traceoff +echo "calc.at:633: \$PREPARSER ./calc input" +echo calc.at:633 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:633: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:633: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "15 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.2: syntax error, unexpected '/', expecting "number" or '-' or '(' or '!' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:633: cat stderr" +echo calc.at:633 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +error +_ATEOF + +$at_traceoff +echo "calc.at:633: \$PREPARSER ./calc input" +echo calc.at:633 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:633: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:633: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "4 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected $undefined +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:633: cat stderr" +echo calc.at:633 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +1 = 2 = 3 +_ATEOF + +$at_traceoff +echo "calc.at:633: \$PREPARSER ./calc input" +echo calc.at:633 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:633: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:633: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "22 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.6: syntax error, unexpected '=' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:633: cat stderr" +echo calc.at:633 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' + ++1 +_ATEOF + +$at_traceoff +echo "calc.at:633: \$PREPARSER ./calc input" +echo calc.at:633 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:633: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:633: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "14 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +2.0: syntax error, unexpected '+' +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:633: cat stderr" +echo calc.at:633 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Exercise error messages with EOF: work on an empty file. +$at_traceoff +echo "calc.at:633: \$PREPARSER ./calc /dev/null" +echo calc.at:633 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc /dev/null ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "calc.at:633: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:633: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "4 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.0: syntax error, unexpected "end of input" +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:633: cat stderr" +echo calc.at:633 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Exercise the error token: without it, we die at the first error, +# hence be sure to +# +# - have several errors which exercise different shift/discardings +# - (): nothing to pop, nothing to discard +# - (1 + 1 + 1 +): a lot to pop, nothing to discard +# - (* * *): nothing to pop, a lot to discard +# - (1 + 2 * *): some to pop and discard +# +# - test the action associated to `error' +# +# - check the lookahead that triggers an error is not discarded +# when we enter error recovery. Below, the lookahead causing the +# first error is ")", which is needed to recover from the error and +# produce the "0" that triggers the "0 != 1" error. +# +cat >input <<'_ATEOF' +() + (1 + 1 + 1 +) + (* * *) + (1 * 2 * *) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:633: \$PREPARSER ./calc input" +echo calc.at:633 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:633: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "156 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.1: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.17: syntax error, unexpected ')', expecting "number" or '-' or '(' or '!' +1.22: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.40: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +calc: error: 4444 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:633: cat stderr" +echo calc.at:633 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# The same, but this time exercising explicitly triggered syntax errors. +# POSIX says the lookahead causing the error should not be discarded. +cat >input <<'_ATEOF' +(!) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:633: \$PREPARSER ./calc input" +echo calc.at:633 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:633: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "62 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.9: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:633: cat stderr" +echo calc.at:633 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +cat >input <<'_ATEOF' +(- *) + (0 0) = 1 +_ATEOF + +$at_traceoff +echo "calc.at:633: \$PREPARSER ./calc input" +echo calc.at:633 >$at_check_line_file +( $at_traceon; $PREPARSER ./calc input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; tee stderr <$at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "calc.at:633: wc -l $at_check_line_file +( $at_traceon; wc -l $at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "70 +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Normalize the observed and expected error messages, depending upon the +# options. +# 1. Remove the traces from observed. +sed '/^Starting/d +/^Entering/d +/^Stack/d +/^Reading/d +/^Reducing/d +/^Shifting/d +/^state/d +/^Error:/d +/^Next/d +/^Discarding/d +/^yydestructor:/d' stderr >at-stderr +mv at-stderr stderr +# 2. Create the reference error message. +cat >expout <<'_ATEOF' +1.3: syntax error, unexpected '*', expecting "number" or '-' or '(' or '!' +1.11: syntax error, unexpected "number" +calc: error: 2222 != 1 +_ATEOF + +# 3. If locations are not used, remove them. + +# 4. If error-verbose is not used, strip the`, unexpected....' part. + +# 5. Check +$at_traceoff +echo "calc.at:633: cat stderr" +echo calc.at:633 >$at_check_line_file +( $at_traceon; cat stderr ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff expout $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "calc.at:633: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + + banner-12 ) # Banner 12. torture.at:19 + cat <<\_ATEOF + +Torture Tests. + +_ATEOF + ;; + + 90 ) # 90. torture.at:140: Big triangle + at_setup_line='torture.at:140' + at_desc='Big triangle' + $at_quiet $ECHO_N " 90: Big triangle $ECHO_C" + at_xfail=no + ( + echo "90. torture.at:140: testing ..." + $at_traceon + + +# I have been able to go up to 2000 on my machine. +# I tried 3000, a 29Mb grammar file, but then my system killed bison. +# With 500 and the new parser, which consume far too much memory, +# it gets killed too. Of course the parser is to be cleaned. +cat >gengram.pl <<'_ATEOF' +#! /usr/bin/perl -w + +use strict; +my $max = $ARGV[0] || 10; + +print < + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +%{ +#include +#include + +#define YYERROR_VERBOSE 1 +#define YYDEBUG 1 + +static int yylex (void); +static void yyerror (const char *msg); +%} +%union +{ + int val; +}; + +%token END "end" +%type exp input +EOF + +for my $size (1 .. $max) + { + print "%token t$size $size \"$size\"\n"; + }; + +print < $max) + return 0; + else if (inner > outer) + { + inner = 1; + ++outer; + return END; + } + return inner++; +} + +static void +yyerror (const char *msg) +{ + fprintf (stderr, "%s\\n", msg); +} + +int +main (void) +{ + yydebug = !!getenv ("YYDEBUG"); + return yyparse (); +} +EOF +_ATEOF + + +$at_traceoff +echo "torture.at:146: perl -w ./gengram.pl 200 || exit 77" +echo torture.at:146 >$at_check_line_file +( $at_traceon; perl -w ./gengram.pl 200 || exit 77 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; tee stdout <$at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "torture.at:146: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +mv stdout input.y + +$at_traceoff +echo "torture.at:147: bison -v -o input.c input.y" +echo torture.at:147 >$at_check_line_file +( $at_traceon; bison -v -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "torture.at:147: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "torture.at:148: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS input.c \$LIBS -o input" +echo torture.at:148 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS input.c $LIBS -o input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "torture.at:148: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "torture.at:149: \$PREPARSER ./input" +echo torture.at:149 >$at_check_line_file +( $at_traceon; $PREPARSER ./input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "torture.at:149: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 91 ) # 91. torture.at:231: Big horizontal + at_setup_line='torture.at:231' + at_desc='Big horizontal' + $at_quiet $ECHO_N " 91: Big horizontal $ECHO_C" + at_xfail=no + ( + echo "91. torture.at:231: testing ..." + $at_traceon + + +# I have been able to go up to 10000 on my machine, but I had to +# increase the maximum stack size (* 100). It gave: +# +# input.y 263k +# input.tab.c 1.3M +# input 453k +# +# gengram.pl 10000 0.70s user 0.01s sys 99% cpu 0.711 total +# bison input.y 730.56s user 0.53s sys 99% cpu 12:12.34 total +# gcc -Wall input.tab.c -o input 5.81s user 0.20s sys 100% cpu 6.01 total +# ./input 0.00s user 0.01s sys 108% cpu 0.01 total +# +cat >gengram.pl <<'_ATEOF' +#! /usr/bin/perl -w + +use strict; +my $max = $ARGV[0] || 10; + +print < + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +%{ +#include +#include + +#define YYERROR_VERBOSE 1 +#define YYDEBUG 1 + +static int yylex (void); +static void yyerror (const char *msg); +%} +EOF + +for my $size (1 .. $max) + { + print "%token t$size $size \"$size\"\n"; + }; + +print < $max) + return 0; + else + return counter++; +} + +static void +yyerror (const char *msg) +{ + fprintf (stderr, "%s\\n", msg); +} + +int +main (void) +{ + yydebug = !!getenv ("YYDEBUG"); + return yyparse (); +} +EOF +_ATEOF + + +$at_traceoff +echo "torture.at:245: perl -w ./gengram.pl 1000 || exit 77" +echo torture.at:245 >$at_check_line_file +( $at_traceon; perl -w ./gengram.pl 1000 || exit 77 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; tee stdout <$at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "torture.at:245: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +mv stdout input.y + + +# GNU m4 requires about 70 MiB for this test on a 32-bit host. +# Ask for 200 MiB, which should be plenty even on a 64-bit host. +data_limit=`(ulimit -S -d) 2>/dev/null` +case $data_limit in +[0-9]*) + if test "$data_limit" -lt 204000; then + ulimit -S -d 204000 + fi +esac + +$at_traceoff +echo "torture.at:251: bison -v -o input.c input.y" +echo torture.at:251 >$at_check_line_file +( $at_traceon; bison -v -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "torture.at:251: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "torture.at:252: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS input.c \$LIBS -o input" +echo torture.at:252 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS input.c $LIBS -o input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "torture.at:252: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "torture.at:253: \$PREPARSER ./input" +echo torture.at:253 >$at_check_line_file +( $at_traceon; $PREPARSER ./input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "torture.at:253: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 92 ) # 92. torture.at:366: Many lookaheads + at_setup_line='torture.at:366' + at_desc='Many lookaheads' + $at_quiet $ECHO_N " 92: Many lookaheads $ECHO_C" + at_xfail=no + ( + echo "92. torture.at:366: testing ..." + $at_traceon + + +cat >gengram.pl <<'_ATEOF' +#! /usr/bin/perl -w + +use strict; +use Text::Wrap; +my $max = $ARGV[0] || 10; + +print < +#include + +#define YYERROR_VERBOSE 1 +#define YYDEBUG 1 + +static int yylex (void); +static void yyerror (const char *msg); +%} +%union +{ + int val; +}; + +%type input exp +%token token +EOF + +print + wrap ("%type ", + " ", + map { "n$_" } (1 .. $max)), + "\n"; + +for my $count (1 .. $max) + { + print "%token t$count $count \"$count\"\n"; + }; + +print < $max) + return 0; + if (return_token) + { + return_token = 0; + return token; + } + return_token = 1; + return counter++; +} + +static void +yyerror (const char *msg) +{ + fprintf (stderr, "%s\\n", msg); +} + +int +main (void) +{ + yydebug = !!getenv ("YYDEBUG"); + return yyparse (); +} +EOF +_ATEOF + + +$at_traceoff +echo "torture.at:368: perl -w ./gengram.pl 1000 || exit 77" +echo torture.at:368 >$at_check_line_file +( $at_traceon; perl -w ./gengram.pl 1000 || exit 77 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; tee stdout <$at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "torture.at:368: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +mv stdout input.y + + +# GNU m4 requires about 70 MiB for this test on a 32-bit host. +# Ask for 200 MiB, which should be plenty even on a 64-bit host. +data_limit=`(ulimit -S -d) 2>/dev/null` +case $data_limit in +[0-9]*) + if test "$data_limit" -lt 204000; then + ulimit -S -d 204000 + fi +esac + +$at_traceoff +echo "torture.at:374: bison -v -o input.c input.y" +echo torture.at:374 >$at_check_line_file +( $at_traceon; bison -v -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "torture.at:374: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "torture.at:375: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS input.c \$LIBS -o input" +echo torture.at:375 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS input.c $LIBS -o input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "torture.at:375: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "torture.at:376: \$PREPARSER ./input" +echo torture.at:376 >$at_check_line_file +( $at_traceon; $PREPARSER ./input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "torture.at:376: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 93 ) # 93. torture.at:440: Exploding the Stack Size with Alloca + at_setup_line='torture.at:440' + at_desc='Exploding the Stack Size with Alloca' + $at_quiet $ECHO_N " 93: Exploding the Stack Size with Alloca $ECHO_C" + at_xfail=no + ( + echo "93. torture.at:440: testing ..." + $at_traceon + + +# A grammar of parens growing the stack thanks to right recursion. +# exp: +cat >input.y <<'_ATEOF' +%{ +#include +#include + + static int yylex (void); + static void yyerror (const char *msg); +%} +%error-verbose +%debug +%token WAIT_FOR_EOF +%% +exp: WAIT_FOR_EOF exp | ; +%% +static void +yyerror (const char *msg) +{ + fprintf (stderr, "%s\n", msg); + exit (1); +} + +/* There are YYLVAL_MAX of WAIT_FOR_EOFs. */ +unsigned int yylval_max; + +static int +yylex (void) +{ + if (yylval--) + return WAIT_FOR_EOF; + else + return EOF; +} + +int +main (int argc, const char **argv) +{ + if (argc != 2) + abort (); + yylval = atoi (argv[1]); + yydebug = 1; + return yyparse (); +} +_ATEOF + +$at_traceoff +echo "torture.at:442: bison -o input.c input.y" +echo torture.at:442 >$at_check_line_file +( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "torture.at:442: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "torture.at:442: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS input.c \$LIBS -o input" +echo torture.at:442 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS input.c $LIBS -o input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "torture.at:442: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Below the limit of 200. +$at_traceoff +echo "torture.at:445: \$PREPARSER ./input 20" +echo torture.at:445 >$at_check_line_file +( $at_traceon; $PREPARSER ./input 20 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "torture.at:445: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +# Two enlargements: 2 * 2 * 200. +$at_traceoff +echo "torture.at:447: \$PREPARSER ./input 900" +echo torture.at:447 >$at_check_line_file +( $at_traceon; $PREPARSER ./input 900 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "torture.at:447: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +# Fails: beyond the limit of 10,000 (which we don't reach anyway since we +# multiply by two starting at 200 => 5120 is the last possible). +$at_traceoff +echo "torture.at:450: \$PREPARSER ./input 10000" +echo torture.at:450 >$at_check_line_file +( $at_traceon; $PREPARSER ./input 10000 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "torture.at:450: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 94 ) # 94. torture.at:461: Exploding the Stack Size with Malloc + at_setup_line='torture.at:461' + at_desc='Exploding the Stack Size with Malloc' + $at_quiet $ECHO_N " 94: Exploding the Stack Size with Malloc $ECHO_C" + at_xfail=no + ( + echo "94. torture.at:461: testing ..." + $at_traceon + + +# A grammar of parens growing the stack thanks to right recursion. +# exp: +cat >input.y <<'_ATEOF' +%{ +#include +#include +#define YYSTACK_USE_ALLOCA 0 + static int yylex (void); + static void yyerror (const char *msg); +%} +%error-verbose +%debug +%token WAIT_FOR_EOF +%% +exp: WAIT_FOR_EOF exp | ; +%% +static void +yyerror (const char *msg) +{ + fprintf (stderr, "%s\n", msg); + exit (1); +} + +/* There are YYLVAL_MAX of WAIT_FOR_EOFs. */ +unsigned int yylval_max; + +static int +yylex (void) +{ + if (yylval--) + return WAIT_FOR_EOF; + else + return EOF; +} + +int +main (int argc, const char **argv) +{ + if (argc != 2) + abort (); + yylval = atoi (argv[1]); + yydebug = 1; + return yyparse (); +} +_ATEOF + +$at_traceoff +echo "torture.at:463: bison -o input.c input.y" +echo torture.at:463 >$at_check_line_file +( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "torture.at:463: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "torture.at:463: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS input.c \$LIBS -o input" +echo torture.at:463 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS input.c $LIBS -o input ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "torture.at:463: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + +# Below the limit of 200. +$at_traceoff +echo "torture.at:466: \$PREPARSER ./input 20" +echo torture.at:466 >$at_check_line_file +( $at_traceon; $PREPARSER ./input 20 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "torture.at:466: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +# Two enlargements: 2 * 2 * 200. +$at_traceoff +echo "torture.at:468: \$PREPARSER ./input 900" +echo torture.at:468 >$at_check_line_file +( $at_traceon; $PREPARSER ./input 900 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "torture.at:468: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +# Fails: beyond the limit of 10,000 (which we don't reach anyway since we +# multiply by two starting at 200 => 5120 is the possible). +$at_traceoff +echo "torture.at:471: \$PREPARSER ./input 10000" +echo torture.at:471 >$at_check_line_file +( $at_traceon; $PREPARSER ./input 10000 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "torture.at:471: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + + banner-13 ) # Banner 13. existing.at:21 + cat <<\_ATEOF + +Existing Grammars. + +_ATEOF + ;; + + 95 ) # 95. existing.at:26: GNU AWK Grammar + at_setup_line='existing.at:26' + at_desc='GNU AWK Grammar' + $at_quiet $ECHO_N " 95: GNU AWK Grammar $ECHO_C" + at_xfail=no + ( + echo "95. existing.at:26: testing ..." + $at_traceon + + +# We have been careful to strip all the actions excepts the +# mid-rule actions. We rely on %expect to check that there are +# indeed 65 SR conflicts. +# +# Bison was once wrong, due to an incorrect computation of nullable. +# It reported 485 SR conflicts! + +cat >input.y <<'_ATEOF' +%expect 65 + +%token FUNC_CALL NAME REGEXP +%token ERROR +%token YNUMBER YSTRING +%token RELOP APPEND_OP +%token ASSIGNOP MATCHOP NEWLINE CONCAT_OP +%token LEX_BEGIN LEX_END LEX_IF LEX_ELSE LEX_RETURN LEX_DELETE +%token LEX_WHILE LEX_DO LEX_FOR LEX_BREAK LEX_CONTINUE +%token LEX_PRINT LEX_PRINTF LEX_NEXT LEX_EXIT LEX_FUNCTION +%token LEX_GETLINE LEX_NEXTFILE +%token LEX_IN +%token LEX_AND LEX_OR INCREMENT DECREMENT +%token LEX_BUILTIN LEX_LENGTH + +/* Lowest to highest */ +%right ASSIGNOP +%right '?' ':' +%left LEX_OR +%left LEX_AND +%left LEX_GETLINE +%nonassoc LEX_IN +%left FUNC_CALL LEX_BUILTIN LEX_LENGTH +%nonassoc ',' +%nonassoc MATCHOP +%nonassoc RELOP '<' '>' '|' APPEND_OP TWOWAYIO +%left CONCAT_OP +%left YSTRING YNUMBER +%left '+' '-' +%left '*' '/' '%' +%right '!' UNARY +%right '^' +%left INCREMENT DECREMENT +%left '$' +%left '(' ')' +%% + +start + : opt_nls program opt_nls + ; + +program + : rule + | program rule + | error + | program error + | /* empty */ + ; + +rule + : LEX_BEGIN {} action + | LEX_END {} action + | LEX_BEGIN statement_term + | LEX_END statement_term + | pattern action + | action + | pattern statement_term + | function_prologue function_body + ; + +func_name + : NAME + | FUNC_CALL + | lex_builtin + ; + +lex_builtin + : LEX_BUILTIN + | LEX_LENGTH + ; + +function_prologue + : LEX_FUNCTION {} func_name '(' opt_param_list r_paren opt_nls + ; + +function_body + : l_brace statements r_brace opt_semi opt_nls + | l_brace r_brace opt_semi opt_nls + ; + + +pattern + : exp + | exp ',' exp + ; + +regexp + /* + * In this rule, want_regexp tells yylex that the next thing + * is a regexp so it should read up to the closing slash. + */ + : '/' {} REGEXP '/' + ; + +action + : l_brace statements r_brace opt_semi opt_nls + | l_brace r_brace opt_semi opt_nls + ; + +statements + : statement + | statements statement + | error + | statements error + ; + +statement_term + : nls + | semi opt_nls + ; + +statement + : semi opt_nls + | l_brace r_brace + | l_brace statements r_brace + | if_statement + | LEX_WHILE '(' exp r_paren opt_nls statement + | LEX_DO opt_nls statement LEX_WHILE '(' exp r_paren opt_nls + | LEX_FOR '(' NAME LEX_IN NAME r_paren opt_nls statement + | LEX_FOR '(' opt_exp semi opt_nls exp semi opt_nls opt_exp r_paren opt_nls statement + | LEX_FOR '(' opt_exp semi opt_nls semi opt_nls opt_exp r_paren opt_nls statement + | LEX_BREAK statement_term + | LEX_CONTINUE statement_term + | print '(' expression_list r_paren output_redir statement_term + | print opt_rexpression_list output_redir statement_term + | LEX_NEXT statement_term + | LEX_NEXTFILE statement_term + | LEX_EXIT opt_exp statement_term + | LEX_RETURN {} opt_exp statement_term + | LEX_DELETE NAME '[' expression_list ']' statement_term + | LEX_DELETE NAME statement_term + | exp statement_term + ; + +print + : LEX_PRINT + | LEX_PRINTF + ; + +if_statement + : LEX_IF '(' exp r_paren opt_nls statement + | LEX_IF '(' exp r_paren opt_nls statement + LEX_ELSE opt_nls statement + ; + +nls + : NEWLINE + | nls NEWLINE + ; + +opt_nls + : /* empty */ + | nls + ; + +input_redir + : /* empty */ + | '<' simp_exp + ; + +output_redir + : /* empty */ + | '>' exp + | APPEND_OP exp + | '|' exp + | TWOWAYIO exp + ; + +opt_param_list + : /* empty */ + | param_list + ; + +param_list + : NAME + | param_list comma NAME + | error + | param_list error + | param_list comma error + ; + +/* optional expression, as in for loop */ +opt_exp + : /* empty */ + | exp + ; + +opt_rexpression_list + : /* empty */ + | rexpression_list + ; + +rexpression_list + : rexp + | rexpression_list comma rexp + | error + | rexpression_list error + | rexpression_list error rexp + | rexpression_list comma error + ; + +opt_expression_list + : /* empty */ + | expression_list + ; + +expression_list + : exp + | expression_list comma exp + | error + | expression_list error + | expression_list error exp + | expression_list comma error + ; + +/* Expressions, not including the comma operator. */ +exp : variable ASSIGNOP {} exp + | '(' expression_list r_paren LEX_IN NAME + | exp '|' LEX_GETLINE opt_variable + | exp TWOWAYIO LEX_GETLINE opt_variable + | LEX_GETLINE opt_variable input_redir + | exp LEX_AND exp + | exp LEX_OR exp + | exp MATCHOP exp + | regexp + | '!' regexp %prec UNARY + | exp LEX_IN NAME + | exp RELOP exp + | exp '<' exp + | exp '>' exp + | exp '?' exp ':' exp + | simp_exp + | exp simp_exp %prec CONCAT_OP + ; + +rexp + : variable ASSIGNOP {} rexp + | rexp LEX_AND rexp + | rexp LEX_OR rexp + | LEX_GETLINE opt_variable input_redir + | regexp + | '!' regexp %prec UNARY + | rexp MATCHOP rexp + | rexp LEX_IN NAME + | rexp RELOP rexp + | rexp '?' rexp ':' rexp + | simp_exp + | rexp simp_exp %prec CONCAT_OP + ; + +simp_exp + : non_post_simp_exp + /* Binary operators in order of decreasing precedence. */ + | simp_exp '^' simp_exp + | simp_exp '*' simp_exp + | simp_exp '/' simp_exp + | simp_exp '%' simp_exp + | simp_exp '+' simp_exp + | simp_exp '-' simp_exp + | variable INCREMENT + | variable DECREMENT + ; + +non_post_simp_exp + : '!' simp_exp %prec UNARY + | '(' exp r_paren + | LEX_BUILTIN + '(' opt_expression_list r_paren + | LEX_LENGTH '(' opt_expression_list r_paren + | LEX_LENGTH + | FUNC_CALL '(' opt_expression_list r_paren + | variable + | INCREMENT variable + | DECREMENT variable + | YNUMBER + | YSTRING + | '-' simp_exp %prec UNARY + | '+' simp_exp %prec UNARY + ; + +opt_variable + : /* empty */ + | variable + ; + +variable + : NAME + | NAME '[' expression_list ']' + | '$' non_post_simp_exp + ; + +l_brace + : '{' opt_nls + ; + +r_brace + : '}' opt_nls + ; + +r_paren + : ')' + ; + +opt_semi + : /* empty */ + | semi + ; + +semi + : ';' + ; + +comma : ',' opt_nls + ; + +%% +_ATEOF + + +# Pass plenty of options, to exercise plenty of code, even if we +# don't actually check the output. But SEGV is watching us, and +# so might do dmalloc. +$at_traceoff +echo "existing.at:357: bison --verbose --defines input.y" +echo existing.at:357 >$at_check_line_file +( $at_traceon; bison --verbose --defines input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "existing.at:357: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 96 ) # 96. existing.at:366: GNU Cim Grammar + at_setup_line='existing.at:366' + at_desc='GNU Cim Grammar' + $at_quiet $ECHO_N " 96: GNU Cim Grammar $ECHO_C" + at_xfail=no + ( + echo "96. existing.at:366: testing ..." + $at_traceon + + +# GNU Cim, the GNU Simula 87 Compiler. + +# Bison was once wrong, due to an incorrect computation of the RR conflicts. +# It reported 80 SR && 99 RR conflicts instead of 78/10!!! + +cat >input.y <<'_ATEOF' +%union { + long int token; + long int ival; + long int arrdim; + double rval; + char *ident; + char *tval; + char stat_decl; + } + +%token + HACTIVATE HAFTER /*HAND*/ HARRAY HAT + HBEFORE HBEGIN HBOOLEAN + HCHARACTER HCLASS /*HCOMMENT*/ HCONC + HDELAY HDO + HELSE HEND HEQ /*HEQV*/ HEXTERNAL + HFOR + HGE HGO HGOTO HGT + HHIDDEN + HIF /*HIMP*/ HIN HINNER HINSPECT HINTEGER HIS + HLABEL HLE HLONG HLT + HNAME HNE HNEW HNONE /*HNOT*/ HNOTEXT + /*HOR*/ HOTHERWISE + HPRIOR HPROCEDURE HPROTECTED + HQUA + HREACTIVATE HREAL HREF + HSHORT HSTEP HSWITCH + HTEXT HTHEN HTHIS HTO + HUNTIL + HVALUE HVAR HVIRTUAL + HWHEN HWHILE + + HASSIGNVALUE HASSIGNREF + /*HDOT*/ HPAREXPSEPARATOR HLABELSEPARATOR HSTATEMENTSEPARATOR + HBEGPAR HENDPAR + HEQR HNER + HADD HSUB HMUL HDIV HINTDIV HEXP + HDOTDOTDOT + +%token HIDENTIFIER +%token HBOOLEANKONST HINTEGERKONST HCHARACTERKONST +%token HREALKONST +%token HTEXTKONST + +%type EXT_IDENT +%type DECLSTATEMENT MODULSTATEMENT MBEE_DECLSTMS MBEE_DECLSTMSU +%type MODULS +%type EXPRESSION_SIMP MBEE_ARG_R_PT +%type BAUND_PAIR_LIST + +%right HASSIGN +%left HORELSE +%left HANDTHEN +%left HEQV +%left HIMP +%left HOR +%left HAND + +%left HNOT + +%left HVALRELOPERATOR HREFRELOPERATOR HOBJRELOPERATOR + +%left HCONC + +%left HTERMOPERATOR +%left UNEAR +%left HFACTOROPERATOR +%left HPRIMARYOPERATOR + +%left HQUA + +%left HDOT + +%start MAIN_MODULE +%% +/* GRAMATIKK FOR PROGRAM MODULES */ +MAIN_MODULE : { categ=CLOCAL; mout(MBLOCK); + beginBlock(KBLOKK);separat_comp=FALSE;} + MODULS { endBlock(NULL,CCNO); mout(MENDBLOCK);} + | error HSTATEMENTSEPARATOR MBEE_DECLSTMS + ; +EXT_DECLARATION : HEXTERNAL + MBEE_TYPE + HPROCEDURE + { MBEENEWBLOCK(); + kind=KPROC;} + EXT_LIST + | + HEXTERNAL + HIDENTIFIER + HPROCEDURE + { MBEENEWBLOCK(); + type=TNOTY; + kind=KPROC; + if($2==Ckind)categ=CCPROC;else + yerror (1); + ysensitive=sensitive; + sensitive=ON;} + HIDENTIFIER { $$=$5; + sensitive=ysensitive;} + EXTERNAL_KIND_ITEM + { categ=CLOCAL;} + | HEXTERNAL + HCLASS + { MBEENEWBLOCK(); + kind=KCLASS;} + EXT_LIST + + ; +EXTERNAL_KIND_ITEM: EXT_IDENT + HOBJRELOPERATOR + { if($2!=HIS)yerror (2);} + MBEE_TYPE HPROCEDURE + HIDENTIFIER + { regDecl($6, type, KPROC, CCPROC); + beginBlock(kind);} + HEADING EMPTY_BLOCK + { categ=CLOCAL; + endBlock($1==NULL?$0:tag($1),CCCPROC);} +/* | + EXT_IDENT + { if($1!=NULL)yerror (3); + regDecl($0, type, kind, categ);} + MBEE_REST_EXT_LIST + { endBlock(NULL,CCNO);} + ; +MBEE_REST_EXT_LIST: /* EMPTY + | HPAREXPSEPARATOR EXT_KIND_LIST + ; +EXT_KIND_LIST : EXT_KIND_ITEM + | EXT_KIND_LIST HPAREXPSEPARATOR EXT_KIND_ITEM + ; +EXT_KIND_ITEM : HIDENTIFIER + EXT_IDENT + { if($2!=NULL)yerror (3); + regDecl($1, type, kind, categ);}*/ + ; +EMPTY_BLOCK : /*EMPT*/ + | HBEGIN HEND + ; +EXT_LIST : EXT_ITEM + | EXT_LIST HPAREXPSEPARATOR EXT_ITEM + ; +EXT_ITEM : HIDENTIFIER + EXT_IDENT + { lesinn_external_spec($1,$2, kind);} + ; +EXT_IDENT : /* EMPTY */ { $$=NULL;} + | HVALRELOPERATOR { if($1!=HEQ)yerror (9); + external=TRUE;} + HTEXTKONST { $$=$3;external=FALSE;} + ; +/* GRAMATIKK FOR TYPER */ +NO_TYPE : /*EMPT*/ { type=TNOTY;} + ; +MBEE_TYPE : NO_TYPE + | TYPE + ; +TYPE : HREF HBEGPAR + HIDENTIFIER + { prefquantident=$3; + type=TREF;} + HENDPAR + | HTEXT { type=TTEXT;} + | HBOOLEAN { type=TBOOL;} + | HCHARACTER { type=TCHAR;} + | HSHORT HINTEGER { type=TSHORT;} + | HINTEGER { type=TINTG;} + | HREAL { type=TREAL;} + | HLONG HREAL { type=TLONG;} + ; + +/* GRAMATIKK FOR DEL AV SETNINGER */ +MBEE_ELSE_PART : /*EMPT*/ +/* | HELSE + HIF + EXPRESSION + HTHEN { mout(MELSE); + mout(MIF); + OBSBLOCK();} + BLOCK { MBEEENDBLOCK();} + MBEE_ELSE_PART { mout(MENDIF);}*/ + | HELSE { OBSBLOCK(); mout(MELSE);} + BLOCK { MBEEENDBLOCK();} + ; +FOR_LIST : FOR_LIST_ELEMENT { mout(MENDSEP); + mout(MLISTSEP);} + | FOR_LIST_ELEMENT + HPAREXPSEPARATOR + FOR_LIST { mout(MLISTSEP);} + ; +FOR_LIST_ELEMENT: EXPRESSION + MBEE_F_L_EL_R_PT + ; +MBEE_F_L_EL_R_PT: /*EMPT*/ + | HWHILE + EXPRESSION { mout(MFORWHILE);} + | HSTEP + EXPRESSION + HUNTIL + EXPRESSION { mout(MUNTIL); + mout(MSTEP);} + ; +GOTO : HGO + HTO + | HGOTO + ; +CONN_STATE_R_PT : WHEN_CLAUSE_LIST + | HDO { beginBlock(KCON); mout(MDO); + OBSBLOCK(); } + BLOCK { endBlock(NULL,CCNO); + MBEEENDBLOCK(); mout(MENDDO);} + ; +WHEN_CLAUSE_LIST: HWHEN + HIDENTIFIER + HDO { beginBlock(KCON); mout(MIDENTIFIER); + OBSBLOCK(); moutId($2); + mout(MWHEN);} + BLOCK { endBlock(NULL,CCNO); + MBEEENDBLOCK(); mout(MENDWHEN);} + | WHEN_CLAUSE_LIST + HWHEN + HIDENTIFIER + HDO { beginBlock(KCON); mout(MIDENTIFIER); + OBSBLOCK(); moutId($3); + mout(MWHEN);} + BLOCK { endBlock(NULL,CCNO); + MBEEENDBLOCK(); mout(MENDWHEN);} + ; +MBEE_OTWI_CLAUS : /*EMPT*/ + | HOTHERWISE {OBSBLOCK(); mout(MOTHERWISE);} + + BLOCK {MBEEENDBLOCK();mout(MENDOTHERWISE);} + ; +ACTIVATOR : HACTIVATE { mout(MBOOLEANKONST); + moutIval(FALSE);} + | HREACTIVATE { mout(MBOOLEANKONST); + moutIval(TRUE);} + ; +SCHEDULE : /*EMPT*/ { mout(MCHARACTERKONST); + moutIval(DIRECT); + mout(MINTEGERKONST); + moutIval(0); + mout(MNONE); + mout(MBOOLEANKONST); + moutIval(FALSE);} + | ATDELAY EXPRESSION { mout(MNONE);} + PRIOR + | BEFOREAFTER { mout(MINTEGERKONST); + moutIval(0);} + EXPRESSION { mout(MBOOLEANKONST); + moutIval(FALSE);} + ; +ATDELAY : HAT { mout(MCHARACTERKONST); + moutIval(AT);} + | HDELAY { mout(MCHARACTERKONST); + moutIval(DELAYS);} + ; +BEFOREAFTER : HBEFORE { mout(MCHARACTERKONST); + moutIval(BEFORE);} + | HAFTER { mout(MCHARACTERKONST); + moutIval(AFTER);} + ; +PRIOR : /*EMPT*/ { mout(MBOOLEANKONST); + moutIval(FALSE);} + | HPRIOR { mout(MBOOLEANKONST); + moutIval(TRUE);} + ; +/* GRAMATIKK FOR SETNINGER OG DEKLARASJONER */ +MODULSTATEMENT : HWHILE + EXPRESSION + HDO { STOPOBSBLOCK(); mout(MWHILE); + OBSBLOCK();} + BLOCK { MBEEENDBLOCK(); mout(MENDWHILE); + $$=STATEMENT;} + | HIF + EXPRESSION + HTHEN { STOPOBSBLOCK(); mout(MIF); + OBSBLOCK();} + BLOCK { MBEEENDBLOCK();} + MBEE_ELSE_PART { mout(MENDIF); + $$=STATEMENT;} + | HFOR + HIDENTIFIER + HASSIGN { STOPOBSBLOCK(); mout(MIDENTIFIER); + moutId($2);} + FOR_LIST + HDO { beginBlock(KFOR); + if($3==HASSIGNVALUE) mout(MFOR); + else mout(MFORR); + OBSBLOCK(); mout(MFORDO);} + BLOCK { MBEEENDBLOCK(); + endBlock(NULL,CCNO); mout(MENDFOR); + $$=STATEMENT;} + | GOTO + EXPRESSION { mout(MGOTO); + STOPOBSBLOCK(); $$=STATEMENT;} + | HINSPECT + EXPRESSION { mout(MINSPECT); + STOPOBSBLOCK(); + beginBlock(KINSP);} + CONN_STATE_R_PT + { endBlock(NULL,CCNO);} + MBEE_OTWI_CLAUS { mout(MENDINSPECT); + $$=STATEMENT;} + | HINNER { STOPOBSBLOCK(); mout(MINNER); + regInner(); $$=STATEMENT;} + | HIDENTIFIER + HLABELSEPARATOR + { STOPOBSBLOCK(); + regDecl($1, TLABEL, KSIMPLE, categ); mout(MLABEL); + moutId($1); + mout(MENDLABEL);} + DECLSTATEMENT { if($4<=DECLARATION) + { yerror (27); + $$=DECLARATION;} + else $$=$4;} + | EXPRESSION_SIMP + HBEGIN + { $$=$1; } + IMPORT_SPEC_MODULE + { mout(MPRBLOCK); + prefquantident=$1; + beginBlock(KPRBLK);} + MBEE_DECLSTMS + HEND { endBlock(NULL,CCNO); mout(MENDPRBLOCK); + $$=STATEMENT;} + | EXPRESSION_SIMP HBEGIN error HSTATEMENTSEPARATOR + MBEE_DECLSTMS HEND { $$=STATEMENT; + endBlock(NULL,CCNO); mout(MENDPRBLOCK);} + | EXPRESSION_SIMP HBEGIN error HEND + { $$=STATEMENT; + endBlock(NULL,CCNO); mout(MENDPRBLOCK);} + + | EXPRESSION_SIMP + { STOPOBSBLOCK(); $$=STATEMENT; + mout(MENDASSIGN);} + | ACTIVATOR EXPRESSION SCHEDULE + { $$=STATEMENT; + mout(MENDSEP); + mout(MARGUMENTSEP); + mout(MARGUMENTSEP); + mout(MARGUMENTSEP); + mout(MARGUMENTSEP); + mout(MARGUMENTSEP); + mout(MARGUMENTSEP); + mout(MARGUMENT); + moutId(activateid); + mout(MENDASSIGN);} + | HBEGIN + { STOPOBSBLOCK(); + OBSBLOCK();} + MBEE_DECLSTMS + HEND { MBEEENDBLOCK(); $$=STATEMENT;} + | MBEE_TYPE HPROCEDURE + HIDENTIFIER + { MBEENEWBLOCK(); mout(MPROCEDURE); + regDecl($3, type, KPROC, categ); + beginBlock(KPROC);} + HEADING BLOCK { endBlock(NULL,CCNO); $$=DECLARATION; + mout(MENDPROCEDURE);} + | HIDENTIFIER + HCLASS + NO_TYPE + { $$=$1; } + IMPORT_SPEC_MODULE + HIDENTIFIER + { prefquantident=$1; + mout(MCLASS); + regDecl($6, TNOTY, KCLASS, categ); + beginBlock(KCLASS);} + HEADING + BLOCK { endBlock(NULL,CCNO); $$=DECLARATION; + mout(MENDCLASS);} + | HCLASS + NO_TYPE + HIDENTIFIER + { prefquantident=0; + MBEENEWBLOCK(); mout(MCLASS); + regDecl($3, TNOTY, KCLASS, categ); + beginBlock(KCLASS);} + HEADING + BLOCK { endBlock(NULL,CCNO); $$=DECLARATION; + mout(MENDCLASS);} + | EXT_DECLARATION { $$=EXTDECLARATION;} + | /*EMPT*/{ STOPOBSBLOCK(); $$=EMPTYSTATEMENT;} + ; +IMPORT_SPEC_MODULE: { MBEENEWBLOCK(); + kind=KCLASS; + if($0==simsetident && + findDecl(simsetident,cblock,FALSE)==NULL) + lesinn_external_spec(simsetident, + SIMSETATRFILE, kind); + if($0==simulationident && findDecl( + simulationident,cblock,FALSE)==NULL) + lesinn_external_spec(simulationident, + SIMULATIONATRFILE, kind); + if(($0==fileident && findDecl( + fileident,cblock,FALSE)==NULL) || + ($0==outfileident && findDecl( + outfileident,cblock,FALSE)==NULL) || + ($0==infileident && findDecl( + infileident,cblock,FALSE)==NULL) || + ($0==directfileident && findDecl( + directfileident,cblock,FALSE)==NULL) || + ($0==printfileident && findDecl( + printfileident,cblock,FALSE)==NULL) || + ($0==bytefileident && findDecl( + bytefileident,cblock,FALSE)==NULL) || + ($0==inbytefileident && findDecl( + inbytefileident,cblock,FALSE)==NULL) || + ($0==outbytefileident && findDecl( + outbytefileident,cblock,FALSE)==NULL) || + ($0==directbytefileident && findDecl( + directbytefileident,cblock,FALSE)==NULL)) + lesinn_external_spec(fileident, + FILEATRFILE, kind);} + ; +DECLSTATEMENT : MODULSTATEMENT + | TYPE + HIDENTIFIER + MBEE_CONSTANT + HPAREXPSEPARATOR + { MBEENEWBLOCK(); + kind=KSIMPLE; + regDecl($2, type, KSIMPLE, categ); + categ=CLOCAL;} + IDENTIFIER_LISTC { $$=DECLARATION;} + | TYPE + HIDENTIFIER + MBEE_CONSTANT + { MBEENEWBLOCK(); + regDecl($2, type, KSIMPLE, categ); + categ=CLOCAL; $$=DECLARATION;} + | MBEE_TYPE + HARRAY { MBEENEWBLOCK(); + kind=KARRAY;} + ARR_SEGMENT_LIST { $$=DECLARATION;} + | HSWITCH + HIDENTIFIER + HASSIGN { MBEENEWBLOCK(); mout(MIDENTIFIER); + moutId($2); + regDecl($2, TLABEL, KARRAY, categ);} + SWITCH_LIST { $$=DECLARATION; + mout(MSWITCH); + mout(MENDSWITCH);} + ; +BLOCK : DECLSTATEMENT { if($1<=DECLARATION)yerror (29);} + | HBEGIN MBEE_DECLSTMS HEND + | HBEGIN error HSTATEMENTSEPARATOR MBEE_DECLSTMS HEND + | HBEGIN error HEND + ; +MBEE_DECLSTMS : MBEE_DECLSTMSU { if($1<=DECLARATION)yerror (28); + $$=$1;} + ; +MBEE_DECLSTMSU : DECLSTATEMENT { $$=$1;} + | MBEE_DECLSTMSU + HSTATEMENTSEPARATOR + DECLSTATEMENT { if($1>=STATEMENT && $3<=DECLARATION) + yerror (26); + $$=$3;} + ; +MODULS : MODULSTATEMENT { if($1==DECLARATION) + {separat_comp=TRUE;gettimestamp();} + $$=$1;} + | MODULS HSTATEMENTSEPARATOR MODULSTATEMENT + { if($1>=STATEMENT && $3<=DECLARATION) + yerror (26);else + if($1>=STATEMENT + && $3!=EMPTYSTATEMENT)yerror (25); + if(separat_comp && $3==STATEMENT) + yerror (25); + if($3==DECLARATION && !separat_comp) + {separat_comp=TRUE;gettimestamp();} + $$=$3;} + ; +/* GRAMATIKK FOR DEL AV DEKLARASJONER */ +ARR_SEGMENT_LIST: ARR_SEGMENT + | ARR_SEGMENT_LIST + HPAREXPSEPARATOR + ARR_SEGMENT + ; +ARR_SEGMENT : ARRAY_SEGMENT + HBEGPAR + BAUND_PAIR_LIST HENDPAR { mout(MARRAY); + mout(MENDARRAY); + setArrayDim($3);} + ; +ARRAY_SEGMENT : ARRAY_SEGMENT_EL { mout(MENDSEP); + mout(MARRAYSEP);} + + | ARRAY_SEGMENT_EL + HPAREXPSEPARATOR + ARRAY_SEGMENT { mout(MARRAYSEP);} + ; +ARRAY_SEGMENT_EL: HIDENTIFIER { mout(MIDENTIFIER); + moutId($1); + regDecl($1, type, kind, categ); + if(lastArray==NULL) + lastArray=cblock->lastparloc;} + ; +BAUND_PAIR_LIST : BAUND_PAIR { mout(MENDSEP); + mout(MBOUNDSEP); + $$=1;} + | BAUND_PAIR + HPAREXPSEPARATOR + BAUND_PAIR_LIST { mout(MBOUNDSEP); + $$=$3+1;} + ; +BAUND_PAIR : EXPRESSION + HLABELSEPARATOR + EXPRESSION { mout(MBOUNDPARSEP);} + ; +SWITCH_LIST : EXPRESSION { mout(MENDSEP); + mout(MSWITCHSEP);} + | EXPRESSION + HPAREXPSEPARATOR + SWITCH_LIST { mout(MSWITCHSEP);} + ; +HEADING : MBEE_FMAL_PAR_P HSTATEMENTSEPARATOR { kind=KNOKD;} + MBEE_MODE_PART { categ=CSPEC;} + MBEE_SPEC_PART { kind=KNOKD;} + MBEE_PROT_PART { categ=CVIRT;} + MBEE_VIRT_PART + { categ=CLOCAL;} + ; +MBEE_FMAL_PAR_P : /*EMPT*/ + | FMAL_PAR_PART + ; +FMAL_PAR_PART : HBEGPAR NO_TYPE + MBEE_LISTV HENDPAR + ; +MBEE_LISTV : /*EMPT*/ + | LISTV + ; +LISTV : HIDENTIFIER { regDecl($1, type, KNOKD, CDEFLT);} + | FPP_CATEG HDOTDOTDOT { regDecl(varargsid, TVARARGS, KNOKD, categ);} + | HIDENTIFIER { regDecl($1, type, KNOKD, CDEFLT);} + HPAREXPSEPARATOR LISTV {} + | FPP_SPEC + | FPP_SPEC + HPAREXPSEPARATOR LISTV + ; +FPP_HEADING : HBEGPAR NO_TYPE + FPP_MBEE_LISTV HENDPAR + ; +FPP_MBEE_LISTV : /*EMPT*/ + | FPP_LISTV + ; +FPP_LISTV : FPP_CATEG HDOTDOTDOT { regDecl(varargsid, TVARARGS, KNOKD, categ);} + | FPP_SPEC + | FPP_SPEC + HPAREXPSEPARATOR LISTV + ; +FPP_SPEC : FPP_CATEG SPECIFIER HIDENTIFIER + { regDecl($3, type, kind, categ);} + | FPP_CATEG FPP_PROC_DECL_IN_SPEC + ; +FPP_CATEG : HNAME HLABELSEPARATOR + { categ=CNAME;} + | HVALUE HLABELSEPARATOR + { categ=CVALUE;} + | HVAR HLABELSEPARATOR + { categ=CVAR;} + | /*EMPT*/ { categ=CDEFLT;} + ; +FPP_PROC_DECL_IN_SPEC: MBEE_TYPE HPROCEDURE + HIDENTIFIER + { $$=categ; + regDecl($3, type, KPROC, categ); + beginBlock(KPROC);} + FPP_HEADING + { categ=$4; /* M} settes tilbake*/} + { endBlock(NULL,CCNO);} + ; +IDENTIFIER_LISTV: HIDENTIFIER { regDecl($1, type, kind, categ);} + | HDOTDOTDOT { regDecl(varargsid, TVARARGS, kind, categ);} + | HIDENTIFIER { regDecl($1, type, kind, categ);} + HPAREXPSEPARATOR IDENTIFIER_LISTV {} + ; +MBEE_MODE_PART : /*EMPT*/ + | MODE_PART + ; +MODE_PART : NAME_PART + | VALUE_PART + | VAR_PART + | NAME_PART VALUE_PART + | VALUE_PART NAME_PART + | NAME_PART VAR_PART + | VAR_PART NAME_PART + | VALUE_PART VAR_PART + | VAR_PART VALUE_PART + | VAR_PART NAME_PART VALUE_PART + | NAME_PART VAR_PART VALUE_PART + | NAME_PART VALUE_PART VAR_PART + | VAR_PART VALUE_PART NAME_PART + | VALUE_PART VAR_PART NAME_PART + | VALUE_PART NAME_PART VAR_PART + ; +NAME_PART : HNAME { categ=CNAME;} + IDENTIFIER_LISTV + HSTATEMENTSEPARATOR + ; +VAR_PART : HVAR { categ=CVAR;} + IDENTIFIER_LISTV + HSTATEMENTSEPARATOR + ; +VALUE_PART : HVALUE { categ=CVALUE;} + IDENTIFIER_LISTV HSTATEMENTSEPARATOR + ; +MBEE_SPEC_PART : /*EMPT*/ + | SPEC_PART + ; +SPEC_PART : ONE_SPEC + | SPEC_PART ONE_SPEC + ; +ONE_SPEC : SPECIFIER IDENTIFIER_LIST HSTATEMENTSEPARATOR + | NO_TYPE HPROCEDURE HIDENTIFIER HOBJRELOPERATOR + { if($4!=HIS) yerror (8);} + PROC_DECL_IN_SPEC HSTATEMENTSEPARATOR + | FPP_PROC_DECL_IN_SPEC HSTATEMENTSEPARATOR + | MBEE_TYPE HPROCEDURE HIDENTIFIER HSTATEMENTSEPARATOR + { yerror (45);} + | MBEE_TYPE HPROCEDURE HIDENTIFIER HPAREXPSEPARATOR + IDENTIFIER_LIST HSTATEMENTSEPARATOR + { yerror (45);} + ; +SPECIFIER : TYPE { kind=KSIMPLE;} + | MBEE_TYPE + HARRAY { kind=KARRAY;} + | HLABEL { type=TLABEL; + kind=KSIMPLE;} + | HSWITCH { type=TLABEL; + kind=KARRAY;} + ; +PROC_DECL_IN_SPEC: MBEE_TYPE HPROCEDURE + HIDENTIFIER + { $$=categ; + regDecl($3, type, KPROC, categ); + beginBlock(KPROC);} + HEADING + { categ=$4; /* M} settes tilbake*/} + MBEE_BEGIN_END + { endBlock(NULL,CCNO);} + ; +MBEE_BEGIN_END : /* EMPTY */ + | HBEGIN HEND + ; +MBEE_PROT_PART : /*EMPT*/ + | PROTECTION_PART + ; +PROTECTION_PART : PROT_SPECIFIER IDENTIFIER_LIST + HSTATEMENTSEPARATOR + | PROTECTION_PART PROT_SPECIFIER + IDENTIFIER_LIST HSTATEMENTSEPARATOR + ; +PROT_SPECIFIER : HHIDDEN { categ=CHIDEN;} + | HPROTECTED { categ=CPROT;} + | HHIDDEN + HPROTECTED { categ=CHIPRO;} + | HPROTECTED + HHIDDEN { categ=CHIPRO;} + ; +MBEE_VIRT_PART : /*EMPT*/ + | VIRTUAL_PART + ; +VIRTUAL_PART : HVIRTUAL + HLABELSEPARATOR + MBEE_SPEC_PART + ; +IDENTIFIER_LIST : HIDENTIFIER { regDecl($1, type, kind, categ);} + | IDENTIFIER_LIST HPAREXPSEPARATOR + HIDENTIFIER { regDecl($3, type, kind, categ);} + ; +IDENTIFIER_LISTC: HIDENTIFIER + MBEE_CONSTANT { regDecl($1, type, kind, categ); + categ=CLOCAL;} + | IDENTIFIER_LISTC HPAREXPSEPARATOR + HIDENTIFIER + MBEE_CONSTANT { regDecl($3, type, kind, categ); + categ=CLOCAL;} + ; +MBEE_CONSTANT : /* EMPTY */ + | HVALRELOPERATOR + { MBEENEWBLOCK(); + if($1!=HEQ) yerror (8); + if(type==TREF)yerror (7); + categ=CCONSTU; + mout(MIDENTIFIER); + moutId($0);} + EXPRESSION { mout(MASSIGN); + mout(MCONST);} + ; + +/* GRAMATIKK FOR UTTRYKK */ +EXPRESSION : EXPRESSION_SIMP {} + | HIF + EXPRESSION + HTHEN + EXPRESSION + HELSE + EXPRESSION { mout(MELSEE); + mout(MIFE);} + ; +EXPRESSION_SIMP : EXPRESSION_SIMP + HASSIGN + EXPRESSION { if($2==HASSIGNREF)mout(MASSIGNR); + else mout(MASSIGN);$$=NULL;} + | + + EXPRESSION_SIMP + HCONC + EXPRESSION_SIMP { mout(MCONC);$$=NULL;} + | EXPRESSION_SIMP HOR + HELSE + EXPRESSION_SIMP + %prec HORELSE { mout(MORELSEE);$$=NULL;} + | EXPRESSION_SIMP HAND + HTHEN + EXPRESSION_SIMP + %prec HANDTHEN { mout(MANDTHENE);$$=NULL;} + | EXPRESSION_SIMP + HEQV EXPRESSION_SIMP { mout(MEQV);$$=NULL;} + | EXPRESSION_SIMP + HIMP EXPRESSION_SIMP { mout(MIMP);$$=NULL;} + | EXPRESSION_SIMP + HOR EXPRESSION_SIMP { mout(MOR);$$=NULL;} + | EXPRESSION_SIMP + HAND EXPRESSION_SIMP { mout(MAND);$$=NULL;} + | HNOT EXPRESSION_SIMP { mout(MNOT);$$=NULL;} + | EXPRESSION_SIMP + HVALRELOPERATOR + EXPRESSION_SIMP + { switch($2) + { case HEQ: mout(MEQ);break; + case HNE: mout(MNE);break; + case HLT: mout(MLT);break; + case HLE: mout(MLE);break; + case HGT: mout(MGT);break; + case HGE: mout(MGE);break; + }$$=NULL;} + | EXPRESSION_SIMP + HREFRELOPERATOR + EXPRESSION_SIMP + { if($2==HNER) mout(MNER); + else mout(MEQR);$$=NULL;} + | EXPRESSION_SIMP + HOBJRELOPERATOR + EXPRESSION_SIMP + { if($2==HIS) mout(MIS); + else mout(MINS);$$=NULL;} + | HTERMOPERATOR + EXPRESSION_SIMP %prec UNEAR + { if($1==HADD) mout(MUADD); + else mout(MUSUB);$$=NULL;} + | EXPRESSION_SIMP + HTERMOPERATOR + EXPRESSION_SIMP + { if($2==HADD) mout(MADD); + else mout(MSUB);$$=NULL;} + | EXPRESSION_SIMP + HFACTOROPERATOR + EXPRESSION_SIMP + { if($2==HMUL) mout(MMUL); else + if($2==HDIV) mout(MDIV); + else mout(MINTDIV);$$=NULL;} + | EXPRESSION_SIMP + HPRIMARYOPERATOR + EXPRESSION_SIMP { mout(MPRIMARY);$$=NULL;} + | HBEGPAR + EXPRESSION HENDPAR { mout(MNOOP);$$=NULL;} + | HTEXTKONST { mout(MTEXTKONST); + moutTval($1);$$=NULL;} + | HCHARACTERKONST { mout(MCHARACTERKONST); + moutIval($1);$$=NULL;} + | HREALKONST { mout(MREALKONST); + moutRval($1);$$=NULL;} + | HINTEGERKONST { mout(MINTEGERKONST); + moutIval($1);$$=NULL;} + | HBOOLEANKONST { mout(MBOOLEANKONST); + moutIval($1);$$=NULL;} + | HNONE { mout(MNONE);$$=NULL;} + | HIDENTIFIER + { $$=$1;} + MBEE_ARG_R_PT {} + | HTHIS HIDENTIFIER { mout(MTHIS); + moutId($2);$$=NULL;} + | HNEW + HIDENTIFIER + ARG_R_PT { mout(MNEWARG); + moutId($2);$$=NULL;} + | EXPRESSION_SIMP + HDOT + EXPRESSION_SIMP { mout(MDOT);$$=NULL;} + | EXPRESSION_SIMP + HQUA HIDENTIFIER { mout(MQUA); + moutId($3);$$=NULL;} + ; +ARG_R_PT : /*EMPTY*/ { mout(MENDSEP);} + | HBEGPAR + ARGUMENT_LIST HENDPAR + ; +MBEE_ARG_R_PT : /*EMPTY*/ { mout(MIDENTIFIER); + moutId($0); + $$=$0;} + | HBEGPAR + ARGUMENT_LIST HENDPAR { mout(MARGUMENT); + moutId($0);} + ; +ARGUMENT_LIST : EXPRESSION { mout(MENDSEP); + mout(MARGUMENTSEP);} + | EXPRESSION + HPAREXPSEPARATOR + ARGUMENT_LIST { mout(MARGUMENTSEP);} + ; +%% +_ATEOF + + +# Pass plenty of options, to exercise plenty of code, even if we +# don't actually check the output. But SEGV is watching us, and +# so might do dmalloc. +$at_traceoff +echo "existing.at:1197: bison --verbose --defines input.y" +echo existing.at:1197 >$at_check_line_file +( $at_traceon; bison --verbose --defines input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "input.y: conflicts: 78 shift/reduce, 10 reduce/reduce +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "existing.at:1197: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "existing.at:1209: grep '^State.*conflicts:' input.output" +echo existing.at:1209 >$at_check_line_file +( $at_traceon; grep '^State.*conflicts:' input.output ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "State 64 conflicts: 14 shift/reduce +State 164 conflicts: 1 shift/reduce +State 201 conflicts: 33 shift/reduce, 4 reduce/reduce +State 206 conflicts: 1 shift/reduce +State 240 conflicts: 1 shift/reduce +State 335 conflicts: 9 shift/reduce, 2 reduce/reduce +State 356 conflicts: 1 shift/reduce +State 360 conflicts: 9 shift/reduce, 2 reduce/reduce +State 427 conflicts: 9 shift/reduce, 2 reduce/reduce +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "existing.at:1209: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 97 ) # 97. existing.at:1218: GNU pic Grammar + at_setup_line='existing.at:1218' + at_desc='GNU pic Grammar' + $at_quiet $ECHO_N " 97: GNU pic Grammar $ECHO_C" + at_xfail=no + ( + echo "97. existing.at:1218: testing ..." + $at_traceon + + +# GNU pic, part of groff. + +# Bison once reported shift/reduce conflicts that it shouldn't have. + +cat >input.y <<'_ATEOF' +%union { + char *str; + int n; + double x; + struct { double x, y; } pair; + struct { double x; char *body; } if_data; + struct { char *str; const char *filename; int lineno; } lstr; + struct { double *v; int nv; int maxv; } dv; + struct { double val; int is_multiplicative; } by; + place pl; + object *obj; + corner crn; + path *pth; + object_spec *spec; + saved_state *pstate; + graphics_state state; + object_type obtype; +} + +%token LABEL +%token VARIABLE +%token NUMBER +%token TEXT +%token COMMAND_LINE +%token DELIMITED +%token ORDINAL +%token TH +%token LEFT_ARROW_HEAD +%token RIGHT_ARROW_HEAD +%token DOUBLE_ARROW_HEAD +%token LAST +%token UP +%token DOWN +%token LEFT +%token RIGHT +%token BOX +%token CIRCLE +%token ELLIPSE +%token ARC +%token LINE +%token ARROW +%token MOVE +%token SPLINE +%token HEIGHT +%token RADIUS +%token WIDTH +%token DIAMETER +%token FROM +%token TO +%token AT +%token WITH +%token BY +%token THEN +%token SOLID +%token DOTTED +%token DASHED +%token CHOP +%token SAME +%token INVISIBLE +%token LJUST +%token RJUST +%token ABOVE +%token BELOW +%token OF +%token THE +%token WAY +%token BETWEEN +%token AND +%token HERE +%token DOT_N +%token DOT_E +%token DOT_W +%token DOT_S +%token DOT_NE +%token DOT_SE +%token DOT_NW +%token DOT_SW +%token DOT_C +%token DOT_START +%token DOT_END +%token DOT_X +%token DOT_Y +%token DOT_HT +%token DOT_WID +%token DOT_RAD +%token SIN +%token COS +%token ATAN2 +%token LOG +%token EXP +%token SQRT +%token K_MAX +%token K_MIN +%token INT +%token RAND +%token SRAND +%token COPY +%token THRU +%token TOP +%token BOTTOM +%token UPPER +%token LOWER +%token SH +%token PRINT +%token CW +%token CCW +%token FOR +%token DO +%token IF +%token ELSE +%token ANDAND +%token OROR +%token NOTEQUAL +%token EQUALEQUAL +%token LESSEQUAL +%token GREATEREQUAL +%token LEFT_CORNER +%token RIGHT_CORNER +%token NORTH +%token SOUTH +%token EAST +%token WEST +%token CENTER +%token END +%token START +%token RESET +%token UNTIL +%token PLOT +%token THICKNESS +%token FILL +%token COLORED +%token OUTLINED +%token SHADED +%token ALIGNED +%token SPRINTF +%token COMMAND + +%left '.' + +/* this ensures that plot 17 "%g" parses as (plot 17 "%g") */ +%left PLOT +%left TEXT SPRINTF + +/* give text adjustments higher precedence than TEXT, so that +box "foo" above ljust == box ("foo" above ljust) +*/ + +%left LJUST RJUST ABOVE BELOW + +%left LEFT RIGHT +/* Give attributes that take an optional expression a higher +precedence than left and right, so that eg `line chop left' +parses properly. */ +%left CHOP SOLID DASHED DOTTED UP DOWN FILL COLORED OUTLINED +%left LABEL + +%left VARIABLE NUMBER '(' SIN COS ATAN2 LOG EXP SQRT K_MAX K_MIN INT RAND SRAND LAST +%left ORDINAL HERE '`' + +%left BOX CIRCLE ELLIPSE ARC LINE ARROW SPLINE '[' /* ] */ + +/* these need to be lower than '-' */ +%left HEIGHT RADIUS WIDTH DIAMETER FROM TO AT THICKNESS + +/* these must have higher precedence than CHOP so that `label %prec CHOP' +works */ +%left DOT_N DOT_E DOT_W DOT_S DOT_NE DOT_SE DOT_NW DOT_SW DOT_C +%left DOT_START DOT_END TOP BOTTOM LEFT_CORNER RIGHT_CORNER +%left UPPER LOWER NORTH SOUTH EAST WEST CENTER START END + +%left ',' +%left OROR +%left ANDAND +%left EQUALEQUAL NOTEQUAL +%left '<' '>' LESSEQUAL GREATEREQUAL + +%left BETWEEN OF +%left AND + +%left '+' '-' +%left '*' '/' '%' +%right '!' +%right '^' + +%type expr any_expr text_expr +%type optional_by +%type expr_pair position_not_place +%type simple_if +%type nth_primitive +%type corner +%type path label_path relative_path +%type place label element element_list middle_element_list +%type object_spec +%type position +%type object_type +%type optional_ordinal_last ordinal +%type until +%type sprintf_args +%type text print_args print_arg + +%% + +top: + optional_separator + | element_list + { + if (olist.head) + print_picture(olist.head); + } + ; + + +element_list: + optional_separator middle_element_list optional_separator + { $$ = $2; } + ; + +middle_element_list: + element + { $$ = $1; } + | middle_element_list separator element + { $$ = $1; } + ; + +optional_separator: + /* empty */ + | separator + ; + +separator: + ';' + | separator ';' + ; + +placeless_element: + VARIABLE '=' any_expr + { + define_variable($1, $3); + a_delete $1; + } + | VARIABLE ':' '=' any_expr + { + place *p = lookup_label($1); + if (!p) { + lex_error("variable `%1' not defined", $1); + YYABORT; + } + p->obj = 0; + p->x = $4; + p->y = 0.0; + a_delete $1; + } + | UP + { current_direction = UP_DIRECTION; } + | DOWN + { current_direction = DOWN_DIRECTION; } + | LEFT + { current_direction = LEFT_DIRECTION; } + | RIGHT + { current_direction = RIGHT_DIRECTION; } + | COMMAND_LINE + { + olist.append(make_command_object($1.str, $1.filename, + $1.lineno)); + } + | COMMAND print_args + { + olist.append(make_command_object($2.str, $2.filename, + $2.lineno)); + } + | PRINT print_args + { + fprintf(stderr, "%s\n", $2.str); + a_delete $2.str; + fflush(stderr); + } + | SH + { delim_flag = 1; } + DELIMITED + { + delim_flag = 0; + if (safer_flag) + lex_error("unsafe to run command `%1'", $3); + else + system($3); + a_delete $3; + } + | COPY TEXT + { + if (yychar < 0) + do_lookahead(); + do_copy($2.str); + // do not delete the filename + } + | COPY TEXT THRU + { delim_flag = 2; } + DELIMITED + { delim_flag = 0; } + until + { + if (yychar < 0) + do_lookahead(); + copy_file_thru($2.str, $5, $7); + // do not delete the filename + a_delete $5; + a_delete $7; + } + | COPY THRU + { delim_flag = 2; } + DELIMITED + { delim_flag = 0; } + until + { + if (yychar < 0) + do_lookahead(); + copy_rest_thru($4, $6); + a_delete $4; + a_delete $6; + } + | FOR VARIABLE '=' expr TO expr optional_by DO + { delim_flag = 1; } + DELIMITED + { + delim_flag = 0; + if (yychar < 0) + do_lookahead(); + do_for($2, $4, $6, $7.is_multiplicative, $7.val, $10); + } + | simple_if + { + if (yychar < 0) + do_lookahead(); + if ($1.x != 0.0) + push_body($1.body); + a_delete $1.body; + } + | simple_if ELSE + { delim_flag = 1; } + DELIMITED + { + delim_flag = 0; + if (yychar < 0) + do_lookahead(); + if ($1.x != 0.0) + push_body($1.body); + else + push_body($4); + a_delete $1.body; + a_delete $4; + } + | reset_variables + | RESET + { define_variable("scale", 1.0); } + ; + +reset_variables: + RESET VARIABLE + { + reset($2); + a_delete $2; + } + | reset_variables VARIABLE + { + reset($2); + a_delete $2; + } + | reset_variables ',' VARIABLE + { + reset($3); + a_delete $3; + } + ; + +print_args: + print_arg + { $$ = $1; } + | print_args print_arg + { + $$.str = new char[strlen($1.str) + strlen($2.str) + 1]; + strcpy($$.str, $1.str); + strcat($$.str, $2.str); + a_delete $1.str; + a_delete $2.str; + if ($1.filename) { + $$.filename = $1.filename; + $$.lineno = $1.lineno; + } + else if ($2.filename) { + $$.filename = $2.filename; + $$.lineno = $2.lineno; + } + } + ; + +print_arg: + expr %prec ',' + { + $$.str = new char[GDIGITS + 1]; + sprintf($$.str, "%g", $1); + $$.filename = 0; + $$.lineno = 0; + } + | text + { $$ = $1; } + | position %prec ',' + { + $$.str = new char[GDIGITS + 2 + GDIGITS + 1]; + sprintf($$.str, "%g, %g", $1.x, $1.y); + $$.filename = 0; + $$.lineno = 0; + } + ; + +simple_if: + IF any_expr THEN + { delim_flag = 1; } + DELIMITED + { + delim_flag = 0; + $$.x = $2; + $$.body = $5; + } + ; + +until: + /* empty */ + { $$ = 0; } + | UNTIL TEXT + { $$ = $2.str; } + ; + +any_expr: + expr + { $$ = $1; } + | text_expr + { $$ = $1; } + ; + +text_expr: + text EQUALEQUAL text + { + $$ = strcmp($1.str, $3.str) == 0; + a_delete $1.str; + a_delete $3.str; + } + | text NOTEQUAL text + { + $$ = strcmp($1.str, $3.str) != 0; + a_delete $1.str; + a_delete $3.str; + } + | text_expr ANDAND text_expr + { $$ = ($1 != 0.0 && $3 != 0.0); } + | text_expr ANDAND expr + { $$ = ($1 != 0.0 && $3 != 0.0); } + | expr ANDAND text_expr + { $$ = ($1 != 0.0 && $3 != 0.0); } + | text_expr OROR text_expr + { $$ = ($1 != 0.0 || $3 != 0.0); } + | text_expr OROR expr + { $$ = ($1 != 0.0 || $3 != 0.0); } + | expr OROR text_expr + { $$ = ($1 != 0.0 || $3 != 0.0); } + | '!' text_expr + { $$ = ($2 == 0.0); } + ; + + +optional_by: + /* empty */ + { + $$.val = 1.0; + $$.is_multiplicative = 0; + } + | BY expr + { + $$.val = $2; + $$.is_multiplicative = 0; + } + | BY '*' expr + { + $$.val = $3; + $$.is_multiplicative = 1; + } + ; + +element: + object_spec + { + $$.obj = $1->make_object(¤t_position, + ¤t_direction); + if ($$.obj == 0) + YYABORT; + delete $1; + if ($$.obj) + olist.append($$.obj); + else { + $$.x = current_position.x; + $$.y = current_position.y; + } + } + | LABEL ':' optional_separator element + { + $$ = $4; + define_label($1, & $$); + a_delete $1; + } + | LABEL ':' optional_separator position_not_place + { + $$.obj = 0; + $$.x = $4.x; + $$.y = $4.y; + define_label($1, & $$); + a_delete $1; + } + | LABEL ':' optional_separator place + { + $$ = $4; + define_label($1, & $$); + a_delete $1; + } + | '{' + { + $$.x = current_position.x; + $$.y = current_position.y; + $$.dir = current_direction; + } + element_list '}' + { + current_position.x = $2.x; + current_position.y = $2.y; + current_direction = $2.dir; + } + optional_element + { + $$ = $3; + } + | placeless_element + { + $$.obj = 0; + $$.x = current_position.x; + $$.y = current_position.y; + } + ; + +optional_element: + /* empty */ + {} + | element + {} + ; + +object_spec: + BOX + { $$ = new object_spec(BOX_OBJECT); } + | CIRCLE + { $$ = new object_spec(CIRCLE_OBJECT); } + | ELLIPSE + { $$ = new object_spec(ELLIPSE_OBJECT); } + | ARC + { + $$ = new object_spec(ARC_OBJECT); + $$->dir = current_direction; + } + | LINE + { + $$ = new object_spec(LINE_OBJECT); + lookup_variable("lineht", & $$->segment_height); + lookup_variable("linewid", & $$->segment_width); + $$->dir = current_direction; + } + | ARROW + { + $$ = new object_spec(ARROW_OBJECT); + lookup_variable("lineht", & $$->segment_height); + lookup_variable("linewid", & $$->segment_width); + $$->dir = current_direction; + } + | MOVE + { + $$ = new object_spec(MOVE_OBJECT); + lookup_variable("moveht", & $$->segment_height); + lookup_variable("movewid", & $$->segment_width); + $$->dir = current_direction; + } + | SPLINE + { + $$ = new object_spec(SPLINE_OBJECT); + lookup_variable("lineht", & $$->segment_height); + lookup_variable("linewid", & $$->segment_width); + $$->dir = current_direction; + } + | text %prec TEXT + { + $$ = new object_spec(TEXT_OBJECT); + $$->text = new text_item($1.str, $1.filename, $1.lineno); + } + | PLOT expr + { + $$ = new object_spec(TEXT_OBJECT); + $$->text = new text_item(format_number(0, $2), 0, -1); + } + | PLOT expr text + { + $$ = new object_spec(TEXT_OBJECT); + $$->text = new text_item(format_number($3.str, $2), + $3.filename, $3.lineno); + a_delete $3.str; + } + | '[' + { + saved_state *p = new saved_state; + $$ = p; + p->x = current_position.x; + p->y = current_position.y; + p->dir = current_direction; + p->tbl = current_table; + p->prev = current_saved_state; + current_position.x = 0.0; + current_position.y = 0.0; + current_table = new PTABLE(place); + current_saved_state = p; + olist.append(make_mark_object()); + } + element_list ']' + { + current_position.x = $2->x; + current_position.y = $2->y; + current_direction = $2->dir; + $$ = new object_spec(BLOCK_OBJECT); + olist.wrap_up_block(& $$->oblist); + $$->tbl = current_table; + current_table = $2->tbl; + current_saved_state = $2->prev; + delete $2; + } + | object_spec HEIGHT expr + { + $$ = $1; + $$->height = $3; + $$->flags |= HAS_HEIGHT; + } + | object_spec RADIUS expr + { + $$ = $1; + $$->radius = $3; + $$->flags |= HAS_RADIUS; + } + | object_spec WIDTH expr + { + $$ = $1; + $$->width = $3; + $$->flags |= HAS_WIDTH; + } + | object_spec DIAMETER expr + { + $$ = $1; + $$->radius = $3/2.0; + $$->flags |= HAS_RADIUS; + } + | object_spec expr %prec HEIGHT + { + $$ = $1; + $$->flags |= HAS_SEGMENT; + switch ($$->dir) { + case UP_DIRECTION: + $$->segment_pos.y += $2; + break; + case DOWN_DIRECTION: + $$->segment_pos.y -= $2; + break; + case RIGHT_DIRECTION: + $$->segment_pos.x += $2; + break; + case LEFT_DIRECTION: + $$->segment_pos.x -= $2; + break; + } + } + | object_spec UP + { + $$ = $1; + $$->dir = UP_DIRECTION; + $$->flags |= HAS_SEGMENT; + $$->segment_pos.y += $$->segment_height; + } + | object_spec UP expr + { + $$ = $1; + $$->dir = UP_DIRECTION; + $$->flags |= HAS_SEGMENT; + $$->segment_pos.y += $3; + } + | object_spec DOWN + { + $$ = $1; + $$->dir = DOWN_DIRECTION; + $$->flags |= HAS_SEGMENT; + $$->segment_pos.y -= $$->segment_height; + } + | object_spec DOWN expr + { + $$ = $1; + $$->dir = DOWN_DIRECTION; + $$->flags |= HAS_SEGMENT; + $$->segment_pos.y -= $3; + } + | object_spec RIGHT + { + $$ = $1; + $$->dir = RIGHT_DIRECTION; + $$->flags |= HAS_SEGMENT; + $$->segment_pos.x += $$->segment_width; + } + | object_spec RIGHT expr + { + $$ = $1; + $$->dir = RIGHT_DIRECTION; + $$->flags |= HAS_SEGMENT; + $$->segment_pos.x += $3; + } + | object_spec LEFT + { + $$ = $1; + $$->dir = LEFT_DIRECTION; + $$->flags |= HAS_SEGMENT; + $$->segment_pos.x -= $$->segment_width; + } + | object_spec LEFT expr + { + $$ = $1; + $$->dir = LEFT_DIRECTION; + $$->flags |= HAS_SEGMENT; + $$->segment_pos.x -= $3; + } + | object_spec FROM position + { + $$ = $1; + $$->flags |= HAS_FROM; + $$->from.x = $3.x; + $$->from.y = $3.y; + } + | object_spec TO position + { + $$ = $1; + if ($$->flags & HAS_SEGMENT) + $$->segment_list = new segment($$->segment_pos, + $$->segment_is_absolute, + $$->segment_list); + $$->flags |= HAS_SEGMENT; + $$->segment_pos.x = $3.x; + $$->segment_pos.y = $3.y; + $$->segment_is_absolute = 1; + $$->flags |= HAS_TO; + $$->to.x = $3.x; + $$->to.y = $3.y; + } + | object_spec AT position + { + $$ = $1; + $$->flags |= HAS_AT; + $$->at.x = $3.x; + $$->at.y = $3.y; + if ($$->type != ARC_OBJECT) { + $$->flags |= HAS_FROM; + $$->from.x = $3.x; + $$->from.y = $3.y; + } + } + | object_spec WITH path + { + $$ = $1; + $$->flags |= HAS_WITH; + $$->with = $3; + } + | object_spec WITH position %prec ',' + { + $$ = $1; + $$->flags |= HAS_WITH; + position pos; + pos.x = $3.x; + pos.y = $3.y; + $$->with = new path(pos); + } + | object_spec BY expr_pair + { + $$ = $1; + $$->flags |= HAS_SEGMENT; + $$->segment_pos.x += $3.x; + $$->segment_pos.y += $3.y; + } + | object_spec THEN + { + $$ = $1; + if ($$->flags & HAS_SEGMENT) { + $$->segment_list = new segment($$->segment_pos, + $$->segment_is_absolute, + $$->segment_list); + $$->flags &= ~HAS_SEGMENT; + $$->segment_pos.x = $$->segment_pos.y = 0.0; + $$->segment_is_absolute = 0; + } + } + | object_spec SOLID + { + $$ = $1; // nothing + } + | object_spec DOTTED + { + $$ = $1; + $$->flags |= IS_DOTTED; + lookup_variable("dashwid", & $$->dash_width); + } + | object_spec DOTTED expr + { + $$ = $1; + $$->flags |= IS_DOTTED; + $$->dash_width = $3; + } + | object_spec DASHED + { + $$ = $1; + $$->flags |= IS_DASHED; + lookup_variable("dashwid", & $$->dash_width); + } + | object_spec DASHED expr + { + $$ = $1; + $$->flags |= IS_DASHED; + $$->dash_width = $3; + } + | object_spec FILL + { + $$ = $1; + $$->flags |= IS_DEFAULT_FILLED; + } + | object_spec FILL expr + { + $$ = $1; + $$->flags |= IS_FILLED; + $$->fill = $3; + } + | object_spec SHADED text + { + $$ = $1; + $$->flags |= (IS_SHADED | IS_FILLED); + $$->shaded = new char[strlen($3.str)+1]; + strcpy($$->shaded, $3.str); + } + | object_spec COLORED text + { + $$ = $1; + $$->flags |= (IS_SHADED | IS_OUTLINED | IS_FILLED); + $$->shaded = new char[strlen($3.str)+1]; + strcpy($$->shaded, $3.str); + $$->outlined = new char[strlen($3.str)+1]; + strcpy($$->outlined, $3.str); + } + | object_spec OUTLINED text + { + $$ = $1; + $$->flags |= IS_OUTLINED; + $$->outlined = new char[strlen($3.str)+1]; + strcpy($$->outlined, $3.str); + } + | object_spec CHOP + { + $$ = $1; + // line chop chop means line chop 0 chop 0 + if ($$->flags & IS_DEFAULT_CHOPPED) { + $$->flags |= IS_CHOPPED; + $$->flags &= ~IS_DEFAULT_CHOPPED; + $$->start_chop = $$->end_chop = 0.0; + } + else if ($$->flags & IS_CHOPPED) { + $$->end_chop = 0.0; + } + else { + $$->flags |= IS_DEFAULT_CHOPPED; + } + } + | object_spec CHOP expr + { + $$ = $1; + if ($$->flags & IS_DEFAULT_CHOPPED) { + $$->flags |= IS_CHOPPED; + $$->flags &= ~IS_DEFAULT_CHOPPED; + $$->start_chop = 0.0; + $$->end_chop = $3; + } + else if ($$->flags & IS_CHOPPED) { + $$->end_chop = $3; + } + else { + $$->start_chop = $$->end_chop = $3; + $$->flags |= IS_CHOPPED; + } + } + | object_spec SAME + { + $$ = $1; + $$->flags |= IS_SAME; + } + | object_spec INVISIBLE + { + $$ = $1; + $$->flags |= IS_INVISIBLE; + } + | object_spec LEFT_ARROW_HEAD + { + $$ = $1; + $$->flags |= HAS_LEFT_ARROW_HEAD; + } + | object_spec RIGHT_ARROW_HEAD + { + $$ = $1; + $$->flags |= HAS_RIGHT_ARROW_HEAD; + } + | object_spec DOUBLE_ARROW_HEAD + { + $$ = $1; + $$->flags |= (HAS_LEFT_ARROW_HEAD|HAS_RIGHT_ARROW_HEAD); + } + | object_spec CW + { + $$ = $1; + $$->flags |= IS_CLOCKWISE; + } + | object_spec CCW + { + $$ = $1; + $$->flags &= ~IS_CLOCKWISE; + } + | object_spec text %prec TEXT + { + $$ = $1; + text_item **p; + for (p = & $$->text; *p; p = &(*p)->next) + ; + *p = new text_item($2.str, $2.filename, $2.lineno); + } + | object_spec LJUST + { + $$ = $1; + if ($$->text) { + text_item *p; + for (p = $$->text; p->next; p = p->next) + ; + p->adj.h = LEFT_ADJUST; + } + } + | object_spec RJUST + { + $$ = $1; + if ($$->text) { + text_item *p; + for (p = $$->text; p->next; p = p->next) + ; + p->adj.h = RIGHT_ADJUST; + } + } + | object_spec ABOVE + { + $$ = $1; + if ($$->text) { + text_item *p; + for (p = $$->text; p->next; p = p->next) + ; + p->adj.v = ABOVE_ADJUST; + } + } + | object_spec BELOW + { + $$ = $1; + if ($$->text) { + text_item *p; + for (p = $$->text; p->next; p = p->next) + ; + p->adj.v = BELOW_ADJUST; + } + } + | object_spec THICKNESS expr + { + $$ = $1; + $$->flags |= HAS_THICKNESS; + $$->thickness = $3; + } + | object_spec ALIGNED + { + $$ = $1; + $$->flags |= IS_ALIGNED; + } + ; + +text: + TEXT + { $$ = $1; } + | SPRINTF '(' TEXT sprintf_args ')' + { + $$.filename = $3.filename; + $$.lineno = $3.lineno; + $$.str = do_sprintf($3.str, $4.v, $4.nv); + a_delete $4.v; + a_delete $3.str; + } + ; + +sprintf_args: + /* empty */ + { + $$.v = 0; + $$.nv = 0; + $$.maxv = 0; + } + | sprintf_args ',' expr + { + $$ = $1; + if ($$.nv >= $$.maxv) { + if ($$.nv == 0) { + $$.v = new double[4]; + $$.maxv = 4; + } + else { + double *oldv = $$.v; + $$.maxv *= 2; + $$.v = new double[$$.maxv]; + memcpy($$.v, oldv, $$.nv*sizeof(double)); + a_delete oldv; + } + } + $$.v[$$.nv] = $3; + $$.nv += 1; + } + ; + +position: + position_not_place + { $$ = $1; } + | place + { + position pos = $1; + $$.x = pos.x; + $$.y = pos.y; + } + ; + +position_not_place: + expr_pair + { $$ = $1; } + | position '+' expr_pair + { + $$.x = $1.x + $3.x; + $$.y = $1.y + $3.y; + } + | position '-' expr_pair + { + $$.x = $1.x - $3.x; + $$.y = $1.y - $3.y; + } + | '(' position ',' position ')' + { + $$.x = $2.x; + $$.y = $4.y; + } + | expr between position AND position + { + $$.x = (1.0 - $1)*$3.x + $1*$5.x; + $$.y = (1.0 - $1)*$3.y + $1*$5.y; + } + | expr '<' position ',' position '>' + { + $$.x = (1.0 - $1)*$3.x + $1*$5.x; + $$.y = (1.0 - $1)*$3.y + $1*$5.y; + } + ; + +between: + BETWEEN + | OF THE WAY BETWEEN + ; + +expr_pair: + expr ',' expr + { + $$.x = $1; + $$.y = $3; + } + | '(' expr_pair ')' + { $$ = $2; } + ; + +place: + /* line at A left == line (at A) left */ + label %prec CHOP + { $$ = $1; } + | label corner + { + path pth($2); + if (!pth.follow($1, & $$)) + YYABORT; + } + | corner label + { + path pth($1); + if (!pth.follow($2, & $$)) + YYABORT; + } + | corner OF label + { + path pth($1); + if (!pth.follow($3, & $$)) + YYABORT; + } + | HERE + { + $$.x = current_position.x; + $$.y = current_position.y; + $$.obj = 0; + } + ; + +label: + LABEL + { + place *p = lookup_label($1); + if (!p) { + lex_error("there is no place `%1'", $1); + YYABORT; + } + $$ = *p; + a_delete $1; + } + | nth_primitive + { $$.obj = $1; } + | label '.' LABEL + { + path pth($3); + if (!pth.follow($1, & $$)) + YYABORT; + } + ; + +ordinal: + ORDINAL + { $$ = $1; } + | '`' any_expr TH + { + // XXX Check for overflow (and non-integers?). + $$ = (int)$2; + } + ; + +optional_ordinal_last: + LAST + { $$ = 1; } + | ordinal LAST + { $$ = $1; } + ; + +nth_primitive: + ordinal object_type + { + int count = 0; + object *p; + for (p = olist.head; p != 0; p = p->next) + if (p->type() == $2 && ++count == $1) { + $$ = p; + break; + } + if (p == 0) { + lex_error("there is no %1%2 %3", $1, ordinal_postfix($1), + object_type_name($2)); + YYABORT; + } + } + | optional_ordinal_last object_type + { + int count = 0; + object *p; + for (p = olist.tail; p != 0; p = p->prev) + if (p->type() == $2 && ++count == $1) { + $$ = p; + break; + } + if (p == 0) { + lex_error("there is no %1%2 last %3", $1, + ordinal_postfix($1), object_type_name($2)); + YYABORT; + } + } + ; + +object_type: + BOX + { $$ = BOX_OBJECT; } + | CIRCLE + { $$ = CIRCLE_OBJECT; } + | ELLIPSE + { $$ = ELLIPSE_OBJECT; } + | ARC + { $$ = ARC_OBJECT; } + | LINE + { $$ = LINE_OBJECT; } + | ARROW + { $$ = ARROW_OBJECT; } + | SPLINE + { $$ = SPLINE_OBJECT; } + | '[' ']' + { $$ = BLOCK_OBJECT; } + | TEXT + { $$ = TEXT_OBJECT; } + ; + +label_path: + '.' LABEL + { $$ = new path($2); } + | label_path '.' LABEL + { + $$ = $1; + $$->append($3); + } + ; + +relative_path: + corner %prec CHOP + { $$ = new path($1); } + /* give this a lower precedence than LEFT and RIGHT so that + [A: box] with .A left == [A: box] with (.A left) */ + | label_path %prec TEXT + { $$ = $1; } + | label_path corner + { + $$ = $1; + $$->append($2); + } + ; + +path: + relative_path + { $$ = $1; } + | '(' relative_path ',' relative_path ')' + { + $$ = $2; + $$->set_ypath($4); + } + /* The rest of these rules are a compatibility sop. */ + | ORDINAL LAST object_type relative_path + { + lex_warning("`%1%2 last %3' in `with' argument ignored", + $1, ordinal_postfix($1), object_type_name($3)); + $$ = $4; + } + | LAST object_type relative_path + { + lex_warning("`last %1' in `with' argument ignored", + object_type_name($2)); + $$ = $3; + } + | ORDINAL object_type relative_path + { + lex_warning("`%1%2 %3' in `with' argument ignored", + $1, ordinal_postfix($1), object_type_name($2)); + $$ = $3; + } + | LABEL relative_path + { + lex_warning("initial `%1' in `with' argument ignored", $1); + a_delete $1; + $$ = $2; + } + ; + +corner: + DOT_N + { $$ = &object::north; } + | DOT_E + { $$ = &object::east; } + | DOT_W + { $$ = &object::west; } + | DOT_S + { $$ = &object::south; } + | DOT_NE + { $$ = &object::north_east; } + | DOT_SE + { $$ = &object:: south_east; } + | DOT_NW + { $$ = &object::north_west; } + | DOT_SW + { $$ = &object::south_west; } + | DOT_C + { $$ = &object::center; } + | DOT_START + { $$ = &object::start; } + | DOT_END + { $$ = &object::end; } + | TOP + { $$ = &object::north; } + | BOTTOM + { $$ = &object::south; } + | LEFT + { $$ = &object::west; } + | RIGHT + { $$ = &object::east; } + | UPPER LEFT + { $$ = &object::north_west; } + | LOWER LEFT + { $$ = &object::south_west; } + | UPPER RIGHT + { $$ = &object::north_east; } + | LOWER RIGHT + { $$ = &object::south_east; } + | LEFT_CORNER + { $$ = &object::west; } + | RIGHT_CORNER + { $$ = &object::east; } + | UPPER LEFT_CORNER + { $$ = &object::north_west; } + | LOWER LEFT_CORNER + { $$ = &object::south_west; } + | UPPER RIGHT_CORNER + { $$ = &object::north_east; } + | LOWER RIGHT_CORNER + { $$ = &object::south_east; } + | NORTH + { $$ = &object::north; } + | SOUTH + { $$ = &object::south; } + | EAST + { $$ = &object::east; } + | WEST + { $$ = &object::west; } + | CENTER + { $$ = &object::center; } + | START + { $$ = &object::start; } + | END + { $$ = &object::end; } + ; + +expr: + VARIABLE + { + if (!lookup_variable($1, & $$)) { + lex_error("there is no variable `%1'", $1); + YYABORT; + } + a_delete $1; + } + | NUMBER + { $$ = $1; } + | place DOT_X + { + if ($1.obj != 0) + $$ = $1.obj->origin().x; + else + $$ = $1.x; + } + | place DOT_Y + { + if ($1.obj != 0) + $$ = $1.obj->origin().y; + else + $$ = $1.y; + } + | place DOT_HT + { + if ($1.obj != 0) + $$ = $1.obj->height(); + else + $$ = 0.0; + } + | place DOT_WID + { + if ($1.obj != 0) + $$ = $1.obj->width(); + else + $$ = 0.0; + } + | place DOT_RAD + { + if ($1.obj != 0) + $$ = $1.obj->radius(); + else + $$ = 0.0; + } + | expr '+' expr + { $$ = $1 + $3; } + | expr '-' expr + { $$ = $1 - $3; } + | expr '*' expr + { $$ = $1 * $3; } + | expr '/' expr + { + if ($3 == 0.0) { + lex_error("division by zero"); + YYABORT; + } + $$ = $1/$3; + } + | expr '%' expr + { + if ($3 == 0.0) { + lex_error("modulus by zero"); + YYABORT; + } + $$ = fmod($1, $3); + } + | expr '^' expr + { + errno = 0; + $$ = pow($1, $3); + if (errno == EDOM) { + lex_error("arguments to `^' operator out of domain"); + YYABORT; + } + if (errno == ERANGE) { + lex_error("result of `^' operator out of range"); + YYABORT; + } + } + | '-' expr %prec '!' + { $$ = -$2; } + | '(' any_expr ')' + { $$ = $2; } + | SIN '(' any_expr ')' + { + errno = 0; + $$ = sin($3); + if (errno == ERANGE) { + lex_error("sin result out of range"); + YYABORT; + } + } + | COS '(' any_expr ')' + { + errno = 0; + $$ = cos($3); + if (errno == ERANGE) { + lex_error("cos result out of range"); + YYABORT; + } + } + | ATAN2 '(' any_expr ',' any_expr ')' + { + errno = 0; + $$ = atan2($3, $5); + if (errno == EDOM) { + lex_error("atan2 argument out of domain"); + YYABORT; + } + if (errno == ERANGE) { + lex_error("atan2 result out of range"); + YYABORT; + } + } + | LOG '(' any_expr ')' + { + errno = 0; + $$ = log10($3); + if (errno == ERANGE) { + lex_error("log result out of range"); + YYABORT; + } + } + | EXP '(' any_expr ')' + { + errno = 0; + $$ = pow(10.0, $3); + if (errno == ERANGE) { + lex_error("exp result out of range"); + YYABORT; + } + } + | SQRT '(' any_expr ')' + { + errno = 0; + $$ = sqrt($3); + if (errno == EDOM) { + lex_error("sqrt argument out of domain"); + YYABORT; + } + } + | K_MAX '(' any_expr ',' any_expr ')' + { $$ = $3 > $5 ? $3 : $5; } + | K_MIN '(' any_expr ',' any_expr ')' + { $$ = $3 < $5 ? $3 : $5; } + | INT '(' any_expr ')' + { $$ = floor($3); } + | RAND '(' any_expr ')' + { $$ = 1.0 + floor(((rand()&0x7fff)/double(0x7fff))*$3); } + | RAND '(' ')' + { + /* return a random number in the range >=0, <1 */ + /* portable, but not very random */ + $$ = (rand() & 0x7fff) / double(0x8000); + } + | SRAND '(' any_expr ')' + { + $$ = 0; + srand((unsigned int)$3); + } + | expr '<' expr + { $$ = ($1 < $3); } + | expr LESSEQUAL expr + { $$ = ($1 <= $3); } + | expr '>' expr + { $$ = ($1 > $3); } + | expr GREATEREQUAL expr + { $$ = ($1 >= $3); } + | expr EQUALEQUAL expr + { $$ = ($1 == $3); } + | expr NOTEQUAL expr + { $$ = ($1 != $3); } + | expr ANDAND expr + { $$ = ($1 != 0.0 && $3 != 0.0); } + | expr OROR expr + { $$ = ($1 != 0.0 || $3 != 0.0); } + | '!' expr + { $$ = ($2 == 0.0); } + + ; +_ATEOF + + +# Pass plenty of options, to exercise plenty of code, even if we +# don't actually check the output. But SEGV is watching us, and +# so might do dmalloc. +$at_traceoff +echo "existing.at:2751: bison --verbose --defines input.y" +echo existing.at:2751 >$at_check_line_file +( $at_traceon; bison --verbose --defines input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "existing.at:2751: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + + banner-14 ) # Banner 14. regression.at:19 + cat <<\_ATEOF + +Regression tests. + +_ATEOF + ;; + + 98 ) # 98. regression.at:27: Early token definitions + at_setup_line='regression.at:27' + at_desc='Early token definitions' + $at_quiet $ECHO_N " 98: Early token definitions $ECHO_C" + at_xfail=no + ( + echo "98. regression.at:27: testing ..." + $at_traceon + + +# Found in GCJ: they expect the tokens to be defined before the user +# prologue, so that they can use the token definitions in it. + +cat >input.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +%{ +void yyerror (const char *s); +int yylex (void); +%} + +%union +{ + int val; +}; +%{ +#ifndef MY_TOKEN +# error "MY_TOKEN not defined." +#endif +%} +%token MY_TOKEN +%% +exp: MY_TOKEN; +%% +_ATEOF + + + +$at_traceoff +echo "regression.at:53: bison -o input.c input.y" +echo regression.at:53 >$at_check_line_file +( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "regression.at:53: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "regression.at:54: \$CC \$CFLAGS \$CPPFLAGS -c input.c -o input.o" +echo regression.at:54 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS -c input.c -o input.o ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "regression.at:54: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 99 ) # 99. regression.at:65: Braces parsing + at_setup_line='regression.at:65' + at_desc='Braces parsing' + $at_quiet $ECHO_N " 99: Braces parsing $ECHO_C" + at_xfail=no + ( + echo "99. regression.at:65: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +/* Bison used to swallow the character after `}'. */ + +%% +exp: { tests = {{{{{{{{{{}}}}}}}}}}; }; +%% +_ATEOF + + +$at_traceoff +echo "regression.at:75: bison -v -o input.c input.y" +echo regression.at:75 >$at_check_line_file +( $at_traceon; bison -v -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "regression.at:75: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "regression.at:77: grep 'tests = {{{{{{{{{{}}}}}}}}}};' input.c" +echo regression.at:77 >$at_check_line_file +( $at_traceon; grep 'tests = {{{{{{{{{{}}}}}}}}}};' input.c ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "regression.at:77: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 100 ) # 100. regression.at:87: Duplicate string + at_setup_line='regression.at:87' + at_desc='Duplicate string' + $at_quiet $ECHO_N "100: Duplicate string $ECHO_C" + at_xfail=no + ( + echo "100. regression.at:87: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +/* `Bison -v' used to dump core when two tokens are defined with the same + string, as LE and GE below. */ + +%token NUM +%token LE "<=" +%token GE "<=" + +%% +exp: '(' exp ')' | NUM ; +%% +_ATEOF + + +$at_traceoff +echo "regression.at:104: bison -v -o input.c input.y" +echo regression.at:104 >$at_check_line_file +( $at_traceon; bison -v -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "input.y:6.8-14: warning: symbol \`\"<=\"' used more than once as a literal string +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "regression.at:104: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 101 ) # 101. regression.at:113: Rule Line Numbers + at_setup_line='regression.at:113' + at_desc='Rule Line Numbers' + $at_quiet $ECHO_N "101: Rule Line Numbers $ECHO_C" + at_xfail=no + ( + echo "101. regression.at:113: testing ..." + $at_traceon + + + + +cat >input.y <<'_ATEOF' +%% +expr: +'a' + +{ + +} + +'b' + +{ + +} + +| + + +{ + + +} + +'c' + +{ + +}; +_ATEOF + + +$at_traceoff +echo "regression.at:147: bison -o input.c -v input.y" +echo regression.at:147 >$at_check_line_file +( $at_traceon; bison -o input.c -v input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "regression.at:147: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Check the contents of the report. +$at_traceoff +echo "regression.at:246: cat input.output" +echo regression.at:246 >$at_check_line_file +( $at_traceon; cat input.output ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "Grammar + + 0 \$accept: expr \$end + + 1 @1: /* empty */ + + 2 expr: 'a' @1 'b' + + 3 @2: /* empty */ + + 4 expr: @2 'c' + + +Terminals, with rules where they appear + +\$end (0) 0 +'a' (97) 2 +'b' (98) 2 +'c' (99) 4 +error (256) + + +Nonterminals, with rules where they appear + +\$accept (6) + on left: 0 +expr (7) + on left: 2 4, on right: 0 +@1 (8) + on left: 1, on right: 2 +@2 (9) + on left: 3, on right: 4 + + +state 0 + + 0 \$accept: . expr \$end + + 'a' shift, and go to state 1 + + \$default reduce using rule 3 (@2) + + expr go to state 2 + @2 go to state 3 + + +state 1 + + 2 expr: 'a' . @1 'b' + + \$default reduce using rule 1 (@1) + + @1 go to state 4 + + +state 2 + + 0 \$accept: expr . \$end + + \$end shift, and go to state 5 + + +state 3 + + 4 expr: @2 . 'c' + + 'c' shift, and go to state 6 + + +state 4 + + 2 expr: 'a' @1 . 'b' + + 'b' shift, and go to state 7 + + +state 5 + + 0 \$accept: expr \$end . + + \$default accept + + +state 6 + + 4 expr: @2 'c' . + + \$default reduce using rule 4 (expr) + + +state 7 + + 2 expr: 'a' @1 'b' . + + \$default reduce using rule 2 (expr) +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "regression.at:246: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 102 ) # 102. regression.at:257: Mixing %token styles + at_setup_line='regression.at:257' + at_desc='Mixing %token styles' + $at_quiet $ECHO_N "102: Mixing %token styles $ECHO_C" + at_xfail=no + ( + echo "102. regression.at:257: testing ..." + $at_traceon + + +# Taken from the documentation. +cat >input.y <<'_ATEOF' +%token OR "||" +%token LE 134 "<=" +%left OR "<=" +%% +exp: ; +%% +_ATEOF + + +$at_traceoff +echo "regression.at:269: bison -v -o input.c input.y" +echo regression.at:269 >$at_check_line_file +( $at_traceon; bison -v -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "regression.at:269: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 103 ) # 103. regression.at:280: Invalid inputs + at_setup_line='regression.at:280' + at_desc='Invalid inputs' + $at_quiet $ECHO_N "103: Invalid inputs $ECHO_C" + at_xfail=no + ( + echo "103. regression.at:280: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +%% +? +default: 'a' } +%& +%a-does-not-exist +%- +%{ +_ATEOF + + +$at_traceoff +echo "regression.at:301: bison input.y" +echo regression.at:301 >$at_check_line_file +( $at_traceon; bison input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "input.y:2.1: invalid character: \`?' +input.y:3.14: invalid character: \`}' +input.y:4.1: invalid character: \`%' +input.y:4.2: invalid character: \`&' +input.y:5.1-17: invalid directive: \`%a-does-not-exist' +input.y:6.1: invalid character: \`%' +input.y:6.2: invalid character: \`-' +input.y:7.1-8.0: missing \`%}' at end of file +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "regression.at:301: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 104 ) # 104. regression.at:312: Token definitions + at_setup_line='regression.at:312' + at_desc='Token definitions' + $at_quiet $ECHO_N "104: Token definitions $ECHO_C" + at_xfail=no + ( + echo "104. regression.at:312: testing ..." + $at_traceon + + +# Bison managed, when fed with `%token 'f' "f"' to #define 'f'! +cat >input.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +%{ +void yyerror (const char *s); +int yylex (void); +%} +%token MYEOF 0 "end of file" +%token 'a' "a" +%token b "b" +%token c 'c' +%token 'd' d +%% +exp: "a"; +_ATEOF + + + +$at_traceoff +echo "regression.at:329: bison -o input.c input.y" +echo regression.at:329 >$at_check_line_file +( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "regression.at:329: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "regression.at:330: \$CC \$CFLAGS \$CPPFLAGS -c input.c -o input.o" +echo regression.at:330 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS -c input.c -o input.o ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "regression.at:330: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 105 ) # 105. regression.at:340: Characters Escapes + at_setup_line='regression.at:340' + at_desc='Characters Escapes' + $at_quiet $ECHO_N "105: Characters Escapes $ECHO_C" + at_xfail=no + ( + echo "105. regression.at:340: testing ..." + $at_traceon + + +cat >input.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +%{ +void yyerror (const char *s); +int yylex (void); +%} +%% +exp: + '\'' "\'" +| '\"' "\"" +| '"' "'" +; +_ATEOF + + +# Pacify font-lock-mode: " + +$at_traceoff +echo "regression.at:356: bison -o input.c input.y" +echo regression.at:356 >$at_check_line_file +( $at_traceon; bison -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "regression.at:356: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "regression.at:357: \$CC \$CFLAGS \$CPPFLAGS -c input.c -o input.o" +echo regression.at:357 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS -c input.c -o input.o ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "regression.at:357: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 106 ) # 106. regression.at:371: Web2c Report + at_setup_line='regression.at:371' + at_desc='Web2c Report' + $at_quiet $ECHO_N "106: Web2c Report $ECHO_C" + at_xfail=no + ( + echo "106. regression.at:371: testing ..." + $at_traceon + + + + +cat >input.y <<'_ATEOF' +%token undef_id_tok const_id_tok + +%start CONST_DEC_PART + +%% +CONST_DEC_PART: + CONST_DEC_LIST + ; + +CONST_DEC_LIST: + CONST_DEC + | CONST_DEC_LIST CONST_DEC + ; + +CONST_DEC: + { } undef_id_tok '=' const_id_tok ';' + ; +%% +_ATEOF + + +$at_traceoff +echo "regression.at:396: bison -v input.y" +echo regression.at:396 >$at_check_line_file +( $at_traceon; bison -v input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "regression.at:396: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "regression.at:521: cat input.output" +echo regression.at:521 >$at_check_line_file +( $at_traceon; cat input.output ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "Grammar + + 0 \$accept: CONST_DEC_PART \$end + + 1 CONST_DEC_PART: CONST_DEC_LIST + + 2 CONST_DEC_LIST: CONST_DEC + 3 | CONST_DEC_LIST CONST_DEC + + 4 @1: /* empty */ + + 5 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';' + + +Terminals, with rules where they appear + +\$end (0) 0 +';' (59) 5 +'=' (61) 5 +error (256) +undef_id_tok (258) 5 +const_id_tok (259) 5 + + +Nonterminals, with rules where they appear + +\$accept (7) + on left: 0 +CONST_DEC_PART (8) + on left: 1, on right: 0 +CONST_DEC_LIST (9) + on left: 2 3, on right: 1 3 +CONST_DEC (10) + on left: 5, on right: 2 3 +@1 (11) + on left: 4, on right: 5 + + +state 0 + + 0 \$accept: . CONST_DEC_PART \$end + + \$default reduce using rule 4 (@1) + + CONST_DEC_PART go to state 1 + CONST_DEC_LIST go to state 2 + CONST_DEC go to state 3 + @1 go to state 4 + + +state 1 + + 0 \$accept: CONST_DEC_PART . \$end + + \$end shift, and go to state 5 + + +state 2 + + 1 CONST_DEC_PART: CONST_DEC_LIST . + 3 CONST_DEC_LIST: CONST_DEC_LIST . CONST_DEC + + undef_id_tok reduce using rule 4 (@1) + \$default reduce using rule 1 (CONST_DEC_PART) + + CONST_DEC go to state 6 + @1 go to state 4 + + +state 3 + + 2 CONST_DEC_LIST: CONST_DEC . + + \$default reduce using rule 2 (CONST_DEC_LIST) + + +state 4 + + 5 CONST_DEC: @1 . undef_id_tok '=' const_id_tok ';' + + undef_id_tok shift, and go to state 7 + + +state 5 + + 0 \$accept: CONST_DEC_PART \$end . + + \$default accept + + +state 6 + + 3 CONST_DEC_LIST: CONST_DEC_LIST CONST_DEC . + + \$default reduce using rule 3 (CONST_DEC_LIST) + + +state 7 + + 5 CONST_DEC: @1 undef_id_tok . '=' const_id_tok ';' + + '=' shift, and go to state 8 + + +state 8 + + 5 CONST_DEC: @1 undef_id_tok '=' . const_id_tok ';' + + const_id_tok shift, and go to state 9 + + +state 9 + + 5 CONST_DEC: @1 undef_id_tok '=' const_id_tok . ';' + + ';' shift, and go to state 10 + + +state 10 + + 5 CONST_DEC: @1 undef_id_tok '=' const_id_tok ';' . + + \$default reduce using rule 5 (CONST_DEC) +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "regression.at:521: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 107 ) # 107. regression.at:548: Web2c Actions + at_setup_line='regression.at:548' + at_desc='Web2c Actions' + $at_quiet $ECHO_N "107: Web2c Actions $ECHO_C" + at_xfail=no + ( + echo "107. regression.at:548: testing ..." + $at_traceon + + + + +cat >input.y <<'_ATEOF' +%% +statement: struct_stat; +struct_stat: /* empty. */ | if else; +if: "if" "const" "then" statement; +else: "else" statement; +%% +_ATEOF + + +$at_traceoff +echo "regression.at:561: bison -v -o input.c input.y" +echo regression.at:561 >$at_check_line_file +( $at_traceon; bison -v -o input.c input.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "regression.at:561: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +# Check only the tables. We don't use --no-parser, because it is +# still to be implemented in the experimental branch of Bison. +sed -n 's/ *$//;/^static const.*\[\] =/,/^}/p' input.c >tables.c + +$at_traceoff +echo "regression.at:659: cat tables.c" +echo regression.at:659 >$at_check_line_file +( $at_traceon; cat tables.c ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "static const unsigned char yytranslate[] = +{ + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 1, 2, 3, 4, + 5, 6 +}; +static const unsigned char yyprhs[] = +{ + 0, 0, 3, 5, 6, 9, 14 +}; +static const yysigned_char yyrhs[] = +{ + 8, 0, -1, 9, -1, -1, 10, 11, -1, 3, + 4, 5, 8, -1, 6, 8, -1 +}; +static const unsigned char yyrline[] = +{ + 0, 2, 2, 3, 3, 4, 5 +}; +static const char *const yytname[] = +{ + \"\$end\", \"error\", \"\$undefined\", \"\\\"if\\\"\", \"\\\"const\\\"\", \"\\\"then\\\"\", + \"\\\"else\\\"\", \"\$accept\", \"statement\", \"struct_stat\", \"if\", \"else\", 0 +}; +static const unsigned short int yytoknum[] = +{ + 0, 256, 257, 258, 259, 260, 261 +}; +static const unsigned char yyr1[] = +{ + 0, 7, 8, 9, 9, 10, 11 +}; +static const unsigned char yyr2[] = +{ + 0, 2, 1, 0, 2, 4, 2 +}; +static const unsigned char yydefact[] = +{ + 3, 0, 0, 2, 0, 0, 1, 3, 4, 3, + 6, 5 +}; +static const yysigned_char yydefgoto[] = +{ + -1, 2, 3, 4, 8 +}; +static const yysigned_char yypact[] = +{ + -2, -1, 4, -8, 0, 2, -8, -2, -8, -2, + -8, -8 +}; +static const yysigned_char yypgoto[] = +{ + -8, -7, -8, -8, -8 +}; +static const unsigned char yytable[] = +{ + 10, 1, 11, 5, 6, 0, 7, 9 +}; +static const yysigned_char yycheck[] = +{ + 7, 3, 9, 4, 0, -1, 6, 5 +}; +static const unsigned char yystos[] = +{ + 0, 3, 8, 9, 10, 4, 0, 6, 11, 5, + 8, 8 +}; +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "regression.at:659: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 108 ) # 108. regression.at:792: Dancer + at_setup_line='regression.at:792' + at_desc='Dancer ' + $at_quiet $ECHO_N "108: Dancer $ECHO_C" + at_xfail=no + ( + echo "108. regression.at:792: testing ..." + $at_traceon + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + +cat >dancer.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +%{ +static int yylex (void); +#include +static void yyerror (const char *); +%} + +%token ARROW INVALID NUMBER STRING DATA +%defines +%verbose +%error-verbose +/* Grammar follows */ +%% +line: header body + ; + +header: '<' from ARROW to '>' type ':' + | '<' ARROW to '>' type ':' + | ARROW to type ':' + | type ':' + | '<' '>' + ; + +from: DATA + | STRING + | INVALID + ; + +to: DATA + | STRING + | INVALID + ; + +type: DATA + | STRING + | INVALID + ; + +body: /* empty */ + | body member + ; + +member: STRING + | DATA + | '+' NUMBER + | '-' NUMBER + | NUMBER + | INVALID + ; +%% +static void +yyerror (const char *s) +{ + fprintf (stderr, "%s\n", s); +} + +static int +yylex (void) +{ + static int toknum = 0; + int tokens[] = + { + ':', -1 + }; + + return tokens[toknum++]; +} + +int +main (void) +{ + return yyparse (); +} +_ATEOF + + + +$at_traceoff +echo "regression.at:792: bison -o dancer.c dancer.y" +echo regression.at:792 >$at_check_line_file +( $at_traceon; bison -o dancer.c dancer.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "regression.at:792: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "regression.at:792: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS dancer.c \$LIBS -o dancer" +echo regression.at:792 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS dancer.c $LIBS -o dancer ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "regression.at:792: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "regression.at:792: \$PREPARSER ./dancer" +echo regression.at:792 >$at_check_line_file +( $at_traceon; $PREPARSER ./dancer ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "syntax error, unexpected ':' +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "regression.at:792: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 109 ) # 109. regression.at:793: Dancer %glr-parser + at_setup_line='regression.at:793' + at_desc='Dancer %glr-parser' + $at_quiet $ECHO_N "109: Dancer %glr-parser $ECHO_C" + at_xfail=no + ( + echo "109. regression.at:793: testing ..." + $at_traceon + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + +cat >dancer.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +%{ +static int yylex (void); +#include +static void yyerror (const char *); +%} +%glr-parser +%token ARROW INVALID NUMBER STRING DATA +%defines +%verbose +%error-verbose +/* Grammar follows */ +%% +line: header body + ; + +header: '<' from ARROW to '>' type ':' + | '<' ARROW to '>' type ':' + | ARROW to type ':' + | type ':' + | '<' '>' + ; + +from: DATA + | STRING + | INVALID + ; + +to: DATA + | STRING + | INVALID + ; + +type: DATA + | STRING + | INVALID + ; + +body: /* empty */ + | body member + ; + +member: STRING + | DATA + | '+' NUMBER + | '-' NUMBER + | NUMBER + | INVALID + ; +%% +static void +yyerror (const char *s) +{ + fprintf (stderr, "%s\n", s); +} + +static int +yylex (void) +{ + static int toknum = 0; + int tokens[] = + { + ':', -1 + }; + + return tokens[toknum++]; +} + +int +main (void) +{ + return yyparse (); +} +_ATEOF + + + +$at_traceoff +echo "regression.at:793: bison -o dancer.c dancer.y" +echo regression.at:793 >$at_check_line_file +( $at_traceon; bison -o dancer.c dancer.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "regression.at:793: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "regression.at:793: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS dancer.c \$LIBS -o dancer" +echo regression.at:793 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS dancer.c $LIBS -o dancer ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "regression.at:793: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "regression.at:793: \$PREPARSER ./dancer" +echo regression.at:793 >$at_check_line_file +( $at_traceon; $PREPARSER ./dancer ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "syntax error, unexpected ':' +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "regression.at:793: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 110 ) # 110. regression.at:794: Dancer %skeleton "lalr1.cc" + at_setup_line='regression.at:794' + at_desc='Dancer %skeleton "lalr1.cc"' + $at_quiet $ECHO_N "110: Dancer %skeleton "lalr1.cc" $ECHO_C" + at_xfail=no + ( + echo "110. regression.at:794: testing ..." + $at_traceon + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + +cat >dancer.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +%{ +static int yylex (int *); + +%} +%skeleton "lalr1.cc" +%token ARROW INVALID NUMBER STRING DATA +%defines +%verbose +%error-verbose +/* Grammar follows */ +%% +line: header body + ; + +header: '<' from ARROW to '>' type ':' + | '<' ARROW to '>' type ':' + | ARROW to type ':' + | type ':' + | '<' '>' + ; + +from: DATA + | STRING + | INVALID + ; + +to: DATA + | STRING + | INVALID + ; + +type: DATA + | STRING + | INVALID + ; + +body: /* empty */ + | body member + ; + +member: STRING + | DATA + | '+' NUMBER + | '-' NUMBER + | NUMBER + | INVALID + ; +%% +/* Currently, print_ is required in C++. */ +void +yy::Parser::print_ () +{ +} + +/* A C++ error reporting function. */ +void +yy::Parser::error_ () +{ + std::cerr << message << std::endl; +} + +int +yyparse (void) +{ + yy::Parser parser (!!YYDEBUG); + return parser.parse (); +} + + +static int +yylex (int *lval) +{ + static int toknum = 0; + int tokens[] = + { + ':', -1 + }; + *lval = 0; /* Pacify GCC. */ + return tokens[toknum++]; +} + +int +main (void) +{ + return yyparse (); +} +_ATEOF + + + +$at_traceoff +echo "regression.at:794: bison -o dancer.c dancer.y" +echo regression.at:794 >$at_check_line_file +( $at_traceon; bison -o dancer.c dancer.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "regression.at:794: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "regression.at:794: \$CXX --version || exit 77" +echo regression.at:794 >$at_check_line_file +( $at_traceon; $CXX --version || exit 77 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "regression.at:794: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "regression.at:794: \$CXX \$CXXFLAGS \$CPPFLAGS dancer.c -o dancer" +echo regression.at:794 >$at_check_line_file +( $at_traceon; $CXX $CXXFLAGS $CPPFLAGS dancer.c -o dancer ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "regression.at:794: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "regression.at:794: \$PREPARSER ./dancer" +echo regression.at:794 >$at_check_line_file +( $at_traceon; $PREPARSER ./dancer ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "syntax error, unexpected ':' +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 1) ;; + *) echo "regression.at:794: exit code was $at_status, expected 1" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + + banner-15 ) # Banner 15. cxx-type.at:19 + cat <<\_ATEOF + +C++ Type Syntax (GLR). + +_ATEOF + ;; + + 111 ) # 111. cxx-type.at:317: GLR: Resolve ambiguity, impure, no locations + at_setup_line='cxx-type.at:317' + at_desc='GLR: Resolve ambiguity, impure, no locations' + $at_quiet $ECHO_N "111: GLR: Resolve ambiguity, impure, no locations $ECHO_C" + at_xfail=no + ( + echo "111. cxx-type.at:317: testing ..." + $at_traceon + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >types.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Simplified C++ Type and Expression Grammar. */ + + + +%{ + #include + #define YYSTYPE char const * + + #define YYINITDEPTH 10 + static char *format (char const *, ...); + struct YYLTYPE; +#if YYPURE +# if YYLSP_NEEDED +# define LEX_PARAMETERS YYSTYPE *lvalp, struct YYLTYPE *llocp +# define ERROR_PARAMETERS struct YYLTYPE *llocp, char const *s +# else +# define LEX_PARAMETERS YYSTYPE *lvalp +# endif +#endif +#ifndef LEX_PARAMETERS +# define LEX_PARAMETERS void +#endif +#ifndef ERROR_PARAMETERS +# define ERROR_PARAMETERS char const *s +#endif + int yylex (LEX_PARAMETERS); + int yyerror (ERROR_PARAMETERS); +%} + +%token TYPENAME ID + +%right '=' +%left '+' + +%glr-parser + +%% + +prog : + | prog stmt { + + printf ("%s\n", $2); + } + ; + +stmt : expr ';' %dprec 1 { $$ = $1; } + | decl %dprec 2 + | error ';' { $$ = ""; } + | '@' { YYACCEPT; } + ; + +expr : ID + | TYPENAME '(' expr ')' { $$ = format ("(%s,%s)", $3, $1); } + | expr '+' expr { $$ = format ("+(%s,%s)", $1, $3); } + | expr '=' expr { $$ = format ("=(%s,%s)", $1, $3); } + ; + +decl : TYPENAME declarator ';' + { $$ = format ("(%s,%s)", $1, $2); } + | TYPENAME declarator '=' expr ';' + { $$ = format ("(%s,%s,%s)", $1, $2, $4); } + ; + +declarator : ID + | '(' declarator ')' { $$ = $2; } + ; + +%% + +#include +#include +#include +#include + +int +main (int argc, char **argv) +{ + if (argc != 2) + abort (); + if (!freopen (argv[1], "r", stdin)) + abort (); + exit (yyparse ()); +} + +int +yylex (LEX_PARAMETERS) +{ + char buffer[256]; + int c; + unsigned int i; + static int lineNum = 1; + static int colNum = 1; + + +#if YYPURE +# define yylloc (*llocp) +# define yylval (*lvalp) +#endif + + while (1) + { + c = getchar (); + switch (c) + { + case EOF: + return 0; + case '\t': + colNum = 1 + ((colNum + 7) & ~7); + break; + case ' ': case '\f': + colNum += 1; + break; + case '\n': + lineNum += 1; + colNum = 1; + break; + default: + { + int tok; +#if YYLSP_NEEDED + yylloc.first_line = yylloc.last_line = lineNum; + yylloc.first_column = colNum; +#endif + if (isalpha (c)) + { + i = 0; + + do + { + buffer[i++] = c; + colNum += 1; + if (i == sizeof buffer - 1) + abort (); + c = getchar (); + } + while (isalnum (c) || c == '_'); + + ungetc (c, stdin); + buffer[i++] = 0; + tok = isupper ((unsigned char) buffer[0]) ? TYPENAME : ID; + yylval = strcpy (malloc (i), buffer); + } + else + { + colNum += 1; + tok = c; + yylval = ""; + } +#if YYLSP_NEEDED + yylloc.last_column = colNum-1; +#endif + return tok; + } + } + } +} + +int +yyerror (ERROR_PARAMETERS) +{ +#if YYPURE && YYLSP_NEEDED + /* Pacify GCC by using llocp. */ + if (! llocp) + abort (); +#endif + fprintf (stderr, "%s\n", s); + return 0; +} + + +static char * +format (char const *form, ...) +{ + char buffer[1024]; + va_list args; + va_start (args, form); + vsprintf (buffer, form, args); + va_end (args); + return strcpy (malloc (strlen (buffer) + 1), buffer); +} + + + +_ATEOF + + + +cat >test-input <<'_ATEOF' + + +z + q; + +T x; + +T x = y; + +x = y; + +T (x) + y; + +T (x); + +T (y) = z + q; + +T (y y) = z + q; + +z + q; + +@ + +This is total garbage, but it should be ignored. +_ATEOF + + +$at_traceoff +echo "cxx-type.at:319: bison -o types.c types.y" +echo cxx-type.at:319 >$at_check_line_file +( $at_traceon; bison -o types.c types.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:319: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "cxx-type.at:319: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS types.c \$LIBS -o types" +echo cxx-type.at:319 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS types.c $LIBS -o types ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:319: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + +$at_traceoff +echo "cxx-type.at:321: \$PREPARSER ./types test-input | sed 's/ *\$//'" +echo cxx-type.at:321 >$at_check_line_file +( $at_traceon; $PREPARSER ./types test-input | sed 's/ *$//' ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "syntax error +" | $at_diff - $at_stderr || at_failed=: +echo >>$at_stdout; echo "+(z,q) +(T,x) +(T,x,y) +=(x,y) ++((x,T),y) +(T,x) +(T,y,+(z,q)) + ++(z,q) +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:321: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 112 ) # 112. cxx-type.at:324: GLR: Resolve ambiguity, impure, locations + at_setup_line='cxx-type.at:324' + at_desc='GLR: Resolve ambiguity, impure, locations' + $at_quiet $ECHO_N "112: GLR: Resolve ambiguity, impure, locations $ECHO_C" + at_xfail=no + ( + echo "112. cxx-type.at:324: testing ..." + $at_traceon + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >types.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Simplified C++ Type and Expression Grammar. */ + +%locations + +%{ + #include + #define YYSTYPE char const * + + #define YYINITDEPTH 10 + static char *format (char const *, ...); + struct YYLTYPE; +#if YYPURE +# if YYLSP_NEEDED +# define LEX_PARAMETERS YYSTYPE *lvalp, struct YYLTYPE *llocp +# define ERROR_PARAMETERS struct YYLTYPE *llocp, char const *s +# else +# define LEX_PARAMETERS YYSTYPE *lvalp +# endif +#endif +#ifndef LEX_PARAMETERS +# define LEX_PARAMETERS void +#endif +#ifndef ERROR_PARAMETERS +# define ERROR_PARAMETERS char const *s +#endif + int yylex (LEX_PARAMETERS); + int yyerror (ERROR_PARAMETERS); +%} + +%token TYPENAME ID + +%right '=' +%left '+' + +%glr-parser + +%% + +prog : + | prog stmt { + + printf ("%d.%d-%d.%d: ", + @2.first_line, @2.first_column, + @2.last_line, @2.last_column); + printf ("%s\n", $2); + } + ; + +stmt : expr ';' %dprec 1 { $$ = $1; } + | decl %dprec 2 + | error ';' { $$ = ""; } + | '@' { YYACCEPT; } + ; + +expr : ID + | TYPENAME '(' expr ')' { $$ = format ("(%s,%s)", $3, $1); } + | expr '+' expr { $$ = format ("+(%s,%s)", $1, $3); } + | expr '=' expr { $$ = format ("=(%s,%s)", $1, $3); } + ; + +decl : TYPENAME declarator ';' + { $$ = format ("(%s,%s)", $1, $2); } + | TYPENAME declarator '=' expr ';' + { $$ = format ("(%s,%s,%s)", $1, $2, $4); } + ; + +declarator : ID + | '(' declarator ')' { $$ = $2; } + ; + +%% + +#include +#include +#include +#include + +int +main (int argc, char **argv) +{ + if (argc != 2) + abort (); + if (!freopen (argv[1], "r", stdin)) + abort (); + exit (yyparse ()); +} + +int +yylex (LEX_PARAMETERS) +{ + char buffer[256]; + int c; + unsigned int i; + static int lineNum = 1; + static int colNum = 1; + + +#if YYPURE +# define yylloc (*llocp) +# define yylval (*lvalp) +#endif + + while (1) + { + c = getchar (); + switch (c) + { + case EOF: + return 0; + case '\t': + colNum = 1 + ((colNum + 7) & ~7); + break; + case ' ': case '\f': + colNum += 1; + break; + case '\n': + lineNum += 1; + colNum = 1; + break; + default: + { + int tok; +#if YYLSP_NEEDED + yylloc.first_line = yylloc.last_line = lineNum; + yylloc.first_column = colNum; +#endif + if (isalpha (c)) + { + i = 0; + + do + { + buffer[i++] = c; + colNum += 1; + if (i == sizeof buffer - 1) + abort (); + c = getchar (); + } + while (isalnum (c) || c == '_'); + + ungetc (c, stdin); + buffer[i++] = 0; + tok = isupper ((unsigned char) buffer[0]) ? TYPENAME : ID; + yylval = strcpy (malloc (i), buffer); + } + else + { + colNum += 1; + tok = c; + yylval = ""; + } +#if YYLSP_NEEDED + yylloc.last_column = colNum-1; +#endif + return tok; + } + } + } +} + +int +yyerror (ERROR_PARAMETERS) +{ +#if YYPURE && YYLSP_NEEDED + /* Pacify GCC by using llocp. */ + if (! llocp) + abort (); +#endif + fprintf (stderr, "%s\n", s); + return 0; +} + + +static char * +format (char const *form, ...) +{ + char buffer[1024]; + va_list args; + va_start (args, form); + vsprintf (buffer, form, args); + va_end (args); + return strcpy (malloc (strlen (buffer) + 1), buffer); +} + + + +_ATEOF + + + +cat >test-input <<'_ATEOF' + + +z + q; + +T x; + +T x = y; + +x = y; + +T (x) + y; + +T (x); + +T (y) = z + q; + +T (y y) = z + q; + +z + q; + +@ + +This is total garbage, but it should be ignored. +_ATEOF + + +$at_traceoff +echo "cxx-type.at:325: bison -o types.c types.y" +echo cxx-type.at:325 >$at_check_line_file +( $at_traceon; bison -o types.c types.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:325: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "cxx-type.at:325: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS types.c \$LIBS -o types" +echo cxx-type.at:325 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS types.c $LIBS -o types ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:325: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + +$at_traceoff +echo "cxx-type.at:327: \$PREPARSER ./types test-input | sed 's/ *\$//'" +echo cxx-type.at:327 >$at_check_line_file +( $at_traceon; $PREPARSER ./types test-input | sed 's/ *$//' ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "syntax error +" | $at_diff - $at_stderr || at_failed=: +echo >>$at_stdout; echo "3.1-3.6: +(z,q) +5.1-5.4: (T,x) +7.1-7.8: (T,x,y) +9.1-9.6: =(x,y) +11.1-11.10: +((x,T),y) +13.1-13.6: (T,x) +15.1-15.14: (T,y,+(z,q)) +17.6-17.16: +19.1-19.6: +(z,q) +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:327: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 113 ) # 113. cxx-type.at:330: GLR: Resolve ambiguity, pure, no locations + at_setup_line='cxx-type.at:330' + at_desc='GLR: Resolve ambiguity, pure, no locations' + $at_quiet $ECHO_N "113: GLR: Resolve ambiguity, pure, no locations $ECHO_C" + at_xfail=no + ( + echo "113. cxx-type.at:330: testing ..." + $at_traceon + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >types.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Simplified C++ Type and Expression Grammar. */ + +%pure-parser + +%{ + #include + #define YYSTYPE char const * + + #define YYINITDEPTH 10 + static char *format (char const *, ...); + struct YYLTYPE; +#if YYPURE +# if YYLSP_NEEDED +# define LEX_PARAMETERS YYSTYPE *lvalp, struct YYLTYPE *llocp +# define ERROR_PARAMETERS struct YYLTYPE *llocp, char const *s +# else +# define LEX_PARAMETERS YYSTYPE *lvalp +# endif +#endif +#ifndef LEX_PARAMETERS +# define LEX_PARAMETERS void +#endif +#ifndef ERROR_PARAMETERS +# define ERROR_PARAMETERS char const *s +#endif + int yylex (LEX_PARAMETERS); + int yyerror (ERROR_PARAMETERS); +%} + +%token TYPENAME ID + +%right '=' +%left '+' + +%glr-parser + +%% + +prog : + | prog stmt { + + printf ("%s\n", $2); + } + ; + +stmt : expr ';' %dprec 1 { $$ = $1; } + | decl %dprec 2 + | error ';' { $$ = ""; } + | '@' { YYACCEPT; } + ; + +expr : ID + | TYPENAME '(' expr ')' { $$ = format ("(%s,%s)", $3, $1); } + | expr '+' expr { $$ = format ("+(%s,%s)", $1, $3); } + | expr '=' expr { $$ = format ("=(%s,%s)", $1, $3); } + ; + +decl : TYPENAME declarator ';' + { $$ = format ("(%s,%s)", $1, $2); } + | TYPENAME declarator '=' expr ';' + { $$ = format ("(%s,%s,%s)", $1, $2, $4); } + ; + +declarator : ID + | '(' declarator ')' { $$ = $2; } + ; + +%% + +#include +#include +#include +#include + +int +main (int argc, char **argv) +{ + if (argc != 2) + abort (); + if (!freopen (argv[1], "r", stdin)) + abort (); + exit (yyparse ()); +} + +int +yylex (LEX_PARAMETERS) +{ + char buffer[256]; + int c; + unsigned int i; + static int lineNum = 1; + static int colNum = 1; + + +#if YYPURE +# define yylloc (*llocp) +# define yylval (*lvalp) +#endif + + while (1) + { + c = getchar (); + switch (c) + { + case EOF: + return 0; + case '\t': + colNum = 1 + ((colNum + 7) & ~7); + break; + case ' ': case '\f': + colNum += 1; + break; + case '\n': + lineNum += 1; + colNum = 1; + break; + default: + { + int tok; +#if YYLSP_NEEDED + yylloc.first_line = yylloc.last_line = lineNum; + yylloc.first_column = colNum; +#endif + if (isalpha (c)) + { + i = 0; + + do + { + buffer[i++] = c; + colNum += 1; + if (i == sizeof buffer - 1) + abort (); + c = getchar (); + } + while (isalnum (c) || c == '_'); + + ungetc (c, stdin); + buffer[i++] = 0; + tok = isupper ((unsigned char) buffer[0]) ? TYPENAME : ID; + yylval = strcpy (malloc (i), buffer); + } + else + { + colNum += 1; + tok = c; + yylval = ""; + } +#if YYLSP_NEEDED + yylloc.last_column = colNum-1; +#endif + return tok; + } + } + } +} + +int +yyerror (ERROR_PARAMETERS) +{ +#if YYPURE && YYLSP_NEEDED + /* Pacify GCC by using llocp. */ + if (! llocp) + abort (); +#endif + fprintf (stderr, "%s\n", s); + return 0; +} + + +static char * +format (char const *form, ...) +{ + char buffer[1024]; + va_list args; + va_start (args, form); + vsprintf (buffer, form, args); + va_end (args); + return strcpy (malloc (strlen (buffer) + 1), buffer); +} + + + +_ATEOF + + + +cat >test-input <<'_ATEOF' + + +z + q; + +T x; + +T x = y; + +x = y; + +T (x) + y; + +T (x); + +T (y) = z + q; + +T (y y) = z + q; + +z + q; + +@ + +This is total garbage, but it should be ignored. +_ATEOF + + +$at_traceoff +echo "cxx-type.at:332: bison -o types.c types.y" +echo cxx-type.at:332 >$at_check_line_file +( $at_traceon; bison -o types.c types.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:332: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "cxx-type.at:332: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS types.c \$LIBS -o types" +echo cxx-type.at:332 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS types.c $LIBS -o types ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:332: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + +$at_traceoff +echo "cxx-type.at:334: \$PREPARSER ./types test-input | sed 's/ *\$//'" +echo cxx-type.at:334 >$at_check_line_file +( $at_traceon; $PREPARSER ./types test-input | sed 's/ *$//' ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "syntax error +" | $at_diff - $at_stderr || at_failed=: +echo >>$at_stdout; echo "+(z,q) +(T,x) +(T,x,y) +=(x,y) ++((x,T),y) +(T,x) +(T,y,+(z,q)) + ++(z,q) +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:334: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 114 ) # 114. cxx-type.at:337: GLR: Resolve ambiguity, pure, locations + at_setup_line='cxx-type.at:337' + at_desc='GLR: Resolve ambiguity, pure, locations' + $at_quiet $ECHO_N "114: GLR: Resolve ambiguity, pure, locations $ECHO_C" + at_xfail=no + ( + echo "114. cxx-type.at:337: testing ..." + $at_traceon + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >types.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Simplified C++ Type and Expression Grammar. */ + +%pure-parser %locations + +%{ + #include + #define YYSTYPE char const * + + #define YYINITDEPTH 10 + static char *format (char const *, ...); + struct YYLTYPE; +#if YYPURE +# if YYLSP_NEEDED +# define LEX_PARAMETERS YYSTYPE *lvalp, struct YYLTYPE *llocp +# define ERROR_PARAMETERS struct YYLTYPE *llocp, char const *s +# else +# define LEX_PARAMETERS YYSTYPE *lvalp +# endif +#endif +#ifndef LEX_PARAMETERS +# define LEX_PARAMETERS void +#endif +#ifndef ERROR_PARAMETERS +# define ERROR_PARAMETERS char const *s +#endif + int yylex (LEX_PARAMETERS); + int yyerror (ERROR_PARAMETERS); +%} + +%token TYPENAME ID + +%right '=' +%left '+' + +%glr-parser + +%% + +prog : + | prog stmt { + + printf ("%d.%d-%d.%d: ", + @2.first_line, @2.first_column, + @2.last_line, @2.last_column); + printf ("%s\n", $2); + } + ; + +stmt : expr ';' %dprec 1 { $$ = $1; } + | decl %dprec 2 + | error ';' { $$ = ""; } + | '@' { YYACCEPT; } + ; + +expr : ID + | TYPENAME '(' expr ')' { $$ = format ("(%s,%s)", $3, $1); } + | expr '+' expr { $$ = format ("+(%s,%s)", $1, $3); } + | expr '=' expr { $$ = format ("=(%s,%s)", $1, $3); } + ; + +decl : TYPENAME declarator ';' + { $$ = format ("(%s,%s)", $1, $2); } + | TYPENAME declarator '=' expr ';' + { $$ = format ("(%s,%s,%s)", $1, $2, $4); } + ; + +declarator : ID + | '(' declarator ')' { $$ = $2; } + ; + +%% + +#include +#include +#include +#include + +int +main (int argc, char **argv) +{ + if (argc != 2) + abort (); + if (!freopen (argv[1], "r", stdin)) + abort (); + exit (yyparse ()); +} + +int +yylex (LEX_PARAMETERS) +{ + char buffer[256]; + int c; + unsigned int i; + static int lineNum = 1; + static int colNum = 1; + + +#if YYPURE +# define yylloc (*llocp) +# define yylval (*lvalp) +#endif + + while (1) + { + c = getchar (); + switch (c) + { + case EOF: + return 0; + case '\t': + colNum = 1 + ((colNum + 7) & ~7); + break; + case ' ': case '\f': + colNum += 1; + break; + case '\n': + lineNum += 1; + colNum = 1; + break; + default: + { + int tok; +#if YYLSP_NEEDED + yylloc.first_line = yylloc.last_line = lineNum; + yylloc.first_column = colNum; +#endif + if (isalpha (c)) + { + i = 0; + + do + { + buffer[i++] = c; + colNum += 1; + if (i == sizeof buffer - 1) + abort (); + c = getchar (); + } + while (isalnum (c) || c == '_'); + + ungetc (c, stdin); + buffer[i++] = 0; + tok = isupper ((unsigned char) buffer[0]) ? TYPENAME : ID; + yylval = strcpy (malloc (i), buffer); + } + else + { + colNum += 1; + tok = c; + yylval = ""; + } +#if YYLSP_NEEDED + yylloc.last_column = colNum-1; +#endif + return tok; + } + } + } +} + +int +yyerror (ERROR_PARAMETERS) +{ +#if YYPURE && YYLSP_NEEDED + /* Pacify GCC by using llocp. */ + if (! llocp) + abort (); +#endif + fprintf (stderr, "%s\n", s); + return 0; +} + + +static char * +format (char const *form, ...) +{ + char buffer[1024]; + va_list args; + va_start (args, form); + vsprintf (buffer, form, args); + va_end (args); + return strcpy (malloc (strlen (buffer) + 1), buffer); +} + + + +_ATEOF + + + +cat >test-input <<'_ATEOF' + + +z + q; + +T x; + +T x = y; + +x = y; + +T (x) + y; + +T (x); + +T (y) = z + q; + +T (y y) = z + q; + +z + q; + +@ + +This is total garbage, but it should be ignored. +_ATEOF + + +$at_traceoff +echo "cxx-type.at:339: bison -o types.c types.y" +echo cxx-type.at:339 >$at_check_line_file +( $at_traceon; bison -o types.c types.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:339: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "cxx-type.at:339: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS types.c \$LIBS -o types" +echo cxx-type.at:339 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS types.c $LIBS -o types ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:339: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + +$at_traceoff +echo "cxx-type.at:341: \$PREPARSER ./types test-input | sed 's/ *\$//'" +echo cxx-type.at:341 >$at_check_line_file +( $at_traceon; $PREPARSER ./types test-input | sed 's/ *$//' ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "syntax error +" | $at_diff - $at_stderr || at_failed=: +echo >>$at_stdout; echo "3.1-3.6: +(z,q) +5.1-5.4: (T,x) +7.1-7.8: (T,x,y) +9.1-9.6: =(x,y) +11.1-11.10: +((x,T),y) +13.1-13.6: (T,x) +15.1-15.14: (T,y,+(z,q)) +17.6-17.16: +19.1-19.6: +(z,q) +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:341: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 115 ) # 115. cxx-type.at:344: GLR: Merge conflicting parses, impure, no locations + at_setup_line='cxx-type.at:344' + at_desc='GLR: Merge conflicting parses, impure, no locations' + $at_quiet $ECHO_N "115: GLR: Merge conflicting parses, impure, no locations$ECHO_C" + at_xfail=no + ( + echo "115. cxx-type.at:344: testing ..." + $at_traceon + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >types.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Simplified C++ Type and Expression Grammar. */ + + + +%{ + #include + #define YYSTYPE char const * + static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1); + #define YYINITDEPTH 10 + static char *format (char const *, ...); + struct YYLTYPE; +#if YYPURE +# if YYLSP_NEEDED +# define LEX_PARAMETERS YYSTYPE *lvalp, struct YYLTYPE *llocp +# define ERROR_PARAMETERS struct YYLTYPE *llocp, char const *s +# else +# define LEX_PARAMETERS YYSTYPE *lvalp +# endif +#endif +#ifndef LEX_PARAMETERS +# define LEX_PARAMETERS void +#endif +#ifndef ERROR_PARAMETERS +# define ERROR_PARAMETERS char const *s +#endif + int yylex (LEX_PARAMETERS); + int yyerror (ERROR_PARAMETERS); +%} + +%token TYPENAME ID + +%right '=' +%left '+' + +%glr-parser + +%% + +prog : + | prog stmt { + + printf ("%s\n", $2); + } + ; + +stmt : expr ';' %merge { $$ = $1; } + | decl %merge + | error ';' { $$ = ""; } + | '@' { YYACCEPT; } + ; + +expr : ID + | TYPENAME '(' expr ')' { $$ = format ("(%s,%s)", $3, $1); } + | expr '+' expr { $$ = format ("+(%s,%s)", $1, $3); } + | expr '=' expr { $$ = format ("=(%s,%s)", $1, $3); } + ; + +decl : TYPENAME declarator ';' + { $$ = format ("(%s,%s)", $1, $2); } + | TYPENAME declarator '=' expr ';' + { $$ = format ("(%s,%s,%s)", $1, $2, $4); } + ; + +declarator : ID + | '(' declarator ')' { $$ = $2; } + ; + +%% + +#include +#include +#include +#include + +int +main (int argc, char **argv) +{ + if (argc != 2) + abort (); + if (!freopen (argv[1], "r", stdin)) + abort (); + exit (yyparse ()); +} + +int +yylex (LEX_PARAMETERS) +{ + char buffer[256]; + int c; + unsigned int i; + static int lineNum = 1; + static int colNum = 1; + + +#if YYPURE +# define yylloc (*llocp) +# define yylval (*lvalp) +#endif + + while (1) + { + c = getchar (); + switch (c) + { + case EOF: + return 0; + case '\t': + colNum = 1 + ((colNum + 7) & ~7); + break; + case ' ': case '\f': + colNum += 1; + break; + case '\n': + lineNum += 1; + colNum = 1; + break; + default: + { + int tok; +#if YYLSP_NEEDED + yylloc.first_line = yylloc.last_line = lineNum; + yylloc.first_column = colNum; +#endif + if (isalpha (c)) + { + i = 0; + + do + { + buffer[i++] = c; + colNum += 1; + if (i == sizeof buffer - 1) + abort (); + c = getchar (); + } + while (isalnum (c) || c == '_'); + + ungetc (c, stdin); + buffer[i++] = 0; + tok = isupper ((unsigned char) buffer[0]) ? TYPENAME : ID; + yylval = strcpy (malloc (i), buffer); + } + else + { + colNum += 1; + tok = c; + yylval = ""; + } +#if YYLSP_NEEDED + yylloc.last_column = colNum-1; +#endif + return tok; + } + } + } +} + +int +yyerror (ERROR_PARAMETERS) +{ +#if YYPURE && YYLSP_NEEDED + /* Pacify GCC by using llocp. */ + if (! llocp) + abort (); +#endif + fprintf (stderr, "%s\n", s); + return 0; +} + + +static char * +format (char const *form, ...) +{ + char buffer[1024]; + va_list args; + va_start (args, form); + vsprintf (buffer, form, args); + va_end (args); + return strcpy (malloc (strlen (buffer) + 1), buffer); +} + + +static YYSTYPE +stmtMerge (YYSTYPE x0, YYSTYPE x1) +{ + return format ("(%s,%s)", x0, x1); +} + +_ATEOF + + + +cat >test-input <<'_ATEOF' + + +z + q; + +T x; + +T x = y; + +x = y; + +T (x) + y; + +T (x); + +T (y) = z + q; + +T (y y) = z + q; + +z + q; + +@ + +This is total garbage, but it should be ignored. +_ATEOF + + +$at_traceoff +echo "cxx-type.at:346: bison -o types.c types.y" +echo cxx-type.at:346 >$at_check_line_file +( $at_traceon; bison -o types.c types.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:346: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "cxx-type.at:346: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS types.c \$LIBS -o types" +echo cxx-type.at:346 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS types.c $LIBS -o types ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:346: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + +$at_traceoff +echo "cxx-type.at:348: \$PREPARSER ./types test-input | sed 's/ *\$//'" +echo cxx-type.at:348 >$at_check_line_file +( $at_traceon; $PREPARSER ./types test-input | sed 's/ *$//' ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "syntax error +" | $at_diff - $at_stderr || at_failed=: +echo >>$at_stdout; echo "+(z,q) +(T,x) +(T,x,y) +=(x,y) ++((x,T),y) +((T,x),(x,T)) +((T,y,+(z,q)),=((y,T),+(z,q))) + ++(z,q) +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:348: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 116 ) # 116. cxx-type.at:351: GLR: Merge conflicting parses, impure, locations + at_setup_line='cxx-type.at:351' + at_desc='GLR: Merge conflicting parses, impure, locations' + $at_quiet $ECHO_N "116: GLR: Merge conflicting parses, impure, locations$ECHO_C" + at_xfail=no + ( + echo "116. cxx-type.at:351: testing ..." + $at_traceon + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >types.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Simplified C++ Type and Expression Grammar. */ + +%locations + +%{ + #include + #define YYSTYPE char const * + static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1); + #define YYINITDEPTH 10 + static char *format (char const *, ...); + struct YYLTYPE; +#if YYPURE +# if YYLSP_NEEDED +# define LEX_PARAMETERS YYSTYPE *lvalp, struct YYLTYPE *llocp +# define ERROR_PARAMETERS struct YYLTYPE *llocp, char const *s +# else +# define LEX_PARAMETERS YYSTYPE *lvalp +# endif +#endif +#ifndef LEX_PARAMETERS +# define LEX_PARAMETERS void +#endif +#ifndef ERROR_PARAMETERS +# define ERROR_PARAMETERS char const *s +#endif + int yylex (LEX_PARAMETERS); + int yyerror (ERROR_PARAMETERS); +%} + +%token TYPENAME ID + +%right '=' +%left '+' + +%glr-parser + +%% + +prog : + | prog stmt { + + printf ("%d.%d-%d.%d: ", + @2.first_line, @2.first_column, + @2.last_line, @2.last_column); + printf ("%s\n", $2); + } + ; + +stmt : expr ';' %merge { $$ = $1; } + | decl %merge + | error ';' { $$ = ""; } + | '@' { YYACCEPT; } + ; + +expr : ID + | TYPENAME '(' expr ')' { $$ = format ("(%s,%s)", $3, $1); } + | expr '+' expr { $$ = format ("+(%s,%s)", $1, $3); } + | expr '=' expr { $$ = format ("=(%s,%s)", $1, $3); } + ; + +decl : TYPENAME declarator ';' + { $$ = format ("(%s,%s)", $1, $2); } + | TYPENAME declarator '=' expr ';' + { $$ = format ("(%s,%s,%s)", $1, $2, $4); } + ; + +declarator : ID + | '(' declarator ')' { $$ = $2; } + ; + +%% + +#include +#include +#include +#include + +int +main (int argc, char **argv) +{ + if (argc != 2) + abort (); + if (!freopen (argv[1], "r", stdin)) + abort (); + exit (yyparse ()); +} + +int +yylex (LEX_PARAMETERS) +{ + char buffer[256]; + int c; + unsigned int i; + static int lineNum = 1; + static int colNum = 1; + + +#if YYPURE +# define yylloc (*llocp) +# define yylval (*lvalp) +#endif + + while (1) + { + c = getchar (); + switch (c) + { + case EOF: + return 0; + case '\t': + colNum = 1 + ((colNum + 7) & ~7); + break; + case ' ': case '\f': + colNum += 1; + break; + case '\n': + lineNum += 1; + colNum = 1; + break; + default: + { + int tok; +#if YYLSP_NEEDED + yylloc.first_line = yylloc.last_line = lineNum; + yylloc.first_column = colNum; +#endif + if (isalpha (c)) + { + i = 0; + + do + { + buffer[i++] = c; + colNum += 1; + if (i == sizeof buffer - 1) + abort (); + c = getchar (); + } + while (isalnum (c) || c == '_'); + + ungetc (c, stdin); + buffer[i++] = 0; + tok = isupper ((unsigned char) buffer[0]) ? TYPENAME : ID; + yylval = strcpy (malloc (i), buffer); + } + else + { + colNum += 1; + tok = c; + yylval = ""; + } +#if YYLSP_NEEDED + yylloc.last_column = colNum-1; +#endif + return tok; + } + } + } +} + +int +yyerror (ERROR_PARAMETERS) +{ +#if YYPURE && YYLSP_NEEDED + /* Pacify GCC by using llocp. */ + if (! llocp) + abort (); +#endif + fprintf (stderr, "%s\n", s); + return 0; +} + + +static char * +format (char const *form, ...) +{ + char buffer[1024]; + va_list args; + va_start (args, form); + vsprintf (buffer, form, args); + va_end (args); + return strcpy (malloc (strlen (buffer) + 1), buffer); +} + + +static YYSTYPE +stmtMerge (YYSTYPE x0, YYSTYPE x1) +{ + return format ("(%s,%s)", x0, x1); +} + +_ATEOF + + + +cat >test-input <<'_ATEOF' + + +z + q; + +T x; + +T x = y; + +x = y; + +T (x) + y; + +T (x); + +T (y) = z + q; + +T (y y) = z + q; + +z + q; + +@ + +This is total garbage, but it should be ignored. +_ATEOF + + +$at_traceoff +echo "cxx-type.at:353: bison -o types.c types.y" +echo cxx-type.at:353 >$at_check_line_file +( $at_traceon; bison -o types.c types.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:353: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "cxx-type.at:353: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS types.c \$LIBS -o types" +echo cxx-type.at:353 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS types.c $LIBS -o types ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:353: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + +$at_traceoff +echo "cxx-type.at:355: \$PREPARSER ./types test-input | sed 's/ *\$//'" +echo cxx-type.at:355 >$at_check_line_file +( $at_traceon; $PREPARSER ./types test-input | sed 's/ *$//' ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "syntax error +" | $at_diff - $at_stderr || at_failed=: +echo >>$at_stdout; echo "3.1-3.6: +(z,q) +5.1-5.4: (T,x) +7.1-7.8: (T,x,y) +9.1-9.6: =(x,y) +11.1-11.10: +((x,T),y) +13.1-13.6: ((T,x),(x,T)) +15.1-15.14: ((T,y,+(z,q)),=((y,T),+(z,q))) +17.6-17.16: +19.1-19.6: +(z,q) +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:355: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 117 ) # 117. cxx-type.at:358: GLR: Merge conflicting parses, pure, no locations + at_setup_line='cxx-type.at:358' + at_desc='GLR: Merge conflicting parses, pure, no locations' + $at_quiet $ECHO_N "117: GLR: Merge conflicting parses, pure, no locations$ECHO_C" + at_xfail=no + ( + echo "117. cxx-type.at:358: testing ..." + $at_traceon + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >types.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Simplified C++ Type and Expression Grammar. */ + +%pure-parser + +%{ + #include + #define YYSTYPE char const * + static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1); + #define YYINITDEPTH 10 + static char *format (char const *, ...); + struct YYLTYPE; +#if YYPURE +# if YYLSP_NEEDED +# define LEX_PARAMETERS YYSTYPE *lvalp, struct YYLTYPE *llocp +# define ERROR_PARAMETERS struct YYLTYPE *llocp, char const *s +# else +# define LEX_PARAMETERS YYSTYPE *lvalp +# endif +#endif +#ifndef LEX_PARAMETERS +# define LEX_PARAMETERS void +#endif +#ifndef ERROR_PARAMETERS +# define ERROR_PARAMETERS char const *s +#endif + int yylex (LEX_PARAMETERS); + int yyerror (ERROR_PARAMETERS); +%} + +%token TYPENAME ID + +%right '=' +%left '+' + +%glr-parser + +%% + +prog : + | prog stmt { + + printf ("%s\n", $2); + } + ; + +stmt : expr ';' %merge { $$ = $1; } + | decl %merge + | error ';' { $$ = ""; } + | '@' { YYACCEPT; } + ; + +expr : ID + | TYPENAME '(' expr ')' { $$ = format ("(%s,%s)", $3, $1); } + | expr '+' expr { $$ = format ("+(%s,%s)", $1, $3); } + | expr '=' expr { $$ = format ("=(%s,%s)", $1, $3); } + ; + +decl : TYPENAME declarator ';' + { $$ = format ("(%s,%s)", $1, $2); } + | TYPENAME declarator '=' expr ';' + { $$ = format ("(%s,%s,%s)", $1, $2, $4); } + ; + +declarator : ID + | '(' declarator ')' { $$ = $2; } + ; + +%% + +#include +#include +#include +#include + +int +main (int argc, char **argv) +{ + if (argc != 2) + abort (); + if (!freopen (argv[1], "r", stdin)) + abort (); + exit (yyparse ()); +} + +int +yylex (LEX_PARAMETERS) +{ + char buffer[256]; + int c; + unsigned int i; + static int lineNum = 1; + static int colNum = 1; + + +#if YYPURE +# define yylloc (*llocp) +# define yylval (*lvalp) +#endif + + while (1) + { + c = getchar (); + switch (c) + { + case EOF: + return 0; + case '\t': + colNum = 1 + ((colNum + 7) & ~7); + break; + case ' ': case '\f': + colNum += 1; + break; + case '\n': + lineNum += 1; + colNum = 1; + break; + default: + { + int tok; +#if YYLSP_NEEDED + yylloc.first_line = yylloc.last_line = lineNum; + yylloc.first_column = colNum; +#endif + if (isalpha (c)) + { + i = 0; + + do + { + buffer[i++] = c; + colNum += 1; + if (i == sizeof buffer - 1) + abort (); + c = getchar (); + } + while (isalnum (c) || c == '_'); + + ungetc (c, stdin); + buffer[i++] = 0; + tok = isupper ((unsigned char) buffer[0]) ? TYPENAME : ID; + yylval = strcpy (malloc (i), buffer); + } + else + { + colNum += 1; + tok = c; + yylval = ""; + } +#if YYLSP_NEEDED + yylloc.last_column = colNum-1; +#endif + return tok; + } + } + } +} + +int +yyerror (ERROR_PARAMETERS) +{ +#if YYPURE && YYLSP_NEEDED + /* Pacify GCC by using llocp. */ + if (! llocp) + abort (); +#endif + fprintf (stderr, "%s\n", s); + return 0; +} + + +static char * +format (char const *form, ...) +{ + char buffer[1024]; + va_list args; + va_start (args, form); + vsprintf (buffer, form, args); + va_end (args); + return strcpy (malloc (strlen (buffer) + 1), buffer); +} + + +static YYSTYPE +stmtMerge (YYSTYPE x0, YYSTYPE x1) +{ + return format ("(%s,%s)", x0, x1); +} + +_ATEOF + + + +cat >test-input <<'_ATEOF' + + +z + q; + +T x; + +T x = y; + +x = y; + +T (x) + y; + +T (x); + +T (y) = z + q; + +T (y y) = z + q; + +z + q; + +@ + +This is total garbage, but it should be ignored. +_ATEOF + + +$at_traceoff +echo "cxx-type.at:360: bison -o types.c types.y" +echo cxx-type.at:360 >$at_check_line_file +( $at_traceon; bison -o types.c types.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:360: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "cxx-type.at:360: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS types.c \$LIBS -o types" +echo cxx-type.at:360 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS types.c $LIBS -o types ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:360: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + +$at_traceoff +echo "cxx-type.at:362: \$PREPARSER ./types test-input | sed 's/ *\$//'" +echo cxx-type.at:362 >$at_check_line_file +( $at_traceon; $PREPARSER ./types test-input | sed 's/ *$//' ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "syntax error +" | $at_diff - $at_stderr || at_failed=: +echo >>$at_stdout; echo "+(z,q) +(T,x) +(T,x,y) +=(x,y) ++((x,T),y) +((T,x),(x,T)) +((T,y,+(z,q)),=((y,T),+(z,q))) + ++(z,q) +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:362: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 118 ) # 118. cxx-type.at:364: GLR: Merge conflicting parses, pure, locations + at_setup_line='cxx-type.at:364' + at_desc='GLR: Merge conflicting parses, pure, locations' + $at_quiet $ECHO_N "118: GLR: Merge conflicting parses, pure, locations$ECHO_C" + at_xfail=no + ( + echo "118. cxx-type.at:364: testing ..." + $at_traceon + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >types.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Simplified C++ Type and Expression Grammar. */ + +%pure-parser %locations + +%{ + #include + #define YYSTYPE char const * + static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1); + #define YYINITDEPTH 10 + static char *format (char const *, ...); + struct YYLTYPE; +#if YYPURE +# if YYLSP_NEEDED +# define LEX_PARAMETERS YYSTYPE *lvalp, struct YYLTYPE *llocp +# define ERROR_PARAMETERS struct YYLTYPE *llocp, char const *s +# else +# define LEX_PARAMETERS YYSTYPE *lvalp +# endif +#endif +#ifndef LEX_PARAMETERS +# define LEX_PARAMETERS void +#endif +#ifndef ERROR_PARAMETERS +# define ERROR_PARAMETERS char const *s +#endif + int yylex (LEX_PARAMETERS); + int yyerror (ERROR_PARAMETERS); +%} + +%token TYPENAME ID + +%right '=' +%left '+' + +%glr-parser + +%% + +prog : + | prog stmt { + + printf ("%d.%d-%d.%d: ", + @2.first_line, @2.first_column, + @2.last_line, @2.last_column); + printf ("%s\n", $2); + } + ; + +stmt : expr ';' %merge { $$ = $1; } + | decl %merge + | error ';' { $$ = ""; } + | '@' { YYACCEPT; } + ; + +expr : ID + | TYPENAME '(' expr ')' { $$ = format ("(%s,%s)", $3, $1); } + | expr '+' expr { $$ = format ("+(%s,%s)", $1, $3); } + | expr '=' expr { $$ = format ("=(%s,%s)", $1, $3); } + ; + +decl : TYPENAME declarator ';' + { $$ = format ("(%s,%s)", $1, $2); } + | TYPENAME declarator '=' expr ';' + { $$ = format ("(%s,%s,%s)", $1, $2, $4); } + ; + +declarator : ID + | '(' declarator ')' { $$ = $2; } + ; + +%% + +#include +#include +#include +#include + +int +main (int argc, char **argv) +{ + if (argc != 2) + abort (); + if (!freopen (argv[1], "r", stdin)) + abort (); + exit (yyparse ()); +} + +int +yylex (LEX_PARAMETERS) +{ + char buffer[256]; + int c; + unsigned int i; + static int lineNum = 1; + static int colNum = 1; + + +#if YYPURE +# define yylloc (*llocp) +# define yylval (*lvalp) +#endif + + while (1) + { + c = getchar (); + switch (c) + { + case EOF: + return 0; + case '\t': + colNum = 1 + ((colNum + 7) & ~7); + break; + case ' ': case '\f': + colNum += 1; + break; + case '\n': + lineNum += 1; + colNum = 1; + break; + default: + { + int tok; +#if YYLSP_NEEDED + yylloc.first_line = yylloc.last_line = lineNum; + yylloc.first_column = colNum; +#endif + if (isalpha (c)) + { + i = 0; + + do + { + buffer[i++] = c; + colNum += 1; + if (i == sizeof buffer - 1) + abort (); + c = getchar (); + } + while (isalnum (c) || c == '_'); + + ungetc (c, stdin); + buffer[i++] = 0; + tok = isupper ((unsigned char) buffer[0]) ? TYPENAME : ID; + yylval = strcpy (malloc (i), buffer); + } + else + { + colNum += 1; + tok = c; + yylval = ""; + } +#if YYLSP_NEEDED + yylloc.last_column = colNum-1; +#endif + return tok; + } + } + } +} + +int +yyerror (ERROR_PARAMETERS) +{ +#if YYPURE && YYLSP_NEEDED + /* Pacify GCC by using llocp. */ + if (! llocp) + abort (); +#endif + fprintf (stderr, "%s\n", s); + return 0; +} + + +static char * +format (char const *form, ...) +{ + char buffer[1024]; + va_list args; + va_start (args, form); + vsprintf (buffer, form, args); + va_end (args); + return strcpy (malloc (strlen (buffer) + 1), buffer); +} + + +static YYSTYPE +stmtMerge (YYSTYPE x0, YYSTYPE x1) +{ + return format ("(%s,%s)", x0, x1); +} + +_ATEOF + + + +cat >test-input <<'_ATEOF' + + +z + q; + +T x; + +T x = y; + +x = y; + +T (x) + y; + +T (x); + +T (y) = z + q; + +T (y y) = z + q; + +z + q; + +@ + +This is total garbage, but it should be ignored. +_ATEOF + + +$at_traceoff +echo "cxx-type.at:366: bison -o types.c types.y" +echo cxx-type.at:366 >$at_check_line_file +( $at_traceon; bison -o types.c types.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:366: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "cxx-type.at:366: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS types.c \$LIBS -o types" +echo cxx-type.at:366 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS types.c $LIBS -o types ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:366: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + +$at_traceoff +echo "cxx-type.at:368: \$PREPARSER ./types test-input | sed 's/ *\$//'" +echo cxx-type.at:368 >$at_check_line_file +( $at_traceon; $PREPARSER ./types test-input | sed 's/ *$//' ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "syntax error +" | $at_diff - $at_stderr || at_failed=: +echo >>$at_stdout; echo "3.1-3.6: +(z,q) +5.1-5.4: (T,x) +7.1-7.8: (T,x,y) +9.1-9.6: =(x,y) +11.1-11.10: +((x,T),y) +13.1-13.6: ((T,x),(x,T)) +15.1-15.14: ((T,y,+(z,q)),=((y,T),+(z,q))) +17.6-17.16: +19.1-19.6: +(z,q) +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:368: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 119 ) # 119. cxx-type.at:371: GLR: Verbose messages, resolve ambiguity, impure, no locations + at_setup_line='cxx-type.at:371' + at_desc='GLR: Verbose messages, resolve ambiguity, impure, no locations' + $at_quiet $ECHO_N "119: GLR: Verbose messages, resolve ambiguity, impure, no locations$ECHO_C" + at_xfail=no + ( + echo "119. cxx-type.at:371: testing ..." + $at_traceon + + + + +# Using yacc.c? + + + + + + + +# yyerror receives the location if %location & %pure & (%glr or %parse-param). + +# yyerror always sees the locations (when activated), except if +# yacc & pure & !param. + + +# The interface is pure: either because %pure-parser, or because we +# are using the C++ parsers. + + + + + + + + + + + + +cat >types.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Simplified C++ Type and Expression Grammar. */ + +%error-verbose + +%{ + #include + #define YYSTYPE char const * + static YYSTYPE stmtMerge (YYSTYPE x0, YYSTYPE x1); + #define YYINITDEPTH 10 + static char *format (char const *, ...); + struct YYLTYPE; +#if YYPURE +# if YYLSP_NEEDED +# define LEX_PARAMETERS YYSTYPE *lvalp, struct YYLTYPE *llocp +# define ERROR_PARAMETERS struct YYLTYPE *llocp, char const *s +# else +# define LEX_PARAMETERS YYSTYPE *lvalp +# endif +#endif +#ifndef LEX_PARAMETERS +# define LEX_PARAMETERS void +#endif +#ifndef ERROR_PARAMETERS +# define ERROR_PARAMETERS char const *s +#endif + int yylex (LEX_PARAMETERS); + int yyerror (ERROR_PARAMETERS); +%} + +%token TYPENAME ID + +%right '=' +%left '+' + +%glr-parser + +%% + +prog : + | prog stmt { + + printf ("%s\n", $2); + } + ; + +stmt : expr ';' %merge { $$ = $1; } + | decl %merge + | error ';' { $$ = ""; } + | '@' { YYACCEPT; } + ; + +expr : ID + | TYPENAME '(' expr ')' { $$ = format ("(%s,%s)", $3, $1); } + | expr '+' expr { $$ = format ("+(%s,%s)", $1, $3); } + | expr '=' expr { $$ = format ("=(%s,%s)", $1, $3); } + ; + +decl : TYPENAME declarator ';' + { $$ = format ("(%s,%s)", $1, $2); } + | TYPENAME declarator '=' expr ';' + { $$ = format ("(%s,%s,%s)", $1, $2, $4); } + ; + +declarator : ID + | '(' declarator ')' { $$ = $2; } + ; + +%% + +#include +#include +#include +#include + +int +main (int argc, char **argv) +{ + if (argc != 2) + abort (); + if (!freopen (argv[1], "r", stdin)) + abort (); + exit (yyparse ()); +} + +int +yylex (LEX_PARAMETERS) +{ + char buffer[256]; + int c; + unsigned int i; + static int lineNum = 1; + static int colNum = 1; + + +#if YYPURE +# define yylloc (*llocp) +# define yylval (*lvalp) +#endif + + while (1) + { + c = getchar (); + switch (c) + { + case EOF: + return 0; + case '\t': + colNum = 1 + ((colNum + 7) & ~7); + break; + case ' ': case '\f': + colNum += 1; + break; + case '\n': + lineNum += 1; + colNum = 1; + break; + default: + { + int tok; +#if YYLSP_NEEDED + yylloc.first_line = yylloc.last_line = lineNum; + yylloc.first_column = colNum; +#endif + if (isalpha (c)) + { + i = 0; + + do + { + buffer[i++] = c; + colNum += 1; + if (i == sizeof buffer - 1) + abort (); + c = getchar (); + } + while (isalnum (c) || c == '_'); + + ungetc (c, stdin); + buffer[i++] = 0; + tok = isupper ((unsigned char) buffer[0]) ? TYPENAME : ID; + yylval = strcpy (malloc (i), buffer); + } + else + { + colNum += 1; + tok = c; + yylval = ""; + } +#if YYLSP_NEEDED + yylloc.last_column = colNum-1; +#endif + return tok; + } + } + } +} + +int +yyerror (ERROR_PARAMETERS) +{ +#if YYPURE && YYLSP_NEEDED + /* Pacify GCC by using llocp. */ + if (! llocp) + abort (); +#endif + fprintf (stderr, "%s\n", s); + return 0; +} + + +static char * +format (char const *form, ...) +{ + char buffer[1024]; + va_list args; + va_start (args, form); + vsprintf (buffer, form, args); + va_end (args); + return strcpy (malloc (strlen (buffer) + 1), buffer); +} + + +static YYSTYPE +stmtMerge (YYSTYPE x0, YYSTYPE x1) +{ + return format ("(%s,%s)", x0, x1); +} + +_ATEOF + + + +cat >test-input <<'_ATEOF' + + +z + q; + +T x; + +T x = y; + +x = y; + +T (x) + y; + +T (x); + +T (y) = z + q; + +T (y y) = z + q; + +z + q; + +@ + +This is total garbage, but it should be ignored. +_ATEOF + + +$at_traceoff +echo "cxx-type.at:373: bison -o types.c types.y" +echo cxx-type.at:373 >$at_check_line_file +( $at_traceon; bison -o types.c types.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:373: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "cxx-type.at:373: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS types.c \$LIBS -o types" +echo cxx-type.at:373 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS types.c $LIBS -o types ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:373: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + + + + + + + + + + + + + + + + + +$at_traceoff +echo "cxx-type.at:375: \$PREPARSER ./types test-input | sed 's/ *\$//'" +echo cxx-type.at:375 >$at_check_line_file +( $at_traceon; $PREPARSER ./types test-input | sed 's/ *$//' ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "syntax error, unexpected ID, expecting '=' or '+' or ')' +" | $at_diff - $at_stderr || at_failed=: +echo >>$at_stdout; echo "+(z,q) +(T,x) +(T,x,y) +=(x,y) ++((x,T),y) +((T,x),(x,T)) +((T,y,+(z,q)),=((y,T),+(z,q))) + ++(z,q) +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "cxx-type.at:375: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + + banner-16 ) # Banner 16. glr-regression.at:19 + cat <<\_ATEOF + +GLR Regression Tests + +_ATEOF + ;; + + 120 ) # 120. glr-regression.at:25: Badly Collapsed GLR States + at_setup_line='glr-regression.at:25' + at_desc='Badly Collapsed GLR States' + $at_quiet $ECHO_N "120: Badly Collapsed GLR States $ECHO_C" + at_xfail=no + ( + echo "120. glr-regression.at:25: testing ..." + $at_traceon + + +cat >glr-regr1.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Regression Test: Improper state compression */ +/* Reported by Scott McPeak */ + +%{ +#include + +#define YYSTYPE int +static YYSTYPE exprMerge (YYSTYPE x0, YYSTYPE x1); +int yylex (void); +int yyerror (char const *msg); +%} + + +%glr-parser + + +/* -------- productions ------ */ +%% + +StartSymbol: E { $$=0; } %merge + ; + +E: E 'P' E { $$=1; printf("E -> E 'P' E\n"); } %merge + | 'B' { $$=2; printf("E -> 'B'\n"); } %merge + ; + + + +/* ---------- C code ----------- */ +%% + +static YYSTYPE exprMerge (YYSTYPE x0, YYSTYPE x1) +{ + (void) x0; + (void) x1; + printf ("\n"); + return 0; +} + +int +main (void) +{ + return yyparse (); +} + +int +yyerror (char const *msg) +{ + fprintf (stderr, "%s\n", msg); + exit (4); +} + + +int +yylex (void) +{ + for (;;) + { + int ch = getchar (); + if (ch == EOF) + return 0; + else if (ch == 'B' || ch == 'P') + return ch; + } +} +_ATEOF + + + +$at_traceoff +echo "glr-regression.at:97: bison -o glr-regr1.c glr-regr1.y" +echo glr-regression.at:97 >$at_check_line_file +( $at_traceon; bison -o glr-regr1.c glr-regr1.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "glr-regr1.y: conflicts: 1 shift/reduce +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "glr-regression.at:97: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "glr-regression.at:98: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS glr-regr1.c \$LIBS -o glr-regr1" +echo glr-regression.at:98 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS glr-regr1.c $LIBS -o glr-regr1 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "glr-regression.at:98: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "glr-regression.at:109: echo BPBPB | ./glr-regr1" +echo glr-regression.at:109 >$at_check_line_file +( $at_traceon; echo BPBPB | ./glr-regr1 ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "E -> 'B' +E -> 'B' +E -> E 'P' E +E -> 'B' +E -> E 'P' E +E -> 'B' +E -> E 'P' E +E -> E 'P' E + +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "glr-regression.at:109: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + 121 ) # 121. glr-regression.at:117: Improper handling of embedded actions and $-N in GLR parsers + at_setup_line='glr-regression.at:117' + at_desc='Improper handling of embedded actions and $-N in GLR parsers' + $at_quiet $ECHO_N "121: Improper handling of embedded actions and $-N in GLR parsers$ECHO_C" + at_xfail=no + ( + echo "121. glr-regression.at:117: testing ..." + $at_traceon + + +cat >glr-regr2a.y <<'_ATEOF' +%{ +#if HAVE_CONFIG_H +# include + /* We don't need perfect functions for these tests. */ +# undef malloc +# undef memcmp +# undef realloc +#endif +%} + +/* Regression Test: Improper handling of embedded actions and $-N */ +/* Reported by S. Eken */ + +%{ + #define YYSTYPE char const * + #define yyfalse 0 + #define yytrue 1 + + #include + #include + #include + int yylex (void); + void yyerror (char const *); +%} + +%glr-parser + +%% + +command: + 's' var 't' + { printf ("Variable: '%s'\n", $2); } + 'v' 'x' 'q' + | 's' var_list 't' 'e' + { printf ("Varlist: '%s'\n", $2); } + | 's' var 't' var_printer 'x' + ; + +var: + 'V' + { $$ = $1; } + ; + +var_list: + var + { $$ = $1; } + | var ',' var_list + { + char buffer[50]; + strcpy (buffer, $1); + strcat (buffer, ","); + strcat (buffer, $3); + $$ = strdup (buffer); + } + ; + +var_printer: 'v' + { printf ("Variable: '%s'\n", $-1); } + +%% + +FILE *yyin = NULL; + +int +yylex (void) +{ + char buf[50]; + switch (fscanf (yyin, " %1[a-z,]", buf)) { + case 1: + return buf[0]; + case EOF: + return 0; + default: + break; + } + fscanf (yyin, "%s", buf); + yylval = strdup (buf); + return 'V'; +} + +void +yyerror (char const *s) +{ printf ("%s\n", s); +} + +int +main (int argc, char **argv) +{ + yyin = stdin; + if (argc == 2 && !(yyin = fopen (argv[1], "r"))) return 1; + return yyparse (); +} +_ATEOF + + + +$at_traceoff +echo "glr-regression.at:206: bison -o glr-regr2a.c glr-regr2a.y" +echo glr-regression.at:206 >$at_check_line_file +( $at_traceon; bison -o glr-regr2a.c glr-regr2a.y ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo >>$at_stderr; echo "glr-regr2a.y: conflicts: 2 shift/reduce +" | $at_diff - $at_stderr || at_failed=: +$at_diff $at_devnull $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "glr-regression.at:206: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "glr-regression.at:207: \$CC \$CFLAGS \$CPPFLAGS \$LDFLAGS glr-regr2a.c \$LIBS -o glr-regr2a" +echo glr-regression.at:207 >$at_check_line_file +( $at_traceon; $CC $CFLAGS $CPPFLAGS $LDFLAGS glr-regr2a.c $LIBS -o glr-regr2a ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +echo stderr:; cat $at_stderr +echo stdout:; cat $at_stdout +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "glr-regression.at:207: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + +$at_traceoff +echo "glr-regression.at:211: echo s VARIABLE_1 t v x q | ./glr-regr2a" +echo glr-regression.at:211 >$at_check_line_file +( $at_traceon; echo s VARIABLE_1 t v x q | ./glr-regr2a ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "Variable: 'VARIABLE_1' +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "glr-regression.at:211: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "glr-regression.at:214: echo s VARIABLE_1 , ANOTHER_VARIABLE_2 t e | ./glr-regr2a" +echo glr-regression.at:214 >$at_check_line_file +( $at_traceon; echo s VARIABLE_1 , ANOTHER_VARIABLE_2 t e | ./glr-regr2a ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "Varlist: 'VARIABLE_1,ANOTHER_VARIABLE_2' +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "glr-regression.at:214: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + +$at_traceoff +echo "glr-regression.at:217: echo s VARIABLE_3 t v x | ./glr-regr2a" +echo glr-regression.at:217 >$at_check_line_file +( $at_traceon; echo s VARIABLE_3 t v x | ./glr-regr2a ) >$at_stdout 2>$at_stder1 +at_status=$? +grep '^ *+' $at_stder1 >&2 +grep -v '^ *+' $at_stder1 >$at_stderr +at_failed=false +$at_diff $at_devnull $at_stderr || at_failed=: +echo >>$at_stdout; echo "Variable: 'VARIABLE_3' +" | $at_diff - $at_stdout || at_failed=: +case $at_status in + 77) echo 77 > $at_status_file + exit 77;; + 0) ;; + *) echo "glr-regression.at:217: exit code was $at_status, expected 0" + at_failed=:;; +esac +if $at_failed; then + + echo 1 > $at_status_file + exit 1 +fi + +$at_traceon + + + + $at_traceoff + $at_times_p && times >$at_times_file + ) 5>&1 2>&1 | eval $at_tee_pipe + at_status=`cat $at_status_file` + ;; + + + * ) + echo "$as_me: no such test group: $at_group" >&2 + continue + ;; + esac + + # Be sure to come back to the suite directory, in particular + # since below we might `rm' the group directory we are in currently. + cd $at_suite_dir + + case $at_group in + banner-*) ;; + *) + if test ! -f $at_check_line_file; then + sed "s/^ */$as_me: warning: /" <<_ATEOF + A failure happened in a test group before any test could be + run. This means that test suite is improperly designed. Please + report this failure to . +_ATEOF + echo "$at_setup_line" >$at_check_line_file + fi + at_group_count=`expr 1 + $at_group_count` + $at_verbose $ECHO_N "$at_group. $at_setup_line: $ECHO_C" + echo $ECHO_N "$at_group. $at_setup_line: $ECHO_C" >> $at_group_log + case $at_xfail:$at_status in + yes:0) + at_msg="UNEXPECTED PASS" + at_xpass_list="$at_xpass_list $at_group" + at_errexit=$at_errexit_p + ;; + no:0) + at_msg="ok" + at_pass_list="$at_pass_list $at_group" + at_errexit=false + ;; + *:77) + at_msg="skipped (`cat $at_check_line_file`)" + at_skip_list="$at_skip_list $at_group" + at_errexit=false + ;; + yes:*) + at_msg="expected failure (`cat $at_check_line_file`)" + at_xfail_list="$at_xfail_list $at_group" + at_errexit=false + ;; + no:*) + at_msg="FAILED (`cat $at_check_line_file`)" + at_fail_list="$at_fail_list $at_group" + at_errexit=$at_errexit_p + ;; + esac + echo $at_msg + at_log_msg="$at_group. $at_desc ($at_setup_line): $at_msg" + case $at_status in + 0|77) + # $at_times_file is only available if the group succeeded. + # We're not including the group log, so the success message + # is written in the global log separately. But we also + # write to the group log in case they're using -d. + if test -f $at_times_file; then + at_log_msg="$at_log_msg (`sed 1d $at_times_file`)" + rm -f $at_times_file + fi + echo "$at_log_msg" >> $at_group_log + echo "$at_log_msg" >&5 + + # Cleanup the group directory, unless the user wants the files. + $at_debug_p || rm -rf $at_group_dir + ;; + *) + # Upon failure, include the log into the testsuite's global + # log. The failure message is written in the group log. It + # is later included in the global log. + echo "$at_log_msg" >> $at_group_log + + # Upon failure, keep the group directory for autopsy, and + # create the debugging script. + { + echo "#! /bin/sh" + echo 'test "${ZSH_VERSION+set}" = set && alias -g '\''${1+"$@"}'\''='\''"$@"'\''' + echo "cd $at_dir" + echo 'exec ${CONFIG_SHELL-'"$SHELL"'}' "$0" \ + '-v -d' "$at_debug_args" "$at_group" '${1+"$@"}' + echo 'exit 1' + } >$at_group_dir/run + chmod +x $at_group_dir/run + $at_errexit && break + ;; + esac + ;; + esac +done + +# Back to the top directory. +cd $at_dir + +# Compute the duration of the suite. +at_stop_date=`date` +at_stop_time=`(date +%s) 2>/dev/null` +echo "$as_me: ending at: $at_stop_date" >&5 +at_duration_s=`(expr $at_stop_time - $at_start_time) 2>/dev/null` +at_duration_m=`(expr $at_duration_s / 60) 2>/dev/null` +at_duration_h=`(expr $at_duration_m / 60) 2>/dev/null` +at_duration_s=`(expr $at_duration_s % 60) 2>/dev/null` +at_duration_m=`(expr $at_duration_m % 60) 2>/dev/null` +at_duration="${at_duration_h}h ${at_duration_m}m ${at_duration_s}s" +if test "$at_duration" != "h m s"; then + echo "$as_me: test suite duration: $at_duration" >&5 +fi + +# Wrap up the test suite with summary statistics. +at_skip_count=`set dummy $at_skip_list; shift; echo $#` +at_fail_count=`set dummy $at_fail_list; shift; echo $#` +at_xpass_count=`set dummy $at_xpass_list; shift; echo $#` +at_xfail_count=`set dummy $at_xfail_list; shift; echo $#` + +at_run_count=`expr $at_group_count - $at_skip_count` +at_unexpected_count=`expr $at_xpass_count + $at_fail_count` +at_total_fail_count=`expr $at_xfail_count + $at_fail_count` + +echo +cat <<\_ASBOX +## ------------- ## +## Test results. ## +## ------------- ## +_ASBOX +echo +{ + echo + cat <<\_ASBOX +## ------------- ## +## Test results. ## +## ------------- ## +_ASBOX + echo +} >&5 + +if test $at_run_count = 1; then + at_result="1 test" + at_were=was +else + at_result="$at_run_count tests" + at_were=were +fi +if $at_errexit_p && test $at_unexpected_count != 0; then + if test $at_xpass_count = 1; then + at_result="$at_result $at_were run, one passed" + else + at_result="$at_result $at_were run, one failed" + fi + at_result="$at_result unexpectedly and inhibited subsequent tests." +else + # Don't you just love exponential explosion of the number of cases? + case $at_xpass_count:$at_fail_count:$at_xfail_count in + # So far, so good. + 0:0:0) at_result="$at_result $at_were successful." ;; + 0:0:*) at_result="$at_result behaved as expected." ;; + + # Some unexpected failures + 0:*:0) at_result="$at_result $at_were run, +$at_fail_count failed unexpectedly." ;; + + # Some failures, both expected and unexpected + 0:*:1) at_result="$at_result $at_were run, +$at_total_fail_count failed ($at_xfail_count expected failure)." ;; + 0:*:*) at_result="$at_result $at_were run, +$at_total_fail_count failed ($at_xfail_count expected failures)." ;; + + # No unexpected failures, but some xpasses + *:0:*) at_result="$at_result $at_were run, +$at_xpass_count passed unexpectedly." ;; + + # No expected failures, but failures and xpasses + *:1:0) at_result="$at_result $at_were run, +$at_unexpected_count did not behave as expected ($at_fail_count unexpected failure)." ;; + *:*:0) at_result="$at_result $at_were run, +$at_unexpected_count did not behave as expected ($at_fail_count unexpected failures)." ;; + + # All of them. + *:*:1) at_result="$at_result $at_were run, +$at_xpass_count passed unexpectedly, +$at_total_fail_count failed ($at_xfail_count expected failure)." ;; + *:*:*) at_result="$at_result $at_were run, +$at_xpass_count passed unexpectedly, +$at_total_fail_count failed ($at_xfail_count expected failures)." ;; + esac + + if test $at_skip_count = 0 && test $at_run_count -gt 1; then + at_result="All $at_result" + fi +fi + +# Now put skips in the mix. +case $at_skip_count in + 0) ;; + 1) at_result="$at_result +1 test was skipped." ;; + *) at_result="$at_result +$at_skip_count tests were skipped." ;; +esac + +if test $at_unexpected_count = 0; then + echo "$at_result" + echo "$at_result" >&5 +else + echo "ERROR: $at_result" >&2 + echo "ERROR: $at_result" >&5 + { + echo + cat <<\_ASBOX +## ------------------------ ## +## Summary of the failures. ## +## ------------------------ ## +_ASBOX + + # Summary of failed and skipped tests. + if test $at_fail_count != 0; then + echo "Failed tests:" + $SHELL $0 $at_fail_list --list + echo + fi + if test $at_skip_count != 0; then + echo "Skipped tests:" + $SHELL $0 $at_skip_list --list + echo + fi + if test $at_xpass_count != 0; then + echo "Unexpected passes:" + $SHELL $0 $at_xpass_list --list + echo + fi + if test $at_fail_count != 0; then + cat <<\_ASBOX +## ---------------------- ## +## Detailed failed tests. ## +## ---------------------- ## +_ASBOX + echo + for at_group in $at_fail_list + do + # Normalize the test group number. + at_group_normalized=`expr "00000$at_group" : ".*\($at_format\)"` + # Create a fresh directory for the next test group, and enter. + at_group_dir=$at_suite_dir/$at_group_normalized + at_group_log=$at_group_dir/$as_me.log + cat $at_group_log + echo + done + echo + fi + if test -n "$at_top_srcdir"; then + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## $at_top_builddir/config.log ## +_ASBOX + sed 's/^/| /' $at_top_builddir/config.log + echo + fi + } >&5 + + sed 'h;s/./-/g;s/^.../## /;s/...$/ ##/;p;x;p;x' <<_ASBOX +## $as_me.log was created. ## +_ASBOX + + echo + echo "Please send \`$as_me.log' and all information you think might help:" + echo + echo " To: " + echo " Subject: [GNU Bison 1.875d] $as_me:$at_fail_list${at_fail_list:+ failed${at_xpass_list:+,}}$at_xpass_list${at_xpass_list:+ passed unexpectedly}" + echo + if test $at_debug_p = false; then + echo + echo 'You may investigate any problem if you feel able to do so, in which' + echo 'case the test suite provides a good starting point.' + echo + fi + exit 1 +fi + +exit 0 + + diff --git a/src/apps/bin/bison/tests/testsuite.at b/src/apps/bin/bison/tests/testsuite.at new file mode 100644 index 0000000000..d54975d704 --- /dev/null +++ b/src/apps/bin/bison/tests/testsuite.at @@ -0,0 +1,63 @@ +# Process this file with autom4te to create testsuite. -*- Autotest -*- + +# Test suite for GNU Bison. +# Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + + +# Testing resistance to user bugs. +m4_include([input.at]) + +# Testing output file names. +m4_include([output.at]) + +# Testing the part of the engine that computes FOLLOW etc. +m4_include([sets.at]) + +# Testing grammar reduction. +m4_include([reduce.at]) + +# Testing that #lines are correct. +m4_include([synclines.at]) + +# Testing that headers are sane. +m4_include([headers.at]) + +# Testing that user actions are properly performed. +m4_include([actions.at]) + +# Testing conflicts detection and resolution. +m4_include([conflicts.at]) + +# Fulling testing (compilation and execution of the parser) on calc. +m4_include([calc.at]) + +# Huge artificial grammars. +# Torturing the stack expansion at runtime. +m4_include([torture.at]) + +# Checking big, real world grammars. +m4_include([existing.at]) + +# Some old bugs. +m4_include([regression.at]) + +# GLR tests: +# C++ types, simplified +m4_include([cxx-type.at]) +# Regression tests +m4_include([glr-regression.at]) diff --git a/src/apps/bin/bison/tests/torture.at b/src/apps/bin/bison/tests/torture.at new file mode 100644 index 0000000000..4882d83e0b --- /dev/null +++ b/src/apps/bin/bison/tests/torture.at @@ -0,0 +1,473 @@ +# Torturing Bison. -*- Autotest -*- +# Copyright (C) 2001, 2002 Free Software Foundation, Inc. + +# This program is free software; you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation; either version 2, or (at your option) +# any later version. + +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. + +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA +# 02111-1307, USA. + +AT_BANNER([[Torture Tests.]]) + + +# AT_INCREASE_DATA_SIZE(SIZE) +# ------------------------------------------- +# Try to increase the data size to SIZE KiB if possible. +m4_define([AT_INCREASE_DATA_SIZE], +[data_limit=`(ulimit -S -d) 2>/dev/null` +case $data_limit in +[[0-9]]*) + if test "$data_limit" -lt $1; then + ulimit -S -d $1 + fi +esac]) + + +## ------------------------------------- ## +## Creating a large artificial grammar. ## +## ------------------------------------- ## + +# AT_DATA_TRIANGULAR_GRAMMAR(FILE-NAME, SIZE) +# ------------------------------------------- +# Create FILE-NAME, containing a self checking parser for a huge +# triangular grammar. +m4_define([AT_DATA_TRIANGULAR_GRAMMAR], +[AT_DATA([[gengram.pl]], +[[#! /usr/bin/perl -w + +use strict; +my $max = $ARGV[0] || 10; + +print < +#include + +#define YYERROR_VERBOSE 1 +#define YYDEBUG 1 + +static int yylex (void); +static void yyerror (const char *msg); +%} +%union +{ + int val; +}; + +%token END "end" +%type exp input +EOF + +for my $size (1 .. $max) + { + print "%token t$size $size \"$size\"\n"; + }; + +print < $max) + return 0; + else if (inner > outer) + { + inner = 1; + ++outer; + return END; + } + return inner++; +} + +static void +yyerror (const char *msg) +{ + fprintf (stderr, "%s\\n", msg); +} + +int +main (void) +{ + yydebug = !!getenv ("YYDEBUG"); + return yyparse (); +} +EOF +]]) + +AT_CHECK([perl -w ./gengram.pl $2 || exit 77], 0, [stdout]) +mv stdout $1 +]) + + +## -------------- ## +## Big triangle. ## +## -------------- ## + +AT_SETUP([Big triangle]) + +# I have been able to go up to 2000 on my machine. +# I tried 3000, a 29Mb grammar file, but then my system killed bison. +# With 500 and the new parser, which consume far too much memory, +# it gets killed too. Of course the parser is to be cleaned. +AT_DATA_TRIANGULAR_GRAMMAR([input.y], [200]) +AT_CHECK([bison -v -o input.c input.y]) +AT_COMPILE([input]) +AT_PARSER_CHECK([./input]) + +AT_CLEANUP + + + +# AT_DATA_HORIZONTAL_GRAMMAR(FILE-NAME, SIZE) +# ------------------------------------------- +# Create FILE-NAME, containing a self checking parser for a huge +# horizontal grammar. +m4_define([AT_DATA_HORIZONTAL_GRAMMAR], +[AT_DATA([[gengram.pl]], +[[#! /usr/bin/perl -w + +use strict; +my $max = $ARGV[0] || 10; + +print < +#include + +#define YYERROR_VERBOSE 1 +#define YYDEBUG 1 + +static int yylex (void); +static void yyerror (const char *msg); +%} +EOF + +for my $size (1 .. $max) + { + print "%token t$size $size \"$size\"\n"; + }; + +print < $max) + return 0; + else + return counter++; +} + +static void +yyerror (const char *msg) +{ + fprintf (stderr, "%s\\n", msg); +} + +int +main (void) +{ + yydebug = !!getenv ("YYDEBUG"); + return yyparse (); +} +EOF +]]) + +AT_CHECK([perl -w ./gengram.pl $2 || exit 77], 0, [stdout]) +mv stdout $1 +]) + + +## ---------------- ## +## Big horizontal. ## +## ---------------- ## + +AT_SETUP([Big horizontal]) + +# I have been able to go up to 10000 on my machine, but I had to +# increase the maximum stack size (* 100). It gave: +# +# input.y 263k +# input.tab.c 1.3M +# input 453k +# +# gengram.pl 10000 0.70s user 0.01s sys 99% cpu 0.711 total +# bison input.y 730.56s user 0.53s sys 99% cpu 12:12.34 total +# gcc -Wall input.tab.c -o input 5.81s user 0.20s sys 100% cpu 6.01 total +# ./input 0.00s user 0.01s sys 108% cpu 0.01 total +# +AT_DATA_HORIZONTAL_GRAMMAR([input.y], [1000]) + +# GNU m4 requires about 70 MiB for this test on a 32-bit host. +# Ask for 200 MiB, which should be plenty even on a 64-bit host. +AT_INCREASE_DATA_SIZE(204000) + +AT_CHECK([bison -v -o input.c input.y]) +AT_COMPILE([input]) +AT_PARSER_CHECK([./input]) + +AT_CLEANUP + + + +# AT_DATA_LOOKAHEADS_GRAMMAR(FILE-NAME, SIZE) +# ------------------------------------------- +# Create FILE-NAME, containing a self checking parser for a grammar +# requiring SIZE lookaheads. +m4_define([AT_DATA_LOOKAHEADS_GRAMMAR], +[AT_DATA([[gengram.pl]], +[[#! /usr/bin/perl -w + +use strict; +use Text::Wrap; +my $max = $ARGV[0] || 10; + +print < +#include + +#define YYERROR_VERBOSE 1 +#define YYDEBUG 1 + +static int yylex (void); +static void yyerror (const char *msg); +%} +%union +{ + int val; +}; + +%type input exp +%token token +EOF + +print + wrap ("%type ", + " ", + map { "n$_" } (1 .. $max)), + "\n"; + +for my $count (1 .. $max) + { + print "%token t$count $count \"$count\"\n"; + }; + +print < $max) + return 0; + if (return_token) + { + return_token = 0; + return token; + } + return_token = 1; + return counter++; +} + +static void +yyerror (const char *msg) +{ + fprintf (stderr, "%s\\n", msg); +} + +int +main (void) +{ + yydebug = !!getenv ("YYDEBUG"); + return yyparse (); +} +EOF +]]) + +AT_CHECK([perl -w ./gengram.pl $2 || exit 77], 0, [stdout]) +mv stdout $1 +]) + + +## ----------------- ## +## Many lookaheads. ## +## ----------------- ## + +AT_SETUP([Many lookaheads]) + +AT_DATA_LOOKAHEADS_GRAMMAR([input.y], [1000]) + +# GNU m4 requires about 70 MiB for this test on a 32-bit host. +# Ask for 200 MiB, which should be plenty even on a 64-bit host. +AT_INCREASE_DATA_SIZE(204000) + +AT_CHECK([bison -v -o input.c input.y]) +AT_COMPILE([input]) +AT_PARSER_CHECK([./input]) + +AT_CLEANUP + + + +# AT_DATA_STACK_TORTURE(C-PROLOGUE) +# --------------------------------- +# A parser specialized in torturing the stack size. +m4_define([AT_DATA_STACK_TORTURE], +[# A grammar of parens growing the stack thanks to right recursion. +# exp: +AT_DATA([input.y], +[[%{ +#include +#include +]$1[ + static int yylex (void); + static void yyerror (const char *msg); +%} +%error-verbose +%debug +%token WAIT_FOR_EOF +%% +exp: WAIT_FOR_EOF exp | ; +%% +static void +yyerror (const char *msg) +{ + fprintf (stderr, "%s\n", msg); + exit (1); +} + +/* There are YYLVAL_MAX of WAIT_FOR_EOFs. */ +unsigned int yylval_max; + +static int +yylex (void) +{ + if (yylval--) + return WAIT_FOR_EOF; + else + return EOF; +} + +int +main (int argc, const char **argv) +{ + if (argc != 2) + abort (); + yylval = atoi (argv[1]); + yydebug = 1; + return yyparse (); +} +]]) +AT_CHECK([bison -o input.c input.y]) +AT_COMPILE([input]) +]) + + +## -------------------------------------- ## +## Exploding the Stack Size with Alloca. ## +## -------------------------------------- ## + +AT_SETUP([Exploding the Stack Size with Alloca]) + +AT_DATA_STACK_TORTURE + +# Below the limit of 200. +AT_PARSER_CHECK([./input 20], 0, [], [ignore]) +# Two enlargements: 2 * 2 * 200. +AT_PARSER_CHECK([./input 900], 0, [], [ignore]) +# Fails: beyond the limit of 10,000 (which we don't reach anyway since we +# multiply by two starting at 200 => 5120 is the last possible). +AT_PARSER_CHECK([./input 10000], 1, [], [ignore]) + +AT_CLEANUP + + + + +## -------------------------------------- ## +## Exploding the Stack Size with Malloc. ## +## -------------------------------------- ## + +AT_SETUP([Exploding the Stack Size with Malloc]) + +AT_DATA_STACK_TORTURE([[#define YYSTACK_USE_ALLOCA 0]]) + +# Below the limit of 200. +AT_PARSER_CHECK([./input 20], 0, [], [ignore]) +# Two enlargements: 2 * 2 * 200. +AT_PARSER_CHECK([./input 900], 0, [], [ignore]) +# Fails: beyond the limit of 10,000 (which we don't reach anyway since we +# multiply by two starting at 200 => 5120 is the possible). +AT_PARSER_CHECK([./input 10000], 1, [], [ignore]) + +AT_CLEANUP