diff --git a/NEWS b/NEWS index c902e9ee..9c49fe84 100644 --- a/NEWS +++ b/NEWS @@ -137,8 +137,12 @@ GNU Bison NEWS ** Documentation - The examples (installed in .../share/doc/bison/examples), now include a - Java calculator. + The examples/ directory (installed in .../share/doc/bison/examples) has + been restructured per language for clarity. The examples come with a + README and a Makefile. Not only can they be used to toy with Bison, they + can also be starting points for your own grammars. + + There is now a Java example. ** Changes @@ -647,7 +651,7 @@ GNU Bison NEWS Traditional Yacc generates 'y.tab.c' whatever the name of the input file. Therefore Makefiles written for Yacc expect 'y.tab.c' (and possibly - 'y.tab.h' and 'y.outout') to be generated from 'foo.y'. + 'y.tab.h' and 'y.output') to be generated from 'foo.y'. To this end, for ages, AC_PROG_YACC, Autoconf's macro to look for an implementation of Yacc, was using Bison as 'bison -y'. While it does @@ -3284,7 +3288,7 @@ along with this program. If not, see . LocalWords: pragmas noreturn untyped Rozenman unexpanded Wojciech Polak LocalWords: Alexandre MERCHANTABILITY yytype emplace ptr automove lvalues LocalWords: nonterminal yy args Pragma dereference yyformat rhs docdir - LocalWords: Redeclarations rpcalc Autoconf YFLAGS Makefiles outout PROG + LocalWords: Redeclarations rpcalc Autoconf YFLAGS Makefiles PROG LocalWords: Heimbigner AST src ast Makefile srcdir MinGW Local Variables: diff --git a/examples/README.md b/examples/README.md new file mode 100644 index 00000000..811672df --- /dev/null +++ b/examples/README.md @@ -0,0 +1,28 @@ +This directory contains examples of Bison grammar files, sorted per +language. + +Several of them come from the documentation, which should be installed +together with Bison. The URLs are provided for convenience. + +These examples come with a README and a Makefile. Not only can they be used +to toy with Bison, they can also be starting points for your own grammars. + +Please, be sure to read the C examples before looking at the other +languages, as these examples are simpler. + + diff --git a/examples/c++/README b/examples/c++/README.md similarity index 65% rename from examples/c++/README rename to examples/c++/README.md index 3d6c2034..7459450a 100644 --- a/examples/c++/README +++ b/examples/c++/README.md @@ -1,11 +1,11 @@ -This directory contains examples of Bison grammar files in C++. +# Examples in C++ -* Examples in C++ +This directory contains examples of Bison grammar files in C++. You can run `make` to compile these examples. And `make clean` to tidy afterwards. -** simple.yy - Simple example in C++14 +## simple.yy - Simple example in C++14 A very simple example in C++, based on variants and symbol constructors. Variants allow to use any C++ type as semantic value type, and symbol constructors ensure consistency between declared token type and effective @@ -16,21 +16,32 @@ Run as `./simple`. Extracted from the documentation: "A Simple C++ Example". https://www.gnu.org/software/bison/manual/html_node/A-Simple-C_002b_002b-Example.html -** variant.yy - Self-contained example in C++98 +## variant.yy - Self-contained example in C++98 A variation of simple.yy, in C++98. Run as `./variant`. -** variant-11.yy - Self-contained example in modern C++ +## variant-11.yy - Self-contained example in modern C++ Another variation of simple.yy, closely related to the previous one, but exhibiting support for C++11's move semantics. Run as `./variant` or `./variant NUMBER`. ------ +## calc++ - A Complete C++ Example +A fully featured C++ version of the canonical example for parsers: a +calculator. Also uses Flex for the scanner. + +Don't look at this example first: it is fully featured and can serve as a +starting point for a clean parser in C++. The previous examples are better +introductory examples, and the C examples are also useful introductory +examples. + +Extracted from the documentation: "A Complete C++ Example". +https://www.gnu.org/software/bison/manual/html_node/A-Complete-C_002b_002b-Example.html + + diff --git a/examples/calc++/.gitignore b/examples/c++/calc++/.gitignore similarity index 100% rename from examples/calc++/.gitignore rename to examples/c++/calc++/.gitignore diff --git a/examples/c++/calc++/Makefile b/examples/c++/calc++/Makefile new file mode 100644 index 00000000..a2d83d7c --- /dev/null +++ b/examples/c++/calc++/Makefile @@ -0,0 +1,41 @@ +# This Makefile is designed to be simple and readable. It does not +# aim at portability. It requires GNU Make. + +BASE = calc++ +BISON = bison +CXX = g++ +FLEX = flex +XSLTPROC = xsltproc + +all: $(BASE) + +%.cc %.hh %.xml %.gv: %.yy + $(BISON) $(BISONFLAGS) --xml --graph=$*.gv -o $*.cc $< + +%.cc: %.ll + $(FLEX) $(FLEXFLAGS) -o$@ $< + +%.o: %.cc + $(CXX) $(CXXFLAGS) -c -o$@ $< + +$(BASE): $(BASE).o driver.o parser.o scanner.o + $(CXX) -o $@ $^ + +$(BASE).o: parser.hh +parser.o: parser.hh +scanner.o: parser.hh + +run: $(BASE) + @echo "Type arithmetic expressions. Quit with ctrl-d." + ./$< - + +html: parser.html +%.html: %.xml + $(XSLTPROC) $(XSLTPROCFLAGS) -o $@ $$($(BISON) --print-datadir)/xslt/xml2xhtml.xsl $< + +CLEANFILES = \ + $(BASE) *.o \ + parser.hh parser.cc parser.output parser.xml parser.html parser.gv location.hh \ + scanner.cc +clean: + rm -f $(CLEANFILES) diff --git a/examples/calc++/README b/examples/c++/calc++/README.md similarity index 98% rename from examples/calc++/README rename to examples/c++/calc++/README.md index 8fbd2d74..d4d5154f 100644 --- a/examples/calc++/README +++ b/examples/c++/calc++/README.md @@ -13,6 +13,7 @@ evaluate. The program calc++ expects the file to parse as argument; pass `-` to read the standard input (and then hit , control-d, to end your input). +``` $ ./calc++ - one := 1 two := 2 @@ -20,14 +21,14 @@ three := 3 (one + two * three) * two * three 42 +``` You may pass `-p` to activate the parser debug traces, and `-s` to activate the scanner's. ------ + diff --git a/examples/calc++/calc++.test b/examples/c++/calc++/calc++.test similarity index 100% rename from examples/calc++/calc++.test rename to examples/c++/calc++/calc++.test diff --git a/examples/calc++/local.mk b/examples/c++/calc++/local.mk similarity index 97% rename from examples/calc++/local.mk rename to examples/c++/calc++/local.mk index 8de5bf4d..a051ad46 100644 --- a/examples/calc++/local.mk +++ b/examples/c++/calc++/local.mk @@ -79,6 +79,6 @@ EXTRA_DIST += %D%/calc++.test ## Installing. ## ## ------------ ## -calcxxdir = $(docdir)/examples/calc++ +calcxxdir = $(docdir)/%D% calcxx_DATA = $(calcxx_extracted) -dist_calcxx_DATA = %D%/README %D%/Makefile +dist_calcxx_DATA = %D%/README.md %D%/Makefile diff --git a/examples/c++/local.mk b/examples/c++/local.mk index 66556a70..e251276f 100644 --- a/examples/c++/local.mk +++ b/examples/c++/local.mk @@ -13,7 +13,8 @@ ## You should have received a copy of the GNU General Public License ## along with this program. If not, see . -cxxdir = $(examplesdir)/c++ +cxxdir = $(docdir)/%D% +include %D%/calc++/local.mk ## -------- ## ## Simple. ## @@ -66,5 +67,5 @@ if ENABLE_CXX11 endif EXTRA_DIST += %D%/variant-11.test -dist_cxx_DATA = %D%/README %D%/Makefile %D%/variant.yy %D%/variant-11.yy +dist_cxx_DATA = %D%/README.md %D%/Makefile %D%/variant.yy %D%/variant-11.yy CLEANFILES += %D%/simple.output %D%/variant.output %D%/variant-11.output diff --git a/examples/README b/examples/c/README.md similarity index 68% rename from examples/README rename to examples/c/README.md index e9b505ca..5093d7a4 100644 --- a/examples/README +++ b/examples/c/README.md @@ -3,10 +3,7 @@ This directory contains examples of Bison grammar files. Most of them come from the documentation, which should be installed together with Bison. The URLs are provided for convenience. - -* Examples in C - -** rpcalc - Reverse Polish Notation Calculator +# rpcalc - 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. @@ -14,42 +11,16 @@ provides a good starting point, since operator precedence is not an issue. Extracted from the documentation: "Reverse Polish Notation Calculator" https://www.gnu.org/software/bison/manual/html_node/RPN-Calc.html -** mfcalc - Multi-Function Calculator +# mfcalc - Multi-Function Calculator A more complete C example: a multi-function calculator. Extracted from the documentation: "Multi-Function Calculator: mfcalc". https://www.gnu.org/software/bison/manual/html_node/Multi_002dfunction-Calc.html - -* Examples in C++ - -** c++ - A directory of simple C++ examples - -** calc++ - A Complete C++ Example -A fully featured C++ version of the canonical example for parsers: a -calculator. Also uses Flex for the scanner. - -Extracted from the documentation: "A Complete C++ Example". -https://www.gnu.org/software/bison/manual/html_node/A-Complete-C_002b_002b-Example.html - - -* Examples in D - -** d/calc.y -The usual calculator. - - -* Examples in Java - -** java/Calc.y -The usual calculator. - - ------ + diff --git a/examples/c/local.mk b/examples/c/local.mk new file mode 100644 index 00000000..dcd90424 --- /dev/null +++ b/examples/c/local.mk @@ -0,0 +1,20 @@ +## Copyright (C) 2018 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 . + +cdir = $(docdir)/%D% +dist_c_DATA = %D%/README.md + +include %D%/mfcalc/local.mk +include %D%/rpcalc/local.mk diff --git a/examples/mfcalc/.gitignore b/examples/c/mfcalc/.gitignore similarity index 100% rename from examples/mfcalc/.gitignore rename to examples/c/mfcalc/.gitignore diff --git a/examples/c/mfcalc/Makefile b/examples/c/mfcalc/Makefile new file mode 100644 index 00000000..b9518089 --- /dev/null +++ b/examples/c/mfcalc/Makefile @@ -0,0 +1,25 @@ +# This Makefile is designed to be simple and readable. It does not +# aim at portability. It requires GNU Make. + +BASE = mfcalc +BISON = bison +XSLTPROC = xsltproc + +all: $(BASE) + +%.c %.xml %.gv: %.y + $(BISON) $(BISONFLAGS) --xml --graph=$*.gv -o $*.c $< + +%: %.c + $(CC) $(CFLAGS) -o $@ $< + +run: $(BASE) + @echo "Type arithmetic expressions. Quit with ctrl-d." + ./$< + +html: $(BASE).html +%.html: %.xml + $(XSLTPROC) $(XSLTPROCFLAGS) -o $@ $$($(BISON) --print-datadir)/xslt/xml2xhtml.xsl $< + +clean: + rm -f $(BASE) $(BASE).c $(BASE).html $(BASE).xml $(BASE).gv $(BASE).output diff --git a/examples/mfcalc/local.mk b/examples/c/mfcalc/local.mk similarity index 95% rename from examples/mfcalc/local.mk rename to examples/c/mfcalc/local.mk index 62923b37..c76bfa5a 100644 --- a/examples/mfcalc/local.mk +++ b/examples/c/mfcalc/local.mk @@ -38,5 +38,6 @@ dist_TESTS += %D%/mfcalc.test ## Installing. ## ## ------------ ## -mfcalcdir = $(docdir)/examples/mfcalc +mfcalcdir = $(docdir)/%D% mfcalc_DATA = $(mfcalc_extracted) +dist_mfcalc_DATA = %D%/Makefile diff --git a/examples/mfcalc/mfcalc.test b/examples/c/mfcalc/mfcalc.test similarity index 100% rename from examples/mfcalc/mfcalc.test rename to examples/c/mfcalc/mfcalc.test diff --git a/examples/rpcalc/.gitignore b/examples/c/rpcalc/.gitignore similarity index 100% rename from examples/rpcalc/.gitignore rename to examples/c/rpcalc/.gitignore diff --git a/examples/c/rpcalc/Makefile b/examples/c/rpcalc/Makefile new file mode 100644 index 00000000..87e18f34 --- /dev/null +++ b/examples/c/rpcalc/Makefile @@ -0,0 +1,25 @@ +# This Makefile is designed to be simple and readable. It does not +# aim at portability. It requires GNU Make. + +BASE = rpcalc +BISON = bison +XSLTPROC = xsltproc + +all: $(BASE) + +%.c %.xml %.gv: %.y + $(BISON) $(BISONFLAGS) --xml --graph=$*.gv -o $*.c $< + +%: %.c + $(CC) $(CFLAGS) -o $@ $< + +run: $(BASE) + @echo "Type arithmetic expressions in reverse polish notation. Quit with ctrl-d." + ./$< + +html: $(BASE).html +%.html: %.xml + $(XSLTPROC) $(XSLTPROCFLAGS) -o $@ $$($(BISON) --print-datadir)/xslt/xml2xhtml.xsl $< + +clean: + rm -f $(BASE) $(BASE).c $(BASE).html $(BASE).xml $(BASE).gv diff --git a/examples/rpcalc/local.mk b/examples/c/rpcalc/local.mk similarity index 95% rename from examples/rpcalc/local.mk rename to examples/c/rpcalc/local.mk index 48f6ac67..6889e7de 100644 --- a/examples/rpcalc/local.mk +++ b/examples/c/rpcalc/local.mk @@ -38,5 +38,6 @@ dist_TESTS += %D%/rpcalc.test ## Installing. ## ## ------------ ## -rpcalcdir = $(docdir)/examples/rpcalc +rpcalcdir = $(docdir)/%D% rpcalc_DATA = $(rpcalc_extracted) +dist_rpcalc_DATA = %D%/Makefile diff --git a/examples/rpcalc/rpcalc.test b/examples/c/rpcalc/rpcalc.test similarity index 100% rename from examples/rpcalc/rpcalc.test rename to examples/c/rpcalc/rpcalc.test diff --git a/examples/calc++/Makefile b/examples/calc++/Makefile deleted file mode 100644 index 6b6c4998..00000000 --- a/examples/calc++/Makefile +++ /dev/null @@ -1,27 +0,0 @@ -# This Makefile is designed to be simple and readable. It does not -# aim at portability. It requires GNU Make. - -BISON = bison -CXX = g++ -FLEX = flex - -all: calc++ - -%.cc %.hh: %.yy - $(BISON) $(BISONFLAGS) -o $*.cc $< - -%.cc: %.ll - $(FLEX) $(FLEXFLAGS) -o$@ $< - -%.o: %.cc - $(CXX) $(CXXFLAGS) -c -o$@ $< - -calc++: calc++.o driver.o parser.o scanner.o - $(CXX) -o $@ $^ - -calc++.o: parser.hh -parser.o: parser.hh -scanner.o: parser.hh - -clean: - rm -f calc++ *.o parser.hh parser.cc scanner.cc diff --git a/examples/d/Makefile b/examples/d/Makefile index 1c41b6ce..45ae6289 100644 --- a/examples/d/Makefile +++ b/examples/d/Makefile @@ -14,7 +14,7 @@ all: calc $(DC) $(DCFLAGS) $< run: calc - echo "Type arithmetic expressions. Quit with ctrl-d." + @echo "Type arithmetic expressions. Quit with ctrl-d." ./$< html: calc.html diff --git a/examples/d/README.md b/examples/d/README.md new file mode 100644 index 00000000..32d8a9c8 --- /dev/null +++ b/examples/d/README.md @@ -0,0 +1,28 @@ +# Examples in D + +This directory contains examples of Bison grammar files in D. + +You can run `make` to compile these examples. And `make clean` to tidy +afterwards. + +## d/calc.y +The usual calculator. + + diff --git a/examples/d/local.mk b/examples/d/local.mk index 92fe116e..a9f0e2d2 100644 --- a/examples/d/local.mk +++ b/examples/d/local.mk @@ -23,6 +23,7 @@ if ENABLE_D check_SCRIPTS += %D%/calc TESTS += %D%/calc.test endif +EXTRA_DIST += %D%/calc.test %D%/calc.d: %D%/calc.y $(BISON_IN) $(dist_pkgdata_DATA) $(AM_V_GEN)$(MKDIR_P) %D% @@ -31,5 +32,5 @@ endif %D%/calc: %D%/calc.d $(AM_V_GEN) $(DC) $(DCFLAGS) -of$@ $< -dist_d_DATA = %D%/calc.y %D%/Makefile -CLEANFILES += %D%/calc %D%/Calc.d +dist_d_DATA = %D%/calc.y %D%/Makefile %D%/README.md +CLEANFILES += %D%/calc %D%/calc.[do] diff --git a/examples/java/Makefile b/examples/java/Makefile index de9a54a6..5a165205 100644 --- a/examples/java/Makefile +++ b/examples/java/Makefile @@ -15,7 +15,7 @@ all: Calc.class $(JAVAC) $(JAVACFLAGS) $< run: Calc.class - echo "Type arithmetic expressions. Quit with ctrl-d." + @echo "Type arithmetic expressions. Quit with ctrl-d." $(JAVA) $(JAVAFLAGS) Calc html: Calc.html diff --git a/examples/java/README.md b/examples/java/README.md new file mode 100644 index 00000000..99df7f3a --- /dev/null +++ b/examples/java/README.md @@ -0,0 +1,27 @@ +# Examples in Java + +This directory contains examples of Bison grammar files in Java. + +You can run `make` to compile these examples. And `make clean` to tidy +afterwards. + +## java/Calc.y +The usual calculator. + + diff --git a/examples/java/local.mk b/examples/java/local.mk index f464f1f7..9582bfce 100644 --- a/examples/java/local.mk +++ b/examples/java/local.mk @@ -23,6 +23,7 @@ if ENABLE_JAVA check_SCRIPTS += %D%/Calc.class TESTS += %D%/Calc.test endif +EXTRA_DIST += %D%/Calc.test %D%/Calc.java: %D%/Calc.y $(BISON_IN) $(dist_pkgdata_DATA) $(AM_V_GEN)$(MKDIR_P) %D% @@ -31,5 +32,5 @@ endif %D%/Calc.class: %D%/Calc.java $(AM_V_GEN) $(SHELL) $(top_builddir)/javacomp.sh $< -dist_java_DATA = %D%/Calc.y %D%/Makefile -CLEANFILES += %D%/Calc.class %D%/Calc.java +dist_java_DATA = %D%/Calc.y %D%/Makefile %D%/README.md +CLEANFILES += %D%/*.class %D%/Calc.java diff --git a/examples/local.mk b/examples/local.mk index 0fd81b5c..83969468 100644 --- a/examples/local.mk +++ b/examples/local.mk @@ -71,13 +71,11 @@ examples-unline: ## ---------- ## examplesdir = $(docdir)/examples -dist_examples_DATA = %D%/README +dist_examples_DATA = %D%/README.md CLEANDIRS += %D%/*.dSYM -include %D%/calc++/local.mk +include %D%/c/local.mk include %D%/c++/local.mk include %D%/d/local.mk include %D%/java/local.mk -include %D%/mfcalc/local.mk -include %D%/rpcalc/local.mk diff --git a/examples/test b/examples/test index d9177cb1..d9fad7d2 100755 --- a/examples/test +++ b/examples/test @@ -16,7 +16,7 @@ # along with this program. If not, see . me=$(basename "$1" .test) -medir=$(basename "$(dirname "$1")") +medir=$(dirname "$1" | sed -e 's,.*examples/,,') # Number of the current test. number=1 @@ -28,7 +28,7 @@ exit=true cwd=$(pwd) # The exercised program. -for p in "$cwd/examples/$medir/$me" "$cwd/examples/$me" +for p in "$cwd/examples/$medir/$me" do if test -x "$p"; then prog=$p @@ -40,7 +40,8 @@ do fi done if test x"$prog" = x; then - echo "$me: ERROR: cannot find program to exercise" + echo "$me: ERROR: cannot find program to exercise in:" + echo "$me: ERROR: $cwd/examples/$medir/$me" exit 1 fi