mirror of
https://git.savannah.gnu.org/git/bison.git
synced 2026-03-14 14:53: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:
@@ -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 */
|
||||
%%
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
Reference in New Issue
Block a user