The bistromathic example should not use Flex, it makes it too complex. But it was the only example to show location tracking with Flex. * examples/c/lexcalc/lexcalc.test, examples/c/lexcalc/parse.y, * examples/c/lexcalc/scan.l: Demonstrate location tracking as is done in bistromathic.
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 with precedence directives and location tracking. It uses Flex to generate the scanner.
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.
pushcalc - calculator implemented with a push parser
All the previous examples are so called "pull parsers": the user invokes the parser once, which repeatedly calls the scanner until the input is drained.
This example demonstrates the "push parsers": the user calls the scanner to fetch the next token, passes it to the parser, and repeats the operation until the input is drained.
This example is a straightforward conversion of the 'calc' example to the push-parser model.
bistromathic - all the bells and whistles
This example demonstrates the best practices when using Bison.
- Its interface is pure.
- It uses a custom syntax error with location tracking, lookahead correction and token internationalization.
- It supports debug traces with semantic values.
- It uses named references instead of the traditional $1, $2, etc.
It also uses Flex to generate the scanner.