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> 2003-10-01 Akim Demaille <akim@epita.fr>
VCG no longer supports long_straight_phase. VCG no longer supports long_straight_phase.

4
NEWS
View File

@@ -3,8 +3,8 @@ Bison News
Changes in version 1.875c: Changes in version 1.875c:
* New %default-prec declaration, to enable (the default) or disable * New %no-default-prec declaration, to disable default rule precedences.
default rule precedences. New %default-prec declaration, to reestablish the default.
Changes in version 1.875b, 2003-06-17: 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 @end deffn
@deffn {Directive} %default-prec @deffn {Directive} %default-prec
Specify whether to assign a precedence to rules lacking an Assign a precedence to rules lacking an explicit @code{%prec} modifier
explicit @code{%prec} modifier
(@pxref{Contextual Precedence, ,Context-Dependent Precedence}). (@pxref{Contextual Precedence, ,Context-Dependent Precedence}).
@end deffn @end deffn
@@ -3759,6 +3758,12 @@ and so on. @xref{Multiple Parsers, ,Multiple Parsers in the Same
Program}. Program}.
@end deffn @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 @deffn {Directive} %no-parser
Do not include any C code in the parser file; generate tables only. The Do not include any C code in the parser file; generate tables only. The
parser file contains just @code{#define} directives and static variable 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 This kind of problem can be tricky to debug, since one typically
discovers the mistake only by testing the code. 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 this kind of problem systematically. It causes rules that lack a
@code{%prec} modifier to have no precedence, even if the last terminal @code{%prec} modifier to have no precedence, even if the last terminal
symbol mentioned in their components has a declared precedence. 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. for all rules that participate in precedence conflict resolution.
Then you will see any shift/reduce conflict until you tell Bison how 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 to resolve it, either by changing your grammar or by adding an
explicit precedence. This will probably add declarations to the explicit precedence. This will probably add declarations to the
grammar, but it helps to protect against incorrect rule precedences. grammar, but it helps to protect against incorrect rule precedences.
The effect of @code{%default-prec 0;} can be reversed by giving The effect of @code{%no-default-prec;} can be reversed by giving
@code{%default-prec 1;}, which is the default. @code{%default-prec;}, which is the default.
@node Parser States @node Parser States
@section 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}. Equip the parser for debugging. @xref{Decl Summary}.
@end deffn @end deffn
@deffn {Directive} %default-prec @var{state}; @deffn {Directive} %default-prec
Bison declaration to specify whether to assign a precedence to rules Assign a precedence to rules that lack an explicit @samp{%prec}
that lack an explicit @samp{%prec} modifier. @xref{Contextual modifier. @xref{Contextual Precedence, ,Context-Dependent
Precedence, ,Context-Dependent Precedence}. Precedence}.
@end deffn @end deffn
@deffn {Directive} %defines @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}. Bison declaration to rename the external symbols. @xref{Decl Summary}.
@end deffn @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 @deffn {Directive} %no-lines
Bison declaration to avoid generating @code{#line} directives in the Bison declaration to avoid generating @code{#line} directives in the
parser file. @xref{Decl Summary}. parser file. @xref{Decl Summary}.

View File

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

View File

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

View File

@@ -550,11 +550,11 @@ input.y: warning: expected 0 reduce/reduce conflicts
AT_CLEANUP 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]], AT_DATA([[input.y]],
[[%left '+' [[%left '+'
@@ -562,7 +562,7 @@ AT_DATA([[input.y]],
%% %%
%default-prec 0; %no-default-prec;
e: e '+' e e: e '+' e
| e '*' e | e '*' e
@@ -576,11 +576,11 @@ AT_CHECK([bison -o input.c input.y], 0, [],
AT_CLEANUP 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]], AT_DATA([[input.y]],
[[%left '+' [[%left '+'
@@ -588,7 +588,7 @@ AT_DATA([[input.y]],
%% %%
%default-prec 0; %no-default-prec;
e: e '+' e %prec '+' e: e '+' e %prec '+'
| 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]], AT_DATA([[input.y]],
[[%left '+' [[%left '+'
@@ -612,7 +612,7 @@ AT_DATA([[input.y]],
%% %%
%default-prec 1; %default-prec;
e: e '+' e e: e '+' e
| e '*' e | e '*' e