# PaCkAgE DaTaStReAm
bison 1 7428
# end of header
070701000541bb000081a40000000000000000000000014cda0fa80000010f0000010000010006ffffffffffffffff0000000e00000000bison/pkginfo PKG=bison
NAME=bison 2.4.2 SPARC 64bit Solaris 10
VERSION=2.4.2
PSTAMP=10th November 2010
VENDOR=GNU
EMAIL=http://www.gnu.org/software/bison/
DESC=GNU general purpose parser generator
ARCH=sparc
CATEGORY=utility
CLASSES=none
BASEDIR=/
ISTATES=S s 1 2 3
RSTATES=S s 1 2 3
070701000541ba000081a40000000000000000000000014cda0fa800002f7e0000010000010006ffffffffffffffff0000000d00000000bison/pkgmap : 1 7428
1 d none /usr ? ? ?
1 d none /usr/local ? ? ?
1 d none /usr/local/bin 0755 root root
1 f none /usr/local/bin/bison 0755 root root 1840624 4239 1289359269
1 f none /usr/local/bin/yacc 0755 root root 47 3584 1289359269
1 d none /usr/local/lib 0755 root root
1 f none /usr/local/lib/charset.alias 0644 root root 665 47103 1289359268
1 f none /usr/local/lib/liby.a 0644 root root 9320 32565 1289359268
1 d none /usr/local/share 0755 root root
1 d none /usr/local/share/aclocal 0755 root root
1 f none /usr/local/share/aclocal/bison-i18n.m4 0644 root root 1922 24369 1289359271
1 d none /usr/local/share/bison 0755 root root
1 f none /usr/local/share/bison/README 0644 root root 2019 44890 1289359268
1 f none /usr/local/share/bison/bison.m4 0644 root root 20837 12133 1289359268
1 f none /usr/local/share/bison/c++-skel.m4 0644 root root 1149 29943 1289359268
1 f none /usr/local/share/bison/c++.m4 0644 root root 6014 27562 1289359268
1 f none /usr/local/share/bison/c-skel.m4 0644 root root 1143 29500 1289359268
1 f none /usr/local/share/bison/c.m4 0644 root root 12909 48577 1289359268
1 f none /usr/local/share/bison/glr.c 0644 root root 75659 15650 1289359268
1 f none /usr/local/share/bison/glr.cc 0644 root root 10632 29309 1289359268
1 f none /usr/local/share/bison/java-skel.m4 0644 root root 1150 30545 1289359268
1 f none /usr/local/share/bison/java.m4 0644 root root 8146 50425 1289359268
1 f none /usr/local/share/bison/lalr1.cc 0644 root root 30608 30510 1289359268
1 f none /usr/local/share/bison/lalr1.java 0644 root root 26509 52576 1289359268
1 f none /usr/local/share/bison/location.cc 0644 root root 6890 31632 1289359268
1 d none /usr/local/share/bison/m4sugar 0755 root root
1 f none /usr/local/share/bison/m4sugar/foreach.m4 0644 root root 17542 24644 1289359268
1 f none /usr/local/share/bison/m4sugar/m4sugar.m4 0644 root root 98348 49352 1289359268
1 d none /usr/local/share/bison/xslt 0755 root root
1 f none /usr/local/share/bison/xslt/bison.xsl 0644 root root 2966 47966 1289359268
1 f none /usr/local/share/bison/xslt/xml2dot.xsl 0644 root root 6419 9159 1289359268
1 f none /usr/local/share/bison/xslt/xml2text.xsl 0644 root root 18965 52686 1289359268
1 f none /usr/local/share/bison/xslt/xml2xhtml.xsl 0644 root root 22283 42381 1289359268
1 f none /usr/local/share/bison/yacc.c 0644 root root 50190 43932 1289359268
1 d none /usr/local/share/info 0755 root root
1 f none /usr/local/share/info/bison.info 0644 root root 464577 28585 1289359269
1 d none /usr/local/share/locale 0755 root root
1 d none /usr/local/share/locale/ast 0755 root root
1 d none /usr/local/share/locale/ast/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/ast/LC_MESSAGES/bison-runtime.mo 0644 root root 1315 33416 1289359265
1 d none /usr/local/share/locale/da 0755 root root
1 d none /usr/local/share/locale/da/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/da/LC_MESSAGES/bison-runtime.mo 0644 root root 1268 29332 1289359265
1 f none /usr/local/share/locale/da/LC_MESSAGES/bison.mo 0644 root root 8127 55512 1289359264
1 d none /usr/local/share/locale/de 0755 root root
1 d none /usr/local/share/locale/de/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/de/LC_MESSAGES/bison-runtime.mo 0644 root root 1347 37245 1289359265
1 f none /usr/local/share/locale/de/LC_MESSAGES/bison.mo 0644 root root 16146 53343 1289359264
1 d none /usr/local/share/locale/el 0755 root root
1 d none /usr/local/share/locale/el/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/el/LC_MESSAGES/bison-runtime.mo 0644 root root 1545 34557 1289359265
1 f none /usr/local/share/locale/el/LC_MESSAGES/bison.mo 0644 root root 20788 18302 1289359264
1 d none /usr/local/share/locale/es 0755 root root
1 d none /usr/local/share/locale/es/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/es/LC_MESSAGES/bison-runtime.mo 0644 root root 514 37517 1289359265
1 f none /usr/local/share/locale/es/LC_MESSAGES/bison.mo 0644 root root 9235 10157 1289359264
1 d none /usr/local/share/locale/et 0755 root root
1 d none /usr/local/share/locale/et/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/et/LC_MESSAGES/bison-runtime.mo 0644 root root 1248 28306 1289359265
1 f none /usr/local/share/locale/et/LC_MESSAGES/bison.mo 0644 root root 9555 44209 1289359264
1 d none /usr/local/share/locale/fi 0755 root root
1 d none /usr/local/share/locale/fi/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/fi/LC_MESSAGES/bison-runtime.mo 0644 root root 1303 33637 1289359265
1 f none /usr/local/share/locale/fi/LC_MESSAGES/bison.mo 0644 root root 20205 55814 1289359264
1 d none /usr/local/share/locale/fr 0755 root root
1 d none /usr/local/share/locale/fr/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/fr/LC_MESSAGES/bison-runtime.mo 0644 root root 1296 31123 1289359266
1 f none /usr/local/share/locale/fr/LC_MESSAGES/bison.mo 0644 root root 10105 27543 1289359265
1 d none /usr/local/share/locale/ga 0755 root root
1 d none /usr/local/share/locale/ga/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/ga/LC_MESSAGES/bison-runtime.mo 0644 root root 1324 38182 1289359266
1 f none /usr/local/share/locale/ga/LC_MESSAGES/bison.mo 0644 root root 16638 39010 1289359265
1 d none /usr/local/share/locale/hr 0755 root root
1 d none /usr/local/share/locale/hr/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/hr/LC_MESSAGES/bison-runtime.mo 0644 root root 529 39111 1289359266
1 f none /usr/local/share/locale/hr/LC_MESSAGES/bison.mo 0644 root root 3107 25069 1289359265
1 d none /usr/local/share/locale/id 0755 root root
1 d none /usr/local/share/locale/id/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/id/LC_MESSAGES/bison-runtime.mo 0644 root root 1393 40637 1289359266
1 f none /usr/local/share/locale/id/LC_MESSAGES/bison.mo 0644 root root 18890 28892 1289359265
1 d none /usr/local/share/locale/it 0755 root root
1 d none /usr/local/share/locale/it/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/it/LC_MESSAGES/bison-runtime.mo 0644 root root 1232 24584 1289359266
1 f none /usr/local/share/locale/it/LC_MESSAGES/bison.mo 0644 root root 8472 14522 1289359265
1 d none /usr/local/share/locale/ja 0755 root root
1 d none /usr/local/share/locale/ja/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/ja/LC_MESSAGES/bison-runtime.mo 0644 root root 1519 24924 1289359266
1 f none /usr/local/share/locale/ja/LC_MESSAGES/bison.mo 0644 root root 3300 56769 1289359265
1 d none /usr/local/share/locale/ky 0755 root root
1 d none /usr/local/share/locale/ky/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/ky/LC_MESSAGES/bison-runtime.mo 0644 root root 1582 37627 1289359266
1 d none /usr/local/share/locale/lt 0755 root root
1 d none /usr/local/share/locale/lt/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/lt/LC_MESSAGES/bison-runtime.mo 0644 root root 1407 41784 1289359266
1 d none /usr/local/share/locale/lv 0755 root root
1 d none /usr/local/share/locale/lv/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/lv/LC_MESSAGES/bison-runtime.mo 0644 root root 1437 46886 1289359266
1 d none /usr/local/share/locale/ms 0755 root root
1 d none /usr/local/share/locale/ms/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/ms/LC_MESSAGES/bison-runtime.mo 0644 root root 1362 37230 1289359266
1 f none /usr/local/share/locale/ms/LC_MESSAGES/bison.mo 0644 root root 15550 34340 1289359265
1 d none /usr/local/share/locale/nb 0755 root root
1 d none /usr/local/share/locale/nb/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/nb/LC_MESSAGES/bison-runtime.mo 0644 root root 1302 32751 1289359266
1 f none /usr/local/share/locale/nb/LC_MESSAGES/bison.mo 0644 root root 8233 63336 1289359265
1 d none /usr/local/share/locale/nl 0755 root root
1 d none /usr/local/share/locale/nl/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/nl/LC_MESSAGES/bison-runtime.mo 0644 root root 1275 29924 1289359266
1 f none /usr/local/share/locale/nl/LC_MESSAGES/bison.mo 0644 root root 18151 46361 1289359265
1 d none /usr/local/share/locale/pl 0755 root root
1 d none /usr/local/share/locale/pl/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/pl/LC_MESSAGES/bison-runtime.mo 0644 root root 1464 48875 1289359266
1 f none /usr/local/share/locale/pl/LC_MESSAGES/bison.mo 0644 root root 20108 15340 1289359265
1 d none /usr/local/share/locale/pt 0755 root root
1 d none /usr/local/share/locale/pt/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/pt/LC_MESSAGES/bison-runtime.mo 0644 root root 1363 38318 1289359266
1 f none /usr/local/share/locale/pt/LC_MESSAGES/bison.mo 0644 root root 2105 11177 1289359265
1 d none /usr/local/share/locale/pt_BR 0755 root root
1 d none /usr/local/share/locale/pt_BR/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/pt_BR/LC_MESSAGES/bison-runtime.mo 0644 root root 1284 31250 1289359266
1 f none /usr/local/share/locale/pt_BR/LC_MESSAGES/bison.mo 0644 root root 7962 46212 1289359265
1 d none /usr/local/share/locale/ro 0755 root root
1 d none /usr/local/share/locale/ro/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/ro/LC_MESSAGES/bison-runtime.mo 0644 root root 1366 36979 1289359266
1 f none /usr/local/share/locale/ro/LC_MESSAGES/bison.mo 0644 root root 8559 32088 1289359265
1 d none /usr/local/share/locale/ru 0755 root root
1 d none /usr/local/share/locale/ru/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/ru/LC_MESSAGES/bison-runtime.mo 0644 root root 1696 63513 1289359266
1 f none /usr/local/share/locale/ru/LC_MESSAGES/bison.mo 0644 root root 20467 16231 1289359265
1 d none /usr/local/share/locale/sl 0755 root root
1 d none /usr/local/share/locale/sl/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/sl/LC_MESSAGES/bison-runtime.mo 0644 root root 1513 51051 1289359266
1 d none /usr/local/share/locale/sv 0755 root root
1 d none /usr/local/share/locale/sv/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/sv/LC_MESSAGES/bison-runtime.mo 0644 root root 1241 27890 1289359266
1 f none /usr/local/share/locale/sv/LC_MESSAGES/bison.mo 0644 root root 18803 47793 1289359265
1 d none /usr/local/share/locale/th 0755 root root
1 d none /usr/local/share/locale/th/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/th/LC_MESSAGES/bison-runtime.mo 0644 root root 1936 41822 1289359266
1 d none /usr/local/share/locale/tr 0755 root root
1 d none /usr/local/share/locale/tr/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/tr/LC_MESSAGES/bison-runtime.mo 0644 root root 509 38070 1289359266
1 f none /usr/local/share/locale/tr/LC_MESSAGES/bison.mo 0644 root root 8286 34615 1289359265
1 d none /usr/local/share/locale/uk 0755 root root
1 d none /usr/local/share/locale/uk/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/uk/LC_MESSAGES/bison-runtime.mo 0644 root root 1781 65179 1289359266
1 f none /usr/local/share/locale/uk/LC_MESSAGES/bison.mo 0644 root root 12550 87 1289359265
1 d none /usr/local/share/locale/vi 0755 root root
1 d none /usr/local/share/locale/vi/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/vi/LC_MESSAGES/bison-runtime.mo 0644 root root 1425 56112 1289359266
1 f none /usr/local/share/locale/vi/LC_MESSAGES/bison.mo 0644 root root 21168 4540 1289359265
1 d none /usr/local/share/locale/zh_CN 0755 root root
1 d none /usr/local/share/locale/zh_CN/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/zh_CN/LC_MESSAGES/bison-runtime.mo 0644 root root 1223 46655 1289359266
1 d none /usr/local/share/locale/zh_TW 0755 root root
1 d none /usr/local/share/locale/zh_TW/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/zh_TW/LC_MESSAGES/bison-runtime.mo 0644 root root 1294 55701 1289359266
1 f none /usr/local/share/locale/zh_TW/LC_MESSAGES/bison.mo 0644 root root 9276 23864 1289359265
1 d none /usr/local/share/man 0755 root root
1 d none /usr/local/share/man/man1 0755 root root
1 f none /usr/local/share/man/man1/bison.1 0644 root root 4615 3426 1289359269
1 f none /usr/local/share/man/man1/yacc.1 0644 root root 1021 18348 1289359269
1 i checkinstall 785 2565 1289359271
1 i pkginfo 271 21095 1289359272
07070100000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000b00000000TRAILER!!! 070701000541bb000081a40000000000000000000000014cda0fa80000010f0000010000010006ffffffffffffffff0000000800000000pkginfo PKG=bison
NAME=bison 2.4.2 SPARC 64bit Solaris 10
VERSION=2.4.2
PSTAMP=10th November 2010
VENDOR=GNU
EMAIL=http://www.gnu.org/software/bison/
DESC=GNU general purpose parser generator
ARCH=sparc
CATEGORY=utility
CLASSES=none
BASEDIR=/
ISTATES=S s 1 2 3
RSTATES=S s 1 2 3
070701000541ba000081a40000000000000000000000014cda0fa800002f7e0000010000010006ffffffffffffffff0000000700000000pkgmap : 1 7428
1 d none /usr ? ? ?
1 d none /usr/local ? ? ?
1 d none /usr/local/bin 0755 root root
1 f none /usr/local/bin/bison 0755 root root 1840624 4239 1289359269
1 f none /usr/local/bin/yacc 0755 root root 47 3584 1289359269
1 d none /usr/local/lib 0755 root root
1 f none /usr/local/lib/charset.alias 0644 root root 665 47103 1289359268
1 f none /usr/local/lib/liby.a 0644 root root 9320 32565 1289359268
1 d none /usr/local/share 0755 root root
1 d none /usr/local/share/aclocal 0755 root root
1 f none /usr/local/share/aclocal/bison-i18n.m4 0644 root root 1922 24369 1289359271
1 d none /usr/local/share/bison 0755 root root
1 f none /usr/local/share/bison/README 0644 root root 2019 44890 1289359268
1 f none /usr/local/share/bison/bison.m4 0644 root root 20837 12133 1289359268
1 f none /usr/local/share/bison/c++-skel.m4 0644 root root 1149 29943 1289359268
1 f none /usr/local/share/bison/c++.m4 0644 root root 6014 27562 1289359268
1 f none /usr/local/share/bison/c-skel.m4 0644 root root 1143 29500 1289359268
1 f none /usr/local/share/bison/c.m4 0644 root root 12909 48577 1289359268
1 f none /usr/local/share/bison/glr.c 0644 root root 75659 15650 1289359268
1 f none /usr/local/share/bison/glr.cc 0644 root root 10632 29309 1289359268
1 f none /usr/local/share/bison/java-skel.m4 0644 root root 1150 30545 1289359268
1 f none /usr/local/share/bison/java.m4 0644 root root 8146 50425 1289359268
1 f none /usr/local/share/bison/lalr1.cc 0644 root root 30608 30510 1289359268
1 f none /usr/local/share/bison/lalr1.java 0644 root root 26509 52576 1289359268
1 f none /usr/local/share/bison/location.cc 0644 root root 6890 31632 1289359268
1 d none /usr/local/share/bison/m4sugar 0755 root root
1 f none /usr/local/share/bison/m4sugar/foreach.m4 0644 root root 17542 24644 1289359268
1 f none /usr/local/share/bison/m4sugar/m4sugar.m4 0644 root root 98348 49352 1289359268
1 d none /usr/local/share/bison/xslt 0755 root root
1 f none /usr/local/share/bison/xslt/bison.xsl 0644 root root 2966 47966 1289359268
1 f none /usr/local/share/bison/xslt/xml2dot.xsl 0644 root root 6419 9159 1289359268
1 f none /usr/local/share/bison/xslt/xml2text.xsl 0644 root root 18965 52686 1289359268
1 f none /usr/local/share/bison/xslt/xml2xhtml.xsl 0644 root root 22283 42381 1289359268
1 f none /usr/local/share/bison/yacc.c 0644 root root 50190 43932 1289359268
1 d none /usr/local/share/info 0755 root root
1 f none /usr/local/share/info/bison.info 0644 root root 464577 28585 1289359269
1 d none /usr/local/share/locale 0755 root root
1 d none /usr/local/share/locale/ast 0755 root root
1 d none /usr/local/share/locale/ast/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/ast/LC_MESSAGES/bison-runtime.mo 0644 root root 1315 33416 1289359265
1 d none /usr/local/share/locale/da 0755 root root
1 d none /usr/local/share/locale/da/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/da/LC_MESSAGES/bison-runtime.mo 0644 root root 1268 29332 1289359265
1 f none /usr/local/share/locale/da/LC_MESSAGES/bison.mo 0644 root root 8127 55512 1289359264
1 d none /usr/local/share/locale/de 0755 root root
1 d none /usr/local/share/locale/de/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/de/LC_MESSAGES/bison-runtime.mo 0644 root root 1347 37245 1289359265
1 f none /usr/local/share/locale/de/LC_MESSAGES/bison.mo 0644 root root 16146 53343 1289359264
1 d none /usr/local/share/locale/el 0755 root root
1 d none /usr/local/share/locale/el/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/el/LC_MESSAGES/bison-runtime.mo 0644 root root 1545 34557 1289359265
1 f none /usr/local/share/locale/el/LC_MESSAGES/bison.mo 0644 root root 20788 18302 1289359264
1 d none /usr/local/share/locale/es 0755 root root
1 d none /usr/local/share/locale/es/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/es/LC_MESSAGES/bison-runtime.mo 0644 root root 514 37517 1289359265
1 f none /usr/local/share/locale/es/LC_MESSAGES/bison.mo 0644 root root 9235 10157 1289359264
1 d none /usr/local/share/locale/et 0755 root root
1 d none /usr/local/share/locale/et/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/et/LC_MESSAGES/bison-runtime.mo 0644 root root 1248 28306 1289359265
1 f none /usr/local/share/locale/et/LC_MESSAGES/bison.mo 0644 root root 9555 44209 1289359264
1 d none /usr/local/share/locale/fi 0755 root root
1 d none /usr/local/share/locale/fi/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/fi/LC_MESSAGES/bison-runtime.mo 0644 root root 1303 33637 1289359265
1 f none /usr/local/share/locale/fi/LC_MESSAGES/bison.mo 0644 root root 20205 55814 1289359264
1 d none /usr/local/share/locale/fr 0755 root root
1 d none /usr/local/share/locale/fr/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/fr/LC_MESSAGES/bison-runtime.mo 0644 root root 1296 31123 1289359266
1 f none /usr/local/share/locale/fr/LC_MESSAGES/bison.mo 0644 root root 10105 27543 1289359265
1 d none /usr/local/share/locale/ga 0755 root root
1 d none /usr/local/share/locale/ga/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/ga/LC_MESSAGES/bison-runtime.mo 0644 root root 1324 38182 1289359266
1 f none /usr/local/share/locale/ga/LC_MESSAGES/bison.mo 0644 root root 16638 39010 1289359265
1 d none /usr/local/share/locale/hr 0755 root root
1 d none /usr/local/share/locale/hr/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/hr/LC_MESSAGES/bison-runtime.mo 0644 root root 529 39111 1289359266
1 f none /usr/local/share/locale/hr/LC_MESSAGES/bison.mo 0644 root root 3107 25069 1289359265
1 d none /usr/local/share/locale/id 0755 root root
1 d none /usr/local/share/locale/id/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/id/LC_MESSAGES/bison-runtime.mo 0644 root root 1393 40637 1289359266
1 f none /usr/local/share/locale/id/LC_MESSAGES/bison.mo 0644 root root 18890 28892 1289359265
1 d none /usr/local/share/locale/it 0755 root root
1 d none /usr/local/share/locale/it/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/it/LC_MESSAGES/bison-runtime.mo 0644 root root 1232 24584 1289359266
1 f none /usr/local/share/locale/it/LC_MESSAGES/bison.mo 0644 root root 8472 14522 1289359265
1 d none /usr/local/share/locale/ja 0755 root root
1 d none /usr/local/share/locale/ja/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/ja/LC_MESSAGES/bison-runtime.mo 0644 root root 1519 24924 1289359266
1 f none /usr/local/share/locale/ja/LC_MESSAGES/bison.mo 0644 root root 3300 56769 1289359265
1 d none /usr/local/share/locale/ky 0755 root root
1 d none /usr/local/share/locale/ky/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/ky/LC_MESSAGES/bison-runtime.mo 0644 root root 1582 37627 1289359266
1 d none /usr/local/share/locale/lt 0755 root root
1 d none /usr/local/share/locale/lt/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/lt/LC_MESSAGES/bison-runtime.mo 0644 root root 1407 41784 1289359266
1 d none /usr/local/share/locale/lv 0755 root root
1 d none /usr/local/share/locale/lv/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/lv/LC_MESSAGES/bison-runtime.mo 0644 root root 1437 46886 1289359266
1 d none /usr/local/share/locale/ms 0755 root root
1 d none /usr/local/share/locale/ms/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/ms/LC_MESSAGES/bison-runtime.mo 0644 root root 1362 37230 1289359266
1 f none /usr/local/share/locale/ms/LC_MESSAGES/bison.mo 0644 root root 15550 34340 1289359265
1 d none /usr/local/share/locale/nb 0755 root root
1 d none /usr/local/share/locale/nb/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/nb/LC_MESSAGES/bison-runtime.mo 0644 root root 1302 32751 1289359266
1 f none /usr/local/share/locale/nb/LC_MESSAGES/bison.mo 0644 root root 8233 63336 1289359265
1 d none /usr/local/share/locale/nl 0755 root root
1 d none /usr/local/share/locale/nl/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/nl/LC_MESSAGES/bison-runtime.mo 0644 root root 1275 29924 1289359266
1 f none /usr/local/share/locale/nl/LC_MESSAGES/bison.mo 0644 root root 18151 46361 1289359265
1 d none /usr/local/share/locale/pl 0755 root root
1 d none /usr/local/share/locale/pl/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/pl/LC_MESSAGES/bison-runtime.mo 0644 root root 1464 48875 1289359266
1 f none /usr/local/share/locale/pl/LC_MESSAGES/bison.mo 0644 root root 20108 15340 1289359265
1 d none /usr/local/share/locale/pt 0755 root root
1 d none /usr/local/share/locale/pt/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/pt/LC_MESSAGES/bison-runtime.mo 0644 root root 1363 38318 1289359266
1 f none /usr/local/share/locale/pt/LC_MESSAGES/bison.mo 0644 root root 2105 11177 1289359265
1 d none /usr/local/share/locale/pt_BR 0755 root root
1 d none /usr/local/share/locale/pt_BR/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/pt_BR/LC_MESSAGES/bison-runtime.mo 0644 root root 1284 31250 1289359266
1 f none /usr/local/share/locale/pt_BR/LC_MESSAGES/bison.mo 0644 root root 7962 46212 1289359265
1 d none /usr/local/share/locale/ro 0755 root root
1 d none /usr/local/share/locale/ro/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/ro/LC_MESSAGES/bison-runtime.mo 0644 root root 1366 36979 1289359266
1 f none /usr/local/share/locale/ro/LC_MESSAGES/bison.mo 0644 root root 8559 32088 1289359265
1 d none /usr/local/share/locale/ru 0755 root root
1 d none /usr/local/share/locale/ru/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/ru/LC_MESSAGES/bison-runtime.mo 0644 root root 1696 63513 1289359266
1 f none /usr/local/share/locale/ru/LC_MESSAGES/bison.mo 0644 root root 20467 16231 1289359265
1 d none /usr/local/share/locale/sl 0755 root root
1 d none /usr/local/share/locale/sl/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/sl/LC_MESSAGES/bison-runtime.mo 0644 root root 1513 51051 1289359266
1 d none /usr/local/share/locale/sv 0755 root root
1 d none /usr/local/share/locale/sv/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/sv/LC_MESSAGES/bison-runtime.mo 0644 root root 1241 27890 1289359266
1 f none /usr/local/share/locale/sv/LC_MESSAGES/bison.mo 0644 root root 18803 47793 1289359265
1 d none /usr/local/share/locale/th 0755 root root
1 d none /usr/local/share/locale/th/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/th/LC_MESSAGES/bison-runtime.mo 0644 root root 1936 41822 1289359266
1 d none /usr/local/share/locale/tr 0755 root root
1 d none /usr/local/share/locale/tr/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/tr/LC_MESSAGES/bison-runtime.mo 0644 root root 509 38070 1289359266
1 f none /usr/local/share/locale/tr/LC_MESSAGES/bison.mo 0644 root root 8286 34615 1289359265
1 d none /usr/local/share/locale/uk 0755 root root
1 d none /usr/local/share/locale/uk/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/uk/LC_MESSAGES/bison-runtime.mo 0644 root root 1781 65179 1289359266
1 f none /usr/local/share/locale/uk/LC_MESSAGES/bison.mo 0644 root root 12550 87 1289359265
1 d none /usr/local/share/locale/vi 0755 root root
1 d none /usr/local/share/locale/vi/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/vi/LC_MESSAGES/bison-runtime.mo 0644 root root 1425 56112 1289359266
1 f none /usr/local/share/locale/vi/LC_MESSAGES/bison.mo 0644 root root 21168 4540 1289359265
1 d none /usr/local/share/locale/zh_CN 0755 root root
1 d none /usr/local/share/locale/zh_CN/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/zh_CN/LC_MESSAGES/bison-runtime.mo 0644 root root 1223 46655 1289359266
1 d none /usr/local/share/locale/zh_TW 0755 root root
1 d none /usr/local/share/locale/zh_TW/LC_MESSAGES 0755 root root
1 f none /usr/local/share/locale/zh_TW/LC_MESSAGES/bison-runtime.mo 0644 root root 1294 55701 1289359266
1 f none /usr/local/share/locale/zh_TW/LC_MESSAGES/bison.mo 0644 root root 9276 23864 1289359265
1 d none /usr/local/share/man 0755 root root
1 d none /usr/local/share/man/man1 0755 root root
1 f none /usr/local/share/man/man1/bison.1 0644 root root 4615 3426 1289359269
1 f none /usr/local/share/man/man1/yacc.1 0644 root root 1021 18348 1289359269
1 i checkinstall 785 2565 1289359271
1 i pkginfo 271 21095 1289359272
0707010005425f000041ed0000000000000000000000024cda0fa8000000000000010000010006ffffffffffffffff0000000800000000install 07070100054260000081ed0000000000000000000000014cda0fa7000003110000010000010006ffffffffffffffff0000001500000000install/checkinstall #!/bin/sh
#
expected_bits="64"
expected_release="5.10"
expected_platform="sparc"
#
release=`uname -r`
platform=`uname -p`
bits=`isainfo -b`
#
if [ ${platform} != ${expected_platform} ]; then
echo "\n\n\n\tThis package must be installed on a ${expected_platform} architecture\n"
echo "\tAborting installation.\n\n\n"
exit 1
fi
if [ ${release} != ${expected_release} ]; then
echo "\n\n\n\tThis package must be installed on a ${expected_release} machine\n"
echo "\tAborting installation.\n\n\n"
exit 1
fi
if [ ${bits} != ${expected_bits} ]; then
echo "\n\n\n\tThis package must be installed on a ${expected_bits} bit machine\n"
echo "\tYour machine is running a ${bits} bit O.S. currently\n"
echo "\tAborting installation.\n\n\n"
exit 1
fi
exit 0
070701000541bc000041ed0000000000000000000000034cda0fa8000000000000010000010006ffffffffffffffff0000000500000000root 070701000541bd000041ed0000000000000000000000034cda0fa8000000000000010000010006ffffffffffffffff0000000900000000root/usr 070701000541be000041ed0000000000000000000000054cda0fa8000000000000010000010006ffffffffffffffff0000000f00000000root/usr/local 070701000541c5000041ed0000000000000000000000074cda0fa8000000000000010000010006ffffffffffffffff0000001500000000root/usr/local/share 070701000541c8000041ed0000000000000000000000044cda0fa8000000000000010000010006ffffffffffffffff0000001b00000000root/usr/local/share/bison 070701000541cb000081a40000000000000000000000014cda0fa40000047d0000010000010006ffffffffffffffff0000002700000000root/usr/local/share/bison/c++-skel.m4 -*- Autoconf -*-
# C++ skeleton dispatching for Bison.
# Copyright (C) 2006-2007, 2009-2010 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 3 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, see .
b4_glr_if( [m4_define([b4_used_skeleton], [b4_pkgdatadir/[glr.cc]])])
b4_nondeterministic_if([m4_define([b4_used_skeleton], [b4_pkgdatadir/[glr.cc]])])
m4_define_default([b4_used_skeleton], [b4_pkgdatadir/[lalr1.cc]])
m4_define_default([b4_skeleton], ["b4_basename(b4_used_skeleton)"])
m4_include(b4_used_skeleton)
070701000541d2000081a40000000000000000000000014cda0fa400001fd20000010000010006ffffffffffffffff0000002300000000root/usr/local/share/bison/java.m4 -*- Autoconf -*-
# Java language support for Bison
# Copyright (C) 2007-2010 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 3 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, see .
# b4_comment(TEXT)
# ----------------
m4_define([b4_comment], [/* m4_bpatsubst([$1], [
], [
]) */])
# b4_list2(LIST1, LIST2)
# --------------------------
# Join two lists with a comma if necessary.
m4_define([b4_list2],
[$1[]m4_ifval(m4_quote($1), [m4_ifval(m4_quote($2), [[, ]])])[]$2])
# b4_percent_define_get3(DEF, PRE, POST, NOT)
# -------------------------------------------
# Expand to the value of DEF surrounded by PRE and POST if it's %define'ed,
# otherwise NOT.
m4_define([b4_percent_define_get3],
[m4_ifval(m4_quote(b4_percent_define_get([$1])),
[$2[]b4_percent_define_get([$1])[]$3], [$4])])
# b4_flag_value(BOOLEAN-FLAG)
# ---------------------------
m4_define([b4_flag_value], [b4_flag_if([$1], [true], [false])])
# b4_public_if(TRUE, FALSE)
# -------------------------
b4_percent_define_default([[public]], [[false]])
m4_define([b4_public_if],
[b4_percent_define_flag_if([public], [$1], [$2])])
# b4_abstract_if(TRUE, FALSE)
# ---------------------------
b4_percent_define_default([[abstract]], [[false]])
m4_define([b4_abstract_if],
[b4_percent_define_flag_if([abstract], [$1], [$2])])
# b4_final_if(TRUE, FALSE)
# ---------------------------
b4_percent_define_default([[final]], [[false]])
m4_define([b4_final_if],
[b4_percent_define_flag_if([final], [$1], [$2])])
# b4_strictfp_if(TRUE, FALSE)
# ---------------------------
b4_percent_define_default([[strictfp]], [[false]])
m4_define([b4_strictfp_if],
[b4_percent_define_flag_if([strictfp], [$1], [$2])])
# b4_lexer_if(TRUE, FALSE)
# ------------------------
m4_define([b4_lexer_if],
[b4_percent_code_ifdef([[lexer]], [$1], [$2])])
# b4_identification
# -----------------
m4_define([b4_identification],
[ /** Version number for the Bison executable that generated this parser. */
public static final String bisonVersion = "b4_version";
/** Name of the skeleton that generated this parser. */
public static final String bisonSkeleton = b4_skeleton;
])
## ------------ ##
## Data types. ##
## ------------ ##
# 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($@, [-128], [127]), [1], [byte],
b4_ints_in($@, [-32768], [32767]), [1], [short],
[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)])
# b4_null
# -------
m4_define([b4_null], [null])
## ------------------------- ##
## Assigning token numbers. ##
## ------------------------- ##
# b4_token_enum(TOKEN-NAME, TOKEN-NUMBER)
# ---------------------------------------
# Output the definition of this token as an enum.
m4_define([b4_token_enum],
[ /** Token number, to be returned by the scanner. */
public static final int $1 = $2;
])
# b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
# -----------------------------------------------------
# Output the definition of the tokens (if there are) as enums.
m4_define([b4_token_enums],
[m4_if([$#$1], [1], [],
[/* Tokens. */
m4_map([b4_token_enum], [$@])])
])
# b4-case(ID, CODE)
# -----------------
# We need to fool Java's stupid unreachable code detection.
m4_define([b4_case], [ case $1:
if (yyn == $1)
$2;
break;
])
## ---------------- ##
## Default values. ##
## ---------------- ##
m4_define([b4_yystype], [b4_percent_define_get([[stype]])])
b4_percent_define_default([[stype]], [[Object]])])
# %name-prefix
m4_define_default([b4_prefix], [[YY]])
b4_percent_define_default([[parser_class_name]], [b4_prefix[]Parser])])
m4_define([b4_parser_class_name], [b4_percent_define_get([[parser_class_name]])])
b4_percent_define_default([[lex_throws]], [[java.io.IOException]])])
m4_define([b4_lex_throws], [b4_percent_define_get([[lex_throws]])])
b4_percent_define_default([[throws]], [])])
m4_define([b4_throws], [b4_percent_define_get([[throws]])])
b4_percent_define_default([[location_type]], [Location])])
m4_define([b4_location_type], [b4_percent_define_get([[location_type]])])
b4_percent_define_default([[position_type]], [Position])])
m4_define([b4_position_type], [b4_percent_define_get([[position_type]])])
## ----------------- ##
## Semantic Values. ##
## ----------------- ##
# b4_lhs_value([TYPE])
# --------------------
# Expansion of $$.
m4_define([b4_lhs_value], [yyval])
# b4_rhs_value(RULE-LENGTH, NUM, [TYPE])
# --------------------------------------
# Expansion of $NUM, where the current rule has RULE-LENGTH
# symbols on RHS.
#
# In this simple implementation, %token and %type have class names
# between the angle brackets.
m4_define([b4_rhs_value],
[(m4_ifval($3, [($3)])[](yystack.valueAt ($1-($2))))])
# 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],
[yystack.locationAt ($1-($2))])
# b4_lex_param
# b4_parse_param
# --------------
# If defined, b4_lex_param arrives double quoted, but below we prefer
# it to be single quoted. Same for b4_parse_param.
# TODO: should be in bison.m4
m4_define_default([b4_lex_param], [[]]))
m4_define([b4_lex_param], b4_lex_param))
m4_define([b4_parse_param], b4_parse_param))
# b4_lex_param_decl
# -------------------
# Extra formal arguments of the constructor.
m4_define([b4_lex_param_decl],
[m4_ifset([b4_lex_param],
[b4_remove_comma([$1],
b4_param_decls(b4_lex_param))],
[$1])])
m4_define([b4_param_decls],
[m4_map([b4_param_decl], [$@])])
m4_define([b4_param_decl], [, $1])
m4_define([b4_remove_comma], [m4_ifval(m4_quote($1), [$1, ], [])m4_shift2($@)])
# b4_parse_param_decl
# -------------------
# Extra formal arguments of the constructor.
m4_define([b4_parse_param_decl],
[m4_ifset([b4_parse_param],
[b4_remove_comma([$1],
b4_param_decls(b4_parse_param))],
[$1])])
# b4_lex_param_call
# -------------------
# Delegating the lexer parameters to the lexer constructor.
m4_define([b4_lex_param_call],
[m4_ifset([b4_lex_param],
[b4_remove_comma([$1],
b4_param_calls(b4_lex_param))],
[$1])])
m4_define([b4_param_calls],
[m4_map([b4_param_call], [$@])])
m4_define([b4_param_call], [, $2])
# b4_parse_param_cons
# -------------------
# Extra initialisations of the constructor.
m4_define([b4_parse_param_cons],
[m4_ifset([b4_parse_param],
[b4_constructor_calls(b4_parse_param)])])
m4_define([b4_constructor_calls],
[m4_map([b4_constructor_call], [$@])])
m4_define([b4_constructor_call],
[this.$2 = $2;
])
# b4_parse_param_vars
# -------------------
# Extra instance variables.
m4_define([b4_parse_param_vars],
[m4_ifset([b4_parse_param],
[
/* User arguments. */
b4_var_decls(b4_parse_param)])])
m4_define([b4_var_decls],
[m4_map_sep([b4_var_decl], [
], [$@])])
m4_define([b4_var_decl],
[ protected final $1;])
# b4_maybe_throws(THROWS)
# -----------------------
# Expand to either an empty string or "throws THROWS".
m4_define([b4_maybe_throws],
[m4_ifval($1, [throws $1])])
070701000541cc000081a40000000000000000000000014cda0fa40000177e0000010000010006ffffffffffffffff0000002200000000root/usr/local/share/bison/c++.m4 -*- Autoconf -*-
# C++ skeleton for Bison
# Copyright (C) 2002-2010 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 3 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, see .
m4_include(b4_pkgdatadir/[c.m4])
## ---------------- ##
## Default values. ##
## ---------------- ##
# Default parser class name.
b4_percent_define_default([[parser_class_name]], [[parser]])
b4_percent_define_default([[location_type]], [[location]])
b4_percent_define_default([[filename_type]], [[std::string]])
b4_percent_define_default([[namespace]], m4_defn([b4_prefix]))
b4_percent_define_default([[global_tokens_and_yystype]], [[false]])
b4_percent_define_default([[define_location_comparison]],
[m4_if(b4_percent_define_get([[filename_type]]),
[std::string], [[true]], [[false]])])
## ----------- ##
## Namespace. ##
## ----------- ##
m4_define([b4_namespace_ref], [b4_percent_define_get([[namespace]])])
# Don't permit an empty b4_namespace_ref. Any `::parser::foo' appended to it
# would compile as an absolute reference with `parser' in the global namespace.
# b4_namespace_open would open an anonymous namespace and thus establish
# internal linkage. This would compile. However, it's cryptic, and internal
# linkage for the parser would be specified in all translation units that
# include the header, which is always generated. If we ever need to permit
# internal linkage somehow, surely we can find a cleaner approach.
m4_if(m4_bregexp(b4_namespace_ref, [^[ ]*$]), [-1], [],
[b4_complain_at(b4_percent_define_get_loc([[namespace]]),
[[namespace reference is empty]])])
# Instead of assuming the C++ compiler will do it, Bison should reject any
# invalid b4_namepsace_ref that would be converted to a valid
# b4_namespace_open. The problem is that Bison doesn't always output
# b4_namespace_ref to uncommented code but should reserve the ability to do so
# in future releases without risking breaking any existing user grammars.
# Specifically, don't allow empty names as b4_namespace_open would just convert
# those into anonymous namespaces, and that might tempt some users.
m4_if(m4_bregexp(b4_namespace_ref, [::[ ]*::]), [-1], [],
[b4_complain_at(b4_percent_define_get_loc([[namespace]]),
[[namespace reference has consecutive "::"]])])
m4_if(m4_bregexp(b4_namespace_ref, [::[ ]*$]), [-1], [],
[b4_complain_at(b4_percent_define_get_loc([[namespace]]),
[[namespace reference has a trailing "::"]])])
m4_define([b4_namespace_open],
[b4_user_code([b4_percent_define_get_syncline([[namespace]])
[namespace ]m4_bpatsubst(m4_dquote(m4_bpatsubst(m4_dquote(b4_namespace_ref),
[^\(.\)[ ]*::], [\1])),
[::], [ { namespace ])[ {]])])
m4_define([b4_namespace_close],
[b4_user_code([b4_percent_define_get_syncline([[namespace]])
m4_bpatsubst(m4_dquote(m4_bpatsubst(m4_dquote(b4_namespace_ref[ ]),
[^\(.\)[ ]*\(::\)?\([^][:]\|:[^][:]\)*],
[\1])),
[::\([^][:]\|:[^][:]\)*], [} ])[} // ]b4_namespace_ref])])
# b4_token_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
# -----------------------------------------------------
# Output the definition of the tokens as enums.
m4_define([b4_token_enums],
[/* Tokens. */
enum yytokentype {
m4_map_sep([ b4_token_enum], [,
],
[$@])
};
])
## ----------------- ##
## 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],
[(yysemantic_stack_@{($1) - ($2)@}m4_ifval([$3], [.$3]))])
# 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],
[(yylocation_stack_@{($1) - ($2)@})])
# b4_parse_param_decl
# -------------------
# Extra formal arguments of the constructor.
# Change the parameter names from "foo" into "foo_yyarg", so that
# there is no collision bw the user chosen attribute name, and the
# argument name in the constructor.
m4_define([b4_parse_param_decl],
[m4_ifset([b4_parse_param],
[m4_map_sep([b4_parse_param_decl_1], [, ], [b4_parse_param])])])
m4_define([b4_parse_param_decl_1],
[$1_yyarg])
# b4_parse_param_cons
# -------------------
# Extra initialisations of the constructor.
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_yyarg)])
# 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;])
070701000541d9000041ed0000000000000000000000024cda0fa8000000000000010000010006ffffffffffffffff0000002000000000root/usr/local/share/bison/xslt 070701000541dd000081a40000000000000000000000014cda0fa40000570b0000010000010006ffffffffffffffff0000002e00000000root/usr/local/share/bison/xslt/xml2xhtml.xsl
- GNU Bison XML Automaton Report
GNU Bison XML Automaton Report
input grammar:
Table of Contents
Reductions
Nonterminals useless in grammar
Terminals unused in grammar
Rules useless in grammar
Rules useless in parser due to conflicts
Grammar
Conflicts
conflicts:
Terminals, with rules where they appear
Nonterminals, with rules where they appear
on left:
on right:
Automaton
state
→
.
.
ε
[
]
,
error
(
)
[
accept
(
)
]
Conflict between
and token
resolved as
an
(
).
0
070701000541dc000081a40000000000000000000000014cda0fa400004a150000010000010006ffffffffffffffff0000002d00000000root/usr/local/share/bison/xslt/xml2text.xsl
Nonterminals useless in grammar
Terminals unused in grammar
Rules useless in grammar
Rules useless in parser due to conflicts
Grammar
Terminals, with rules where they appear
Nonterminals, with rules where they appear
0
on@left:
,
on@right:
state
:
.
.
/* empty */
[
]
,
shift, and go to state
go to state
error
(
)
[
accept
reduce using rule
(
)
]
Conflict between rule
and token
resolved as
an
(
).
0
070701000541da000081a40000000000000000000000014cda0fa400000b960000010000010006ffffffffffffffff0000002a00000000root/usr/local/share/bison/xslt/bison.xsl
s
r
,
070701000541db000081a40000000000000000000000014cda0fa4000019130000010000010006ffffffffffffffff0000002c00000000root/usr/local/share/bison/xslt/xml2dot.xsl
digraph Automaton {
}
->
.
.
[
]
,
dotted
solid
dashed
[label="
"]
->
[style=
label="
"
]
070701000541cd000081a40000000000000000000000014cda0fa4000004770000010000010006ffffffffffffffff0000002500000000root/usr/local/share/bison/c-skel.m4 -*- Autoconf -*-
# C skeleton dispatching for Bison.
# Copyright (C) 2006-2007, 2009-2010 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 3 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, see .
b4_glr_if( [m4_define([b4_used_skeleton], [b4_pkgdatadir/[glr.c]])])
b4_nondeterministic_if([m4_define([b4_used_skeleton], [b4_pkgdatadir/[glr.c]])])
m4_define_default([b4_used_skeleton], [b4_pkgdatadir/[yacc.c]])
m4_define_default([b4_skeleton], ["b4_basename(b4_used_skeleton)"])
m4_include(b4_used_skeleton)
070701000541d3000081a40000000000000000000000014cda0fa4000077900000010000010006ffffffffffffffff0000002400000000root/usr/local/share/bison/lalr1.cc # C++ skeleton for Bison
# Copyright (C) 2002-2010 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 3 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, see .
m4_include(b4_pkgdatadir/[c++.m4])
m4_define([b4_parser_class_name],
[b4_percent_define_get([[parser_class_name]])])
# The header is mandatory.
b4_defines_if([],
[b4_fatal([b4_skeleton[: using %%defines is mandatory]])])
# Backward compatibility.
m4_define([b4_location_constructors])
m4_include(b4_pkgdatadir/[location.cc])
# We do want M4 expansion after # for CPP macros.
m4_changecom()
m4_divert_push(0)dnl
b4_defines_if(
[@output(b4_spec_defines_file@)@
b4_copyright([Skeleton interface for Bison LALR(1) parsers in C++],
[2002-2010])
dnl FIXME: This is wrong, we want computed header guards.
[
/* C++ LALR(1) parser skeleton written by Akim Demaille. */
#ifndef PARSER_HEADER_H
# define PARSER_HEADER_H
]b4_percent_code_get([[requires]])[
#include
#include
#include "stack.hh"
]b4_namespace_open[
class position;
class location;
]b4_namespace_close[
#include "location.hh"
/* Enabling traces. */
#ifndef YYDEBUG
# define YYDEBUG ]b4_debug_flag[
#endif
/* Enabling verbose error messages. */
#ifdef YYERROR_VERBOSE
# undef YYERROR_VERBOSE
# define YYERROR_VERBOSE 1
#else
# define YYERROR_VERBOSE ]b4_error_verbose_flag[
#endif
/* Enabling the token table. */
#ifndef YYTOKEN_TABLE
# define YYTOKEN_TABLE ]b4_token_table[
#endif
/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
If N is 0, then set CURRENT to the empty location which ends
the previous symbol: RHS[0] (always defined). */
#ifndef YYLLOC_DEFAULT
# define YYLLOC_DEFAULT(Current, Rhs, N) \
do { \
if (N) \
{ \
(Current).begin = (Rhs)[1].begin; \
(Current).end = (Rhs)[N].end; \
} \
else \
{ \
(Current).begin = (Current).end = (Rhs)[0].end; \
} \
} while (false)
#endif
]b4_namespace_open[
/// A Bison parser.
class ]b4_parser_class_name[
{
public:
/// Symbol semantic values.
#ifndef YYSTYPE
]m4_ifdef([b4_stype],
[ union semantic_type
{
b4_user_stype
};],
[m4_if(b4_tag_seen_flag, 0,
[[ typedef int semantic_type;]],
[[ typedef YYSTYPE semantic_type;]])])[
#else
typedef YYSTYPE semantic_type;
#endif
/// Symbol locations.
typedef ]b4_percent_define_get([[location_type]])[ location_type;
/// Tokens.
struct token
{
]b4_token_enums(b4_tokens)[
};
/// Token type.
typedef token::yytokentype token_type;
/// Build a parser object.
]b4_parser_class_name[ (]b4_parse_param_decl[);
virtual ~]b4_parser_class_name[ ();
/// Parse.
/// \returns 0 iff parsing succeeded.
virtual int parse ();
#if YYDEBUG
/// The current debugging stream.
std::ostream& debug_stream () const;
/// Set the current debugging stream.
void set_debug_stream (std::ostream &);
/// Type for debugging levels.
typedef int debug_level_type;
/// The current debugging level.
debug_level_type debug_level () const;
/// Set the current debugging level.
void set_debug_level (debug_level_type l);
#endif
private:
/// Report a syntax error.
/// \param loc where the syntax error is found.
/// \param msg a description of the syntax error.
virtual void error (const location_type& loc, const std::string& msg);
/// Generate an error message.
/// \param state the state where the error occurred.
/// \param tok the lookahead token.
virtual std::string yysyntax_error_ (int yystate]dnl
b4_error_verbose_if([, int tok])[);
#if YYDEBUG
/// \brief Report a symbol value on the debug stream.
/// \param yytype The token type.
/// \param yyvaluep Its semantic value.
/// \param yylocationp Its location.
virtual void yy_symbol_value_print_ (int yytype,
const semantic_type* yyvaluep,
const location_type* yylocationp);
/// \brief Report a symbol on the debug stream.
/// \param yytype The token type.
/// \param yyvaluep Its semantic value.
/// \param yylocationp Its location.
virtual void yy_symbol_print_ (int yytype,
const semantic_type* yyvaluep,
const location_type* yylocationp);
#endif
/// State numbers.
typedef int state_type;
/// State stack type.
typedef stack state_stack_type;
/// Semantic value stack type.
typedef stack semantic_stack_type;
/// location stack type.
typedef stack location_stack_type;
/// The state stack.
state_stack_type yystate_stack_;
/// The semantic value stack.
semantic_stack_type yysemantic_stack_;
/// The location stack.
location_stack_type yylocation_stack_;
/// Internal symbol numbers.
typedef ]b4_int_type_for([b4_translate])[ token_number_type;
/* Tables. */
/// For a state, the index in \a yytable_ of its portion.
static const ]b4_int_type_for([b4_pact])[ yypact_[];
static const ]b4_int_type(b4_pact_ninf, b4_pact_ninf)[ yypact_ninf_;
/// For a state, default rule to reduce.
/// Unless\a yytable_ specifies something else to do.
/// Zero means the default is an error.
static const ]b4_int_type_for([b4_defact])[ yydefact_[];
static const ]b4_int_type_for([b4_pgoto])[ yypgoto_[];
static const ]b4_int_type_for([b4_defgoto])[ yydefgoto_[];
/// What to do in a state.
/// \a yytable_[yypact_[s]]: what to do in state \a s.
/// - if positive, shift that token.
/// - if negative, reduce the rule which number is the opposite.
/// - if zero, do what YYDEFACT says.
static const ]b4_int_type_for([b4_table])[ yytable_[];
static const ]b4_int_type(b4_table_ninf, b4_table_ninf)[ yytable_ninf_;
static const ]b4_int_type_for([b4_check])[ yycheck_[];
/// For a state, its accessing symbol.
static const ]b4_int_type_for([b4_stos])[ yystos_[];
/// For a rule, its LHS.
static const ]b4_int_type_for([b4_r1])[ yyr1_[];
/// For a rule, its RHS length.
static const ]b4_int_type_for([b4_r2])[ yyr2_[];
#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
/// For a symbol, its name in clear.
static const char* const yytname_[];
#endif
#if YYERROR_VERBOSE
/// Convert the symbol name \a n to a form suitable for a diagnostic.
virtual std::string yytnamerr_ (const char *n);
#endif
#if YYDEBUG
/// A type to store symbol numbers and -1.
typedef ]b4_int_type_for([b4_rhs])[ rhs_number_type;
/// A `-1'-separated list of the rules' RHS.
static const rhs_number_type yyrhs_[];
/// For each rule, the index of the first RHS symbol in \a yyrhs_.
static const ]b4_int_type_for([b4_prhs])[ yyprhs_[];
/// For each rule, its source line number.
static const ]b4_int_type_for([b4_rline])[ yyrline_[];
/// For each scanner token number, its symbol number.
static const ]b4_int_type_for([b4_toknum])[ yytoken_number_[];
/// Report on the debug stream that the rule \a r is going to be reduced.
virtual void yy_reduce_print_ (int r);
/// Print the state stack on the debug stream.
virtual void yystack_print_ ();
/* Debugging. */
int yydebug_;
std::ostream* yycdebug_;
#endif
/// Convert a scanner token number \a t to a symbol number.
token_number_type yytranslate_ (int t);
/// \brief Reclaim the memory associated to a symbol.
/// \param yymsg Why this token is reclaimed.
/// \param yytype The symbol type.
/// \param yyvaluep Its semantic value.
/// \param yylocationp Its location.
inline void yydestruct_ (const char* yymsg,
int yytype,
semantic_type* yyvaluep,
location_type* yylocationp);
/// Pop \a n symbols the three stacks.
inline void yypop_ (unsigned int n = 1);
/* Constants. */
static const int yyeof_;
/* LAST_ -- Last index in TABLE_. */
static const int yylast_;
static const int yynnts_;
static const int yyempty_;
static const int yyfinal_;
static const int yyterror_;
static const int yyerrcode_;
static const int yyntokens_;
static const unsigned int yyuser_token_number_max_;
static const token_number_type yyundef_token_;
]b4_parse_param_vars[
};
]b4_namespace_close[
]b4_percent_define_flag_if([[global_tokens_and_yystype]],
[b4_token_defines(b4_tokens)
#ifndef YYSTYPE
/* Redirection for backward compatibility. */
# define YYSTYPE b4_namespace_ref::b4_parser_class_name::semantic_type
#endif
])
b4_percent_code_get([[provides]])[]dnl
[#endif /* ! defined PARSER_HEADER_H */]
])dnl
@output(b4_parser_file_name@)@
b4_copyright([Skeleton implementation for Bison LALR(1) parsers in C++],
[2002-2010])
b4_percent_code_get([[top]])[]dnl
m4_if(b4_prefix, [yy], [],
[
// Take the name prefix into account.
#define yylex b4_prefix[]lex])[
/* First part of user declarations. */
]b4_user_pre_prologue
b4_defines_if([[
#include "@basename(]b4_spec_defines_file[@)"]])[
/* User implementation prologue. */
]b4_user_post_prologue
b4_percent_code_get[]dnl
[#ifndef YY_
# if defined YYENABLE_NLS && YYENABLE_NLS
# if ENABLE_NLS
# include /* FIXME: INFRINGES ON USER NAME SPACE */
# define YY_(msgid) dgettext ("bison-runtime", msgid)
# endif
# endif
# ifndef YY_
# define YY_(msgid) msgid
# endif
#endif
/* Suppress unused-variable warnings by "using" E. */
#define YYUSE(e) ((void) (e))
/* Enable debugging if requested. */
#if YYDEBUG
/* A pseudo ostream that takes yydebug_ into account. */
# define YYCDEBUG if (yydebug_) (*yycdebug_)
# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
do { \
if (yydebug_) \
{ \
*yycdebug_ << Title << ' '; \
yy_symbol_print_ ((Type), (Value), (Location)); \
*yycdebug_ << std::endl; \
} \
} while (false)
# define YY_REDUCE_PRINT(Rule) \
do { \
if (yydebug_) \
yy_reduce_print_ (Rule); \
} while (false)
# define YY_STACK_PRINT() \
do { \
if (yydebug_) \
yystack_print_ (); \
} while (false)
#else /* !YYDEBUG */
# define YYCDEBUG if (false) std::cerr
# define YY_SYMBOL_PRINT(Title, Type, Value, Location)
# define YY_REDUCE_PRINT(Rule)
# define YY_STACK_PRINT()
#endif /* !YYDEBUG */
#define yyerrok (yyerrstatus_ = 0)
#define yyclearin (yychar = yyempty_)
#define YYACCEPT goto yyacceptlab
#define YYABORT goto yyabortlab
#define YYERROR goto yyerrorlab
#define YYRECOVERING() (!!yyerrstatus_)
]b4_namespace_open[
#if YYERROR_VERBOSE
/* Return YYSTR after stripping away unnecessary quotes and
backslashes, so that it's suitable for yyerror. The heuristic is
that double-quoting is unnecessary unless the string contains an
apostrophe, a comma, or backslash (other than backslash-backslash).
YYSTR is taken from yytname. */
std::string
]b4_parser_class_name[::yytnamerr_ (const char *yystr)
{
if (*yystr == '"')
{
std::string yyr = "";
char const *yyp = yystr;
for (;;)
switch (*++yyp)
{
case '\'':
case ',':
goto do_not_strip_quotes;
case '\\':
if (*++yyp != '\\')
goto do_not_strip_quotes;
/* Fall through. */
default:
yyr += *yyp;
break;
case '"':
return yyr;
}
do_not_strip_quotes: ;
}
return yystr;
}
#endif
/// Build a parser object.
]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[)]m4_ifset([b4_parse_param], [
:])[
#if YYDEBUG
]m4_ifset([b4_parse_param], [ ], [ :])[yydebug_ (false),
yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[
#endif]b4_parse_param_cons[
{
}
]b4_parser_class_name::~b4_parser_class_name[ ()
{
}
#if YYDEBUG
/*--------------------------------.
| Print this symbol on YYOUTPUT. |
`--------------------------------*/
inline void
]b4_parser_class_name[::yy_symbol_value_print_ (int yytype,
const semantic_type* yyvaluep, const location_type* yylocationp)
{
YYUSE (yylocationp);
YYUSE (yyvaluep);
switch (yytype)
{
]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
[ default:
break;
}
}
void
]b4_parser_class_name[::yy_symbol_print_ (int yytype,
const semantic_type* yyvaluep, const location_type* yylocationp)
{
*yycdebug_ << (yytype < yyntokens_ ? "token" : "nterm")
<< ' ' << yytname_[yytype] << " ("
<< *yylocationp << ": ";
yy_symbol_value_print_ (yytype, yyvaluep, yylocationp);
*yycdebug_ << ')';
}
#endif
void
]b4_parser_class_name[::yydestruct_ (const char* yymsg,
int yytype, semantic_type* yyvaluep, location_type* yylocationp)
{
YYUSE (yylocationp);
YYUSE (yymsg);
YYUSE (yyvaluep);
YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
switch (yytype)
{
]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[
default:
break;
}
}
void
]b4_parser_class_name[::yypop_ (unsigned int n)
{
yystate_stack_.pop (n);
yysemantic_stack_.pop (n);
yylocation_stack_.pop (n);
}
#if YYDEBUG
std::ostream&
]b4_parser_class_name[::debug_stream () const
{
return *yycdebug_;
}
void
]b4_parser_class_name[::set_debug_stream (std::ostream& o)
{
yycdebug_ = &o;
}
]b4_parser_class_name[::debug_level_type
]b4_parser_class_name[::debug_level () const
{
return yydebug_;
}
void
]b4_parser_class_name[::set_debug_level (debug_level_type l)
{
yydebug_ = l;
}
#endif
int
]b4_parser_class_name[::parse ()
{
/// Lookahead and lookahead in internal form.
int yychar = yyempty_;
int yytoken = 0;
/* State. */
int yyn;
int yylen = 0;
int yystate = 0;
/* Error handling. */
int yynerrs_ = 0;
int yyerrstatus_ = 0;
/// Semantic value of the lookahead.
semantic_type yylval;
/// Location of the lookahead.
location_type yylloc;
/// The locations where the error started and ended.
location_type yyerror_range[2];
/// $$.
semantic_type yyval;
/// @@$.
location_type yyloc;
int yyresult;
YYCDEBUG << "Starting parse" << std::endl;
]m4_ifdef([b4_initial_action], [
m4_pushdef([b4_at_dollar], [yylloc])dnl
m4_pushdef([b4_dollar_dollar], [yylval])dnl
/* User initialization code. */
b4_user_initial_action
m4_popdef([b4_dollar_dollar])dnl
m4_popdef([b4_at_dollar])])dnl
[ /* 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. */
yystate_stack_ = state_stack_type (0);
yysemantic_stack_ = semantic_stack_type (0);
yylocation_stack_ = location_stack_type (0);
yysemantic_stack_.push (yylval);
yylocation_stack_.push (yylloc);
/* New state. */
yynewstate:
yystate_stack_.push (yystate);
YYCDEBUG << "Entering state " << yystate << std::endl;
/* Accept? */
if (yystate == yyfinal_)
goto yyacceptlab;
goto yybackup;
/* Backup. */
yybackup:
/* Try to take a decision without lookahead. */
yyn = yypact_[yystate];
if (yyn == yypact_ninf_)
goto yydefault;
/* Read a lookahead token. */
if (yychar == yyempty_)
{
YYCDEBUG << "Reading a token: ";
yychar = ]b4_c_function_call([yylex], [int],
[[YYSTYPE*], [&yylval]][]dnl
b4_locations_if([, [[location*], [&yylloc]]])dnl
m4_ifdef([b4_lex_param], [, ]b4_lex_param))[;
}
/* Convert token to internal form. */
if (yychar <= yyeof_)
{
yychar = yytoken = yyeof_;
YYCDEBUG << "Now at end of input." << std::endl;
}
else
{
yytoken = yytranslate_ (yychar);
YY_SYMBOL_PRINT ("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;
/* Reduce or error. */
yyn = yytable_[yyn];
if (yyn <= 0)
{
if (yyn == 0 || yyn == yytable_ninf_)
goto yyerrlab;
yyn = -yyn;
goto yyreduce;
}
/* Shift the lookahead token. */
YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
/* Discard the token being shifted. */
yychar = yyempty_;
yysemantic_stack_.push (yylval);
yylocation_stack_.push (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:
yylen = yyr2_[yyn];
/* If YYLEN 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 (yylen)
yyval = yysemantic_stack_[yylen - 1];
else
yyval = yysemantic_stack_[0];
{
slice slice (yylocation_stack_, yylen);
YYLLOC_DEFAULT (yyloc, slice, yylen);
}
YY_REDUCE_PRINT (yyn);
switch (yyn)
{
]b4_user_actions[
default:
break;
}
YY_SYMBOL_PRINT ("-> $$ =", yyr1_[yyn], &yyval, &yyloc);
yypop_ (yylen);
yylen = 0;
YY_STACK_PRINT ();
yysemantic_stack_.push (yyval);
yylocation_stack_.push (yyloc);
/* Shift the result of the reduction. */
yyn = yyr1_[yyn];
yystate = yypgoto_[yyn - yyntokens_] + yystate_stack_[0];
if (0 <= yystate && yystate <= yylast_
&& yycheck_[yystate] == yystate_stack_[0])
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_;
error (yylloc, yysyntax_error_ (yystate]dnl
b4_error_verbose_if([, yytoken])[));
}
yyerror_range[0] = yylloc;
if (yyerrstatus_ == 3)
{
/* If just tried and failed to reuse lookahead token after an
error, discard it. */
if (yychar <= yyeof_)
{
/* Return failure if at end of input. */
if (yychar == yyeof_)
YYABORT;
}
else
{
yydestruct_ ("Error: discarding", yytoken, &yylval, &yylloc);
yychar = yyempty_;
}
}
/* Else will try to reuse lookahead token after shifting the error
token. */
goto yyerrlab1;
/*---------------------------------------------------.
| yyerrorlab -- error raised explicitly by YYERROR. |
`---------------------------------------------------*/
yyerrorlab:
/* Pacify compilers like GCC when the user code never invokes
YYERROR and the label yyerrorlab therefore never appears in user
code. */
if (false)
goto yyerrorlab;
yyerror_range[0] = yylocation_stack_[yylen - 1];
/* Do not reclaim the symbols of the rule which action triggered
this YYERROR. */
yypop_ (yylen);
yylen = 0;
yystate = yystate_stack_[0];
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 (yystate_stack_.height () == 1)
YYABORT;
yyerror_range[0] = yylocation_stack_[0];
yydestruct_ ("Error: popping",
yystos_[yystate],
&yysemantic_stack_[0], &yylocation_stack_[0]);
yypop_ ();
yystate = yystate_stack_[0];
YY_STACK_PRINT ();
}
yyerror_range[1] = yylloc;
// Using YYLLOC is tempting, but would change the location of
// the lookahead. YYLOC is available though.
YYLLOC_DEFAULT (yyloc, (yyerror_range - 1), 2);
yysemantic_stack_.push (yylval);
yylocation_stack_.push (yyloc);
/* Shift the error token. */
YY_SYMBOL_PRINT ("Shifting", yystos_[yyn],
&yysemantic_stack_[0], &yylocation_stack_[0]);
yystate = yyn;
goto yynewstate;
/* Accept. */
yyacceptlab:
yyresult = 0;
goto yyreturn;
/* Abort. */
yyabortlab:
yyresult = 1;
goto yyreturn;
yyreturn:
if (yychar != yyempty_)
yydestruct_ ("Cleanup: discarding lookahead", yytoken, &yylval, &yylloc);
/* Do not reclaim the symbols of the rule which action triggered
this YYABORT or YYACCEPT. */
yypop_ (yylen);
while (yystate_stack_.height () != 1)
{
yydestruct_ ("Cleanup: popping",
yystos_[yystate_stack_[0]],
&yysemantic_stack_[0],
&yylocation_stack_[0]);
yypop_ ();
}
return yyresult;
}
// Generate an error message.
std::string
]b4_parser_class_name[::yysyntax_error_ (int yystate]dnl
b4_error_verbose_if([, int tok])[)
{
std::string res;
YYUSE (yystate);
#if YYERROR_VERBOSE
int yyn = yypact_[yystate];
if (yypact_ninf_ < yyn && yyn <= yylast_)
{
/* 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 + 1;
int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
int count = 0;
for (int x = yyxbegin; x < yyxend; ++x)
if (yycheck_[x + yyn] == x && x != yyterror_)
++count;
// FIXME: This method of building the message is not compatible
// with internationalization. It should work like yacc.c does it.
// That is, first build a string that looks like this:
// "syntax error, unexpected %s or %s or %s"
// Then, invoke YY_ on this string.
// Finally, use the string as a format to output
// yytname_[tok], etc.
// Until this gets fixed, this message appears in English only.
res = "syntax error, unexpected ";
res += yytnamerr_ (yytname_[tok]);
if (count < 5)
{
count = 0;
for (int x = yyxbegin; x < yyxend; ++x)
if (yycheck_[x + yyn] == x && x != yyterror_)
{
res += (!count++) ? ", expecting " : " or ";
res += yytnamerr_ (yytname_[x]);
}
}
}
else
#endif
res = YY_("syntax error");
return res;
}
/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
STATE-NUM. */
const ]b4_int_type(b4_pact_ninf, b4_pact_ninf) b4_parser_class_name::yypact_ninf_ = b4_pact_ninf[;
const ]b4_int_type_for([b4_pact])[
]b4_parser_class_name[::yypact_[] =
{
]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])[
]b4_parser_class_name[::yydefact_[] =
{
]b4_defact[
};
/* YYPGOTO[NTERM-NUM]. */
const ]b4_int_type_for([b4_pgoto])[
]b4_parser_class_name[::yypgoto_[] =
{
]b4_pgoto[
};
/* YYDEFGOTO[NTERM-NUM]. */
const ]b4_int_type_for([b4_defgoto])[
]b4_parser_class_name[::yydefgoto_[] =
{
]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) b4_parser_class_name::yytable_ninf_ = b4_table_ninf[;
const ]b4_int_type_for([b4_table])[
]b4_parser_class_name[::yytable_[] =
{
]b4_table[
};
/* YYCHECK. */
const ]b4_int_type_for([b4_check])[
]b4_parser_class_name[::yycheck_[] =
{
]b4_check[
};
/* STOS_[STATE-NUM] -- The (internal number of the) accessing
symbol of state STATE-NUM. */
const ]b4_int_type_for([b4_stos])[
]b4_parser_class_name[::yystos_[] =
{
]b4_stos[
};
#if YYDEBUG
/* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding
to YYLEX-NUM. */
const ]b4_int_type_for([b4_toknum])[
]b4_parser_class_name[::yytoken_number_[] =
{
]b4_toknum[
};
#endif
/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
const ]b4_int_type_for([b4_r1])[
]b4_parser_class_name[::yyr1_[] =
{
]b4_r1[
};
/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
const ]b4_int_type_for([b4_r2])[
]b4_parser_class_name[::yyr2_[] =
{
]b4_r2[
};
#if YYDEBUG || YYERROR_VERBOSE || YYTOKEN_TABLE
/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
First, the terminals, then, starting at \a yyntokens_, nonterminals. */
const char*
const ]b4_parser_class_name[::yytname_[] =
{
]b4_tname[
};
#endif
#if YYDEBUG
/* YYRHS -- A `-1'-separated list of the rules' RHS. */
const ]b4_parser_class_name[::rhs_number_type
]b4_parser_class_name[::yyrhs_[] =
{
]b4_rhs[
};
/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
YYRHS. */
const ]b4_int_type_for([b4_prhs])[
]b4_parser_class_name[::yyprhs_[] =
{
]b4_prhs[
};
/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
const ]b4_int_type_for([b4_rline])[
]b4_parser_class_name[::yyrline_[] =
{
]b4_rline[
};
// Print the state stack on the debug stream.
void
]b4_parser_class_name[::yystack_print_ ()
{
*yycdebug_ << "Stack now";
for (state_stack_type::const_iterator i = yystate_stack_.begin ();
i != yystate_stack_.end (); ++i)
*yycdebug_ << ' ' << *i;
*yycdebug_ << std::endl;
}
// Report on the debug stream that the rule \a yyrule is going to be reduced.
void
]b4_parser_class_name[::yy_reduce_print_ (int yyrule)
{
unsigned int yylno = yyrline_[yyrule];
int yynrhs = yyr2_[yyrule];
/* Print the symbols being reduced, and their result. */
*yycdebug_ << "Reducing stack by rule " << yyrule - 1
<< " (line " << yylno << "):" << std::endl;
/* The symbols being reduced. */
for (int yyi = 0; yyi < yynrhs; yyi++)
YY_SYMBOL_PRINT (" $" << yyi + 1 << " =",
yyrhs_[yyprhs_[yyrule] + yyi],
&]b4_rhs_value(yynrhs, yyi + 1)[,
&]b4_rhs_location(yynrhs, yyi + 1)[);
}
#endif // YYDEBUG
/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
]b4_parser_class_name[::token_number_type
]b4_parser_class_name[::yytranslate_ (int t)
{
static
const token_number_type
translate_table[] =
{
]b4_translate[
};
if ((unsigned int) t <= yyuser_token_number_max_)
return translate_table[t];
else
return yyundef_token_;
}
const int ]b4_parser_class_name[::yyeof_ = 0;
const int ]b4_parser_class_name[::yylast_ = ]b4_last[;
const int ]b4_parser_class_name[::yynnts_ = ]b4_nterms_number[;
const int ]b4_parser_class_name[::yyempty_ = -2;
const int ]b4_parser_class_name[::yyfinal_ = ]b4_final_state_number[;
const int ]b4_parser_class_name[::yyterror_ = 1;
const int ]b4_parser_class_name[::yyerrcode_ = 256;
const int ]b4_parser_class_name[::yyntokens_ = ]b4_tokens_number[;
const unsigned int ]b4_parser_class_name[::yyuser_token_number_max_ = ]b4_user_token_number_max[;
const ]b4_parser_class_name[::token_number_type ]b4_parser_class_name[::yyundef_token_ = ]b4_undef_token_number[;
]b4_namespace_close[
]b4_epilogue
dnl
@output(b4_dir_prefix[]stack.hh@)@
b4_copyright([Stack handling for Bison parsers in C++],
[2002-2010])[
#ifndef BISON_STACK_HH
# define BISON_STACK_HH
#include
]b4_namespace_open[
template >
class stack
{
public:
// Hide our reversed order.
typedef typename S::reverse_iterator iterator;
typedef typename S::const_reverse_iterator const_iterator;
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 const_iterator begin () const { return seq_.rbegin (); }
inline const_iterator end () const { return seq_.rend (); }
private:
S seq_;
};
/// Present a slice of the top of a stack.
template >
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_;
};
]b4_namespace_close[
#endif // not BISON_STACK_HH[]dnl
]
m4_divert_pop(0)
070701000541d5000081a40000000000000000000000014cda0fa400001aea0000010000010006ffffffffffffffff0000002700000000root/usr/local/share/bison/location.cc # C++ skeleton for Bison
# Copyright (C) 2002-2007, 2009-2010 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 3 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, see .
# We do want M4 expansion after # for CPP macros.
m4_changecom()
m4_divert_push(0)dnl
@output(b4_dir_prefix[]position.hh@)@
b4_copyright([Positions for Bison parsers in C++],
[2002-2007, 2009-2010])[
/**
** \file position.hh
** Define the ]b4_namespace_ref[::position class.
*/
#ifndef BISON_POSITION_HH
# define BISON_POSITION_HH
# include
# include
# include
]b4_namespace_open[
/// Abstract a position.
class position
{
public:
]m4_ifdef([b4_location_constructors], [
/// Construct a position.
position ()
: filename (0), line (]b4_location_initial_line[), column (]b4_location_initial_column[)
{
}
])[
/// Initialization.
inline void initialize (]b4_percent_define_get([[filename_type]])[* fn)
{
filename = fn;
line = ]b4_location_initial_line[;
column = ]b4_location_initial_column[;
}
/** \name Line and Column related manipulators
** \{ */
public:
/// (line related) Advance to the COUNT next lines.
inline void lines (int count = 1)
{
column = ]b4_location_initial_column[;
line += count;
}
/// (column related) Advance to the COUNT next columns.
inline void columns (int count = 1)
{
column = std::max (]b4_location_initial_column[u, column + count);
}
/** \} */
public:
/// File name to which this position refers.
]b4_percent_define_get([[filename_type]])[* filename;
/// Current line number.
unsigned int line;
/// Current column number.
unsigned int column;
};
/// Add and assign a position.
inline const position&
operator+= (position& res, const int width)
{
res.columns (width);
return res;
}
/// Add two position objects.
inline const position
operator+ (const position& begin, const int width)
{
position res = begin;
return res += width;
}
/// Add and assign a position.
inline const position&
operator-= (position& res, const int width)
{
return res += -width;
}
/// Add two position objects.
inline const position
operator- (const position& begin, const int width)
{
return begin + -width;
}
]b4_percent_define_flag_if([[define_location_comparison]], [[
/// Compare two position objects.
inline bool
operator== (const position& pos1, const position& pos2)
{
return (pos1.line == pos2.line
&& pos1.column == pos2.column
&& (pos1.filename == pos2.filename
|| (pos1.filename && pos2.filename
&& *pos1.filename == *pos2.filename)));
}
/// Compare two position objects.
inline bool
operator!= (const position& pos1, const position& pos2)
{
return !(pos1 == pos2);
}
]])[
/** \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)
ostr << *pos.filename << ':';
return ostr << pos.line << '.' << pos.column;
}
]b4_namespace_close[
#endif // not BISON_POSITION_HH]
@output(b4_dir_prefix[]location.hh@)@
b4_copyright([Locations for Bison parsers in C++],
[2002-2007, 2009-2010])[
/**
** \file location.hh
** Define the ]b4_namespace_ref[::location class.
*/
#ifndef BISON_LOCATION_HH
# define BISON_LOCATION_HH
# include
# include
# include "position.hh"
]b4_namespace_open[
/// Abstract a location.
class location
{
public:
]m4_ifdef([b4_location_constructors], [
/// Construct a location.
location ()
: begin (), end ()
{
}
])[
/// Initialization.
inline void initialize (]b4_percent_define_get([[filename_type]])[* fn)
{
begin.initialize (fn);
end = begin;
}
/** \name Line and Column related manipulators
** \{ */
public:
/// Reset initial location to final location.
inline void step ()
{
begin = end;
}
/// Extend the current location to the COUNT next columns.
inline void columns (unsigned int count = 1)
{
end += count;
}
/// Extend the current location to the COUNT next lines.
inline void lines (unsigned int count = 1)
{
end.lines (count);
}
/** \} */
public:
/// Beginning of the located region.
position begin;
/// End of the located region.
position end;
};
/// 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;
}
/// Add two location objects.
inline const location operator+ (const location& begin, unsigned int width)
{
location res = begin;
res.columns (width);
return res;
}
/// Add and assign a location.
inline location& operator+= (location& res, unsigned int width)
{
res.columns (width);
return res;
}
]b4_percent_define_flag_if([[define_location_comparison]], [[
/// Compare two location objects.
inline bool
operator== (const location& loc1, const location& loc2)
{
return loc1.begin == loc2.begin && loc1.end == loc2.end;
}
/// Compare two location objects.
inline bool
operator!= (const location& loc1, const location& loc2)
{
return !(loc1 == loc2);
}
]])[
/** \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 (last.filename
&& (!loc.begin.filename
|| *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;
}
]b4_namespace_close[
#endif // not BISON_LOCATION_HH]
m4_divert_pop(0)
m4_changecom([#])
070701000541d0000081a40000000000000000000000014cda0fa4000029880000010000010006ffffffffffffffff0000002200000000root/usr/local/share/bison/glr.cc -*- C -*-
# C++ GLR skeleton for Bison
# Copyright (C) 2002-2010 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 3 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, see .
# This skeleton produces a C++ class that encapsulates a C glr parser.
# This is in order to reduce the maintenance burden. The glr.c
# skeleton is clean and pure enough so that there are no real
# problems. The C++ interface is the same as that of lalr1.cc. In
# fact, glr.c can replace yacc.c without the user noticing any
# difference, and similarly for glr.cc replacing lalr1.cc.
#
# The passing of parse-params
#
# The additional arguments are stored as members of the parser
# object, yyparser. The C routines need to carry yyparser
# throughout the C parser; that easy: just let yyparser become an
# additional parse-param. But because the C++ skeleton needs to
# know the "real" original parse-param, we save them
# (b4_parse_param_orig). Note that b4_parse_param is overquoted
# (and c.m4 strips one level of quotes). This is a PITA, and
# explains why there are so many levels of quotes.
#
# The locations
#
# We use location.cc just like lalr1.cc, but because glr.c stores
# the locations in a (C++) union, the position and location classes
# must not have a constructor. Therefore, contrary to lalr1.cc, we
# must not define "b4_location_constructors". As a consequence the
# user must initialize the first positions (in particular the
# filename member).
# We require a pure interface using locations.
m4_define([b4_locations_flag], [1])
m4_define([b4_pure_flag], [1])
# The header is mandatory.
b4_defines_if([],
[b4_fatal([b4_skeleton[: using %%defines is mandatory]])])
m4_include(b4_pkgdatadir/[c++.m4])
m4_include(b4_pkgdatadir/[location.cc])
m4_define([b4_parser_class_name],
[b4_percent_define_get([[parser_class_name]])])
# Save the parse parameters.
m4_define([b4_parse_param_orig], m4_defn([b4_parse_param]))
# b4_yy_symbol_print_generate
# ---------------------------
# Bypass the default implementation to generate the "yy_symbol_print"
# and "yy_symbol_value_print" functions.
m4_define([b4_yy_symbol_print_generate],
[[
/*--------------------.
| Print this symbol. |
`--------------------*/
]b4_c_ansi_function_def([yy_symbol_print],
[static void],
[[FILE *], []],
[[int yytype], [yytype]],
[[const b4_namespace_ref::b4_parser_class_name::semantic_type *yyvaluep],
[yyvaluep]],
[[const b4_namespace_ref::b4_parser_class_name::location_type *yylocationp],
[yylocationp]],
b4_parse_param)[
{
]b4_parse_param_use[]dnl
[ yyparser.yy_symbol_print_ (yytype, yyvaluep]b4_locations_if([, yylocationp])[);
}
]])
# Declare yyerror.
m4_append([b4_post_prologue],
[b4_syncline([@oline@], [@ofile@])
b4_c_ansi_function_decl([yyerror],
[static void],
[[b4_namespace_ref::b4_parser_class_name::location_type *yylocationp], [yylocationp]],
b4_parse_param,
[[const char* msg], [msg]])])
# Define yyerror.
m4_append([b4_epilogue],
[b4_syncline([@oline@], [@ofile@])[
/*------------------.
| Report an error. |
`------------------*/
]b4_c_ansi_function_def([yyerror],
[static void],
[[b4_namespace_ref::b4_parser_class_name::location_type *yylocationp], [yylocationp]],
b4_parse_param,
[[const char* msg], [msg]])[
{
]b4_parse_param_use[]dnl
[ yyparser.error (*yylocationp, msg);
}
]b4_namespace_open[
]dnl In this section, the parse param are the original parse_params.
m4_pushdef([b4_parse_param], m4_defn([b4_parse_param_orig]))dnl
[ /// Build a parser object.
]b4_parser_class_name::b4_parser_class_name[ (]b4_parse_param_decl[)]m4_ifset([b4_parse_param], [
:])[
#if YYDEBUG
]m4_ifset([b4_parse_param], [ ], [ :])[yydebug_ (false),
yycdebug_ (&std::cerr)]m4_ifset([b4_parse_param], [,])[
#endif]b4_parse_param_cons[
{
}
]b4_parser_class_name::~b4_parser_class_name[ ()
{
}
int
]b4_parser_class_name[::parse ()
{
return ::yyparse (*this]b4_user_args[);
}
#if YYDEBUG
/*--------------------.
| Print this symbol. |
`--------------------*/
inline void
]b4_parser_class_name[::yy_symbol_value_print_ (int yytype,
const semantic_type* yyvaluep, const location_type* yylocationp)
{
/* Pacify ``unused variable'' warnings. */
YYUSE (yyvaluep);
YYUSE (yylocationp);
switch (yytype)
{
]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
[ default:
break;
}
}
void
]b4_parser_class_name[::yy_symbol_print_ (int yytype,
const semantic_type* yyvaluep, const location_type* yylocationp)
{
*yycdebug_ << (yytype < YYNTOKENS ? "token" : "nterm")
<< ' ' << yytname[yytype] << " ("
<< *yylocationp << ": ";
yy_symbol_value_print_ (yytype, yyvaluep, yylocationp);
*yycdebug_ << ')';
}
std::ostream&
]b4_parser_class_name[::debug_stream () const
{
return *yycdebug_;
}
void
]b4_parser_class_name[::set_debug_stream (std::ostream& o)
{
yycdebug_ = &o;
}
]b4_parser_class_name[::debug_level_type
]b4_parser_class_name[::debug_level () const
{
return yydebug_;
}
void
]b4_parser_class_name[::set_debug_level (debug_level_type l)
{
yydebug_ = l;
}
#endif
]m4_popdef([b4_parse_param])dnl
b4_namespace_close[
]])
# Let glr.c believe that the user arguments include the parser itself.
m4_ifset([b4_parse_param],
[m4_pushdef([b4_parse_param],
m4_dquote([[[b4_namespace_ref::b4_parser_class_name& yyparser], [[yyparser]]],]
m4_defn([b4_parse_param])))],
[m4_pushdef([b4_parse_param],
[[[[b4_namespace_ref::b4_parser_class_name& yyparser], [[yyparser]]]]])
])
m4_include(b4_pkgdatadir/[glr.c])
m4_popdef([b4_parse_param])
m4_divert_push(0)
@output(b4_spec_defines_file@)@
b4_copyright([Skeleton interface for Bison GLR parsers in C++],
[2002-2006, 2009-2010])[
/* C++ GLR parser skeleton written by Akim Demaille. */
#ifndef PARSER_HEADER_H
# define PARSER_HEADER_H
]b4_percent_code_get([[requires]])[
#include
#include
/* Using locations. */
#define YYLSP_NEEDED ]b4_locations_flag[
]b4_namespace_open[
class position;
class location;
]b4_namespace_close[
#include "location.hh"
/* Enabling traces. */
#ifndef YYDEBUG
# define YYDEBUG ]b4_debug_flag[
#endif
/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
If N is 0, then set CURRENT to the empty location which ends
the previous symbol: RHS[0] (always defined). */
#ifndef YYLLOC_DEFAULT
# define YYLLOC_DEFAULT(Current, Rhs, N) \
do \
if (N) \
{ \
(Current).begin = YYRHSLOC (Rhs, 1).begin; \
(Current).end = YYRHSLOC (Rhs, N).end; \
} \
else \
{ \
(Current).begin = (Current).end = YYRHSLOC (Rhs, 0).end; \
} \
while (/*CONSTCOND*/ 0)
#endif
]b4_namespace_open[
/// A Bison parser.
class ]b4_parser_class_name[
{
public:
/// Symbol semantic values.
#ifndef YYSTYPE
]m4_ifdef([b4_stype],
[ union semantic_type
{
b4_user_stype
};],
[m4_if(b4_tag_seen_flag, 0,
[[ typedef int semantic_type;]],
[[ typedef YYSTYPE semantic_type;]])])[
#else
typedef YYSTYPE semantic_type;
#endif
/// Symbol locations.
typedef ]b4_percent_define_get([[location_type]])[ location_type;
/// Tokens.
struct token
{
]b4_token_enums(b4_tokens)[
};
/// Token type.
typedef token::yytokentype token_type;
/// Build a parser object.
]b4_parser_class_name[ (]b4_parse_param_decl[);
virtual ~]b4_parser_class_name[ ();
/// Parse.
/// \returns 0 iff parsing succeeded.
virtual int parse ();
/// The current debugging stream.
std::ostream& debug_stream () const;
/// Set the current debugging stream.
void set_debug_stream (std::ostream &);
/// Type for debugging levels.
typedef int debug_level_type;
/// The current debugging level.
debug_level_type debug_level () const;
/// Set the current debugging level.
void set_debug_level (debug_level_type l);
private:
public:
/// Report a syntax error.
/// \param loc where the syntax error is found.
/// \param msg a description of the syntax error.
virtual void error (const location_type& loc, const std::string& msg);
private:
#if YYDEBUG
public:
/// \brief Report a symbol value on the debug stream.
/// \param yytype The token type.
/// \param yyvaluep Its semantic value.
/// \param yylocationp Its location.
virtual void yy_symbol_value_print_ (int yytype,
const semantic_type* yyvaluep,
const location_type* yylocationp);
/// \brief Report a symbol on the debug stream.
/// \param yytype The token type.
/// \param yyvaluep Its semantic value.
/// \param yylocationp Its location.
virtual void yy_symbol_print_ (int yytype,
const semantic_type* yyvaluep,
const location_type* yylocationp);
private:
/* Debugging. */
int yydebug_;
std::ostream* yycdebug_;
#endif
/// \brief Reclaim the memory associated to a symbol.
/// \param yymsg Why this token is reclaimed.
/// \param yytype The symbol type.
/// \param yyvaluep Its semantic value.
/// \param yylocationp Its location.
inline void yydestruct_ (const char* yymsg,
int yytype,
semantic_type* yyvaluep,
location_type* yylocationp);
]b4_parse_param_vars[
};
]dnl Redirections for glr.c.
b4_percent_define_flag_if([[global_tokens_and_yystype]],
[b4_token_defines(b4_tokens)])
[
#ifndef YYSTYPE
# define YYSTYPE ]b4_namespace_ref[::]b4_parser_class_name[::semantic_type
#endif
#ifndef YYLTYPE
# define YYLTYPE ]b4_namespace_ref[::]b4_parser_class_name[::location_type
#endif
]b4_namespace_close[
]b4_percent_code_get([[provides]])[]dnl
[#endif /* ! defined PARSER_HEADER_H */]
m4_divert_pop(0)
070701000541cf000081a40000000000000000000000014cda0fa40001278b0000010000010006ffffffffffffffff0000002100000000root/usr/local/share/bison/glr.c -*- C -*-
# GLR skeleton for Bison
# Copyright (C) 2002-2010 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 3 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, see .
m4_include(b4_pkgdatadir/[c.m4])
## ---------------- ##
## Default values. ##
## ---------------- ##
# Stack parameters.
m4_define_default([b4_stack_depth_max], [10000])
m4_define_default([b4_stack_depth_init], [200])
## ------------------------ ##
## Pure/impure interfaces. ##
## ------------------------ ##
b4_define_flag_if([pure])
# If glr.cc is including this file and thus has already set b4_pure_flag, don't
# change the value of b4_pure_flag, and don't record a use of api.pure.
m4_ifndef([b4_pure_flag],
[b4_percent_define_default([[api.pure]], [[false]])
m4_define([b4_pure_flag],
[b4_percent_define_flag_if([[api.pure]], [[1]], [[0]])])])
# b4_user_formals
# ---------------
# The possible parse-params formal arguments preceded by a comma.
#
# This is not shared with yacc.c in c.m4 because GLR relies on ISO C
# formal argument declarations.
m4_define([b4_user_formals],
[m4_ifset([b4_parse_param], [, b4_c_ansi_formals(b4_parse_param)])])
# 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 *]], [[&yylval]]][]dnl
b4_locations_if([, [[YYLTYPE *], [&yylloc]]])])dnl
m4_ifdef([b4_lex_param], [, ]b4_lex_param)))
# b4_yyerror_args
# ---------------
# Optional effective arguments passed to yyerror: user args plus yylloc, and
# a trailing comma.
m4_define([b4_yyerror_args],
[b4_pure_if([b4_locations_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 &yylloc instead of yylocp.
m4_define([b4_lyyerror_args],
[b4_pure_if([b4_locations_if([&yylloc, ])])dnl
m4_ifset([b4_parse_param], [b4_c_args(b4_parse_param), ])])
# b4_pure_args
# ------------
# Same as b4_yyerror_args, but with a leading comma.
m4_define([b4_pure_args],
[b4_pure_if([b4_locations_if([, yylocp])])[]b4_user_args])
# b4_lpure_args
# -------------
# Same as above, but on the lookahead, hence &yylloc instead of yylocp.
m4_define([b4_lpure_args],
[b4_pure_if([b4_locations_if([, &yylloc])])[]b4_user_args])
# b4_pure_formals
# ---------------
# Arguments passed to yyerror: user formals plus yylocp.
m4_define([b4_pure_formals],
[b4_pure_if([b4_locations_if([, YYLTYPE *yylocp])])[]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 (($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 (($2) - ($1))@}.yystate.yyloc)])
## -------------- ##
## Output files. ##
## -------------- ##
# We do want M4 expansion after # for CPP macros.
m4_changecom()
m4_divert_push(0)dnl
@output(b4_parser_file_name@)@
b4_copyright([Skeleton implementation for Bison GLR parsers in C],
[2002-2006, 2009-2010])
[
/* C GLR parser skeleton written by Paul Hilfinger. */
]b4_identification
b4_percent_code_get([[top]])[]dnl
m4_if(b4_prefix, [yy], [],
[/* Substitute the variable and function 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
#define yylloc b4_prefix[]lloc])[
/* Copy the first part of user declarations. */
]b4_user_pre_prologue
dnl # b4_shared_declarations
dnl # ----------------------
dnl # Declaration that might either go into the header (if --defines)
dnl # or open coded in the parser body.
m4_define([b4_shared_declarations],
[b4_percent_code_get([[requires]])[]dnl
b4_token_enums(b4_tokens)
[#ifndef YYSTYPE
]m4_ifdef([b4_stype],
[[typedef union ]b4_union_name[
{
]b4_user_stype[
} YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1]],
[m4_if(b4_tag_seen_flag, 0,
[[typedef int YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1]])])[
#endif
#if ! defined YYLTYPE && ! defined YYLTYPE_IS_DECLARED
typedef struct YYLTYPE
{
]b4_locations_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_percent_code_get([[provides]])[]dnl
])
b4_defines_if([[#include "@basename(]b4_spec_defines_file[@)"]],
[b4_shared_declarations])[
/* Enabling traces. */
#ifndef YYDEBUG
# define YYDEBUG ]b4_debug_flag[
#endif
/* Enabling verbose error messages. */
#ifdef YYERROR_VERBOSE
# undef YYERROR_VERBOSE
# define YYERROR_VERBOSE 1
#else
# define YYERROR_VERBOSE ]b4_error_verbose_flag[
#endif
/* Enabling the token table. */
#ifndef YYTOKEN_TABLE
# define YYTOKEN_TABLE ]b4_token_table[
#endif
/* Default (constant) value used for initialization for null
right-hand sides. Unlike the standard yacc.c template,
here we set the default value of $$ to a zeroed-out value.
Since the default value is undefined, this behavior is
technically correct. */
static YYSTYPE yyval_default;
/* Copy the second part of user declarations. */
]b4_user_post_prologue
b4_percent_code_get[]dnl
[#include
#include
#include
#ifndef YY_
# if defined YYENABLE_NLS && YYENABLE_NLS
# if ENABLE_NLS
# include /* INFRINGES ON USER NAME SPACE */
# define YY_(msgid) dgettext ("bison-runtime", msgid)
# endif
# endif
# ifndef YY_
# define YY_(msgid) msgid
# endif
#endif
/* Suppress unused-variable warnings by "using" E. */
#if ! defined lint || defined __GNUC__
# define YYUSE(e) ((void) (e))
#else
# define YYUSE(e) /* empty */
#endif
/* Identity function, used to suppress warnings about constant conditions. */
#ifndef lint
# define YYID(n) (n)
#else
]b4_c_function_def([YYID], [static int], [[int i], [i]])[
{
return i;
}
#endif
#ifndef YYFREE
# define YYFREE free
#endif
#ifndef YYMALLOC
# define YYMALLOC malloc
#endif
#ifndef YYREALLOC
# define YYREALLOC realloc
#endif
#define YYSIZEMAX ((size_t) -1)
#ifdef __cplusplus
typedef bool yybool;
#else
typedef unsigned char yybool;
#endif
#define yytrue 1
#define yyfalse 0
#ifndef YYSETJMP
# include
# define YYJMP_BUF jmp_buf
# define YYSETJMP(env) setjmp (env)
# define YYLONGJMP(env, val) longjmp (env, val)
#endif
/*-----------------.
| 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) \
|| (defined __STRICT_ANSI__ && __STRICT_ANSI__))
# define __attribute__(Spec) /* empty */
# endif
#endif
]b4_locations_if([#define YYOPTIONAL_LOC(Name) Name],[
#ifdef __cplusplus
# define YYOPTIONAL_LOC(Name) /* empty */
#else
# define YYOPTIONAL_LOC(Name) Name __attribute__ ((__unused__))
#endif])[
#ifndef YYASSERT
# define YYASSERT(condition) ((void) ((condition) || (abort (), 0)))
#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) \
((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 || YYTOKEN_TABLE
/* YYTNAME[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 -- Set CURRENT to span from RHS[1] to RHS[N].
If N is 0, then set CURRENT to the empty location which ends
the previous symbol: RHS[0] (always defined). */
]b4_locations_if([[
#define YYRHSLOC(Rhs, K) ((Rhs)[K].yystate.yyloc)
#ifndef YYLLOC_DEFAULT
# define YYLLOC_DEFAULT(Current, Rhs, N) \
do \
if (YYID (N)) \
{ \
(Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
(Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
(Current).last_line = YYRHSLOC (Rhs, N).last_line; \
(Current).last_column = YYRHSLOC (Rhs, N).last_column; \
} \
else \
{ \
(Current).first_line = (Current).last_line = \
YYRHSLOC (Rhs, 0).last_line; \
(Current).first_column = (Current).last_column = \
YYRHSLOC (Rhs, 0).last_column; \
} \
while (YYID (0))
/* YY_LOCATION_PRINT -- Print the location on the stream.
This macro was not mandated originally: define only if we know
we won't break user code: when these are the locations we know. */
# define YY_LOCATION_PRINT(File, Loc) \
fprintf (File, "%d.%d-%d.%d", \
(Loc).first_line, (Loc).first_column, \
(Loc).last_line, (Loc).last_column)
#endif
]],[
#ifndef YYLLOC_DEFAULT
# define YYLLOC_DEFAULT(Current, Rhs, N) ((void) 0)
#endif
])[
#ifndef YY_LOCATION_PRINT
# define YY_LOCATION_PRINT(File, Loc) ((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 (yystackp->yyerrcnt)
#undef yychar
#define yychar (yystackp->yyrawchar)
#undef yylval
#define yylval (yystackp->yyval)
#undef yylloc
#define yylloc (yystackp->yyloc)
m4_if(b4_prefix[], [yy], [],
[#define b4_prefix[]nerrs yynerrs
#define b4_prefix[]char yychar
#define b4_prefix[]lval yylval
#define b4_prefix[]lloc yylloc])],
[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 (YYID (0))
#if YYDEBUG
# ifndef YYFPRINTF
# define YYFPRINTF fprintf
# endif
# define YYDPRINTF(Args) \
do { \
if (yydebug) \
YYFPRINTF Args; \
} while (YYID (0))
]b4_yy_symbol_print_generate([b4_c_ansi_function_def])[
# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
do { \
if (yydebug) \
{ \
YYFPRINTF (stderr, "%s ", Title); \
yy_symbol_print (stderr, Type, \
Value]b4_locations_if([, Location])[]b4_user_args[); \
YYFPRINTF (stderr, "\n"); \
} \
} while (YYID (0))
/* Nonzero means print parse trace. It is left uninitialized so that
multiple parsers can coexist. */
int yydebug;
#else /* !YYDEBUG */
# define YYDPRINTF(Args)
# define YY_SYMBOL_PRINT(Title, Type, 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. */
#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 yyexpandGLRStack before the
stack is expanded, thus insuring that all necessary pointers get
properly redirected to new data. */
#define YYHEADROOM 2
#ifndef YYSTACKEXPANDABLE
# if (! defined __cplusplus \
|| (]b4_locations_if([[defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL \
&& ]])[defined YYSTYPE_IS_TRIVIAL && YYSTYPE_IS_TRIVIAL))
# define YYSTACKEXPANDABLE 1
# else
# define YYSTACKEXPANDABLE 0
# endif
#endif
#if YYSTACKEXPANDABLE
# define YY_RESERVE_GLRSTACK(Yystack) \
do { \
if (Yystack->yyspaceLeft < YYHEADROOM) \
yyexpandGLRStack (Yystack); \
} while (YYID (0))
#else
# define YY_RESERVE_GLRSTACK(Yystack) \
do { \
if (Yystack->yyspaceLeft < YYHEADROOM) \
yyMemoryExhausted (Yystack); \
} while (YYID (0))
#endif
#if YYERROR_VERBOSE
# 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 *
yystpcpy (char *yydest, const char *yysrc)
{
char *yyd = yydest;
const char *yys = yysrc;
while ((*yyd++ = *yys++) != '\0')
continue;
return yyd - 1;
}
# endif
# endif
# ifndef yytnamerr
/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
quotes and backslashes, so that it's suitable for yyerror. The
heuristic is that double-quoting is unnecessary unless the string
contains an apostrophe, a comma, or backslash (other than
backslash-backslash). YYSTR is taken from yytname. If YYRES is
null, do not copy; instead, return the length of what the result
would have been. */
static size_t
yytnamerr (char *yyres, const char *yystr)
{
if (*yystr == '"')
{
size_t yyn = 0;
char const *yyp = yystr;
for (;;)
switch (*++yyp)
{
case '\'':
case ',':
goto do_not_strip_quotes;
case '\\':
if (*++yyp != '\\')
goto do_not_strip_quotes;
/* Fall through. */
default:
if (yyres)
yyres[yyn] = *yyp;
yyn++;
break;
case '"':
if (yyres)
yyres[yyn] = '\0';
return yyn;
}
do_not_strip_quotes: ;
}
if (! yyres)
return strlen (yystr);
return yystpcpy (yyres, yystr) - yyres;
}
# endif
#endif /* !YYERROR_VERBOSE */
/** 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 yyGLRStateSet yyGLRStateSet;
typedef struct yySemanticOption yySemanticOption;
typedef union yyGLRStackItem yyGLRStackItem;
typedef struct yyGLRStack yyGLRStack;
struct yyGLRState {
/** Type tag: always true. */
yybool yyisState;
/** Type tag for yysemantics. If true, yysval applies, otherwise
* yyfirstVal applies. */
yybool yyresolved;
/** Number of corresponding LALR(1) machine state. */
yyStateNum yylrState;
/** Preceding state in this stack */
yyGLRState* yypred;
/** Source position of the first token produced by my symbol */
size_t yyposn;
union {
/** First in a chain of alternative reductions producing the
* non-terminal corresponding to this state, threaded through
* yynext. */
yySemanticOption* yyfirstVal;
/** Semantic value for this state. */
YYSTYPE yysval;
} yysemantics;
/** Source location for this state. */
YYLTYPE yyloc;
};
struct yyGLRStateSet {
yyGLRState** yystates;
/** During nondeterministic operation, yylookaheadNeeds tracks which
* stacks have actually needed the current lookahead. During deterministic
* operation, yylookaheadNeeds[0] is not maintained since it would merely
* duplicate yychar != YYEMPTY. */
yybool* yylookaheadNeeds;
size_t yysize, yycapacity;
};
struct yySemanticOption {
/** Type tag: always false. */
yybool yyisState;
/** Rule number for this reduction */
yyRuleNum yyrule;
/** The last RHS state in the list of states to be reduced. */
yyGLRState* yystate;
/** The lookahead for this reduction. */
int yyrawchar;
YYSTYPE yyval;
YYLTYPE yyloc;
/** Next sibling in chain of options. To facilitate merging,
* options are chained in decreasing order by address. */
yySemanticOption* yynext;
};
/** Type of the items in the GLR stack. The yyisState field
* indicates which item of the union is valid. */
union yyGLRStackItem {
yyGLRState yystate;
yySemanticOption yyoption;
};
struct yyGLRStack {
int yyerrState;
]b4_locations_if([[ /* To compute the location of the error token. */
yyGLRStackItem yyerror_range[3];]])[
]b4_pure_if(
[
int yyerrcnt;
int yyrawchar;
YYSTYPE yyval;
YYLTYPE yyloc;
])[
YYJMP_BUF yyexception_buffer;
yyGLRStackItem* yyitems;
yyGLRStackItem* yynextFree;
size_t yyspaceLeft;
yyGLRState* yysplitPoint;
yyGLRState* yylastDeleted;
yyGLRStateSet yytops;
};
#if YYSTACKEXPANDABLE
static void yyexpandGLRStack (yyGLRStack* yystackp);
#endif
static void yyFail (yyGLRStack* yystackp]b4_pure_formals[, const char* yymsg)
__attribute__ ((__noreturn__));
static void
yyFail (yyGLRStack* yystackp]b4_pure_formals[, const char* yymsg)
{
if (yymsg != NULL)
yyerror (]b4_yyerror_args[yymsg);
YYLONGJMP (yystackp->yyexception_buffer, 1);
}
static void yyMemoryExhausted (yyGLRStack* yystackp)
__attribute__ ((__noreturn__));
static void
yyMemoryExhausted (yyGLRStack* yystackp)
{
YYLONGJMP (yystackp->yyexception_buffer, 2);
}
#if YYDEBUG || YYERROR_VERBOSE
/** A printable representation of TOKEN. */
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. */
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. */
/*ARGSUSED*/ static YYRESULTTAG
yyuserAction (yyRuleNum yyn, int yyrhslen, yyGLRStackItem* yyvsp,
YYSTYPE* yyvalp,
YYLTYPE* YYOPTIONAL_LOC (yylocp),
yyGLRStack* yystackp
]b4_user_formals[)
{
yybool yynormal __attribute__ ((__unused__)) =
(yystackp->yysplitPoint == NULL);
int yylow;
]b4_parse_param_use[]dnl
[# undef yyerrok
# define yyerrok (yystackp->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() (yystackp->yyerrState != 0)
# undef yyclearin
# define yyclearin (yychar = YYEMPTY)
# undef YYFILL
# define YYFILL(N) yyfill (yyvsp, &yylow, N, yynormal)
# undef YYBACKUP
# define YYBACKUP(Token, Value) \
return yyerror (]b4_yyerror_args[YY_("syntax error: cannot back up")), \
yyerrok, yyerr
yylow = 1;
if (yyrhslen == 0)
*yyvalp = yyval_default;
else
*yyvalp = yyvsp[YYFILL (1-yyrhslen)].yystate.yysemantics.yysval;
YYLLOC_DEFAULT ((*yylocp), (yyvsp - yyrhslen), yyrhslen);
]b4_locations_if([[ yystackp->yyerror_range[1].yystate.yyloc = *yylocp;
]])[
switch (yyn)
{
]b4_user_actions[
default: break;
}
return yyok;
# undef yyerrok
# undef YYABORT
# undef YYACCEPT
# undef YYERROR
# undef YYBACKUP
# undef yyclearin
# undef YYRECOVERING
}
/*ARGSUSED*/ static void
yyuserMerge (int yyn, YYSTYPE* yy0, YYSTYPE* yy1)
{
YYUSE (yy0);
YYUSE (yy1);
switch (yyn)
{
]b4_mergers[
default: break;
}
}
/* 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];
}
static void
yydestroyGLRState (char const *yymsg, yyGLRState *yys]b4_user_formals[)
{
if (yys->yyresolved)
yydestruct (yymsg, yystos[yys->yylrState],
&yys->yysemantics.yysval]b4_locations_if([, &yys->yyloc])[]b4_user_args[);
else
{
#if YYDEBUG
if (yydebug)
{
if (yys->yysemantics.yyfirstVal)
YYFPRINTF (stderr, "%s unresolved ", yymsg);
else
YYFPRINTF (stderr, "%s incomplete ", yymsg);
yy_symbol_print (stderr, yystos[yys->yylrState],
NULL]b4_locations_if([, &yys->yyloc])[]b4_user_args[);
YYFPRINTF (stderr, "\n");
}
#endif
if (yys->yysemantics.yyfirstVal)
{
yySemanticOption *yyoption = yys->yysemantics.yyfirstVal;
yyGLRState *yyrh;
int yyn;
for (yyrh = yyoption->yystate, yyn = yyrhsLength (yyoption->yyrule);
yyn > 0;
yyrh = yyrh->yypred, yyn -= 1)
yydestroyGLRState (yymsg, yyrh]b4_user_args[);
}
}
}
/** 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],
[YYID (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 */
/** Return a fresh GLRStackItem. Callers should call
* YY_RESERVE_GLRSTACK afterwards to make sure there is sufficient
* headroom. */
static inline yyGLRStackItem*
yynewGLRStackItem (yyGLRStack* yystackp, yybool yyisState)
{
yyGLRStackItem* yynewItem = yystackp->yynextFree;
yystackp->yyspaceLeft -= 1;
yystackp->yynextFree += 1;
yynewItem->yystate.yyisState = yyisState;
return yynewItem;
}
/** Add a new semantic action that will execute the action for rule
* RULENUM on the semantic values in RHS to the list of
* alternative actions for STATE. Assumes that RHS comes from
* stack #K of *STACKP. */
static void
yyaddDeferredAction (yyGLRStack* yystackp, size_t yyk, yyGLRState* yystate,
yyGLRState* rhs, yyRuleNum yyrule)
{
yySemanticOption* yynewOption =
&yynewGLRStackItem (yystackp, yyfalse)->yyoption;
yynewOption->yystate = rhs;
yynewOption->yyrule = yyrule;
if (yystackp->yytops.yylookaheadNeeds[yyk])
{
yynewOption->yyrawchar = yychar;
yynewOption->yyval = yylval;
yynewOption->yyloc = yylloc;
}
else
yynewOption->yyrawchar = YYEMPTY;
yynewOption->yynext = yystate->yysemantics.yyfirstVal;
yystate->yysemantics.yyfirstVal = yynewOption;
YY_RESERVE_GLRSTACK (yystackp);
}
/* GLRStacks */
/** Initialize SET to a singleton set containing an empty stack. */
static yybool
yyinitStateSet (yyGLRStateSet* yyset)
{
yyset->yysize = 1;
yyset->yycapacity = 16;
yyset->yystates = (yyGLRState**) YYMALLOC (16 * sizeof yyset->yystates[0]);
if (! yyset->yystates)
return yyfalse;
yyset->yystates[0] = NULL;
yyset->yylookaheadNeeds =
(yybool*) YYMALLOC (16 * sizeof yyset->yylookaheadNeeds[0]);
if (! yyset->yylookaheadNeeds)
{
YYFREE (yyset->yystates);
return yyfalse;
}
return yytrue;
}
static void yyfreeStateSet (yyGLRStateSet* yyset)
{
YYFREE (yyset->yystates);
YYFREE (yyset->yylookaheadNeeds);
}
/** Initialize STACK to a single empty stack, with total maximum
* capacity for all stacks of SIZE. */
static yybool
yyinitGLRStack (yyGLRStack* yystackp, size_t yysize)
{
yystackp->yyerrState = 0;
yynerrs = 0;
yystackp->yyspaceLeft = yysize;
yystackp->yyitems =
(yyGLRStackItem*) YYMALLOC (yysize * sizeof yystackp->yynextFree[0]);
if (!yystackp->yyitems)
return yyfalse;
yystackp->yynextFree = yystackp->yyitems;
yystackp->yysplitPoint = NULL;
yystackp->yylastDeleted = NULL;
return yyinitStateSet (&yystackp->yytops);
}
#if YYSTACKEXPANDABLE
# 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* yystackp)
{
yyGLRStackItem* yynewItems;
yyGLRStackItem* yyp0, *yyp1;
size_t yysize, yynewSize;
size_t yyn;
yysize = yystackp->yynextFree - yystackp->yyitems;
if (YYMAXDEPTH - YYHEADROOM < yysize)
yyMemoryExhausted (yystackp);
yynewSize = 2*yysize;
if (YYMAXDEPTH < yynewSize)
yynewSize = YYMAXDEPTH;
yynewItems = (yyGLRStackItem*) YYMALLOC (yynewSize * sizeof yynewItems[0]);
if (! yynewItems)
yyMemoryExhausted (yystackp);
for (yyp0 = yystackp->yyitems, yyp1 = yynewItems, 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 (yystackp->yysplitPoint != NULL)
yystackp->yysplitPoint = YYRELOC (yystackp->yyitems, yynewItems,
yystackp->yysplitPoint, yystate);
for (yyn = 0; yyn < yystackp->yytops.yysize; yyn += 1)
if (yystackp->yytops.yystates[yyn] != NULL)
yystackp->yytops.yystates[yyn] =
YYRELOC (yystackp->yyitems, yynewItems,
yystackp->yytops.yystates[yyn], yystate);
YYFREE (yystackp->yyitems);
yystackp->yyitems = yynewItems;
yystackp->yynextFree = yynewItems + yysize;
yystackp->yyspaceLeft = yynewSize - yysize;
}
#endif
static void
yyfreeGLRStack (yyGLRStack* yystackp)
{
YYFREE (yystackp->yyitems);
yyfreeStateSet (&yystackp->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* yystackp, yyGLRState* yys)
{
if (yystackp->yysplitPoint != NULL && yystackp->yysplitPoint > yys)
yystackp->yysplitPoint = yys;
}
/** Invalidate stack #K in STACK. */
static inline void
yymarkStackDeleted (yyGLRStack* yystackp, size_t yyk)
{
if (yystackp->yytops.yystates[yyk] != NULL)
yystackp->yylastDeleted = yystackp->yytops.yystates[yyk];
yystackp->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* yystackp)
{
if (yystackp->yylastDeleted == NULL || yystackp->yytops.yysize != 0)
return;
yystackp->yytops.yystates[0] = yystackp->yylastDeleted;
yystackp->yytops.yysize = 1;
YYDPRINTF ((stderr, "Restoring last deleted stack as stack #0.\n"));
yystackp->yylastDeleted = NULL;
}
static inline void
yyremoveDeletes (yyGLRStack* yystackp)
{
size_t yyi, yyj;
yyi = yyj = 0;
while (yyj < yystackp->yytops.yysize)
{
if (yystackp->yytops.yystates[yyi] == NULL)
{
if (yyi == yyj)
{
YYDPRINTF ((stderr, "Removing dead stacks.\n"));
}
yystackp->yytops.yysize -= 1;
}
else
{
yystackp->yytops.yystates[yyj] = yystackp->yytops.yystates[yyi];
/* In the current implementation, it's unnecessary to copy
yystackp->yytops.yylookaheadNeeds[yyi] since, after
yyremoveDeletes returns, the parser immediately either enters
deterministic operation or shifts a token. However, it doesn't
hurt, and the code might evolve to need it. */
yystackp->yytops.yylookaheadNeeds[yyj] =
yystackp->yytops.yylookaheadNeeds[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* yystackp, size_t yyk, yyStateNum yylrState,
size_t yyposn,
YYSTYPE* yyvalp, YYLTYPE* yylocp)
{
yyGLRState* yynewState = &yynewGLRStackItem (yystackp, yytrue)->yystate;
yynewState->yylrState = yylrState;
yynewState->yyposn = yyposn;
yynewState->yyresolved = yytrue;
yynewState->yypred = yystackp->yytops.yystates[yyk];
yynewState->yysemantics.yysval = *yyvalp;
yynewState->yyloc = *yylocp;
yystackp->yytops.yystates[yyk] = yynewState;
YY_RESERVE_GLRSTACK (yystackp);
}
/** 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* yystackp, size_t yyk, yyStateNum yylrState,
size_t yyposn, yyGLRState* rhs, yyRuleNum yyrule)
{
yyGLRState* yynewState = &yynewGLRStackItem (yystackp, yytrue)->yystate;
yynewState->yylrState = yylrState;
yynewState->yyposn = yyposn;
yynewState->yyresolved = yyfalse;
yynewState->yypred = yystackp->yytops.yystates[yyk];
yynewState->yysemantics.yyfirstVal = NULL;
yystackp->yytops.yystates[yyk] = yynewState;
/* Invokes YY_RESERVE_GLRSTACK. */
yyaddDeferredAction (yystackp, yyk, yynewState, rhs, yyrule);
}
/** 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* yystackp, size_t yyk, yyRuleNum yyrule,
YYSTYPE* yyvalp, YYLTYPE* yylocp]b4_user_formals[)
{
int yynrhs = yyrhsLength (yyrule);
if (yystackp->yysplitPoint == NULL)
{
/* Standard special case: single stack. */
yyGLRStackItem* rhs = (yyGLRStackItem*) yystackp->yytops.yystates[yyk];
YYASSERT (yyk == 0);
yystackp->yynextFree -= yynrhs;
yystackp->yyspaceLeft += yynrhs;
yystackp->yytops.yystates[0] = & yystackp->yynextFree[-1].yystate;
return yyuserAction (yyrule, yynrhs, rhs,
yyvalp, yylocp, yystackp]b4_user_args[);
}
else
{
/* At present, doAction is never called in nondeterministic
* mode, so this branch is never taken. It is here in
* anticipation of a future feature that will allow immediate
* evaluation of selected actions in nondeterministic mode. */
int yyi;
yyGLRState* yys;
yyGLRStackItem yyrhsVals[YYMAXRHS + YYMAXLEFT + 1];
yys = yyrhsVals[YYMAXRHS + YYMAXLEFT].yystate.yypred
= yystackp->yytops.yystates[yyk];]b4_locations_if([[
if (yynrhs == 0)
/* Set default location. */
yyrhsVals[YYMAXRHS + YYMAXLEFT - 1].yystate.yyloc = yys->yyloc;]])[
for (yyi = 0; yyi < yynrhs; yyi += 1)
{
yys = yys->yypred;
YYASSERT (yys);
}
yyupdateSplit (yystackp, yys);
yystackp->yytops.yystates[yyk] = yys;
return yyuserAction (yyrule, yynrhs, yyrhsVals + YYMAXRHS + YYMAXLEFT - 1,
yyvalp, yylocp, yystackp]b4_user_args[);
}
}
#if !YYDEBUG
# define YY_REDUCE_PRINT(Args)
#else
# define YY_REDUCE_PRINT(Args) \
do { \
if (yydebug) \
yy_reduce_print Args; \
} while (YYID (0))
/*----------------------------------------------------------.
| Report that the RULE is going to be reduced on stack #K. |
`----------------------------------------------------------*/
/*ARGSUSED*/ static inline void
yy_reduce_print (yyGLRStack* yystackp, size_t yyk, yyRuleNum yyrule,
YYSTYPE* yyvalp, YYLTYPE* yylocp]b4_user_formals[)
{
int yynrhs = yyrhsLength (yyrule);
yybool yynormal __attribute__ ((__unused__)) =
(yystackp->yysplitPoint == NULL);
yyGLRStackItem* yyvsp = (yyGLRStackItem*) yystackp->yytops.yystates[yyk];
int yylow = 1;
int yyi;
YYUSE (yyvalp);
YYUSE (yylocp);
]b4_parse_param_use[]dnl
[ YYFPRINTF (stderr, "Reducing stack %lu by rule %d (line %lu):\n",
(unsigned long int) yyk, yyrule - 1,
(unsigned long int) yyrline[yyrule]);
/* The symbols being reduced. */
for (yyi = 0; yyi < yynrhs; yyi++)
{
YYFPRINTF (stderr, " $%d = ", yyi + 1);
yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
&]b4_rhs_value(yynrhs, yyi + 1)[
]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl
b4_user_args[);
YYFPRINTF (stderr, "\n");
}
}
#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* yystackp, size_t yyk, yyRuleNum yyrule,
yybool yyforceEval]b4_user_formals[)
{
size_t yyposn = yystackp->yytops.yystates[yyk]->yyposn;
if (yyforceEval || yystackp->yysplitPoint == NULL)
{
YYSTYPE yysval;
YYLTYPE yyloc;
YY_REDUCE_PRINT ((yystackp, yyk, yyrule, &yysval, &yyloc]b4_user_args[));
YYCHK (yydoAction (yystackp, yyk, yyrule, &yysval,
&yyloc]b4_user_args[));
YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyrule], &yysval, &yyloc);
yyglrShift (yystackp, yyk,
yyLRgotoState (yystackp->yytops.yystates[yyk]->yylrState,
yylhsNonterm (yyrule)),
yyposn, &yysval, &yyloc);
}
else
{
size_t yyi;
int yyn;
yyGLRState* yys, *yys0 = yystackp->yytops.yystates[yyk];
yyStateNum yynewLRState;
for (yys = yystackp->yytops.yystates[yyk], yyn = yyrhsLength (yyrule);
0 < yyn; yyn -= 1)
{
yys = yys->yypred;
YYASSERT (yys);
}
yyupdateSplit (yystackp, 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 < yystackp->yytops.yysize; yyi += 1)
if (yyi != yyk && yystackp->yytops.yystates[yyi] != NULL)
{
yyGLRState* yyp, *yysplit = yystackp->yysplitPoint;
yyp = yystackp->yytops.yystates[yyi];
while (yyp != yys && yyp != yysplit && yyp->yyposn >= yyposn)
{
if (yyp->yylrState == yynewLRState && yyp->yypred == yys)
{
yyaddDeferredAction (yystackp, yyk, yyp, yys0, yyrule);
yymarkStackDeleted (yystackp, yyk);
YYDPRINTF ((stderr, "Merging stack %lu into stack %lu.\n",
(unsigned long int) yyk,
(unsigned long int) yyi));
return yyok;
}
yyp = yyp->yypred;
}
}
yystackp->yytops.yystates[yyk] = yys;
yyglrShiftDefer (yystackp, yyk, yynewLRState, yyposn, yys0, yyrule);
}
return yyok;
}
static size_t
yysplitStack (yyGLRStack* yystackp, size_t yyk)
{
if (yystackp->yysplitPoint == NULL)
{
YYASSERT (yyk == 0);
yystackp->yysplitPoint = yystackp->yytops.yystates[yyk];
}
if (yystackp->yytops.yysize >= yystackp->yytops.yycapacity)
{
yyGLRState** yynewStates;
yybool* yynewLookaheadNeeds;
yynewStates = NULL;
if (yystackp->yytops.yycapacity
> (YYSIZEMAX / (2 * sizeof yynewStates[0])))
yyMemoryExhausted (yystackp);
yystackp->yytops.yycapacity *= 2;
yynewStates =
(yyGLRState**) YYREALLOC (yystackp->yytops.yystates,
(yystackp->yytops.yycapacity
* sizeof yynewStates[0]));
if (yynewStates == NULL)
yyMemoryExhausted (yystackp);
yystackp->yytops.yystates = yynewStates;
yynewLookaheadNeeds =
(yybool*) YYREALLOC (yystackp->yytops.yylookaheadNeeds,
(yystackp->yytops.yycapacity
* sizeof yynewLookaheadNeeds[0]));
if (yynewLookaheadNeeds == NULL)
yyMemoryExhausted (yystackp);
yystackp->yytops.yylookaheadNeeds = yynewLookaheadNeeds;
}
yystackp->yytops.yystates[yystackp->yytops.yysize]
= yystackp->yytops.yystates[yyk];
yystackp->yytops.yylookaheadNeeds[yystackp->yytops.yysize]
= yystackp->yytops.yylookaheadNeeds[yyk];
yystackp->yytops.yysize += 1;
return yystackp->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 and 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 = yytrue;
yys1->yysemantics.yysval = yys0->yysemantics.yysval;
}
else if (yys1->yyresolved)
{
yys0->yyresolved = yytrue;
yys0->yysemantics.yysval = yys1->yysemantics.yysval;
}
else
{
yySemanticOption** yyz0p;
yySemanticOption* yyz1;
yyz0p = &yys0->yysemantics.yyfirstVal;
yyz1 = yys1->yysemantics.yyfirstVal;
while (YYID (yytrue))
{
if (yyz1 == *yyz0p || yyz1 == NULL)
break;
else if (*yyz0p == NULL)
{
*yyz0p = yyz1;
break;
}
else if (*yyz0p < yyz1)
{
yySemanticOption* yyz = *yyz0p;
*yyz0p = yyz1;
yyz1 = yyz1->yynext;
(*yyz0p)->yynext = yyz;
}
yyz0p = &(*yyz0p)->yynext;
}
yys1->yysemantics.yyfirstVal = yys0->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 (yyGLRState* yys,
yyGLRStack* yystackp]b4_user_formals[);
/** Resolve the previous N states starting at and including state S. If result
* != yyok, some states may have been left unresolved possibly with empty
* semantic option chains. Regardless of whether result = yyok, each state
* has been left with consistent data so that yydestroyGLRState can be invoked
* if necessary. */
static YYRESULTTAG
yyresolveStates (yyGLRState* yys, int yyn,
yyGLRStack* yystackp]b4_user_formals[)
{
if (0 < yyn)
{
YYASSERT (yys->yypred);
YYCHK (yyresolveStates (yys->yypred, yyn-1, yystackp]b4_user_args[));
if (! yys->yyresolved)
YYCHK (yyresolveValue (yys, yystackp]b4_user_args[));
}
return yyok;
}
/** Resolve the states for the RHS of OPT, perform its user action, and return
* the semantic value and location. Regardless of whether result = yyok, all
* RHS states have been destroyed (assuming the user action destroys all RHS
* semantic values if invoked). */
static YYRESULTTAG
yyresolveAction (yySemanticOption* yyopt, yyGLRStack* yystackp,
YYSTYPE* yyvalp, YYLTYPE* yylocp]b4_user_formals[)
{
yyGLRStackItem yyrhsVals[YYMAXRHS + YYMAXLEFT + 1];
int yynrhs;
int yychar_current;
YYSTYPE yylval_current;
YYLTYPE yylloc_current;
YYRESULTTAG yyflag;
yynrhs = yyrhsLength (yyopt->yyrule);
yyflag = yyresolveStates (yyopt->yystate, yynrhs, yystackp]b4_user_args[);
if (yyflag != yyok)
{
yyGLRState *yys;
for (yys = yyopt->yystate; yynrhs > 0; yys = yys->yypred, yynrhs -= 1)
yydestroyGLRState ("Cleanup: popping", yys]b4_user_args[);
return yyflag;
}
yyrhsVals[YYMAXRHS + YYMAXLEFT].yystate.yypred = yyopt->yystate;]b4_locations_if([[
if (yynrhs == 0)
/* Set default location. */
yyrhsVals[YYMAXRHS + YYMAXLEFT - 1].yystate.yyloc = yyopt->yystate->yyloc;]])[
yychar_current = yychar;
yylval_current = yylval;
yylloc_current = yylloc;
yychar = yyopt->yyrawchar;
yylval = yyopt->yyval;
yylloc = yyopt->yyloc;
yyflag = yyuserAction (yyopt->yyrule, yynrhs,
yyrhsVals + YYMAXRHS + YYMAXLEFT - 1,
yyvalp, yylocp, yystackp]b4_user_args[);
yychar = yychar_current;
yylval = yylval_current;
yylloc = yylloc_current;
return yyflag;
}
#if YYDEBUG
static void
yyreportTree (yySemanticOption* yyx, int yyindent)
{
int yynrhs = yyrhsLength (yyx->yyrule);
int yyi;
yyGLRState* yys;
yyGLRState* yystates[1 + 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 - 1);
else
YYFPRINTF (stderr, "%*s%s -> \n",
yyindent, "", yytokenName (yylhsNonterm (yyx->yyrule)),
yyx->yyrule - 1, (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
/*ARGSUSED*/ static YYRESULTTAG
yyreportAmbiguity (yySemanticOption* yyx0,
yySemanticOption* yyx1]b4_pure_formals[)
{
YYUSE (yyx0);
YYUSE (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
yyerror (]b4_yyerror_args[YY_("syntax is ambiguous"));
return yyabort;
}
/** Starting at and including state S1, resolve the location for each of the
* previous N1 states that is unresolved. The first semantic option of a state
* is always chosen. */
static void
yyresolveLocations (yyGLRState* yys1, int yyn1,
yyGLRStack *yystackp]b4_user_formals[)
{
if (0 < yyn1)
{
yyresolveLocations (yys1->yypred, yyn1 - 1, yystackp]b4_user_args[);
if (!yys1->yyresolved)
{
yySemanticOption *yyoption;
yyGLRStackItem yyrhsloc[1 + YYMAXRHS];
int yynrhs;
int yychar_current;
YYSTYPE yylval_current;
YYLTYPE yylloc_current;
yyoption = yys1->yysemantics.yyfirstVal;
YYASSERT (yyoption != NULL);
yynrhs = yyrhsLength (yyoption->yyrule);
if (yynrhs > 0)
{
yyGLRState *yys;
int yyn;
yyresolveLocations (yyoption->yystate, yynrhs,
yystackp]b4_user_args[);
for (yys = yyoption->yystate, yyn = yynrhs;
yyn > 0;
yys = yys->yypred, yyn -= 1)
yyrhsloc[yyn].yystate.yyloc = yys->yyloc;
}
else
{
/* Both yyresolveAction and yyresolveLocations traverse the GSS
in reverse rightmost order. It is only necessary to invoke
yyresolveLocations on a subforest for which yyresolveAction
would have been invoked next had an ambiguity not been
detected. Thus the location of the previous state (but not
necessarily the previous state itself) is guaranteed to be
resolved already. */
yyGLRState *yyprevious = yyoption->yystate;
yyrhsloc[0].yystate.yyloc = yyprevious->yyloc;
}
yychar_current = yychar;
yylval_current = yylval;
yylloc_current = yylloc;
yychar = yyoption->yyrawchar;
yylval = yyoption->yyval;
yylloc = yyoption->yyloc;
YYLLOC_DEFAULT ((yys1->yyloc), yyrhsloc, yynrhs);
yychar = yychar_current;
yylval = yylval_current;
yylloc = yylloc_current;
}
}
}
/** Resolve the ambiguity represented in state S, perform the indicated
* actions, and set the semantic value of S. If result != yyok, the chain of
* semantic options in S has been cleared instead or it has been left
* unmodified except that redundant options may have been removed. Regardless
* of whether result = yyok, S has been left with consistent data so that
* yydestroyGLRState can be invoked if necessary. */
static YYRESULTTAG
yyresolveValue (yyGLRState* yys, yyGLRStack* yystackp]b4_user_formals[)
{
yySemanticOption* yyoptionList = yys->yysemantics.yyfirstVal;
yySemanticOption* yybest;
yySemanticOption** yypp;
yybool yymerge;
YYSTYPE yysval;
YYRESULTTAG yyflag;
YYLTYPE *yylocp = &yys->yyloc;
yybest = yyoptionList;
yymerge = yyfalse;
for (yypp = &yyoptionList->yynext; *yypp != NULL; )
{
yySemanticOption* yyp = *yypp;
if (yyidenticalOptions (yybest, yyp))
{
yymergeOptionSets (yybest, yyp);
*yypp = yyp->yynext;
}
else
{
switch (yypreference (yybest, yyp))
{
case 0:
yyresolveLocations (yys, 1, yystackp]b4_user_args[);
return yyreportAmbiguity (yybest, yyp]b4_pure_args[);
break;
case 1:
yymerge = yytrue;
break;
case 2:
break;
case 3:
yybest = yyp;
yymerge = yyfalse;
break;
default:
/* This cannot happen so it is not worth a YYASSERT (yyfalse),
but some compilers complain if the default case is
omitted. */
break;
}
yypp = &yyp->yynext;
}
}
if (yymerge)
{
yySemanticOption* yyp;
int yyprec = yydprec[yybest->yyrule];
yyflag = yyresolveAction (yybest, yystackp, &yysval,
yylocp]b4_user_args[);
if (yyflag == yyok)
for (yyp = yybest->yynext; yyp != NULL; yyp = yyp->yynext)
{
if (yyprec == yydprec[yyp->yyrule])
{
YYSTYPE yysval_other;
YYLTYPE yydummy;
yyflag = yyresolveAction (yyp, yystackp, &yysval_other,
&yydummy]b4_user_args[);
if (yyflag != yyok)
{
yydestruct ("Cleanup: discarding incompletely merged value for",
yystos[yys->yylrState],
&yysval]b4_locations_if([, yylocp])[]b4_user_args[);
break;
}
yyuserMerge (yymerger[yyp->yyrule], &yysval, &yysval_other);
}
}
}
else
yyflag = yyresolveAction (yybest, yystackp, &yysval, yylocp]b4_user_args[);
if (yyflag == yyok)
{
yys->yyresolved = yytrue;
yys->yysemantics.yysval = yysval;
}
else
yys->yysemantics.yyfirstVal = NULL;
return yyflag;
}
static YYRESULTTAG
yyresolveStack (yyGLRStack* yystackp]b4_user_formals[)
{
if (yystackp->yysplitPoint != NULL)
{
yyGLRState* yys;
int yyn;
for (yyn = 0, yys = yystackp->yytops.yystates[0];
yys != yystackp->yysplitPoint;
yys = yys->yypred, yyn += 1)
continue;
YYCHK (yyresolveStates (yystackp->yytops.yystates[0], yyn, yystackp
]b4_user_args[));
}
return yyok;
}
static void
yycompressStack (yyGLRStack* yystackp)
{
yyGLRState* yyp, *yyq, *yyr;
if (yystackp->yytops.yysize != 1 || yystackp->yysplitPoint == NULL)
return;
for (yyp = yystackp->yytops.yystates[0], yyq = yyp->yypred, yyr = NULL;
yyp != yystackp->yysplitPoint;
yyr = yyp, yyp = yyq, yyq = yyp->yypred)
yyp->yypred = yyr;
yystackp->yyspaceLeft += yystackp->yynextFree - yystackp->yyitems;
yystackp->yynextFree = ((yyGLRStackItem*) yystackp->yysplitPoint) + 1;
yystackp->yyspaceLeft -= yystackp->yynextFree - yystackp->yyitems;
yystackp->yysplitPoint = NULL;
yystackp->yylastDeleted = NULL;
while (yyr != NULL)
{
yystackp->yynextFree->yystate = *yyr;
yyr = yyr->yypred;
yystackp->yynextFree->yystate.yypred = &yystackp->yynextFree[-1].yystate;
yystackp->yytops.yystates[0] = &yystackp->yynextFree->yystate;
yystackp->yynextFree += 1;
yystackp->yyspaceLeft -= 1;
}
}
static YYRESULTTAG
yyprocessOneStack (yyGLRStack* yystackp, size_t yyk,
size_t yyposn]b4_pure_formals[)
{
int yyaction;
const short int* yyconflicts;
yyRuleNum yyrule;
while (yystackp->yytops.yystates[yyk] != NULL)
{
yyStateNum yystate = yystackp->yytops.yystates[yyk]->yylrState;
YYDPRINTF ((stderr, "Stack %lu Entering state %d\n",
(unsigned long int) yyk, yystate));
YYASSERT (yystate != YYFINAL);
if (yyisDefaultedState (yystate))
{
yyrule = yydefaultAction (yystate);
if (yyrule == 0)
{
YYDPRINTF ((stderr, "Stack %lu dies.\n",
(unsigned long int) yyk));
yymarkStackDeleted (yystackp, yyk);
return yyok;
}
YYCHK (yyglrReduce (yystackp, yyk, yyrule, yyfalse]b4_user_args[));
}
else
{
yySymbol yytoken;
yystackp->yytops.yylookaheadNeeds[yyk] = yytrue;
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);
YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
}
yygetLRActions (yystate, yytoken, &yyaction, &yyconflicts);
while (*yyconflicts != 0)
{
size_t yynewStack = yysplitStack (yystackp, yyk);
YYDPRINTF ((stderr, "Splitting off stack %lu from %lu.\n",
(unsigned long int) yynewStack,
(unsigned long int) yyk));
YYCHK (yyglrReduce (yystackp, yynewStack,
*yyconflicts, yyfalse]b4_user_args[));
YYCHK (yyprocessOneStack (yystackp, yynewStack,
yyposn]b4_pure_args[));
yyconflicts += 1;
}
if (yyisShiftAction (yyaction))
break;
else if (yyisErrorAction (yyaction))
{
YYDPRINTF ((stderr, "Stack %lu dies.\n",
(unsigned long int) yyk));
yymarkStackDeleted (yystackp, yyk);
break;
}
else
YYCHK (yyglrReduce (yystackp, yyk, -yyaction,
yyfalse]b4_user_args[));
}
}
return yyok;
}
/*ARGSUSED*/ static void
yyreportSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
{
if (yystackp->yyerrState == 0)
{
#if YYERROR_VERBOSE
int yyn;
yyn = yypact[yystackp->yytops.yystates[0]->yylrState];
if (YYPACT_NINF < yyn && yyn <= YYLAST)
{
yySymbol yytoken = YYTRANSLATE (yychar);
size_t yysize0 = yytnamerr (NULL, yytokenName (yytoken));
size_t yysize = yysize0;
size_t yysize1;
yybool yysize_overflow = yyfalse;
char* yymsg = NULL;
enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
int yyx;
char *yyfmt;
char const *yyf;
static char const yyunexpected[] = "syntax error, unexpected %s";
static char const yyexpecting[] = ", expecting %s";
static char const yyor[] = " or %s";
char yyformat[sizeof yyunexpected
+ sizeof yyexpecting - 1
+ ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
* (sizeof yyor - 1))];
char const *yyprefix = yyexpecting;
/* 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 + 1;
int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
int yycount = 1;
yyarg[0] = yytokenName (yytoken);
yyfmt = yystpcpy (yyformat, yyunexpected);
for (yyx = yyxbegin; yyx < yyxend; ++yyx)
if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
{
if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
{
yycount = 1;
yysize = yysize0;
yyformat[sizeof yyunexpected - 1] = '\0';
break;
}
yyarg[yycount++] = yytokenName (yyx);
yysize1 = yysize + yytnamerr (NULL, yytokenName (yyx));
yysize_overflow |= yysize1 < yysize;
yysize = yysize1;
yyfmt = yystpcpy (yyfmt, yyprefix);
yyprefix = yyor;
}
yyf = YY_(yyformat);
yysize1 = yysize + strlen (yyf);
yysize_overflow |= yysize1 < yysize;
yysize = yysize1;
if (!yysize_overflow)
yymsg = (char *) YYMALLOC (yysize);
if (yymsg)
{
char *yyp = yymsg;
int yyi = 0;
while ((*yyp = *yyf))
{
if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
{
yyp += yytnamerr (yyp, yyarg[yyi++]);
yyf += 2;
}
else
{
yyp++;
yyf++;
}
}
yyerror (]b4_lyyerror_args[yymsg);
YYFREE (yymsg);
}
else
{
yyerror (]b4_lyyerror_args[YY_("syntax error"));
yyMemoryExhausted (yystackp);
}
}
else
#endif /* YYERROR_VERBOSE */
yyerror (]b4_lyyerror_args[YY_("syntax error"));
yynerrs += 1;
}
}
/* Recover from a syntax error on *YYSTACKP, assuming that *YYSTACKP->YYTOKENP,
yylval, and yylloc are the syntactic category, semantic value, and location
of the lookahead. */
/*ARGSUSED*/ static void
yyrecoverSyntaxError (yyGLRStack* yystackp]b4_user_formals[)
{
size_t yyk;
int yyj;
if (yystackp->yyerrState == 3)
/* We just shifted the error token and (perhaps) took some
reductions. Skip tokens until we can proceed. */
while (YYID (yytrue))
{
yySymbol yytoken;
if (yychar == YYEOF)
yyFail (yystackp][]b4_lpure_args[, NULL);
if (yychar != YYEMPTY)
{]b4_locations_if([[
/* We throw away the lookahead, but the error range
of the shifted error token must take it into account. */
yyGLRState *yys = yystackp->yytops.yystates[0];
yyGLRStackItem yyerror_range[3];
yyerror_range[1].yystate.yyloc = yys->yyloc;
yyerror_range[2].yystate.yyloc = yylloc;
YYLLOC_DEFAULT ((yys->yyloc), yyerror_range, 2);]])[
yytoken = YYTRANSLATE (yychar);
yydestruct ("Error: discarding",
yytoken, &yylval]b4_locations_if([, &yylloc])[]b4_user_args[);
}
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);
YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
}
yyj = yypact[yystackp->yytops.yystates[0]->yylrState];
if (yyis_pact_ninf (yyj))
return;
yyj += yytoken;
if (yyj < 0 || YYLAST < yyj || yycheck[yyj] != yytoken)
{
if (yydefact[yystackp->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 < yystackp->yytops.yysize; yyk += 1)
if (yystackp->yytops.yystates[yyk] != NULL)
break;
if (yyk >= yystackp->yytops.yysize)
yyFail (yystackp][]b4_lpure_args[, NULL);
for (yyk += 1; yyk < yystackp->yytops.yysize; yyk += 1)
yymarkStackDeleted (yystackp, yyk);
yyremoveDeletes (yystackp);
yycompressStack (yystackp);
/* Now pop stack until we find a state that shifts the error token. */
yystackp->yyerrState = 3;
while (yystackp->yytops.yystates[0] != NULL)
{
yyGLRState *yys = yystackp->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]))
{
/* Shift the error token having adjusted its location. */
YYLTYPE yyerrloc;]b4_locations_if([[
yystackp->yyerror_range[2].yystate.yyloc = yylloc;
YYLLOC_DEFAULT (yyerrloc, (yystackp->yyerror_range), 2);]])[
YY_SYMBOL_PRINT ("Shifting", yystos[yytable[yyj]],
&yylval, &yyerrloc);
yyglrShift (yystackp, 0, yytable[yyj],
yys->yyposn, &yylval, &yyerrloc);
yys = yystackp->yytops.yystates[0];
break;
}
}
]b4_locations_if([[ yystackp->yyerror_range[1].yystate.yyloc = yys->yyloc;]])[
if (yys->yypred != NULL)
yydestroyGLRState ("Error: popping", yys]b4_user_args[);
yystackp->yytops.yystates[0] = yys->yypred;
yystackp->yynextFree -= 1;
yystackp->yyspaceLeft += 1;
}
if (yystackp->yytops.yystates[0] == NULL)
yyFail (yystackp][]b4_lpure_args[, NULL);
}
#define YYCHK1(YYE) \
do { \
switch (YYE) { \
case yyok: \
break; \
case yyabort: \
goto yyabortlab; \
case yyaccept: \
goto yyacceptlab; \
case yyerr: \
goto yyuser_error; \
default: \
goto yybuglab; \
} \
} while (YYID (0))
/*----------.
| yyparse. |
`----------*/
]b4_c_ansi_function_def([yyparse], [int], b4_parse_param)[
{
int yyresult;
yyGLRStack yystack;
yyGLRStack* const yystackp = &yystack;
size_t yyposn;
YYDPRINTF ((stderr, "Starting parse\n"));
yychar = YYEMPTY;
yylval = yyval_default;
]b4_locations_if([
#if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
yylloc.first_line = yylloc.last_line = ]b4_location_initial_line[;
yylloc.first_column = yylloc.last_column = ]b4_location_initial_column[;
#endif
])
m4_ifdef([b4_initial_action], [
m4_pushdef([b4_at_dollar], [yylloc])dnl
m4_pushdef([b4_dollar_dollar], [yylval])dnl
/* User initialization code. */
b4_user_initial_action
m4_popdef([b4_dollar_dollar])dnl
m4_popdef([b4_at_dollar])])dnl
[
if (! yyinitGLRStack (yystackp, YYINITDEPTH))
goto yyexhaustedlab;
switch (YYSETJMP (yystack.yyexception_buffer))
{
case 0: break;
case 1: goto yyabortlab;
case 2: goto yyexhaustedlab;
default: goto yybuglab;
}
yyglrShift (&yystack, 0, 0, 0, &yylval, &yylloc);
yyposn = 0;
while (YYID (yytrue))
{
/* For efficiency, we have two loops, the first of which is
specialized to deterministic operation (single stack, no
potential ambiguity). */
/* Standard mode */
while (YYID (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 yyacceptlab;
if (yyisDefaultedState (yystate))
{
yyrule = yydefaultAction (yystate);
if (yyrule == 0)
{
]b4_locations_if([[ yystack.yyerror_range[1].yystate.yyloc = yylloc;]])[
yyreportSyntaxError (&yystack]b4_user_args[);
goto yyuser_error;
}
YYCHK1 (yyglrReduce (&yystack, 0, yyrule, yytrue]b4_user_args[));
}
else
{
yySymbol yytoken;
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);
YY_SYMBOL_PRINT ("Next token is", yytoken, &yylval, &yylloc);
}
yygetLRActions (yystate, yytoken, &yyaction, &yyconflicts);
if (*yyconflicts != 0)
break;
if (yyisShiftAction (yyaction))
{
YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
yychar = YYEMPTY;
yyposn += 1;
yyglrShift (&yystack, 0, yyaction, yyposn, &yylval, &yylloc);
if (0 < yystack.yyerrState)
yystack.yyerrState -= 1;
}
else if (yyisErrorAction (yyaction))
{
]b4_locations_if([[ yystack.yyerror_range[1].yystate.yyloc = yylloc;]])[
yyreportSyntaxError (&yystack]b4_user_args[);
goto yyuser_error;
}
else
YYCHK1 (yyglrReduce (&yystack, 0, -yyaction, yytrue]b4_user_args[));
}
}
while (YYID (yytrue))
{
yySymbol yytoken_to_shift;
size_t yys;
for (yys = 0; yys < yystack.yytops.yysize; yys += 1)
yystackp->yytops.yylookaheadNeeds[yys] = yychar != YYEMPTY;
/* yyprocessOneStack returns one of three things:
- An error flag. If the caller is yyprocessOneStack, it
immediately returns as well. When the caller is finally
yyparse, it jumps to an error label via YYCHK1.
- yyok, but yyprocessOneStack has invoked yymarkStackDeleted
(&yystack, yys), which sets the top state of yys to NULL. Thus,
yyparse's following invocation of yyremoveDeletes will remove
the stack.
- yyok, when ready to shift a token.
Except in the first case, yyparse will invoke yyremoveDeletes and
then shift the next token onto all remaining stacks. This
synchronization of the shift (that is, after all preceding
reductions on all stacks) helps prevent double destructor calls
on yylval in the event of memory exhaustion. */
for (yys = 0; yys < yystack.yytops.yysize; yys += 1)
YYCHK1 (yyprocessOneStack (&yystack, yys, yyposn]b4_lpure_args[));
yyremoveDeletes (&yystack);
if (yystack.yytops.yysize == 0)
{
yyundeleteLastStack (&yystack);
if (yystack.yytops.yysize == 0)
yyFail (&yystack][]b4_lpure_args[, YY_("syntax error"));
YYCHK1 (yyresolveStack (&yystack]b4_user_args[));
YYDPRINTF ((stderr, "Returning to deterministic operation.\n"));
]b4_locations_if([[ yystack.yyerror_range[1].yystate.yyloc = yylloc;]])[
yyreportSyntaxError (&yystack]b4_user_args[);
goto yyuser_error;
}
/* If any yyglrShift call fails, it will fail after shifting. Thus,
a copy of yylval will already be on stack 0 in the event of a
failure in the following loop. Thus, yychar is set to YYEMPTY
before the loop to make sure the user destructor for yylval isn't
called twice. */
yytoken_to_shift = YYTRANSLATE (yychar);
yychar = YYEMPTY;
yyposn += 1;
for (yys = 0; yys < yystack.yytops.yysize; yys += 1)
{
int yyaction;
const short int* yyconflicts;
yyStateNum yystate = yystack.yytops.yystates[yys]->yylrState;
yygetLRActions (yystate, yytoken_to_shift, &yyaction,
&yyconflicts);
/* Note that yyconflicts were handled by yyprocessOneStack. */
YYDPRINTF ((stderr, "On stack %lu, ", (unsigned long int) yys));
YY_SYMBOL_PRINT ("shifting", yytoken_to_shift, &yylval, &yylloc);
yyglrShift (&yystack, yys, yyaction, yyposn,
&yylval, &yylloc);
YYDPRINTF ((stderr, "Stack %lu now in state #%d\n",
(unsigned long int) yys,
yystack.yytops.yystates[yys]->yylrState));
}
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]b4_user_args[);
yyposn = yystack.yytops.yystates[0]->yyposn;
}
yyacceptlab:
yyresult = 0;
goto yyreturn;
yybuglab:
YYASSERT (yyfalse);
goto yyabortlab;
yyabortlab:
yyresult = 1;
goto yyreturn;
yyexhaustedlab:
yyerror (]b4_lyyerror_args[YY_("memory exhausted"));
yyresult = 2;
goto yyreturn;
yyreturn:
if (yychar != YYEMPTY)
yydestruct ("Cleanup: discarding lookahead",
YYTRANSLATE (yychar),
&yylval]b4_locations_if([, &yylloc])[]b4_user_args[);
/* If the stack is well-formed, pop the stack until it is empty,
destroying its entries as we go. But free the stack regardless
of whether it is well-formed. */
if (yystack.yyitems)
{
yyGLRState** yystates = yystack.yytops.yystates;
if (yystates)
{
size_t yysize = yystack.yytops.yysize;
size_t yyk;
for (yyk = 0; yyk < yysize; yyk += 1)
if (yystates[yyk])
{
while (yystates[yyk])
{
yyGLRState *yys = yystates[yyk];
]b4_locations_if([[ yystack.yyerror_range[1].yystate.yyloc = yys->yyloc;]]
)[ if (yys->yypred != NULL)
yydestroyGLRState ("Cleanup: popping", yys]b4_user_args[);
yystates[yyk] = yys->yypred;
yystack.yynextFree -= 1;
yystack.yyspaceLeft += 1;
}
break;
}
}
yyfreeGLRStack (&yystack);
}
/* Make sure YYID is used. */
return YYID (yyresult);
}
/* DEBUGGING ONLY */
#if YYDEBUG
static void yypstack (yyGLRStack* yystackp, size_t yyk)
__attribute__ ((__unused__));
static void yypdumpstack (yyGLRStack* yystackp) __attribute__ ((__unused__));
static void
yy_yypstack (yyGLRState* yys)
{
if (yys->yypred)
{
yy_yypstack (yys->yypred);
YYFPRINTF (stderr, " -> ");
}
YYFPRINTF (stderr, "%d@@%lu", yys->yylrState,
(unsigned long int) yys->yyposn);
}
static void
yypstates (yyGLRState* yyst)
{
if (yyst == NULL)
YYFPRINTF (stderr, "");
else
yy_yypstack (yyst);
YYFPRINTF (stderr, "\n");
}
static void
yypstack (yyGLRStack* yystackp, size_t yyk)
{
yypstates (yystackp->yytops.yystates[yyk]);
}
#define YYINDEX(YYX) \
((YYX) == NULL ? -1 : (yyGLRStackItem*) (YYX) - yystackp->yyitems)
static void
yypdumpstack (yyGLRStack* yystackp)
{
yyGLRStackItem* yyp;
size_t yyi;
for (yyp = yystackp->yyitems; yyp < yystackp->yynextFree; yyp += 1)
{
YYFPRINTF (stderr, "%3lu. ",
(unsigned long int) (yyp - yystackp->yyitems));
if (*(yybool *) yyp)
{
YYFPRINTF (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)
YYFPRINTF (stderr, ", firstVal: %ld",
(long int) YYINDEX (yyp->yystate
.yysemantics.yyfirstVal));
}
else
{
YYFPRINTF (stderr, "Option. rule: %d, state: %ld, next: %ld",
yyp->yyoption.yyrule - 1,
(long int) YYINDEX (yyp->yyoption.yystate),
(long int) YYINDEX (yyp->yyoption.yynext));
}
YYFPRINTF (stderr, "\n");
}
YYFPRINTF (stderr, "Tops:");
for (yyi = 0; yyi < yystackp->yytops.yysize; yyi += 1)
YYFPRINTF (stderr, "%lu: %ld; ", (unsigned long int) yyi,
(long int) YYINDEX (yystackp->yytops.yystates[yyi]));
YYFPRINTF (stderr, "\n");
}
#endif
]
b4_epilogue
dnl
dnl glr.cc produces its own header.
dnl
m4_if(b4_skeleton, ["glr.c"],
[b4_defines_if(
[@output(b4_spec_defines_file@)@
b4_copyright([Skeleton interface for Bison GLR parsers in C],
[2002-2006, 2009-2010])
b4_shared_declarations
b4_pure_if([],
[[extern YYSTYPE ]b4_prefix[lval;]])
b4_locations_if([b4_pure_if([],
[extern YYLTYPE ]b4_prefix[lloc;])
])
])])
m4_divert_pop(0)
070701000541d1000081a40000000000000000000000014cda0fa40000047e0000010000010006ffffffffffffffff0000002800000000root/usr/local/share/bison/java-skel.m4 -*- Autoconf -*-
# Java skeleton dispatching for Bison.
# Copyright (C) 2007, 2009-2010 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 3 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, see .
b4_glr_if( [b4_complain([%%glr-parser not supported for Java])])
b4_nondeterministic_if([b4_complain([%%nondeterministic-parser not supported for Java])])
m4_define_default([b4_used_skeleton], [b4_pkgdatadir/[lalr1.java]])
m4_define_default([b4_skeleton], ["b4_basename(b4_used_skeleton)"])
m4_include(b4_used_skeleton)
070701000541de000081a40000000000000000000000014cda0fa40000c40e0000010000010006ffffffffffffffff0000002200000000root/usr/local/share/bison/yacc.c -*- C -*-
# Yacc compatible skeleton for Bison
# Copyright (C) 1984, 1989-1990, 2000-2010 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 3 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, see .
# Check the value of %define api.push_pull.
b4_percent_define_default([[api.push_pull]], [[pull]])
b4_percent_define_check_values([[[[api.push_pull]],
[[pull]], [[push]], [[both]]]])
b4_define_flag_if([pull]) m4_define([b4_pull_flag], [[1]])
b4_define_flag_if([push]) m4_define([b4_push_flag], [[1]])
m4_case(b4_percent_define_get([[api.push_pull]]),
[pull], [m4_define([b4_push_flag], [[0]])],
[push], [m4_define([b4_pull_flag], [[0]])])
# Handle BISON_USE_PUSH_FOR_PULL for the test suite. So that push parsing
# tests function as written, don't let BISON_USE_PUSH_FOR_PULL modify Bison's
# behavior at all when push parsing is already requested.
b4_define_flag_if([use_push_for_pull])
b4_use_push_for_pull_if([
b4_push_if([m4_define([b4_use_push_for_pull_flag], [[0]])],
[m4_define([b4_push_flag], [[1]])])])
m4_include(b4_pkgdatadir/[c.m4])
## ---------------- ##
## Default values. ##
## ---------------- ##
# Stack parameters.
m4_define_default([b4_stack_depth_max], [10000])
m4_define_default([b4_stack_depth_init], [200])
## ------------------------ ##
## Pure/impure interfaces. ##
## ------------------------ ##
b4_percent_define_default([[api.pure]], [[false]])
b4_define_flag_if([pure])
m4_define([b4_pure_flag],
[b4_percent_define_flag_if([[api.pure]], [[1]], [[0]])])
# b4_yacc_pure_if(IF-TRUE, IF-FALSE)
# ----------------------------------
# Expand IF-TRUE, if %pure-parser and %parse-param, IF-FALSE otherwise.
m4_define([b4_yacc_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_yacc_pure_if([b4_locations_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_locations_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). Overwrite the version from c.m4, which
# uses only C89 types, so that the user can override the shorter
# types, and so that pre-C89 compilers are handled correctly.
m4_define([b4_int_type],
[m4_if(b4_ints_in($@, [0], [255]), [1], [yytype_uint8],
b4_ints_in($@, [-128], [127]), [1], [yytype_int8],
b4_ints_in($@, [0], [65535]), [1], [yytype_uint16],
b4_ints_in($@, [-32768], [32767]), [1], [yytype_int16],
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@{($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@{($2) - ($1)@})])
## --------------------------------------------------------- ##
## Defining symbol actions, e.g., printers and destructors. ##
## --------------------------------------------------------- ##
# We do want M4 expansion after # for CPP macros.
m4_changecom()
m4_divert_push(0)dnl
@output(b4_parser_file_name@)@
b4_copyright([Skeleton implementation for Bison's Yacc-like parsers in C],
[1984, 1989-1990, 2000-2006, 2009-2010])[
/* C LALR(1) parser skeleton 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
b4_percent_code_get([[top]])[]dnl
m4_if(b4_prefix, [yy], [],
[[/* Substitute the variable and function names. */
]b4_pull_if([[#define yyparse ]b4_prefix[parse
]])b4_push_if([[#define yypush_parse ]b4_prefix[push_parse
]b4_pull_if([[#define yypull_parse ]b4_prefix[pull_parse
]])[#define yypstate_new ]b4_prefix[pstate_new
#define yypstate_delete ]b4_prefix[pstate_delete
#define yypstate ]b4_prefix[pstate
]])[#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_locations_if([[#define yylloc ]b4_prefix[lloc]])])[
/* Copy the first part of user declarations. */
]b4_user_pre_prologue[
/* Enabling traces. */
#ifndef YYDEBUG
# define YYDEBUG ]b4_debug_flag[
#endif
/* Enabling verbose error messages. */
#ifdef YYERROR_VERBOSE
# undef YYERROR_VERBOSE
# define YYERROR_VERBOSE 1
#else
# define YYERROR_VERBOSE ]b4_error_verbose_flag[
#endif
/* Enabling the token table. */
#ifndef YYTOKEN_TABLE
# define YYTOKEN_TABLE ]b4_token_table[
#endif
]b4_percent_code_get([[requires]])[]dnl
b4_token_enums_defines(b4_tokens)[
#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
]m4_ifdef([b4_stype],
[[typedef union ]b4_union_name[
{
]b4_user_stype[
} YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1]],
[m4_if(b4_tag_seen_flag, 0,
[[typedef int YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1]])])[
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
#endif]b4_locations_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]])b4_push_if([[
#ifndef YYPUSH_DECLS
# define YYPUSH_DECLS
struct yypstate;
typedef struct yypstate yypstate;
enum { YYPUSH_MORE = 4 };
]b4_pull_if([b4_c_function_decl([[yyparse]], [[int]], b4_parse_param)
])b4_c_function_decl([[yypush_parse]], [[int]],
[[[yypstate *yyps]], [[yyps]]]b4_pure_if([,
[[[int yypushed_char]], [[yypushed_char]]],
[[[YYSTYPE const *yypushed_val]], [[yypushed_val]]]b4_locations_if([,
[[[YYLTYPE const *yypushed_loc]], [[yypushed_loc]]]])])m4_ifset([b4_parse_param], [,
b4_parse_param]))
b4_pull_if([b4_c_function_decl([[yypull_parse]], [[int]],
[[[yypstate *yyps]], [[yyps]]]m4_ifset([b4_parse_param], [,
b4_parse_param]))])
b4_c_function_decl([[yypstate_new]], [[yypstate *]], [[[void]], []])
b4_c_function_decl([[yypstate_delete]], [[void]],
[[[yypstate *yyps]], [[yyps]]])[
#endif]])
b4_percent_code_get([[provides]])[]dnl
[/* Copy the second part of user declarations. */
]b4_user_post_prologue
b4_percent_code_get[]dnl
[#ifdef short
# undef short
#endif
#ifdef YYTYPE_UINT8
typedef YYTYPE_UINT8 yytype_uint8;
#else
typedef unsigned char yytype_uint8;
#endif
#ifdef YYTYPE_INT8
typedef YYTYPE_INT8 yytype_int8;
#elif ]b4_c_modern[
typedef signed char yytype_int8;
#else
typedef short int yytype_int8;
#endif
#ifdef YYTYPE_UINT16
typedef YYTYPE_UINT16 yytype_uint16;
#else
typedef unsigned short int yytype_uint16;
#endif
#ifdef YYTYPE_INT16
typedef YYTYPE_INT16 yytype_int16;
#else
typedef short int yytype_int16;
#endif
#ifndef YYSIZE_T
# ifdef __SIZE_TYPE__
# define YYSIZE_T __SIZE_TYPE__
# elif defined size_t
# define YYSIZE_T size_t
# elif ! defined YYSIZE_T && ]b4_c_modern[
# include /* INFRINGES ON USER NAME SPACE */
# define YYSIZE_T size_t
# else
# define YYSIZE_T unsigned int
# endif
#endif
#define YYSIZE_MAXIMUM ((YYSIZE_T) -1)
#ifndef YY_
# if defined YYENABLE_NLS && YYENABLE_NLS
# if ENABLE_NLS
# include /* INFRINGES ON USER NAME SPACE */
# define YY_(msgid) dgettext ("bison-runtime", msgid)
# endif
# endif
# ifndef YY_
# define YY_(msgid) msgid
# endif
#endif
/* Suppress unused-variable warnings by "using" E. */
#if ! defined lint || defined __GNUC__
# define YYUSE(e) ((void) (e))
#else
# define YYUSE(e) /* empty */
#endif
/* Identity function, used to suppress warnings about constant conditions. */
#ifndef lint
# define YYID(n) (n)
#else
]b4_c_function_def([YYID], [static int], [[int yyi], [yyi]])[
{
return yyi;
}
#endif
#if ! defined yyoverflow || YYERROR_VERBOSE
]b4_push_if([],
[[/* The parser invokes alloca or malloc; define the necessary symbols. */
# ifdef YYSTACK_USE_ALLOCA
# if YYSTACK_USE_ALLOCA
# ifdef __GNUC__
# define YYSTACK_ALLOC __builtin_alloca
# elif defined __BUILTIN_VA_ARG_INCR
# include /* INFRINGES ON USER NAME SPACE */
# elif defined _AIX
# define YYSTACK_ALLOC __alloca
# elif defined _MSC_VER
# include /* INFRINGES ON USER NAME SPACE */
# define alloca _alloca
# else
# define YYSTACK_ALLOC alloca
# if ! defined _ALLOCA_H && ! defined _STDLIB_H && ]b4_c_modern[
# include /* INFRINGES ON USER NAME SPACE */
# ifndef _STDLIB_H
# define _STDLIB_H 1
# endif
# endif
# endif
# endif
# endif
]])dnl
[# ifdef YYSTACK_ALLOC
/* Pacify GCC's `empty if-body' warning. */
# define YYSTACK_FREE(Ptr) do { /* empty */; } while (YYID (0))
# ifndef YYSTACK_ALLOC_MAXIMUM
/* The OS might guarantee only one guard page at the bottom of the stack,
and a page size can be as small as 4096 bytes. So we cannot safely
invoke alloca (N) if N exceeds 4096. Use a slightly smaller number
to allow for a few compiler-allocated temporary stack slots. */
# define YYSTACK_ALLOC_MAXIMUM 4032 /* reasonable circa 2006 */
# endif
# else
# define YYSTACK_ALLOC YYMALLOC
# define YYSTACK_FREE YYFREE
# ifndef YYSTACK_ALLOC_MAXIMUM
# define YYSTACK_ALLOC_MAXIMUM YYSIZE_MAXIMUM
# endif
# if (defined __cplusplus && ! defined _STDLIB_H \
&& ! ((defined YYMALLOC || defined malloc) \
&& (defined YYFREE || defined free)))
# include /* INFRINGES ON USER NAME SPACE */
# ifndef _STDLIB_H
# define _STDLIB_H 1
# endif
# endif
# ifndef YYMALLOC
# define YYMALLOC malloc
# if ! defined malloc && ! defined _STDLIB_H && ]b4_c_modern[
void *malloc (YYSIZE_T); /* INFRINGES ON USER NAME SPACE */
# endif
# endif
# ifndef YYFREE
# define YYFREE free
# if ! defined free && ! defined _STDLIB_H && ]b4_c_modern[
void free (void *); /* INFRINGES ON USER NAME SPACE */
# endif
# endif
# endif
#endif /* ! defined yyoverflow || YYERROR_VERBOSE */
#if (! defined yyoverflow \
&& (! defined __cplusplus \
|| (]b4_locations_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
{
yytype_int16 yyss_alloc;
YYSTYPE yyvs_alloc;]b4_locations_if([
YYLTYPE yyls_alloc;])[
};
/* 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_locations_if(
[# define YYSTACK_BYTES(N) \
((N) * (sizeof (yytype_int16) + sizeof (YYSTYPE) + sizeof (YYLTYPE)) \
+ 2 * YYSTACK_GAP_MAXIMUM)],
[# define YYSTACK_BYTES(N) \
((N) * (sizeof (yytype_int16) + 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 \
{ \
YYSIZE_T yyi; \
for (yyi = 0; yyi < (Count); yyi++) \
(To)[yyi] = (From)[yyi]; \
} \
while (YYID (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_alloc, Stack) \
do \
{ \
YYSIZE_T yynewbytes; \
YYCOPY (&yyptr->Stack_alloc, Stack, yysize); \
Stack = &yyptr->Stack_alloc; \
yynewbytes = yystacksize * sizeof (*Stack) + YYSTACK_GAP_MAXIMUM; \
yyptr += yynewbytes / sizeof (*yyptr); \
} \
while (YYID (0))
#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 || YYTOKEN_TABLE
/* YYTNAME[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[
};
#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. However,
YYFAIL appears to be in use. Nevertheless, it is formally deprecated
in Bison 2.4.2's NEWS entry, where a plan to phase it out is
discussed. */
#define YYFAIL goto yyerrlab
#if defined YYFAIL
/* This is here to suppress warnings from the GCC cpp's
-Wunused-macros. Normally we don't worry about that warning, but
some users do, and we want to make it easy for users to remove
YYFAIL uses, which will produce warnings from Bison 2.5. */
#endif
#define YYRECOVERING() (!!yyerrstatus)
#define YYBACKUP(Token, Value) \
do \
if (yychar == YYEMPTY && yylen == 1) \
{ \
yychar = (Token); \
yylval = (Value); \
yytoken = YYTRANSLATE (yychar); \
YYPOPSTACK (1); \
goto yybackup; \
} \
else \
{ \
yyerror (]b4_yyerror_args[YY_("syntax error: cannot back up")); \
YYERROR; \
} \
while (YYID (0))
#define YYTERROR 1
#define YYERRCODE 256
/* YYLLOC_DEFAULT -- Set CURRENT to span from RHS[1] to RHS[N].
If N is 0, then set CURRENT to the empty location which ends
the previous symbol: RHS[0] (always defined). */
#define YYRHSLOC(Rhs, K) ((Rhs)[K])
#ifndef YYLLOC_DEFAULT
# define YYLLOC_DEFAULT(Current, Rhs, N) \
do \
if (YYID (N)) \
{ \
(Current).first_line = YYRHSLOC (Rhs, 1).first_line; \
(Current).first_column = YYRHSLOC (Rhs, 1).first_column; \
(Current).last_line = YYRHSLOC (Rhs, N).last_line; \
(Current).last_column = YYRHSLOC (Rhs, N).last_column; \
} \
else \
{ \
(Current).first_line = (Current).last_line = \
YYRHSLOC (Rhs, 0).last_line; \
(Current).first_column = (Current).last_column = \
YYRHSLOC (Rhs, 0).last_column; \
} \
while (YYID (0))
#endif
/* YY_LOCATION_PRINT -- Print the location on the stream.
This macro was not mandated originally: define only if we know
we won't break user code: when these are the locations we know. */
#ifndef YY_LOCATION_PRINT
# if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
# define YY_LOCATION_PRINT(File, Loc) \
fprintf (File, "%d.%d-%d.%d", \
(Loc).first_line, (Loc).first_column, \
(Loc).last_line, (Loc).last_column)
# else
# define YY_LOCATION_PRINT(File, Loc) ((void) 0)
# endif
#endif
/* YYLEX -- calling `yylex' with the right arguments. */
#ifdef YYLEX_PARAM
# define YYLEX yylex (]b4_pure_if([&yylval[]b4_locations_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 (YYID (0))
# define YY_SYMBOL_PRINT(Title, Type, Value, Location) \
do { \
if (yydebug) \
{ \
YYFPRINTF (stderr, "%s ", Title); \
yy_symbol_print (stderr, \
Type, Value]b4_locations_if([, Location])[]b4_user_args[); \
YYFPRINTF (stderr, "\n"); \
} \
} while (YYID (0))
]b4_yy_symbol_print_generate([b4_c_function_def])[
/*------------------------------------------------------------------.
| yy_stack_print -- Print the state stack from its BOTTOM up to its |
| TOP (included). |
`------------------------------------------------------------------*/
]b4_c_function_def([yy_stack_print], [static void],
[[yytype_int16 *yybottom], [yybottom]],
[[yytype_int16 *yytop], [yytop]])[
{
YYFPRINTF (stderr, "Stack now");
for (; yybottom <= yytop; yybottom++)
{
int yybot = *yybottom;
YYFPRINTF (stderr, " %d", yybot);
}
YYFPRINTF (stderr, "\n");
}
# define YY_STACK_PRINT(Bottom, Top) \
do { \
if (yydebug) \
yy_stack_print ((Bottom), (Top)); \
} while (YYID (0))
/*------------------------------------------------.
| Report that the YYRULE is going to be reduced. |
`------------------------------------------------*/
]b4_c_function_def([yy_reduce_print], [static void],
[[YYSTYPE *yyvsp], [yyvsp]],
b4_locations_if([[[YYLTYPE *yylsp], [yylsp]],
])[[int yyrule], [yyrule]]m4_ifset([b4_parse_param], [,
b4_parse_param]))[
{
int yynrhs = yyr2[yyrule];
int yyi;
unsigned long int yylno = yyrline[yyrule];
YYFPRINTF (stderr, "Reducing stack by rule %d (line %lu):\n",
yyrule - 1, yylno);
/* The symbols being reduced. */
for (yyi = 0; yyi < yynrhs; yyi++)
{
YYFPRINTF (stderr, " $%d = ", yyi + 1);
yy_symbol_print (stderr, yyrhs[yyprhs[yyrule] + yyi],
&]b4_rhs_value(yynrhs, yyi + 1)[
]b4_locations_if([, &]b4_rhs_location(yynrhs, yyi + 1))[]dnl
b4_user_args[);
YYFPRINTF (stderr, "\n");
}
}
# define YY_REDUCE_PRINT(Rule) \
do { \
if (yydebug) \
yy_reduce_print (yyvsp, ]b4_locations_if([yylsp, ])[Rule]b4_user_args[); \
} while (YYID (0))
/* Nonzero means print parse trace. It is left uninitialized so that
multiple parsers can coexist. */
int yydebug;
#else /* !YYDEBUG */
# define YYDPRINTF(Args)
# define YY_SYMBOL_PRINT(Title, Type, 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
YYSTACK_ALLOC_MAXIMUM < YYSTACK_BYTES (YYMAXDEPTH)
evaluated with infinite-precision integer arithmetic. */
#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. */
]b4_c_function_def([yystrlen], [static YYSIZE_T],
[[const char *yystr], [yystr]])[
{
YYSIZE_T yylen;
for (yylen = 0; yystr[yylen]; yylen++)
continue;
return yylen;
}
# 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. */
]b4_c_function_def([yystpcpy], [static char *],
[[char *yydest], [yydest]], [[const char *yysrc], [yysrc]])[
{
char *yyd = yydest;
const char *yys = yysrc;
while ((*yyd++ = *yys++) != '\0')
continue;
return yyd - 1;
}
# endif
# endif
# ifndef yytnamerr
/* Copy to YYRES the contents of YYSTR after stripping away unnecessary
quotes and backslashes, so that it's suitable for yyerror. The
heuristic is that double-quoting is unnecessary unless the string
contains an apostrophe, a comma, or backslash (other than
backslash-backslash). YYSTR is taken from yytname. If YYRES is
null, do not copy; instead, return the length of what the result
would have been. */
static YYSIZE_T
yytnamerr (char *yyres, const char *yystr)
{
if (*yystr == '"')
{
YYSIZE_T yyn = 0;
char const *yyp = yystr;
for (;;)
switch (*++yyp)
{
case '\'':
case ',':
goto do_not_strip_quotes;
case '\\':
if (*++yyp != '\\')
goto do_not_strip_quotes;
/* Fall through. */
default:
if (yyres)
yyres[yyn] = *yyp;
yyn++;
break;
case '"':
if (yyres)
yyres[yyn] = '\0';
return yyn;
}
do_not_strip_quotes: ;
}
if (! yyres)
return yystrlen (yystr);
return yystpcpy (yyres, yystr) - yyres;
}
# endif
/* Copy into YYRESULT an error message about the unexpected token
YYCHAR while in state YYSTATE. Return the number of bytes copied,
including the terminating null byte. If YYRESULT is null, do not
copy anything; just return the number of bytes that would be
copied. As a special case, return 0 if an ordinary "syntax error"
message will do. Return YYSIZE_MAXIMUM if overflow occurs during
size calculation. */
static YYSIZE_T
yysyntax_error (char *yyresult, int yystate, int yychar)
{
int yyn = yypact[yystate];
if (! (YYPACT_NINF < yyn && yyn <= YYLAST))
return 0;
else
{
int yytype = YYTRANSLATE (yychar);
YYSIZE_T yysize0 = yytnamerr (0, yytname[yytype]);
YYSIZE_T yysize = yysize0;
YYSIZE_T yysize1;
int yysize_overflow = 0;
enum { YYERROR_VERBOSE_ARGS_MAXIMUM = 5 };
char const *yyarg[YYERROR_VERBOSE_ARGS_MAXIMUM];
int yyx;
# if 0
/* This is so xgettext sees the translatable formats that are
constructed on the fly. */
YY_("syntax error, unexpected %s");
YY_("syntax error, unexpected %s, expecting %s");
YY_("syntax error, unexpected %s, expecting %s or %s");
YY_("syntax error, unexpected %s, expecting %s or %s or %s");
YY_("syntax error, unexpected %s, expecting %s or %s or %s or %s");
# endif
char *yyfmt;
char const *yyf;
static char const yyunexpected[] = "syntax error, unexpected %s";
static char const yyexpecting[] = ", expecting %s";
static char const yyor[] = " or %s";
char yyformat[sizeof yyunexpected
+ sizeof yyexpecting - 1
+ ((YYERROR_VERBOSE_ARGS_MAXIMUM - 2)
* (sizeof yyor - 1))];
char const *yyprefix = yyexpecting;
/* 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 + 1;
int yyxend = yychecklim < YYNTOKENS ? yychecklim : YYNTOKENS;
int yycount = 1;
yyarg[0] = yytname[yytype];
yyfmt = yystpcpy (yyformat, yyunexpected);
for (yyx = yyxbegin; yyx < yyxend; ++yyx)
if (yycheck[yyx + yyn] == yyx && yyx != YYTERROR)
{
if (yycount == YYERROR_VERBOSE_ARGS_MAXIMUM)
{
yycount = 1;
yysize = yysize0;
yyformat[sizeof yyunexpected - 1] = '\0';
break;
}
yyarg[yycount++] = yytname[yyx];
yysize1 = yysize + yytnamerr (0, yytname[yyx]);
yysize_overflow |= (yysize1 < yysize);
yysize = yysize1;
yyfmt = yystpcpy (yyfmt, yyprefix);
yyprefix = yyor;
}
yyf = YY_(yyformat);
yysize1 = yysize + yystrlen (yyf);
yysize_overflow |= (yysize1 < yysize);
yysize = yysize1;
if (yysize_overflow)
return YYSIZE_MAXIMUM;
if (yyresult)
{
/* Avoid sprintf, as that infringes on the user's name space.
Don't have undefined behavior even if the translation
produced a string with the wrong number of "%s"s. */
char *yyp = yyresult;
int yyi = 0;
while ((*yyp = *yyf) != '\0')
{
if (*yyp == '%' && yyf[1] == 's' && yyi < yycount)
{
yyp += yytnamerr (yyp, yyarg[yyi++]);
yyf += 2;
}
else
{
yyp++;
yyf++;
}
}
}
return yysize;
}
}
#endif /* YYERROR_VERBOSE */
]b4_yydestruct_generate([b4_c_function_def])[
]b4_push_if([],
[[/* Prevent warnings from -Wmissing-prototypes. */
#ifdef YYPARSE_PARAM
]b4_c_function_decl([yyparse], [int],
[[void *YYPARSE_PARAM], [YYPARSE_PARAM]])[
#else /* ! YYPARSE_PARAM */
]b4_c_function_decl([yyparse], [int], b4_parse_param)[
#endif /* ! YYPARSE_PARAM */]])
m4_divert_push([KILL])# ======================== M4 code.
# b4_declare_scanner_communication_variables
# ------------------------------------------
# Declare the variables that are global, or local to YYPARSE if
# pure-parser.
m4_define([b4_declare_scanner_communication_variables],
[[/* The lookahead symbol. */
int yychar;
/* The semantic value of the lookahead symbol. */
YYSTYPE yylval;
]b4_locations_if([[
/* Location data for the lookahead symbol. */
YYLTYPE yylloc;
]])b4_pure_if([], [[
/* Number of syntax errors so far. */
int yynerrs;
]])])
# b4_declare_parser_state_variables
# ---------------------------------
# Declare all the variables that are needed to maintain the parser state
# between calls to yypush_parse.
m4_define([b4_declare_parser_state_variables],
[b4_pure_if([[ /* Number of syntax errors so far. */
int yynerrs;
]])[
int yystate;
/* Number of tokens to shift before error messages enabled. */
int yyerrstatus;
/* The stacks and their tools:
`yyss': related to states.
`yyvs': related to semantic values.]b4_locations_if([[
`yyls': related to locations.]])[
Refer to the stacks thru separate pointers, to allow yyoverflow
to reallocate them elsewhere. */
/* The state stack. */
yytype_int16 yyssa[YYINITDEPTH];
yytype_int16 *yyss;
yytype_int16 *yyssp;
/* The semantic value stack. */
YYSTYPE yyvsa[YYINITDEPTH];
YYSTYPE *yyvs;
YYSTYPE *yyvsp;
]b4_locations_if([[
/* The location stack. */
YYLTYPE yylsa[YYINITDEPTH];
YYLTYPE *yyls;
YYLTYPE *yylsp;
/* The locations where the error started and ended. */
YYLTYPE yyerror_range[2];
]])[
YYSIZE_T yystacksize;
]])
m4_divert_pop([KILL])dnl# ====================== End of M4 code.
b4_pure_if([], [b4_declare_scanner_communication_variables])
b4_push_if(
[[struct yypstate
{
]b4_declare_parser_state_variables[
/* Used to determine if this is the first time this instance has
been used. */
int yynew;
};]b4_pure_if([], [[
static char yypstate_allocated = 0;]])b4_pull_if([
b4_c_function_def([[yyparse]], [[int]], b4_parse_param)[
{
return yypull_parse (0]m4_ifset([b4_parse_param],
[[, ]b4_c_args(b4_parse_param)])[);
}
]b4_c_function_def([[yypull_parse]], [[int]],
[[[yypstate *yyps]], [[yyps]]]m4_ifset([b4_parse_param], [,
b4_parse_param]))[
{
int yystatus;
yypstate *yyps_local;]b4_pure_if([[
int yychar;
YYSTYPE yylval;]b4_locations_if([[
YYLTYPE yylloc;]])])[
if (yyps == 0)
{
yyps_local = yypstate_new ();
if (!yyps_local)
{]b4_pure_if([[
yyerror (]b4_yyerror_args[YY_("memory exhausted"));]], [[
if (!yypstate_allocated)
yyerror (]b4_yyerror_args[YY_("memory exhausted"));]])[
return 2;
}
}
else
yyps_local = yyps;
do {
yychar = YYLEX;
yystatus =
yypush_parse (yyps_local]b4_pure_if([[, yychar, &yylval]b4_locations_if([[, &yylloc]])])m4_ifset([b4_parse_param], [, b4_c_args(b4_parse_param)])[);
} while (yystatus == YYPUSH_MORE);
if (yyps == 0)
yypstate_delete (yyps_local);
return yystatus;
}]])[
/* Initialize the parser data structure. */
]b4_c_function_def([[yypstate_new]], [[yypstate *]])[
{
yypstate *yyps;]b4_pure_if([], [[
if (yypstate_allocated)
return 0;]])[
yyps = (yypstate *) malloc (sizeof *yyps);
if (!yyps)
return 0;
yyps->yynew = 1;]b4_pure_if([], [[
yypstate_allocated = 1;]])[
return yyps;
}
]b4_c_function_def([[yypstate_delete]], [[void]],
[[[yypstate *yyps]], [[yyps]]])[
{
#ifndef yyoverflow
/* If the stack was reallocated but the parse did not complete, then the
stack still needs to be freed. */
if (!yyps->yynew && yyps->yyss != yyps->yyssa)
YYSTACK_FREE (yyps->yyss);
#endif
free (yyps);]b4_pure_if([], [[
yypstate_allocated = 0;]])[
}
]b4_pure_if([[#define ]b4_prefix[nerrs yyps->]b4_prefix[nerrs
]])[#define yystate yyps->yystate
#define yyerrstatus yyps->yyerrstatus
#define yyssa yyps->yyssa
#define yyss yyps->yyss
#define yyssp yyps->yyssp
#define yyvsa yyps->yyvsa
#define yyvs yyps->yyvs
#define yyvsp yyps->yyvsp
]b4_locations_if([[#define yylsa yyps->yylsa
#define yyls yyps->yyls
#define yylsp yyps->yylsp
#define yyerror_range yyps->yyerror_range
]])[#define yystacksize yyps->yystacksize
]])[
/*-------------------------.
| yyparse or yypush_parse. |
`-------------------------*/
]b4_push_if([
b4_c_function_def([[yypush_parse]], [[int]],
[[[yypstate *yyps]], [[yyps]]]b4_pure_if([,
[[[int yypushed_char]], [[yypushed_char]]],
[[[YYSTYPE const *yypushed_val]], [[yypushed_val]]]b4_locations_if([,
[[[YYLTYPE const *yypushed_loc]], [[yypushed_loc]]]])])m4_ifset([b4_parse_param], [,
b4_parse_param]))], [
#ifdef YYPARSE_PARAM
b4_c_function_def([yyparse], [int], [[void *YYPARSE_PARAM], [YYPARSE_PARAM]])
#else /* ! YYPARSE_PARAM */
b4_c_function_def([yyparse], [int], b4_parse_param)
#endif])[
{
]b4_pure_if([b4_declare_scanner_communication_variables])
b4_push_if([b4_pure_if([], [[ int yypushed_char = yychar;
YYSTYPE yypushed_val = yylval;
]b4_locations_if([[YYLTYPE yypushed_loc = yylloc;
]])])],
[b4_declare_parser_state_variables])[
int yyn;
int yyresult;
/* Lookahead token as an internal (translated) token number. */
int yytoken;
/* The variables used to return semantic value and location from the
action routines. */
YYSTYPE yyval;]b4_locations_if([[
YYLTYPE yyloc;]])[
#if YYERROR_VERBOSE
/* Buffer for error messages, and its allocated size. */
char yymsgbuf[128];
char *yymsg = yymsgbuf;
YYSIZE_T yymsg_alloc = sizeof yymsgbuf;
#endif
#define YYPOPSTACK(N) (yyvsp -= (N), yyssp -= (N)]b4_locations_if([, yylsp -= (N)])[)
/* The number of symbols on the RHS of the reduced rule.
Keep to zero when no symbol should be popped. */
int yylen = 0;]b4_push_if([[
if (!yyps->yynew)
{
yyn = yypact[yystate];
goto yyread_pushed_token;
}]])[
yytoken = 0;
yyss = yyssa;
yyvs = yyvsa;]b4_locations_if([[
yyls = yylsa;]])[
yystacksize = YYINITDEPTH;
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_locations_if([[
yylsp = yyls;
#if defined YYLTYPE_IS_TRIVIAL && YYLTYPE_IS_TRIVIAL
/* Initialize the default location before parsing starts. */
yylloc.first_line = yylloc.last_line = ]b4_location_initial_line[;
yylloc.first_column = yylloc.last_column = ]b4_location_initial_column[;
#endif]])
m4_ifdef([b4_initial_action],[
m4_pushdef([b4_at_dollar], [m4_define([b4_at_dollar_used])yylloc])dnl
m4_pushdef([b4_dollar_dollar], [m4_define([b4_dollar_dollar_used])yylval])dnl
/* User initialization code. */
b4_user_initial_action
m4_popdef([b4_dollar_dollar])dnl
m4_popdef([b4_at_dollar])])dnl
m4_ifdef([b4_dollar_dollar_used],[[ yyvsp[0] = yylval;
]])dnl
m4_ifdef([b4_at_dollar_used], [[ yylsp[0] = yylloc;
]])[
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;
yytype_int16 *yyss1 = yyss;]b4_locations_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 (YY_("memory exhausted"),
&yyss1, yysize * sizeof (*yyssp),
&yyvs1, yysize * sizeof (*yyvsp),]b4_locations_if([
&yyls1, yysize * sizeof (*yylsp),])[
&yystacksize);
]b4_locations_if([
yyls = yyls1;])[
yyss = yyss1;
yyvs = yyvs1;
}
#else /* no yyoverflow */
# ifndef YYSTACK_RELOCATE
goto yyexhaustedlab;
# else
/* Extend the stack our own way. */
if (YYMAXDEPTH <= yystacksize)
goto yyexhaustedlab;
yystacksize *= 2;
if (YYMAXDEPTH < yystacksize)
yystacksize = YYMAXDEPTH;
{
yytype_int16 *yyss1 = yyss;
union yyalloc *yyptr =
(union yyalloc *) YYSTACK_ALLOC (YYSTACK_BYTES (yystacksize));
if (! yyptr)
goto yyexhaustedlab;
YYSTACK_RELOCATE (yyss_alloc, yyss);
YYSTACK_RELOCATE (yyvs_alloc, yyvs);]b4_locations_if([
YYSTACK_RELOCATE (yyls_alloc, yyls);])[
# undef YYSTACK_RELOCATE
if (yyss1 != yyssa)
YYSTACK_FREE (yyss1);
}
# endif
#endif /* no yyoverflow */
yyssp = yyss + yysize - 1;
yyvsp = yyvs + yysize - 1;]b4_locations_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));
if (yystate == YYFINAL)
YYACCEPT;
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. */
/* 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)
{]b4_push_if([[
if (!yyps->yynew)
{]b4_use_push_for_pull_if([], [[
YYDPRINTF ((stderr, "Return for a new token:\n"));]])[
yyresult = YYPUSH_MORE;
goto yypushreturn;
}
yyps->yynew = 0;]b4_pure_if([], [[
/* Restoring the pushed token is only necessary for the first
yypush_parse invocation since subsequent invocations don't overwrite
it before jumping to yyread_pushed_token. */
yychar = yypushed_char;
yylval = yypushed_val;]b4_locations_if([[
yylloc = yypushed_loc;]])])[
yyread_pushed_token:]])[
YYDPRINTF ((stderr, "Reading a token: "));]b4_push_if([b4_pure_if([[
yychar = yypushed_char;
if (yypushed_val)
yylval = *yypushed_val;]b4_locations_if([[
if (yypushed_loc)
yylloc = *yypushed_loc;]])])], [[
yychar = YYLEX;]])[
}
if (yychar <= YYEOF)
{
yychar = yytoken = YYEOF;
YYDPRINTF ((stderr, "Now at end of input.\n"));
}
else
{
yytoken = YYTRANSLATE (yychar);
YY_SYMBOL_PRINT ("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;
}
/* Count tokens shifted since error; after three, turn off error
status. */
if (yyerrstatus)
yyerrstatus--;
/* Shift the lookahead token. */
YY_SYMBOL_PRINT ("Shifting", yytoken, &yylval, &yylloc);
/* Discard the shifted token. */
yychar = YYEMPTY;
yystate = yyn;
*++yyvsp = yylval;
]b4_locations_if([ *++yylsp = yylloc;])[
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_locations_if(
[[ /* Default location. */
YYLLOC_DEFAULT (yyloc, (yylsp - yylen), yylen);]])[
YY_REDUCE_PRINT (yyn);
switch (yyn)
{
]b4_user_actions[
default: break;
}
YY_SYMBOL_PRINT ("-> $$ =", yyr1[yyn], &yyval, &yyloc);
YYPOPSTACK (yylen);
yylen = 0;
YY_STACK_PRINT (yyss, yyssp);
*++yyvsp = yyval;]b4_locations_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
yyerror (]b4_yyerror_args[YY_("syntax error"));
#else
{
YYSIZE_T yysize = yysyntax_error (0, yystate, yychar);
if (yymsg_alloc < yysize && yymsg_alloc < YYSTACK_ALLOC_MAXIMUM)
{
YYSIZE_T yyalloc = 2 * yysize;
if (! (yysize <= yyalloc && yyalloc <= YYSTACK_ALLOC_MAXIMUM))
yyalloc = YYSTACK_ALLOC_MAXIMUM;
if (yymsg != yymsgbuf)
YYSTACK_FREE (yymsg);
yymsg = (char *) YYSTACK_ALLOC (yyalloc);
if (yymsg)
yymsg_alloc = yyalloc;
else
{
yymsg = yymsgbuf;
yymsg_alloc = sizeof yymsgbuf;
}
}
if (0 < yysize && yysize <= yymsg_alloc)
{
(void) yysyntax_error (yymsg, yystate, yychar);
yyerror (]b4_yyerror_args[yymsg);
}
else
{
yyerror (]b4_yyerror_args[YY_("syntax error"));
if (yysize != 0)
goto yyexhaustedlab;
}
}
#endif
}
]b4_locations_if([[ yyerror_range[0] = yylloc;]])[
if (yyerrstatus == 3)
{
/* If just tried and failed to reuse lookahead token after an
error, discard it. */
if (yychar <= YYEOF)
{
/* Return failure if at end of input. */
if (yychar == YYEOF)
YYABORT;
}
else
{
yydestruct ("Error: discarding",
yytoken, &yylval]b4_locations_if([, &yylloc])[]b4_user_args[);
yychar = YYEMPTY;
}
}
/* Else will try to reuse lookahead token after shifting the error
token. */
goto yyerrlab1;
/*---------------------------------------------------.
| yyerrorlab -- error raised explicitly by YYERROR. |
`---------------------------------------------------*/
yyerrorlab:
/* Pacify compilers like GCC when the user code never invokes
YYERROR and the label yyerrorlab therefore never appears in user
code. */
if (/*CONSTCOND*/ 0)
goto yyerrorlab;
]b4_locations_if([[ yyerror_range[0] = yylsp[1-yylen];
]])[ /* Do not reclaim the symbols of the rule which action triggered
this YYERROR. */
YYPOPSTACK (yylen);
yylen = 0;
YY_STACK_PRINT (yyss, yyssp);
yystate = *yyssp;
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;
]b4_locations_if([[ yyerror_range[0] = *yylsp;]])[
yydestruct ("Error: popping",
yystos[yystate], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[);
YYPOPSTACK (1);
yystate = *yyssp;
YY_STACK_PRINT (yyss, yyssp);
}
*++yyvsp = yylval;
]b4_locations_if([[
yyerror_range[1] = yylloc;
/* Using YYLLOC is tempting, but would change the location of
the lookahead. YYLOC is available though. */
YYLLOC_DEFAULT (yyloc, (yyerror_range - 1), 2);
*++yylsp = yyloc;]])[
/* Shift the error token. */
YY_SYMBOL_PRINT ("Shifting", yystos[yyn], yyvsp, yylsp);
yystate = yyn;
goto yynewstate;
/*-------------------------------------.
| yyacceptlab -- YYACCEPT comes here. |
`-------------------------------------*/
yyacceptlab:
yyresult = 0;
goto yyreturn;
/*-----------------------------------.
| yyabortlab -- YYABORT comes here. |
`-----------------------------------*/
yyabortlab:
yyresult = 1;
goto yyreturn;
#if !defined(yyoverflow) || YYERROR_VERBOSE
/*-------------------------------------------------.
| yyexhaustedlab -- memory exhaustion comes here. |
`-------------------------------------------------*/
yyexhaustedlab:
yyerror (]b4_yyerror_args[YY_("memory exhausted"));
yyresult = 2;
/* Fall through. */
#endif
yyreturn:
if (yychar != YYEMPTY)
yydestruct ("Cleanup: discarding lookahead",
yytoken, &yylval]b4_locations_if([, &yylloc])[]b4_user_args[);
/* Do not reclaim the symbols of the rule which action triggered
this YYABORT or YYACCEPT. */
YYPOPSTACK (yylen);
YY_STACK_PRINT (yyss, yyssp);
while (yyssp != yyss)
{
yydestruct ("Cleanup: popping",
yystos[*yyssp], yyvsp]b4_locations_if([, yylsp])[]b4_user_args[);
YYPOPSTACK (1);
}
#ifndef yyoverflow
if (yyss != yyssa)
YYSTACK_FREE (yyss);
#endif
]b4_push_if([[ yyps->yynew = 1;
yypushreturn:
]])[#if YYERROR_VERBOSE
if (yymsg != yymsgbuf)
YYSTACK_FREE (yymsg);
#endif
/* Make sure YYID is used. */
return YYID (yyresult);
}
]b4_epilogue
b4_defines_if(
[@output(b4_spec_defines_file@)@
b4_copyright([Skeleton interface for Bison's Yacc-like parsers in C],
[1984, 1989-1990, 2000-2006, 2009-2010])
b4_percent_code_get([[requires]])[]dnl
b4_token_enums_defines(b4_tokens)
[#if ! defined YYSTYPE && ! defined YYSTYPE_IS_DECLARED
]m4_ifdef([b4_stype],
[[typedef union ]b4_union_name[
{
]b4_user_stype[
} YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1]],
[m4_if(b4_tag_seen_flag, 0,
[[typedef int YYSTYPE;
# define YYSTYPE_IS_TRIVIAL 1]])])[
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
#endif
]b4_pure_if([], [[extern YYSTYPE ]b4_prefix[lval;]])
b4_locations_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
]b4_pure_if([], [[extern YYLTYPE ]b4_prefix[lloc;]])
)dnl b4_locations_if
b4_push_if([[
#ifndef YYPUSH_DECLS
# define YYPUSH_DECLS
struct ]b4_prefix[pstate;
typedef struct ]b4_prefix[pstate ]b4_prefix[pstate;
enum { YYPUSH_MORE = 4 };
]b4_pull_if([b4_c_function_decl([b4_prefix[parse]], [[int]], b4_parse_param)
])b4_c_function_decl([b4_prefix[push_parse]], [[int]],
[[b4_prefix[pstate *yyps]], [[yyps]]]b4_pure_if([,
[[[int yypushed_char]], [[yypushed_char]]],
[[[YYSTYPE const *yypushed_val]], [[yypushed_val]]]b4_locations_if([,
[[[YYLTYPE const *yypushed_loc]], [[yypushed_loc]]]])])m4_ifset([b4_parse_param], [,
b4_parse_param]))
b4_pull_if([b4_c_function_decl([b4_prefix[pull_parse]], [[int]],
[[b4_prefix[pstate *yyps]], [[yyps]]]m4_ifset([b4_parse_param], [,
b4_parse_param]))])
b4_c_function_decl([b4_prefix[pstate_new]], [b4_prefix[pstate *]],
[[[void]], []])
b4_c_function_decl([b4_prefix[pstate_delete]], [[void]],
[[b4_prefix[pstate *yyps]], [[yyps]]])[
#endif
]])
b4_percent_code_get([[provides]])[]dnl
])dnl b4_defines_if
m4_divert_pop(0)
070701000541d6000041ed0000000000000000000000024cda0fa8000000000000010000010006ffffffffffffffff0000002300000000root/usr/local/share/bison/m4sugar 070701000541d8000081a40000000000000000000000014cda0fa40001802c0000010000010006ffffffffffffffff0000002e00000000root/usr/local/share/bison/m4sugar/m4sugar.m4 divert(-1)# -*- Autoconf -*-
# This file is part of Autoconf.
# Base M4 layer.
# Requires GNU M4.
#
# Copyright (C) 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007,
# 2008 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 3 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, see .
# 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 absolute file 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([to], [from($@)])
# Well, obviously 1 is more expensive in space. Maybe 2 is more expensive
# 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 would certainly prefer to see `to'.
m4_define([m4_copy],
[m4_define([$2], m4_defn([$1]))])
# m4_rename(SRC, DST)
# -------------------
# Rename the macro SRC to DST.
m4_define([m4_rename],
[m4_copy([$1], [$2])m4_undefine([$1])])
# m4_rename_m4(MACRO-NAME)
# ------------------------
# Rename MACRO-NAME to m4_MACRO-NAME.
m4_define([m4_rename_m4],
[m4_rename([$1], [m4_$1])])
# m4_copy_unm4(m4_MACRO-NAME)
# ---------------------------
# Copy m4_MACRO-NAME to 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'. Conditionals first, since
# some subsequent renames are conditional.
m4_rename_m4([ifdef])
m4_rename([ifelse], [m4_if])
m4_rename_m4([builtin])
m4_rename_m4([changecom])
m4_rename_m4([changequote])
m4_ifdef([changeword],dnl conditionally available in 1.4.x
[m4_undefine([changeword])])
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_undefine([include])
m4_rename_m4([incr])
m4_rename_m4([index])
m4_rename_m4([indir])
m4_rename_m4([len])
m4_rename([m4exit], [m4_exit])
m4_undefine([m4wrap])
m4_ifdef([mkstemp],dnl added in M4 1.4.8
[m4_rename_m4([mkstemp])
m4_copy([m4_mkstemp], [m4_maketemp])
m4_undefine([maketemp])],
[m4_rename_m4([maketemp])
m4_copy([m4_maketemp], [m4_mkstemp])])
m4_rename([patsubst], [m4_bpatsubst])
m4_rename_m4([popdef])
m4_rename_m4([pushdef])
m4_rename([regexp], [m4_bregexp])
m4_rename_m4([shift])
m4_undefine([sinclude])
m4_rename_m4([substr])
m4_ifdef([symbols],dnl present only in alpha-quality 1.4o
[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_warn(CATEGORY, MESSAGE, STACK-TRACE)
# ----------------------------------------
# Report a MESSAGE to the user if the CATEGORY of warnings is enabled.
# This is for traces only.
# The STACK-TRACE is a \n-separated list of "LOCATION: MESSAGE".
#
# Within m4, the macro is a no-op. This macro really matters
# when autom4te post-processes the trace output.
m4_define([_m4_warn], [])
# m4_warn(CATEGORY, MESSAGE)
# --------------------------
# Report a MESSAGE to the user if the CATEGORY of warnings is enabled.
m4_define([m4_warn],
[_m4_warn([$1], [$2],
m4_ifdef([m4_expansion_stack],
[_m4_defn([m4_expansion_stack])
m4_location[: the top level]]))dnl
])
## ------------------- ##
## 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
# too many people forget to quote 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)
# ----------------
# Like the builtin include, but warns against multiple inclusions.
m4_define([m4_include],
[m4_include_unique([$1])dnl
m4_builtin([include], [$1])])
# m4_sinclude(FILE)
# -----------------
# Like 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 the variation `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_ifval(_m4_defn([$1]), [$2], [$3])],
[$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.
#
# Please keep foreach.m4 in sync with any adjustments made here.
m4_define([m4_case],
[m4_if([$#], 0, [],
[$#], 1, [],
[$#], 2, [$2],
[$1], [$2], [$3],
[$0([$1], m4_shift3($@))])])
# 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.
#
# Please keep foreach.m4 in sync with any adjustments made here.
m4_define([m4_bmatch],
[m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])],
[$#], 1, [m4_fatal([$0: too few arguments: $#: $1])],
[$#], 2, [$2],
[m4_if(m4_bregexp([$1], [$2]), -1, [$0([$1], m4_shift3($@))],
[$3])])])
# m4_car(LIST)
# m4_cdr(LIST)
# ------------
# Manipulate m4 lists.
m4_define([m4_car], [[$1]])
m4_define([m4_cdr],
[m4_if([$#], 0, [m4_fatal([$0: cannot be called without arguments])],
[$#], 1, [],
[m4_dquote(m4_shift($@))])])
# _m4_cdr(LIST)
# -------------
# Like m4_cdr, except include a leading comma unless only one element
# remains. Why? Because comparing a large list against [] is more
# expensive in expansion time than comparing the number of arguments; so
# _m4_cdr can be used to reduce the number of arguments when it is time
# to end recursion.
m4_define([_m4_cdr],
[m4_if([$#], 1, [],
[, m4_dquote(m4_shift($@))])])
# m4_cond(TEST1, VAL1, IF-VAL1, TEST2, VAL2, IF-VAL2, ..., [DEFAULT])
# -------------------------------------------------------------------
# Similar to m4_if, except that each TEST is expanded when encountered.
# If the expansion of TESTn matches the string VALn, the result is IF-VALn.
# The result is DEFAULT if no tests passed. This macro allows
# short-circuiting of expensive tests, where it pays to arrange quick
# filter tests to run first.
#
# For an example, consider a previous implementation of _AS_QUOTE_IFELSE:
#
# m4_if(m4_index([$1], [\]), [-1], [$2],
# m4_eval(m4_index([$1], [\\]) >= 0), [1], [$2],
# m4_eval(m4_index([$1], [\$]) >= 0), [1], [$2],
# m4_eval(m4_index([$1], [\`]) >= 0), [1], [$3],
# m4_eval(m4_index([$1], [\"]) >= 0), [1], [$3],
# [$2])
#
# Here, m4_index is computed 5 times, and m4_eval 4, even if $1 contains
# no backslash. It is more efficient to do:
#
# m4_cond([m4_index([$1], [\])], [-1], [$2],
# [m4_eval(m4_index([$1], [\\]) >= 0)], [1], [$2],
# [m4_eval(m4_index([$1], [\$]) >= 0)], [1], [$2],
# [m4_eval(m4_index([$1], [\`]) >= 0)], [1], [$3],
# [m4_eval(m4_index([$1], [\"]) >= 0)], [1], [$3],
# [$2])
#
# In the common case of $1 with no backslash, only one m4_index expansion
# occurs, and m4_eval is avoided altogether.
#
# Please keep foreach.m4 in sync with any adjustments made here.
m4_define([m4_cond],
[m4_if([$#], [0], [m4_fatal([$0: cannot be called without arguments])],
[$#], [1], [$1],
m4_eval([$# % 3]), [2], [m4_fatal([$0: missing an argument])],
[_$0($@)])])
m4_define([_m4_cond],
[m4_if(($1), [($2)], [$3],
[$#], [3], [],
[$#], [4], [$4],
[$0(m4_shift3($@))])])
## ---------------------------------------- ##
## 6. Enhanced version of some primitives. ##
## ---------------------------------------- ##
# m4_bpatsubsts(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_bpatsubst', 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.
#
# Recall that m4_shift3 always results in an argument. Hence, we need
# to distinguish between a final deletion vs. ending recursion.
#
# Please keep foreach.m4 in sync with any adjustments made here.
m4_define([m4_bpatsubsts],
[m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])],
[$#], 1, [m4_fatal([$0: too few arguments: $#: $1])],
[$#], 2, [m4_unquote(m4_builtin([patsubst], [[$1]], [$2]))],
[$#], 3, [m4_unquote(m4_builtin([patsubst], [[$1]], [$2], [$3]))],
[_$0($@m4_if(m4_eval($# & 1), 0, [,]))])])
m4_define([_m4_bpatsubsts],
[m4_if([$#], 2, [$1],
[$0(m4_builtin([patsubst], [[$1]], [$2], [$3]),
m4_shift3($@))])])
# 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.
#
# This macro is called on hot paths, so inline the contents of m4_ifval,
# for one less round of expansion.
m4_define([m4_default],
[m4_if([$1], [], [$2], [$1])])
# m4_defn(NAME)
# -------------
# Like the original, except guarantee a warning when using something which is
# undefined (unlike M4 1.4.x). This replacement is not a full-featured
# replacement: if any of the defined macros contain unbalanced quoting, but
# when pasted together result in a well-quoted string, then only native m4
# support is able to get it correct. But that's where quadrigraphs come in
# handy, if you really need unbalanced quotes inside your macros.
#
# This macro is called frequently, so minimize the amount of additional
# expansions by skipping m4_ifndef. Better yet, if __m4_version__ exists,
# (added in M4 1.6), then let m4 do the job for us (see m4_init).
#
# _m4_defn is for internal use only - it bypasses the wrapper, so it
# must only be used on one argument at a time, and only on macros
# known to be defined. Make sure this still works if the user renames
# m4_defn but not _m4_defn.
m4_copy([m4_defn], [_m4_defn])
m4_define([m4_defn],
[m4_if([$#], [0], [[$0]],
[$#], [1], [m4_ifdef([$1], [_m4_defn([$1])],
[m4_fatal([$0: undefined macro: $1])])],
[m4_foreach([_m4_macro], [$@], [$0(_m4_defn([_m4_macro]))])])])
# _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)
# ---------------
# Like the original, except guarantee a warning when using something which is
# undefined (unlike M4 1.4.x).
#
# This macro is called frequently, so minimize the amount of additional
# expansions by skipping m4_ifndef. Better yet, if __m4_version__ exists,
# (added in M4 1.6), then let m4 do the job for us (see m4_init).
#
# _m4_popdef is for internal use only - it bypasses the wrapper, so it
# must only be used on macros known to be defined. Make sure this
# still works if the user renames m4_popdef but not _m4_popdef.
m4_copy([m4_popdef], [_m4_popdef])
m4_define([m4_popdef],
[m4_if([$#], [0], [[$0]],
[$#], [1], [m4_ifdef([$1], [_m4_popdef([$1])],
[m4_fatal([$0: undefined macro: $1])])],
[m4_foreach([_m4_macro], [$@], [$0(_m4_defn([_m4_macro]))])])])
# m4_shiftn(N, ...)
# -----------------
# Returns ... shifted N times. Useful for recursive "varargs" constructs.
#
# Autoconf does not use this macro, because it is inherently slower than
# calling the common cases of m4_shift2 or m4_shift3 directly. But it
# might as well be fast for other clients, such as Libtool. One way to
# do this is to expand $@ only once in _m4_shiftn (otherwise, for long
# lists, the expansion of m4_if takes twice as much memory as what the
# list itself occupies, only to throw away the unused branch). The end
# result is strictly equivalent to
# m4_if([$1], 1, [m4_shift(,m4_shift(m4_shift($@)))],
# [_m4_shiftn(m4_decr([$1]), m4_shift(m4_shift($@)))])
# but with the final `m4_shift(m4_shift($@)))' shared between the two
# paths. The first leg uses a no-op m4_shift(,$@) to balance out the ().
#
# Please keep foreach.m4 in sync with any adjustments made here.
m4_define([m4_shiftn],
[m4_assert(0 < $1 && $1 < $#)_$0($@)])
m4_define([_m4_shiftn],
[m4_if([$1], 1, [m4_shift(],
[$0(m4_decr([$1])]), m4_shift(m4_shift($@)))])
# m4_shift2(...)
# m4_shift3(...)
# -----------------
# Returns ... shifted twice, and three times. Faster than m4_shiftn.
m4_define([m4_shift2], [m4_shift(m4_shift($@))])
m4_define([m4_shift3], [m4_shift(m4_shift(m4_shift($@)))])
# _m4_shift2(...)
# _m4_shift3(...)
# ---------------
# Like m4_shift2 or m4_shift3, except include a leading comma unless shifting
# consumes all arguments. Why? Because in recursion, it is nice to
# distinguish between 1 element left and 0 elements left, based on how many
# arguments this shift expands to.
m4_define([_m4_shift2],
[m4_if([$#], [2], [],
[, m4_shift(m4_shift($@))])])
m4_define([_m4_shift3],
[m4_if([$#], [3], [],
[, m4_shift(m4_shift(m4_shift($@)))])])
# m4_undefine(NAME)
# -----------------
# Like the original, except guarantee a warning when using something which is
# undefined (unlike M4 1.4.x).
#
# This macro is called frequently, so minimize the amount of additional
# expansions by skipping m4_ifndef. Better yet, if __m4_version__ exists,
# (added in M4 1.6), then let m4 do the job for us (see m4_init).
#
# _m4_undefine is for internal use only - it bypasses the wrapper, so
# it must only be used on macros known to be defined. Make sure this
# still works if the user renames m4_undefine but not _m4_undefine.
m4_copy([m4_undefine], [_m4_undefine])
m4_define([m4_undefine],
[m4_if([$#], [0], [[$0]],
[$#], [1], [m4_ifdef([$1], [_m4_undefine([$1])],
[m4_fatal([$0: undefined macro: $1])])],
[m4_foreach([_m4_macro], [$@], [$0(_m4_defn([_m4_macro]))])])])
# _m4_wrap(PRE, POST)
# -------------------
# Helper macro for m4_wrap and m4_wrap_lifo. Allows nested calls to
# m4_wrap within wrapped text. Use _m4_defn and _m4_popdef for speed.
m4_define([_m4_wrap],
[m4_ifdef([$0_text],
[m4_define([$0_text], [$1]_m4_defn([$0_text])[$2])],
[m4_builtin([m4wrap], [m4_unquote(
_m4_defn([$0_text])_m4_popdef([$0_text]))])m4_define([$0_text], [$1$2])])])
# m4_wrap(TEXT)
# -------------
# Append TEXT to the list of hooks to be executed at the end of input.
# Whereas the order of the original may be LIFO in the underlying m4,
# this version is always FIFO.
m4_define([m4_wrap],
[_m4_wrap([], [$1[]])])
# m4_wrap_lifo(TEXT)
# ------------------
# Prepend TEXT to the list of hooks to be executed at the end of input.
# Whereas the order of m4_wrap may be FIFO in the underlying m4, this
# version is always LIFO.
m4_define([m4_wrap_lifo],
[_m4_wrap([$1[]])])
## ------------------------- ##
## 7. Quoting manipulation. ##
## ------------------------- ##
# m4_apply(MACRO, LIST)
# ---------------------
# Invoke MACRO, with arguments provided from the quoted list of
# comma-separated quoted arguments. If LIST is empty, invoke MACRO
# without arguments. The expansion will not be concatenated with
# subsequent text.
m4_define([m4_apply],
[m4_if([$2], [], [$1], [$1($2)])[]])
# _m4_apply(MACRO, LIST)
# ----------------------
# Like m4_apply, except do nothing if LIST is empty.
m4_define([_m4_apply],
[m4_if([$2], [], [], [$1($2)[]])])
# m4_count(ARGS)
# --------------
# Return a count of how many ARGS are present.
m4_define([m4_count], [$#])
# 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. No concatenation
# occurs after a STRING; use m4_unquote(m4_join(,STRING)) for that.
#
# Please keep foreach.m4 in sync with any adjustments made here.
m4_define([m4_do],
[m4_if([$#], 0, [],
[$#], 1, [$1[]],
[$1[]$0(m4_shift($@))])])
# m4_dquote(ARGS)
# ---------------
# Return ARGS as a quoted list of quoted arguments.
m4_define([m4_dquote], [[$@]])
# m4_dquote_elt(ARGS)
# -------------------
# Return ARGS as an unquoted list of double-quoted arguments.
#
# Please keep foreach.m4 in sync with any adjustments made here.
m4_define([m4_dquote_elt],
[m4_if([$#], [0], [],
[$#], [1], [[[$1]]],
[[[$1]],$0(m4_shift($@))])])
# m4_echo(ARGS)
# -------------
# Return the ARGS, with the same level of quoting. Whitespace after
# unquoted commas are consumed.
m4_define([m4_echo], [$@])
# m4_expand(ARG)
# --------------
# Return the expansion of ARG as a single string. Unlike m4_quote($1), this
# correctly preserves whitespace following single-quoted commas that appeared
# within ARG.
#
# m4_define([active], [ACT, IVE])
# m4_define([active2], [[ACT, IVE]])
# m4_quote(active, active2)
# => ACT,IVE,ACT, IVE
# m4_expand([active, active2])
# => ACT, IVE, ACT, IVE
#
# Unfortunately, due to limitations in m4, ARG must expand to something
# with balanced quotes (use quadrigraphs to get around this). The input
# is not likely to have unbalanced -=<{(/)}>=- quotes, and it is possible
# to have unbalanced (), provided it was specified with proper [] quotes.
#
# Exploit that extra () will group unquoted commas and the following
# whitespace, then convert () to []. m4_bpatsubst can't handle newlines
# inside $1, and m4_substr strips quoting. So we (ab)use m4_changequote.
m4_define([m4_expand], [_$0(-=<{($1)}>=-)])
m4_define([_m4_expand],
[m4_changequote([-=<{(], [)}>=-])$1m4_changequote([, ])])
# m4_ignore(ARGS)
# ---------------
# Expands to nothing. Useful for conditionally ignoring an arbitrary
# number of arguments (see _m4_list_cmp for an example).
m4_define([m4_ignore])
# m4_make_list(ARGS)
# ------------------
# Similar to m4_dquote, this creates a quoted list of quoted ARGS. This
# version is less efficient than m4_dquote, but separates each argument
# with a comma and newline, rather than just comma, for readability.
# When developing an m4sugar algorithm, you could temporarily use
# m4_pushdef([m4_dquote],m4_defn([m4_make_list]))
# around your code to make debugging easier.
m4_define([m4_make_list], [m4_join([,
], m4_dquote_elt($@))])
# m4_noquote(STRING)
# ------------------
# Return the result of ignoring all quotes in STRING and invoking the
# macros it contains. Amongst other things, this is useful for enabling
# macro invocations inside strings with [] blocks (for instance regexps
# and help-strings). On the other hand, since all quotes are disabled,
# any macro expanded during this time that relies on nested [] quoting
# will likely crash and burn. This macro is seldom useful; consider
# m4_unquote or m4_expand instead.
m4_define([m4_noquote],
[m4_changequote([-=<{(],[)}>=-])$1-=<{()}>=-m4_changequote([,])])
# m4_quote(ARGS)
# --------------
# Return ARGS as a single argument. Any whitespace after unquoted commas
# is stripped. There is always output, even when there were no 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_quote(ARGS)
# ---------------
# Like m4_quote, except that when there are no arguments, there is no
# output. For conditional scenarios (such as passing _m4_quote as the
# macro name in m4_mapall), this feature can be used to distinguish between
# one argument of the empty string vs. no arguments. However, in the
# normal case with arguments present, this is less efficient than m4_quote.
m4_define([_m4_quote],
[m4_if([$#], [0], [], [[$*]])])
# m4_reverse(ARGS)
# ----------------
# Output ARGS in reverse order.
#
# Please keep foreach.m4 in sync with any adjustments made here.
m4_define([m4_reverse],
[m4_if([$#], [0], [], [$#], [1], [[$1]],
[$0(m4_shift($@)), [$1]])])
# m4_unquote(ARGS)
# ----------------
# Remove one layer of quotes from each ARG, performing one level of
# expansion. For one argument, m4_unquote([arg]) is more efficient than
# m4_do([arg]), but for multiple arguments, the difference is that
# m4_unquote separates arguments with commas while m4_do concatenates.
# Follow this macro with [] if concatenation with subsequent text is
# undesired.
m4_define([m4_unquote], [$*])
## -------------------------- ##
## 8. Implementing m4 loops. ##
## -------------------------- ##
# m4_for(VARIABLE, FIRST, LAST, [STEP = +/-1], EXPRESSION)
# --------------------------------------------------------
# Expand EXPRESSION defining VARIABLE to FROM, FROM + 1, ..., TO with
# increments of STEP. Both limits are included, and bounds are
# checked for consistency. The algorithm is robust to indirect
# VARIABLE names. Changing VARIABLE inside EXPRESSION will not impact
# the number of iterations.
#
# Uses _m4_defn for speed, and avoid dnl in the macro body.
m4_define([m4_for],
[m4_pushdef([$1], m4_eval([$2]))]dnl
[m4_cond([m4_eval(([$3]) > ([$2]))], 1,
[m4_pushdef([_m4_step], m4_eval(m4_default([$4],
1)))m4_assert(_m4_step > 0)_$0([$1], _m4_defn([$1]),
m4_eval((([$3]) - ([$2])) / _m4_step * _m4_step + ([$2])),
_m4_step, [$5])],
[m4_eval(([$3]) < ([$2]))], 1,
[m4_pushdef([_m4_step], m4_eval(m4_default([$4],
-1)))m4_assert(_m4_step < 0)_$0([$1], _m4_defn([$1]),
m4_eval((([$2]) - ([$3])) / -(_m4_step) * _m4_step + ([$2])),
_m4_step, [$5])],
[m4_pushdef([_m4_step])$5])[]]dnl
[m4_popdef([_m4_step], [$1])])
# _m4_for(VARIABLE, COUNT, LAST, STEP, EXPRESSION)
# ------------------------------------------------
# Core of the loop, no consistency checks, all arguments are plain
# numbers. Define VARIABLE to COUNT, expand EXPRESSION, then alter
# COUNT by STEP and iterate if COUNT is not LAST.
m4_define([_m4_for],
[m4_define([$1], [$2])$5[]m4_if([$2], [$3], [],
[$0([$1], m4_eval([$2 + $4]), [$3], [$4], [$5])])])
# Implementing `foreach' loops in m4 is much more tricky than it may
# seem. For example, the old M4 1.4.4 manual had an incorrect example,
# which looked like this (when translated to m4sugar):
#
# | # 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], (m4_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], [(m4_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], [m4_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 nice implementation
# that doesn't require extra parentheses in the user's LIST.
#
# But wait - now the algorithm is quadratic, because every recursion of
# the algorithm keeps the entire LIST and merely adds another m4_shift to
# the quoted text. If the user has a lot of elements in LIST, you can
# bring the system to its knees with the memory m4 then requires, or trip
# the m4 --nesting-limit recursion factor. The only way to avoid
# quadratic growth is ensure m4_shift is expanded prior to the recursion.
# Hence the design below.
#
# The M4 manual now includes a chapter devoted to this issue, with
# the lessons learned from m4sugar. And still, this design is only
# optimal for M4 1.6; see foreach.m4 for yet more comments on why
# M4 1.4.x uses yet another 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-
#
# This macro is called frequently, so avoid extra expansions such as
# m4_ifval and dnl. Also, since $2 might be quite large, try to use it
# as little as possible in _m4_foreach; each extra use requires that much
# more memory for expansion. So, rather than directly compare $2 against
# [] and use m4_car/m4_cdr for recursion, we instead unbox the list (which
# requires swapping the argument order in the helper), insert an ignored
# third argument, and use m4_shift3 to detect when recursion is complete.
#
# Please keep foreach.m4 in sync with any adjustments made here.
m4_define([m4_foreach],
[m4_if([$2], [], [],
[m4_pushdef([$1])_$0([$1], [$3], [], $2)m4_popdef([$1])])])
m4_define([_m4_foreach],
[m4_if([$#], [3], [],
[m4_define([$1], [$4])$2[]$0([$1], [$2], m4_shift3($@))])])
# m4_foreach_w(VARIABLE, LIST, EXPRESSION)
# ----------------------------------------
#
# Like m4_foreach, but the list is whitespace separated.
#
# This macro is robust to active symbols:
# m4_foreach_w([Var], [ active
# b act\
# ive ], [-Var-])end
# => -active--b--active-end
#
m4_define([m4_foreach_w],
[m4_foreach([$1], m4_split(m4_normalize([$2]), [ ]), [$3])])
# m4_map(MACRO, LIST)
# m4_mapall(MACRO, LIST)
# ----------------------
# Invoke MACRO($1), MACRO($2) etc. where $1, $2... are the elements of
# LIST. $1, $2... must in turn be lists, appropriate for m4_apply.
# If LIST contains an empty sublist, m4_map skips the expansion of
# MACRO, while m4_mapall expands MACRO with no arguments.
#
# Since LIST may be quite large, we want to minimize how often it
# appears in the expansion. Rather than use m4_car/m4_cdr iteration,
# we unbox the list, ignore the second argument, and use m4_shift2 to
# detect the end of recursion. The mismatch in () is intentional; see
# _m4_map. For m4_map, an empty list behaves like an empty sublist
# and gets ignored; for m4_mapall, we must special-case the empty
# list.
#
# Please keep foreach.m4 in sync with any adjustments made here.
m4_define([m4_map],
[_m4_map([_m4_apply([$1]], [], $2)])
m4_define([m4_mapall],
[m4_if([$2], [], [],
[_m4_map([m4_apply([$1]], [], $2)])])
# m4_map_sep(MACRO, SEPARATOR, LIST)
# m4_mapall_sep(MACRO, SEPARATOR, LIST)
# -------------------------------------
# Invoke MACRO($1), SEPARATOR, MACRO($2), ..., MACRO($N) where $1,
# $2... $N are the elements of LIST, and are in turn lists appropriate
# for m4_apply. SEPARATOR is expanded, in order to allow the creation
# of a list of arguments by using a single-quoted comma as the
# separator. For each empty sublist, m4_map_sep skips the expansion
# of MACRO and SEPARATOR, while m4_mapall_sep expands MACRO with no
# arguments.
#
# For m4_mapall_sep, merely expand the first iteration without the
# separator, then include separator as part of subsequent recursion;
# but avoid extra expansion of LIST's side-effects via a helper macro.
# For m4_map_sep, things are trickier - we don't know if the first
# list element is an empty sublist, so we must define a self-modifying
# helper macro and use that as the separator instead.
m4_define([m4_map_sep],
[m4_pushdef([m4_Sep], [m4_define([m4_Sep], _m4_defn([m4_unquote]))])]dnl
[_m4_map([_m4_apply([m4_Sep([$2])[]$1]], [], $3)m4_popdef([m4_Sep])])
m4_define([m4_mapall_sep],
[m4_if([$3], [], [], [_$0([$1], [$2], $3)])])
m4_define([_m4_mapall_sep],
[m4_apply([$1], [$3])_m4_map([m4_apply([$2[]$1]], m4_shift2($@))])
# _m4_map(PREFIX, IGNORED, SUBLIST, ...)
# --------------------------------------
# Common implementation for all four m4_map variants. The mismatch in
# the number of () is intentional. PREFIX must supply a form of
# m4_apply, the open `(', and the MACRO to be applied. Each iteration
# then appends `,', the current SUBLIST and the closing `)', then
# recurses to the next SUBLIST. IGNORED is an aid to ending recursion
# efficiently.
#
# Please keep foreach.m4 in sync with any adjustments made here.
m4_define([_m4_map],
[m4_if([$#], [2], [],
[$1, [$3])$0([$1], m4_shift2($@))])])
# m4_transform(EXPRESSION, ARG...)
# --------------------------------
# Expand EXPRESSION([ARG]) for each argument. More efficient than
# m4_foreach([var], [ARG...], [EXPRESSION(m4_defn([var]))])
#
# Please keep foreach.m4 in sync with any adjustments made here.
m4_define([m4_transform],
[m4_if([$#], [0], [m4_fatal([$0: too few arguments: $#])],
[$#], [1], [],
[$#], [2], [$1([$2])[]],
[$1([$2])[]$0([$1], m4_shift2($@))])])
# m4_transform_pair(EXPRESSION, [END-EXPR = EXPRESSION], ARG...)
# --------------------------------------------------------------
# Perform a pairwise grouping of consecutive ARGs, by expanding
# EXPRESSION([ARG1], [ARG2]). If there are an odd number of ARGs, the
# final argument is expanded with END-EXPR([ARGn]).
#
# For example:
# m4_define([show], [($*)m4_newline])dnl
# m4_transform_pair([show], [], [a], [b], [c], [d], [e])dnl
# => (a,b)
# => (c,d)
# => (e)
#
# Please keep foreach.m4 in sync with any adjustments made here.
m4_define([m4_transform_pair],
[m4_if([$#], [0], [m4_fatal([$0: too few arguments: $#])],
[$#], [1], [m4_fatal([$0: too few arguments: $#: $1])],
[$#], [2], [],
[$#], [3], [m4_default([$2], [$1])([$3])[]],
[$#], [4], [$1([$3], [$4])[]],
[$1([$3], [$4])[]$0([$1], [$2], m4_shift(m4_shift3($@)))])])
## --------------------------- ##
## 9. More diversion support. ##
## --------------------------- ##
# _m4_divert(DIVERSION-NAME or NUMBER)
# ------------------------------------
# If DIVERSION-NAME is the name of a diversion, return its number,
# otherwise if it 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)
# The empty diversion name is a synonym for 0.
m4_define([_m4_divert()], 0)
# _m4_divert_n_stack
# ------------------
# Print m4_divert_stack with newline prepended, if it's nonempty.
m4_define([_m4_divert_n_stack],
[m4_ifdef([m4_divert_stack], [
_m4_defn([m4_divert_stack])])])
# 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_divert_n_stack)]dnl
[m4_builtin([divert], _m4_divert([$1]))])
# 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_divert_n_stack)]dnl
[m4_pushdef([_m4_divert_diversion], [$1])]dnl
[m4_builtin([divert], _m4_divert([$1]))])
# m4_divert_pop([DIVERSION-NAME])
# -------------------------------
# Change the diversion stream to its previous value, unstacking it.
# If specified, verify we left DIVERSION-NAME.
# When we pop the last value from the stack, we divert to -1.
m4_define([m4_divert_pop],
[m4_ifndef([_m4_divert_diversion],
[m4_fatal([too many m4_divert_pop])])]dnl
[m4_if([$1], [], [],
[$1], _m4_defn([_m4_divert_diversion]), [],
[m4_fatal([$0($1): diversion mismatch: ]_m4_divert_n_stack)])]dnl
[_m4_popdef([m4_divert_stack], [_m4_divert_diversion])]dnl
[m4_builtin([divert],
m4_ifdef([_m4_divert_diversion],
[_m4_divert(_m4_defn([_m4_divert_diversion]))],
-1))])
# 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])$2
m4_divert_pop([$1])])
# m4_divert_once(DIVERSION-NAME, CONTENT)
# ---------------------------------------
# Output CONTENT into DIVERSION-NAME once, if not already there.
# 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. Unlike the M4 version, this only takes a single
# diversion identifier, and should not be used to undivert files.
m4_define([m4_undivert],
[m4_builtin([undivert], _m4_divert([$1]))])
## --------------------------------------------- ##
## 10. 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 use 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 levels 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, we use 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 macros are expanded. (The bug above can
# indeed be described as: a macro has been AC_PROVIDE'd before its
# dependent, but it is emitted after: the lack of correlation between
# emission and expansion order is guilty).
#
# How to do that? You keep 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 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
# are 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 _m4_divert_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
# _m4_require_call m4_divert_pushes another temporary diversion,
# GROW - 1, and expands TEST2a in there.
# DUMP: BODY
# BODY: empty
# GROW - 1: TEST2a
# diversions: GROW - 1, GROW, BODY |-
# Than the content of the temporary diversion is moved to DUMP and the
# temporary diversion is popped.
# DUMP: BODY
# BODY: TEST2a
# diversions: GROW, BODY |-
#
# * TEST1 requires TEST2b
# Again, _m4_require_call pushes GROW - 1 and heads to expand TEST2b.
# DUMP: BODY
# BODY: TEST2a
# diversions: GROW - 1, GROW, BODY |-
#
# * TEST2b requires TEST3
# _m4_require_call pushes GROW - 2 and expands TEST3 here.
# (TEST3 requires TEST2a, but TEST2a has already been m4_provide'd, so
# nothing happens.)
# DUMP: BODY
# BODY: TEST2a
# GROW - 2: TEST3
# diversions: GROW - 2, GROW - 1, GROW, BODY |-
# Than the diversion is appended to DUMP, and popped.
# DUMP: BODY
# BODY: TEST2a; TEST3
# diversions: GROW - 1, GROW, BODY |-
#
# * TEST1 requires TEST2b (contd.)
# The content of TEST2b is expanded...
# DUMP: BODY
# BODY: TEST2a; TEST3
# GROW - 1: TEST2b,
# diversions: GROW - 1, GROW, BODY |-
# ... and moved to DUMP.
# DUMP: BODY
# BODY: TEST2a; TEST3; TEST2b
# diversions: GROW, BODY |-
#
# * TEST1 is expanded: epilogue
# TEST1's own content is in GROW...
# DUMP: BODY
# BODY: TEST2a; TEST3; TEST2b
# GROW: TEST1
# diversions: BODY |-
# ... and it's epilogue moves it to DUMP and then 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 detect circular m4_require dependencies.
# Each time we expand a macro FOO we define _m4_expanding(FOO); and
# m4_require(BAR) simply checks whether _m4_expanding(BAR) is defined.
# 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
# ----------------------
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.
#
# This is called frequently, so minimize the number of macro invocations
# by avoiding dnl and m4_defn overhead.
m4_define([_m4_defun_pro],
m4_do([[m4_ifdef([m4_expansion_stack], [], [_m4_defun_pro_outer[]])]],
[[m4_expansion_stack_push(_m4_defn(
[m4_location($1)])[: $1 is expanded from...])]],
[[m4_pushdef([_m4_expanding($1)])]]))
m4_define([_m4_defun_pro_outer],
[m4_copy([_m4_divert_diversion], [_m4_divert_dump])m4_divert_push([GROW])])
# _m4_defun_epi(MACRO-NAME)
# -------------------------
# The Epilogue for Autoconf macros. MACRO-NAME only helps tracing
# the PRO/EPI pairs.
#
# This is called frequently, so minimize the number of macro invocations
# by avoiding dnl and m4_popdef overhead.
m4_define([_m4_defun_epi],
m4_do([[_m4_popdef([_m4_expanding($1)])]],
[[m4_expansion_stack_pop()]],
[[m4_ifdef([m4_expansion_stack], [], [_m4_defun_epi_outer[]])]],
[[m4_provide([$1])]]))
m4_define([_m4_defun_epi_outer],
[_m4_undefine([_m4_divert_dump])m4_divert_pop([GROW])m4_undivert([GROW])])
# 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 forbidden extended regular
# expression ERE should be seen in the output unless...
m4_define([m4_pattern_forbid], [])
# m4_pattern_allow(ERE)
# ---------------------
# ... that token also matches the allowed extended regular expression ERE.
# Both used via traces.
m4_define([m4_pattern_allow], [])
## --------------------------------- ##
## 11. Dependencies between macros. ##
## --------------------------------- ##
# m4_before(THIS-MACRO-NAME, CALLED-MACRO-NAME)
# ---------------------------------------------
# Issue a warning if CALLED-MACRO-NAME was called before THIS-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)'.
#
# This is called frequently, so minimize the number of macro invocations
# by avoiding dnl and other overhead on the common path.
m4_define([m4_require],
m4_do([[m4_ifdef([_m4_expanding($1)],
[m4_fatal([$0: circular dependency of $1])])]],
[[m4_ifdef([_m4_divert_dump], [],
[m4_fatal([$0($1): cannot be used outside of an ]dnl
m4_bmatch([$0], [^AC_], [[AC_DEFUN]], [[m4_defun]])['d macro])])]],
[[m4_provide_if([$1],
[],
[_m4_require_call([$1], [$2])])]]))
# _m4_require_call(NAME-TO-CHECK, [BODY-TO-EXPAND = NAME-TO-CHECK])
# -----------------------------------------------------------------
# If m4_require decides to expand the body, it calls this macro.
#
# This is called frequently, so minimize the number of macro invocations
# by avoiding dnl and other overhead on the common path.
m4_define([_m4_require_call],
m4_do([[m4_define([_m4_divert_grow], m4_decr(_m4_divert_grow))]],
[[m4_divert_push(_m4_divert_grow)]],
[[m4_default([$2], [$1])
m4_provide_if([$1],
[],
[m4_warn([syntax],
[$1 is m4_require'd but not m4_defun'd])])]],
[[m4_divert(_m4_defn([_m4_divert_dump]))]],
[[m4_undivert(_m4_divert_grow)]],
[[m4_divert_pop(_m4_divert_grow)]],
[[m4_define([_m4_divert_grow], m4_incr(_m4_divert_grow))]]))
# _m4_divert_grow
# ---------------
# The counter for _m4_require_call.
m4_define([_m4_divert_grow], _m4_divert([GROW]))
# 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])])
## --------------------- ##
## 12. 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_alnum
# -----------
m4_define([m4_cr_alnum],
m4_defn([m4_cr_Letters])dnl
m4_defn([m4_cr_digits])dnl
)
# 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_cr_all
# ---------
# The character range representing everything, with `-' as the last
# character, since it is special to m4_translit. Use with care, because
# it contains characters special to M4 (fortunately, both ASCII and EBCDIC
# have [] in order, so m4_defn([m4_cr_all]) remains a valid string). It
# also contains characters special to terminals, so it should never be
# displayed in an error message. Also, attempts to map [ and ] to other
# characters via m4_translit must deal with the fact that m4_translit does
# not add quotes to the output.
#
# It is mainly useful in generating inverted character range maps, for use
# in places where m4_translit is faster than an equivalent m4_bpatsubst;
# the regex `[^a-z]' is equivalent to:
# m4_translit(m4_dquote(m4_defn([m4_cr_all])), [a-z])
m4_define([m4_cr_all],
m4_translit(m4_dquote(m4_format(m4_dquote(m4_for(
,1,255,,[[%c]]))m4_for([i],1,255,,[,i]))), [-])-)
# _m4_define_cr_not(CATEGORY)
# ---------------------------
# Define m4_cr_not_CATEGORY as the inverse of m4_cr_CATEGORY.
m4_define([_m4_define_cr_not],
[m4_define([m4_cr_not_$1],
m4_translit(m4_dquote(m4_defn([m4_cr_all])),
m4_defn([m4_cr_$1])))])
# m4_cr_not_letters
# m4_cr_not_LETTERS
# m4_cr_not_Letters
# m4_cr_not_digits
# m4_cr_not_alnum
# m4_cr_not_symbols1
# m4_cr_not_symbols2
# ------------------
# Inverse character sets
_m4_define_cr_not([letters])
_m4_define_cr_not([LETTERS])
_m4_define_cr_not([Letters])
_m4_define_cr_not([digits])
_m4_define_cr_not([alnum])
_m4_define_cr_not([symbols1])
_m4_define_cr_not([symbols2])
# m4_newline
# ----------
# Expands to a newline. Exists for formatting reasons.
m4_define([m4_newline], [
])
# m4_re_escape(STRING)
# --------------------
# Escape RE active characters in STRING.
m4_define([m4_re_escape],
[m4_bpatsubst([$1],
[[][*+.?\^$]], [\\\&])])
# m4_re_string
# ------------
# Regexp for `[a-zA-Z_0-9]*'
# m4_dquote provides literal [] for the character class.
m4_define([m4_re_string],
m4_dquote(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_dquote(m4_defn([m4_cr_symbols1]))dnl
m4_defn([m4_re_string])dnl
)
# m4_tolower(STRING)
# m4_toupper(STRING)
# ------------------
# These macros convert STRING to lowercase or uppercase.
#
# Rather than expand the m4_defn each time, we inline them up front.
m4_define([m4_tolower],
[m4_translit([$1], ]m4_dquote(m4_defn([m4_cr_LETTERS]))[,
]m4_dquote(m4_defn([m4_cr_letters]))[)])
m4_define([m4_toupper],
[m4_translit([$1], ]m4_dquote(m4_defn([m4_cr_letters]))[,
]m4_dquote(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 ]+.
#
# If STRING is empty, the result is an empty list.
#
# Pay attention to the m4_changequotes. When m4 reads the definition of
# m4_split, it still has quotes set to [ and ]. Luckily, these are matched
# in the macro body, so the definition is stored correctly. Use the same
# alternate quotes as m4_noquote; it must be unlikely to appear in $1.
#
# 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
#
# Optimize on regex of ` ' (space), since m4_foreach_w already guarantees
# that the list contains single space separators, and a common case is
# splitting a single-element list. This macro is called frequently,
# so avoid unnecessary dnl inside the definition.
m4_define([m4_split],
[m4_if([$1], [], [],
[$2], [ ], [m4_if(m4_index([$1], [ ]), [-1], [[[$1]]], [_$0($@)])],
[$2], [], [_$0([$1], [[ ]+])],
[_$0($@)])])
m4_define([_m4_split],
[m4_changequote([-=<{(],[)}>=-])]dnl
[[m4_bpatsubst(-=<{(-=<{($1)}>=-)}>=-, -=<{($2)}>=-,
-=<{(], [)}>=-)]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
#
# In m4, m4_bpatsubst is expensive, so first check for a newline.
m4_define([m4_flatten],
[m4_if(m4_index([$1], [
]), [-1], [[$1]],
[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
#
# First, notice that we guarantee trailing space. Why? Because regular
# expressions are greedy, and `.* ?' would always group the space into the
# .* portion. The algorithm is simpler by avoiding `?' at the end. The
# algorithm correctly strips everything if STRING is just ` '.
#
# Then notice the second pattern: it is in charge of removing the
# leading/trailing spaces. Why not just `[^ ]'? Because they are
# applied to over-quoted strings, i.e. more or less [STRING], due
# to the limitations of m4_bpatsubsts. So the leading space in STRING
# is the *second* character; equally for the trailing space.
m4_define([m4_strip],
[m4_bpatsubsts([$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. Avoid back-to-back SEP when a given ARG
# is the empty string. No expansion is performed on SEP or ARGs.
#
# Since the number of arguments to join can be arbitrarily long, we
# want to avoid having more than one $@ in the macro definition;
# otherwise, the expansion would require twice the memory of the already
# long list. Hence, m4_join merely looks for the first non-empty element,
# and outputs just that element; while _m4_join looks for all non-empty
# elements, and outputs them following a separator. The final trick to
# note is that we decide between recursing with $0 or _$0 based on the
# nested m4_if ending with `_'.
#
# Please keep foreach.m4 in sync with any adjustments made here.
m4_define([m4_join],
[m4_if([$#], [1], [],
[$#], [2], [[$2]],
[m4_if([$2], [], [], [[$2]_])$0([$1], m4_shift2($@))])])
m4_define([_m4_join],
[m4_if([$#$2], [2], [],
[m4_if([$2], [], [], [[$1$2]])$0([$1], m4_shift2($@))])])
# m4_joinall(SEP, ARG1, ARG2...)
# ------------------------------
# Produce ARG1SEPARG2...SEPARGn. An empty ARG results in back-to-back SEP.
# No expansion is performed on SEP or ARGs.
#
# Please keep foreach.m4 in sync with any adjustments made here.
m4_define([m4_joinall], [[$2]_$0([$1], m4_shift($@))])
m4_define([_m4_joinall],
[m4_if([$#], [2], [], [[$1$3]$0([$1], m4_shift2($@))])])
# m4_combine([SEPARATOR], PREFIX-LIST, [INFIX], SUFFIX...)
# --------------------------------------------------------
# Produce the pairwise combination of every element in the quoted,
# comma-separated PREFIX-LIST with every element from the SUFFIX arguments.
# Each pair is joined with INFIX, and pairs are separated by SEPARATOR.
# No expansion occurs on SEPARATOR, INFIX, or elements of either list.
#
# For example:
# m4_combine([, ], [[a], [b], [c]], [-], [1], [2], [3])
# => a-1, a-2, a-3, b-1, b-2, b-3, c-1, c-2, c-3
#
# In order to have the correct number of SEPARATORs, we use a temporary
# variable that redefines itself after the first use. We must use defn
# rather than overquoting in case PREFIX or SUFFIX contains $1, but use
# _m4_defn for speed. Likewise, we compute the m4_shift3 only once,
# rather than in each iteration of the outer m4_foreach.
m4_define([m4_combine],
[m4_if(m4_eval([$# > 3]), [1],
[m4_pushdef([m4_Separator], [m4_define([m4_Separator],
_m4_defn([m4_echo]))])]]dnl
[[m4_foreach([m4_Prefix], [$2],
[m4_foreach([m4_Suffix], ]m4_dquote(m4_dquote(m4_shift3($@)))[,
[m4_Separator([$1])[]_m4_defn([m4_Prefix])[$3]_m4_defn(
[m4_Suffix])])])]]dnl
[[_m4_popdef([m4_Separator])])])
# 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'.
#
# Note that neither STRING nor SEPARATOR are expanded here; rather, when
# you expand MACRO-NAME, they will be expanded at that point in time.
#
# This macro is robust to active symbols. It can be used to grow
# strings.
#
# | m4_define(active, ACTIVE)dnl
# | m4_append([sentence], [This is an])dnl
# | m4_append([sentence], [ active ])dnl
# | m4_append([sentence], [symbol.])dnl
# | 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)dnl
# | m4_append([hooks], [m4_define([act1], [act2])])dnl
# | m4_append([hooks], [m4_define([act2], [active])])dnl
# | m4_undefine([active])dnl
# | act1
# | hooks
# | act1
# => act1
# =>
# => active
#
# It can also be used to create lists, although this particular usage was
# broken prior to autoconf 2.62.
# | m4_append([list], [one], [, ])dnl
# | m4_append([list], [two], [, ])dnl
# | m4_append([list], [three], [, ])dnl
# | list
# | m4_dquote(list)
# => one, two, three
# => [one],[two],[three]
#
# Note that m4_append can benefit from amortized O(n) m4 behavior, if
# the underlying m4 implementation is smart enough to avoid copying existing
# contents when enlarging a macro's definition into any pre-allocated storage
# (m4 1.4.x unfortunately does not implement this optimization). We do
# not implement m4_prepend, since it is inherently O(n^2) (pre-allocated
# storage only occurs at the end of a macro, so the existing contents must
# always be moved).
#
# Use _m4_defn for speed.
m4_define([m4_append],
[m4_define([$1], m4_ifdef([$1], [_m4_defn([$1])[$3]])[$2])])
# m4_append_uniq(MACRO-NAME, STRING, [SEPARATOR], [IF-UNIQ], [IF-DUP])
# --------------------------------------------------------------------
# Like `m4_append', but append only if not yet present. Additionally,
# expand IF-UNIQ if STRING was appended, or IF-DUP if STRING was already
# present. Also, warn if SEPARATOR is not empty and occurs within STRING,
# as the algorithm no longer guarantees uniqueness.
#
# Note that while m4_append can be O(n) (depending on the quality of the
# underlying M4 implementation), m4_append_uniq is inherently O(n^2)
# because each append operation searches the entire string.
m4_define([m4_append_uniq],
[m4_ifval([$3], [m4_if(m4_index([$2], [$3]), [-1], [],
[m4_warn([syntax],
[$0: `$2' contains `$3'])])])_$0($@)])
m4_define([_m4_append_uniq],
[m4_ifdef([$1],
[m4_if(m4_index([$3]_m4_defn([$1])[$3], [$3$2$3]), [-1],
[m4_append([$1], [$2], [$3])$4], [$5])],
[m4_define([$1], [$2])$4])])
# m4_append_uniq_w(MACRO-NAME, STRINGS)
# -------------------------------------
# For each of the words in the whitespace separated list STRINGS, append
# only the unique strings to the definition of MACRO-NAME.
#
# Use _m4_defn for speed.
m4_define([m4_append_uniq_w],
[m4_foreach_w([m4_Word], [$2],
[_m4_append_uniq([$1], _m4_defn([m4_Word]), [ ])])])
# m4_text_wrap(STRING, [PREFIX], [FIRST-PREFIX], [WIDTH])
# -------------------------------------------------------
# Expands into STRING wrapped to hold in WIDTH columns (default = 79).
# If PREFIX is given, 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 FIRST-PREFIX is greater than that of PREFIX, then
# FIRST-PREFIX will be left alone on the first line.
#
# No expansion occurs on the contents STRING, PREFIX, or FIRST-PREFIX,
# although quadrigraphs are correctly recognized.
#
# 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 of a line,
# which complicates it a bit. The algorithm is otherwise stupid and 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.
#
# The algorithm uses a helper that uses $2 through $4 directly, rather than
# using local variables, to avoid m4_defn overhead, or expansion swallowing
# any $. It also bypasses m4_popdef overhead with _m4_popdef since no user
# macro expansion occurs in the meantime. Also, the definition is written
# with m4_do, to avoid time wasted on dnl during expansion (since this is
# already a time-consuming macro).
m4_define([m4_text_wrap],
[_$0([$1], [$2], m4_if([$3], [], [[$2]], [[$3]]),
m4_if([$4], [], [79], [[$4]]))])
m4_define([_m4_text_wrap],
m4_do(dnl set up local variables, to avoid repeated calculations
[[m4_pushdef([m4_Indent], m4_qlen([$2]))]],
[[m4_pushdef([m4_Cursor], m4_qlen([$3]))]],
[[m4_pushdef([m4_Separator], [m4_define([m4_Separator], [ ])])]],
dnl expand the first prefix, then check its length vs. regular prefix
dnl same length: nothing special
dnl prefix1 longer: output on line by itself, and reset cursor
dnl prefix1 shorter: pad to length of prefix, and reset cursor
[[[$3]m4_cond([m4_Cursor], m4_Indent, [],
[m4_eval(m4_Cursor > m4_Indent)], [1], [
[$2]m4_define([m4_Cursor], m4_Indent)],
[m4_format([%*s], m4_max([0],
m4_eval(m4_Indent - m4_Cursor)), [])m4_define([m4_Cursor], m4_Indent)])]],
dnl now, for each word, compute the curser after the word is output, then
dnl check if the cursor would exceed the wrap column
dnl if so, reset cursor, and insert newline and prefix
dnl if not, insert the separator (usually a space)
dnl either way, insert the word
[[m4_foreach_w([m4_Word], [$1],
[m4_define([m4_Cursor],
m4_eval(m4_Cursor + m4_qlen(_m4_defn([m4_Word]))
+ 1))m4_if(m4_eval(m4_Cursor > ([$4])),
[1], [m4_define([m4_Cursor],
m4_eval(m4_Indent + m4_qlen(_m4_defn([m4_Word])) + 1))
[$2]],
[m4_Separator[]])_m4_defn([m4_Word])])]],
dnl finally, clean up the local variabls
[[_m4_popdef([m4_Separator], [m4_Cursor], [m4_Indent])]]))
# m4_text_box(MESSAGE, [FRAME-CHARACTER = `-'])
# ---------------------------------------------
# Turn MESSAGE into:
# ## ------- ##
# ## MESSAGE ##
# ## ------- ##
# using FRAME-CHARACTER in the border.
m4_define([m4_text_box],
[m4_pushdef([m4_Border],
m4_translit(m4_format([%*s], m4_qlen(m4_expand([$1])), []),
[ ], m4_if([$2], [], [[-]], [[$2]])))dnl
@%:@@%:@ m4_Border @%:@@%:@
@%:@@%:@ $1 @%:@@%:@
@%:@@%:@ m4_Border @%:@@%:@_m4_popdef([m4_Border])dnl
])
# m4_qlen(STRING)
# ---------------
# Expands to the length of STRING after autom4te converts all quadrigraphs.
#
# Avoid bpatsubsts for the common case of no quadrigraphs.
m4_define([m4_qlen],
[m4_if(m4_index([$1], [@]), [-1], [m4_len([$1])],
[m4_len(m4_bpatsubst([[$1]],
[@\(\(<:\|:>\|S|\|%:\|\{:\|:\}\)\(@\)\|&t@\)],
[\3]))])])
# m4_qdelta(STRING)
# -----------------
# Expands to the net change in the length of STRING from autom4te converting the
# quadrigraphs in STRING. This number is always negative or zero.
m4_define([m4_qdelta],
[m4_eval(m4_qlen([$1]) - m4_len([$1]))])
## ----------------------- ##
## 13. Number processing. ##
## ----------------------- ##
# m4_cmp(A, B)
# ------------
# Compare two integer expressions.
# A < B -> -1
# A = B -> 0
# A > B -> 1
m4_define([m4_cmp],
[m4_eval((([$1]) > ([$2])) - (([$1]) < ([$2])))])
# m4_list_cmp(A, B)
# -----------------
#
# Compare the two lists of integer expressions 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([xa], [oops])dnl
# m4_list_cmp([[0xa]], [5+5]) -> 0
#
# Rather than face the overhead of m4_case, we use a helper function whose
# expansion includes the name of the macro to invoke on the tail, either
# m4_ignore or m4_unquote. This is particularly useful when comparing
# long lists, since less text is being expanded for deciding when to end
# recursion. The recursion is between a pair of macros that alternate
# which list is trimmed by one element; this is more efficient than
# calling m4_cdr on both lists from a single macro. Guarantee exactly
# one expansion of both lists' side effects.
#
# Please keep foreach.m4 in sync with any adjustments made here.
m4_define([m4_list_cmp],
[_$0_raw(m4_dquote($1), m4_dquote($2))])
m4_define([_m4_list_cmp_raw],
[m4_if([$1], [$2], [0], [_m4_list_cmp_1([$1], $2)])])
m4_define([_m4_list_cmp],
[m4_if([$1], [], [0m4_ignore], [$2], [0], [m4_unquote], [$2m4_ignore])])
m4_define([_m4_list_cmp_1],
[_m4_list_cmp_2([$2], [m4_shift2($@)], $1)])
m4_define([_m4_list_cmp_2],
[_m4_list_cmp([$1$3], m4_cmp([$3+0], [$1+0]))(
[_m4_list_cmp_1(m4_dquote(m4_shift3($@)), $2)])])
# m4_max(EXPR, ...)
# m4_min(EXPR, ...)
# -----------------
# Return the decimal value of the maximum (or minimum) in a series of
# integer expressions.
#
# M4 1.4.x doesn't provide ?:. Hence this huge m4_eval. Avoid m4_eval
# if both arguments are identical, but be aware of m4_max(0xa, 10) (hence
# the use of <=, not just <, in the second multiply).
#
# Please keep foreach.m4 in sync with any adjustments made here.
m4_define([m4_max],
[m4_if([$#], [0], [m4_fatal([too few arguments to $0])],
[$#], [1], [m4_eval([$1])],
[$#$1], [2$2], [m4_eval([$1])],
[$#], [2], [_$0($@)],
[_m4_minmax([_$0], $@)])])
m4_define([_m4_max],
[m4_eval((([$1]) > ([$2])) * ([$1]) + (([$1]) <= ([$2])) * ([$2]))])
m4_define([m4_min],
[m4_if([$#], [0], [m4_fatal([too few arguments to $0])],
[$#], [1], [m4_eval([$1])],
[$#$1], [2$2], [m4_eval([$1])],
[$#], [2], [_$0($@)],
[_m4_minmax([_$0], $@)])])
m4_define([_m4_min],
[m4_eval((([$1]) < ([$2])) * ([$1]) + (([$1]) >= ([$2])) * ([$2]))])
# _m4_minmax(METHOD, ARG1, ARG2...)
# ---------------------------------
# Common recursion code for m4_max and m4_min. METHOD must be _m4_max
# or _m4_min, and there must be at least two arguments to combine.
#
# Please keep foreach.m4 in sync with any adjustments made here.
m4_define([_m4_minmax],
[m4_if([$#], [3], [$1([$2], [$3])],
[$0([$1], $1([$2], [$3]), m4_shift3($@))])])
# m4_sign(A)
# ----------
# The sign of the integer expression A.
m4_define([m4_sign],
[m4_eval((([$1]) > 0) - (([$1]) < 0))])
## ------------------------ ##
## 14. Version processing. ##
## ------------------------ ##
# m4_version_unletter(VERSION)
# ----------------------------
# Normalize beta version numbers with letters to numeric expressions, which
# can then be handed to m4_eval for the purpose of comparison.
#
# Nl -> (N+1).-1.(l#)
#
# for example:
# [2.14a] -> [2.14+1.-1.[0r36:a]] -> 2.15.-1.10
# [2.14b] -> [2.15+1.-1.[0r36:b]] -> 2.15.-1.11
# [2.61aa.b] -> [2.61+1.-1.[0r36:aa],+1.-1.[0r36:b]] -> 2.62.-1.370.1.-1.11
#
# This macro expects reasonable version numbers, but can handle double
# letters and does not expand any macros. Original version strings can
# use both `.' and `-' separators.
#
# Inline constant expansions, to avoid m4_defn overhead.
# _m4_version_unletter is the real workhorse used by m4_version_compare,
# but since [0r36:a] is less readable than 10, we provide a wrapper for
# human use.
m4_define([m4_version_unletter],
[m4_map_sep([m4_eval], [.],
m4_dquote(m4_dquote_elt(m4_unquote(_$0([$1])))))])
m4_define([_m4_version_unletter],
[m4_bpatsubst(m4_translit([[[$1]]], [.-], [,,]),]dnl
m4_dquote(m4_dquote(m4_defn([m4_cr_Letters])))[[+],
[+1,-1,[0r36:\&]])])
# 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 >
#
# Since _m4_version_unletter does not output side effects, we can
# safely bypass the overhead of m4_version_cmp.
m4_define([m4_version_compare],
[_m4_list_cmp_raw(_m4_version_unletter([$1]), _m4_version_unletter([$2]))])
# m4_PACKAGE_NAME
# m4_PACKAGE_TARNAME
# m4_PACKAGE_VERSION
# m4_PACKAGE_STRING
# m4_PACKAGE_BUGREPORT
# --------------------
# If m4sugar/version.m4 is present, then define version strings. This
# file is optional, provided by Autoconf but absent in Bison.
m4_sinclude([m4sugar/version.m4])
# m4_version_prereq(VERSION, [IF-OK], [IF-NOT = FAIL])
# ----------------------------------------------------
# Check this Autoconf version against VERSION.
m4_define([m4_version_prereq],
m4_ifdef([m4_PACKAGE_VERSION],
[[m4_if(m4_version_compare(]m4_dquote(m4_defn([m4_PACKAGE_VERSION]))[, [$1]),
[-1],
[m4_default([$3],
[m4_fatal([Autoconf version $1 or higher is required],
[63])])],
[$2])]],
[[m4_fatal([m4sugar/version.m4 not found])]]))
## ------------------ ##
## 15. Set handling. ##
## ------------------ ##
# Autoconf likes to create arbitrarily large sets; for example, as of
# this writing, the configure.ac for coreutils tracks a set of more
# than 400 AC_SUBST. How do we track all of these set members,
# without introducing duplicates? We could use m4_append_uniq, with
# the set NAME residing in the contents of the macro NAME.
# Unfortunately, m4_append_uniq is quadratic for set creation, because
# it costs O(n) to search the string for each of O(n) insertions; not
# to mention that with m4 1.4.x, even using m4_append is slow, costing
# O(n) rather than O(1) per insertion. Other set operations, not used
# by Autoconf but still possible by manipulation of the definition
# tracked in macro NAME, include O(n) deletion of one element and O(n)
# computation of set size. Because the set is exposed to the user via
# the definition of a single macro, we cannot cache any data about the
# set without risking the cache being invalidated by the user
# redefining NAME.
#
# Can we do better? Yes, because m4 gives us an O(1) search function
# for free: ifdef. Additionally, even m4 1.4.x gives us an O(1)
# insert operation for free: pushdef. But to use these, we must
# represent the set via a group of macros; to keep the set consistent,
# we must hide the set so that the user can only manipulate it through
# accessor macros. The contents of the set are maintained through two
# access points; _m4_set([name]) is a pushdef stack of values in the
# set, useful for O(n) traversal of the set contents; while the
# existence of _m4_set([name],value) with no particular value is
# useful for O(1) querying of set membership. And since the user
# cannot externally manipulate the set, we are free to add additional
# caching macros for other performance improvements. Deletion can be
# O(1) per element rather than O(n), by reworking the definition of
# _m4_set([name],value) to be 0 or 1 based on current membership, and
# adding _m4_set_cleanup(name) to defer the O(n) cleanup of
# _m4_set([name]) until we have another reason to do an O(n)
# traversal. The existence of _m4_set_cleanup(name) can then be used
# elsewhere to determine if we must dereference _m4_set([name],value),
# or assume that definition implies set membership. Finally, size can
# be tracked in an O(1) fashion with _m4_set_size(name).
#
# The quoting in _m4_set([name],value) is chosen so that there is no
# ambiguity with a set whose name contains a comma, and so that we can
# supply the value via _m4_defn([_m4_set([name])]) without needing any
# quote manipulation.
# m4_set_add(SET, VALUE, [IF-UNIQ], [IF-DUP])
# -------------------------------------------
# Add VALUE as an element of SET. Expand IF-UNIQ on the first
# addition, and IF-DUP if it is already in the set. Addition of one
# element is O(1), such that overall set creation is O(n).
#
# We do not want to add a duplicate for a previously deleted but
# unpruned element, but it is just as easy to check existence directly
# as it is to query _m4_set_cleanup($1).
m4_define([m4_set_add],
[m4_ifdef([_m4_set([$1],$2)],
[m4_if(m4_indir([_m4_set([$1],$2)]), [0],
[m4_define([_m4_set([$1],$2)],
[1])_m4_set_size([$1], [m4_incr])$3], [$4])],
[m4_define([_m4_set([$1],$2)],
[1])m4_pushdef([_m4_set([$1])],
[$2])_m4_set_size([$1], [m4_incr])$3])])
# m4_set_add_all(SET, VALUE...)
# -----------------------------
# Add each VALUE into SET. This is O(n) in the number of VALUEs, and
# can be faster than calling m4_set_add for each VALUE.
#
# Implement two recursion helpers; the check variant is slower but
# handles the case where an element has previously been removed but
# not pruned. The recursion helpers ignore their second argument, so
# that we can use the faster m4_shift2 and 2 arguments, rather than
# _m4_shift2 and one argument, as the signal to end recursion.
#
# Please keep foreach.m4 in sync with any adjustments made here.
m4_define([m4_set_add_all],
[m4_define([_m4_set_size($1)], m4_eval(m4_set_size([$1])
+ m4_len(m4_ifdef([_m4_set_cleanup($1)], [_$0_check], [_$0])([$1], $@))))])
m4_define([_m4_set_add_all],
[m4_if([$#], [2], [],
[m4_ifdef([_m4_set([$1],$3)], [],
[m4_define([_m4_set([$1],$3)], [1])m4_pushdef([_m4_set([$1])],
[$3])-])$0([$1], m4_shift2($@))])])
m4_define([_m4_set_add_all_check],
[m4_if([$#], [2], [],
[m4_set_add([$1], [$3])$0([$1], m4_shift2($@))])])
# m4_set_contains(SET, VALUE, [IF-PRESENT], [IF-ABSENT])
# ------------------------------------------------------
# Expand IF-PRESENT if SET contains VALUE, otherwise expand IF-ABSENT.
# This is always O(1).
m4_define([m4_set_contains],
[m4_ifdef([_m4_set_cleanup($1)],
[m4_if(m4_ifdef([_m4_set([$1],$2)],
[m4_indir([_m4_set([$1],$2)])], [0]), [1], [$3], [$4])],
[m4_ifdef([_m4_set([$1],$2)], [$3], [$4])])])
# m4_set_contents(SET, [SEP])
# ---------------------------
# Expand to a single string containing all the elements in SET,
# separated by SEP, without modifying SET. No provision is made for
# disambiguating set elements that contain non-empty SEP as a
# sub-string, or for recognizing a set that contains only the empty
# string. Order of the output is not guaranteed. If any elements
# have been previously removed from the set, this action will prune
# the unused memory. This is O(n) in the size of the set before
# pruning.
#
# Use _m4_popdef for speed. The existence of _m4_set_cleanup($1)
# determines which version of _1 helper we use.
m4_define([m4_set_contents],
[m4_ifdef([_m4_set_cleanup($1)], [_$0_1c], [_$0_1])([$1])_$0_2([$1],
[_m4_defn([_m4_set_($1)])], [[$2]])])
# _m4_set_contents_1(SET)
# _m4_set_contents_1c(SET)
# _m4_set_contents_2(SET, SEP, PREP)
# ----------------------------------
# Expand to a list of quoted elements currently in the set, separated
# by SEP, and moving PREP in front of SEP on recursion. To avoid
# nesting limit restrictions, the algorithm must be broken into two
# parts; _1 destructively copies the stack in reverse into
# _m4_set_($1), producing no output; then _2 destructively copies
# _m4_set_($1) back into the stack in reverse. SEP is expanded while
# _m4_set_($1) contains the current element, so a SEP containing
# _m4_defn([_m4_set_($1)]) can produce output in the order the set was
# created. Behavior is undefined if SEP tries to recursively list or
# modify SET in any way other than calling m4_set_remove on the
# current element. Use _1 if all entries in the stack are guaranteed
# to be in the set, and _1c to prune removed entries. Uses _m4_defn
# and _m4_popdef for speed.
m4_define([_m4_set_contents_1],
[m4_ifdef([_m4_set([$1])], [m4_pushdef([_m4_set_($1)],
_m4_defn([_m4_set([$1])]))_m4_popdef([_m4_set([$1])])$0([$1])])])
m4_define([_m4_set_contents_1c],
[m4_ifdef([_m4_set([$1])],
[m4_set_contains([$1], _m4_defn([_m4_set([$1])]),
[m4_pushdef([_m4_set_($1)], _m4_defn([_m4_set([$1])]))],
[_m4_popdef([_m4_set([$1],]_m4_defn(
[_m4_set([$1])])[)])])_m4_popdef([_m4_set([$1])])$0([$1])],
[_m4_popdef([_m4_set_cleanup($1)])])])
m4_define([_m4_set_contents_2],
[m4_ifdef([_m4_set_($1)], [m4_pushdef([_m4_set([$1])],
_m4_defn([_m4_set_($1)]))$2[]_m4_popdef([_m4_set_($1)])$0([$1], [$3$2])])])
# m4_set_delete(SET)
# ------------------
# Delete all elements in SET, and reclaim any memory occupied by the
# set. This is O(n) in the set size.
#
# Use _m4_defn and _m4_popdef for speed.
m4_define([m4_set_delete],
[m4_ifdef([_m4_set([$1])],
[_m4_popdef([_m4_set([$1],]_m4_defn([_m4_set([$1])])[)],
[_m4_set([$1])])$0([$1])],
[m4_ifdef([_m4_set_cleanup($1)],
[_m4_popdef([_m4_set_cleanup($1)])])m4_ifdef(
[_m4_set_size($1)],
[_m4_popdef([_m4_set_size($1)])])])])
# m4_set_difference(SET1, SET2)
# -----------------------------
# Produce a LIST of quoted elements that occur in SET1 but not SET2.
# Output a comma prior to any elements, to distinguish the empty
# string from no elements. This can be directly used as a series of
# arguments, such as for m4_join, or wrapped inside quotes for use in
# m4_foreach. Order of the output is not guaranteed.
#
# Short-circuit the idempotence relation. Use _m4_defn for speed.
m4_define([m4_set_difference],
[m4_if([$1], [$2], [],
[m4_set_foreach([$1], [_m4_element],
[m4_set_contains([$2], _m4_defn([_m4_element]), [],
[,_m4_defn([_m4_element])])])])])
# m4_set_dump(SET, [SEP])
# -----------------------
# Expand to a single string containing all the elements in SET,
# separated by SEP, then delete SET. In general, if you only need to
# list the contents once, this is faster than m4_set_contents. No
# provision is made for disambiguating set elements that contain
# non-empty SEP as a sub-string. Order of the output is not
# guaranteed. This is O(n) in the size of the set before pruning.
#
# Use _m4_popdef for speed. Use existence of _m4_set_cleanup($1) to
# decide if more expensive recursion is needed.
m4_define([m4_set_dump],
[m4_ifdef([_m4_set_size($1)],
[_m4_popdef([_m4_set_size($1)])])m4_ifdef([_m4_set_cleanup($1)],
[_$0_check], [_$0])([$1], [], [$2])])
# _m4_set_dump(SET, SEP, PREP)
# _m4_set_dump_check(SET, SEP, PREP)
# ----------------------------------
# Print SEP and the current element, then delete the element and
# recurse with empty SEP changed to PREP. The check variant checks
# whether the element has been previously removed. Use _m4_defn and
# _m4_popdef for speed.
m4_define([_m4_set_dump],
[m4_ifdef([_m4_set([$1])],
[[$2]_m4_defn([_m4_set([$1])])_m4_popdef([_m4_set([$1],]_m4_defn(
[_m4_set([$1])])[)], [_m4_set([$1])])$0([$1], [$2$3])])])
m4_define([_m4_set_dump_check],
[m4_ifdef([_m4_set([$1])],
[m4_set_contains([$1], _m4_defn([_m4_set([$1])]),
[[$2]_m4_defn([_m4_set([$1])])])_m4_popdef(
[_m4_set([$1],]_m4_defn([_m4_set([$1])])[)],
[_m4_set([$1])])$0([$1], [$2$3])],
[_m4_popdef([_m4_set_cleanup($1)])])])
# m4_set_empty(SET, [IF-EMPTY], [IF-ELEMENTS])
# --------------------------------------------
# Expand IF-EMPTY if SET has no elements, otherwise IF-ELEMENTS.
m4_define([m4_set_empty],
[m4_ifdef([_m4_set_size($1)],
[m4_if(m4_indir([_m4_set_size($1)]), [0], [$2], [$3])], [$2])])
# m4_set_foreach(SET, VAR, ACTION)
# --------------------------------
# For each element of SET, define VAR to the element and expand
# ACTION. ACTION should not recursively list SET's contents, add
# elements to SET, nor delete any element from SET except the one
# currently in VAR. The order that the elements are visited in is not
# guaranteed. This is faster than the corresponding m4_foreach([VAR],
# m4_indir([m4_dquote]m4_set_listc([SET])), [ACTION])
m4_define([m4_set_foreach],
[m4_pushdef([$2])m4_ifdef([_m4_set_cleanup($1)],
[_m4_set_contents_1c], [_m4_set_contents_1])([$1])_m4_set_contents_2([$1],
[m4_define([$2], _m4_defn([_m4_set_($1)]))$3[]])m4_popdef([$2])])
# m4_set_intersection(SET1, SET2)
# -------------------------------
# Produce a LIST of quoted elements that occur in both SET1 or SET2.
# Output a comma prior to any elements, to distinguish the empty
# string from no elements. This can be directly used as a series of
# arguments, such as for m4_join, or wrapped inside quotes for use in
# m4_foreach. Order of the output is not guaranteed.
#
# Iterate over the smaller set, and short-circuit the idempotence
# relation. Use _m4_defn for speed.
m4_define([m4_set_intersection],
[m4_if([$1], [$2], [m4_set_listc([$1])],
m4_eval(m4_set_size([$2]) < m4_set_size([$1])), [1], [$0([$2], [$1])],
[m4_set_foreach([$1], [_m4_element],
[m4_set_contains([$2], _m4_defn([_m4_element]),
[,_m4_defn([_m4_element])])])])])
# m4_set_list(SET)
# m4_set_listc(SET)
# -----------------
# Produce a LIST of quoted elements of SET. This can be directly used
# as a series of arguments, such as for m4_join or m4_set_add_all, or
# wrapped inside quotes for use in m4_foreach or m4_map. With
# m4_set_list, there is no way to distinguish an empty set from a set
# containing only the empty string; with m4_set_listc, a leading comma
# is output if there are any elements.
m4_define([m4_set_list],
[m4_ifdef([_m4_set_cleanup($1)], [_m4_set_contents_1c],
[_m4_set_contents_1])([$1])_m4_set_contents_2([$1],
[_m4_defn([_m4_set_($1)])], [,])])
m4_define([m4_set_listc],
[m4_ifdef([_m4_set_cleanup($1)], [_m4_set_contents_1c],
[_m4_set_contents_1])([$1])_m4_set_contents_2([$1],
[,_m4_defn([_m4_set_($1)])])])
# m4_set_remove(SET, VALUE, [IF-PRESENT], [IF-ABSENT])
# ----------------------------------------------------
# If VALUE is an element of SET, delete it and expand IF-PRESENT.
# Otherwise expand IF-ABSENT. Deleting a single value is O(1),
# although it leaves memory occupied until the next O(n) traversal of
# the set which will compact the set.
#
# Optimize if the element being removed is the most recently added,
# since defining _m4_set_cleanup($1) slows down so many other macros.
# In particular, this plays well with m4_set_foreach.
m4_define([m4_set_remove],
[m4_set_contains([$1], [$2], [_m4_set_size([$1],
[m4_decr])m4_if(_m4_defn([_m4_set([$1])]), [$2],
[_m4_popdef([_m4_set([$1],$2)], [_m4_set([$1])])],
[m4_define([_m4_set_cleanup($1)])m4_define(
[_m4_set([$1],$2)], [0])])$3], [$4])])
# m4_set_size(SET)
# ----------------
# Expand to the number of elements currently in SET. This operation
# is O(1), and thus more efficient than m4_count(m4_set_list([SET])).
m4_define([m4_set_size],
[m4_ifdef([_m4_set_size($1)], [m4_indir([_m4_set_size($1)])], [0])])
# _m4_set_size(SET, ACTION)
# -------------------------
# ACTION must be either m4_incr or m4_decr, and the size of SET is
# changed accordingly. If the set is empty, ACTION must not be
# m4_decr.
m4_define([_m4_set_size],
[m4_define([_m4_set_size($1)],
m4_ifdef([_m4_set_size($1)], [$2(m4_indir([_m4_set_size($1)]))],
[1]))])
# m4_set_union(SET1, SET2)
# ------------------------
# Produce a LIST of double quoted elements that occur in either SET1
# or SET2, without duplicates. Output a comma prior to any elements,
# to distinguish the empty string from no elements. This can be
# directly used as a series of arguments, such as for m4_join, or
# wrapped inside quotes for use in m4_foreach. Order of the output is
# not guaranteed.
#
# We can rely on the fact that m4_set_listc prunes SET1, so we don't
# need to check _m4_set([$1],element) for 0. Use _m4_defn for speed.
# Short-circuit the idempotence relation.
m4_define([m4_set_union],
[m4_set_listc([$1])m4_if([$1], [$2], [], [m4_set_foreach([$2], [_m4_element],
[m4_ifdef([_m4_set([$1],]_m4_defn([_m4_element])[)], [],
[,_m4_defn([_m4_element])])])])])
## ------------------- ##
## 16. 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 than 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])])])
## ------------------------ ##
## 17. Setting M4sugar up. ##
## ------------------------ ##
# m4_init
# -------
# Initialize the m4sugar language.
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$])
# If __m4_version__ is defined, we assume that we are being run by M4
# 1.6 or newer, and thus that $@ recursion is linear and debugmode(d)
# is available for faster checks of dereferencing undefined macros.
# But if it is missing, we assume we are being run by M4 1.4.x, that
# $@ recursion is quadratic, and that we need foreach-based
# replacement macros. Use the raw builtin to avoid tripping up
# include tracing.
m4_ifdef([__m4_version__],
[m4_debugmode([+d])
m4_copy([_m4_defn], [m4_defn])
m4_copy([_m4_popdef], [m4_popdef])
m4_copy([_m4_undefine], [m4_undefine])],
[m4_builtin([include], [m4sugar/foreach.m4])])
# _m4_divert_diversion should be defined:
m4_divert_push([KILL])
# Check the divert push/pop perfect balance.
m4_wrap([m4_divert_pop([])
m4_ifdef([_m4_divert_diversion],
[m4_fatal([$0: unbalanced m4_divert_push:]_m4_divert_n_stack)])[]])
])
070701000541d7000081a40000000000000000000000014cda0fa4000044860000010000010006ffffffffffffffff0000002e00000000root/usr/local/share/bison/m4sugar/foreach.m4 # -*- Autoconf -*-
# This file is part of Autoconf.
# foreach-based replacements for recursive functions.
# Speeds up GNU M4 1.4.x by avoiding quadratic $@ recursion, but penalizes
# GNU M4 1.6 by requiring more memory and macro expansions.
#
# Copyright (C) 2008 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 3 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, see .
# 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 Eric Blake.
#
# In M4 1.4.x, every byte of $@ is rescanned. This means that an
# algorithm on n arguments that recurses with one less argument each
# iteration will scan n * (n + 1) / 2 arguments, for O(n^2) time. In
# M4 1.6, this was fixed so that $@ is only scanned once, then
# back-references are made to information stored about the scan.
# Thus, n iterations need only scan n arguments, for O(n) time.
# Additionally, in M4 1.4.x, recursive algorithms did not clean up
# memory very well, requiring O(n^2) memory rather than O(n) for n
# iterations.
#
# This file is designed to overcome the quadratic nature of $@
# recursion by writing a variant of m4_foreach that uses m4_for rather
# than $@ recursion to operate on the list. This involves more macro
# expansions, but avoids the need to rescan a quadratic number of
# arguments, making these replacements very attractive for M4 1.4.x.
# On the other hand, in any version of M4, expanding additional macros
# costs additional time; therefore, in M4 1.6, where $@ recursion uses
# fewer macros, these replacements actually pessimize performance.
# Additionally, the use of $10 to mean the tenth argument violates
# POSIX; although all versions of m4 1.4.x support this meaning, a
# future m4 version may switch to take it as the first argument
# concatenated with a literal 0, so the implementations in this file
# are not future-proof. Thus, this file is conditionally included as
# part of m4_init(), only when it is detected that M4 probably has
# quadratic behavior (ie. it lacks the macro __m4_version__).
#
# Please keep this file in sync with m4sugar.m4.
# 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 version minimizes the number of times that $@ is evaluated by
# using m4_for to generate a boilerplate into VARIABLE then passing $@
# to that temporary macro. Thus, the recursion is done in m4_for
# without reparsing any user input, and is not quadratic. For an idea
# of how this works, note that m4_foreach(i,[1,2],[i]) defines i to be
# m4_define([$1],[$3])$2[]m4_define([$1],[$4])$2[]m4_popdef([i])
# then calls i([i],[i],[1],[2]).
m4_define([m4_foreach],
[m4_if([$2], [], [], [_$0([$1], [$3], $2)])])
m4_define([_m4_foreach],
[m4_define([$1], m4_pushdef([$1])_m4_for([$1], [3], [$#], [1],
[$0_([1], [2], _m4_defn([$1]))])[m4_popdef([$1])])m4_indir([$1], $@)])
m4_define([_m4_foreach_],
[[m4_define([$$1], [$$3])$$2[]]])
# m4_case(SWITCH, VAL1, IF-VAL1, VAL2, IF-VAL2, ..., DEFAULT)
# -----------------------------------------------------------
# Find the first VAL that SWITCH matches, and expand the corresponding
# IF-VAL. If there are no matches, expand DEFAULT.
#
# Use m4_for to create a temporary macro in terms of a boilerplate
# m4_if with final cleanup. If $# is even, we have DEFAULT; if it is
# odd, then rounding the last $# up in the temporary macro is
# harmless. For example, both m4_case(1,2,3,4,5) and
# m4_case(1,2,3,4,5,6) result in the intermediate _m4_case being
# m4_if([$1],[$2],[$3],[$1],[$4],[$5],_m4_popdef([_m4_case])[$6])
m4_define([m4_case],
[m4_if(m4_eval([$# <= 2]), [1], [$2],
[m4_pushdef([_$0], [m4_if(]m4_for([_m4_count], [2], m4_decr([$#]), [2],
[_$0_([1], _m4_count, m4_incr(_m4_count))])[_m4_popdef(
[_$0])]m4_dquote($m4_eval([($# + 1) & ~1]))[)])_$0($@)])])
m4_define([_m4_case_],
[[[$$1],[$$2],[$$3],]])
# m4_bmatch(SWITCH, RE1, VAL1, RE2, VAL2, ..., DEFAULT)
# -----------------------------------------------------
# m4 equivalent of
#
# if (SWITCH =~ RE1)
# VAL1;
# elif (SWITCH =~ RE2)
# VAL2;
# elif ...
# ...
# else
# DEFAULT
#
# We build the temporary macro _m4_b:
# m4_define([_m4_b], _m4_defn([_m4_bmatch]))_m4_b([$1], [$2], [$3])...
# _m4_b([$1], [$m-1], [$m])_m4_b([], [], [$m+1]_m4_popdef([_m4_b]))
# then invoke m4_unquote(_m4_b($@)), for concatenation with later text.
m4_define([m4_bmatch],
[m4_if([$#], 0, [m4_fatal([$0: too few arguments: $#])],
[$#], 1, [m4_fatal([$0: too few arguments: $#: $1])],
[$#], 2, [$2],
[m4_define([_m4_b], m4_pushdef([_m4_b])[m4_define([_m4_b],
_m4_defn([_$0]))]_m4_for([_m4_b], [3], m4_eval([($# + 1) / 2 * 2 - 1]),
[2], [_$0_([1], m4_decr(_m4_b), _m4_b)])[_m4_b([], [],]m4_dquote(
[$]m4_incr(_m4_b))[_m4_popdef([_m4_b]))])m4_unquote(_m4_b($@))])])
m4_define([_m4_bmatch],
[m4_if(m4_bregexp([$1], [$2]), [-1], [], [[$3]m4_define([$0])])])
m4_define([_m4_bmatch_],
[[_m4_b([$$1], [$$2], [$$3])]])
# m4_cond(TEST1, VAL1, IF-VAL1, TEST2, VAL2, IF-VAL2, ..., [DEFAULT])
# -------------------------------------------------------------------
# Similar to m4_if, except that each TEST is expanded when encountered.
# If the expansion of TESTn matches the string VALn, the result is IF-VALn.
# The result is DEFAULT if no tests passed. This macro allows
# short-circuiting of expensive tests, where it pays to arrange quick
# filter tests to run first.
#
# m4_cond already guarantees either 3*n or 3*n + 1 arguments, 1 <= n.
# We only have to speed up _m4_cond, by building the temporary _m4_c:
# m4_define([_m4_c], _m4_defn([m4_unquote]))_m4_c([m4_if(($1), [($2)],
# [[$3]m4_define([_m4_c])])])_m4_c([m4_if(($4), [($5)],
# [[$6]m4_define([_m4_c])])])..._m4_c([m4_if(($m-2), [($m-1)],
# [[$m]m4_define([_m4_c])])])_m4_c([[$m+1]]_m4_popdef([_m4_c]))
# We invoke m4_unquote(_m4_c($@)), for concatenation with later text.
m4_define([_m4_cond],
[m4_define([_m4_c], m4_pushdef([_m4_c])[m4_define([_m4_c],
_m4_defn([m4_unquote]))]_m4_for([_m4_c], [2], m4_eval([$# / 3 * 3 - 1]), [3],
[$0_(m4_decr(_m4_c), _m4_c, m4_incr(_m4_c))])[_m4_c(]m4_dquote(m4_dquote(
[$]m4_eval([$# / 3 * 3 + 1])))[_m4_popdef([_m4_c]))])m4_unquote(_m4_c($@))])
m4_define([_m4_cond_],
[[_m4_c([m4_if(($$1), [($$2)], [[$$3]m4_define([_m4_c])])])]])
# m4_bpatsubsts(STRING, RE1, SUBST1, RE2, SUBST2, ...)
# ----------------------------------------------------
# m4 equivalent of
#
# $_ = STRING;
# s/RE1/SUBST1/g;
# s/RE2/SUBST2/g;
# ...
#
# m4_bpatsubsts already validated an odd number of arguments; we only
# need to speed up _m4_bpatsubsts. To avoid nesting, we build the
# temporary _m4_p:
# m4_define([_m4_p], [$1])m4_define([_m4_p],
# m4_bpatsubst(m4_dquote(_m4_defn([_m4_p])), [$2], [$3]))m4_define([_m4_p],
# m4_bpatsubst(m4_dquote(_m4_defn([_m4_p])), [$4], [$5]))m4_define([_m4_p],...
# m4_bpatsubst(m4_dquote(_m4_defn([_m4_p])), [$m-1], [$m]))m4_unquote(
# _m4_defn([_m4_p])_m4_popdef([_m4_p]))
m4_define([_m4_bpatsubsts],
[m4_define([_m4_p], m4_pushdef([_m4_p])[m4_define([_m4_p],
]m4_dquote([$]1)[)]_m4_for([_m4_p], [3], [$#], [2], [$0_(m4_decr(_m4_p),
_m4_p)])[m4_unquote(_m4_defn([_m4_p])_m4_popdef([_m4_p]))])_m4_p($@)])
m4_define([_m4_bpatsubsts_],
[[m4_define([_m4_p],
m4_bpatsubst(m4_dquote(_m4_defn([_m4_p])), [$$1], [$$2]))]])
# m4_shiftn(N, ...)
# -----------------
# Returns ... shifted N times. Useful for recursive "varargs" constructs.
#
# m4_shiftn already validated arguments; we only need to speed up
# _m4_shiftn. If N is 3, then we build the temporary _m4_s, defined as
# ,[$5],[$6],...,[$m]_m4_popdef([_m4_s])
# before calling m4_shift(_m4_s($@)).
m4_define([_m4_shiftn],
[m4_if(m4_incr([$1]), [$#], [], [m4_define([_m4_s],
m4_pushdef([_m4_s])_m4_for([_m4_s], m4_eval([$1 + 2]), [$#], [1],
[[,]m4_dquote([$]_m4_s)])[_m4_popdef([_m4_s])])m4_shift(_m4_s($@))])])
# 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.
#
# Here, we use the temporary macro _m4_do, defined as
# $1[]$2[]...[]$n[]_m4_popdef([_m4_do])
m4_define([m4_do],
[m4_if([$#], [0], [],
[m4_define([_$0], m4_pushdef([_$0])_m4_for([_$0], [1], [$#], [1],
[$_$0[[]]])[_m4_popdef([_$0])])_$0($@)])])
# m4_dquote_elt(ARGS)
# -------------------
# Return ARGS as an unquoted list of double-quoted arguments.
#
# m4_foreach to the rescue. It's easier to shift off the leading comma.
m4_define([m4_dquote_elt],
[m4_shift(m4_foreach([_m4_elt], [$@], [,m4_dquote(_m4_defn([_m4_elt]))]))])
# m4_reverse(ARGS)
# ----------------
# Output ARGS in reverse order.
#
# Invoke _m4_r($@) with the temporary _m4_r built as
# [$m], [$m-1], ..., [$2], [$1]_m4_popdef([_m4_r])
m4_define([m4_reverse],
[m4_if([$#], [0], [], [$#], [1], [[$1]],
[m4_define([_m4_r], m4_dquote([$$#])m4_pushdef([_m4_r])_m4_for([_m4_r],
m4_decr([$#]), [1], [-1],
[[, ]m4_dquote([$]_m4_r)])[_m4_popdef([_m4_r])])_m4_r($@)])])
# m4_map(MACRO, LIST)
# -------------------
# Invoke MACRO($1), MACRO($2) etc. where $1, $2... are the elements
# of LIST. $1, $2... must in turn be lists, appropriate for m4_apply.
#
# m4_map/m4_map_sep only execute once; the speedup comes in fixing
# _m4_map. The mismatch in () is intentional, since $1 supplies the
# opening `(' (but it sure looks odd!). Build the temporary _m4_m:
# $1, [$3])$1, [$4])...$1, [$m])_m4_popdef([_m4_m])
m4_define([_m4_map],
[m4_if([$#], [2], [],
[m4_define([_m4_m], m4_pushdef([_m4_m])_m4_for([_m4_m], [3], [$#], [1],
[$0_([1], _m4_m)])[_m4_popdef([_m4_m])])_m4_m($@)])])
m4_define([_m4_map_],
[[$$1, [$$2])]])
# m4_transform(EXPRESSION, ARG...)
# --------------------------------
# Expand EXPRESSION([ARG]) for each argument. More efficient than
# m4_foreach([var], [ARG...], [EXPRESSION(m4_defn([var]))])
#
# Invoke the temporary macro _m4_transform, defined as:
# $1([$2])[]$1([$3])[]...$1([$m])[]_m4_popdef([_m4_transform])
m4_define([m4_transform],
[m4_if([$#], [0], [m4_fatal([$0: too few arguments: $#])],
[$#], [1], [],
[m4_define([_$0], m4_pushdef([_$0])_m4_for([_$0], [2], [$#], [1],
[_$0_([1], _$0)])[_m4_popdef([_$0])])_$0($@)])])
m4_define([_m4_transform_],
[[$$1([$$2])[]]])
# m4_transform_pair(EXPRESSION, [END-EXPR = EXPRESSION], ARG...)
# --------------------------------------------------------------
# Perform a pairwise grouping of consecutive ARGs, by expanding
# EXPRESSION([ARG1], [ARG2]). If there are an odd number of ARGs, the
# final argument is expanded with END-EXPR([ARGn]).
#
# Build the temporary macro _m4_transform_pair, with the $2([$m+1])
# only output if $# is odd:
# $1([$3], [$4])[]$1([$5], [$6])[]...$1([$m-1],
# [$m])[]m4_default([$2], [$1])([$m+1])[]_m4_popdef([_m4_transform_pair])
m4_define([m4_transform_pair],
[m4_if([$#], [0], [m4_fatal([$0: too few arguments: $#])],
[$#], [1], [m4_fatal([$0: too few arguments: $#: $1])],
[$#], [2], [],
[$#], [3], [m4_default([$2], [$1])([$3])[]],
[m4_define([_$0], m4_pushdef([_$0])_m4_for([_$0], [3],
m4_eval([$# / 2 * 2 - 1]), [2], [_$0_([1], _$0, m4_incr(_$0))])_$0_end(
[1], [2], [$#])[_m4_popdef([_$0])])_$0($@)])])
m4_define([_m4_transform_pair_],
[[$$1([$$2], [$$3])[]]])
m4_define([_m4_transform_pair_end],
[m4_if(m4_eval([$3 & 1]), [1], [[m4_default([$$2], [$$1])([$$3])[]]])])
# m4_join(SEP, ARG1, ARG2...)
# ---------------------------
# Produce ARG1SEPARG2...SEPARGn. Avoid back-to-back SEP when a given ARG
# is the empty string. No expansion is performed on SEP or ARGs.
#
# Use a self-modifying separator, since we don't know how many
# arguments might be skipped before a separator is first printed, but
# be careful if the separator contains $. m4_foreach to the rescue.
m4_define([m4_join],
[m4_pushdef([_m4_sep], [m4_define([_m4_sep], _m4_defn([m4_echo]))])]dnl
[m4_foreach([_m4_arg], [m4_shift($@)],
[m4_ifset([_m4_arg], [_m4_sep([$1])_m4_defn([_m4_arg])])])]dnl
[_m4_popdef([_m4_sep])])
# m4_joinall(SEP, ARG1, ARG2...)
# ------------------------------
# Produce ARG1SEPARG2...SEPARGn. An empty ARG results in back-to-back SEP.
# No expansion is performed on SEP or ARGs.
#
# A bit easier than m4_join. m4_foreach to the rescue.
m4_define([m4_joinall],
[[$2]m4_if(m4_eval([$# <= 2]), [1], [],
[m4_foreach([_m4_arg], [m4_shift2($@)],
[[$1]_m4_defn([_m4_arg])])])])
# m4_list_cmp(A, B)
# -----------------
# Compare the two lists of integer expressions A and B.
#
# m4_list_cmp takes care of any side effects; we only override
# _m4_list_cmp_raw, where we can safely expand lists multiple times.
# First, insert padding so that both lists are the same length; the
# trailing +0 is necessary to handle a missing list. Next, create a
# temporary macro to perform pairwise comparisons until an inequality
# is found. For example, m4_list_cmp([1], [1,2]) creates _m4_cmp as
# m4_if(m4_eval([($1) != ($3)]), [1], [m4_cmp([$1], [$3])],
# m4_eval([($2) != ($4)]), [1], [m4_cmp([$2], [$4])],
# [0]_m4_popdef([_m4_cmp], [_m4_size]))
# then calls _m4_cmp([1+0], [0], [1], [2+0])
m4_define([_m4_list_cmp_raw],
[m4_if([$1], [$2], 0, [m4_pushdef(
[_m4_size])_m4_list_cmp($1+0_m4_list_pad(m4_count($1), m4_count($2)),
$2+0_m4_list_pad(m4_count($2), m4_count($1)))])])
m4_define([_m4_list_pad],
[m4_if(m4_eval($1 < $2), [1],
[_m4_for([_m4_size], m4_incr([$1]), [$2], [1], [,0])])])
m4_define([_m4_list_cmp],
[m4_define([_m4_size], m4_eval([$# >> 1]))]dnl
[m4_define([_m4_cmp], m4_pushdef([_m4_cmp])[m4_if(]_m4_for([_m4_cmp],
[1], _m4_size, [1], [$0_(_m4_cmp, m4_eval(_m4_cmp + _m4_size))])[
[0]_m4_popdef([_m4_cmp], [_m4_size]))])_m4_cmp($@)])
m4_define([_m4_list_cmp_],
[[m4_eval([($$1) != ($$2)]), [1], [m4_cmp([$$1], [$$2])],
]])
# m4_max(EXPR, ...)
# m4_min(EXPR, ...)
# -----------------
# Return the decimal value of the maximum (or minimum) in a series of
# integer expressions.
#
# m4_foreach to the rescue; we only need to replace _m4_minmax. Here,
# we need a temporary macro to track the best answer so far, so that
# the foreach expression is tractable.
m4_define([_m4_minmax],
[m4_pushdef([_m4_best], m4_eval([$2]))m4_foreach([_m4_arg], [m4_shift2($@)],
[m4_define([_m4_best], $1(_m4_best, _m4_defn([_m4_arg])))])]dnl
[_m4_best[]_m4_popdef([_m4_best])])
# m4_set_add_all(SET, VALUE...)
# -----------------------------
# Add each VALUE into SET. This is O(n) in the number of VALUEs, and
# can be faster than calling m4_set_add for each VALUE.
#
# m4_foreach to the rescue. If no deletions have occurred, then avoid
# the speed penalty of m4_set_add.
m4_define([m4_set_add_all],
[m4_if([$#], [0], [], [$#], [1], [],
[m4_define([_m4_set_size($1)], m4_eval(m4_set_size([$1])
+ m4_len(m4_foreach([_m4_arg], [m4_shift($@)],
m4_ifdef([_m4_set_cleanup($1)],
[[m4_set_add([$1], _m4_defn([_m4_arg]))]],
[[m4_ifdef([_m4_set([$1],]_m4_defn([_m4_arg])[)], [],
[m4_define([_m4_set([$1],]_m4_defn([_m4_arg])[)],
[1])m4_pushdef([_m4_set([$1])],
_m4_defn([_m4_arg]))-])]])))))])])
070701000541ce000081a40000000000000000000000014cda0fa40000326d0000010000010006ffffffffffffffff0000002000000000root/usr/local/share/bison/c.m4 -*- Autoconf -*-
# C M4 Macros for Bison.
# Copyright (C) 2002, 2004-2010 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 3 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, see .
## ---------------- ##
## Identification. ##
## ---------------- ##
# b4_comment(TEXT)
# ----------------
m4_define([b4_comment], [/* m4_bpatsubst([$1], [
], [
]) */])
# b4_identification
# -----------------
# Depends on individual skeletons to define b4_pure_flag, b4_push_flag, or
# b4_pull_flag if they use the values of the %define variables api.pure or
# api.push_pull.
m4_define([b4_identification],
[[/* Identify Bison output. */
#define YYBISON 1
/* Bison version. */
#define YYBISON_VERSION "]b4_version["
/* Skeleton name. */
#define YYSKELETON_NAME ]b4_skeleton[]m4_ifdef([b4_pure_flag], [[
/* Pure parsers. */
#define YYPURE ]b4_pure_flag])[]m4_ifdef([b4_push_flag], [[
/* Push parsers. */
#define YYPUSH ]b4_push_flag])[]m4_ifdef([b4_pull_flag], [[
/* Pull parsers. */
#define YYPULL ]b4_pull_flag])[
/* Using locations. */
#define YYLSP_NEEDED ]b4_locations_flag[
]])
## ---------------- ##
## Default values. ##
## ---------------- ##
# If the %union is not named, its name is YYSTYPE.
m4_define_default([b4_union_name], [YYSTYPE])
# If the %name-prefix is not given, it is yy.
m4_define_default([b4_prefix], [yy])
## ------------------------ ##
## 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([b4_parse_param],
b4_parse_param)
# b4_parse_param_for(DECL, FORMAL, BODY)
# ---------------------------------------
# Iterate over the user parameters, binding the declaration to DECL,
# the formal name to FORMAL, and evaluating the BODY.
m4_define([b4_parse_param_for],
[m4_foreach([$1_$2], m4_defn([b4_parse_param]),
[m4_pushdef([$1], m4_unquote(m4_car($1_$2)))dnl
m4_pushdef([$2], m4_shift($1_$2))dnl
$3[]dnl
m4_popdef([$2])dnl
m4_popdef([$1])dnl
])])
# b4_parse_param_use
# ------------------
# `YYUSE' all the parse-params.
m4_define([b4_parse_param_use],
[b4_parse_param_for([Decl], [Formal], [ YYUSE (Formal);
])dnl
])
## ------------ ##
## Data Types. ##
## ------------ ##
# 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)])
## ---------##
## Values. ##
## ---------##
# b4_null
---------
# Return a null pointer constant. NULL infringes on the user name
# space in C, so use 0 rather than NULL.
m4_define([b4_null], [0])
## ------------------------- ##
## 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_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
# -------------------------------------------------------
# Output the definition of the tokens (if there are) as #defines.
m4_define([b4_token_defines],
[m4_if([$#$1], [1], [],
[/* Tokens. */
m4_map([b4_token_define], [$@])])
])
# 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_enums(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
# -----------------------------------------------------
# Output the definition of the tokens (if there are) as enums.
m4_define([b4_token_enums],
[m4_if([$#$1], [1], [],
[/* 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
])])
# b4_token_enums_defines(LIST-OF-PAIRS-TOKEN-NAME-TOKEN-NUMBER)
# -------------------------------------------------------------
# Output the definition of the tokens (if there are any) as enums and, if POSIX
# Yacc is enabled, as #defines.
m4_define([b4_token_enums_defines],
[b4_token_enums($@)b4_yacc_if([b4_token_defines($@)], [])
])
## --------------------------------------------- ##
## Defining C functions in both K&R and ANSI-C. ##
## --------------------------------------------- ##
# b4_modern_c
# -----------
# A predicate useful in #if to determine whether C is ancient or modern.
#
# If __STDC__ is defined, the compiler is modern. IBM xlc 7.0 when run
# as 'cc' doesn't define __STDC__ (or __STDC_VERSION__) for pedantic
# reasons, but it defines __C99__FUNC__ so check that as well.
# Microsoft C normally doesn't define these macros, but it defines _MSC_VER.
# Consider a C++ compiler to be modern if it defines __cplusplus.
#
m4_define([b4_c_modern],
[[(defined __STDC__ || defined __C99__FUNC__ \
|| defined __cplusplus || defined _MSC_VER)]])
# b4_c_function_def(NAME, RETURN-VALUE, [DECL1, NAME1], ...)
# ----------------------------------------------------------
# Declare the function NAME.
m4_define([b4_c_function_def],
[#if b4_c_modern
b4_c_ansi_function_def($@)
#else
$2
$1 (b4_c_knr_formal_names(m4_shift2($@)))
b4_c_knr_formal_decls(m4_shift2($@))
#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_shift2($@)))[]dnl
])
# b4_c_ansi_formals([DECL1, NAME1], ...)
# --------------------------------------
# Output the arguments ANSI-C definition.
m4_define([b4_c_ansi_formals],
[m4_if([$#], [0], [void],
[$#$1], [1], [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_shift2($@)));[]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_shift2($@)))[]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_sync_start(LINE, FILE)
# -----------------------
m4_define([b4_sync_start], [[#]line $1 $2])
## -------------- ##
## User actions. ##
## -------------- ##
# b4_case(LABEL, STATEMENTS)
# --------------------------
m4_define([b4_case],
[ case $1:
$2
break;])
# b4_symbol_actions(FILENAME, LINENO,
# SYMBOL-TAG, SYMBOL-NUM,
# SYMBOL-ACTION, SYMBOL-TYPENAME)
# -------------------------------------------------
m4_define([b4_symbol_actions],
[m4_pushdef([b4_dollar_dollar],
[m4_ifval([$6], [(yyvaluep->$6)], [(*yyvaluep)])])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_default([b4_yydestruct_generate],
[[/*-----------------------------------------------.
| Release the memory associated to this symbol. |
`-----------------------------------------------*/
/*ARGSUSED*/
]$1([yydestruct],
[static void],
[[const char *yymsg], [yymsg]],
[[int yytype], [yytype]],
[[YYSTYPE *yyvaluep], [yyvaluep]][]dnl
b4_locations_if( [, [[YYLTYPE *yylocationp], [yylocationp]]])[]dnl
m4_ifset([b4_parse_param], [, b4_parse_param]))[
{
YYUSE (yyvaluep);
]b4_locations_if([ YYUSE (yylocationp);
])dnl
b4_parse_param_use[]dnl
[
if (!yymsg)
yymsg = "Deleting";
YY_SYMBOL_PRINT (yymsg, yytype, yyvaluep, yylocationp);
switch (yytype)
{
]m4_map([b4_symbol_actions], m4_defn([b4_symbol_destructors]))[
default:
break;
}
}]dnl
])
# b4_yy_symbol_print_generate(FUNCTION-DECLARATOR)
# ------------------------------------------------
# Generate the "yy_symbol_print" 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_default([b4_yy_symbol_print_generate],
[[
/*--------------------------------.
| Print this symbol on YYOUTPUT. |
`--------------------------------*/
/*ARGSUSED*/
]$1([yy_symbol_value_print],
[static void],
[[FILE *yyoutput], [yyoutput]],
[[int yytype], [yytype]],
[[YYSTYPE const * const yyvaluep], [yyvaluep]][]dnl
b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl
m4_ifset([b4_parse_param], [, b4_parse_param]))[
{
if (!yyvaluep)
return;
]b4_locations_if([ YYUSE (yylocationp);
])dnl
b4_parse_param_use[]dnl
[# ifdef YYPRINT
if (yytype < YYNTOKENS)
YYPRINT (yyoutput, yytoknum[yytype], *yyvaluep);
# else
YYUSE (yyoutput);
# endif
switch (yytype)
{
]m4_map([b4_symbol_actions], m4_defn([b4_symbol_printers]))dnl
[ default:
break;
}
}
/*--------------------------------.
| Print this symbol on YYOUTPUT. |
`--------------------------------*/
]$1([yy_symbol_print],
[static void],
[[FILE *yyoutput], [yyoutput]],
[[int yytype], [yytype]],
[[YYSTYPE const * const yyvaluep], [yyvaluep]][]dnl
b4_locations_if([, [[YYLTYPE const * const yylocationp], [yylocationp]]])[]dnl
m4_ifset([b4_parse_param], [, b4_parse_param]))[
{
if (yytype < YYNTOKENS)
YYFPRINTF (yyoutput, "token %s (", yytname[yytype]);
else
YYFPRINTF (yyoutput, "nterm %s (", yytname[yytype]);
]b4_locations_if([ YY_LOCATION_PRINT (yyoutput, *yylocationp);
YYFPRINTF (yyoutput, ": ");
])dnl
[ yy_symbol_value_print (yyoutput, yytype, yyvaluep]dnl
b4_locations_if([, yylocationp])[]b4_user_args[);
YYFPRINTF (yyoutput, ")");
}]dnl
])
070701000541d4000081a40000000000000000000000014cda0fa40000678d0000010000010006ffffffffffffffff0000002600000000root/usr/local/share/bison/lalr1.java # Java skeleton for Bison -*- autoconf -*-
# Copyright (C) 2007-2010 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 3 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, see .
m4_include(b4_pkgdatadir/[java.m4])
b4_defines_if([b4_fatal([%s: %%defines does not make sense in Java], [b4_skeleton])])
m4_ifval(m4_defn([b4_symbol_destructors]),
[b4_fatal([%s: %%destructor does not make sense in Java], [b4_skeleton])],
[])
m4_divert_push(0)dnl
@output(b4_parser_file_name@)@
b4_copyright([Skeleton implementation for Bison LALR(1) parsers in Java],
[2007-2010])
b4_percent_define_ifdef([package], [package b4_percent_define_get([package]);
])[/* First part of user declarations. */
]b4_pre_prologue
b4_percent_code_get([[imports]])
[/**
* A Bison parser, automatically generated from ]m4_bpatsubst(b4_file_name, [^"\(.*\)"$], [\1])[.
*
* @@author LALR (1) parser skeleton written by Paolo Bonzini.
*/
]b4_public_if([public ])dnl
b4_abstract_if([abstract ])dnl
b4_final_if([final ])dnl
b4_strictfp_if([strictfp ])dnl
[class ]b4_parser_class_name[]dnl
b4_percent_define_get3([extends], [ extends ])dnl
b4_percent_define_get3([implements], [ implements ])[
{
]b4_identification[
/** True if verbose error messages are enabled. */
public boolean errorVerbose = ]b4_flag_value([error_verbose]);
b4_locations_if([[
/**
* A class defining a pair of positions. Positions, defined by the
* ]b4_position_type[ class, denote a point in the input.
* Locations represent a part of the input through the beginning
* and ending positions. */
public class ]b4_location_type[ {
/** The first, inclusive, position in the range. */
public ]b4_position_type[ begin;
/** The first position beyond the range. */
public ]b4_position_type[ end;
/**
* Create a ]b4_location_type[ denoting an empty range located at
* a given point.
* @@param loc The position at which the range is anchored. */
public ]b4_location_type[ (]b4_position_type[ loc) {
this.begin = this.end = loc;
}
/**
* Create a ]b4_location_type[ from the endpoints of the range.
* @@param begin The first position included in the range.
* @@param end The first position beyond the range. */
public ]b4_location_type[ (]b4_position_type[ begin, ]b4_position_type[ end) {
this.begin = begin;
this.end = end;
}
/**
* Print a representation of the location. For this to be correct,
* ]b4_position_type[ should override the equals
* method. */
public String toString () {
if (begin.equals (end))
return begin.toString ();
else
return begin.toString () + "-" + end.toString ();
}
}
]])
[ /** Token returned by the scanner to signal the end of its input. */
public static final int EOF = 0;]
b4_token_enums(b4_tokens)
b4_locations_if([[
private ]b4_location_type[ yylloc (YYStack rhs, int n)
{
if (n > 0)
return new ]b4_location_type[ (rhs.locationAt (1).begin, rhs.locationAt (n).end);
else
return new ]b4_location_type[ (rhs.locationAt (0).end);
}]])[
/**
* Communication interface between the scanner and the Bison-generated
* parser ]b4_parser_class_name[.
*/
public interface Lexer {
]b4_locations_if([[/**
* Method to retrieve the beginning position of the last scanned token.
* @@return the position at which the last scanned token starts. */
]b4_position_type[ getStartPos ();
/**
* Method to retrieve the ending position of the last scanned token.
* @@return the first position beyond the last scanned token. */
]b4_position_type[ getEndPos ();]])[
/**
* Method to retrieve the semantic value of the last scanned token.
* @@return the semantic value of the last scanned token. */
]b4_yystype[ getLVal ();
/**
* Entry point for the scanner. Returns the token identifier corresponding
* to the next token and prepares to return the semantic value
* ]b4_locations_if([and beginning/ending positions ])[of the token.
* @@return the token identifier corresponding to the next token. */
int yylex () ]b4_maybe_throws([b4_lex_throws])[;
/**
* Entry point for error reporting. Emits an error
* ]b4_locations_if([referring to the given location ])[in a user-defined way.
*
* ]b4_locations_if([[@@param loc The location of the element to which the
* error message is related]])[
* @@param s The string for the error message. */
void yyerror (]b4_locations_if([b4_location_type[ loc, ]])[String s);]
}
b4_lexer_if([[private class YYLexer implements Lexer {
]b4_percent_code_get([[lexer]])[
}
]])[/** The object doing lexical analysis for us. */
private Lexer yylexer;
]
b4_parse_param_vars
b4_lexer_if([[
/**
* Instantiates the Bison-generated parser.
*/
public ]b4_parser_class_name (b4_parse_param_decl([b4_lex_param_decl])[) {
this.yylexer = new YYLexer(]b4_lex_param_call[);
]b4_parse_param_cons[
}
]])
/**
* Instantiates the Bison-generated parser.
* @@param yylexer The scanner that will supply tokens to the parser.
*/
b4_lexer_if([[protected]], [[public]]) b4_parser_class_name[ (]b4_parse_param_decl([[Lexer yylexer]])[) {
this.yylexer = yylexer;
]b4_parse_param_cons[
}
private java.io.PrintStream yyDebugStream = System.err;
/**
* Return the PrintStream on which the debugging output is
* printed.
*/
public final java.io.PrintStream getDebugStream () { return yyDebugStream; }
/**
* Set the PrintStream on which the debug output is printed.
* @@param s The stream that is used for debugging output.
*/
public final void setDebugStream(java.io.PrintStream s) { yyDebugStream = s; }
private int yydebug = 0;
/**
* Answer the verbosity of the debugging output; 0 means that all kinds of
* output from the parser are suppressed.
*/
public final int getDebugLevel() { return yydebug; }
/**
* Set the verbosity of the debugging output; 0 means that all kinds of
* output from the parser are suppressed.
* @@param level The verbosity level for debugging output.
*/
public final void setDebugLevel(int level) { yydebug = level; }
private final int yylex () ]b4_maybe_throws([b4_lex_throws]) [{
return yylexer.yylex ();
}
protected final void yyerror (]b4_locations_if([b4_location_type[ loc, ]])[String s) {
yylexer.yyerror (]b4_locations_if([loc, ])[s);
}
]b4_locations_if([
protected final void yyerror (String s) {
yylexer.yyerror ((]b4_location_type[)null, s);
}
protected final void yyerror (]b4_position_type[ loc, String s) {
yylexer.yyerror (new ]b4_location_type[ (loc), s);
}])
[protected final void yycdebug (String s) {
if (yydebug > 0)
yyDebugStream.println (s);
}
private final class YYStack {
private int[] stateStack = new int[16];
]b4_locations_if([[private ]b4_location_type[[] locStack = new ]b4_location_type[[16];]])[
private ]b4_yystype[[] valueStack = new ]b4_yystype[[16];
public int size = 16;
public int height = -1;
public final void push (int state, ]b4_yystype[ value]dnl
b4_locations_if([, ]b4_location_type[ loc])[) {
height++;
if (size == height)
{
int[] newStateStack = new int[size * 2];
System.arraycopy (stateStack, 0, newStateStack, 0, height);
stateStack = newStateStack;
]b4_locations_if([[
]b4_location_type[[] newLocStack = new ]b4_location_type[[size * 2];
System.arraycopy (locStack, 0, newLocStack, 0, height);
locStack = newLocStack;]])
b4_yystype[[] newValueStack = new ]b4_yystype[[size * 2];
System.arraycopy (valueStack, 0, newValueStack, 0, height);
valueStack = newValueStack;
size *= 2;
}
stateStack[height] = state;
]b4_locations_if([[locStack[height] = loc;]])[
valueStack[height] = value;
}
public final void pop () {
height--;
}
public final void pop (int num) {
// Avoid memory leaks... garbage collection is a white lie!
if (num > 0) {
java.util.Arrays.fill (valueStack, height - num + 1, height, null);
]b4_locations_if([[java.util.Arrays.fill (locStack, height - num + 1, height, null);]])[
}
height -= num;
}
public final int stateAt (int i) {
return stateStack[height - i];
}
]b4_locations_if([[public final ]b4_location_type[ locationAt (int i) {
return locStack[height - i];
}
]])[public final ]b4_yystype[ valueAt (int i) {
return valueStack[height - i];
}
// Print the state stack on the debug stream.
public void print (java.io.PrintStream out)
{
out.print ("Stack now");
for (int i = 0; i < height; i++)
{
out.print (' ');
out.print (stateStack[i]);
}
out.println ();
}
}
/**
* Returned by a Bison action in order to stop the parsing process and
* return success (true). */
public static final int YYACCEPT = 0;
/**
* Returned by a Bison action in order to stop the parsing process and
* return failure (false). */
public static final int YYABORT = 1;
/**
* Returned by a Bison action in order to start error recovery without
* printing an error message. */
public static final int YYERROR = 2;
/**
* Returned by a Bison action in order to print an error message and start
* error recovery. Formally deprecated in Bison 2.4.2's NEWS entry, where
* a plan to phase it out is discussed. */
public static final int YYFAIL = 3;
private static final int YYNEWSTATE = 4;
private static final int YYDEFAULT = 5;
private static final int YYREDUCE = 6;
private static final int YYERRLAB1 = 7;
private static final int YYRETURN = 8;
private int yyerrstatus_ = 0;
/**
* Return whether error recovery is being done. In this state, the parser
* reads token until it reaches a known state, and then restarts normal
* operation. */
public final boolean recovering ()
{
return yyerrstatus_ == 0;
}
private int yyaction (int yyn, YYStack yystack, int yylen) ]b4_maybe_throws([b4_throws])[
{
]b4_yystype[ yyval;
]b4_locations_if([b4_location_type[ yyloc = yylloc (yystack, yylen);]])[
/* If YYLEN 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 (yylen > 0)
yyval = yystack.valueAt (yylen - 1);
else
yyval = yystack.valueAt (0);
yy_reduce_print (yyn, yystack);
switch (yyn)
{
]b4_user_actions[
default: break;
}
yy_symbol_print ("-> $$ =", yyr1_[yyn], yyval]b4_locations_if([, yyloc])[);
yystack.pop (yylen);
yylen = 0;
/* Shift the result of the reduction. */
yyn = yyr1_[yyn];
int yystate = yypgoto_[yyn - yyntokens_] + yystack.stateAt (0);
if (0 <= yystate && yystate <= yylast_
&& yycheck_[yystate] == yystack.stateAt (0))
yystate = yytable_[yystate];
else
yystate = yydefgoto_[yyn - yyntokens_];
yystack.push (yystate, yyval]b4_locations_if([, yyloc])[);
return YYNEWSTATE;
}
/* Return YYSTR after stripping away unnecessary quotes and
backslashes, so that it's suitable for yyerror. The heuristic is
that double-quoting is unnecessary unless the string contains an
apostrophe, a comma, or backslash (other than backslash-backslash).
YYSTR is taken from yytname. */
private final String yytnamerr_ (String yystr)
{
if (yystr.charAt (0) == '"')
{
StringBuffer yyr = new StringBuffer ();
strip_quotes: for (int i = 1; i < yystr.length (); i++)
switch (yystr.charAt (i))
{
case '\'':
case ',':
break strip_quotes;
case '\\':
if (yystr.charAt(++i) != '\\')
break strip_quotes;
/* Fall through. */
default:
yyr.append (yystr.charAt (i));
break;
case '"':
return yyr.toString ();
}
}
else if (yystr.equals ("$end"))
return "end of input";
return yystr;
}
/*--------------------------------.
| Print this symbol on YYOUTPUT. |
`--------------------------------*/
private void yy_symbol_print (String s, int yytype,
]b4_yystype[ yyvaluep]dnl
b4_locations_if([, Object yylocationp])[)
{
if (yydebug > 0)
yycdebug (s + (yytype < yyntokens_ ? " token " : " nterm ")
+ yytname_[yytype] + " ("]b4_locations_if([
+ yylocationp + ": "])[
+ (yyvaluep == null ? "(null)" : yyvaluep.toString ()) + ")");
}
/**
* Parse input from the scanner that was specified at object construction
* time. Return whether the end of the input was reached successfully.
*
* @@return true if the parsing succeeds. Note that this does not
* imply that there were no syntax errors.
*/
public boolean parse () ]b4_maybe_throws([b4_list2([b4_lex_throws], [b4_throws])])[
{
/// Lookahead and lookahead in internal form.
int yychar = yyempty_;
int yytoken = 0;
/* State. */
int yyn = 0;
int yylen = 0;
int yystate = 0;
YYStack yystack = new YYStack ();
/* Error handling. */
int yynerrs_ = 0;
]b4_locations_if([/// The location where the error started.
]b4_location_type[ yyerrloc = null;
/// ]b4_location_type[ of the lookahead.
]b4_location_type[ yylloc = new ]b4_location_type[ (null, null);
/// @@$.
]b4_location_type[ yyloc;])
/// Semantic value of the lookahead.
b4_yystype[ yylval = null;
int yyresult;
yycdebug ("Starting parse\n");
yyerrstatus_ = 0;
]m4_ifdef([b4_initial_action], [
m4_pushdef([b4_at_dollar], [yylloc])dnl
m4_pushdef([b4_dollar_dollar], [yylval])dnl
/* User initialization code. */
b4_user_initial_action
m4_popdef([b4_dollar_dollar])dnl
m4_popdef([b4_at_dollar])])dnl
[ /* Initialize the stack. */
yystack.push (yystate, yylval]b4_locations_if([, yylloc])[);
int label = YYNEWSTATE;
for (;;)
switch (label)
{
/* New state. Unlike in the C/C++ skeletons, the state is already
pushed when we come here. */
case YYNEWSTATE:
yycdebug ("Entering state " + yystate + "\n");
if (yydebug > 0)
yystack.print (yyDebugStream);
/* Accept? */
if (yystate == yyfinal_)
return true;
/* Take a decision. First try without lookahead. */
yyn = yypact_[yystate];
if (yyn == yypact_ninf_)
{
label = YYDEFAULT;
break;
}
/* Read a lookahead token. */
if (yychar == yyempty_)
{
yycdebug ("Reading a token: ");
yychar = yylex ();]
b4_locations_if([[
yylloc = new ]b4_location_type[(yylexer.getStartPos (),
yylexer.getEndPos ());]])
yylval = yylexer.getLVal ();[
}
/* Convert token to internal form. */
if (yychar <= EOF)
{
yychar = yytoken = EOF;
yycdebug ("Now at end of input.\n");
}
else
{
yytoken = yytranslate_ (yychar);
yy_symbol_print ("Next token is", yytoken,
yylval]b4_locations_if([, 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)
label = YYDEFAULT;
/* <= 0 means reduce or error. */
else if ((yyn = yytable_[yyn]) <= 0)
{
if (yyn == 0 || yyn == yytable_ninf_)
label = YYFAIL;
else
{
yyn = -yyn;
label = YYREDUCE;
}
}
else
{
/* Shift the lookahead token. */
yy_symbol_print ("Shifting", yytoken,
yylval]b4_locations_if([, yylloc])[);
/* Discard the token being shifted. */
yychar = yyempty_;
/* Count tokens shifted since error; after three, turn off error
status. */
if (yyerrstatus_ > 0)
--yyerrstatus_;
yystate = yyn;
yystack.push (yystate, yylval]b4_locations_if([, yylloc])[);
label = YYNEWSTATE;
}
break;
/*-----------------------------------------------------------.
| yydefault -- do the default action for the current state. |
`-----------------------------------------------------------*/
case YYDEFAULT:
yyn = yydefact_[yystate];
if (yyn == 0)
label = YYFAIL;
else
label = YYREDUCE;
break;
/*-----------------------------.
| yyreduce -- Do a reduction. |
`-----------------------------*/
case YYREDUCE:
yylen = yyr2_[yyn];
label = yyaction (yyn, yystack, yylen);
yystate = yystack.stateAt (0);
break;
/*------------------------------------.
| yyerrlab -- here on detecting error |
`------------------------------------*/
case YYFAIL:
/* If not already recovering from an error, report this error. */
if (yyerrstatus_ == 0)
{
++yynerrs_;
yyerror (]b4_locations_if([yylloc, ])[yysyntax_error (yystate, yytoken));
}
]b4_locations_if([yyerrloc = yylloc;])[
if (yyerrstatus_ == 3)
{
/* If just tried and failed to reuse lookahead token after an
error, discard it. */
if (yychar <= EOF)
{
/* Return failure if at end of input. */
if (yychar == EOF)
return false;
}
else
yychar = yyempty_;
}
/* Else will try to reuse lookahead token after shifting the error
token. */
label = YYERRLAB1;
break;
/*---------------------------------------------------.
| errorlab -- error raised explicitly by YYERROR. |
`---------------------------------------------------*/
case YYERROR:
]b4_locations_if([yyerrloc = yystack.locationAt (yylen - 1);])[
/* Do not reclaim the symbols of the rule which action triggered
this YYERROR. */
yystack.pop (yylen);
yylen = 0;
yystate = yystack.stateAt (0);
label = YYERRLAB1;
break;
/*-------------------------------------------------------------.
| yyerrlab1 -- common code for both syntax error and YYERROR. |
`-------------------------------------------------------------*/
case 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 (yystack.height == 1)
return false;
]b4_locations_if([yyerrloc = yystack.locationAt (0);])[
yystack.pop ();
yystate = yystack.stateAt (0);
if (yydebug > 0)
yystack.print (yyDebugStream);
}
]b4_locations_if([
/* Muck with the stack to setup for yylloc. */
yystack.push (0, null, yylloc);
yystack.push (0, null, yyerrloc);
yyloc = yylloc (yystack, 2);
yystack.pop (2);])[
/* Shift the error token. */
yy_symbol_print ("Shifting", yystos_[yyn],
yylval]b4_locations_if([, yyloc])[);
yystate = yyn;
yystack.push (yyn, yylval]b4_locations_if([, yyloc])[);
label = YYNEWSTATE;
break;
/* Accept. */
case YYACCEPT:
return true;
/* Abort. */
case YYABORT:
return false;
}
}
// Generate an error message.
private String yysyntax_error (int yystate, int tok)
{
if (errorVerbose)
{
int yyn = yypact_[yystate];
if (yypact_ninf_ < yyn && yyn <= yylast_)
{
StringBuffer res;
/* 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 + 1;
int yyxend = yychecklim < yyntokens_ ? yychecklim : yyntokens_;
int count = 0;
for (int x = yyxbegin; x < yyxend; ++x)
if (yycheck_[x + yyn] == x && x != yyterror_)
++count;
// FIXME: This method of building the message is not compatible
// with internationalization.
res = new StringBuffer ("syntax error, unexpected ");
res.append (yytnamerr_ (yytname_[tok]));
if (count < 5)
{
count = 0;
for (int x = yyxbegin; x < yyxend; ++x)
if (yycheck_[x + yyn] == x && x != yyterror_)
{
res.append (count++ == 0 ? ", expecting " : " or ");
res.append (yytnamerr_ (yytname_[x]));
}
}
return res.toString ();
}
}
return "syntax error";
}
/* YYPACT[STATE-NUM] -- Index in YYTABLE of the portion describing
STATE-NUM. */
private static final ]b4_int_type_for([b4_pact])[ yypact_ninf_ = ]b4_pact_ninf[;
private static final ]b4_int_type_for([b4_pact])[ yypact_[] =
{
]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. */
private static final ]b4_int_type_for([b4_defact])[ yydefact_[] =
{
]b4_defact[
};
/* YYPGOTO[NTERM-NUM]. */
private static final ]b4_int_type_for([b4_pgoto])[ yypgoto_[] =
{
]b4_pgoto[
};
/* YYDEFGOTO[NTERM-NUM]. */
private static final ]b4_int_type_for([b4_defgoto])[
yydefgoto_[] =
{
]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. */
private static final ]b4_int_type_for([b4_table])[ yytable_ninf_ = ]b4_table_ninf[;
private static final ]b4_int_type_for([b4_table])[
yytable_[] =
{
]b4_table[
};
/* YYCHECK. */
private static final ]b4_int_type_for([b4_check])[
yycheck_[] =
{
]b4_check[
};
/* STOS_[STATE-NUM] -- The (internal number of the) accessing
symbol of state STATE-NUM. */
private static final ]b4_int_type_for([b4_stos])[
yystos_[] =
{
]b4_stos[
};
/* TOKEN_NUMBER_[YYLEX-NUM] -- Internal symbol number corresponding
to YYLEX-NUM. */
private static final ]b4_int_type_for([b4_toknum])[
yytoken_number_[] =
{
]b4_toknum[
};
/* YYR1[YYN] -- Symbol number of symbol that rule YYN derives. */
private static final ]b4_int_type_for([b4_r1])[
yyr1_[] =
{
]b4_r1[
};
/* YYR2[YYN] -- Number of symbols composing right hand side of rule YYN. */
private static final ]b4_int_type_for([b4_r2])[
yyr2_[] =
{
]b4_r2[
};
/* YYTNAME[SYMBOL-NUM] -- String name of the symbol SYMBOL-NUM.
First, the terminals, then, starting at \a yyntokens_, nonterminals. */
private static final String yytname_[] =
{
]b4_tname[
};
/* YYRHS -- A `-1'-separated list of the rules' RHS. */
private static final ]b4_int_type_for([b4_rhs])[ yyrhs_[] =
{
]b4_rhs[
};
/* YYPRHS[YYN] -- Index of the first RHS symbol of rule number YYN in
YYRHS. */
private static final ]b4_int_type_for([b4_prhs])[ yyprhs_[] =
{
]b4_prhs[
};
/* YYRLINE[YYN] -- Source line where rule number YYN was defined. */
private static final ]b4_int_type_for([b4_rline])[ yyrline_[] =
{
]b4_rline[
};
// Report on the debug stream that the rule yyrule is going to be reduced.
private void yy_reduce_print (int yyrule, YYStack yystack)
{
if (yydebug == 0)
return;
int yylno = yyrline_[yyrule];
int yynrhs = yyr2_[yyrule];
/* Print the symbols being reduced, and their result. */
yycdebug ("Reducing stack by rule " + (yyrule - 1)
+ " (line " + yylno + "), ");
/* The symbols being reduced. */
for (int yyi = 0; yyi < yynrhs; yyi++)
yy_symbol_print (" $" + (yyi + 1) + " =",
yyrhs_[yyprhs_[yyrule] + yyi],
]b4_rhs_value(yynrhs, yyi + 1)b4_locations_if([,
b4_rhs_location(yynrhs, yyi + 1)])[);
}
/* YYTRANSLATE(YYLEX) -- Bison symbol number corresponding to YYLEX. */
private static final ]b4_int_type_for([b4_translate])[ yytranslate_table_[] =
{
]b4_translate[
};
private static final ]b4_int_type_for([b4_translate])[ yytranslate_ (int t)
{
if (t >= 0 && t <= yyuser_token_number_max_)
return yytranslate_table_[t];
else
return yyundef_token_;
}
private static final int yylast_ = ]b4_last[;
private static final int yynnts_ = ]b4_nterms_number[;
private static final int yyempty_ = -2;
private static final int yyfinal_ = ]b4_final_state_number[;
private static final int yyterror_ = 1;
private static final int yyerrcode_ = 256;
private static final int yyntokens_ = ]b4_tokens_number[;
private static final int yyuser_token_number_max_ = ]b4_user_token_number_max[;
private static final int yyundef_token_ = ]b4_undef_token_number[;
]/* User implementation code. */
b4_percent_code_get[]dnl
}
b4_epilogue
m4_divert_pop(0)dnl
070701000541ca000081a40000000000000000000000014cda0fa4000051650000010000010006ffffffffffffffff0000002400000000root/usr/local/share/bison/bison.m4 -*- Autoconf -*-
# Language-independent M4 Macros for Bison.
# Copyright (C) 2002, 2004-2010 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 3 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, see .
## ---------------- ##
## Identification. ##
## ---------------- ##
# b4_copyright(TITLE, YEARS)
# --------------------------
m4_define([b4_copyright],
[b4_comment([A Bison parser, made by GNU Bison b4_version.])
b4_comment([$1
m4_text_wrap([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 3 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, see .])
b4_comment([As a special exception, you may create a larger work that contains
part or all of the Bison parser skeleton and distribute that work
under terms of your choice, so long as that work isn't itself a
parser generator using the skeleton or a modified version thereof
as a parser skeleton. Alternatively, if you modify or redistribute
the parser skeleton itself, you may (at your option) remove this
special exception, which will cause the skeleton and the resulting
Bison output files to be licensed under the GNU General Public
License without this special exception.
This special exception was added by the Free Software Foundation in
version 2.2 of Bison.])])
## ---------------- ##
## Error handling. ##
## ---------------- ##
# The following error handling macros print error directives that should not
# become arguments of other macro invocations since they would likely then be
# mangled. Thus, they print to stdout directly.
# b4_cat(TEXT)
# ------------
# Write TEXT to stdout. Precede the final newline with an @ so that it's
# escaped. For example:
#
# b4_cat([[@complain(invalid input@)]])
m4_define([b4_cat],
[m4_syscmd([cat <<'_m4eof'
]m4_bpatsubst(m4_dquote($1), [_m4eof], [_m4@`eof])[@
_m4eof
])dnl
m4_if(m4_sysval, [0], [], [m4_fatal([$0: cannot write to stdout])])])
# b4_error(KIND, FORMAT, [ARG1], [ARG2], ...)
# -------------------------------------------
# Write @KIND(FORMAT@,ARG1@,ARG2@,...@) to stdout.
#
# For example:
#
# b4_error([[warn]], [[invalid value for `%s': %s]], [[foo]], [[3]])
m4_define([b4_error],
[b4_cat([[@]$1[(]$2[]]dnl
[m4_if([$#], [2], [],
[m4_foreach([b4_arg],
m4_dquote(m4_shift(m4_shift($@))),
[[@,]b4_arg])])[@)]])])
# b4_error_at(KIND, START, END, FORMAT, [ARG1], [ARG2], ...)
# ----------------------------------------------------------
# Write @KIND_at(START@,END@,FORMAT@,ARG1@,ARG2@,...@) to stdout.
#
# For example:
#
# b4_error_at([[complain]], [[input.y:2.3]], [[input.y:5.4]],
# [[invalid %s]], [[foo]])
m4_define([b4_error_at],
[b4_cat([[@]$1[_at(]$2[@,]$3[@,]$4[]]dnl
[m4_if([$#], [4], [],
[m4_foreach([b4_arg],
m4_dquote(m4_shift(m4_shift(m4_shift(m4_shift($@))))),
[[@,]b4_arg])])[@)]])])
# b4_warn(FORMAT, [ARG1], [ARG2], ...)
# ------------------------------------
# Write @warn(FORMAT@,ARG1@,ARG2@,...@) to stdout.
#
# For example:
#
# b4_warn([[invalid value for `%s': %s]], [[foo]], [[3]])
#
# As a simple test suite, this:
#
# m4_divert(-1)
# m4_define([asdf], [ASDF])
# m4_define([fsa], [FSA])
# m4_define([fdsa], [FDSA])
# b4_warn([[[asdf), asdf]]], [[[fsa), fsa]]], [[[fdsa), fdsa]]])
# b4_warn([[asdf), asdf]], [[fsa), fsa]], [[fdsa), fdsa]])
# b4_warn()
# b4_warn(1)
# b4_warn(1, 2)
#
# Should produce this without newlines:
#
# @warn([asdf), asdf]@,[fsa), fsa]@,[fdsa), fdsa]@)
# @warn(asdf), asdf@,fsa), fsa@,fdsa), fdsa@)
# @warn(@)
# @warn(1@)
# @warn(1@,2@)
m4_define([b4_warn],
[b4_error([[warn]], $@)])
# b4_warn_at(START, END, FORMAT, [ARG1], [ARG2], ...)
# ---------------------------------------------------
# Write @warn(START@,END@,FORMAT@,ARG1@,ARG2@,...@) to stdout.
#
# For example:
#
# b4_warn_at([[input.y:2.3]], [[input.y:5.4]], [[invalid %s]], [[foo]])
m4_define([b4_warn_at],
[b4_error_at([[warn]], $@)])
# b4_complain(FORMAT, [ARG1], [ARG2], ...)
# ----------------------------------------
# Write @complain(FORMAT@,ARG1@,ARG2@,...@) to stdout.
#
# See b4_warn example.
m4_define([b4_complain],
[b4_error([[complain]], $@)])
# b4_complain_at(START, END, FORMAT, [ARG1], [ARG2], ...)
# -------------------------------------------------------
# Write @complain(START@,END@,FORMAT@,ARG1@,ARG2@,...@) to stdout.
#
# See b4_warn_at example.
m4_define([b4_complain_at],
[b4_error_at([[complain]], $@)])
# b4_fatal(FORMAT, [ARG1], [ARG2], ...)
# -------------------------------------
# Write @fatal(FORMAT@,ARG1@,ARG2@,...@) to stdout and exit.
#
# See b4_warn example.
m4_define([b4_fatal],
[b4_error([[fatal]], $@)dnl
m4_exit(1)])
# b4_fatal_at(START, END, FORMAT, [ARG1], [ARG2], ...)
# ----------------------------------------------------
# Write @fatal(START@,END@,FORMAT@,ARG1@,ARG2@,...@) to stdout and exit.
#
# See b4_warn_at example.
m4_define([b4_fatal_at],
[b4_error_at([[fatal]], $@)dnl
m4_exit(1)])
## ---------------- ##
## Default values. ##
## ---------------- ##
# m4_define_default([b4_lex_param], []) dnl breaks other skeletons
m4_define_default([b4_pre_prologue], [])
m4_define_default([b4_post_prologue], [])
m4_define_default([b4_epilogue], [])
m4_define_default([b4_parse_param], [])
# The initial column and line.
m4_define_default([b4_location_initial_column], [1])
m4_define_default([b4_location_initial_line], [1])
## ------------ ##
## 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])])
## ------------------ ##
## Decoding options. ##
## ------------------ ##
# b4_flag_if(FLAG, IF-TRUE, IF-FALSE)
# -----------------------------------
# Run IF-TRUE if b4_FLAG_flag is 1, IF-FALSE if FLAG is 0, otherwise fail.
m4_define([b4_flag_if],
[m4_case(b4_$1_flag,
[0], [$3],
[1], [$2],
[m4_fatal([invalid $1 value: ]$1)])])
# b4_define_flag_if(FLAG)
# -----------------------
# Define "b4_FLAG_if(IF-TRUE, IF-FALSE)" that depends on the
# value of the Boolean FLAG.
m4_define([b4_define_flag_if],
[_b4_define_flag_if($[1], $[2], [$1])])
# _b4_define_flag_if($1, $2, FLAG)
# --------------------------------
# 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([_b4_define_flag_if],
[m4_if([$1$2], $[1]$[2], [],
[m4_fatal([$0: Invalid arguments: $@])])dnl
m4_define([b4_$3_if],
[b4_flag_if([$3], [$1], [$2])])])
# b4_FLAG_if(IF-TRUE, IF-FALSE)
# -----------------------------
# Expand IF-TRUE, if FLAG is true, IF-FALSE otherwise.
b4_define_flag_if([defines]) # Whether headers are requested.
b4_define_flag_if([error_verbose]) # Whether error are verbose.
b4_define_flag_if([glr]) # Whether a GLR parser is requested.
b4_define_flag_if([locations]) # Whether locations are tracked.
b4_define_flag_if([nondeterministic]) # Whether conflicts should be handled.
b4_define_flag_if([yacc]) # Whether POSIX Yacc is emulated.
## ------------------------- ##
## Assigning token numbers. ##
## ------------------------- ##
## ----------- ##
## Synclines. ##
## ----------- ##
# b4_basename(NAME)
# -----------------
# Similar to POSIX basename; the differences don't matter here.
# Beware that NAME is not evaluated.
m4_define([b4_basename],
[m4_bpatsubst([$1], [^.*/\([^/]+\)/*$], [\1])])
# b4_syncline(LINE, FILE)
# -----------------------
m4_define([b4_syncline],
[b4_flag_if([synclines], [
b4_sync_end([__line__], [b4_basename(m4_quote(__file__))])
b4_sync_start([$1], [$2])])])
m4_define([b4_sync_end], [b4_comment([Line $1 of $2])])
m4_define([b4_sync_start], [b4_comment([Line $1 of $2])])
# b4_user_code(USER-CODE)
# -----------------------
# Emit code from the user, ending it with synclines.
m4_define([b4_user_code],
[$1
b4_syncline([@oline@], [@ofile@])])
# b4_define_user_code(MACRO)
# --------------------------
# From b4_MACRO, build b4_user_MACRO that includes the synclines.
m4_define([b4_define_user_code],
[m4_define([b4_user_$1],
[b4_user_code([b4_$1])])])
# b4_user_actions
# b4_user_initial_action
# b4_user_post_prologue
# b4_user_pre_prologue
# b4_user_stype
# ----------------------
# Macros that issue user code, ending with synclines.
b4_define_user_code([actions])
b4_define_user_code([initial_action])
b4_define_user_code([post_prologue])
b4_define_user_code([pre_prologue])
b4_define_user_code([stype])
# b4_check_user_names(WHAT, USER-LIST, BISON-NAMESPACE)
# --------------------------------------------------------
# Warn if any name of type WHAT is used by the user (as recorded in USER-LIST)
# but is not used by Bison (as recorded by macros in the namespace
# BISON-NAMESPACE).
#
# USER-LIST must expand to a list specifying all grammar occurrences of all
# names of type WHAT. Each item in the list must be a triplet specifying one
# occurrence: name, start boundary, and end boundary. Empty string names are
# fine. An empty list is fine.
#
# For example, to define b4_foo_user_names to be used for USER-LIST with three
# name occurrences and with correct quoting:
#
# m4_define([b4_foo_user_names],
# [[[[[[bar]], [[parser.y:1.7]], [[parser.y:1.16]]]],
# [[[[bar]], [[parser.y:5.7]], [[parser.y:5.16]]]],
# [[[[baz]], [[parser.y:8.7]], [[parser.y:8.16]]]]]])
#
# The macro BISON-NAMESPACE(bar) must be defined iff the name bar of type WHAT
# is used by Bison (in the front-end or in the skeleton). Empty string names
# are fine, but it would be ugly for Bison to actually use one.
#
# For example, to use b4_foo_bison_names for BISON-NAMESPACE and define that
# the names bar and baz are used by Bison:
#
# m4_define([b4_foo_bison_names(bar)])
# m4_define([b4_foo_bison_names(baz)])
#
# To invoke b4_check_user_names with TYPE foo, with USER-LIST
# b4_foo_user_names, with BISON-NAMESPACE b4_foo_bison_names, and with correct
# quoting:
#
# b4_check_user_names([[foo]], [b4_foo_user_names],
# [[b4_foo_bison_names]])
m4_define([b4_check_user_names],
[m4_foreach([b4_occurrence], $2,
[m4_pushdef([b4_occurrence], b4_occurrence)dnl
m4_pushdef([b4_user_name], m4_car(b4_occurrence))dnl
m4_pushdef([b4_start], m4_car(m4_shift(b4_occurrence)))dnl
m4_pushdef([b4_end], m4_shift(m4_shift(b4_occurrence)))dnl
m4_ifndef($3[(]m4_quote(b4_user_name)[)],
[b4_warn_at([b4_start], [b4_end],
[[%s `%s' is not used]],
[$1], [b4_user_name])])[]dnl
m4_popdef([b4_occurrence])dnl
m4_popdef([b4_user_name])dnl
m4_popdef([b4_start])dnl
m4_popdef([b4_end])dnl
])])
# b4_percent_define_get(VARIABLE)
# -------------------------------
# Mimic muscle_percent_define_get in ../src/muscle_tab.h exactly. That is, if
# the %define variable VARIABLE is defined, emit its value. Also, record
# Bison's usage of VARIABLE by defining
# b4_percent_define_bison_variables(VARIABLE).
#
# For example:
#
# b4_percent_define_get([[foo]])
m4_define([b4_percent_define_get],
[m4_define([b4_percent_define_bison_variables(]$1[)])dnl
m4_ifdef([b4_percent_define(]$1[)], [m4_indir([b4_percent_define(]$1[)])])])
# b4_percent_define_get_loc(VARIABLE)
# -----------------------------------
# Mimic muscle_percent_define_get_loc in ../src/muscle_tab.h exactly. That is,
# if the %define variable VARIABLE is undefined, complain fatally since that's
# a Bison or skeleton error. Otherwise, return its definition location in a
# form approriate for the first two arguments of b4_warn_at, b4_complain_at, or
# b4_fatal_at. Don't record this as a Bison usage of VARIABLE as there's no
# reason to suspect that the user-supplied value has yet influenced the output.
#
# For example:
#
# b4_complain_at(b4_percent_define_get_loc([[foo]]), [[invalid foo]])
m4_define([b4_percent_define_get_loc],
[m4_ifdef([b4_percent_define_loc(]$1[)],
[m4_pushdef([b4_loc], m4_indir([b4_percent_define_loc(]$1[)]))dnl
b4_loc[]dnl
m4_popdef([b4_loc])],
[b4_fatal([[undefined %%define variable `%s' passed to b4_percent_define_get_loc]], [$1])])])
# b4_percent_define_get_syncline(VARIABLE)
# ----------------------------------------
# Mimic muscle_percent_define_get_syncline in ../src/muscle_tab.h exactly.
# That is, if the %define variable VARIABLE is undefined, complain fatally
# since that's a Bison or skeleton error. Otherwise, return its definition
# location as a b4_syncline invocation. Don't record this as a Bison usage of
# VARIABLE as there's no reason to suspect that the user-supplied value has yet
# influenced the output.
#
# For example:
#
# b4_percent_define_get_syncline([[foo]])
m4_define([b4_percent_define_get_syncline],
[m4_ifdef([b4_percent_define_syncline(]$1[)],
[m4_indir([b4_percent_define_syncline(]$1[)])],
[b4_fatal([[undefined %%define variable `%s' passed to b4_percent_define_get_syncline]], [$1])])])
# b4_percent_define_ifdef(VARIABLE, IF-TRUE, [IF-FALSE])
# ------------------------------------------------------
# Mimic muscle_percent_define_ifdef in ../src/muscle_tab.h exactly. That is,
# if the %define variable VARIABLE is defined, expand IF-TRUE, else expand
# IF-FALSE. Also, record Bison's usage of VARIABLE by defining
# b4_percent_define_bison_variables(VARIABLE).
#
# For example:
#
# b4_percent_define_ifdef([[foo]], [[it's defined]], [[it's undefined]])
m4_define([b4_percent_define_ifdef],
[m4_ifdef([b4_percent_define(]$1[)],
[m4_define([b4_percent_define_bison_variables(]$1[)])$2],
[$3])])
# b4_percent_define_flag_if(VARIABLE, IF-TRUE, [IF-FALSE])
# --------------------------------------------------------
# Mimic muscle_percent_define_flag_if in ../src/muscle_tab.h exactly. That is,
# if the %define variable VARIABLE is defined to "" or "true", expand IF-TRUE.
# If it is defined to "false", expand IF-FALSE. Complain if it is undefined
# (a Bison or skeleton error since the default value should have been set
# already) or defined to any other value (possibly a user error). Also, record
# Bison's usage of VARIABLE by defining
# b4_percent_define_bison_variables(VARIABLE).
#
# For example:
#
# b4_percent_define_flag_if([[foo]], [[it's true]], [[it's false]])
m4_define([b4_percent_define_flag_if],
[b4_percent_define_ifdef([$1],
[m4_case(b4_percent_define_get([$1]),
[], [$2], [true], [$2], [false], [$3],
[m4_expand_once([b4_complain_at(b4_percent_define_get_loc([$1]),
[[invalid value for %%define Boolean variable `%s']],
[$1])],
[[b4_percent_define_flag_if($1)]])])],
[b4_fatal([[undefined %%define variable `%s' passed to b4_percent_define_flag_if]], [$1])])])
# b4_percent_define_default(VARIABLE, DEFAULT)
# --------------------------------------------
# Mimic muscle_percent_define_default in ../src/muscle_tab.h exactly. That is,
# if the %define variable VARIABLE is undefined, set its value to DEFAULT.
# Don't record this as a Bison usage of VARIABLE as there's no reason to
# suspect that the value has yet influenced the output.
#
# For example:
#
# b4_percent_define_default([[foo]], [[default value]])
m4_define([b4_percent_define_default],
[m4_ifndef([b4_percent_define(]$1[)],
[m4_define([b4_percent_define(]$1[)], [$2])dnl
m4_define([b4_percent_define_loc(]$1[)],
[[[[:-1.-1]],
[[:-1.-1]]]])dnl
m4_define([b4_percent_define_syncline(]$1[)], [[]])])])
# b4_percent_define_check_values(VALUES)
# --------------------------------------
# Mimic muscle_percent_define_check_values in ../src/muscle_tab.h exactly
# except that the VALUES structure is more appropriate for M4. That is, VALUES
# is a list of sublists of strings. For each sublist, the first string is the
# name of a %define variable, and all remaining strings in that sublist are the
# valid values for that variable. Complain if such a variable is undefined (a
# Bison error since the default value should have been set already) or defined
# to any other value (possibly a user error). Don't record this as a Bison
# usage of the variable as there's no reason to suspect that the value has yet
# influenced the output.
#
# For example:
#
# b4_percent_define_check_values([[[[foo]], [[foo-value1]], [[foo-value2]]]],
# [[[[bar]], [[bar-value1]]]])
m4_define([b4_percent_define_check_values],
[m4_foreach([b4_sublist], m4_quote($@),
[_b4_percent_define_check_values(b4_sublist)])])
m4_define([_b4_percent_define_check_values],
[m4_ifdef([b4_percent_define(]$1[)],
[m4_pushdef([b4_good_value], [0])dnl
m4_if($#, 1, [],
[m4_foreach([b4_value], m4_dquote(m4_shift($@)),
[m4_if(m4_indir([b4_percent_define(]$1[)]), b4_value,
[m4_define([b4_good_value], [1])])])])dnl
m4_if(b4_good_value, [0],
[b4_complain_at(b4_percent_define_get_loc([$1]),
[[invalid value for %%define variable `%s': `%s']],
[$1],
m4_dquote(m4_indir([b4_percent_define(]$1[)])))])dnl
m4_popdef([b4_good_value])],
[b4_fatal([[undefined %%define variable `%s' passed to b4_percent_define_check_values]], [$1])])])
# b4_percent_code_get([QUALIFIER])
# --------------------------------
# If any %code blocks for QUALIFIER are defined, emit them beginning with a
# comment and ending with synclines and a newline. If QUALIFIER is not
# specified or empty, do this for the unqualified %code blocks. Also, record
# Bison's usage of QUALIFIER (if specified) by defining
# b4_percent_code_bison_qualifiers(QUALIFIER).
#
# For example, to emit any unqualified %code blocks followed by any %code
# blocks for the qualifier foo:
#
# b4_percent_code_get
# b4_percent_code_get([[foo]])
m4_define([b4_percent_code_get],
[m4_pushdef([b4_macro_name], [[b4_percent_code(]$1[)]])dnl
m4_ifval([$1], [m4_define([b4_percent_code_bison_qualifiers(]$1[)])])dnl
m4_ifdef(b4_macro_name,
[b4_comment([m4_if([$#], [0], [[Unqualified %code]],
[["%code ]$1["]])[ blocks.]])
b4_user_code([m4_indir(b4_macro_name)])
])dnl
m4_popdef([b4_macro_name])])
# b4_percent_code_ifdef(QUALIFIER, IF-TRUE, [IF-FALSE])
# -----------------------------------------------------
# If any %code blocks for QUALIFIER (or unqualified %code blocks if
# QUALIFIER is empty) are defined, expand IF-TRUE, else expand IF-FALSE.
# Also, record Bison's usage of QUALIFIER (if specified) by defining
# b4_percent_code_bison_qualifiers(QUALIFIER).
m4_define([b4_percent_code_ifdef],
[m4_ifdef([b4_percent_code(]$1[)],
[m4_ifval([$1], [m4_define([b4_percent_code_bison_qualifiers(]$1[)])])$2],
[$3])])
## ----------------------------------------------------------- ##
## After processing the skeletons, check that all the user's ##
## %define variables and %code qualifiers were used by Bison. ##
## ----------------------------------------------------------- ##
m4_define([b4_check_user_names_wrap],
[m4_ifdef([b4_percent_]$1[_user_]$2[s],
[b4_check_user_names([[%]$1 $2],
[b4_percent_]$1[_user_]$2[s],
[[b4_percent_]$1[_bison_]$2[s]])])])
m4_wrap_lifo([
b4_check_user_names_wrap([[define]], [[variable]])
b4_check_user_names_wrap([[code]], [[qualifier]])
])
070701000541c9000081a40000000000000000000000014cda0fa4000007e30000010000010006ffffffffffffffff0000002200000000root/usr/local/share/bison/README -*- outline -*-
This directory contains data needed by Bison.
* Skeletons
Bison skeletons: the general shapes of the different parser kinds,
that are specialized for specific grammars by the bison program.
Currently, the supported skeletons are:
- 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.
- lalr1.java
Produces a Java parser class.
- glr.c
A Generalized LR C parser based on Bison's LALR(1) tables.
- glr.cc
A Generalized LR C++ parser. Actually a C++ wrapper around glr.c.
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.
* m4sugar
This directory contains M4sugar, sort of an extended library for M4,
which is used by Bison to instantiate the skeletons.
* xslt
This directory contains XSLT programs that transform Bison's XML output
into various formats.
- bison.xsl
A library of routines used by the other XSLT programs.
- xml2dot.xsl
Conversion into GraphViz's dot format.
- xml2text.xsl
Conversion into text.
- xml2xhtml.xsl
Conversion into XHTML.
-----
Copyright (C) 2002, 2008-2010 Free Software Foundation, Inc.
This file is part of GNU Bison.
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 3 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, see .
070701000541df000041ed0000000000000000000000024cda0fa8000000000000010000010006ffffffffffffffff0000001a00000000root/usr/local/share/info 070701000541e0000081a40000000000000000000000014cda0fa5000716c10000010000010006ffffffffffffffff0000002500000000root/usr/local/share/info/bison.info This is bison.info, produced by makeinfo version 4.11 from
bison.texinfo.
This manual (24 February 2010) is for GNU Bison (version 2.4.2), the
GNU parser generator.
Copyright (C) 1988-1993, 1995, 1998-2010 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.2 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 the freedom to copy and
modify this GNU manual. Buying copies from the FSF supports it in
developing GNU and promoting software freedom."
INFO-DIR-SECTION Software development
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 (24 February 2010) is for GNU Bison (version 2.4.2), the
GNU parser generator.
Copyright (C) 1988-1993, 1995, 1998-2010 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.2 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 the freedom to copy and
modify this GNU manual. Buying copies from the FSF supports it in
developing GNU and promoting software freedom."
* 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).
* Other Languages:: Creating C++ and Java parsers.
* FAQ:: Frequently Asked Questions
* Table of Symbols:: All the keywords of the Bison language are explained.
* Glossary:: Basic concepts are explained.
* 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.
Writing GLR Parsers
* Simple GLR Parsers:: Using GLR parsers on unambiguous grammars.
* Merging GLR Parses:: Using GLR parsers to resolve ambiguities.
* GLR Semantic Actions:: Deferred semantic actions have special concerns.
* Compiler Requirements:: GLR parsers require a modern C compiler.
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
* Rpcalc Declarations:: Prologue (declarations) for rpcalc.
* Rpcalc Rules:: Grammar Rules for rpcalc, with explanation.
* Rpcalc Lexer:: The lexical analyzer.
* Rpcalc Main:: The controlling function.
* Rpcalc Error:: The error reporting function.
* Rpcalc Generate:: Running Bison on the grammar file.
* Rpcalc Compile:: Run the C compiler on the output code.
Grammar Rules for `rpcalc'
* Rpcalc Input::
* Rpcalc Line::
* Rpcalc Expr::
Location Tracking Calculator: `ltcalc'
* Ltcalc Declarations:: Bison and C declarations for ltcalc.
* Ltcalc Rules:: Grammar rules for ltcalc, with explanations.
* Ltcalc Lexer:: The lexical analyzer.
Multi-Function Calculator: `mfcalc'
* Mfcalc Declarations:: Bison declarations for multi-function calculator.
* Mfcalc Rules:: Grammar rules for the calculator.
* Mfcalc Symbol Table:: 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.
* Prologue Alternatives:: Syntax and usage of alternatives to 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
* Require Decl:: Requiring a Bison version.
* 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.
* Initial Action Decl:: Code run before parsing starts.
* 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.
* Push Decl:: Requesting a push parser.
* Decl Summary:: Table of all Bison declarations.
Parser C-Language Interface
* Parser Function:: How to call `yyparse' and what it returns.
* Push Parser Function:: How to call `yypush_parse' and what it returns.
* Pull Parser Function:: How to call `yypull_parse' and what it returns.
* Parser Create Function:: How to call `yypstate_new' and what it returns.
* Parser Delete Function:: How to call `yypstate_delete' 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.
* Internationalization:: How to let the parser speak in the user's
native language.
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
* Lookahead:: 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.
* Memory Management:: What happens when memory is exhausted. 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'.
Parsers Written In Other Languages
* C++ Parsers:: The interface to generate C++ parser classes
* Java Parsers:: The interface to generate Java parser classes
C++ Parsers
* C++ Bison Interface:: Asking for C++ parser generation
* C++ Semantic Values:: %union vs. C++
* C++ Location Values:: The position and location classes
* C++ Parser Interface:: Instantiating and running the parser
* C++ Scanner Interface:: Exchanges between yylex and parse
* A Complete C++ Example:: Demonstrating their use
A Complete C++ Example
* Calc++ --- C++ Calculator:: The specifications
* Calc++ Parsing Driver:: An active parsing context
* Calc++ Parser:: A parser class
* Calc++ Scanner:: A pure C++ Flex scanner
* Calc++ Top Level:: Conducting the band
Java Parsers
* Java Bison Interface:: Asking for Java parser generation
* Java Semantic Values:: %type and %token vs. Java
* Java Location Values:: The position and location classes
* Java Parser Interface:: Instantiating and running the parser
* Java Scanner Interface:: Specifying the scanner for the parser
* Java Action Features:: Special features for use in actions
* Java Differences:: Differences between C/C++ and Java Grammars
* Java Declarations Summary:: List of Bison declarations used with Java
Frequently Asked Questions
* Memory Exhausted:: Breaking the Stack Limits
* How Can I Reset the Parser:: `yyparse' Keeps some State
* Strings are Destroyed:: `yylval' Loses Track of Strings
* Implementing Gotos/Loops:: Control Flow in the Calculator
* Multiple start-symbols:: Factoring closely related grammars
* Secure? Conform?:: Is Bison POSIX safe?
* I can't build Bison:: Troubleshooting
* Where can I find help?:: Troubleshouting
* Bug Reports:: Troublereporting
* More Languages:: Parsers in C++, Java, and so on
* Beta Testing:: Experimenting development versions
* Mailing Lists:: Meeting other Bison users
Copying This Manual
* Copying This Manual:: 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 an
annotated context-free grammar into an LALR(1) or GLR parser for that
grammar. Once you are proficient with Bison, you can 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 or 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 2.4.2 of Bison.
File: bison.info, Node: Conditions, Next: Copying, Prev: Introduction, Up: Top
Conditions for Using Bison
**************************
The distribution terms for Bison-generated parsers permit using the
parsers in nonfree programs. Before Bison version 2.2, these extra
permissions applied only when Bison was generating LALR(1) parsers in
C. And before Bison version 1.24, Bison-generated 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
parser's implementation. (The actions from your grammar are inserted
into this implementation at one point, but most of the rest of the
implementation is not changed.) When we applied the GPL terms to the
skeleton code for the parser's implementation, 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 when Bison is generating code for a parser.
You can tell whether the exception applies to a Bison output file by
inspecting the file for text beginning with "As a special
exception...". The text spells out the exact terms of the exception.
File: bison.info, Node: Copying, Next: Concepts, Prev: Conditions, Up: Top
GNU GENERAL PUBLIC LICENSE
**************************
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. `http://fsf.org/'
Everyone is permitted to copy and distribute verbatim copies of this
license document, but changing it is not allowed.
Preamble
========
The GNU General Public License is a free, copyleft license for software
and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains
free software for all its users. We, the Free Software Foundation, use
the GNU General Public License for most of our software; it applies
also to any other work released this way by its authors. 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
them 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 prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you
have certain responsibilities if you distribute copies of the software,
or if you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. 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.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the
manufacturer can do so. This is fundamentally incompatible with the
aim of protecting users' freedom to change the software. The
systematic pattern of such abuse occurs in the area of products for
individuals to use, which is precisely where it is most unacceptable.
Therefore, we have designed this version of the GPL to prohibit the
practice for those products. If such problems arise substantially in
other domains, we stand ready to extend this provision to those domains
in future versions of the GPL, as needed to protect the freedom of
users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
====================
0. Definitions.
"This License" refers to version 3 of the GNU General Public
License.
"Copyright" also means copyright-like laws that apply to other
kinds of works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the
work in a fashion requiring copyright permission, other than the
making of an exact copy. The resulting work is called a "modified
version" of the earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work
based on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it
on a computer or modifying a private copy. Propagation includes
copying, distribution (with or without modification), making
available to the public, and in some countries other activities as
well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user
through a computer network, with no transfer of a copy, is not
conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to
the extent that warranties are provided), that licensees may
convey the work under this License, and how to view a copy of this
License. If the interface presents a list of user commands or
options, such as a menu, a prominent item in the list meets this
criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any
non-source form of a work.
A "Standard Interface" means an interface that either is an
official standard defined by a recognized standards body, or, in
the case of interfaces specified for a particular programming
language, one that is widely used among developers working in that
language.
The "System Libraries" of an executable work include anything,
other than the work as a whole, that (a) is included in the normal
form of packaging a Major Component, but which is not part of that
Major Component, and (b) serves only to enable use of the work
with that Major Component, or to implement a Standard Interface
for which an implementation is available to the public in source
code form. A "Major Component", in this context, means a major
essential component (kernel, window system, and so on) of the
specific operating system (if any) on which the executable work
runs, or a compiler used to produce the work, or an object code
interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including
scripts to control those activities. However, it does not include
the work's System Libraries, or general-purpose tools or generally
available free programs which are used unmodified in performing
those activities but which are not part of the work. For example,
Corresponding Source includes interface definition files
associated with source files for the work, and the source code for
shared libraries and dynamically linked subprograms that the work
is specifically designed to require, such as by intimate data
communication or control flow between those subprograms and other
parts of the work.
The Corresponding Source need not include anything that users can
regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running
a covered work is covered by this License only if the output,
given its content, constitutes a covered work. This License
acknowledges your rights of fair use or other equivalent, as
provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise
remains in force. You may convey covered works to others for the
sole purpose of having them make modifications exclusively for
you, or provide you with facilities for running those works,
provided that you comply with the terms of this License in
conveying all material for which you do not control copyright.
Those thus making or running the covered works for you must do so
exclusively on your behalf, under your direction and control, on
terms that prohibit them from making any copies of your
copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section
10 makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under
article 11 of the WIPO copyright treaty adopted on 20 December
1996, or similar laws prohibiting or restricting circumvention of
such measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such
circumvention is effected by exercising rights under this License
with respect to the covered work, and you disclaim any intention
to limit operation or modification of the work as a means of
enforcing, against the work's users, your or third parties' legal
rights to forbid circumvention of technological measures.
4. Conveying Verbatim Copies.
You may convey 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;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the
code; keep intact all notices of the absence of any warranty; and
give all recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these
conditions:
a. The work must carry prominent notices stating that you
modified it, and giving a relevant date.
b. The work must carry prominent notices stating that it is
released under this License and any conditions added under
section 7. This requirement modifies the requirement in
section 4 to "keep intact all notices".
c. You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable
section 7 additional terms, to the whole of the work, and all
its parts, regardless of how they are packaged. This License
gives no permission to license the work in any other way, but
it does not invalidate such permission if you have separately
received it.
d. If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has
interactive interfaces that do not display Appropriate Legal
Notices, your work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered
work, and which are not combined with it such as to form a larger
program, in or on a volume of a storage or distribution medium, is
called an "aggregate" if the compilation and its resulting
copyright are not used to limit the access or legal rights of the
compilation's users beyond what the individual works permit.
Inclusion of a covered work in an aggregate does not cause this
License to apply to the other parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this
License, in one of these ways:
a. Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b. Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for
as long as you offer spare parts or customer support for that
product model, to give anyone who possesses the object code
either (1) a copy of the Corresponding Source for all the
software in the product that is covered by this License, on a
durable physical medium customarily used for software
interchange, for a price no more than your reasonable cost of
physically performing this conveying of source, or (2) access
to copy the Corresponding Source from a network server at no
charge.
c. Convey individual copies of the object code with a copy of
the written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially,
and only if you received the object code with such an offer,
in accord with subsection 6b.
d. Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access
to the Corresponding Source in the same way through the same
place at no further charge. You need not require recipients
to copy the Corresponding Source along with the object code.
If the place to copy the object code is a network server, the
Corresponding Source may be on a different server (operated
by you or a third party) that supports equivalent copying
facilities, provided you maintain clear directions next to
the object code saying where to find the Corresponding Source.
Regardless of what server hosts the Corresponding Source, you
remain obligated to ensure that it is available for as long
as needed to satisfy these requirements.
e. Convey the object code using peer-to-peer transmission,
provided you inform other peers where the object code and
Corresponding Source of the work are being offered to the
general public at no charge under subsection 6d.
A separable portion of the object code, whose source code is
excluded from the Corresponding Source as a System Library, need
not be included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means
any tangible personal property which is normally used for personal,
family, or household purposes, or (2) anything designed or sold for
incorporation into a dwelling. In determining whether a product
is a consumer product, doubtful cases shall be resolved in favor of
coverage. For a particular product received by a particular user,
"normally used" refers to a typical or common use of that class of
product, regardless of the status of the particular user or of the
way in which the particular user actually uses, or expects or is
expected to use, the product. A product is a consumer product
regardless of whether the product has substantial commercial,
industrial or non-consumer uses, unless such uses represent the
only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to
install and execute modified versions of a covered work in that
User Product from a modified version of its Corresponding Source.
The information must suffice to ensure that the continued
functioning of the modified object code is in no case prevented or
interfered with solely because modification has been made.
If you convey an object code work under this section in, or with,
or specifically for use in, a User Product, and the conveying
occurs as part of a transaction in which the right of possession
and use of the User Product is transferred to the recipient in
perpetuity or for a fixed term (regardless of how the transaction
is characterized), the Corresponding Source conveyed under this
section must be accompanied by the Installation Information. But
this requirement does not apply if neither you nor any third party
retains the ability to install modified object code on the User
Product (for example, the work has been installed in ROM).
The requirement to provide Installation Information does not
include a requirement to continue to provide support service,
warranty, or updates for a work that has been modified or
installed by the recipient, or for the User Product in which it
has been modified or installed. Access to a network may be denied
when the modification itself materially and adversely affects the
operation of the network or violates the rules and protocols for
communication across the network.
Corresponding Source conveyed, and Installation Information
provided, in accord with this section must be in a format that is
publicly documented (and with an implementation available to the
public in source code form), and must require no special password
or key for unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of
this License by making exceptions from one or more of its
conditions. Additional permissions that are applicable to the
entire Program shall be treated as though they were included in
this License, to the extent that they are valid under applicable
law. If additional permissions apply only to part of the Program,
that part may be used separately under those permissions, but the
entire Program remains governed by this License without regard to
the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part
of it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material
you add to a covered work, you may (if authorized by the copyright
holders of that material) supplement the terms of this License
with terms:
a. Disclaiming warranty or limiting liability differently from
the terms of sections 15 and 16 of this License; or
b. Requiring preservation of specified reasonable legal notices
or author attributions in that material or in the Appropriate
Legal Notices displayed by works containing it; or
c. Prohibiting misrepresentation of the origin of that material,
or requiring that modified versions of such material be
marked in reasonable ways as different from the original
version; or
d. Limiting the use for publicity purposes of names of licensors
or authors of the material; or
e. Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f. Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified
versions of it) with contractual assumptions of liability to
the recipient, for any liability that these contractual
assumptions directly impose on those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as
you received it, or any part of it, contains a notice stating that
it is governed by this License along with a term that is a further
restriction, you may remove that term. If a license document
contains a further restriction but permits relicensing or
conveying under this License, you may add to a covered work
material governed by the terms of that license document, provided
that the further restriction does not survive such relicensing or
conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in
the form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights
under this License (including any patent licenses granted under
the third paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly
and finally terminates your license, and (b) permanently, if the
copyright holder fails to notify you of the violation by some
reasonable means prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from
that copyright holder, and you cure the violation prior to 30 days
after your receipt of the notice.
Termination of your rights under this section does not terminate
the licenses of parties who have received copies or rights from
you under this License. If your rights have been terminated and
not permanently reinstated, you do not qualify to receive new
licenses for the same material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer
transmission to receive a copy likewise does not require
acceptance. However, nothing other than this License grants you
permission to propagate or modify any covered work. These actions
infringe copyright if you do not accept this License. Therefore,
by modifying or propagating a covered work, you indicate your
acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not
responsible for enforcing compliance by third parties with this
License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a
covered work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or
could give under the previous paragraph, plus a right to
possession of the Corresponding Source of the work from the
predecessor in interest, if the predecessor has it or can get it
with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you
may not impose a license fee, royalty, or other charge for
exercise of rights granted under this License, and you may not
initiate litigation (including a cross-claim or counterclaim in a
lawsuit) alleging that any patent claim is infringed by making,
using, selling, offering for sale, or importing the Program or any
portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based.
The work thus licensed is called the contributor's "contributor
version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner,
permitted by this License, of making, using, or selling its
contributor version, but do not include claims that would be
infringed only as a consequence of further modification of the
contributor version. For purposes of this definition, "control"
includes the right to grant patent sublicenses in a manner
consistent with the requirements of this License.
Each contributor grants you a non-exclusive, worldwide,
royalty-free patent license under the contributor's essential
patent claims, to make, use, sell, offer for sale, import and
otherwise run, modify and propagate the contents of its
contributor version.
In the following three paragraphs, a "patent license" is any
express agreement or commitment, however denominated, not to
enforce a patent (such as an express permission to practice a
patent or covenant not to sue for patent infringement). To
"grant" such a patent license to a party means to make such an
agreement or commitment not to enforce a patent against the party.
If you convey a covered work, knowingly relying on a patent
license, and the Corresponding Source of the work is not available
for anyone to copy, free of charge and under the terms of this
License, through a publicly available network server or other
readily accessible means, then you must either (1) cause the
Corresponding Source to be so available, or (2) arrange to deprive
yourself of the benefit of the patent license for this particular
work, or (3) arrange, in a manner consistent with the requirements
of this License, to extend the patent license to downstream
recipients. "Knowingly relying" means you have actual knowledge
that, but for the patent license, your conveying the covered work
in a country, or your recipient's use of the covered work in a
country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate,
modify or convey a specific copy of the covered work, then the
patent license you grant is automatically extended to all
recipients of the covered work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that
are specifically granted under this License. You may not convey a
covered work if you are a party to an arrangement with a third
party that is in the business of distributing software, under
which you make payment to the third party based on the extent of
your activity of conveying the work, and under which the third
party grants, to any of the parties who would receive the covered
work from you, a discriminatory patent license (a) in connection
with copies of the covered work conveyed by you (or copies made
from those copies), or (b) primarily for and in connection with
specific products or compilations that contain the covered work,
unless you entered into that arrangement, or that patent license
was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If 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 convey a covered work so as to satisfy
simultaneously your obligations under this License and any other
pertinent obligations, then as a consequence you may not convey it
at all. For example, if you agree to terms that obligate you to
collect a royalty for further conveying from those to whom you
convey the Program, the only way you could satisfy both those
terms and this License would be to refrain entirely from conveying
the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a
single combined work, and to convey the resulting work. The terms
of this License will continue to apply to the part which is the
covered work, but the special requirements of the GNU Affero
General Public License, section 13, concerning interaction through
a network will apply to the combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new
versions of the GNU 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 that a certain numbered version of the GNU
General Public License "or any later version" applies to it, you
have the option of following the terms and conditions either of
that numbered version or of any later version published by the
Free Software Foundation. If the Program does not specify a
version number of the GNU General Public License, you may choose
any version ever published by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that
proxy's public statement of acceptance of a version permanently
authorizes you to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
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.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES
AND/OR CONVEYS 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.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely
approximates an absolute waiver of all civil liability in
connection with the Program, unless a warranty or assumption of
liability accompanies a copy of the Program in return for a fee.
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
state 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) YEAR 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 3 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, see `http://www.gnu.org/licenses/'.
Also add information on how to contact you by electronic and paper
mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
PROGRAM Copyright (C) YEAR NAME OF AUTHOR
This program 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, your
program's commands might be different; for a GUI interface, you would
use an "about box".
You should also get your employer (if you work as a programmer) or
school, if any, to sign a "copyright disclaimer" for the program, if
necessary. For more information on this, and how to apply and follow
the GNU GPL, see `http://www.gnu.org/licenses/'.
The GNU 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 Lesser General Public License instead of this License. But first,
please read `http://www.gnu.org/philosophy/why-not-lgpl.html'.
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 lookahead. 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 "lookahead") 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 same inputs. Even unambiguous grammars can be
"nondeterministic", meaning that no fixed lookahead 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, keyword `int',
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, 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 is 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.
* Menu:
* Simple GLR Parsers:: Using GLR parsers on unambiguous grammars.
* Merging GLR Parses:: Using GLR parsers to resolve ambiguities.
* GLR Semantic Actions:: Deferred semantic actions have special concerns.
* Compiler Requirements:: GLR parsers require a modern C compiler.
File: bison.info, Node: Simple GLR Parsers, Next: Merging GLR Parses, Up: GLR Parsers
1.5.1 Using GLR on Unambiguous Grammars
---------------------------------------
In the simplest cases, you can use the GLR algorithm to parse grammars
that are unambiguous, but fail to be LALR(1). Such grammars typically
require more than one symbol of lookahead, or (in rare cases) fall into
the category of grammars in which the LALR(1) algorithm throws away too
much information (they are in LR(1), but not LALR(1), *note Mystery
Conflicts::).
Consider a problem that arises in the declaration of enumerated and
subrange types in the programming language Pascal. Here are some
examples:
type subrange = lo .. hi;
type enum = (a, b, c);
The original language standard allows only numeric literals and
constant identifiers for the subrange bounds (`lo' and `hi'), but
Extended Pascal (ISO/IEC 10206) and many other Pascal implementations
allow arbitrary expressions there. This gives rise to the following
situation, containing a superfluous pair of parentheses:
type subrange = (a) .. b;
Compare this to the following declaration of an enumerated type with
only one value:
type enum = (a);
(These declarations are contrived, but they are syntactically valid,
and more-complicated cases can come up in practical programs.)
These two declarations look identical until the `..' token. With
normal LALR(1) one-token lookahead it is not possible to decide between
the two forms when the identifier `a' is parsed. It is, however,
desirable for a parser to decide this, since in the latter case `a'
must become a new identifier to represent the enumeration value, while
in the former case `a' must be evaluated with its current meaning,
which may be a constant or even a function call.
You could parse `(a)' as an "unspecified identifier in parentheses",
to be resolved later, but this typically requires substantial
contortions in both semantic actions and large parts of the grammar,
where the parentheses are nested in the recursive rules for expressions.
You might think of using the lexer to distinguish between the two
forms by returning different tokens for currently defined and undefined
identifiers. But if these declarations occur in a local scope, and `a'
is defined in an outer scope, then both forms are possible--either
locally redefining `a', or using the value of `a' from the outer scope.
So this approach cannot work.
A simple solution to this problem is to declare the parser to use
the GLR algorithm. When the GLR parser reaches the critical state, it
merely splits into two branches and pursues both syntax rules
simultaneously. Sooner or later, one of them runs into a parsing
error. If there is a `..' token before the next `;', the rule for
enumerated types fails since it cannot accept `..' anywhere; otherwise,
the subrange type rule fails since it requires a `..' token. So one of
the branches fails silently, and the other one continues normally,
performing all the intermediate actions that were postponed during the
split.
If the input is syntactically incorrect, both branches fail and the
parser reports a syntax error as usual.
The effect of all this is that the parser seems to "guess" the
correct branch to take, or in other words, it seems to use more
lookahead than the underlying LALR(1) algorithm actually allows for.
In this example, LALR(2) would suffice, but also some cases that are
not LALR(k) for any k can be handled this way.
In general, a GLR parser can take quadratic or cubic worst-case time,
and the current Bison parser even takes exponential time and space for
some grammars. In practice, this rarely happens, and for many grammars
it is possible to prove that it cannot happen. The present example
contains only one conflict between two rules, and the type-declaration
context containing the conflict cannot be nested. So the number of
branches that can exist at any time is limited by the constant 2, and
the parsing time is still linear.
Here is a Bison grammar corresponding to the example above. It
parses a vastly simplified form of Pascal type declarations.
%token TYPE DOTDOT ID
%left '+' '-'
%left '*' '/'
%%
type_decl : TYPE ID '=' type ';'
;
type : '(' id_list ')'
| expr DOTDOT expr
;
id_list : ID
| id_list ',' ID
;
expr : '(' expr ')'
| expr '+' expr
| expr '-' expr
| expr '*' expr
| expr '/' expr
| ID
;
When used as a normal LALR(1) grammar, Bison correctly complains
about one reduce/reduce conflict. In the conflicting situation the
parser chooses one of the alternatives, arbitrarily the one declared
first. Therefore the following correct input is not recognized:
type t = (a) .. b;
The parser can be turned into a GLR parser, while also telling Bison
to be silent about the one known reduce/reduce conflict, by adding
these two declarations to the Bison input file (before the first `%%'):
%glr-parser
%expect-rr 1
No change in the grammar itself is required. Now the parser recognizes
all valid declarations, according to the limited syntax above,
transparently. In fact, the user does not even notice when the parser
splits.
So here we have a case where we can use the benefits of GLR, almost
without disadvantages. Even in simple cases like this, however, there
are at least two potential problems to beware. First, always analyze
the conflicts reported by Bison to make sure that GLR splitting is only
done where it is intended. A GLR parser splitting inadvertently may
cause problems less obvious than an LALR parser statically choosing the
wrong alternative in a conflict. Second, consider interactions with
the lexer (*note Semantic Tokens::) with great care. Since a split
parser consumes tokens without performing any actions during the split,
the lexer cannot obtain information via parser actions. Some cases of
lexer interactions can be eliminated by using GLR to shift the
complications from the lexer to the parser. You must check the
remaining cases for correctness.
In our example, it would be safe for the lexer to return tokens
based on their current meanings in some symbol table, because no new
symbols are defined in the middle of a type declaration. Though it is
possible for a parser to define the enumeration constants as they are
parsed, before the type declaration is completed, it actually makes no
difference since they cannot be used within the same enumerated type
declaration.
File: bison.info, Node: Merging GLR Parses, Next: GLR Semantic Actions, Prev: Simple GLR Parsers, Up: GLR Parsers
1.5.2 Using GLR to Resolve Ambiguities
--------------------------------------
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. Since this is a GLR parser, it therefore splits the
problem into two parses, one for each choice of resolving the
reduce/reduce conflict. Unlike the example from the previous section
(*note Simple GLR Parsers::), however, neither of these parses "dies,"
because the grammar as it stands is ambiguous. One of the parsers
eventually reduces `stmt : expr ';'' and the other reduces `stmt :
decl', after which both parsers are in an identical state: they've seen
`prog stmt' and have the same unprocessed input remaining. We say that
these parses have "merged."
At this point, the GLR parser requires a specification in the
grammar of how to choose between the competing parses. In the example
above, the two `%dprec' declarations specify that Bison is to give
precedence to the parse that interprets the example as a `decl', which
implies that `x' is a declarator. The parser therefore prints
"x" y z + T
The `%dprec' declarations only come into play when more than one
parse survives. Consider a different input string for this parser:
T (x) + y;
This is another example of using GLR to parse an unambiguous construct,
as shown in the previous section (*note Simple GLR Parsers::). 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. Again, 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, you 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 parses the first example
as both an `expr' and a `decl', and prints
"x" y z + T x T y z + =
Bison requires that all of the productions that participate in any
particular merge have identical `%merge' clauses. Otherwise, the
ambiguity would be unresolvable, and the parser will report an error
during any parse that results in the offending merge.
File: bison.info, Node: GLR Semantic Actions, Next: Compiler Requirements, Prev: Merging GLR Parses, Up: GLR Parsers
1.5.3 GLR Semantic Actions
--------------------------
By definition, a deferred semantic action is not performed at the same
time as the associated reduction. This raises caveats for several
Bison features you might use in a semantic action in a GLR parser.
In any semantic action, you can examine `yychar' to determine the
type of the lookahead token present at the time of the associated
reduction. After checking that `yychar' is not set to `YYEMPTY' or
`YYEOF', you can then examine `yylval' and `yylloc' to determine the
lookahead token's semantic value and location, if any. In a
nondeferred semantic action, you can also modify any of these variables
to influence syntax analysis. *Note Lookahead Tokens: Lookahead.
In a deferred semantic action, it's too late to influence syntax
analysis. In this case, `yychar', `yylval', and `yylloc' are set to
shallow copies of the values they had at the time of the associated
reduction. For this reason alone, modifying them is dangerous.
Moreover, the result of modifying them is undefined and subject to
change with future versions of Bison. For example, if a semantic
action might be deferred, you should never write it to invoke
`yyclearin' (*note Action Features::) or to attempt to free memory
referenced by `yylval'.
Another Bison feature requiring special consideration is `YYERROR'
(*note Action Features::), which you can invoke in a semantic action to
initiate error recovery. During deterministic GLR operation, the
effect of `YYERROR' is the same as its effect in an LALR(1) parser. In
a deferred semantic action, its effect is undefined.
Also, see *note Default Action for Locations: Location Default
Action, which describes a special usage of `YYLLOC_DEFAULT' in GLR
parsers.
File: bison.info, Node: Compiler Requirements, Prev: GLR Semantic Actions, Up: GLR Parsers
1.5.4 Considerations when Compiling GLR Parsers
-----------------------------------------------
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. Also, you should
avoid using the C identifiers `malloc' and `free' for anything other
than their usual meanings.
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. `' is included if message
translation is in use (*note Internationalization::). 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 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:
* Rpcalc Declarations:: Prologue (declarations) for rpcalc.
* Rpcalc Rules:: Grammar Rules for rpcalc, with explanation.
* Rpcalc Lexer:: The lexical analyzer.
* Rpcalc Main:: The controlling function.
* Rpcalc Error:: The error reporting function.
* Rpcalc Generate:: Running Bison on the grammar file.
* Rpcalc Compile:: Run the C compiler on the output code.
File: bison.info, Node: Rpcalc Declarations, 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 Declarations, 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 vertical bar `|' 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
Declarations.)
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 Generate, 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 Generate, 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.y
In this example the file was called `rpcalc.y' (for "Reverse Polish
CALCulator"). Bison produces a file named `FILE.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 Generate, 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:
* Ltcalc Declarations:: Bison and C declarations for ltcalc.
* Ltcalc Rules:: Grammar rules for ltcalc, with explanations.
* Ltcalc Lexer:: The lexical analyzer.
File: bison.info, Node: Ltcalc Declarations, 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'. By conventions, and in
accordance with the GNU Coding Standards and common practice, the line
and column count both start at 1.
File: bison.info, Node: Ltcalc Rules, Next: Ltcalc Lexer, Prev: Ltcalc Declarations, 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 %prec 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 nonnumeric 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:
* Mfcalc Declarations:: Bison declarations for multi-function calculator.
* Mfcalc Rules:: Grammar rules for the calculator.
* Mfcalc Symbol Table:: Symbol table management subroutines.
File: bison.info, Node: Mfcalc Declarations, 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 Symbol Table, Prev: Mfcalc Declarations, 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 Symbol Table, 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 *, int);
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 letter 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.
* Prologue Alternatives:: Syntax and usage of alternatives to 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: Prologue Alternatives, 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.
The PROLOGUE section is terminated by the first occurrence of `%}'
that is outside a comment, a string literal, or a character constant.
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.
%{
#define _GNU_SOURCE
#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)
%}
...
When in doubt, it is usually safer to put prologue code before all
Bison declarations, rather than after. For example, any definitions of
feature test macros like `_GNU_SOURCE' or `_POSIX_C_SOURCE' should
appear before all Bison declarations, as feature test macros can affect
the behavior of Bison-generated `#include' directives.
File: bison.info, Node: Prologue Alternatives, Next: Bison Declarations, Prev: Prologue, Up: Grammar Outline
3.1.2 Prologue Alternatives
---------------------------
The functionality of PROLOGUE sections can often be subtle and
inflexible. As an alternative, Bison provides a %code directive with
an explicit qualifier field, which identifies the purpose of the code
and thus the location(s) where Bison should generate it. For C/C++,
the qualifier can be omitted for the default location, or it can be one
of `requires', `provides', `top'. *Note %code: Decl Summary.
Look again at the example of the previous section:
%{
#define _GNU_SOURCE
#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)
%}
...
Notice that there are two PROLOGUE sections here, but there's a subtle
distinction between their functionality. For example, if you decide to
override Bison's default definition for `YYLTYPE', in which PROLOGUE
section should you write your new definition? You should write it in
the first since Bison will insert that code into the parser source code
file _before_ the default `YYLTYPE' definition. In which PROLOGUE
section should you prototype an internal function, `trace_token', that
accepts `YYLTYPE' and `yytokentype' as arguments? You should prototype
it in the second since Bison will insert that code _after_ the
`YYLTYPE' and `yytokentype' definitions.
This distinction in functionality between the two PROLOGUE sections
is established by the appearance of the `%union' between them. This
behavior raises a few questions. First, why should the position of a
`%union' affect definitions related to `YYLTYPE' and `yytokentype'?
Second, what if there is no `%union'? In that case, the second kind of
PROLOGUE section is not available. This behavior is not intuitive.
To avoid this subtle `%union' dependency, rewrite the example using a
`%code top' and an unqualified `%code'. Let's go ahead and add the new
`YYLTYPE' definition and the `trace_token' prototype at the same time:
%code top {
#define _GNU_SOURCE
#include
/* WARNING: The following code really belongs
* in a `%code requires'; see below. */
#include "ptypes.h"
#define YYLTYPE YYLTYPE
typedef struct YYLTYPE
{
int first_line;
int first_column;
int last_line;
int last_column;
char *filename;
} YYLTYPE;
}
%union {
long int n;
tree t; /* `tree' is defined in `ptypes.h'. */
}
%code {
static void print_token_value (FILE *, int, YYSTYPE);
#define YYPRINT(F, N, L) print_token_value (F, N, L)
static void trace_token (enum yytokentype token, YYLTYPE loc);
}
...
In this way, `%code top' and the unqualified `%code' achieve the same
functionality as the two kinds of PROLOGUE sections, but it's always
explicit which kind you intend. Moreover, both kinds are always
available even in the absence of `%union'.
The `%code top' block above logically contains two parts. The first
two lines before the warning need to appear near the top of the parser
source code file. The first line after the warning is required by
`YYSTYPE' and thus also needs to appear in the parser source code file.
However, if you've instructed Bison to generate a parser header file
(*note %defines: Decl Summary.), you probably want that line to appear
before the `YYSTYPE' definition in that header file as well. The
`YYLTYPE' definition should also appear in the parser header file to
override the default `YYLTYPE' definition there.
In other words, in the `%code top' block above, all but the first two
lines are dependency code required by the `YYSTYPE' and `YYLTYPE'
definitions. Thus, they belong in one or more `%code requires':
%code top {
#define _GNU_SOURCE
#include
}
%code requires {
#include "ptypes.h"
}
%union {
long int n;
tree t; /* `tree' is defined in `ptypes.h'. */
}
%code requires {
#define YYLTYPE YYLTYPE
typedef struct YYLTYPE
{
int first_line;
int first_column;
int last_line;
int last_column;
char *filename;
} YYLTYPE;
}
%code {
static void print_token_value (FILE *, int, YYSTYPE);
#define YYPRINT(F, N, L) print_token_value (F, N, L)
static void trace_token (enum yytokentype token, YYLTYPE loc);
}
...
Now Bison will insert `#include "ptypes.h"' and the new `YYLTYPE'
definition before the Bison-generated `YYSTYPE' and `YYLTYPE'
definitions in both the parser source code file and the parser header
file. (By the same reasoning, `%code requires' would also be the
appropriate place to write your own definition for `YYSTYPE'.)
When you are writing dependency code for `YYSTYPE' and `YYLTYPE', you
should prefer `%code requires' over `%code top' regardless of whether
you instruct Bison to generate a parser header file. When you are
writing code that you need Bison to insert only into the parser source
code file and that has no special need to appear at the top of that
file, you should prefer the unqualified `%code' over `%code top'.
These practices will make the purpose of each block of your code
explicit to Bison and to other developers reading your grammar file.
Following these practices, we expect the unqualified `%code' and `%code
requires' to be the most important of the four PROLOGUE alternatives.
At some point while developing your parser, you might decide to
provide `trace_token' to modules that are external to your parser.
Thus, you might wish for Bison to insert the prototype into both the
parser header file and the parser source code file. Since this
function is not a dependency required by `YYSTYPE' or `YYLTYPE', it
doesn't make sense to move its prototype to a `%code requires'. More
importantly, since it depends upon `YYLTYPE' and `yytokentype', `%code
requires' is not sufficient. Instead, move its prototype from the
unqualified `%code' to a `%code provides':
%code top {
#define _GNU_SOURCE
#include
}
%code requires {
#include "ptypes.h"
}
%union {
long int n;
tree t; /* `tree' is defined in `ptypes.h'. */
}
%code requires {
#define YYLTYPE YYLTYPE
typedef struct YYLTYPE
{
int first_line;
int first_column;
int last_line;
int last_column;
char *filename;
} YYLTYPE;
}
%code provides {
void trace_token (enum yytokentype token, YYLTYPE loc);
}
%code {
static void print_token_value (FILE *, int, YYSTYPE);
#define YYPRINT(F, N, L) print_token_value (F, N, L)
}
...
Bison will insert the `trace_token' prototype into both the parser
header file and the parser source code file after the definitions for
`yytokentype', `YYLTYPE', and `YYSTYPE'.
The above examples are careful to write directives in an order that
reflects the layout of the generated parser source code and header
files: `%code top', `%code requires', `%code provides', and then
`%code'. While your grammar files may generally be easier to read if
you also follow this order, Bison does not require it. Instead, Bison
lets you choose an organization that makes sense to you.
You may declare any of these directives multiple times in the
grammar file. In that case, Bison concatenates the contained code in
declaration order. This is the only way in which the position of one
of these directives within the grammar file affects its functionality.
The result of the previous two properties is greater flexibility in
how you may organize your grammar file. For example, you may organize
semantic-type-related directives by semantic type:
%code requires { #include "type1.h" }
%union { type1 field1; }
%destructor { type1_free ($$); }
%printer { type1_print ($$); }
%code requires { #include "type2.h" }
%union { type2 field2; }
%destructor { type2_free ($$); }
%printer { type2_print ($$); }
You could even place each of the above directive groups in the rules
section of the grammar file next to the set of rules that uses the
associated semantic type. (In the rules section, you must terminate
each of those directives with a semicolon.) And you don't have to
worry that some directive (like a `%union') in the definitions section
is going to adversely affect their functionality in some
counter-intuitive manner just because it comes first. Such an
organization is not possible using PROLOGUE sections.
This section has been concerned with explaining the advantages of
the four PROLOGUE alternatives over the original Yacc PROLOGUE.
However, in most cases when using these directives, you shouldn't need
to think about all the low-level ordering issues discussed here.
Instead, you should simply use these directives to label each block of
your code according to its purpose and let Bison handle the ordering.
`%code' is the most generic label. Move code to `%code requires',
`%code provides', or `%code top' as needed.
File: bison.info, Node: Bison Declarations, Next: Grammar Rules, Prev: Prologue Alternatives, Up: Grammar Outline
3.1.3 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.4 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.5 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 in the 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 nonnull 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}
This is an example of "braced code", that is, C code surrounded by
braces, much like a compound statement in C. Braced code can contain
any sequence of C tokens, so long as its braces are balanced. Bison
does not check the braced code for correctness directly; it merely
copies the code to the output file, where the C compiler can check it.
Within braced code, the balanced-brace count is not affected by
braces within comments, string literals, or character constants, but it
is affected by the C digraphs `<%' and `%>' that represent braces. At
the top level braced code must be terminated by `}' and not by a
digraph. Bison does not look for trigraphs, so if braced code uses
trigraphs you should ensure that they do not affect the nesting of
braces or the boundaries of comments, string literals, or character
constants.
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 normally uses the type `int' for semantic values if your
program uses the same data type for all language constructs. To
specify some other type, define `YYSTYPE' as a macro, like this:
#define YYSTYPE double
`YYSTYPE''s replacement list should be a type name that does not
contain parentheses or square brackets. 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, either by
using the `%union' Bison declaration (*note The Collection of
Value Types: Union Decl.), or by using a `typedef' or a `#define'
to define `YYSTYPE' to be a union type whose member names are the
type tags.
* 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 braced code containing C statements, and 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'.
It is also possible to access the semantic value of the lookahead
token, if any, from a semantic action. This semantic value is stored
in `yylval'. *Note Special Features for Use in Actions: Action
Features.
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.
In the above example, if the parser initiates error recovery (*note
Error Recovery::) while parsing the tokens in the embedded statement
`stmt', it might discard the previous semantic context `$5'
without restoring it. Thus, `$5' needs a destructor (*note
Freeing Discarded Symbols: Destructor Decl.). However, Bison currently
provides no means to declare a destructor specific to a particular
mid-rule action's semantic value.
One solution is to bury the mid-rule action inside a nonterminal
symbol and to declare a destructor for that symbol:
%type let
%destructor { pop_context ($$); } let
%%
stmt: let stmt
{ $$ = $2;
pop_context ($1); }
;
let: LET '(' var ')'
{ $$ = push_context ();
declare_variable ($3); }
;
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.
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 "lookahead" token at this time, since the parser is still deciding
what to do about it. *Note Lookahead Tokens: Lookahead.)
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.
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.
You can specify the type of locations by defining a macro called
`YYLTYPE', just as you can specify the semantic value type by defining
a `YYSTYPE' macro (*note Value Type::). 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;
When `YYLTYPE' is not defined, at the beginning of the parsing, Bison
initializes all these fields to 1 for `yylloc'. To initialize `yylloc'
with a custom location type (or to chose a different initialization),
use the `%initial-action' directive. *Note Performing Actions before
Parsing: Initial Action Decl.
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);
}
}
It is also possible to access the location of the lookahead token,
if any, from a semantic action. This location is stored in `yylloc'.
*Note Special Features for Use in Actions: Action Features.
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. Before
reporting an unresolvable syntactic ambiguity, a GLR parser invokes
`YYLLOC_DEFAULT' recursively to compute the location of that ambiguity.
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 identifies 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 a GLR parser reports
an ambiguity, which of multiple candidate right hand sides it passes to
`YYLLOC_DEFAULT' is undefined. When processing a syntax error, the
second parameter identifies 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:
# define YYLLOC_DEFAULT(Current, Rhs, N) \
do \
if (N) \
{ \
(Current).first_line = YYRHSLOC(Rhs, 1).first_line; \
(Current).first_column = YYRHSLOC(Rhs, 1).first_column; \
(Current).last_line = YYRHSLOC(Rhs, N).last_line; \
(Current).last_column = YYRHSLOC(Rhs, N).last_column; \
} \
else \
{ \
(Current).first_line = (Current).last_line = \
YYRHSLOC(Rhs, 0).last_line; \
(Current).first_column = (Current).last_column = \
YYRHSLOC(Rhs, 0).last_column; \
} \
while (0)
where `YYRHSLOC (rhs, k)' is the location of the Kth symbol in RHS
when K is positive, and the location of the symbol just before the
reduction when K and N are both zero.
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 within the
right hand side range from 1 to N. When N is zero, only 0 is a
valid index, and it refers to the symbol just before the reduction.
During error processing N is always positive.
* 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:
* Require Decl:: Requiring a Bison version.
* 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.
* Initial Action Decl:: Code run before parsing starts.
* 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.
* Push Decl:: Requesting a push parser.
* Decl Summary:: Table of all Bison declarations.
File: bison.info, Node: Require Decl, Next: Token Decl, Up: Declarations
3.7.1 Require a Version of Bison
--------------------------------
You may require the minimum version of Bison to process the grammar. If
the requirement is not met, `bison' exits with an error (exit status
63).
%require "VERSION"
File: bison.info, Node: Token Decl, Next: Precedence Decl, Prev: Require Decl, Up: Declarations
3.7.2 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 nonnegative 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::). Syntax error
messages passed to `yyerror' from the parser will reference the literal
string instead of the token name.
The token numbered as 0 corresponds to end of file; the following
line allows for nicer error messages referring to "end of file" instead
of "$end":
%token END 0 "end of file"
File: bison.info, Node: Precedence Decl, Next: Union Decl, Prev: Token Decl, Up: Declarations
3.7.3 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 nearly 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.
For backward compatibility, there is a confusing difference between
the argument lists of `%token' and precedence declarations. Only a
`%token' can associate a literal string with a token type name. A
precedence declaration always interprets a literal string as a
reference to a separate token. For example:
%left OR "<=" // Does not declare an alias.
%left OR 134 "<=" 135 // Declares 134 for OR and 135 for "<=".
File: bison.info, Node: Union Decl, Next: Type Decl, Prev: Precedence Decl, Up: Declarations
3.7.4 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
braced code 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'.
As another extension to POSIX, you may specify multiple `%union'
declarations; their contents are concatenated. However, only the first
`%union' declaration can specify a tag.
Note that, unlike making a `union' declaration in C, you need not
write a semicolon after the closing brace.
Instead of `%union', you can define and use your own union type
`YYSTYPE' if your grammar contains at least one `' tag. For
example, you can put the following into a header file `parser.h':
union YYSTYPE {
double val;
symrec *tptr;
};
typedef union YYSTYPE YYSTYPE;
and then your grammar can use the following instead of `%union':
%{
#include "parser.h"
%}
%type expr
%token ID
File: bison.info, Node: Type Decl, Next: Initial Action Decl, Prev: Union Decl, Up: Declarations
3.7.5 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: Initial Action Decl, Next: Destructor Decl, Prev: Type Decl, Up: Declarations
3.7.6 Performing Actions before Parsing
---------------------------------------
Sometimes your parser needs to perform some initializations before
parsing. The `%initial-action' directive allows for such arbitrary
code.
-- Directive: %initial-action { CODE }
Declare that the braced CODE must be invoked before parsing each
time `yyparse' is called. The CODE may use `$$' and `@$' --
initial value and location of the lookahead -- and the
`%parse-param'.
For instance, if your locations use a file name, you may use
%parse-param { char const *file_name };
%initial-action
{
@$.initialize (file_name);
};
File: bison.info, Node: Destructor Decl, Next: Expect Decl, Prev: Initial Action Decl, Up: Declarations
3.7.7 Freeing Discarded Symbols
-------------------------------
During error recovery (*note Error Recovery::), symbols already pushed
on the stack and tokens coming from the rest of the file are discarded
until the parser falls on its feet. If the parser runs out of memory,
or if it returns via `YYABORT' or `YYACCEPT', all the symbols on the
stack must be discarded. Even if the parser succeeds, it must discard
the start symbol.
When discarded symbols convey heap based information, this memory is
lost. While this behavior can be tolerable for batch parsers, such as
in traditional compilers, it is unacceptable for programs like shells or
protocol implementations that may parse and execute indefinitely.
The `%destructor' directive defines code that is called when a
symbol is automatically discarded.
-- Directive: %destructor { CODE } SYMBOLS
Invoke the braced CODE whenever the parser discards one of the
SYMBOLS. Within CODE, `$$' designates the semantic value
associated with the discarded symbol, and `@$' designates its
location. The additional parser parameters are also available
(*note The Parser Function `yyparse': Parser Function.).
When a symbol is listed among SYMBOLS, its `%destructor' is called
a per-symbol `%destructor'. You may also define a per-type
`%destructor' by listing a semantic type tag among SYMBOLS. In
that case, the parser will invoke this CODE whenever it discards
any grammar symbol that has that semantic type tag unless that
symbol has its own per-symbol `%destructor'.
Finally, you can define two different kinds of default
`%destructor's. (These default forms are experimental. More user
feedback will help to determine whether they should become
permanent features.) You can place each of `<*>' and `<>' in the
SYMBOLS list of exactly one `%destructor' declaration in your
grammar file. The parser will invoke the CODE associated with one
of these whenever it discards any user-defined grammar symbol that
has no per-symbol and no per-type `%destructor'. The parser uses
the CODE for `<*>' in the case of such a grammar symbol for which
you have formally declared a semantic type tag (`%type' counts as
such a declaration, but `$$' does not). The parser uses the
CODE for `<>' in the case of such a grammar symbol that has no
declared semantic type tag.
For example:
%union { char *string; }
%token STRING1
%token STRING2
%type string1
%type string2
%union { char character; }
%token CHR
%type chr
%token TAGLESS
%destructor { }
%destructor { free ($$); } <*>
%destructor { free ($$); printf ("%d", @$.first_line); } STRING1 string1
%destructor { printf ("Discarding tagless symbol.\n"); } <>
guarantees that, when the parser discards any user-defined symbol that
has a semantic type tag other than `', it passes its
semantic value to `free' by default. However, when the parser discards
a `STRING1' or a `string1', it also prints its line number to `stdout'.
It performs only the second `%destructor' in this case, so it invokes
`free' only once. Finally, the parser merely prints a message whenever
it discards any symbol, such as `TAGLESS', that has no semantic type
tag.
A Bison-generated parser invokes the default `%destructor's only for
user-defined as opposed to Bison-defined symbols. For example, the
parser will not invoke either kind of default `%destructor' for the
special Bison-defined symbols `$accept', `$undefined', or `$end' (*note
Bison Symbols: Table of Symbols.), none of which you can reference in
your grammar. It also will not invoke either for the `error' token
(*note error: Table of Symbols.), which is always defined by Bison
regardless of whether you reference it in your grammar. However, it
may invoke one of them for the end token (token 0) if you redefine it
from `$end' to, for example, `END':
%token END 0
Finally, Bison will never invoke a `%destructor' for an unreferenced
mid-rule semantic value (*note Actions in Mid-Rule: Mid-Rule Actions.).
That is, Bison does not consider a mid-rule to have a semantic value if
you do not reference `$$' in the mid-rule's action or `$N' (where N is
the RHS symbol position of the mid-rule) in any later action in that
rule. However, if you do reference either, the Bison-generated parser
will invoke the `<>' `%destructor' whenever it discards the mid-rule
symbol.
"Discarded symbols" are the following:
* stacked symbols popped during the first phase of error recovery,
* incoming terminals during the second phase of error recovery,
* the current lookahead and the entire stack (except the current
right-hand side symbols) when the parser returns immediately, and
* the start symbol, when the parser succeeds.
The parser can "return immediately" because of an explicit call to
`YYABORT' or `YYACCEPT', or failed error recovery, or memory exhaustion.
Right-hand side symbols of a rule that explicitly triggers a syntax
error via `YYERROR' are not discarded automatically. As a rule of
thumb, destructors are invoked only when user actions cannot manage the
memory.
File: bison.info, Node: Expect Decl, Next: Start Decl, Prev: Destructor Decl, Up: Declarations
3.7.8 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 N
shift/reduce conflicts and no reduce/reduce conflicts. Bison reports
an error if the number of shift/reduce conflicts differs from N, 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 kinds of conflicts 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. With GLR parsers, add an `%expect-rr'
declaration as well.
Now Bison will warn you if you introduce an unexpected conflict, but
will keep silent otherwise.
File: bison.info, Node: Start Decl, Next: Pure Decl, Prev: Expect Decl, Up: Declarations
3.7.9 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: Push Decl, Prev: Start Decl, Up: Declarations
3.7.10 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 nonreentrant program may not be safe to call
from a signal handler. In systems with multiple threads of control, a
nonreentrant 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 `%define api.pure' says that you want the parser to be
reentrant. It looks like this:
%define api.pure
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' becomes local in `yyparse' in pull mode but it
becomes a member of yypstate in push mode. (*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: Push Decl, Next: Decl Summary, Prev: Pure Decl, Up: Declarations
3.7.11 A Push Parser
--------------------
(The current push parsing interface is experimental and may evolve.
More user feedback will help to stabilize it.)
A pull parser is called once and it takes control until all its input
is completely parsed. A push parser, on the other hand, is called each
time a new token is made available.
A push parser is typically useful when the parser is part of a main
event loop in the client's application. This is typically a
requirement of a GUI, when the main event loop needs to be triggered
within a certain time period.
Normally, Bison generates a pull parser. The following Bison
declaration says that you want the parser to be a push parser (*note
%define api.push_pull: Decl Summary.):
%define api.push_pull "push"
In almost all cases, you want to ensure that your push parser is also
a pure parser (*note A Pure (Reentrant) Parser: Pure Decl.). The only
time you should create an impure push parser is to have backwards
compatibility with the impure Yacc pull mode interface. Unless you know
what you are doing, your declarations should look like this:
%define api.pure
%define api.push_pull "push"
There is a major notable functional difference between the pure push
parser and the impure push parser. It is acceptable for a pure push
parser to have many parser instances, of the same type of parser, in
memory at the same time. An impure push parser should only use one
parser at a time.
When a push parser is selected, Bison will generate some new symbols
in the generated parser. `yypstate' is a structure that the generated
parser uses to store the parser's state. `yypstate_new' is the
function that will create a new parser instance. `yypstate_delete'
will free the resources associated with the corresponding parser
instance. Finally, `yypush_parse' is the function that should be
called whenever a token is available to provide the parser. A trivial
example of using a pure push parser would look like this:
int status;
yypstate *ps = yypstate_new ();
do {
status = yypush_parse (ps, yylex (), NULL);
} while (status == YYPUSH_MORE);
yypstate_delete (ps);
If the user decided to use an impure push parser, a few things about
the generated parser will change. The `yychar' variable becomes a
global variable instead of a variable in the `yypush_parse' function.
For this reason, the signature of the `yypush_parse' function is
changed to remove the token as a parameter. A nonreentrant push parser
example would thus look like this:
extern int yychar;
int status;
yypstate *ps = yypstate_new ();
do {
yychar = yylex ();
status = yypush_parse (ps);
} while (status == YYPUSH_MORE);
yypstate_delete (ps);
That's it. Notice the next token is put into the global variable
`yychar' for use by the next invocation of the `yypush_parse' function.
Bison also supports both the push parser interface along with the
pull parser interface in the same generated parser. In order to get
this functionality, you should replace the `%define api.push_pull
"push"' declaration with the `%define api.push_pull "both"'
declaration. Doing this will create all of the symbols mentioned
earlier along with the two extra symbols, `yyparse' and `yypull_parse'.
`yyparse' can be used exactly as it normally would be used. However,
the user should note that it is implemented in the generated parser by
calling `yypull_parse'. This makes the `yyparse' function that is
generated with the `%define api.push_pull "both"' declaration slower
than the normal `yyparse' function. If the user calls the
`yypull_parse' function it will parse the rest of the input stream. It
is possible to `yypush_parse' tokens to select a subgrammar and then
`yypull_parse' the rest of the input stream. If you would like to
switch back and forth between between parsing styles, you would have to
write your own `yypull_parse' function that knows when to quit looking
for input. An example of using the `yypull_parse' function would look
like this:
yypstate *ps = yypstate_new ();
yypull_parse (ps); /* Will call the lexer */
yypstate_delete (ps);
Adding the `%define api.pure' declaration does exactly the same
thing to the generated parser with `%define api.push_pull "both"' as it
did for `%define api.push_pull "push"'.
File: bison.info, Node: Decl Summary, Prev: Push Decl, Up: Declarations
3.7.12 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: %code {CODE}
This is the unqualified form of the `%code' directive. It inserts
CODE verbatim at a language-dependent default location in the
output(1).
For C/C++, the default location is the parser source code file
after the usual contents of the parser header file. Thus, `%code'
replaces the traditional Yacc prologue, `%{CODE%}', for most
purposes. For a detailed discussion, see *note Prologue
Alternatives::.
For Java, the default location is inside the parser class.
-- Directive: %code QUALIFIER {CODE}
This is the qualified form of the `%code' directive. If you need
to specify location-sensitive verbatim CODE that does not belong
at the default location selected by the unqualified `%code' form,
use this form instead.
QUALIFIER identifies the purpose of CODE and thus the location(s)
where Bison should generate it. Not all values of QUALIFIER are
available for all target languages:
* requires
* Language(s): C, C++
* Purpose: This is the best place to write dependency code
required for `YYSTYPE' and `YYLTYPE'. In other words,
it's the best place to define types referenced in
`%union' directives, and it's the best place to override
Bison's default `YYSTYPE' and `YYLTYPE' definitions.
* Location(s): The parser header file and the parser
source code file before the Bison-generated `YYSTYPE'
and `YYLTYPE' definitions.
* provides
* Language(s): C, C++
* Purpose: This is the best place to write additional
definitions and declarations that should be provided to
other modules.
* Location(s): The parser header file and the parser
source code file after the Bison-generated `YYSTYPE',
`YYLTYPE', and token definitions.
* top
* Language(s): C, C++
* Purpose: The unqualified `%code' or `%code requires'
should usually be more appropriate than `%code top'.
However, occasionally it is necessary to insert code
much nearer the top of the parser source code file. For
example:
%code top {
#define _GNU_SOURCE
#include
}
* Location(s): Near the top of the parser source code file.
* imports
* Language(s): Java
* Purpose: This is the best place to write Java import
directives.
* Location(s): The parser Java file after any Java package
directive and before any class definitions.
For a detailed discussion of how to use `%code' in place of the
traditional Yacc prologue for C/C++, see *note Prologue
Alternatives::.
-- 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: %define VARIABLE
-- Directive: %define VARIABLE "VALUE"
Define a variable to adjust Bison's behavior. The possible
choices for VARIABLE, as well as their meanings, depend on the
selected target language and/or the parser skeleton (*note
%language: Decl Summary, *note %skeleton: Decl Summary.).
Bison will warn if a VARIABLE is defined multiple times.
Omitting `"VALUE"' is always equivalent to specifying it as `""'.
Some VARIABLEs may be used as Booleans. In this case, Bison will
complain if the variable definition does not meet one of the
following four conditions:
1. `"VALUE"' is `"true"'
2. `"VALUE"' is omitted (or is `""'). This is equivalent to
`"true"'.
3. `"VALUE"' is `"false"'.
4. VARIABLE is never defined. In this case, Bison selects a
default value, which may depend on the selected target
language and/or parser skeleton.
Some of the accepted VARIABLEs are:
* api.pure
* Language(s): C
* Purpose: Request a pure (reentrant) parser program.
*Note A Pure (Reentrant) Parser: Pure Decl.
* Accepted Values: Boolean
* Default Value: `"false"'
* api.push_pull
* Language(s): C (LALR(1) only)
* Purpose: Requests a pull parser, a push parser, or both.
*Note A Push Parser: Push Decl. (The current push
parsing interface is experimental and may evolve. More
user feedback will help to stabilize it.)
* Accepted Values: `"pull"', `"push"', `"both"'
* Default Value: `"pull"'
* lr.keep_unreachable_states
* Language(s): all
* Purpose: Requests that Bison allow unreachable parser
states to remain in the parser tables. Bison considers
a state to be unreachable if there exists no sequence of
transitions from the start state to that state. A state
can become unreachable during conflict resolution if
Bison disables a shift action leading to it from a
predecessor state. Keeping unreachable states is
sometimes useful for analysis purposes, but they are
useless in the generated parser.
* Accepted Values: Boolean
* Default Value: `"false"'
* Caveats:
* Unreachable states may contain conflicts and may
use rules not used in any other state. Thus,
keeping unreachable states may induce warnings that
are irrelevant to your parser's behavior, and it
may eliminate warnings that are relevant. Of
course, the change in warnings may actually be
relevant to a parser table analysis that wants to
keep unreachable states, so this behavior will
likely remain in future Bison releases.
* While Bison is able to remove unreachable states,
it is not guaranteed to remove other kinds of
useless states. Specifically, when Bison disables
reduce actions during conflict resolution, some
goto actions may become useless, and thus some
additional states may become useless. If Bison
were to compute which goto actions were useless and
then disable those actions, it could identify such
states as unreachable and then remove those states.
However, Bison does not compute which goto actions
are useless.
* namespace
* Languages(s): C++
* Purpose: Specifies the namespace for the parser class.
For example, if you specify:
%define namespace "foo::bar"
Bison uses `foo::bar' verbatim in references such as:
foo::bar::parser::semantic_type
However, to open a namespace, Bison removes any leading
`::' and then splits on any remaining occurrences:
namespace foo { namespace bar {
class position;
class location;
} }
* Accepted Values: Any absolute or relative C++ namespace
reference without a trailing `"::"'. For example,
`"foo"' or `"::foo::bar"'.
* Default Value: The value specified by `%name-prefix',
which defaults to `yy'. This usage of `%name-prefix' is
for backward compatibility and can be confusing since
`%name-prefix' also specifies the textual prefix for the
lexical analyzer function. Thus, if you specify
`%name-prefix', it is best to also specify `%define
namespace' so that `%name-prefix' _only_ affects the
lexical analyzer function. For example, if you specify:
%define namespace "foo"
%name-prefix "bar::"
The parser namespace is `foo' and `yylex' is referenced
as `bar::lex'.
-- Directive: %defines
Write a header file containing macro definitions for the token type
names defined in the grammar as well as a few other declarations.
If the parser output file is named `NAME.c' then this file is
named `NAME.h'.
For C parsers, the output header declares `YYSTYPE' unless
`YYSTYPE' is already defined as a macro or you have used a
`' tag without using `%union'. Therefore, if you are using
a `%union' (*note More Than One Value Type: Multiple Types.) with
components that require other definitions, or if you have defined
a `YYSTYPE' macro or type definition (*note Data Types of Semantic
Values: Value Type.), you need to arrange for these definitions to
be propagated to all modules, e.g., by putting them in a
prerequisite header that is included both by your parser and by
any other module that needs `YYSTYPE'.
Unless your parser is pure, the output header declares `yylval' as
an external variable. *Note A Pure (Reentrant) Parser: Pure Decl.
If you have also used locations, the output header declares
`YYLTYPE' and `yylloc' using a protocol similar to that of the
`YYSTYPE' macro and `yylval'. *Note Tracking Locations: Locations.
This output file is normally essential if you wish to put the
definition of `yylex' in a separate source file, because `yylex'
typically needs to be able to refer to the above-mentioned
declarations and to the token type codes. *Note Semantic Values
of Tokens: Token Values.
If you have declared `%code requires' or `%code provides', the
output header also contains their code. *Note %code: Decl Summary.
-- Directive: %defines DEFINES-FILE
Same as above, but save in the file DEFINES-FILE.
-- Directive: %destructor
Specify 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: %language "LANGUAGE"
Specify the programming language for the generated parser.
Currently supported languages include C, C++, and Java. LANGUAGE
is case-insensitive.
This directive is experimental and its effect may be modified in
future releases.
-- 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
in C parsers is `yyparse', `yylex', `yyerror', `yynerrs',
`yylval', `yychar', `yydebug', and (if locations are used)
`yylloc'. If you use a push parser, `yypush_parse',
`yypull_parse', `yypstate', `yypstate_new' and `yypstate_delete'
will also be renamed. For example, if you use `%name-prefix
"c_"', the names become `c_parse', `c_lex', and so on. For C++
parsers, see the `%define namespace' documentation in this section.
*Note Multiple Parsers in the Same Program: Multiple Parsers.
-- 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 "FILE"
Specify FILE for the parser file.
-- Directive: %pure-parser
Deprecated version of `%define api.pure' (*note %define: Decl
Summary.), for which Bison is more careful to warn about
unreasonable usage.
-- Directive: %require "VERSION"
Require version VERSION or higher of Bison. *Note Require a
Version of Bison: Require Decl.
-- Directive: %skeleton "FILE"
Specify the skeleton to use.
If FILE does not contain a `/', FILE is the name of a skeleton
file in the Bison installation directory. If it does, FILE is an
absolute file name or a file name relative to the directory of the
grammar file. This is similar to how most shells resolve commands.
-- 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.
The name in the table includes all the characters needed to
represent the token in Bison. For single-character literals and
literal strings, this includes the surrounding quoting characters
and any escape sequences. For example, the Bison single-character
literal `'+'' corresponds to a three-character name, represented
in C as `"'+'"'; and the Bison two-character literal string `"\\/"'
corresponds to a five-character name, represented in C 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 lookahead 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.
---------- Footnotes ----------
(1) The default location is actually skeleton-dependent; writers
of non-standard skeletons however should choose the default location
consistently with the behavior of the standard Bison skeletons.
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'. If
you use a push parser, `yypush_parse', `yypull_parse', `yypstate',
`yypstate_new' and `yypstate_delete' will also be renamed. 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.
* Push Parser Function:: How to call `yypush_parse' and what it returns.
* Pull Parser Function:: How to call `yypull_parse' and what it returns.
* Parser Create Function:: How to call `yypstate_new' and what it returns.
* Parser Delete Function:: How to call `yypstate_delete' 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.
* Internationalization:: How to let the parser speak in the user's
native language.
File: bison.info, Node: Parser Function, Next: Push Parser Function, 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 because of invalid input, i.e.,
input that contains a syntax error or that causes `YYABORT' to be
invoked.
The value is 2 if parsing failed due to memory exhaustion.
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 the braced-code
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: Push Parser Function, Next: Pull Parser Function, Prev: Parser Function, Up: Interface
4.2 The Push Parser Function `yypush_parse'
===========================================
(The current push parsing interface is experimental and may evolve.
More user feedback will help to stabilize it.)
You call the function `yypush_parse' to parse a single token. This
function is available if either the `%define api.push_pull "push"' or
`%define api.push_pull "both"' declaration is used. *Note A Push
Parser: Push Decl.
-- Function: int yypush_parse (yypstate *yyps)
The value returned by `yypush_parse' is the same as for yyparse
with the following exception. `yypush_parse' will return
YYPUSH_MORE if more input is required to finish parsing the
grammar.
File: bison.info, Node: Pull Parser Function, Next: Parser Create Function, Prev: Push Parser Function, Up: Interface
4.3 The Pull Parser Function `yypull_parse'
===========================================
(The current push parsing interface is experimental and may evolve.
More user feedback will help to stabilize it.)
You call the function `yypull_parse' to parse the rest of the input
stream. This function is available if the `%define api.push_pull
"both"' declaration is used. *Note A Push Parser: Push Decl.
-- Function: int yypull_parse (yypstate *yyps)
The value returned by `yypull_parse' is the same as for `yyparse'.
File: bison.info, Node: Parser Create Function, Next: Parser Delete Function, Prev: Pull Parser Function, Up: Interface
4.4 The Parser Create Function `yystate_new'
============================================
(The current push parsing interface is experimental and may evolve.
More user feedback will help to stabilize it.)
You call the function `yypstate_new' to create a new parser instance.
This function is available if either the `%define api.push_pull "push"'
or `%define api.push_pull "both"' declaration is used. *Note A Push
Parser: Push Decl.
-- Function: yypstate *yypstate_new (void)
The function will return a valid parser instance if there was
memory available or 0 if no memory was available. In impure mode,
it will also return 0 if a parser instance is currently allocated.
File: bison.info, Node: Parser Delete Function, Next: Lexical, Prev: Parser Create Function, Up: Interface
4.5 The Parser Delete Function `yystate_delete'
===============================================
(The current push parsing interface is experimental and may evolve.
More user feedback will help to stabilize it.)
You call the function `yypstate_delete' to delete a parser instance.
function is available if either the `%define api.push_pull "push"' or
`%define api.push_pull "both"' declaration is used. *Note A Push
Parser: Push Decl.
-- Function: void yypstate_delete (yypstate *yyps)
This function will reclaim the memory associated with a parser
instance. After this call, you should no longer attempt to use
the parser instance.
File: bison.info, Node: Lexical, Next: Error Reporting, Prev: Parser Delete Function, Up: Interface
4.6 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.6.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 escaped as necessary to be suitable as
input to Bison.
Here's code for looking up a multicharacter token in `yytname',
assuming that the characters of the token are stored in
`token_buffer', and assuming that the token does not contain any
characters like `"' that require escaping.
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.6.2 Semantic Values of Tokens
-------------------------------
In an ordinary (nonreentrant) 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.6.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.6.4 Calling Conventions for Pure Parsers
------------------------------------------
When you use the Bison declaration `%define api.pure' 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 the braced-code 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 `%define api.pure' is added:
int yylex (YYSTYPE *lvalp, int *nastiness);
int yyparse (int *nastiness, int *randomness);
and finally, if both `%define api.pure' 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.7 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: memory exhaustion.
This can happen when the input contains constructions that are very
deeply nested. It isn't likely you will encounter this, since the Bison
parser normally extends its stack automatically up to a very large
limit. But if memory is exhausted, `yyparse' calls `yyerror' in the
usual fashion, except that the argument string is `"memory exhausted"'.
In some cases diagnostics like `"syntax error"' are translated
automatically from English to some other language before they are
passed to `yyerror'. *Note Internationalization::.
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 %define api.pure' 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 `%define
api.pure' are pure. I.e.:
/* Location tracking. */
%locations
/* Pure yylex. */
%define api.pure
%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 reported
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, Next: Internationalization, Prev: Error Reporting, Up: Interface
4.8 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 lookahead token. It is
also disallowed in GLR parsers. It installs a lookahead 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
lookahead 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 lookahead token.
-- Macro: YYEOF
Value stored in `yychar' when the lookahead is the end of the input
stream.
-- 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
The expression `YYRECOVERING ()' yields 1 when the parser is
recovering from a syntax error, and 0 otherwise. *Note Error
Recovery::.
-- Variable: yychar
Variable containing either the lookahead token, or `YYEOF' when the
lookahead is the end of the input stream, or `YYEMPTY' when no
lookahead has been performed so the next token is not yet known.
Do not modify `yychar' in a deferred semantic action (*note GLR
Semantic Actions::). *Note Lookahead Tokens: Lookahead.
-- Macro: yyclearin;
Discard the current lookahead token. This is useful primarily in
error rules. Do not invoke `yyclearin' in a deferred semantic
action (*note GLR Semantic Actions::). *Note Error Recovery::.
-- Macro: yyerrok;
Resume generating error messages immediately for subsequent syntax
errors. This is useful primarily in error rules. *Note Error
Recovery::.
-- Variable: yylloc
Variable containing the lookahead token location when `yychar' is
not set to `YYEMPTY' or `YYEOF'. Do not modify `yylloc' in a
deferred semantic action (*note GLR Semantic Actions::). *Note
Actions and Locations: Actions and Locations.
-- Variable: yylval
Variable containing the lookahead token semantic value when
`yychar' is not set to `YYEMPTY' or `YYEOF'. Do not modify
`yylval' in a deferred semantic action (*note GLR Semantic
Actions::). *Note Actions: Actions.
-- 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: Internationalization, Prev: Action Features, Up: Interface
4.9 Parser Internationalization
===============================
A Bison-generated parser can print diagnostics, including error and
tracing messages. By default, they appear in English. However, Bison
also supports outputting diagnostics in the user's native language. To
make this work, the user should set the usual environment variables.
*Note The User's View: (gettext)Users. For example, the shell command
`export LC_ALL=fr_CA.UTF-8' might set the user's locale to French
Canadian using the UTF-8 encoding. The exact set of available locales
depends on the user's installation.
The maintainer of a package that uses a Bison-generated parser
enables the internationalization of the parser's output through the
following steps. Here we assume a package that uses GNU Autoconf and
GNU Automake.
1. Into the directory containing the GNU Autoconf macros used by the
package--often called `m4'--copy the `bison-i18n.m4' file
installed by Bison under `share/aclocal/bison-i18n.m4' in Bison's
installation directory. For example:
cp /usr/local/share/aclocal/bison-i18n.m4 m4/bison-i18n.m4
2. In the top-level `configure.ac', after the `AM_GNU_GETTEXT'
invocation, add an invocation of `BISON_I18N'. This macro is
defined in the file `bison-i18n.m4' that you copied earlier. It
causes `configure' to find the value of the `BISON_LOCALEDIR'
variable, and it defines the source-language symbol `YYENABLE_NLS'
to enable translations in the Bison-generated parser.
3. In the `main' function of your program, designate the directory
containing Bison's runtime message catalog, through a call to
`bindtextdomain' with domain name `bison-runtime'. For example:
bindtextdomain ("bison-runtime", BISON_LOCALEDIR);
Typically this appears after any other call `bindtextdomain
(PACKAGE, LOCALEDIR)' that your package already has. Here we rely
on `BISON_LOCALEDIR' to be defined as a string through the
`Makefile'.
4. In the `Makefile.am' that controls the compilation of the `main'
function, make `BISON_LOCALEDIR' available as a C preprocessor
macro, either in `DEFS' or in `AM_CPPFLAGS'. For example:
DEFS = @DEFS@ -DBISON_LOCALEDIR='"$(BISON_LOCALEDIR)"'
or:
AM_CPPFLAGS = -DBISON_LOCALEDIR='"$(BISON_LOCALEDIR)"'
5. Finally, invoke the command `autoreconf' to generate the build
infrastructure.
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:
* Lookahead:: 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.
* Memory Management:: What happens when memory is exhausted. How to avoid it.
File: bison.info, Node: Lookahead, Next: Shift/Reduce, Up: Algorithm
5.1 Lookahead 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 "lookahead 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 lookahead token remains off to the side. When no
more reductions should take place, the lookahead token is shifted onto
the stack. This does not mean that all possible reductions have been
done; depending on the token type of the lookahead token, some rules
may choose to delay their application.
Here is a simple case where lookahead 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 lookahead token is stored in the variable `yychar'. Its
semantic value and location, if any, are stored in the variables
`yylval' and `yylloc'. *Note Special Features for Use in Actions:
Action Features.
File: bison.info, Node: Shift/Reduce, Next: Precedence, Prev: Lookahead, 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 lookahead 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 lookahead
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 lookahead
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 lookahead 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 lookahead token is read, the current parser state
together with the type of lookahead token are looked up in a table.
This table entry can say, "Shift the lookahead 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 lookahead
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 lookahead: 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 lookahead 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
;
For a more detailed exposition of LALR(1) parsers and parser
generators, please see: Frank DeRemer and Thomas Pennello, Efficient
Computation of LALR(1) Look-Ahead Sets, `ACM Transactions on
Programming Languages and Systems', Vol. 4, No. 4 (October 1982), pp.
615-649 `http://doi.acm.org/10.1145/69622.357187'.
File: bison.info, Node: Generalized LR Parsing, Next: Memory Management, 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 nondeterministic
grammars can require exponential time and space to process. Such badly
behaving examples, however, are not generally of practical interest.
Usually, nondeterminism 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: Memory Management, Prev: Generalized LR Parsing, Up: Algorithm
5.9 Memory Management, and How to Avoid Memory Exhaustion
=========================================================
The Bison parser stack can run out of memory if too many tokens are
shifted and not reduced. When this happens, the parser function
`yyparse' calls `yyerror' and then returns 2.
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 memory is exhausted. 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.
The stack space allowed is not necessarily allocated. If you
specify a large value for `YYMAXDEPTH', the parser normally 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.
However, do not allow `YYMAXDEPTH' to be a value so large that
arithmetic overflow could occur when calculating the size of the stack
space. Also, do not allow `YYMAXDEPTH' to be less than `YYINITDEPTH'.
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' to a positive integer. For the C LALR(1) parser,
this value must be a compile-time constant unless you are assuming C99
or some other target language or compiler that allows variable-length
arrays. The default is 200.
Do not allow `YYINITDEPTH' to be greater than `YYMAXDEPTH'.
Because of semantic differences between C and C++, the LALR(1)
parsers in C produced by Bison cannot grow when compiled by C++
compilers. In this precise case (compiling a C parser as C++) you are
suggested to grow `YYINITDEPTH'. The Bison maintainers hope to fix
this deficiency in a future release.
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 lookahead 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 lookahead 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. *Note Special Features for Use in Actions: Action
Features.
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 lookahead token
ought to be discarded with `yyclearin;'.
The expression `YYRECOVERING ()' yields 1 when the parser is
recovering from a syntax error, and 0 otherwise. Syntax error
diagnostics are suppressed while recovering from a syntax error.
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;
int baz (void)
{
static bar (bar); /* redeclare `bar' as static variable */
extern foo foo (foo); /* redeclare `foo' as function */
return foo (bar);
}
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 DOT 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 nonterminal and 1 rule useless in grammar
calc.y:11.1-7: warning: nonterminal useless in grammar: useless
calc.y:11.10-12: warning: rule useless in grammar: 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 "unused" below):
Nonterminals useless in grammar:
useless
Terminals unused in grammar:
STR
Rules useless in grammar:
#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 token 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 token
(`$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 token is
`*', since we specified that `*' has higher precedence than `+'. More
generally, some items are eligible only with some set of possible
lookahead tokens. When run with `--report=lookahead', Bison specifies
these lookahead tokens:
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 not only due to the lack of
precedence of `/' with respect to `+', `-', 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 variadic arguments. If you define `YYDEBUG' to a
nonzero value but do not define `YYFPRINTF', `' is
automatically included and `YYFPRINTF' 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 Declarations.):
%{
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: Other Languages, 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' and
removing any leading directory. Thus, the `bison foo.y' file name
yields `foo.tab.c', and the `bison hack/foo.y' file name yields
`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 file names 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.
`--print-localedir'
Print the name of the directory containing locale-dependent data.
`--print-datadir'
Print the name of the directory containing skeletons and XSLT.
`-y'
`--yacc'
Act more like the traditional Yacc command. This can cause
different diagnostics to be generated, and may change behavior in
other minor ways. Most importantly, imitate Yacc's output file
name conventions, so that the parser output file is called
`y.tab.c', and the other outputs are called `y.output' and
`y.tab.h'. Also, if generating an LALR(1) parser in C, generate
`#define' statements in addition to an `enum' to associate token
numbers with token names. 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 "$@"
The `-y'/`--yacc' option is intended for use with traditional Yacc
grammars. If your grammar uses a Bison extension like
`%glr-parser', Bison might not be Yacc-compatible even if this
option is specified.
`-W [CATEGORY]'
`--warnings[=CATEGORY]'
Output warnings falling in CATEGORY. CATEGORY can be one of:
`midrule-values'
Warn about mid-rule values that are set but not used within
any of the actions of the parent rule. For example, warn
about unused `$2' in:
exp: '1' { $$ = 1; } '+' exp { $$ = $1 + $4; };
Also warn about mid-rule values that are used but not set.
For example, warn about unset `$$' in the mid-rule action in:
exp: '1' { $1 = 1; } '+' exp { $$ = $2 + $4; };
These warnings are not enabled by default since they
sometimes prove to be false alarms in existing grammars
employing the Yacc constructs `$0' or `$-N' (where N is some
positive integer).
`yacc'
Incompatibilities with POSIX Yacc.
`all'
All the warnings.
`none'
Turn off all the warnings.
`error'
Treat warnings as errors.
A category can be turned off by prefixing its name with `no-'. For
instance, `-Wno-syntax' will hide the warnings about unused
variables.
Tuning the parser:
`-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.
`-L LANGUAGE'
`--language=LANGUAGE'
Specify the programming language for the generated parser, as if
`%language' was specified (*note Bison Declaration Summary: Decl
Summary.). Currently supported languages include C, C++, and Java.
LANGUAGE is case-insensitive.
This option is experimental and its effect may be modified in
future releases.
`--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.
`-S FILE'
`--skeleton=FILE'
Specify the skeleton to use, similar to `%skeleton' (*note Bison
Declaration Summary: Decl Summary.).
If FILE does not contain a `/', FILE is the name of a skeleton
file in the Bison installation directory. If it does, FILE is an
absolute file name or a file name relative to the current working
directory. This is similar to how most shells resolve commands.
`-k'
`--token-table'
Pretend that `%token-table' was specified. *Note Decl Summary::.
Adjust the output:
`--defines[=FILE]'
Pretend that `%defines' was specified, i.e., write an extra output
file containing macro definitions for the token type names defined
in the grammar, as well as a few other declarations. *Note Decl
Summary::.
`-d'
This is the same as `--defines' except `-d' does not accept a FILE
argument since POSIX Yacc requires that `-d' can be bundled with
other short options.
`-b FILE-PREFIX'
`--file-prefix=PREFIX'
Pretend that `%file-prefix' 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.
`--report-file=FILE'
Specify the FILE for the verbose description.
`-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 FILE'
`--output=FILE'
Specify the FILE for the parser file.
The other output files' names are constructed from FILE as
described under the `-v' and `-d' options.
`-g[FILE]'
`--graph[=FILE]'
Output a graphical representation of the LALR(1) grammar automaton
computed by Bison, in Graphviz (http://www.graphviz.org/) DOT
(http://www.graphviz.org/doc/info/lang.html) format. `FILE' is
optional. If omitted and the grammar file is `foo.y', the output
file will be `foo.dot'.
`-x[FILE]'
`--xml[=FILE]'
Output an XML report of the LALR(1) automaton computed by Bison.
`FILE' is optional. If omitted and the grammar file is `foo.y',
the output file will be `foo.xml'. (The current XML schema is
experimental and may evolve. More user feedback will help to
stabilize it.)
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.
Long Option Short Option
-------------------------------------------------
`--debug' `-t'
`--defines[=FILE]'
`--file-prefix=PREFIX' `-b' PREFIX
`--graph[=FILE]' `-g' [FILE]
`--help' `-h'
`--language=LANGUAGE' `-L' LANGUAGE
`--locations'
`--name-prefix=PREFIX' `-p' PREFIX
`--no-lines' `-l'
`--output=FILE' `-o' FILE
`--print-datadir'
`--print-localedir'
`--report-file=FILE'
`--report=THINGS' `-r' THINGS
`--skeleton=FILE' `-S' FILE
`--token-table' `-k'
`--verbose' `-v'
`--version' `-V'
`--warnings[=CATEGORY]' `-W' [CATEGORY]
`--xml[=FILE]' `-x' [FILE]
`--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: Other Languages, Next: FAQ, Prev: Invocation, Up: Top
10 Parsers Written In Other Languages
*************************************
* Menu:
* C++ Parsers:: The interface to generate C++ parser classes
* Java Parsers:: The interface to generate Java parser classes
File: bison.info, Node: C++ Parsers, Next: Java Parsers, Up: Other Languages
10.1 C++ Parsers
================
* Menu:
* C++ Bison Interface:: Asking for C++ parser generation
* C++ Semantic Values:: %union vs. C++
* C++ Location Values:: The position and location classes
* C++ Parser Interface:: Instantiating and running the parser
* C++ Scanner Interface:: Exchanges between yylex and parse
* A Complete C++ Example:: Demonstrating their use
File: bison.info, Node: C++ Bison Interface, Next: C++ Semantic Values, Up: C++ Parsers
10.1.1 C++ Bison Interface
--------------------------
The C++ LALR(1) parser is selected using the skeleton directive,
`%skeleton "lalr1.c"', or the synonymous command-line option
`--skeleton=lalr1.c'. *Note Decl Summary::.
When run, `bison' will create several entities in the `yy' namespace. Use
the `%define namespace' directive to change the namespace name, see
*note Decl Summary::. The various classes are generated in the
following files:
`position.hh'
`location.hh'
The definition of the classes `position' and `location', used for
location tracking. *Note C++ Location Values::.
`stack.hh'
An auxiliary class `stack' used by the parser.
`FILE.hh'
`FILE.cc'
(Assuming the extension of the input file was `.yy'.) The
declaration and implementation of the C++ parser class. The
basename and extension of these two files follow the same rules as
with regular C parsers (*note Invocation::).
The header is _mandatory_; you must either pass `-d'/`--defines'
to `bison', or use the `%defines' directive.
All these files are documented using Doxygen; run `doxygen' for a
complete and accurate documentation.
File: bison.info, Node: C++ Semantic Values, Next: C++ Location Values, Prev: C++ Bison Interface, Up: C++ Parsers
10.1.2 C++ Semantic Values
--------------------------
The `%union' directive works as for C, see *note The Collection of
Value Types: Union Decl. In particular it produces a genuine
`union'(1), which have a few specific features in C++.
- The type `YYSTYPE' is defined but its use is discouraged: rather
you should refer to the parser's encapsulated type
`yy::parser::semantic_type'.
- Non POD (Plain Old Data) types cannot be used. C++ forbids any
instance of classes with constructors in unions: only _pointers_
to such objects are allowed.
Because objects have to be stored via pointers, memory is not
reclaimed automatically: using the `%destructor' directive is the only
means to avoid leaks. *Note Freeing Discarded Symbols: Destructor Decl.
---------- Footnotes ----------
(1) In the future techniques to allow complex types within
pseudo-unions (similar to Boost variants) might be implemented to
alleviate these issues.
File: bison.info, Node: C++ Location Values, Next: C++ Parser Interface, Prev: C++ Semantic Values, Up: C++ Parsers
10.1.3 C++ Location Values
--------------------------
When the directive `%locations' is used, the C++ parser supports
location tracking, see *note Locations Overview: Locations. Two
auxiliary classes define a `position', a single point in a file, and a
`location', a range composed of a pair of `position's (possibly
spanning several files).
-- Method on position: std::string* file
The name of the file. It will always be handled as a pointer, the
parser will never duplicate nor deallocate it. As an experimental
feature you may change it to `TYPE*' using `%define filename_type
"TYPE"'.
-- Method on position: unsigned int line
The line, starting at 1.
-- Method on position: unsigned int lines (int HEIGHT = 1)
Advance by HEIGHT lines, resetting the column number.
-- Method on position: unsigned int column
The column, starting at 0.
-- Method on position: unsigned int columns (int WIDTH = 1)
Advance by WIDTH columns, without changing the line number.
-- Method on position: position& operator+= (position& POS, int WIDTH)
-- Method on position: position operator+ (const position& POS, int
WIDTH)
-- Method on position: position& operator-= (const position& POS, int
WIDTH)
-- Method on position: position operator- (position& POS, int WIDTH)
Various forms of syntactic sugar for `columns'.
-- Method on position: position operator<< (std::ostream O, const
position& P)
Report P on O like this: `FILE:LINE.COLUMN', or `LINE.COLUMN' if
FILE is null.
-- Method on location: position begin
-- Method on location: position end
The first, inclusive, position of the range, and the first beyond.
-- Method on location: unsigned int columns (int WIDTH = 1)
-- Method on location: unsigned int lines (int HEIGHT = 1)
Advance the `end' position.
-- Method on location: location operator+ (const location& BEGIN,
const location& END)
-- Method on location: location operator+ (const location& BEGIN, int
WIDTH)
-- Method on location: location operator+= (const location& LOC, int
WIDTH)
Various forms of syntactic sugar.
-- Method on location: void step ()
Move `begin' onto `end'.
File: bison.info, Node: C++ Parser Interface, Next: C++ Scanner Interface, Prev: C++ Location Values, Up: C++ Parsers
10.1.4 C++ Parser Interface
---------------------------
The output files `OUTPUT.hh' and `OUTPUT.cc' declare and define the
parser class in the namespace `yy'. The class name defaults to
`parser', but may be changed using `%define parser_class_name "NAME"'.
The interface of this class is detailed below. It can be extended
using the `%parse-param' feature: its semantics is slightly changed
since it describes an additional member of the parser class, and an
additional argument for its constructor.
-- Type of parser: semantic_value_type
-- Type of parser: location_value_type
The types for semantics value and locations.
-- Method on parser: parser (TYPE1 ARG1, ...)
Build a new parser object. There are no arguments by default,
unless `%parse-param {TYPE1 ARG1}' was used.
-- Method on parser: int parse ()
Run the syntactic analysis, and return 0 on success, 1 otherwise.
-- Method on parser: std::ostream& debug_stream ()
-- Method on parser: void set_debug_stream (std::ostream& O)
Get or set the stream used for tracing the parsing. It defaults to
`std::cerr'.
-- Method on parser: debug_level_type debug_level ()
-- Method on parser: void set_debug_level (debug_level L)
Get or set the tracing level. Currently its value is either 0, no
trace, or nonzero, full tracing.
-- Method on parser: void error (const location_type& L, const
std::string& M)
The definition for this member function must be supplied by the
user: the parser uses it to report a parser error occurring at L,
described by M.
File: bison.info, Node: C++ Scanner Interface, Next: A Complete C++ Example, Prev: C++ Parser Interface, Up: C++ Parsers
10.1.5 C++ Scanner Interface
----------------------------
The parser invokes the scanner by calling `yylex'. Contrary to C
parsers, C++ parsers are always pure: there is no point in using the
`%define api.pure' directive. Therefore the interface is as follows.
-- Method on parser: int yylex (semantic_value_type& YYLVAL,
location_type& YYLLOC, TYPE1 ARG1, ...)
Return the next token. Its type is the return value, its semantic
value and location being YYLVAL and YYLLOC. Invocations of
`%lex-param {TYPE1 ARG1}' yield additional arguments.
File: bison.info, Node: A Complete C++ Example, Prev: C++ Scanner Interface, Up: C++ Parsers
10.1.6 A Complete C++ Example
-----------------------------
This section demonstrates the use of a C++ parser with a simple but
complete example. This example should be available on your system,
ready to compile, in the directory "../bison/examples/calc++". It
focuses on the use of Bison, therefore the design of the various C++
classes is very naive: no accessors, no encapsulation of members etc.
We will use a Lex scanner, and more precisely, a Flex scanner, to
demonstrate the various interaction. A hand written scanner is
actually easier to interface with.
* Menu:
* Calc++ --- C++ Calculator:: The specifications
* Calc++ Parsing Driver:: An active parsing context
* Calc++ Parser:: A parser class
* Calc++ Scanner:: A pure C++ Flex scanner
* Calc++ Top Level:: Conducting the band
File: bison.info, Node: Calc++ --- C++ Calculator, Next: Calc++ Parsing Driver, Up: A Complete C++ Example
10.1.6.1 Calc++ -- C++ Calculator
.................................
Of course the grammar is dedicated to arithmetics, a single expression,
possibly preceded by variable assignments. An environment containing
possibly predefined variables such as `one' and `two', is exchanged
with the parser. An example of valid input follows.
three := 3
seven := one + two * three
seven * seven
File: bison.info, Node: Calc++ Parsing Driver, Next: Calc++ Parser, Prev: Calc++ --- C++ Calculator, Up: A Complete C++ Example
10.1.6.2 Calc++ Parsing Driver
..............................
To support a pure interface with the parser (and the scanner) the
technique of the "parsing context" is convenient: a structure
containing all the data to exchange. Since, in addition to simply
launch the parsing, there are several auxiliary tasks to execute (open
the file for parsing, instantiate the parser etc.), we recommend
transforming the simple parsing context structure into a fully blown
"parsing driver" class.
The declaration of this driver class, `calc++-driver.hh', is as
follows. The first part includes the CPP guard and imports the
required standard library components, and the declaration of the parser
class.
#ifndef CALCXX_DRIVER_HH
# define CALCXX_DRIVER_HH
# include
# include