Files
bison/examples/c
Akim Demaille 4e19ab9fcd yacc.c: provide a means to include the header in the implementation
Currently when --defines is used, we generate a header, and paste an
exact copy of it into the generated parser implementation file.  Let's
provide a means to #include it instead.

We don't do it by default because of the Autotools' ylwrap.  This
program wraps invocations of yacc (that uses a fixed output name:
y.tab.c, y.tab.h, y.output) to support a more modern naming
scheme (dir/foo.y -> dir/foo.tab.c, dir/foo.tab.h, etc.).  It does
that by renaming the generated files, and then by running sed to
propagate these renamings inside the files themselves.

Unfortunately Automake's Makefiles uses Bison as if it were Yacc (with
--yacc or with -o y.tab.c) and invoke bison via ylwrap.  As a
consequence, as far as Bison is concerned, the output files are
y.tab.c and y.tab.h, so it emits '#include "y.tab.h"'.  So far, so
good.  But now ylwrap processes this '#include "y.tab.h"' into
'#include "dir/foo.tab.h"', which is not guaranteed to always work.

So, let's do the Right Thing when the output file is not y.tab.c, in
which case the user should %define api.header.include.  Binding this
behavior to --yacc is tempting, but we recently told people to stop
using --yacc (as it also enables the Yacc warnings), but rather to use
-o y.tab.c.

Yacc.c is the only skeleton concerned: all the others do include their
header.

* data/skeletons/yacc.c (b4_header_include_if): New.
(api.header.include): Provide a default value when the output is not
y.tab.c.
* src/parse-gram.y (api.header.include): Define.
2019-03-17 16:36:05 +01:00
..
2019-02-16 16:51:15 +01:00
2019-02-23 11:42:55 +01:00

Examples in C

This directory contains simple examples of Bison grammar files in C.

Some of them come from the documentation, which should be installed together with Bison. The URLs are provided for convenience.

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.

Extracted from the documentation: "Reverse Polish Notation Calculator" https://www.gnu.org/software/bison/manual/html_node/RPN-Calc.html

calc - Simple Calculator

This example is slightly more complex than rpcalc: it features infix operators (1 + 2, instead of 1 2 + in rpcalc), but it does so using a unambiguous grammar of the arithmetic instead of using precedence directives (%left, etc.).

mfcalc - Multi-Function Calculator

A more complete C example: a multi-function calculator. More complex than the previous example. Using precedence directives to support infix operators.

Extracted from the documentation: "Multi-Function Calculator: mfcalc". https://www.gnu.org/software/bison/manual/html_node/Multi_002dfunction-Calc.html

lexcalc - calculator with Flex and Bison

The calculator, redux. This time using a scanner generated by Flex.

reccalc - recursive calculator with Flex and Bison

The example builds on top of the previous one to provide a reentrant parser. Such parsers can be called concurrently in different threads, or even recursively. To demonstrate this feature, expressions in parentheses are tokenized as strings, and then recursively parsed from the parser. So (((1)+(2))*((3)+(4))) uses eight parsers, with a depth of four.