mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-12 05:43:03 +00:00
Add %precedence support.
Unfortunately it is not possible to reuse the %prec directive. This is because to please POSIX, we do not require to end the rules with a semicolon. As a result, foo: bar %prec baz is ambiguous: either a rule which precedence is that of baz, or a rule, and then a declaration of the precedence of the token baz. * doc/bison.texinfo: Document %precedence. (Precedence Only): New. * src/assoc.h, src/assoc.c (precedence_assoc): New. * src/conflicts.c (resolve_sr_conflict): Support it. * src/scan-gram.l, src/parse-gram.y (%precedence): New token. Parse it. * tests/calc.at: Use %precedence for NEG. * tests/conflicts.at (%precedence does not suffice) (%precedence suffices): New tests.
This commit is contained in:
@@ -1,5 +1,5 @@
|
||||
/* Associativity information.
|
||||
Copyright (C) 2002, 2005, 2006 Free Software Foundation, Inc.
|
||||
Copyright (C) 2002, 2005, 2006, 2008 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of Bison, the GNU Compiler Compiler.
|
||||
|
||||
@@ -41,5 +41,8 @@ assoc_to_string (assoc a)
|
||||
|
||||
case non_assoc:
|
||||
return "%nonassoc";
|
||||
|
||||
case precedence_assoc:
|
||||
return "%precedence";
|
||||
}
|
||||
}
|
||||
|
||||
11
src/assoc.h
11
src/assoc.h
@@ -1,5 +1,5 @@
|
||||
/* Associativity information.
|
||||
Copyright (C) 2002, 2006 Free Software Foundation, Inc.
|
||||
Copyright (C) 2002, 2006, 2008 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of Bison, the GNU Compiler Compiler.
|
||||
|
||||
@@ -22,10 +22,11 @@
|
||||
/* Associativity values for tokens and rules. */
|
||||
typedef enum
|
||||
{
|
||||
undef_assoc,
|
||||
right_assoc,
|
||||
left_assoc,
|
||||
non_assoc
|
||||
undef_assoc, /** Not defined. */
|
||||
right_assoc, /** %right */
|
||||
left_assoc, /** %left */
|
||||
non_assoc, /** %nonassoc */
|
||||
precedence_assoc /** %precedence */
|
||||
} assoc;
|
||||
|
||||
char const *assoc_to_string (assoc a);
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/* Find and resolve or report lookahead conflicts for bison,
|
||||
|
||||
Copyright (C) 1984, 1989, 1992, 2000, 2001, 2002, 2003, 2004, 2005, 2006,
|
||||
2007 Free Software Foundation, Inc.
|
||||
2007, 2008 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of Bison, the GNU Compiler Compiler.
|
||||
|
||||
@@ -285,16 +285,21 @@ resolve_sr_conflict (state *s, int ruleno, symbol **errors, int *nerrs)
|
||||
flush_reduce (lookahead_tokens, i);
|
||||
}
|
||||
else
|
||||
/* Matching precedence levels.
|
||||
For left association, keep only the reduction.
|
||||
For right association, keep only the shift.
|
||||
For nonassociation, keep neither. */
|
||||
/* Matching precedence levels.
|
||||
For non-defined associativity, keep both: unexpected
|
||||
associativity conflict.
|
||||
For left associativity, keep only the reduction.
|
||||
For right associativity, keep only the shift.
|
||||
For nonassociativity, keep neither. */
|
||||
|
||||
switch (symbols[i]->assoc)
|
||||
{
|
||||
default:
|
||||
case undef_assoc:
|
||||
abort ();
|
||||
|
||||
case precedence_assoc:
|
||||
break;
|
||||
|
||||
case right_assoc:
|
||||
log_resolution (redrule, i, right_resolution);
|
||||
flush_reduce (lookahead_tokens, i);
|
||||
|
||||
@@ -115,6 +115,7 @@ static int current_prec = 0;
|
||||
%token PERCENT_LEFT "%left"
|
||||
%token PERCENT_RIGHT "%right"
|
||||
%token PERCENT_NONASSOC "%nonassoc"
|
||||
%token PERCENT_PRECEDENCE "%precedence"
|
||||
|
||||
%token PERCENT_PREC "%prec"
|
||||
%token PERCENT_DPREC "%dprec"
|
||||
@@ -412,9 +413,10 @@ precedence_declaration:
|
||||
;
|
||||
|
||||
precedence_declarator:
|
||||
"%left" { $$ = left_assoc; }
|
||||
| "%right" { $$ = right_assoc; }
|
||||
| "%nonassoc" { $$ = non_assoc; }
|
||||
"%left" { $$ = left_assoc; }
|
||||
| "%right" { $$ = right_assoc; }
|
||||
| "%nonassoc" { $$ = non_assoc; }
|
||||
| "%precedence" { $$ = precedence_assoc; }
|
||||
;
|
||||
|
||||
type.opt:
|
||||
|
||||
@@ -183,6 +183,7 @@ splice (\\[ \f\t\v]*\n)*
|
||||
"%output" return PERCENT_OUTPUT;
|
||||
"%parse-param" return PERCENT_PARSE_PARAM;
|
||||
"%prec" return PERCENT_PREC;
|
||||
"%precedence" return PERCENT_PRECEDENCE;
|
||||
"%printer" return PERCENT_PRINTER;
|
||||
"%pure"[-_]"parser" return PERCENT_PURE_PARSER;
|
||||
"%require" return PERCENT_REQUIRE;
|
||||
|
||||
Reference in New Issue
Block a user