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:
Akim Demaille
2008-08-07 23:15:34 +02:00
parent c85be41a07
commit d78f0ac9d8
9 changed files with 195 additions and 40 deletions

View File

@@ -106,11 +106,11 @@ static void unget_char (]AT_LEX_PRE_FORMALS[ int c);
%token <ival> NUM "number"
%type <ival> exp
%nonassoc '=' /* comparison */
%nonassoc '=' /* comparison */
%left '-' '+'
%left '*' '/'
%left NEG /* negation--unary minus */
%right '^' /* exponentiation */
%precedence NEG /* negation--unary minus */
%right '^' /* exponentiation */
/* Grammar follows */
%%

View File

@@ -1,6 +1,6 @@
# Exercising Bison on conflicts. -*- Autotest -*-
# Copyright (C) 2002, 2003, 2004, 2005, 2007 Free Software Foundation, Inc.
# Copyright (C) 2002, 2003, 2004, 2005, 2007, 2008 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
@@ -326,6 +326,62 @@ state 5
AT_CLEANUP
## ---------------------- ##
## %precedence suffices. ##
## ---------------------- ##
AT_SETUP([%precedence suffices])
AT_DATA([input.y],
[[%precedence "then"
%precedence "else"
%%
stmt:
"if" cond "then" stmt
| "if" cond "then" stmt "else" stmt
| "stmt"
;
cond:
"exp"
;
]])
AT_BISON_CHECK([-o input.c input.y])
AT_CLEANUP
## ------------------------------ ##
## %precedence does not suffice. ##
## ------------------------------ ##
AT_SETUP([%precedence does not suffice])
AT_DATA([input.y],
[[%precedence "then"
%precedence "else"
%%
stmt:
"if" cond "then" stmt
| "if" cond "then" stmt "else" stmt
| "stmt"
;
cond:
"exp"
| cond "then" cond
;
]])
AT_BISON_CHECK([-o input.c input.y], 0, [],
[[input.y: conflicts: 1 shift/reduce
input.y:12.3-18: warning: rule useless in parser due to conflicts: cond: cond "then" cond
]])
AT_CLEANUP
## -------------------------------- ##
## Defaulted Conflicted Reduction. ##
## -------------------------------- ##
@@ -878,7 +934,7 @@ AT_CHECK([[cat input.output | sed -n '/^state 0$/,/^state 1$/p']], 0,
13 empty_c3: . ['c']
'b' shift, and go to state 1
'c' reduce using rule 13 (empty_c3)
$default reduce using rule 9 (empty_a)