Compare commits

...
20 Commits
Author SHA1 Message Date
Akim Demaille 5163803a63 version 3.3.91
* NEWS: Record release date.
2019-05-12 14:09:10 +02:00
Akim Demaille fee7c78a83 NEWS: update 2019-05-12 14:07:43 +02:00
Akim Demaille 8fc544b03c gnulib: update 2019-05-12 11:39:27 +02:00
Akim Demaille d62d5c4b33 style: remove incorrect comment
* src/getargs.c: here.
It's documented in getargs.h anyway.
2019-05-11 09:19:16 +02:00
Akim Demaille ab3eaff7c4 doc: use colors for diagnostics in TeX too
Thanks to Gavin Smith and Patrice Dumas.
http://lists.gnu.org/archive/html/help-texinfo/2019-04/msg00015.html

* doc/bison.texi (@colorWarning, @colorError, @colorNotice)
(@colorOff): Define for TeX and HTML.
(@dwarning, @derror, @dnotice): Use them.
2019-05-09 19:21:02 +02:00
Akim Demaille 85e83ea968 gnulib: update to fix location tracking in UTF-8 on Solaris
This update contains Bruno Haible's fix for the location tracking
issue reported by Kiyoshi Kanazawa.

https://lists.gnu.org/archive/html/bug-gnulib/2019-05/msg00020.html
https://lists.gnu.org/archive/html/bug-bison/2019-04/msg00020.html
2019-05-08 16:34:31 +02:00
Akim Demaille 0269c6fb03 diagnostics: rename --style=debug as --color=debug
It is more consistent with --color=html, --color=test, etc.

* src/getargs.h, src/getargs.c (style_debug): Rename as...
(color_debug): this.
(getargs_colors): Rename --style=debug as --color=debug.
Adjust dependencies.
2019-05-08 13:36:47 +02:00
Akim Demaille 23e536af49 diagnostics: support --color=html
Based on a message from Bruno Haible.
https://git.savannah.gnu.org/gitweb/?p=gettext.git;a=commitdiff;h=fe18e92743b7226791a5f28d7c786941a1bf8cc9

This does not generate proper HTML: special characters are not escaped
for instance.  This is a hidden feature meant for Bison developers,
not end users.

* src/complain.c (complain_init_color): Support --color=html.
2019-05-08 13:36:47 +02:00
Akim Demaille cd56929097 tests: use %empty instead of comments
* tests/c++.at, tests/glr-regression.at: here.
2019-05-08 09:11:37 +02:00
Akim Demaille 7aa38561f7 fixits: sort them before applying them
An experimental commit introduced a fix-it hint that changes comments
such as "/* empty */" into %empty.  But in some case, because
diagnostics are not necessarily emitted in order, the fixits also come
in disorder, which must never happen, as the fixes are installed in
one pass.

* src/fixits.c (fixits_register): Insert them in order.
2019-05-08 09:10:28 +02:00
Akim Demaille 22a00cfbf2 style: use warning_is_enabled instead of duplicating it
* src/complain.c (deprecated_directive): Here.
2019-05-04 17:50:57 +02:00
Akim Demaille 8c06cb9130 fixits: be sure to preserve the action when adding %empty
Currently we remove the rhs to install %empty instead.

* src/reader.c (grammar_rule_check_and_complete): Insert the missing
%empty in front of the rhs, not in replacement thereof.
* tests/actions.at (Add missing %empty): Check that.
2019-05-03 16:28:28 +02:00
Akim Demaille b5233ba323 tests: don't duplicate the portability prologue
* tests/actions.at, tests/input.at: Don't repeat the prologue, skip it.
* tests/diagnostics.at, tests/local.at: Comment changes.
2019-05-03 16:28:28 +02:00
Akim Demaille 013720f0e7 style: use consistently *_loc for locations
Some members are called foo_location, others are foo_loc.  Stick to
the latter.

* src/gram.h, src/location.h, src/location.c, src/output.c,
* src/parse-gram.y, src/reader.h, src/reader.c, src/reduce.c,
* src/scan-gram.l, src/symlist.h, src/symlist.c, src/symtab.h,
* src/symtab.c:
Use _loc consistently, not _location.
2019-05-03 16:28:28 +02:00
Akim Demaille 365b4d95a4 style: clarify the use of symbol_lists' locations
symbol_list features a 'location' and a 'sym_loc' member.  The former
is expected to be set only for symbol_lists that denote a symbol (not
a type name), and the latter should only denote the location of the
symbol/type name.  Yet both are set, and the name "location" is too
unprecise.

* src/symlist.h, src/symlist.c (symbol_list::location): Rename as
rhs_loc for clarity.  Move it to the "section" of data valid only
for rules.
* src/reader.c, src/scan-code.l: Adjust.
2019-05-03 16:28:28 +02:00
Akim Demaille 5bb44cca81 maint: update gnulib-po/.gitignore 2019-05-03 16:28:28 +02:00
Akim Demaille 15f9f8c853 tests: don't require a D compiler
Reported by Kiyoshi Kanazawa.
http://lists.gnu.org/archive/html/bug-bison/2019-04/msg00018.html

* tests/atlocal.in (BISON_DC_WORKS): New.
* tests/local.at (AT_COMPILE_D): Use it.
2019-04-29 22:27:01 +02:00
Akim Demaille 04676a5085 doc: use svg instead of png
* doc/bison.texi, doc/local.mk: here.
2019-04-29 07:44:19 +02:00
Akim Demaille cf44351dd7 doc: use colors
* doc/bison.texi (dwarning, derror, dnotice): New.
Use them in the diagnostics.
* doc/local.mk (AM_MAKEINFOFLAGS): Pass customization variables.
2019-04-29 07:44:19 +02:00
Akim Demaille 614e0bbe23 maint: post-release administrivia
* NEWS: Add header line for next release.
* .prev-version: Record previous version.
* cfg.mk (old_NEWS_hash): Auto-update.
2019-04-28 12:02:35 +02:00
34 changed files with 340 additions and 205 deletions
+1 -1
View File
@@ -1 +1 @@
3.3.2 3.3.90
+6
View File
@@ -1,5 +1,11 @@
GNU Bison NEWS GNU Bison NEWS
* Noteworthy changes in release 3.3.91 (2019-05-12) [beta]
** Bug fixes
Portability issues were fixed.
* Noteworthy changes in release 3.3.90 (2019-04-28) [beta] * Noteworthy changes in release 3.3.90 (2019-04-28) [beta]
** New features ** New features
+2
View File
@@ -66,6 +66,7 @@ Frank Heckenbach [email protected]
Frans Englich [email protected] Frans Englich [email protected]
Gabriel Rassoul [email protected] Gabriel Rassoul [email protected]
Gary L Peskin [email protected] Gary L Peskin [email protected]
Gavin Smith [email protected]
Georg Sauthoff [email protected] Georg Sauthoff [email protected]
George Neuner [email protected] George Neuner [email protected]
Gilles Espinasse [email protected] Gilles Espinasse [email protected]
@@ -128,6 +129,7 @@ Oliver Mangold [email protected]
Paolo Bonzini [email protected] Paolo Bonzini [email protected]
Paolo Simone Gasparello [email protected] Paolo Simone Gasparello [email protected]
Pascal Bart [email protected] Pascal Bart [email protected]
Patrice Dumas [email protected]
Paul Eggert [email protected] Paul Eggert [email protected]
Paul Hilfinger [email protected] Paul Hilfinger [email protected]
Per Allansson [email protected] Per Allansson [email protected]
+111 -66
View File
@@ -7,6 +7,51 @@
@settitle Bison @value{VERSION} @settitle Bison @value{VERSION}
@setchapternewpage odd @setchapternewpage odd
@tex
\gdef\rgbWarning{0.50 0 0.50}
\gdef\colorWarning{%
\setcolor{\rgbWarning}%
}
\gdef\rgbError{0.80 0 0}
\gdef\colorError{%
\setcolor{\rgbError}%
}
\gdef\rgbNotice{0 0 0.80}
\gdef\colorNotice{%
\setcolor{\rgbNotice}%
}
\gdef\colorOff{%
\setcolor{\maincolor}%
}
@end tex
@ifnottex
@macro colorWarning
@inlineraw{html, <b style="color:darkviolet">}
@end macro
@macro colorError
@inlineraw{html, <b style="color:red">}
@end macro
@macro colorNotice
@inlineraw{html, <b style="color:darkcyan">}
@end macro
@macro colorOff
@inlineraw{html, </b>}
@end macro
@end ifnottex
@macro dwarning{text}
@colorWarning{}\text\@colorOff{}
@end macro
@macro derror{text}
@colorError{}\text\@colorOff{}
@end macro
@macro dnotice{text}
@colorNotice{}\text\@colorOff{}
@end macro
@finalout @finalout
@c SMALL BOOK version @c SMALL BOOK version
@@ -4280,24 +4325,24 @@ $@@3: %empty @{ d(); @};
exp: @@1 "b" @@2 $@@3 "e" @{ f = $1; @} exp: @@1 "b" @@2 $@@3 "e" @{ f = $1; @}
@end example @end example
There are probably two errors in the above example: the first midrule There are probably two errors in the above example: the first midrule action
action does not generate a value (it does not use @code{$$} although the does not generate a value (it does not use @code{$$} although the final
final action uses it), and the value of the second one is not used (the action uses it), and the value of the second one is not used (the final
final action does not use @code{$3}). Bison reports these errors when the action does not use @code{$3}). Bison reports these errors when the
@code{midrule-value} warnings are enabled (@pxref{Invocation, ,Invoking @code{midrule-value} warnings are enabled (@pxref{Invocation, ,Invoking
Bison}): Bison}):
@example @example
$ @kbd{bison -Wmidrule-value mid.y} $ @kbd{bison -Wmidrule-value mid.y}
@group @group
mid.y:2.6-13: warning: unset value: $$ mid.y:2.6-13: @dwarning{warning}: unset value: $$
2 | exp: @{ a(); @} "b" @{ $$ = c(); @} @{ d(); @} "e" @{ f = $1; @}; 2 | exp: @dwarning{@{ a(); @}} "b" @{ $$ = c(); @} @{ d(); @} "e" @{ f = $1; @};
| ^~~~~~~~ | @dwarning{^~~~~~~~}
@end group @end group
@group @group
mid.y:2.19-31: warning: unused value: $3 mid.y:2.19-31: @dwarning{warning}: unused value: $3
2 | exp: @{ a(); @} "b" @{ $$ = c(); @} @{ d(); @} "e" @{ f = $1; @}; 2 | exp: @{ a(); @} "b" @dwarning{@{ $$ = c(); @}} @{ d(); @} "e" @{ f = $1; @};
| ^~~~~~~~~~~~~ | @dwarning{^~~~~~~~~~~~~}
@end group @end group
@end example @end example
@@ -4305,9 +4350,9 @@ mid.y:2.19-31: warning: unused value: $3
It is sometimes useful to turn midrule actions into regular actions, e.g., It is sometimes useful to turn midrule actions into regular actions, e.g.,
to factor them, or to escape from their limitations. For instance, as an to factor them, or to escape from their limitations. For instance, as an
alternative to @emph{typed} midrule action, you may bury the midrule alternative to @emph{typed} midrule action, you may bury the midrule action
action inside a nonterminal symbol and to declare a printer and a destructor inside a nonterminal symbol and to declare a printer and a destructor for
for that symbol: that symbol:
@example @example
@group @group
@@ -9342,12 +9387,12 @@ useless: STR;
@command{bison} reports: @command{bison} reports:
@example @example
calc.y: warning: 1 nonterminal useless in grammar [-Wother] calc.y: @dwarning{warning}: 1 nonterminal useless in grammar [@dwarning{-Wother}]
calc.y: warning: 1 rule useless in grammar [-Wother] calc.y: @dwarning{warning}: 1 rule useless in grammar [@dwarning{-Wother}]
calc.y:19.1-7: warning: nonterminal useless in grammar: useless [-Wother] calc.y:19.1-7: @dwarning{warning}: nonterminal useless in grammar: useless [@dwarning{-Wother}]
19 | useless: STR; 19 | @dwarning{useless: STR;}
| ^~~~~~~ | @dwarning{^~~~~~~}
calc.y: warning: 7 shift/reduce conflicts [-Wconflicts-sr] calc.y: @dwarning{warning}: 7 shift/reduce conflicts [@dwarning{-Wconflicts-sr}]
@end example @end example
When given @option{--report=state}, in addition to @file{calc.tab.c}, it When given @option{--report=state}, in addition to @file{calc.tab.c}, it
@@ -9764,7 +9809,7 @@ Parser}, for a detailed analysis of the textual report.
@ifnotinfo @ifnotinfo
@float Figure,fig:graph @float Figure,fig:graph
@image{figs/example, 430pt} @center @image{figs/example, 430pt,,,.svg}
@caption{A graphical rendering of the parser.} @caption{A graphical rendering of the parser.}
@end float @end float
@end ifnotinfo @end ifnotinfo
@@ -9802,7 +9847,7 @@ State 3
A Graphviz rendering of this portion of the graph could be: A Graphviz rendering of this portion of the graph could be:
@center @image{figs/example-shift, 100pt} @center @image{figs/example-shift, 100pt,,,.svg}
@subheading Graphical Representation of Reductions @subheading Graphical Representation of Reductions
@@ -9824,7 +9869,7 @@ State 1
A Graphviz rendering of this portion of the graph could be: A Graphviz rendering of this portion of the graph could be:
@center @image{figs/example-reduce, 120pt} @center @image{figs/example-reduce, 120pt,,,.svg}
When unresolved conflicts are present, because in deterministic parsing When unresolved conflicts are present, because in deterministic parsing
a single decision can be made, Bison can arbitrarily choose to disable a a single decision can be made, Bison can arbitrarily choose to disable a
@@ -10299,15 +10344,15 @@ exp:;
@end group @end group
@group @group
$ @kbd{bison -u foo.y} $ @kbd{bison -u foo.y}
foo.y:1.1-14: warning: deprecated directive, use '%define parse.error verbose' [-Wdeprecated] foo.y:1.1-14: @dwarning{warning}: deprecated directive, use '%define parse.error verbose' [@dwarning{-Wdeprecated}]
1 | %error-verbose 1 | @dwarning{%error-verbose}
| ^~~~~~~~~~~~~~ | @dwarning{^~~~~~~~~~~~~~}
foo.y:2.1-27: error: %define variable 'parse.error' redefined foo.y:2.1-27: @dwarning{warning}: %define variable 'parse.error' redefined [@dwarning{-Wother}]
2 | %define parse.error verbose 2 | @dwarning{%define parse.error verbose}
| ^~~~~~~~~~~~~~~~~~~~~~~~~~~ | @dwarning{^~~~~~~~~~~~~~~~~~~~~~~~~~~}
foo.y:1.1-14: previous definition foo.y:1.1-14: previous definition
1 | %error-verbose 1 | @dnotice{%error-verbose}
| ^~~~~~~~~~~~~~ | @dnotice{^~~~~~~~~~~~~~}
bison: file 'foo.y' was updated (backup: 'foo.y~') bison: file 'foo.y' was updated (backup: 'foo.y~')
@end group @end group
@group @group
@@ -10421,19 +10466,19 @@ Bison reports:
@c width in PDF. @c width in PDF.
@example @example
@group @group
warning: useless precedence and associativity for "=" @dwarning{warning}: useless precedence and associativity for "="
| %nonassoc "=" | %nonassoc @dwarning{"="}
| ^~~ | @dwarning{^~~}
@end group @end group
@group @group
warning: useless associativity for "*", use %precedence @dwarning{warning}: useless associativity for "*", use %precedence
| %left "*" | %left @dwarning{"*"}
| ^~~ | @dwarning{^~~}
@end group @end group
@group @group
warning: useless precedence for "(" @dwarning{warning}: useless precedence for "("
| %precedence "(" | %precedence @dwarning{"("}
| ^~~ | @dwarning{^~~}
@end group @end group
@end example @end example
@@ -10520,29 +10565,29 @@ When invoked with @option{-fcaret} (or nothing), Bison will report:
@example @example
@group @group
in.y:3.20-23: error: ambiguous reference: '$exp' in.y:3.20-23: @derror{error}: ambiguous reference: '$exp'
3 | exp: exp '+' exp @{ $exp = $1 + $2; @}; 3 | exp: exp '+' exp @{ @derror{$exp} = $1 + $2; @};
| ^~~~ | @derror{^~~~}
@end group @end group
@group @group
in.y:3.1-3: refers to: $exp at $$ in.y:3.1-3: refers to: $exp at $$
3 | exp: exp '+' exp @{ $exp = $1 + $2; @}; 3 | @dnotice{exp}: exp '+' exp @{ $exp = $1 + $2; @};
| ^~~ | @dnotice{^~~}
@end group @end group
@group @group
in.y:3.6-8: refers to: $exp at $1 in.y:3.6-8: refers to: $exp at $1
3 | exp: exp '+' exp @{ $exp = $1 + $2; @}; 3 | exp: @dnotice{exp} '+' exp @{ $exp = $1 + $2; @};
| ^~~ | @dnotice{^~~}
@end group @end group
@group @group
in.y:3.14-16: refers to: $exp at $3 in.y:3.14-16: refers to: $exp at $3
3 | exp: exp '+' exp @{ $exp = $1 + $2; @}; 3 | exp: exp '+' @dnotice{exp} @{ $exp = $1 + $2; @};
| ^~~ | @dnotice{^~~}
@end group @end group
@group @group
in.y:3.32-33: error: $2 of 'exp' has no declared type in.y:3.32-33: @derror{error}: $2 of 'exp' has no declared type
3 | exp: exp '+' exp @{ $exp = $1 + $2; @}; 3 | exp: exp '+' exp @{ $exp = $1 + @derror{$2}; @};
| ^~ | @derror{^~}
@end group @end group
@end example @end example
@@ -10550,11 +10595,11 @@ Whereas, when invoked with @option{-fno-caret}, Bison will only report:
@example @example
@group @group
in.y:3.20-23: error: ambiguous reference: $exp in.y:3.20-23: @derror{error}: ambiguous reference: $exp
in.y:3.1-3: refers to: $exp at $$ in.y:3.1-3: refers to: $exp at $$
in.y:3.6-8: refers to: $exp at $1 in.y:3.6-8: refers to: $exp at $1
in.y:3.14-16: refers to: $exp at $3 in.y:3.14-16: refers to: $exp at $3
in.y:3.32-33: error: $2 of exp has no declared type in.y:3.32-33: @derror{error}: $2 of exp has no declared type
@end group @end group
@end example @end example
@@ -10578,14 +10623,14 @@ exp:;
@group @group
$ @kbd{bison -ffixit foo.y} $ @kbd{bison -ffixit foo.y}
foo.y:2.1-24: error: %define variable 'api.prefix' redefined foo.y:2.1-24: @derror{error}: %define variable 'api.prefix' redefined
2 | %define api.prefix @{bar@} 2 | @derror{%define api.prefix @{bar@}}
| ^~~~~~~~~~~~~~~~~~~~~~~~ | @derror{^~~~~~~~~~~~~~~~~~~~~~~~}
foo.y:1.1-24: previous definition foo.y:1.1-24: previous definition
1 | %define api.prefix @{foo@} 1 | @dnotice{%define api.prefix @{foo@}}
| ^~~~~~~~~~~~~~~~~~~~~~~~ | @dnotice{^~~~~~~~~~~~~~~~~~~~~~~~}
fix-it:"foo.y":@{2:1-2:25@}:"" fix-it:"foo.y":@{2:1-2:25@}:""
foo.y: warning: fix-its can be applied. Rerun with option '--update'. [-Wother] foo.y: @dwarning{warning}: fix-its can be applied. Rerun with option '--update'. [@dwarning{-Wother}]
@end group @end group
@end example @end example
@@ -10602,13 +10647,13 @@ exp:;
@end group @end group
@group @group
$ @kbd{bison foo.y} $ @kbd{bison foo.y}
foo.y:1.1-14: warning: deprecated directive, use '%define parse.error verbose' [-Wdeprecated] foo.y:1.1-14: @dwarning{warning}: deprecated directive, use '%define parse.error verbose' [@dwarning{-Wdeprecated}]
1 | %error-verbose 1 | @dwarning{%error-verbose}
| ^~~~~~~~~~~~~~ | @dwarning{^~~~~~~~~~~~~~}
foo.y:2.1-18: warning: deprecated directive, use '%define api.prefix @{foo@}' [-Wdeprecated] foo.y:2.1-18: @dwarning{warning}: deprecated directive, use '%define api.prefix @{foo@}' [@dwarning{-Wdeprecated}]
2 | %name-prefix "foo" 2 | @dwarning{%name-prefix "foo"}
| ^~~~~~~~~~~~~~~~~~ | @dwarning{^~~~~~~~~~~~~~~~~~}
foo.y: warning: fix-its can be applied. Rerun with option '--update'. [-Wother] foo.y: @dwarning{warning}: fix-its can be applied. Rerun with option '--update'. [@dwarning{-Wother}]
@end group @end group
@end example @end example
+12 -7
View File
@@ -14,7 +14,12 @@
## You should have received a copy of the GNU General Public License ## You should have received a copy of the GNU General Public License
## along with this program. If not, see <http://www.gnu.org/licenses/>. ## along with this program. If not, see <http://www.gnu.org/licenses/>.
AM_MAKEINFOFLAGS = --no-split AM_MAKEINFOFLAGS = \
--no-split \
--set-customization-variable=SECTION_NAME_IN_TITLE=true \
--set-customization-variable=AVOID_MENU_REDUNDANCY=true \
--set-customization-variable=ICONS=true
info_TEXINFOS = doc/bison.texi info_TEXINFOS = doc/bison.texi
doc_bison_TEXINFOS = \ doc_bison_TEXINFOS = \
$(CROSS_OPTIONS_TEXI) \ $(CROSS_OPTIONS_TEXI) \
@@ -28,7 +33,7 @@ doc_bison = doc/bison
$(doc_bison).dvi: $(FIGS_GV:.gv=.eps) $(doc_bison).dvi: $(FIGS_GV:.gv=.eps)
$(doc_bison).info: $(FIGS_GV:.gv=.txt) $(doc_bison).info: $(FIGS_GV:.gv=.txt)
$(doc_bison).pdf: $(FIGS_GV:.gv=.pdf) $(doc_bison).pdf: $(FIGS_GV:.gv=.pdf)
$(doc_bison).html: $(FIGS_GV:.gv=.png) $(doc_bison).html: $(FIGS_GV:.gv=.svg)
TEXI2DVI = texi2dvi --build-dir=doc/bison.t2d -I doc TEXI2DVI = texi2dvi --build-dir=doc/bison.t2d -I doc
CLEANDIRS += doc/bison.t2d CLEANDIRS += doc/bison.t2d
@@ -137,14 +142,14 @@ endif
## Graphviz examples generation. ## ## Graphviz examples generation. ##
## ----------------------------- ## ## ----------------------------- ##
CLEANFILES += $(FIGS_GV:.gv=.eps) $(FIGS_GV:.gv=.pdf) $(FIGS_GV:.gv=.png) CLEANFILES += $(FIGS_GV:.gv=.eps) $(FIGS_GV:.gv=.pdf) $(FIGS_GV:.gv=.svg)
FIGS_GV = \ FIGS_GV = \
doc/figs/example.gv \ doc/figs/example.gv \
doc/figs/example-reduce.gv doc/figs/example-shift.gv doc/figs/example-reduce.gv doc/figs/example-shift.gv
EXTRA_DIST += \ EXTRA_DIST += \
$(FIGS_GV) $(FIGS_GV:.gv=.txt) \ $(FIGS_GV) $(FIGS_GV:.gv=.txt) \
$(FIGS_GV:.gv=.eps) $(FIGS_GV:.gv=.pdf) $(FIGS_GV:.gv=.png) $(FIGS_GV:.gv=.eps) $(FIGS_GV:.gv=.pdf) $(FIGS_GV:.gv=.svg)
SUFFIXES += .gv .eps .pdf .png SUFFIXES += .gv .eps .pdf .svg
.gv.eps: .gv.eps:
$(AM_V_GEN) $(MKDIR_P) `echo "./$@" | sed -e 's,/[^/]*$$,,'` $(AM_V_GEN) $(MKDIR_P) `echo "./$@" | sed -e 's,/[^/]*$$,,'`
@@ -156,9 +161,9 @@ SUFFIXES += .gv .eps .pdf .png
$(AM_V_at) $(DOT) -Gmargin=0 -Tpdf $< >$@.tmp $(AM_V_at) $(DOT) -Gmargin=0 -Tpdf $< >$@.tmp
$(AM_V_at) mv $@.tmp $@ $(AM_V_at) mv $@.tmp $@
.gv.png: .gv.svg:
$(AM_V_GEN) $(MKDIR_P) `echo "./$@" | sed -e 's,/[^/]*$$,,'` $(AM_V_GEN) $(MKDIR_P) `echo "./$@" | sed -e 's,/[^/]*$$,,'`
$(AM_V_at) $(DOT) -Gmargin=0 -Tpng $< >$@.tmp $(AM_V_at) $(DOT) -Gmargin=0 -Tsvg $< >$@.tmp
$(AM_V_at) mv $@.tmp $@ $(AM_V_at) mv $@.tmp $@
## -------------- ## ## -------------- ##
+1 -1
Submodule gnulib updated: 14a920195e...03752516b2
+15
View File
@@ -0,0 +1,15 @@
/*.gmo
/*.po
/LINGUAS
/Makefile.in.in
/Makevars
/Makevars.template
/POTFILES.in
/Rules-quot
/bison-gnulib.pot
/boldquot.sed
/[email protected]
/[email protected]
/insert-header.sin
/quot.sed
/remove-potcdate.sin
+22 -5
View File
@@ -72,7 +72,7 @@ begin_use_class (const char *s, FILE *out)
{ {
if (out == stderr) if (out == stderr)
{ {
if (style_debug) if (color_debug)
fprintf (out, "<%s>", s); fprintf (out, "<%s>", s);
else else
{ {
@@ -87,7 +87,7 @@ end_use_class (const char *s, FILE *out)
{ {
if (out == stderr) if (out == stderr)
{ {
if (style_debug) if (color_debug)
fprintf (out, "</%s>", s); fprintf (out, "</%s>", s);
else else
{ {
@@ -252,6 +252,7 @@ complain_init_color (void)
{ {
#if HAVE_LIBTEXTSTYLE #if HAVE_LIBTEXTSTYLE
if (color_mode == color_yes if (color_mode == color_yes
|| color_mode == color_html
|| (color_mode == color_tty && isatty (STDERR_FILENO))) || (color_mode == color_tty && isatty (STDERR_FILENO)))
{ {
style_file_prepare ("BISON_DIAGNOSTICS_STYLE", NULL, style_file_prepare ("BISON_DIAGNOSTICS_STYLE", NULL,
@@ -268,9 +269,25 @@ complain_init_color (void)
style_file_name = NULL; style_file_name = NULL;
#endif #endif
/* Workaround clang's warning (starting at Clang 3.5) about the stub
code of html_styled_ostream_create:
| src/complain.c:274:7: error: code will never be executed [-Werror,-Wunreachable-code]
| ? html_styled_ostream_create (file_ostream_create (stderr),
| ^~~~~~~~~~~~~~~~~~~~~~~~~~ */
#if defined __clang__
# pragma clang diagnostic push
# pragma clang diagnostic ignored "-Wunreachable-code"
#endif
errstream = errstream =
styled_ostream_create (STDERR_FILENO, "(stderr)", TTYCTL_AUTO, color_mode == color_html
style_file_name); ? html_styled_ostream_create (file_ostream_create (stderr),
style_file_name)
: styled_ostream_create (STDERR_FILENO, "(stderr)", TTYCTL_AUTO,
style_file_name);
#if defined __clang__
# pragma clang diagnostic pop
#endif
} }
void void
@@ -521,7 +538,7 @@ deprecated_directive (location const *loc, char const *old, char const *upd)
_("deprecated directive: %s, use %s"), _("deprecated directive: %s, use %s"),
quote (old), quote_n (1, upd)); quote (old), quote_n (1, upd));
/* Register updates only if -Wdeprecated is enabled. */ /* Register updates only if -Wdeprecated is enabled. */
if (warnings_flag[warning_deprecated] != severity_disabled) if (warning_is_enabled (Wdeprecated))
fixits_register (loc, upd); fixits_register (loc, upd);
} }
+6 -1
View File
@@ -52,6 +52,11 @@ fixit_new (location const *loc, char const* fix)
return res; return res;
} }
static int
fixit_cmp (const fixit *a, const fixit *b)
{
return location_cmp (a->location, b->location);
}
static void static void
fixit_free (fixit *f) fixit_free (fixit *f)
@@ -85,7 +90,7 @@ fixits_register (location const *loc, char const* fix)
(gl_listelement_dispose_fn) fixit_free, (gl_listelement_dispose_fn) fixit_free,
true); true);
fixit *f = fixit_new (loc, fix); fixit *f = fixit_new (loc, fix);
gl_list_add_last (fixits, f); gl_sortedlist_add (fixits, (gl_listelement_compar_fn) fixit_cmp, f);
if (feature_flag & feature_fixit_parsable) if (feature_flag & feature_fixit_parsable)
fixit_print (f, stderr); fixit_print (f, stderr);
} }
+9 -6
View File
@@ -45,7 +45,7 @@ bool no_lines_flag = false;
bool token_table_flag = false; bool token_table_flag = false;
location yacc_loc = EMPTY_LOCATION_INIT; location yacc_loc = EMPTY_LOCATION_INIT;
bool update_flag = false; /* for -u */ bool update_flag = false; /* for -u */
bool style_debug = false; /* --style=debug. */ bool color_debug = false;
bool nondeterministic_parser = false; bool nondeterministic_parser = false;
bool glr_parser = false; bool glr_parser = false;
@@ -596,14 +596,17 @@ getargs_colors (int argc, char *argv[])
{ {
const char *arg = argv[i]; const char *arg = argv[i];
if (STRPREFIX_LIT ("--color=", arg)) if (STRPREFIX_LIT ("--color=", arg))
handle_color_option (arg + strlen ("--color=")); {
const char *color = arg + strlen ("--color=");
if (STREQ (color, "debug"))
color_debug = true;
else
handle_color_option (color);
}
else if (STRPREFIX_LIT ("--style=", arg)) else if (STRPREFIX_LIT ("--style=", arg))
{ {
const char *style = arg + strlen ("--style="); const char *style = arg + strlen ("--style=");
if (STREQ (style, "debug")) handle_style_option (style);
style_debug = true;
else
handle_style_option (style);
} }
} }
complain_init_color (); complain_init_color ();
+1 -1
View File
@@ -41,7 +41,7 @@ extern bool no_lines_flag; /* for -l */
extern bool token_table_flag; /* for -k */ extern bool token_table_flag; /* for -k */
extern location yacc_loc; /* for -y */ extern location yacc_loc; /* for -y */
extern bool update_flag; /* for -u */ extern bool update_flag; /* for -u */
extern bool style_debug; /* --style=debug. */ extern bool color_debug; /* --color=debug. */
/* GLR_PARSER is true if the input file says to use the GLR /* GLR_PARSER is true if the input file says to use the GLR
(Generalized LR) parser, and to output some additional information (Generalized LR) parser, and to output some additional information
used by the GLR algorithm. */ used by the GLR algorithm. */
+1 -1
View File
@@ -203,7 +203,7 @@ typedef struct
int expected_rr_conflicts; int expected_rr_conflicts;
const char *action; const char *action;
location action_location; location action_loc;
} rule; } rule;
/* The used rules (size NRULES). */ /* The used rules (size NRULES). */
+1 -1
View File
@@ -30,7 +30,7 @@
#include "getargs.h" #include "getargs.h"
#include "location.h" #include "location.h"
location const empty_location = EMPTY_LOCATION_INIT; location const empty_loc = EMPTY_LOCATION_INIT;
/* If BUF is null, add BUFSIZE (which in this case must be less than /* If BUF is null, add BUFSIZE (which in this case must be less than
INT_MAX) to COLUMN; otherwise, add mbsnwidth (BUF, BUFSIZE, 0) to INT_MAX) to COLUMN; otherwise, add mbsnwidth (BUF, BUFSIZE, 0) to
+1 -1
View File
@@ -102,7 +102,7 @@ typedef struct
# define GRAM_LTYPE location # define GRAM_LTYPE location
# define EMPTY_LOCATION_INIT {{NULL, 0, 0, 0}, {NULL, 0, 0, 0}} # define EMPTY_LOCATION_INIT {{NULL, 0, 0, 0}, {NULL, 0, 0, 0}}
extern location const empty_location; extern location const empty_loc;
/* Set *LOC and adjust scanner cursor to account for token TOKEN of /* Set *LOC and adjust scanner cursor to account for token TOKEN of
size SIZE. */ size SIZE. */
+2 -2
View File
@@ -372,8 +372,8 @@ user_actions_output (FILE *out)
{ {
fprintf (out, "%s(%d, [b4_syncline(%d, ", fprintf (out, "%s(%d, [b4_syncline(%d, ",
rules[r].is_predicate ? "b4_predicate_case" : "b4_case", rules[r].is_predicate ? "b4_predicate_case" : "b4_case",
r + 1, rules[r].action_location.start.line); r + 1, rules[r].action_loc.start.line);
string_output (out, rules[r].action_location.start.file); string_output (out, rules[r].action_loc.start.file);
fprintf (out, ")dnl\n[ %s]])\n\n", rules[r].action); fprintf (out, ")dnl\n[ %s]])\n\n", rules[r].action);
} }
fputs ("])\n\n", out); fputs ("])\n\n", out);
+3 -3
View File
@@ -122,7 +122,7 @@
#include "xmemdup0.h" #include "xmemdup0.h"
static int current_prec = 0; static int current_prec = 0;
static location current_lhs_location; static location current_lhs_loc;
static named_ref *current_lhs_named_ref; static named_ref *current_lhs_named_ref;
static symbol *current_lhs_symbol; static symbol *current_lhs_symbol;
static symbol_class current_class = unknown_sym; static symbol_class current_class = unknown_sym;
@@ -2406,7 +2406,7 @@ yyreduce:
break; break;
case 95: case 95:
{ grammar_current_rule_begin (current_lhs_symbol, current_lhs_location, { grammar_current_rule_begin (current_lhs_symbol, current_lhs_loc,
current_lhs_named_ref); } current_lhs_named_ref); }
break; break;
@@ -3037,7 +3037,7 @@ void
current_lhs (symbol *sym, location loc, named_ref *ref) current_lhs (symbol *sym, location loc, named_ref *ref)
{ {
current_lhs_symbol = sym; current_lhs_symbol = sym;
current_lhs_location = loc; current_lhs_loc = loc;
if (sym) if (sym)
symbol_location_as_lhs_set (sym, loc); symbol_location_as_lhs_set (sym, loc);
/* In order to simplify memory management, named references for lhs /* In order to simplify memory management, named references for lhs
+3 -3
View File
@@ -49,7 +49,7 @@
#include "xmemdup0.h" #include "xmemdup0.h"
static int current_prec = 0; static int current_prec = 0;
static location current_lhs_location; static location current_lhs_loc;
static named_ref *current_lhs_named_ref; static named_ref *current_lhs_named_ref;
static symbol *current_lhs_symbol; static symbol *current_lhs_symbol;
static symbol_class current_class = unknown_sym; static symbol_class current_class = unknown_sym;
@@ -651,7 +651,7 @@ rhses.1:
%token PERCENT_EMPTY "%empty"; %token PERCENT_EMPTY "%empty";
rhs: rhs:
%empty %empty
{ grammar_current_rule_begin (current_lhs_symbol, current_lhs_location, { grammar_current_rule_begin (current_lhs_symbol, current_lhs_loc,
current_lhs_named_ref); } current_lhs_named_ref); }
| rhs symbol named_ref.opt | rhs symbol named_ref.opt
{ grammar_current_rule_symbol_append ($2, @2, $3); } { grammar_current_rule_symbol_append ($2, @2, $3); }
@@ -1050,7 +1050,7 @@ void
current_lhs (symbol *sym, location loc, named_ref *ref) current_lhs (symbol *sym, location loc, named_ref *ref)
{ {
current_lhs_symbol = sym; current_lhs_symbol = sym;
current_lhs_location = loc; current_lhs_loc = loc;
if (sym) if (sym)
symbol_location_as_lhs_set (sym, loc); symbol_location_as_lhs_set (sym, loc);
/* In order to simplify memory management, named references for lhs /* In order to simplify memory management, named references for lhs
+38 -37
View File
@@ -62,7 +62,7 @@ grammar_start_symbol_set (symbol *sym, location loc)
{ {
start_flag = true; start_flag = true;
startsymbol = sym; startsymbol = sym;
startsymbol_location = loc; startsymbol_loc = loc;
} }
} }
@@ -131,12 +131,12 @@ record_merge_function_type (int merger, uniqstr type, location declaration_loc)
quote (merge_function->name), type, quote (merge_function->name), type,
merge_function->type); merge_function->type);
indent += SUB_INDENT; indent += SUB_INDENT;
complain_indent (&merge_function->type_declaration_location, complaint, complain_indent (&merge_function->type_declaration_loc, complaint,
&indent, &indent,
_("previous declaration")); _("previous declaration"));
} }
merge_function->type = uniqstr_new (type); merge_function->type = uniqstr_new (type);
merge_function->type_declaration_location = declaration_loc; merge_function->type_declaration_loc = declaration_loc;
} }
/*--------------------------------------. /*--------------------------------------.
@@ -295,7 +295,7 @@ grammar_rule_check_and_complete (symbol_list *r)
char const *rhs_type = char const *rhs_type =
first_rhs->content->type_name ? first_rhs->content->type_name : ""; first_rhs->content->type_name ? first_rhs->content->type_name : "";
if (!UNIQSTR_EQ (lhs_type, rhs_type)) if (!UNIQSTR_EQ (lhs_type, rhs_type))
complain (&r->location, Wother, complain (&r->rhs_loc, Wother,
_("type clash on default action: <%s> != <%s>"), _("type clash on default action: <%s> != <%s>"),
lhs_type, rhs_type); lhs_type, rhs_type);
else else
@@ -308,7 +308,7 @@ grammar_rule_check_and_complete (symbol_list *r)
if (is_cxx) if (is_cxx)
{ {
code_props_rule_action_init (&r->action_props, "{ $$ = $1; }", code_props_rule_action_init (&r->action_props, "{ $$ = $1; }",
r->location, r, r->rhs_loc, r,
/* name */ NULL, /* name */ NULL,
/* type */ NULL, /* type */ NULL,
/* is_predicate */ false); /* is_predicate */ false);
@@ -318,7 +318,7 @@ grammar_rule_check_and_complete (symbol_list *r)
} }
/* Warn if there is no default for $$ but we need one. */ /* Warn if there is no default for $$ but we need one. */
else else
complain (&r->location, Wother, complain (&r->rhs_loc, Wother,
_("empty rule for typed nonterminal, and no action")); _("empty rule for typed nonterminal, and no action"));
} }
@@ -335,9 +335,9 @@ grammar_rule_check_and_complete (symbol_list *r)
{ {
warnings warn_flag = midrule_warning ? Wmidrule_values : Wother; warnings warn_flag = midrule_warning ? Wmidrule_values : Wother;
if (n) if (n)
complain (&l->location, warn_flag, _("unused value: $%d"), n); complain (&l->sym_loc, warn_flag, _("unused value: $%d"), n);
else else
complain (&l->location, warn_flag, _("unset value: $$")); complain (&l->rhs_loc, warn_flag, _("unset value: $$"));
} }
} }
} }
@@ -357,9 +357,10 @@ grammar_rule_check_and_complete (symbol_list *r)
&& !r->percent_empty_loc.start.file && !r->percent_empty_loc.start.file
&& warning_is_enabled (Wempty_rule)) && warning_is_enabled (Wempty_rule))
{ {
complain (&r->location, Wempty_rule, complain (&r->rhs_loc, Wempty_rule, _("empty rule without %%empty"));
_("empty rule without %%empty")); location loc = r->rhs_loc;
fixits_register (&r->location, " %empty "); loc.end = loc.start;
fixits_register (&loc, " %empty ");
} }
/* See comments in grammar_current_rule_prec_set for how POSIX /* See comments in grammar_current_rule_prec_set for how POSIX
@@ -369,12 +370,12 @@ grammar_rule_check_and_complete (symbol_list *r)
&& r->ruleprec->tag[0] != '\'' && r->ruleprec->tag[0] != '"' && r->ruleprec->tag[0] != '\'' && r->ruleprec->tag[0] != '"'
&& r->ruleprec->content->status != declared && r->ruleprec->content->status != declared
&& !r->ruleprec->content->prec) && !r->ruleprec->content->prec)
complain (&r->location, Wother, complain (&r->rhs_loc, Wother,
_("token for %%prec is not defined: %s"), r->ruleprec->tag); _("token for %%prec is not defined: %s"), r->ruleprec->tag);
/* Check that the (main) action was not typed. */ /* Check that the (main) action was not typed. */
if (r->action_props.type) if (r->action_props.type)
complain (&r->location, Wother, complain (&r->rhs_loc, Wother,
_("only midrule actions can be typed: %s"), r->action_props.type); _("only midrule actions can be typed: %s"), r->action_props.type);
} }
@@ -387,8 +388,8 @@ void
grammar_current_rule_end (location loc) grammar_current_rule_end (location loc)
{ {
/* Put an empty link in the list to mark the end of this rule */ /* Put an empty link in the list to mark the end of this rule */
grammar_symbol_append (NULL, grammar_end->location); grammar_symbol_append (NULL, grammar_end->rhs_loc);
current_rule->location = loc; current_rule->rhs_loc = loc;
} }
@@ -408,11 +409,11 @@ grammar_midrule_action (void)
/* Make a DUMMY nonterminal, whose location is that of the midrule /* Make a DUMMY nonterminal, whose location is that of the midrule
action. Create the MIDRULE. */ action. Create the MIDRULE. */
location dummy_location = current_rule->action_props.location; location dummy_loc = current_rule->action_props.location;
symbol *dummy = dummy_symbol_get (dummy_location); symbol *dummy = dummy_symbol_get (dummy_loc);
symbol_type_set(dummy, symbol_type_set(dummy,
current_rule->action_props.type, current_rule->action_props.location); current_rule->action_props.type, current_rule->action_props.location);
symbol_list *midrule = symbol_list_sym_new (dummy, dummy_location); symbol_list *midrule = symbol_list_sym_new (dummy, dummy_loc);
/* Remember named_ref of previous action. */ /* Remember named_ref of previous action. */
named_ref *action_name = current_rule->action_props.named_ref; named_ref *action_name = current_rule->action_props.named_ref;
@@ -422,7 +423,7 @@ grammar_midrule_action (void)
++nrules; ++nrules;
++nritems; ++nritems;
/* Attach its location and actions to that of the DUMMY. */ /* Attach its location and actions to that of the DUMMY. */
midrule->location = dummy_location; midrule->rhs_loc = dummy_loc;
code_props_rule_action_init (&midrule->action_props, code_props_rule_action_init (&midrule->action_props,
current_rule->action_props.code, current_rule->action_props.code,
current_rule->action_props.location, current_rule->action_props.location,
@@ -443,14 +444,14 @@ grammar_midrule_action (void)
grammar = midrule; grammar = midrule;
/* End the dummy's rule. */ /* End the dummy's rule. */
midrule->next = symbol_list_sym_new (NULL, dummy_location); midrule->next = symbol_list_sym_new (NULL, dummy_loc);
midrule->next->next = current_rule; midrule->next->next = current_rule;
previous_rule_end = midrule->next; previous_rule_end = midrule->next;
/* Insert the dummy nonterminal replacing the midrule action into /* Insert the dummy nonterminal replacing the midrule action into
the current rule. Bind it to its dedicated rule. */ the current rule. Bind it to its dedicated rule. */
grammar_current_rule_symbol_append (dummy, dummy_location, grammar_current_rule_symbol_append (dummy, dummy_loc,
action_name); action_name);
grammar_end->midrule = midrule; grammar_end->midrule = midrule;
midrule->midrule_parent_rule = current_rule; midrule->midrule_parent_rule = current_rule;
@@ -509,11 +510,11 @@ grammar_current_rule_dprec_set (int dprec, location loc)
"%dprec"); "%dprec");
else if (current_rule->dprec != 0) else if (current_rule->dprec != 0)
duplicate_rule_directive ("%dprec", duplicate_rule_directive ("%dprec",
current_rule->dprec_location, loc); current_rule->dprec_loc, loc);
else else
{ {
current_rule->dprec = dprec; current_rule->dprec = dprec;
current_rule->dprec_location = loc; current_rule->dprec_loc = loc;
} }
} }
@@ -528,11 +529,11 @@ grammar_current_rule_merge_set (uniqstr name, location loc)
"%merge"); "%merge");
if (current_rule->merger != 0) if (current_rule->merger != 0)
duplicate_rule_directive ("%merge", duplicate_rule_directive ("%merge",
current_rule->merger_declaration_location, loc); current_rule->merger_declaration_loc, loc);
else else
{ {
current_rule->merger = get_merge_function (name); current_rule->merger = get_merge_function (name);
current_rule->merger_declaration_location = loc; current_rule->merger_declaration_loc = loc;
} }
} }
@@ -622,7 +623,7 @@ packgram (void)
{ {
symbol_list *lhs = p; symbol_list *lhs = p;
record_merge_function_type (lhs->merger, lhs->content.sym->content->type_name, record_merge_function_type (lhs->merger, lhs->content.sym->content->type_name,
lhs->merger_declaration_location); lhs->merger_declaration_loc);
/* If the midrule's $$ is set or its $n is used, remove the '$' from the /* If the midrule's $$ is set or its $n is used, remove the '$' from the
symbol name so that it's a user-defined symbol so that the default symbol name so that it's a user-defined symbol so that the default
%destructor and %printer apply. */ %destructor and %printer apply. */
@@ -647,10 +648,10 @@ packgram (void)
rules[ruleno].dprec = lhs->dprec; rules[ruleno].dprec = lhs->dprec;
rules[ruleno].merger = lhs->merger; rules[ruleno].merger = lhs->merger;
rules[ruleno].precsym = NULL; rules[ruleno].precsym = NULL;
rules[ruleno].location = lhs->location; rules[ruleno].location = lhs->rhs_loc;
rules[ruleno].useful = true; rules[ruleno].useful = true;
rules[ruleno].action = lhs->action_props.code; rules[ruleno].action = lhs->action_props.code;
rules[ruleno].action_location = lhs->action_props.location; rules[ruleno].action_loc = lhs->action_props.location;
rules[ruleno].is_predicate = lhs->action_props.is_predicate; rules[ruleno].is_predicate = lhs->action_props.is_predicate;
rules[ruleno].expected_sr_conflicts = lhs->expected_sr_conflicts; rules[ruleno].expected_sr_conflicts = lhs->expected_sr_conflicts;
rules[ruleno].expected_rr_conflicts = lhs->expected_rr_conflicts; rules[ruleno].expected_rr_conflicts = lhs->expected_rr_conflicts;
@@ -713,18 +714,18 @@ reader (void)
symbols_new (); symbols_new ();
/* Construct the accept symbol. */ /* Construct the accept symbol. */
accept = symbol_get ("$accept", empty_location); accept = symbol_get ("$accept", empty_loc);
accept->content->class = nterm_sym; accept->content->class = nterm_sym;
accept->content->number = nvars++; accept->content->number = nvars++;
/* Construct the error token */ /* Construct the error token */
errtoken = symbol_get ("error", empty_location); errtoken = symbol_get ("error", empty_loc);
errtoken->content->class = token_sym; errtoken->content->class = token_sym;
errtoken->content->number = ntokens++; errtoken->content->number = ntokens++;
/* Construct a token that represents all undefined literal tokens. /* Construct a token that represents all undefined literal tokens.
It is always token number 2. */ It is always token number 2. */
undeftoken = symbol_get ("$undefined", empty_location); undeftoken = symbol_get ("$undefined", empty_loc);
undeftoken->content->class = token_sym; undeftoken->content->class = token_sym;
undeftoken->content->number = ntokens++; undeftoken->content->number = ntokens++;
@@ -801,7 +802,7 @@ check_and_convert_grammar (void)
/* If the user did not define her ENDTOKEN, do it now. */ /* If the user did not define her ENDTOKEN, do it now. */
if (!endtoken) if (!endtoken)
{ {
endtoken = symbol_get ("$end", empty_location); endtoken = symbol_get ("$end", empty_loc);
endtoken->content->class = token_sym; endtoken->content->class = token_sym;
endtoken->content->number = 0; endtoken->content->number = 0;
/* Value specified by POSIX. */ /* Value specified by POSIX. */
@@ -823,11 +824,11 @@ check_and_convert_grammar (void)
$accept: %start $end. */ $accept: %start $end. */
{ {
symbol_list *p = symbol_list_sym_new (accept, empty_location); symbol_list *p = symbol_list_sym_new (accept, empty_loc);
p->location = grammar->location; p->rhs_loc = grammar->rhs_loc;
p->next = symbol_list_sym_new (startsymbol, empty_location); p->next = symbol_list_sym_new (startsymbol, empty_loc);
p->next->next = symbol_list_sym_new (endtoken, empty_location); p->next->next = symbol_list_sym_new (endtoken, empty_loc);
p->next->next->next = symbol_list_sym_new (NULL, empty_location); p->next->next->next = symbol_list_sym_new (NULL, empty_loc);
p->next->next->next->next = grammar; p->next->next->next->next = grammar;
nrules += 1; nrules += 1;
nritems += 3; nritems += 3;
+1 -1
View File
@@ -32,7 +32,7 @@ typedef struct merger_list
struct merger_list* next; struct merger_list* next;
uniqstr name; uniqstr name;
uniqstr type; uniqstr type;
location type_declaration_location; location type_declaration_loc;
} merger_list; } merger_list;
/* From the parser. */ /* From the parser. */
+1 -1
View File
@@ -382,7 +382,7 @@ reduce_grammar (void)
reduce_print (); reduce_print ();
if (!bitset_test (N, accept->content->number - ntokens)) if (!bitset_test (N, accept->content->number - ntokens))
complain (&startsymbol_location, fatal, complain (&startsymbol_loc, fatal,
_("start symbol %s does not derive any sentence"), _("start symbol %s does not derive any sentence"),
startsymbol->tag); startsymbol->tag);
+5 -5
View File
@@ -57,8 +57,8 @@ static void handle_action_at (symbol_list *rule, char *cp, location at_loc);
/* A string to be pushed to obstack after dollar/at has been handled. */ /* A string to be pushed to obstack after dollar/at has been handled. */
static char *ref_tail_fields; static char *ref_tail_fields;
static location the_location; static location current_loc;
static location *loc = &the_location; static location *loc = &current_loc;
/* A string representing the most recent translation. */ /* A string representing the most recent translation. */
static char *last_string; static char *last_string;
@@ -187,7 +187,7 @@ ref -?[0-9]+|{id}|"["{id}"]"|"$"
} }
"@$" { "@$" {
obstack_sgrow (&obstack_for_string, "]b4_at_dollar["); obstack_sgrow (&obstack_for_string, "]b4_at_dollar[");
muscle_percent_define_ensure("locations", the_location, true); muscle_percent_define_ensure("locations", *loc, true);
} }
} }
@@ -507,12 +507,12 @@ parse_ref (char *cp, symbol_list *rule, int rule_length,
dollar_or_at); dollar_or_at);
} }
else if (midrule_rhs_index) else if (midrule_rhs_index)
complain_indent (&rule->location, complaint, &indent, complain_indent (&rule->rhs_loc, complaint, &indent,
_("symbol not found in production before $%d: " _("symbol not found in production before $%d: "
"%.*s"), "%.*s"),
midrule_rhs_index, len, cp); midrule_rhs_index, len, cp);
else else
complain_indent (&rule->location, complaint, &indent, complain_indent (&rule->rhs_loc, complaint, &indent,
_("symbol not found in production: %.*s"), _("symbol not found in production: %.*s"),
len, cp); len, cp);
+1 -1
View File
@@ -161,7 +161,7 @@ eqopt ({sp}=)?
int context_state PACIFY_CC (= 0); int context_state PACIFY_CC (= 0);
/* Location of most recent identifier, when applicable. */ /* Location of most recent identifier, when applicable. */
location id_loc PACIFY_CC (= empty_location); location id_loc PACIFY_CC (= empty_loc);
/* Where containing code started, when applicable. Its initial /* Where containing code started, when applicable. Its initial
value is relevant only when yylex is invoked in the SC_EPILOGUE value is relevant only when yylex is invoked in the SC_EPILOGUE
+6 -5
View File
@@ -34,7 +34,7 @@ symbol_list_sym_new (symbol *sym, location loc)
res->content_type = SYMLIST_SYMBOL; res->content_type = SYMLIST_SYMBOL;
res->content.sym = sym; res->content.sym = sym;
res->location = res->sym_loc = loc; res->sym_loc = loc;
res->named_ref = NULL; res->named_ref = NULL;
res->midrule = NULL; res->midrule = NULL;
@@ -42,13 +42,14 @@ symbol_list_sym_new (symbol *sym, location loc)
res->midrule_parent_rhs_index = 0; res->midrule_parent_rhs_index = 0;
/* Members used for LHS only. */ /* Members used for LHS only. */
res->rhs_loc = empty_loc;
res->ruleprec = NULL; res->ruleprec = NULL;
res->percent_empty_loc = empty_location; res->percent_empty_loc = empty_loc;
code_props_none_init (&res->action_props); code_props_none_init (&res->action_props);
res->dprec = 0; res->dprec = 0;
res->dprec_location = empty_location; res->dprec_loc = empty_loc;
res->merger = 0; res->merger = 0;
res->merger_declaration_location = empty_location; res->merger_declaration_loc = empty_loc;
res->expected_sr_conflicts = -1; res->expected_sr_conflicts = -1;
res->expected_rr_conflicts = -1; res->expected_rr_conflicts = -1;
@@ -73,7 +74,7 @@ symbol_list_type_new (uniqstr type_name, location loc)
res->content.sem_type->location = loc; res->content.sem_type->location = loc;
res->content.sem_type->status = undeclared; res->content.sem_type->status = undeclared;
res->location = res->sym_loc = loc; res->sym_loc = loc;
res->named_ref = NULL; res->named_ref = NULL;
res->next = NULL; res->next = NULL;
+6 -4
View File
@@ -50,7 +50,6 @@ typedef struct symbol_list
*/ */
semantic_type *sem_type; semantic_type *sem_type;
} content; } content;
location location;
/* Named reference. */ /* Named reference. */
named_ref *named_ref; named_ref *named_ref;
@@ -74,6 +73,9 @@ typedef struct symbol_list
| when several RHSs are bound to a single lhs via "|"). | | when several RHSs are bound to a single lhs via "|"). |
`--------------------------------------------------------------*/ `--------------------------------------------------------------*/
/* Location of the RHS. */
location rhs_loc;
/* Precedence/associativity. */ /* Precedence/associativity. */
symbol *ruleprec; symbol *ruleprec;
@@ -82,13 +84,13 @@ typedef struct symbol_list
code_props action_props; code_props action_props;
/* The location of the first %empty for this rule, or \a /* The location of the first %empty for this rule, or \a
empty_location. */ empty_loc. */
location percent_empty_loc; location percent_empty_loc;
int dprec; int dprec;
location dprec_location; location dprec_loc;
int merger; int merger;
location merger_declaration_location; location merger_declaration_loc;
/* Counts of the number of expected conflicts for this rule, or -1 if none /* Counts of the number of expected conflicts for this rule, or -1 if none
given. */ given. */
+15 -15
View File
@@ -46,7 +46,7 @@ symbol *undeftoken = NULL;
symbol *endtoken = NULL; symbol *endtoken = NULL;
symbol *accept = NULL; symbol *accept = NULL;
symbol *startsymbol = NULL; symbol *startsymbol = NULL;
location startsymbol_location; location startsymbol_loc;
/* Precedence relation graph. */ /* Precedence relation graph. */
static symgraph **prec_nodes; static symgraph **prec_nodes;
@@ -198,7 +198,7 @@ semantic_type_new (uniqstr tag, const location *loc)
uniqstr_assert (tag); uniqstr_assert (tag);
res->tag = tag; res->tag = tag;
res->location = loc ? *loc : empty_location; res->location = loc ? *loc : empty_loc;
res->status = undeclared; res->status = undeclared;
for (int i = 0; i < CODE_PROPS_SIZE; ++i) for (int i = 0; i < CODE_PROPS_SIZE; ++i)
code_props_none_init (&res->props[i]); code_props_none_init (&res->props[i]);
@@ -339,12 +339,12 @@ symbol_type_set (symbol *sym, uniqstr type_name, location loc)
tag_seen = true; tag_seen = true;
if (sym->content->type_name) if (sym->content->type_name)
complain_symbol_redeclared (sym, "%type", complain_symbol_redeclared (sym, "%type",
sym->content->type_location, loc); sym->content->type_loc, loc);
else else
{ {
uniqstr_assert (type_name); uniqstr_assert (type_name);
sym->content->type_name = type_name; sym->content->type_name = type_name;
sym->content->type_location = loc; sym->content->type_loc = loc;
} }
} }
} }
@@ -426,12 +426,12 @@ symbol_precedence_set (symbol *sym, int prec, assoc a, location loc)
sym_content *s = sym->content; sym_content *s = sym->content;
if (s->prec) if (s->prec)
complain_symbol_redeclared (sym, assoc_to_string (a), complain_symbol_redeclared (sym, assoc_to_string (a),
s->prec_location, loc); s->prec_loc, loc);
else else
{ {
s->prec = prec; s->prec = prec;
s->assoc = a; s->assoc = a;
s->prec_location = loc; s->prec_loc = loc;
} }
} }
@@ -587,10 +587,10 @@ symbol_merge_properties (symbol *sym, symbol *str)
{ {
if (str->content->type_name) if (str->content->type_name)
symbol_type_set (sym, symbol_type_set (sym,
str->content->type_name, str->content->type_location); str->content->type_name, str->content->type_loc);
else else
symbol_type_set (str, symbol_type_set (str,
sym->content->type_name, sym->content->type_location); sym->content->type_name, sym->content->type_loc);
} }
@@ -604,10 +604,10 @@ symbol_merge_properties (symbol *sym, symbol *str)
{ {
if (str->content->prec) if (str->content->prec)
symbol_precedence_set (sym, str->content->prec, str->content->assoc, symbol_precedence_set (sym, str->content->prec, str->content->assoc,
str->content->prec_location); str->content->prec_loc);
else else
symbol_precedence_set (str, sym->content->prec, sym->content->assoc, symbol_precedence_set (str, sym->content->prec, sym->content->assoc,
sym->content->prec_location); sym->content->prec_loc);
} }
} }
@@ -1034,11 +1034,11 @@ symbols_pack (void)
symbols_token_translations_init (); symbols_token_translations_init ();
if (startsymbol->content->class == unknown_sym) if (startsymbol->content->class == unknown_sym)
complain (&startsymbol_location, fatal, complain (&startsymbol_loc, fatal,
_("the start symbol %s is undefined"), _("the start symbol %s is undefined"),
startsymbol->tag); startsymbol->tag);
else if (startsymbol->content->class == token_sym) else if (startsymbol->content->class == token_sym)
complain (&startsymbol_location, fatal, complain (&startsymbol_loc, fatal,
_("the start symbol %s is a token"), _("the start symbol %s is a token"),
startsymbol->tag); startsymbol->tag);
} }
@@ -1209,14 +1209,14 @@ print_precedence_warnings (void)
&& !prec_nodes[i]->succ) && !prec_nodes[i]->succ)
{ {
if (is_assoc_useless (s)) if (is_assoc_useless (s))
complain (&s->content->prec_location, Wprecedence, complain (&s->content->prec_loc, Wprecedence,
_("useless precedence and associativity for %s"), s->tag); _("useless precedence and associativity for %s"), s->tag);
else if (s->content->assoc == precedence_assoc) else if (s->content->assoc == precedence_assoc)
complain (&s->content->prec_location, Wprecedence, complain (&s->content->prec_loc, Wprecedence,
_("useless precedence for %s"), s->tag); _("useless precedence for %s"), s->tag);
} }
else if (is_assoc_useless (s)) else if (is_assoc_useless (s))
complain (&s->content->prec_location, Wprecedence, complain (&s->content->prec_loc, Wprecedence,
_("useless associativity for %s, use %%precedence"), s->tag); _("useless associativity for %s, use %%precedence"), s->tag);
} }
free (used_assoc); free (used_assoc);
+3 -3
View File
@@ -122,7 +122,7 @@ struct sym_content
uniqstr type_name; uniqstr type_name;
/** Its \c \%type's location. */ /** Its \c \%type's location. */
location type_location; location type_loc;
/** Any \c \%destructor (resp. \%printer) declared specificially for this /** Any \c \%destructor (resp. \%printer) declared specificially for this
symbol. symbol.
@@ -134,7 +134,7 @@ struct sym_content
code_props props[CODE_PROPS_SIZE]; code_props props[CODE_PROPS_SIZE];
symbol_number number; symbol_number number;
location prec_location; location prec_loc;
int prec; int prec;
assoc assoc; assoc assoc;
@@ -246,7 +246,7 @@ extern symbol *accept;
/** The user start symbol. */ /** The user start symbol. */
extern symbol *startsymbol; extern symbol *startsymbol;
/** The location of the \c \%start declaration. */ /** The location of the \c \%start declaration. */
extern location startsymbol_location; extern location startsymbol_loc;
/** Whether a symbol declared with a type tag. */ /** Whether a symbol declared with a type tag. */
extern bool tag_seen; extern bool tag_seen;
+42 -10
View File
@@ -196,16 +196,8 @@ one.y:11.3-8: previous declaration
bison: file 'one.y' was updated (backup: 'one.y~') bison: file 'one.y' was updated (backup: 'one.y~')
]]) ]])
AT_CHECK([cat one.y], [], AT_CHECK([sed -e '1,8d' one.y], [],
[[%code top { [[%%
/* Load config.h, and adjust to the compiler.
We used to do it here, but each time we add a new line,
we have to adjust all the line numbers in error messages.
It's simpler to use a constant include to a varying file. */
#include <testsuite.h>
}
%%
exp: exp:
%empty {} @&t@ %empty {} @&t@
; ;
@@ -267,6 +259,46 @@ AT_BISON_OPTION_POPDEFS
AT_CLEANUP AT_CLEANUP
## -------------------- ##
## Add missing %empty. ##
## -------------------- ##
AT_SETUP([Add missing %empty])
AT_DATA([input.y],
[[%%
exp: a b c d e
a: {}
b:{
};
c:
d
:
e:
%%
]])
AT_BISON_CHECK([--update -Wall input.y], [], [], [ignore])
AT_CHECK([cat input.y], [],
[[%%
exp: a b c d e
a: %empty {}
b: %empty {
};
c: %empty @&t@
d
: %empty @&t@
e: %empty @&t@
%%
]])
# No warnings.
AT_BISON_CHECK([-Wall input.y])
AT_CLEANUP
## ------------------ ## ## ------------------ ##
## Initial location. ## ## Initial location. ##
## ------------------ ## ## ------------------ ##
+6
View File
@@ -118,8 +118,14 @@ fi
## Other. ## ## Other. ##
## ------- ## ## ------- ##
# Empty if no D compiler was found.
: ${DC='@DC@'} : ${DC='@DC@'}
: ${DCFLAGS='@DCFLAGS@'} : ${DCFLAGS='@DCFLAGS@'}
if test x"$DC" = x; then
BISON_DC_WORKS=false
else
BISON_DC_WORKS=true
fi
# Empty if no javac was found # Empty if no javac was found
: ${CONF_JAVAC='@CONF_JAVAC@'} : ${CONF_JAVAC='@CONF_JAVAC@'}
+1 -1
View File
@@ -893,7 +893,7 @@ error-reduce:
consistent-error: consistent-error:
'a' 'a'
| /*empty*/ %prec 'a' | %empty %prec 'a'
; ;
// Provide another context in which all rules are useful so that this // Provide another context in which all rules are useful so that this
+5 -5
View File
@@ -278,17 +278,17 @@ AT_DATA([[input.y]],
[[%expect 1 [[%expect 1
%% %%
exp: e 'e'; exp: e 'e';
e: 'e' | /* Nothing. */; e: 'e' | %empty;
]]) ]])
AT_BISON_CHECK([-o input.c input.y], 0, [], AT_BISON_CHECK([-o input.c input.y], 0, [],
[[input.y:4.9: warning: rule useless in parser due to conflicts [-Wother] [[input.y:4.10-15: warning: rule useless in parser due to conflicts [-Wother]
]]) ]])
AT_BISON_CHECK([-fcaret -o input.c input.y], 0, [], AT_BISON_CHECK([-fcaret -o input.c input.y], 0, [],
[[input.y:4.9: warning: rule useless in parser due to conflicts [-Wother] [[input.y:4.10-15: warning: rule useless in parser due to conflicts [-Wother]
4 | e: 'e' | /* Nothing. */; 4 | e: 'e' | %empty;
| ^ | ^~~~~~
]]) ]])
AT_CLEANUP AT_CLEANUP
+4 -2
View File
@@ -20,6 +20,8 @@ AT_BANNER([[Diagnostics.]])
# AT_TEST($1: TITLE, $2: GRAMMAR, $3: EXIT-STATUS, $4: OUTPUT-WITH-STYLE) # AT_TEST($1: TITLE, $2: GRAMMAR, $3: EXIT-STATUS, $4: OUTPUT-WITH-STYLE)
# ----------------------------------------------------------------------- # -----------------------------------------------------------------------
# Run Bison on GRAMMAR with debugging style enabled, and expect
# OUTPUT-WITH-STYLE as diagnostics.
m4_pushdef([AT_TEST], m4_pushdef([AT_TEST],
[ [
AT_SETUP([$1]) AT_SETUP([$1])
@@ -43,7 +45,7 @@ AT_CHECK([perl -p -e 's{</?\w+>}{}g' <experr.orig >experr])
AT_CHECK([LC_ALL=en_US.UTF-8 bison -fcaret -Wall input.y], [$3], [], [experr]) AT_CHECK([LC_ALL=en_US.UTF-8 bison -fcaret -Wall input.y], [$3], [], [experr])
AT_CHECK([cp experr.orig experr]) AT_CHECK([cp experr.orig experr])
AT_CHECK([LC_ALL=en_US.UTF-8 bison -fcaret --style=debug -Wall input.y], [$3], [], [experr]) AT_CHECK([LC_ALL=en_US.UTF-8 bison -fcaret --color=debug -Wall input.y], [$3], [], [experr])
AT_BISON_OPTION_POPDEFS AT_BISON_OPTION_POPDEFS
@@ -221,7 +223,7 @@ input.y: <warning>warning:</warning> fix-its can be applied. Rerun with option
# Locations coming from m4 need the byte-column for diagnostics. # Locations coming from m4 need the byte-column for diagnostics.
AT_TEST([[Locations from M4]], AT_TEST([[Tabulations and multibyte characters from M4]],
[[%define api.prefix {sun} [[%define api.prefix {sun}
%define api.prefix {🌞} %define api.prefix {🌞}
%% %%
+3 -3
View File
@@ -591,7 +591,7 @@ AT_DATA_GRAMMAR([glr-regr7.y],
start: start:
stack1 start stack1 start
| stack2 start | stack2 start
| /* empty */ | %empty
; ;
stack1: 'a' ; stack1: 'a' ;
stack2: 'a' ; stack2: 'a' ;
@@ -680,11 +680,11 @@ InterfaceDeclaration : OptConstantWord %dprec 1
| OptSignalWord %dprec 2 | OptSignalWord %dprec 2
; ;
OptConstantWord : /* empty */ OptConstantWord : %empty
| T_CONSTANT | T_CONSTANT
; ;
OptSignalWord : /* empty */ OptSignalWord : %empty
{ printf("empty: %d/%d\n", @$.first_column, @$.last_column); } { printf("empty: %d/%d\n", @$.first_column, @$.last_column); }
| T_SIGNAL | T_SIGNAL
; ;
+2 -10
View File
@@ -2590,16 +2590,8 @@ AT_CHECK([diff input.y.orig input.y~])
AT_CHECK([test ! -f output.c]) AT_CHECK([test ! -f output.c])
# Check the update. # Check the update.
AT_CHECK([cat input.y], [], AT_CHECK([sed -e '1,8d' input.y], [],
[[%code top { [[
/* Load config.h, and adjust to the compiler.
We used to do it here, but each time we add a new line,
we have to adjust all the line numbers in error messages.
It's simpler to use a constant include to a varying file. */
#include <testsuite.h>
}
%default-prec %default-prec
%define parse.error verbose %define parse.error verbose
%expect-rr 0 %expect-rr 0
+4 -3
View File
@@ -390,7 +390,7 @@ m4_define([AT_DATA_SOURCE_PROLOGUE],
# AT_DATA_GRAMMAR_PROLOGUE # AT_DATA_GRAMMAR_PROLOGUE
# ------------------------ # ------------------------
# The prologue that should be included in any grammar which parser is # The prologue that should be included in any grammar whose parser is
# meant to be compiled. # meant to be compiled.
m4_define([AT_DATA_GRAMMAR_PROLOGUE], m4_define([AT_DATA_GRAMMAR_PROLOGUE],
[[%code top { [[%code top {
@@ -400,7 +400,7 @@ m4_define([AT_DATA_GRAMMAR_PROLOGUE],
# AT_DATA_SOURCE(NAME, CONTENT) # AT_DATA_SOURCE(NAME, CONTENT)
# ----------------------------- # -----------------------------
# Generate the file NAME, which CONTENT is preceded by # Generate the file NAME, whose CONTENT is preceded by
# AT_DATA_SOURCE_PROLOGUE. # AT_DATA_SOURCE_PROLOGUE.
m4_define([AT_DATA_SOURCE], m4_define([AT_DATA_SOURCE],
[AT_DATA([$1], [AT_DATA([$1],
@@ -411,7 +411,7 @@ $2])
# AT_DATA_GRAMMAR(NAME, CONTENT) # AT_DATA_GRAMMAR(NAME, CONTENT)
# ------------------------------ # ------------------------------
# Generate the file NAME, which CONTENT is preceded by # Generate the file NAME, whose CONTENT is preceded by
# AT_DATA_GRAMMAR_PROLOGUE. # AT_DATA_GRAMMAR_PROLOGUE.
m4_define([AT_DATA_GRAMMAR], [AT_LANG_DISPATCH([$0], $@)]) m4_define([AT_DATA_GRAMMAR], [AT_LANG_DISPATCH([$0], $@)])
@@ -977,6 +977,7 @@ AT_CHECK(m4_join([ ],
# with trailing ".o" removed, and ".cc" appended. # with trailing ".o" removed, and ".cc" appended.
m4_define([AT_COMPILE_D], m4_define([AT_COMPILE_D],
[AT_KEYWORDS(d) [AT_KEYWORDS(d)
AT_SKIP_IF([[! $BISON_DC_WORKS]])
AT_CHECK(m4_join([ ], AT_CHECK(m4_join([ ],
[$DC $DCFLAGS $3], [$DC $DCFLAGS $3],
[m4_bmatch([$1], [[.]], [-c])], [m4_bmatch([$1], [[.]], [-c])],