mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-09 12:23:04 +00:00
examples: calc++: a Makefile and a README
* examples/calc++/Makefile, examples/calc++/README: New. * examples/calc++/local.mk: Ship and install them. * doc/bison.texi: Formatting changes.
This commit is contained in:
1
README
1
README
@@ -41,6 +41,7 @@ note that the range specifies every single year in that closed interval.
|
|||||||
|
|
||||||
Local Variables:
|
Local Variables:
|
||||||
mode: outline
|
mode: outline
|
||||||
|
fill-column: 76
|
||||||
End:
|
End:
|
||||||
|
|
||||||
Copyright (C) 1992, 1998-1999, 2003-2005, 2008-2015, 2018 Free Software
|
Copyright (C) 1992, 1998-1999, 2003-2005, 2008-2015, 2018 Free Software
|
||||||
|
|||||||
@@ -11066,14 +11066,13 @@ use characters such as @code{':'}, they must be declared with @code{%token}.
|
|||||||
@node A Complete C++ Example
|
@node A Complete C++ Example
|
||||||
@subsection A Complete C++ Example
|
@subsection A Complete C++ Example
|
||||||
|
|
||||||
This section demonstrates the use of a C++ parser with a simple but
|
This section demonstrates the use of a C++ parser with a simple but complete
|
||||||
complete example. This example should be available on your system,
|
example. This example should be available on your system, ready to compile,
|
||||||
ready to compile, in the directory @dfn{.../bison/examples/calc++}. It
|
in the directory @dfn{.../share/doc/bison/examples/calc++}. It focuses on
|
||||||
focuses on the use of Bison, therefore the design of the various C++
|
the use of Bison, therefore the design of the various C++ classes is very
|
||||||
classes is very naive: no accessors, no encapsulation of members etc.
|
naive: no accessors, no encapsulation of members etc. We will use a Lex
|
||||||
We will use a Lex scanner, and more precisely, a Flex scanner, to
|
scanner, and more precisely, a Flex scanner, to demonstrate the various
|
||||||
demonstrate the various interactions. A hand-written scanner is
|
interactions. A hand-written scanner is actually easier to interface with.
|
||||||
actually easier to interface with.
|
|
||||||
|
|
||||||
@menu
|
@menu
|
||||||
* Calc++ --- C++ Calculator:: The specifications
|
* Calc++ --- C++ Calculator:: The specifications
|
||||||
@@ -11086,11 +11085,10 @@ actually easier to interface with.
|
|||||||
@node Calc++ --- C++ Calculator
|
@node Calc++ --- C++ Calculator
|
||||||
@subsubsection Calc++ --- C++ Calculator
|
@subsubsection Calc++ --- C++ Calculator
|
||||||
|
|
||||||
Of course the grammar is dedicated to arithmetics, a single
|
Of course the grammar is dedicated to arithmetics, a single expression,
|
||||||
expression, possibly preceded by variable assignments. An
|
possibly preceded by variable assignments. An environment containing
|
||||||
environment containing possibly predefined variables such as
|
possibly predefined variables such as @code{one} and @code{two}, is
|
||||||
@code{one} and @code{two}, is exchanged with the parser. An example
|
exchanged with the parser. An example of valid input follows.
|
||||||
of valid input follows.
|
|
||||||
|
|
||||||
@example
|
@example
|
||||||
three := 3
|
three := 3
|
||||||
|
|||||||
@@ -5,18 +5,19 @@ A C example of a multi-function calculator. Extracted from the
|
|||||||
documentation.
|
documentation.
|
||||||
|
|
||||||
* calc++
|
* calc++
|
||||||
A C++ version of the canonical example for parsers: a calculator.
|
A C++ version of the canonical example for parsers: a calculator. Also uses
|
||||||
Also uses Flex for the scanner. Extracted from the documentation.
|
Flex for the scanner. Extracted from the documentation.
|
||||||
|
|
||||||
* variant.yy
|
* variant.yy
|
||||||
A C++ example that uses variants (they allow to use any C++ type as
|
A C++ example that uses variants (they allow to use any C++ type as semantic
|
||||||
semantic value type) and symbol constructors (they ensure consistency
|
value type) and symbol constructors (they ensure consistency between
|
||||||
between declared token type and effective semantic value).
|
declared token type and effective semantic value).
|
||||||
|
|
||||||
-----
|
-----
|
||||||
|
|
||||||
Local Variables:
|
Local Variables:
|
||||||
mode: outline
|
mode: outline
|
||||||
|
fill-column: 76
|
||||||
End:
|
End:
|
||||||
|
|
||||||
Copyright (C) 2018 Free Software Foundation, Inc.
|
Copyright (C) 2018 Free Software Foundation, Inc.
|
||||||
|
|||||||
27
examples/calc++/Makefile
Normal file
27
examples/calc++/Makefile
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
# 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
|
||||||
51
examples/calc++/README
Normal file
51
examples/calc++/README
Normal file
@@ -0,0 +1,51 @@
|
|||||||
|
This directory contains calc++, a simple Bison grammar file in C++.
|
||||||
|
|
||||||
|
Please, read the corresponding chapter in the documentation: "A Complete C++
|
||||||
|
Example". It is also available on line (maybe with a different version of
|
||||||
|
Bison):
|
||||||
|
https://www.gnu.org/software/bison/manual/html_node/A-Complete-C_002b_002b-Example.html
|
||||||
|
|
||||||
|
To use it, copy this directory into some work directory, and run `make` to
|
||||||
|
compile the executable, and try it. It is a simple calculator which accepts
|
||||||
|
several variable definitions, one per line, and then a single expression to
|
||||||
|
evaluate.
|
||||||
|
|
||||||
|
The program calc++ expects the file to parse as argument; pass `-` to read
|
||||||
|
the standard input (and then hit <Ctrl-d>, control-d, to end your input).
|
||||||
|
|
||||||
|
$ ./calc++ -
|
||||||
|
one := 1
|
||||||
|
two := 2
|
||||||
|
three := 3
|
||||||
|
(one + two * three) * two * three
|
||||||
|
<Ctrl-d>
|
||||||
|
42
|
||||||
|
|
||||||
|
You may pass `-p` to activate the parser debug traces, and `-s` to activate
|
||||||
|
the scanner's.
|
||||||
|
|
||||||
|
-----
|
||||||
|
|
||||||
|
Local Variables:
|
||||||
|
mode: outline
|
||||||
|
fill-column: 76
|
||||||
|
End:
|
||||||
|
|
||||||
|
Copyright (C) 2018 Free Software Foundation, Inc.
|
||||||
|
|
||||||
|
This file is part of Bison, the GNU Compiler Compiler.
|
||||||
|
|
||||||
|
This program is free software: you can redistribute it and/or modify
|
||||||
|
it under the terms of the GNU General Public License as published by
|
||||||
|
the Free Software Foundation, either version 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/>.
|
||||||
|
|
||||||
|
# LocalWords: mfcalc calc parsers yy MERCHANTABILITY
|
||||||
@@ -83,3 +83,4 @@ endif
|
|||||||
|
|
||||||
calcxxdir = $(docdir)/examples/calc++
|
calcxxdir = $(docdir)/examples/calc++
|
||||||
calcxx_DATA = $(calcxx_extracted)
|
calcxx_DATA = $(calcxx_extracted)
|
||||||
|
dist_calcxx_DATA = %D%/README %D%/Makefile
|
||||||
|
|||||||
Reference in New Issue
Block a user