diff --git a/THANKS b/THANKS index eab6349b..ec895360 100644 --- a/THANKS +++ b/THANKS @@ -31,6 +31,7 @@ Dagobert Michelsen dam@baltic-online.de Daniel Hagerty hag@gnu.org David J. MacKenzie djm@gnu.org David Kastrup dak@gnu.org +Dennis Clarke dclarke@blastwave.org Derek M. Jones derek@knosof.co.uk Di-an Jan dianj@freeshell.org Dick Streefland dick.streefland@altium.nl diff --git a/cfg.mk b/cfg.mk index 8e5a8e10..1aa1c1ab 100644 --- a/cfg.mk +++ b/cfg.mk @@ -55,6 +55,18 @@ update-copyright: update-b4-copyright update-package-copyright-year update-copyright-env = \ UPDATE_COPYRIGHT_FORCE=1 UPDATE_COPYRIGHT_USE_INTERVALS=1 +# At least for Mac OS X's grep, the order between . and [ in "[^.[]" +# matters: +# $ LC_ALL=fr_FR grep -nE '[^[.]' /dev/null +# $ LC_ALL=C grep -nE '[^[.]' /dev/null +# grep: invalid collating element or class +# $ LC_ALL=fr_FR grep -nE '[^.[]' /dev/null +# $ LC_ALL=C grep -nE '[^.[]' /dev/null +sc_at_parser_check: + @prohibit='AT_PARSER_CHECK\(\[+[^.[]|AT_CHECK\(\[+\./' \ + halt='use AT_PARSER_CHECK for and only for generated parsers' \ + $(_sc_search_regexp) + exclude = \ $(foreach a,$(1),$(eval $(subst $$,$$$$,exclude_file_name_regexp--sc_$(a)))) $(call exclude, \ @@ -70,5 +82,5 @@ $(call exclude, \ prohibit_strcmp=^doc/bison\.texi$$ \ require_config_h_first=^(lib/yyerror|data/(glr|yacc))\.c$$ \ space_tab=^tests/(input|c\+\+)\.at$$ \ - unmarked_diagnostics=^(djgpp/|doc/bison.texi$$) \ + unmarked_diagnostics=^(djgpp/|doc/bison.texi$$|tests/c\+\+\.at$$) \ ) diff --git a/doc/bison.texi b/doc/bison.texi index 848bca45..9b7b14fd 100644 --- a/doc/bison.texi +++ b/doc/bison.texi @@ -8856,8 +8856,8 @@ a PDF or PNG file from it will take very long, and more often than not it will fail due to memory exhaustion). This option was rather designed for beginners, to help them understand LR parsers. -This file is generated when the @option{--graph} option is specified (see -@pxref{Invocation, , Invoking Bison}). Its name is made by removing +This file is generated when the @option{--graph} option is specified +(@pxref{Invocation, , Invoking Bison}). Its name is made by removing @samp{.tab.c} or @samp{.c} from the parser implementation file name, and adding @samp{.dot} instead. If the grammar file is @file{foo.y}, the Graphviz output file is called @file{foo.dot}. diff --git a/po/POTFILES.in b/po/POTFILES.in index 0908f506..ee34879a 100644 --- a/po/POTFILES.in +++ b/po/POTFILES.in @@ -9,6 +9,7 @@ src/main.c src/muscle-tab.c src/parse-gram.y src/print.c +src/print_graph.c src/reader.c src/reduce.c src/scan-code.l diff --git a/src/print_graph.c b/src/print_graph.c index 7b2afdb5..918a3df8 100644 --- a/src/print_graph.c +++ b/src/print_graph.c @@ -18,7 +18,6 @@ along with this program. If not, see . */ #include -#include #include "system.h" #include "LR0.h" diff --git a/tests/c++.at b/tests/c++.at index 21ebafe0..0d50281a 100644 --- a/tests/c++.at +++ b/tests/c++.at @@ -734,7 +734,7 @@ AT_PARSER_CHECK([[./input i]], [[2]], [[]], AT_PARSER_CHECK([[./input aaaap]]) AT_PARSER_CHECK([[./input --debug aaaap]], [[2]], [[]], [[stderr]]) -AT_PARSER_CHECK([[grep '^exception caught: printer$' stderr]], [], [ignore]) +AT_CHECK([[grep '^exception caught: printer$' stderr]], [], [ignore]) AT_PARSER_CHECK([[./input aaaae]], [[2]], [[]], [[exception caught: syntax error diff --git a/tests/glr-regression.at b/tests/glr-regression.at index 80248aa4..ab6e1437 100644 --- a/tests/glr-regression.at +++ b/tests/glr-regression.at @@ -67,9 +67,13 @@ static YYSTYPE exprMerge (YYSTYPE x0, YYSTYPE x1) return 0; } +const char *input = NULL; + int -main (void) +main (int argc, const char* argv[]) { + assert (argc == 2); + input = argv[1]; return yyparse (); } @@ -78,16 +82,7 @@ main (void) int yylex (void) { - for (;;) - { - int ch; - assert (!feof (stdin)); - ch = getchar (); - if (ch == EOF) - return 0; - else if (ch == 'B' || ch == 'P') - return ch; - } + return *input++; } ]]) AT_BISON_OPTION_POPDEFS @@ -96,7 +91,7 @@ AT_BISON_CHECK([[-o glr-regr1.c glr-regr1.y]], 0, [], [[glr-regr1.y: warning: 1 shift/reduce conflict [-Wconflicts-sr] ]]) AT_COMPILE([glr-regr1]) -AT_PARSER_CHECK([[echo BPBPB | ./glr-regr1]], 0, +AT_PARSER_CHECK([[./glr-regr1 BPBPB]], 0, [[E -> 'B' E -> 'B' E -> E 'P' E @@ -212,16 +207,27 @@ AT_BISON_CHECK([[-o glr-regr2a.c glr-regr2a.y]], 0, [], ]]) AT_COMPILE([glr-regr2a]) -AT_PARSER_CHECK([[echo s VARIABLE_1 t v x q | ./glr-regr2a]], 0, +AT_DATA([input1.txt], +[[s VARIABLE_1 t v x q +]]) +AT_PARSER_CHECK([[./glr-regr2a input1.txt]], 0, [[Variable: 'VARIABLE_1' -]], []) -AT_PARSER_CHECK([[echo s VARIABLE_1 , ANOTHER_VARIABLE_2 t e | ./glr-regr2a]], +]]) + +AT_DATA([input2.txt], +[[s VARIABLE_1 , ANOTHER_VARIABLE_2 t e +]]) +AT_PARSER_CHECK([[./glr-regr2a input2.txt]], 0, [[Varlist: 'VARIABLE_1,ANOTHER_VARIABLE_2' ]]) -AT_PARSER_CHECK([[echo s VARIABLE_3 t v x | ./glr-regr2a]], 0, + +AT_DATA([input3.txt], +[[s VARIABLE_3 t v x +]]) +AT_PARSER_CHECK([[./glr-regr2a input3.txt]], 0, [[Variable: 'VARIABLE_3' -]], []) +]]) AT_CLEANUP @@ -330,10 +336,13 @@ glr-regr3.y: warning: 1 reduce/reduce conflict [-Wconflicts-rr] ]]) AT_COMPILE([glr-regr3]) -AT_PARSER_CHECK([[echo p1 t4 o2 p1 p1 t1 o1 t2 p2 o1 t3 p2 p2 | ./glr-regr3]], +AT_DATA([input.txt], +[[p1 t4 o2 p1 p1 t1 o1 t2 p2 o1 t3 p2 p2 +]]) +AT_PARSER_CHECK([[./glr-regr3 input.txt]], 0, [[Result: 1c04 -]], []) +]]) AT_CLEANUP diff --git a/tests/headers.at b/tests/headers.at index 509a413d..c21fa359 100644 --- a/tests/headers.at +++ b/tests/headers.at @@ -163,22 +163,6 @@ exp: AT_BISON_CHECK([-d -o $1.AT_SKEL_CC_IF([cc], [c]) $1.y]) -# Check there is no 'yy' left. -# C++ output relies on namespaces and still uses yy a lot. -AT_SKEL_CC_IF([], - [AT_CHECK([$EGREP yy $1.h], [1])]) - -# Check there is not 'YY' left. -# Ignore comments, YYPUSH_MORE(_DEFINED)? (constant definition), -# YY_\w+_INCLUDED (header guards). -# -# YYDEBUG (not renamed) can be read, but not changed. -AT_CHECK([[$PERL -0777 -e 's{/\*.*?\*/}{}sg;s,//.*,,;' \ - ]$1.AT_SKEL_CC_IF([hh], [h])[ | - grep 'YY' | - $EGREP -wv 'YY(PUSH_MORE(_DEFINED)?|_[0-9A-Z_]+_INCLUDED)|(defined|if) YYDEBUG']], - [1]) - AT_LANG_COMPILE([$1.o]) AT_CHECK([[echo "$1" >>expout]]) @@ -241,6 +225,35 @@ AT_TEST([x7], [%define api.push-pull both]) AT_TEST([x8], [%define api.pure %define api.push-pull both]) #AT_TEST([x5], [%locations %language "c++" %glr-parser]) +# Check there is no 'yy' left. +# C++ output relies on namespaces and still uses yy a lot. +# +# Check there is no 'YY' left. +# Ignore comments, YYPUSH_MORE(_DEFINED)? (constant definition), +# YY_\w+_INCLUDED (header guards). +# +# YYDEBUG (not renamed) can be read, but not changed. +AT_CHECK([[$PERL -n -0777 -e ' + s{/\*.*?\*/}{}gs; + s{//.*}{}g; + s{\b(YYPUSH_MORE(_DEFINED)? + |YY_\w+_INCLUDED + |YY_NULL + |(defined|if)\ YYDEBUG + )\b}{}gx; + while (/^(.*YY.*)$/gm) + { + print "$ARGV: $1\n"; + } + if ($ARGV =~ /\.h$/) + { + while (/^(.*yy.*)$/gm) + { + print "$ARGV: $1\n"; + } + } +' -- *.hh *.h]]) + # Check that the headers are self-contained, and protected against # multiple inclusions. While at it, check they are sane for C++. for h in *.h *.hh @@ -258,7 +271,7 @@ done AT_SKIP_IF_CANNOT_LINK_C_AND_CXX AT_COMPILE_CXX([parser], [[x[1-8].o -DCC_IS_CXX=$CC_IS_CXX main.cc]]) -AT_CHECK([./parser], [0], [[expout]]) +AT_PARSER_CHECK([./parser], [0], [[expout]]) m4_popdef([AT_TEST]) diff --git a/tests/local.at b/tests/local.at index fb74fafc..42040829 100644 --- a/tests/local.at +++ b/tests/local.at @@ -697,7 +697,7 @@ AT_COMPILE([c-only.o], [c-only.c]) AT_COMPILE_CXX([cxx-only.o], [cxx-only.cc]) AT_CHECK([$CXX $CXXFLAGS $CPPFLAGS $LDFLAGS c-only.o cxx-only.o -o c-and-cxx || exit 77], [ignore], [ignore]) -AT_CHECK([./c-and-cxx]) +AT_PARSER_CHECK([./c-and-cxx]) ]) diff --git a/tests/regression.at b/tests/regression.at index f1735941..4d6e255a 100644 --- a/tests/regression.at +++ b/tests/regression.at @@ -1638,7 +1638,7 @@ main (void) ]]) AT_FULL_COMPILE([input]) -AT_CHECK([./input], 0, [[x: 1, y: 2 +AT_PARSER_CHECK([./input], 0, [[x: 1, y: 2 ]]) AT_BISON_OPTION_POPDEFS diff --git a/tests/synclines.at b/tests/synclines.at index 63ae6858..751db7c6 100644 --- a/tests/synclines.at +++ b/tests/synclines.at @@ -47,7 +47,8 @@ m4_define([AT_SYNCLINES_COMPILE], # => # input.y:4: #error "8" # -# The message may include a caret-error: +# The message may include a caret-error (indented by GCC 4.8, +# not by clang 3.2): # # input.y:1:2: error: #error "1" # #error "1" @@ -63,13 +64,31 @@ m4_define([AT_SYNCLINES_COMPILE], # # distcc[35882] (dcc_connect_by_name) ERROR: failed to look up host "chrisimac": Unknown host # distcc[35882] Warning: failed to distribute input.c to chrisimac/4, running locally instead - +# +# The compiler might end by the number of messages issued (Clang 3.2): +# +# syncline.c:1:2: error: "1" +# #error "1" +# ^ +# 1 error generated. AT_CHECK([[$PERL -p -0777 - stderr <<\EOF + # 1. Remove useless lines. + + # distcc clutter. s/^distcc\[\d+\] .*\n//gm; - s/^([^:]+:\d+)[.:][^:]+:(.+)$/$][1:$][2/gm; - s/^([^:]+:\d+):[^#]*( #error)/$][1:$][2/gm; + # Function context. s/^[^:]*: In function '[^']+':\n//gm; - s/^\ +#error.*\n\ *\^\n//gm; + # Caret error. + s/^ *#error.*\n *\^\n//gm; + # Number of errors. + s/^1 error generated\.\n//gm; + + # 2. Normalize the lines we kept. + + # Remove column. + s/^([^:]+:\d+)[.:][^:]+:(.+)$/$][1:$][2/gm; + # Map all combinations of "error: " and "#error: " to "#error ". + s/^([^:]+:\d+):( |#error|error|:)+/$][1: #error /gm; EOF ]], 0, [stdout])