Use "%no-default-prec" instead of "%default-prec 0".

This commit is contained in:
Paul Eggert
2003-10-01 21:33:24 +00:00
parent fc8f296538
commit 22fccf958f
6 changed files with 52 additions and 30 deletions

View File

@@ -1,3 +1,11 @@
2003-10-01 Paul Eggert <eggert@twinsun.com>
* src/parse-gram.h (PERCENT_NO_DEFAULT_PREC): New token.
(grammar_declaration): Use it.
* src/scan-gram.l: New token %no-default-prec.
* tests/conflicts.at: Revamp tests to use %no-default-prec.
* NEWS, doc/bison.texinfo: Document the above.
2003-10-01 Akim Demaille <akim@epita.fr>
VCG no longer supports long_straight_phase.

4
NEWS
View File

@@ -3,8 +3,8 @@ Bison News
Changes in version 1.875c:
* New %default-prec declaration, to enable (the default) or disable
default rule precedences.
* New %no-default-prec declaration, to disable default rule precedences.
New %default-prec declaration, to reestablish the default.
Changes in version 1.875b, 2003-06-17:

View File

@@ -3684,8 +3684,7 @@ Using it in a way that would be associative is a syntax error.
@end deffn
@deffn {Directive} %default-prec
Specify whether to assign a precedence to rules lacking an
explicit @code{%prec} modifier
Assign a precedence to rules lacking an explicit @code{%prec} modifier
(@pxref{Contextual Precedence, ,Context-Dependent Precedence}).
@end deffn
@@ -3759,6 +3758,12 @@ and so on. @xref{Multiple Parsers, ,Multiple Parsers in the Same
Program}.
@end deffn
@deffn {Directive} %no-default-prec
Do not assign a precedence to rules lacking an explicit @code{%prec}
modifier (@pxref{Contextual Precedence, ,Context-Dependent
Precedence}).
@end deffn
@deffn {Directive} %no-parser
Do not include any C code in the parser file; generate tables only. The
parser file contains just @code{#define} directives and static variable
@@ -4862,20 +4867,20 @@ minus, Bison silently assumes that minus has its usual precedence.
This kind of problem can be tricky to debug, since one typically
discovers the mistake only by testing the code.
The @code{%default-prec 0;} declaration makes it easier to discover
The @code{%no-default-prec;} declaration makes it easier to discover
this kind of problem systematically. It causes rules that lack a
@code{%prec} modifier to have no precedence, even if the last terminal
symbol mentioned in their components has a declared precedence.
If @code{%default-prec 0;} is in effect, you must specify @code{%prec}
If @code{%no-default-prec;} is in effect, you must specify @code{%prec}
for all rules that participate in precedence conflict resolution.
Then you will see any shift/reduce conflict until you tell Bison how
to resolve it, either by changing your grammar or by adding an
explicit precedence. This will probably add declarations to the
grammar, but it helps to protect against incorrect rule precedences.
The effect of @code{%default-prec 0;} can be reversed by giving
@code{%default-prec 1;}, which is the default.
The effect of @code{%no-default-prec;} can be reversed by giving
@code{%default-prec;}, which is the default.
@node Parser States
@section Parser States
@@ -6808,10 +6813,10 @@ parsing. @xref{Parser Function, ,The Parser Function @code{yyparse}}.
Equip the parser for debugging. @xref{Decl Summary}.
@end deffn
@deffn {Directive} %default-prec @var{state};
Bison declaration to specify whether to assign a precedence to rules
that lack an explicit @samp{%prec} modifier. @xref{Contextual
Precedence, ,Context-Dependent Precedence}.
@deffn {Directive} %default-prec
Assign a precedence to rules that lack an explicit @samp{%prec}
modifier. @xref{Contextual Precedence, ,Context-Dependent
Precedence}.
@end deffn
@deffn {Directive} %defines
@@ -6867,6 +6872,12 @@ function is applied to the two semantic values to get a single result.
Bison declaration to rename the external symbols. @xref{Decl Summary}.
@end deffn
@deffn {Directive} %no-default-prec
Do not assign a precedence to rules that lack an explicit @samp{%prec}
modifier. @xref{Contextual Precedence, ,Context-Dependent
Precedence}.
@end deffn
@deffn {Directive} %no-lines
Bison declaration to avoid generating @code{#line} directives in the
parser file. @xref{Decl Summary}.

View File

@@ -126,6 +126,7 @@ int current_prec = 0;
PERCENT_LEX_PARAM "%lex-param {...}"
PERCENT_LOCATIONS "%locations"
PERCENT_NAME_PREFIX "%name-prefix"
PERCENT_NO_DEFAULT_PREC "%no-default-prec"
PERCENT_NO_LINES "%no-lines"
PERCENT_NONDETERMINISTIC_PARSER
"%nondeterministic-parser"
@@ -241,12 +242,13 @@ grammar_declaration:
symbol_printer_set (list->sym, $1, list->location);
symbol_list_free ($2);
}
| "%default-prec" INT
| "%default-prec"
{
if (0 <= $2 && $2 <= 1)
default_prec = $2;
else
complain_at (@1, _("invalid value for `%default-prec'"));
default_prec = true;
}
| "%no-default-prec"
{
default_prec = false;
}
;

View File

@@ -198,6 +198,7 @@ splice (\\[ \f\t\v]*\n)*
"%locations" return PERCENT_LOCATIONS;
"%merge" return PERCENT_MERGE;
"%name"[-_]"prefix" return PERCENT_NAME_PREFIX;
"%no"[-_]"default"[-_]"prec" return PERCENT_NO_DEFAULT_PREC;
"%no"[-_]"lines" return PERCENT_NO_LINES;
"%nonassoc" return PERCENT_NONASSOC;
"%nondeterministic-parser" return PERCENT_NONDETERMINISTIC_PARSER;

View File

@@ -550,11 +550,11 @@ input.y: warning: expected 0 reduce/reduce conflicts
AT_CLEANUP
## ---------------------------- ##
## %default-prec without %prec ##
## ---------------------------- ##
## ------------------------------- ##
## %no-default-prec without %prec ##
## ------------------------------- ##
AT_SETUP([%default-prec without %prec])
AT_SETUP([%no-default-prec without %prec])
AT_DATA([[input.y]],
[[%left '+'
@@ -562,7 +562,7 @@ AT_DATA([[input.y]],
%%
%default-prec 0;
%no-default-prec;
e: e '+' e
| e '*' e
@@ -576,11 +576,11 @@ AT_CHECK([bison -o input.c input.y], 0, [],
AT_CLEANUP
## ------------------------- ##
## %default-prec with %prec ##
## ------------------------- ##
## ---------------------------- ##
## %no-default-prec with %prec ##
## ---------------------------- ##
AT_SETUP([%default-prec with %prec])
AT_SETUP([%no-default-prec with %prec])
AT_DATA([[input.y]],
[[%left '+'
@@ -588,7 +588,7 @@ AT_DATA([[input.y]],
%%
%default-prec 0;
%no-default-prec;
e: e '+' e %prec '+'
| e '*' e %prec '*'
@@ -601,10 +601,10 @@ AT_CLEANUP
## ---------------- ##
## %default-prec 1 ##
## %default-prec ##
## ---------------- ##
AT_SETUP([%default-prec 1])
AT_SETUP([%default-prec])
AT_DATA([[input.y]],
[[%left '+'
@@ -612,7 +612,7 @@ AT_DATA([[input.y]],
%%
%default-prec 1;
%default-prec;
e: e '+' e
| e '*' e