mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-17 16:23:04 +00:00
examples: remove stray examples
* examples/c/reentrant-calc: Remove. I did not mean to include this example, it was replaced by examples/c/reccalc.
This commit is contained in:
@@ -44,7 +44,7 @@ do
|
|||||||
done
|
done
|
||||||
echo "$input" > input
|
echo "$input" > input
|
||||||
run 0 '0'
|
run 0 '0'
|
||||||
|
|
||||||
cat >input <<EOF
|
cat >input <<EOF
|
||||||
() + ()
|
() + ()
|
||||||
EOF
|
EOF
|
||||||
|
|||||||
@@ -1,35 +0,0 @@
|
|||||||
# This Makefile is designed to be simple and readable. It does not
|
|
||||||
# aim at portability. It requires GNU Make.
|
|
||||||
|
|
||||||
BASE = lexcalc
|
|
||||||
BISON = bison
|
|
||||||
FLEX = flex
|
|
||||||
XSLTPROC = xsltproc
|
|
||||||
|
|
||||||
all: $(BASE)
|
|
||||||
|
|
||||||
%.c %.h %.xml %.gv: %.y
|
|
||||||
$(BISON) $(BISONFLAGS) --defines --xml --graph=$*.gv -o $*.c $<
|
|
||||||
|
|
||||||
%.c %.h: %.l
|
|
||||||
$(FLEX) $(FLEXFLAGS) -o$*.c --header-file=$*.h $<
|
|
||||||
|
|
||||||
scan.o: parse.h
|
|
||||||
parse.o: scan.h
|
|
||||||
$(BASE): parse.o scan.o
|
|
||||||
$(CC) $(CFLAGS) -o $@ $^
|
|
||||||
|
|
||||||
run: $(BASE)
|
|
||||||
@echo "Type arithmetic expressions. Quit with ctrl-d."
|
|
||||||
./$<
|
|
||||||
|
|
||||||
html: parse.html
|
|
||||||
%.html: %.xml
|
|
||||||
$(XSLTPROC) $(XSLTPROCFLAGS) -o $@ $$($(BISON) --print-datadir)/xslt/xml2xhtml.xsl $<
|
|
||||||
|
|
||||||
CLEANFILES = \
|
|
||||||
$(BASE) *.o \
|
|
||||||
parse.[ch] parse.output parse.xml parse.html parse.gv \
|
|
||||||
scan.c
|
|
||||||
clean:
|
|
||||||
rm -f $(CLEANFILES)
|
|
||||||
@@ -1,28 +0,0 @@
|
|||||||
# lexcalc - calculator with Flex and Bison
|
|
||||||
|
|
||||||
This directory contains lexcalc, the traditional example of using Flex and
|
|
||||||
Bison to build a simple calculator.
|
|
||||||
|
|
||||||
<!---
|
|
||||||
Local Variables:
|
|
||||||
fill-column: 76
|
|
||||||
ispell-dictionary: "american"
|
|
||||||
End:
|
|
||||||
|
|
||||||
Copyright (C) 2018-2019 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/>.
|
|
||||||
--->
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
#! /bin/sh
|
|
||||||
|
|
||||||
# Copyright (C) 2018-2019 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 <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
cat >input <<EOF
|
|
||||||
1+2*3
|
|
||||||
EOF
|
|
||||||
run 0 7
|
|
||||||
|
|
||||||
cat >input <<EOF
|
|
||||||
(1+2) * 3
|
|
||||||
EOF
|
|
||||||
run 0 9
|
|
||||||
run -noerr 0 9 -p
|
|
||||||
|
|
||||||
cat >input <<EOF
|
|
||||||
(((1)+(2))*((3)+(4)))
|
|
||||||
EOF
|
|
||||||
run 0 21
|
|
||||||
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
## Copyright (C) 2018-2019 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 <http://www.gnu.org/licenses/>.
|
|
||||||
|
|
||||||
lexcalcdir = $(docdir)/%D%
|
|
||||||
|
|
||||||
## ------ ##
|
|
||||||
## Calc. ##
|
|
||||||
## ------ ##
|
|
||||||
|
|
||||||
check_PROGRAMS += %D%/lexcalc
|
|
||||||
TESTS += %D%/lexcalc.test
|
|
||||||
EXTRA_DIST += %D%/lexcalc.test %D%/scan.l
|
|
||||||
%C%_lexcalc_SOURCES = %D%/parse.y %D%/parse.h
|
|
||||||
nodist_%C%_lexcalc_SOURCES = %D%/scan.c %D%/scan.h
|
|
||||||
%D%/lexcalc.c: $(dependencies)
|
|
||||||
|
|
||||||
%D%/scan.c: %D%/scan.l
|
|
||||||
$(AM_V_LEX) $(LEX) -o %D%/scan.c --header-file=%D%/scan.h $<
|
|
||||||
|
|
||||||
# Don't use gnulib's system headers.
|
|
||||||
%C%_lexcalc_CPPFLAGS = -I$(top_srcdir)/%D% -I$(top_builddir)/%D%
|
|
||||||
|
|
||||||
dist_lexcalc_DATA = %D%/parse.y %D%/scan.l %D%/Makefile %D%/README.md
|
|
||||||
CLEANFILES += %D%/lexcalc %D%/*.o %D%/parse.c %D%/scan.c
|
|
||||||
CLEANDIRS += %D%/*.dSYM
|
|
||||||
@@ -1,160 +0,0 @@
|
|||||||
// Prologue (directives).
|
|
||||||
%expect 0
|
|
||||||
|
|
||||||
// Emitted in the header file, before the definition of YYSTYPE.
|
|
||||||
%code requires
|
|
||||||
{
|
|
||||||
typedef void* yyscan_t;
|
|
||||||
typedef struct
|
|
||||||
{
|
|
||||||
// Whether to print the intermediate results.
|
|
||||||
int verbose;
|
|
||||||
// Value of the last computation.
|
|
||||||
int value;
|
|
||||||
// Number of errors.
|
|
||||||
int nerrs;
|
|
||||||
} result;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Emitted in the header file, after the definition of YYSTYPE.
|
|
||||||
%code provides
|
|
||||||
{
|
|
||||||
// Tell Flex the expected prototype of yylex.
|
|
||||||
// The scanner argument must be named yyscanner.
|
|
||||||
#define YY_DECL \
|
|
||||||
enum yytokentype yylex (YYSTYPE* yylval, yyscan_t yyscanner, result *res)
|
|
||||||
YY_DECL;
|
|
||||||
|
|
||||||
void yyerror (yyscan_t scanner, result *res, const char *msg);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Emitted on top of the implementation file.
|
|
||||||
%code top
|
|
||||||
{
|
|
||||||
#include <stdio.h> /* printf. */
|
|
||||||
#include <stdlib.h> /* getenv. */
|
|
||||||
}
|
|
||||||
|
|
||||||
%code
|
|
||||||
{
|
|
||||||
result parse_string (const char* cp);
|
|
||||||
result parse (void);
|
|
||||||
}
|
|
||||||
|
|
||||||
%define api.pure full
|
|
||||||
%define api.token.prefix {TOK_}
|
|
||||||
%define api.value.type union
|
|
||||||
%define parse.error verbose
|
|
||||||
%define parse.trace
|
|
||||||
// Scanner and error count are exchanged between main, yyparse and yylex.
|
|
||||||
%param {yyscan_t scanner}{result *res}
|
|
||||||
|
|
||||||
%token
|
|
||||||
PLUS "+"
|
|
||||||
MINUS "-"
|
|
||||||
STAR "*"
|
|
||||||
SLASH "/"
|
|
||||||
EOL "end-of-line"
|
|
||||||
EOF 0 "end-of-file"
|
|
||||||
;
|
|
||||||
|
|
||||||
%token <int> NUM "number"
|
|
||||||
%type <int> exp line
|
|
||||||
%printer { fprintf (yyo, "%d", $$); } <int>
|
|
||||||
|
|
||||||
%token <char*> STR "string"
|
|
||||||
%printer { fprintf (yyo, "\"%s\"", $$); } <char*>
|
|
||||||
|
|
||||||
// Precedence (from lowest to highest) and associativity.
|
|
||||||
%left "+" "-"
|
|
||||||
%left "*" "/"
|
|
||||||
|
|
||||||
%%
|
|
||||||
// Rules.
|
|
||||||
input:
|
|
||||||
%empty
|
|
||||||
| input line
|
|
||||||
{
|
|
||||||
res->value = $line;
|
|
||||||
if (res->verbose)
|
|
||||||
printf ("%d\n", $line);
|
|
||||||
}
|
|
||||||
;
|
|
||||||
|
|
||||||
line:
|
|
||||||
exp EOL { $$ = $1; }
|
|
||||||
| exp { $$ = $1; }
|
|
||||||
| error EOL { $$ = 0; yyerrok; }
|
|
||||||
;
|
|
||||||
|
|
||||||
exp:
|
|
||||||
exp "+" exp { $$ = $1 + $3; }
|
|
||||||
| exp "-" exp { $$ = $1 - $3; }
|
|
||||||
| exp "*" exp { $$ = $1 * $3; }
|
|
||||||
| exp "/" exp
|
|
||||||
{
|
|
||||||
if ($3 == 0)
|
|
||||||
{
|
|
||||||
yyerror (scanner, res, "invalid division by zero");
|
|
||||||
YYERROR;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
$$ = $1 / $3;
|
|
||||||
}
|
|
||||||
| STR
|
|
||||||
{
|
|
||||||
result r = parse_string ($1);
|
|
||||||
free ($1);
|
|
||||||
if (r.nerrs)
|
|
||||||
{
|
|
||||||
res->nerrs += r.nerrs;
|
|
||||||
YYERROR;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
$$ = r.value;
|
|
||||||
}
|
|
||||||
| NUM { $$ = $1; }
|
|
||||||
;
|
|
||||||
%%
|
|
||||||
#include "scan.h"
|
|
||||||
|
|
||||||
result
|
|
||||||
parse (void)
|
|
||||||
{
|
|
||||||
result res = {1, 0, 0};
|
|
||||||
yyscan_t scanner;
|
|
||||||
yylex_init (&scanner);
|
|
||||||
yyparse (scanner, &res);
|
|
||||||
yylex_destroy (scanner);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
result
|
|
||||||
parse_string (const char *str)
|
|
||||||
{
|
|
||||||
result res = {0, 0, 0};
|
|
||||||
yyscan_t scanner;
|
|
||||||
yylex_init (&scanner);
|
|
||||||
YY_BUFFER_STATE buf = yy_scan_string (str, scanner);
|
|
||||||
yyparse (scanner, &res);
|
|
||||||
yy_delete_buffer(buf, scanner);
|
|
||||||
yylex_destroy (scanner);
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Epilogue (C code).
|
|
||||||
void yyerror (yyscan_t scanner, result *res, const char *msg)
|
|
||||||
{
|
|
||||||
(void) scanner;
|
|
||||||
fprintf (stderr, "%s\n", msg);
|
|
||||||
res->nerrs += 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
int main (void)
|
|
||||||
{
|
|
||||||
// Possibly enable parser runtime debugging.
|
|
||||||
yydebug = !!getenv ("YYDEBUG");
|
|
||||||
result res = parse ();
|
|
||||||
// Exit on failure if there were errors.
|
|
||||||
return !!res.nerrs;
|
|
||||||
}
|
|
||||||
@@ -1,81 +0,0 @@
|
|||||||
/* Prologue (directives). -*- C++ -*- */
|
|
||||||
|
|
||||||
/* Disable Flex features we don't need, to avoid warnings. */
|
|
||||||
%option nodefault noinput nounput noyywrap
|
|
||||||
|
|
||||||
%option reentrant
|
|
||||||
|
|
||||||
%{
|
|
||||||
#include <limits.h> /* INT_MIN */
|
|
||||||
#include <stdlib.h> /* strtol */
|
|
||||||
|
|
||||||
#include "parse.h"
|
|
||||||
%}
|
|
||||||
|
|
||||||
%x SC_STRING
|
|
||||||
|
|
||||||
%%
|
|
||||||
%{
|
|
||||||
int nesting = 0;
|
|
||||||
char *str = NULL;
|
|
||||||
int size = 0;
|
|
||||||
int capacity = 0;
|
|
||||||
#define STR_APPEND() \
|
|
||||||
do { \
|
|
||||||
if (capacity < size + 1) \
|
|
||||||
{ \
|
|
||||||
do \
|
|
||||||
capacity = capacity ? 2 * capacity : 128; \
|
|
||||||
while (capacity < size + 1); \
|
|
||||||
str = realloc (str, capacity); \
|
|
||||||
} \
|
|
||||||
strncpy (str + size, yytext, yyleng); \
|
|
||||||
size += yyleng; \
|
|
||||||
} while (0)
|
|
||||||
%}
|
|
||||||
|
|
||||||
// Rules.
|
|
||||||
|
|
||||||
"+" return TOK_PLUS;
|
|
||||||
"-" return TOK_MINUS;
|
|
||||||
"*" return TOK_STAR;
|
|
||||||
"/" return TOK_SLASH;
|
|
||||||
|
|
||||||
"(" nesting += 1; BEGIN SC_STRING;
|
|
||||||
|
|
||||||
/* Scan an integer. */
|
|
||||||
[0-9]+ {
|
|
||||||
errno = 0;
|
|
||||||
long n = strtol (yytext, NULL, 10);
|
|
||||||
if (! (INT_MIN <= n && n <= INT_MAX && errno != ERANGE))
|
|
||||||
yyerror (yyscanner, res, "integer is out of range");
|
|
||||||
yylval->TOK_NUM = (int) n;
|
|
||||||
return TOK_NUM;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* Ignore white spaces. */
|
|
||||||
[ \t]+ continue;
|
|
||||||
|
|
||||||
"\n" return TOK_EOL;
|
|
||||||
|
|
||||||
. yyerror (yyscanner, res, "syntax error, invalid character");
|
|
||||||
|
|
||||||
<SC_STRING>
|
|
||||||
{
|
|
||||||
"("* nesting += yyleng; STR_APPEND ();
|
|
||||||
")" {
|
|
||||||
if (!--nesting)
|
|
||||||
{
|
|
||||||
BEGIN INITIAL;
|
|
||||||
yylval->TOK_STR = str;
|
|
||||||
return TOK_STR;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
STR_APPEND ();
|
|
||||||
}
|
|
||||||
[^()]+ STR_APPEND ();
|
|
||||||
}
|
|
||||||
|
|
||||||
<<EOF>> return TOK_EOF;
|
|
||||||
%%
|
|
||||||
/* Epilogue (C code). */
|
|
||||||
Reference in New Issue
Block a user