* Noteworthy changes in release ?.? (????-??-??) [?]
+* Noteworthy changes in release 2.6.2 (2012-08-03) [stable]
+
+** Bug fixes
+
+ Buffer overruns, complaints from Flex, and portability issues in the test
+ suite have been fixed.
+
+** Spaces in %lex- and %parse-param (lalr1.cc, glr.cc)
+
+ Trailing end-of-lines in %parse-param or %lex-param would result in
+ invalid C++. This is fixed.
+
+** Spurious spaces and end-of-lines
+
+ The generated files no longer end (nor start) with empty lines.
+
* Noteworthy changes in release 2.6.1 (2012-07-30) [stable]
Bison no longer executes user-specified M4 code when processing a grammar.
Shura debil_urod@ngs.ru
Stefano Lattarini stefano.lattarini@gmail.com
Steve Murphy murf@parsetree.com
-Summum Bonum sum@geekhouse.org
+Sum Wu sum@geekhouse.org
Thiru Ramakrishnan thiru.ramakrishnan@gmail.com
Tim Josling tej@melbpc.org.au
Tim Landscheidt tim@tim-landscheidt.de
prohibit_always-defined_macros+=?|^src/(parse-gram.c|system.h)$$ \
prohibit_always-defined_macros+=?|^tests/regression.at$$ \
prohibit_defined_have_decl_tests=?|^lib/timevar.c$$ \
- prohibit_empty_lines_at_EOF=^src/parse-gram.h$$ \
prohibit_magic_number_exit=^doc/bison.texi$$ \
prohibit_magic_number_exit+=?|^tests/(conflicts|regression).at$$ \
prohibit_strcmp=^doc/bison\.texi$$ \
]b4_cpp_guard_open([b4_spec_defines_file])[
]b4_shared_declarations[
]b4_cpp_guard_close([b4_spec_defines_file])[
-]])])
+]])])dnl
m4_divert_pop(0)
#endif
]m4_popdef([b4_parse_param])dnl
-b4_namespace_close[
-]])
+b4_namespace_close])
# Let glr.c believe that the user arguments include the parser itself.
#endif
return yyresult;
}
-
]b4_epilogue[]dnl
b4_defines_if(
[@output(b4_spec_defines_file@)@
-Subproject commit 678815ea7c4d95e04a0fa6d3b491b3c872c677a7
+Subproject commit bd54a45e6e4bcb3ee7359c9b4f1d831a6291148f
/* Strip the surrounding '{' and '}', and any blanks just inside
the braces. */
- while (*--p == ' ' || *p == '\t')
- continue;
+ --p;
+ while (isspace ((unsigned char) *p))
+ --p;
p[1] = '\0';
- while (*++decl == ' ' || *decl == '\t')
- continue;
+ ++decl;
+ while (isspace ((unsigned char) *decl))
+ ++decl;
}
if (! name_start)
fprintf (stderr, ": ");])
fprintf (stderr, "%s\n", s);
}])[
-
]AT_DEFINES_IF([],
[AT_CALC_LEX
-AT_CALC_MAIN])[
-]])
+AT_CALC_MAIN])])
AT_DEFINES_IF([AT_DATA_SOURCE([[calc-lex.c]AT_SKEL_CC_IF([[c]])],
[[#include "calc.h]AT_SKEL_CC_IF([[h]])["
])
+# AT_CHECK_SPACES([FILE])
+# -----------------------
+# Make sure we did not introduce bad spaces. Checked here because all
+# the skeletons are (or should be) exercized here.
+m4_define([AT_CHECK_SPACES],
+[# No initial empty lines.
+AT_CHECK([sed -ne '/./q;=;p;' $1])
+# No trailing spaces.
+# FIXME: For 2.7: AT_CHECK([sed -ne '/[ ]$/{=;p;}' $1])
+# No final empty lines.
+AT_CHECK([sed -ne '${/^$/{=;p;};}' $1])
+])
+
+
# AT_CHECK_CALC([BISON-OPTIONS])
# ------------------------------
# Start a testing chunk which compiles `calc' grammar with
AT_DATA_CALC_Y([$1])
AT_FULL_COMPILE([calc], AT_DEFINES_IF([[lex], [main]]))
+AT_CHECK_SPACES([calc.AT_SKEL_CC_IF([cc], [c])])
+AT_DEFINES_IF([AT_CHECK_SPACES([calc.AT_SKEL_CC_IF([hh], [h])])])
# Test the priorities.
_AT_CHECK_CALC([$1],
[AT_SETUP([Dancer $1])
AT_BISON_OPTION_PUSHDEFS([$1])
_AT_DATA_DANCER_Y([$1])
-AT_BISON_CHECK([-o dancer.c dancer.y])
AT_FULL_COMPILE([dancer])
AT_PARSER_CHECK([./dancer], 1, [],
[syntax error, unexpected ':'
[AT_SETUP([Expecting two tokens $1])
AT_BISON_OPTION_PUSHDEFS([$1])
_AT_DATA_EXPECT2_Y([$1])
-AT_BISON_CHECK([-o expect2.c expect2.y])
AT_FULL_COMPILE([expect2])
AT_PARSER_CHECK([./expect2], 1, [],
[syntax error, unexpected '+', expecting A or B
m4_popdef([AT_LAC_CHECK])
AT_CLEANUP
+
+
+## ---------------------- ##
+## Lex and parse params. ##
+## ---------------------- ##
+
+# AT_TEST(SKELETON)
+# -----------------
+# Check that the identifier of the params is properly fetched
+# even when there are trailing blanks.
+
+m4_pushdef([AT_TEST],
+[AT_SETUP([[Lex and parse params: $1]])
+
+AT_BISON_OPTION_PUSHDEFS([%locations %skeleton $1])
+
+## FIXME: Improve parsing of parse-param and use the generated
+## yyerror.
+AT_DATA_GRAMMAR([input.y],
+[[%defines
+%locations
+%skeleton $1
+%union { int ival; }
+%parse-param { int x }
+// Spaces, tabs, and new lines.
+%parse-param { @&t@
+ int y @&t@
+ @&t@
+ @&t@
+}
+
+%{
+#include <stdio.h>
+#include <stdlib.h>
+
+]AT_SKEL_CC_IF([], [[
+static
+void
+yyerror (int x, int y, const char *msg)
+{
+ fprintf (stderr, "x: %d, y: %d, %s\n", x, y, msg);
+}]])[
+
+ ]AT_YYLEX_DECLARE[
+%}
+
+%%
+exp: 'a' { fprintf (stdout, "x: %d, y: %d\n", x, y); };
+%%
+]AT_YYLEX_DEFINE(["a"])[
+
+]AT_SKEL_CC_IF(
+[AT_YYERROR_DEFINE
+
+int
+yyparse (int x, int y)
+{
+ yy::parser parser(x, y);
+ return parser.parse ();
+}
+])[
+
+int
+main (void)
+{
+ return !!yyparse(1, 2);
+}
+]])
+
+AT_FULL_COMPILE([input])
+AT_CHECK([./input], 0, [[x: 1, y: 2
+]])
+AT_BISON_OPTION_POPDEFS
+
+AT_CLEANUP
+])
+
+## FIXME: test Java, and iterate over skeletons.
+AT_TEST("yacc.c")
+AT_TEST("glr.c")
+AT_TEST("lalr1.cc")
+AT_TEST("glr.cc")
+
+m4_popdef([AT_TEST])
# 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
-AT_CHECK([[perl -p -0777 -f - stderr <<\EOF
- s/^distcc\[\d+\] .*\n//gm;
- s/^([^:]*:\d+)[.:][^:]*:(.*)$/$][1:$][2/gm;
- s/^([^:]*:\d+:)[^#]*( #error)/$][1$][2/gm;
- s/^[^:]*: In function '[^']*':\n//gm;
- s/^\ +#error.*\n\ *\^\n//gm;
+AT_CHECK([[perl -p -0777 - stderr <<\EOF
+ s/^distcc\[\d+\] .*\n//gm;
+ s/^([^:]+:\d+)[.:][^:]+:(.+)$/$][1:$][2/gm;
+ s/^([^:]+:\d+):[^#]*( #error)/$][1:$][2/gm;
+ s/^[^:]*: In function '[^']+':\n//gm;
+ s/^\ +#error.*\n\ *\^\n//gm;
EOF
]],
- 0, [stdout])
+ 0, [stdout])
])
-# AT_TEST_SYNCLINE(TITLE, INPUT, ERROR-MSG)
-# -----------------------------------------
+# AT_TEST(TITLE, INPUT, ERROR-MSG)
+# --------------------------------
# Check that compiling the parser produced from INPUT cause GCC
# to issue ERROR-MSG.
-m4_define([AT_TEST_SYNCLINE],
+m4_pushdef([AT_TEST],
[AT_SETUP([$1])
AT_BISON_OPTION_PUSHDEFS
# It seems impossible to find a generic scheme to check the location
])
-## --------------------- ##
-## Prologue synch line. ##
-## --------------------- ##
+## ------------------- ##
+## Prologue syncline. ##
+## ------------------- ##
-AT_TEST_SYNCLINE([Prologue synch line],
+AT_TEST([Prologue syncline],
[[%{
#error "2"
]AT_YYERROR_DECLARE_EXTERN[
])
-## ------------------- ##
-## %union synch line. ##
-## ------------------- ##
+## ----------------- ##
+## %union syncline. ##
+## ----------------- ##
-AT_TEST_SYNCLINE([%union synch line],
+AT_TEST([%union syncline],
[[%union {
#error "2"
char dummy;
])
-## ------------------------- ##
-## Postprologue synch line. ##
-## ------------------------- ##
+## ----------------------- ##
+## Postprologue syncline. ##
+## ----------------------- ##
-AT_TEST_SYNCLINE([Postprologue synch line],
+AT_TEST([Postprologue syncline],
[[%{
]AT_YYERROR_DECLARE_EXTERN[
]AT_YYLEX_DECLARE_EXTERN[
])
-## ------------------- ##
-## Action synch line. ##
-## ------------------- ##
+## ----------------- ##
+## Action syncline. ##
+## ----------------- ##
-AT_TEST_SYNCLINE([Action synch line],
+AT_TEST([Action syncline],
[[%{
]AT_YYERROR_DECLARE_EXTERN[
]AT_YYLEX_DECLARE_EXTERN[
])
-## --------------------- ##
-## Epilogue synch line. ##
-## --------------------- ##
+## ------------------- ##
+## Epilogue syncline. ##
+## ------------------- ##
-AT_TEST_SYNCLINE([Epilogue synch line],
+AT_TEST([Epilogue syncline],
[[%{
]AT_YYERROR_DECLARE_EXTERN[
]AT_YYLEX_DECLARE_EXTERN[
]],
[input.y:8: #error "8"
])
+
+m4_popdef([AT_TEST])