* bootstrap (gnulib_modules): Add strverscmp.

* lib/.cvsignore: Add strverscmp.c, strverscmp.h.
* m4/.cvsignore: Add strverscmp.m4.
* src/parse-gram.y (%require): New token, new rule.
(version_check): New.
* src/scan-gram.l (%require): Adjust.
* tests/input.at (AT_REQUIRE): New.
Use it.
* doc/bison.texinfo (Require Decl): New.
(Calc++ Parser): Use %require.
This commit is contained in:
Akim Demaille
2005-10-02 18:49:15 +00:00
parent 21667f64cd
commit b50d2359d7
11 changed files with 491 additions and 380 deletions

View File

@@ -1,3 +1,16 @@
2005-10-02 Akim Demaille <akim@epita.fr>
* bootstrap (gnulib_modules): Add strverscmp.
* lib/.cvsignore: Add strverscmp.c, strverscmp.h.
* m4/.cvsignore: Add strverscmp.m4.
* src/parse-gram.y (%require): New token, new rule.
(version_check): New.
* src/scan-gram.l (%require): Adjust.
* tests/input.at (AT_REQUIRE): New.
Use it.
* doc/bison.texinfo (Require Decl): New.
(Calc++ Parser): Use %require.
2005-10-02 Akim Demaille <akim@epita.fr>
* data/location.cc: New.

8
NEWS
View File

@@ -5,6 +5,9 @@ Changes in version 2.1a:
* DJGPP support added.
* %require "VERSION"
To specify the youngest version of Bison accepted by the grammar file.
* lalr1.cc: The token and value types are now class members.
The tokens where defined as free form enums and cpp macros. YYSTYPE
was defined as a free form union. Both are now class members:
@@ -13,8 +16,11 @@ Changes in version 2.1a:
If you do not want or can update to this scheme, the directive
`%define "global_tokens_and_yystype" "1"' triggers the global
definition of tokens and YYSTYPE.
definition of tokens and YYSTYPE. This change is suitable both
for previous releases of Bison, and this one.
If you wish to update, then make sure older version of Bison will
fail using `%require "2.1a"'.
Changes in version 2.1, 2005-09-16:

View File

@@ -110,6 +110,7 @@ stdio-safer
stpcpy
strerror
strtoul
strverscmp
unistd-safer
verify
xalloc

View File

@@ -145,9 +145,9 @@ The Concepts of Bison
Writing @acronym{GLR} Parsers
* Simple GLR Parsers:: Using @acronym{GLR} parsers on unambiguous grammars
* Merging GLR Parses:: Using @acronym{GLR} parsers to resolve ambiguities
* Compiler Requirements:: @acronym{GLR} parsers require a modern C compiler
* Simple GLR Parsers:: Using @acronym{GLR} parsers on unambiguous grammars
* Merging GLR Parses:: Using @acronym{GLR} parsers to resolve ambiguities
* Compiler Requirements:: @acronym{GLR} parsers require a modern C compiler
Examples
@@ -225,6 +225,7 @@ Tracking Locations
Bison Declarations
* Require Decl:: Requiring a Bison version.
* Token Decl:: Declaring terminal symbols.
* Precedence Decl:: Declaring terminals with precedence and associativity.
* Union Decl:: Declaring the set of all semantic value types.
@@ -732,9 +733,9 @@ user-defined function on the resulting values to produce an arbitrary
merged result.
@menu
* Simple GLR Parsers:: Using @acronym{GLR} parsers on unambiguous grammars
* Merging GLR Parses:: Using @acronym{GLR} parsers to resolve ambiguities
* Compiler Requirements:: @acronym{GLR} parsers require a modern C compiler
* Simple GLR Parsers:: Using @acronym{GLR} parsers on unambiguous grammars
* Merging GLR Parses:: Using @acronym{GLR} parsers to resolve ambiguities
* Compiler Requirements:: @acronym{GLR} parsers require a modern C compiler
@end menu
@node Simple GLR Parsers
@@ -3548,6 +3549,7 @@ it explicitly (@pxref{Language and Grammar, ,Languages and Context-Free
Grammars}).
@menu
* Require Decl:: Requiring a Bison version.
* Token Decl:: Declaring terminal symbols.
* Precedence Decl:: Declaring terminals with precedence and associativity.
* Union Decl:: Declaring the set of all semantic value types.
@@ -3560,6 +3562,19 @@ Grammars}).
* Decl Summary:: Table of all Bison declarations.
@end menu
@node Require Decl
@subsection Require a Version of Bison
@cindex version requirement
@cindex requiring a version of Bison
@findex %require
You may require the minimum version of Bison to process the grammar. If
the requirement is not met, @command{bison} exits with an error.
@example
%require "@var{version}"
@end example
@node Token Decl
@subsection Token Type Names
@cindex declaring token type names
@@ -4157,6 +4172,12 @@ Request a pure (reentrant) parser program (@pxref{Pure Decl, ,A Pure
(Reentrant) Parser}).
@end deffn
@deffn {Directive} %require "@var{version}"
Specify that version @var{version} or higher of Bison required for the
grammar.
@xref{Require Decl, , Require a Version of Bison}.
@end deffn
@deffn {Directive} %token-table
Generate an array of token names in the parser file. The name of the
array is @code{yytname}; @code{yytname[@var{i}]} is the name of the
@@ -7275,13 +7296,16 @@ calcxx_driver::error (const std::string& m)
@node Calc++ Parser
@subsection Calc++ Parser
The parser definition file @file{calc++-parser.yy} starts by asking
for the C++ LALR(1) skeleton, the creation of the parser header file, and
specifies the name of the parser class.
The parser definition file @file{calc++-parser.yy} starts by asking for
the C++ LALR(1) skeleton, the creation of the parser header file, and
specifies the name of the parser class. Because the C++ skeleton
changed several times, it is safer to require the version you designed
the grammar for.
@comment file: calc++-parser.yy
@example
%skeleton "lalr1.cc" /* -*- C++ -*- */
%require "2.1a"
%defines
%define "parser_class_name" "calcxx_parser"
@end example
@@ -7968,6 +7992,12 @@ Bison declaration to request a pure (reentrant) parser.
@xref{Pure Decl, ,A Pure (Reentrant) Parser}.
@end deffn
@deffn {Directive} %require "@var{version}"
Specify that version @var{version} or higher of Bison required for the
grammar.
@xref{Require Decl, , Require a Version of Bison}.
@end deffn
@deffn {Directive} %right
Bison declaration to assign right associativity to token(s).
@xref{Precedence Decl, ,Operator Precedence}.

View File

@@ -54,6 +54,8 @@ strnlen.c
strnlen.h
strtol.c
strtoul.c
strverscmp.c
strverscmp.h
unistd--.h
unistd-safer.h
unlocked-io.h

View File

@@ -30,6 +30,7 @@ strndup.m4
strnlen.m4
strtol.m4
strtoul.m4
strverscmp.m4
unistd-safer.m4
unlocked-io.m4
xalloc.m4

File diff suppressed because it is too large Load Diff

View File

@@ -63,21 +63,22 @@
PERCENT_OUTPUT = 288,
PERCENT_PARSE_PARAM = 289,
PERCENT_PURE_PARSER = 290,
PERCENT_SKELETON = 291,
PERCENT_START = 292,
PERCENT_TOKEN_TABLE = 293,
PERCENT_VERBOSE = 294,
PERCENT_YACC = 295,
TYPE = 296,
EQUAL = 297,
SEMICOLON = 298,
PIPE = 299,
ID = 300,
ID_COLON = 301,
PERCENT_PERCENT = 302,
PROLOGUE = 303,
EPILOGUE = 304,
BRACED_CODE = 305
PERCENT_REQUIRE = 291,
PERCENT_SKELETON = 292,
PERCENT_START = 293,
PERCENT_TOKEN_TABLE = 294,
PERCENT_VERBOSE = 295,
PERCENT_YACC = 296,
TYPE = 297,
EQUAL = 298,
SEMICOLON = 299,
PIPE = 300,
ID = 301,
ID_COLON = 302,
PERCENT_PERCENT = 303,
PROLOGUE = 304,
EPILOGUE = 305,
BRACED_CODE = 306
};
#endif
/* Tokens. */
@@ -115,27 +116,28 @@
#define PERCENT_OUTPUT 288
#define PERCENT_PARSE_PARAM 289
#define PERCENT_PURE_PARSER 290
#define PERCENT_SKELETON 291
#define PERCENT_START 292
#define PERCENT_TOKEN_TABLE 293
#define PERCENT_VERBOSE 294
#define PERCENT_YACC 295
#define TYPE 296
#define EQUAL 297
#define SEMICOLON 298
#define PIPE 299
#define ID 300
#define ID_COLON 301
#define PERCENT_PERCENT 302
#define PROLOGUE 303
#define EPILOGUE 304
#define BRACED_CODE 305
#define PERCENT_REQUIRE 291
#define PERCENT_SKELETON 292
#define PERCENT_START 293
#define PERCENT_TOKEN_TABLE 294
#define PERCENT_VERBOSE 295
#define PERCENT_YACC 296
#define TYPE 297
#define EQUAL 298
#define SEMICOLON 299
#define PIPE 300
#define ID 301
#define ID_COLON 302
#define PERCENT_PERCENT 303
#define PROLOGUE 304
#define EPILOGUE 305
#define BRACED_CODE 306
#if ! defined (YYSTYPE) && ! defined (YYSTYPE_IS_DECLARED)
#line 79 "../../src/parse-gram.y"
#line 82 "../../src/parse-gram.y"
typedef union YYSTYPE {
symbol *symbol;
symbol_list *list;
@@ -145,7 +147,7 @@ typedef union YYSTYPE {
uniqstr uniqstr;
} YYSTYPE;
/* Line 1505 of yacc.c. */
#line 149 "../../src/parse-gram.h"
#line 151 "../../src/parse-gram.h"
# define yystype YYSTYPE /* obsolescent; will be withdrawn */
# define YYSTYPE_IS_DECLARED 1
# define YYSTYPE_IS_TRIVIAL 1

View File

@@ -32,6 +32,7 @@
#include "quotearg.h"
#include "reader.h"
#include "symlist.h"
#include "strverscmp.h"
#define YYLLOC_DEFAULT(Current, Rhs, N) (Current) = lloc_default (Rhs, N)
static YYLTYPE lloc_default (YYLTYPE const *, int);
@@ -39,6 +40,8 @@ static YYLTYPE lloc_default (YYLTYPE const *, int);
#define YY_LOCATION_PRINT(File, Loc) \
location_print (File, Loc)
static void version_check (location const *loc, char const *version);
/* Request detailed syntax error messages, and pass them to GRAM_ERROR.
FIXME: depends on the undocumented availability of YYLLOC. */
#undef yyerror
@@ -133,6 +136,7 @@ static int current_prec = 0;
PERCENT_OUTPUT "%output"
PERCENT_PARSE_PARAM "%parse-param {...}"
PERCENT_PURE_PARSER "%pure-parser"
PERCENT_REQUIRE "%require"
PERCENT_SKELETON "%skeleton"
PERCENT_START "%start"
PERCENT_TOKEN_TABLE "%token-table"
@@ -226,6 +230,7 @@ declaration:
| "%output" "=" string_content { spec_outfile = $3; }
| "%parse-param {...}" { add_param ("parse_param", $1, @1); }
| "%pure-parser" { pure_parser = true; }
| "%require" string_content { version_check (&@2, $2); }
| "%skeleton" string_content { skeleton = $2; }
| "%token-table" { token_table_flag = true; }
| "%verbose" { report_flag = report_states; }
@@ -530,6 +535,14 @@ add_param (char const *type, char *decl, location loc)
scanner_last_string_free ();
}
static void
version_check (location const *loc, char const *version)
{
if (strverscmp (version, PACKAGE_VERSION) > 0)
complain_at (*loc, "require bison %s, but have %s",
version, PACKAGE_VERSION);
}
static void
gram_error (location const *loc, char const *msg)
{

View File

@@ -224,6 +224,7 @@ splice (\\[ \f\t\v]*\n)*
"%prec" rule_length--; return PERCENT_PREC;
"%printer" token_type = PERCENT_PRINTER; BEGIN SC_PRE_CODE;
"%pure"[-_]"parser" return PERCENT_PURE_PARSER;
"%require" return PERCENT_REQUIRE;
"%right" return PERCENT_RIGHT;
"%skeleton" return PERCENT_SKELETON;
"%start" return PERCENT_START;

View File

@@ -297,3 +297,24 @@ exp: "MY TOKEN";
AT_CHECK([bison -o input.c input.y])
AT_CLEANUP
## --------- ##
## Require. ##
## --------- ##
m4_define([AT_CHECK_REQUIRE],
[AT_SETUP([Require $1])
AT_DATA_GRAMMAR([input.y],
[[%require "$1";
%%
empty_file:;
]])
AT_CHECK([bison -o input.c input.y], $2, [], ignore)
AT_CLEANUP
])
AT_CHECK_REQUIRE(1.0, 0)
AT_CHECK_REQUIRE(AT_PACKAGE_VERSION, 0)
## FIXME: Some day augment this version number.
AT_CHECK_REQUIRE(100.0, 1)